summaryrefslogtreecommitdiffstats
path: root/tools/designer
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-07-10 15:24:15 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-07-10 15:24:15 -0500
commitbd0f3345a938b35ce6a12f6150373b0955b8dd12 (patch)
tree7a520322212d48ebcb9fbe1087e7fca28b76185c /tools/designer
downloadqt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.tar.gz
qt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.zip
Add Qt3 development HEAD version
Diffstat (limited to 'tools/designer')
-rw-r--r--tools/designer/LICENSE.GPL280
-rw-r--r--tools/designer/app/app.pro26
-rw-r--r--tools/designer/app/designer.icnsbin0 -> 56873 bytes
-rw-r--r--tools/designer/app/designer.icobin0 -> 10134 bytes
-rw-r--r--tools/designer/app/designer.rc2
-rw-r--r--tools/designer/app/main.cpp228
-rw-r--r--tools/designer/designer.pro14
-rw-r--r--tools/designer/designer/about.ui222
-rw-r--r--tools/designer/designer/actiondnd.cpp743
-rw-r--r--tools/designer/designer/actiondnd.h242
-rw-r--r--tools/designer/designer/actioneditor.ui230
-rw-r--r--tools/designer/designer/actioneditorimpl.cpp325
-rw-r--r--tools/designer/designer/actioneditorimpl.h86
-rw-r--r--tools/designer/designer/actionlistview.cpp115
-rw-r--r--tools/designer/designer/actionlistview.h88
-rw-r--r--tools/designer/designer/asciivalidator.cpp101
-rw-r--r--tools/designer/designer/asciivalidator.h59
-rw-r--r--tools/designer/designer/command.cpp2402
-rw-r--r--tools/designer/designer/command.h1266
-rw-r--r--tools/designer/designer/configtoolboxdialog.ui329
-rw-r--r--tools/designer/designer/configtoolboxdialog.ui.h222
-rw-r--r--tools/designer/designer/connectiondialog.ui226
-rw-r--r--tools/designer/designer/connectiondialog.ui.h318
-rw-r--r--tools/designer/designer/connectionitems.cpp524
-rw-r--r--tools/designer/designer/connectionitems.h227
-rw-r--r--tools/designer/designer/connectiontable.cpp61
-rw-r--r--tools/designer/designer/connectiontable.h53
-rw-r--r--tools/designer/designer/createtemplate.ui236
-rw-r--r--tools/designer/designer/customwidgeteditor.ui1385
-rw-r--r--tools/designer/designer/customwidgeteditorimpl.cpp845
-rw-r--r--tools/designer/designer/customwidgeteditorimpl.h105
-rw-r--r--tools/designer/designer/database.cpp129
-rw-r--r--tools/designer/designer/database.h90
-rw-r--r--tools/designer/designer/database2.h95
-rw-r--r--tools/designer/designer/dbconnection.ui229
-rw-r--r--tools/designer/designer/dbconnectioneditor.ui154
-rw-r--r--tools/designer/designer/dbconnectionimpl.cpp87
-rw-r--r--tools/designer/designer/dbconnectionimpl.h64
-rw-r--r--tools/designer/designer/dbconnections.ui328
-rw-r--r--tools/designer/designer/dbconnectionsimpl.cpp201
-rw-r--r--tools/designer/designer/dbconnectionsimpl.h67
-rw-r--r--tools/designer/designer/defs.cpp91
-rw-r--r--tools/designer/designer/defs.h49
-rw-r--r--tools/designer/designer/designer.pro443
-rw-r--r--tools/designer/designer/designer_de.ts4969
-rw-r--r--tools/designer/designer/designer_fr.ts4969
-rw-r--r--tools/designer/designer/designer_pch.h44
-rw-r--r--tools/designer/designer/designerapp.cpp181
-rw-r--r--tools/designer/designer/designerapp.h65
-rw-r--r--tools/designer/designer/designerappiface.cpp1100
-rw-r--r--tools/designer/designer/designerappiface.h284
-rw-r--r--tools/designer/designer/editfunctions.ui721
-rw-r--r--tools/designer/designer/editfunctionsimpl.cpp536
-rw-r--r--tools/designer/designer/editfunctionsimpl.h101
-rw-r--r--tools/designer/designer/finddialog.ui281
-rw-r--r--tools/designer/designer/finddialog.ui.h68
-rw-r--r--tools/designer/designer/formfile.cpp924
-rw-r--r--tools/designer/designer/formfile.h153
-rw-r--r--tools/designer/designer/formsettings.ui556
-rw-r--r--tools/designer/designer/formsettingsimpl.cpp125
-rw-r--r--tools/designer/designer/formsettingsimpl.h56
-rw-r--r--tools/designer/designer/formwindow.cpp2761
-rw-r--r--tools/designer/designer/formwindow.h328
-rw-r--r--tools/designer/designer/gotolinedialog.ui176
-rw-r--r--tools/designer/designer/gotolinedialog.ui.h57
-rw-r--r--tools/designer/designer/hierarchyview.cpp1500
-rw-r--r--tools/designer/designer/hierarchyview.h251
-rw-r--r--tools/designer/designer/iconvieweditor.ui464
-rw-r--r--tools/designer/designer/iconvieweditorimpl.cpp170
-rw-r--r--tools/designer/designer/iconvieweditorimpl.h65
-rw-r--r--tools/designer/designer/images/designer_adjustsize.pngbin0 -> 495 bytes
-rw-r--r--tools/designer/designer/images/designer_appicon.pngbin0 -> 2341 bytes
-rw-r--r--tools/designer/designer/images/designer_arrow.pngbin0 -> 216 bytes
-rw-r--r--tools/designer/designer/images/designer_background.pngbin0 -> 6724 bytes
-rw-r--r--tools/designer/designer/images/designer_book.pngbin0 -> 825 bytes
-rw-r--r--tools/designer/designer/images/designer_buttongroup.pngbin0 -> 648 bytes
-rw-r--r--tools/designer/designer/images/designer_checkbox.pngbin0 -> 817 bytes
-rw-r--r--tools/designer/designer/images/designer_combobox.pngbin0 -> 549 bytes
-rw-r--r--tools/designer/designer/images/designer_connecttool.pngbin0 -> 553 bytes
-rw-r--r--tools/designer/designer/images/designer_cross.pngbin0 -> 164 bytes
-rw-r--r--tools/designer/designer/images/designer_customwidget.pngbin0 -> 1133 bytes
-rw-r--r--tools/designer/designer/images/designer_d_adjustsize.pngbin0 -> 527 bytes
-rw-r--r--tools/designer/designer/images/designer_d_book.pngbin0 -> 557 bytes
-rw-r--r--tools/designer/designer/images/designer_d_buttongroup.pngbin0 -> 482 bytes
-rw-r--r--tools/designer/designer/images/designer_d_checkbox.pngbin0 -> 547 bytes
-rw-r--r--tools/designer/designer/images/designer_d_combobox.pngbin0 -> 420 bytes
-rw-r--r--tools/designer/designer/images/designer_d_connecttool.pngbin0 -> 450 bytes
-rw-r--r--tools/designer/designer/images/designer_d_customwidget.pngbin0 -> 629 bytes
-rw-r--r--tools/designer/designer/images/designer_d_databrowser.pngbin0 -> 600 bytes
-rw-r--r--tools/designer/designer/images/designer_d_datatable.pngbin0 -> 592 bytes
-rw-r--r--tools/designer/designer/images/designer_d_dataview.pngbin0 -> 663 bytes
-rw-r--r--tools/designer/designer/images/designer_d_dateedit.pngbin0 -> 452 bytes
-rw-r--r--tools/designer/designer/images/designer_d_datetimeedit.pngbin0 -> 665 bytes
-rw-r--r--tools/designer/designer/images/designer_d_dial.pngbin0 -> 706 bytes
-rw-r--r--tools/designer/designer/images/designer_d_down.pngbin0 -> 441 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editbreaklayout.pngbin0 -> 635 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editcopy.pngbin0 -> 515 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editcut.pngbin0 -> 800 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editdelete.pngbin0 -> 682 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editgrid.pngbin0 -> 425 bytes
-rw-r--r--tools/designer/designer/images/designer_d_edithlayout.pngbin0 -> 272 bytes
-rw-r--r--tools/designer/designer/images/designer_d_edithlayoutsplit.pngbin0 -> 328 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editlower.pngbin0 -> 450 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editpaste.pngbin0 -> 598 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editraise.pngbin0 -> 454 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editslots.pngbin0 -> 534 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editvlayout.pngbin0 -> 272 bytes
-rw-r--r--tools/designer/designer/images/designer_d_editvlayoutsplit.pngbin0 -> 333 bytes
-rw-r--r--tools/designer/designer/images/designer_d_filenew.pngbin0 -> 298 bytes
-rw-r--r--tools/designer/designer/images/designer_d_fileopen.pngbin0 -> 406 bytes
-rw-r--r--tools/designer/designer/images/designer_d_filesave.pngbin0 -> 267 bytes
-rw-r--r--tools/designer/designer/images/designer_d_folder.pngbin0 -> 841 bytes
-rw-r--r--tools/designer/designer/images/designer_d_form.pngbin0 -> 274 bytes
-rw-r--r--tools/designer/designer/images/designer_d_frame.pngbin0 -> 427 bytes
-rw-r--r--tools/designer/designer/images/designer_d_groupbox.pngbin0 -> 465 bytes
-rw-r--r--tools/designer/designer/images/designer_d_help.pngbin0 -> 786 bytes
-rw-r--r--tools/designer/designer/images/designer_d_home.pngbin0 -> 743 bytes
-rw-r--r--tools/designer/designer/images/designer_d_iconview.pngbin0 -> 547 bytes
-rw-r--r--tools/designer/designer/images/designer_d_image.pngbin0 -> 482 bytes
-rw-r--r--tools/designer/designer/images/designer_d_label.pngbin0 -> 670 bytes
-rw-r--r--tools/designer/designer/images/designer_d_layout.pngbin0 -> 496 bytes
-rw-r--r--tools/designer/designer/images/designer_d_lcdnumber.pngbin0 -> 452 bytes
-rw-r--r--tools/designer/designer/images/designer_d_left.pngbin0 -> 422 bytes
-rw-r--r--tools/designer/designer/images/designer_d_line.pngbin0 -> 327 bytes
-rw-r--r--tools/designer/designer/images/designer_d_lineedit.pngbin0 -> 445 bytes
-rw-r--r--tools/designer/designer/images/designer_d_listbox.pngbin0 -> 410 bytes
-rw-r--r--tools/designer/designer/images/designer_d_listview.pngbin0 -> 639 bytes
-rw-r--r--tools/designer/designer/images/designer_d_multilineedit.pngbin0 -> 479 bytes
-rw-r--r--tools/designer/designer/images/designer_d_newform.pngbin0 -> 443 bytes
-rw-r--r--tools/designer/designer/images/designer_d_ordertool.pngbin0 -> 533 bytes
-rw-r--r--tools/designer/designer/images/designer_d_pixlabel.pngbin0 -> 619 bytes
-rw-r--r--tools/designer/designer/images/designer_d_pointer.pngbin0 -> 476 bytes
-rw-r--r--tools/designer/designer/images/designer_d_print.pngbin0 -> 589 bytes
-rw-r--r--tools/designer/designer/images/designer_d_progress.pngbin0 -> 375 bytes
-rw-r--r--tools/designer/designer/images/designer_d_project.pngbin0 -> 915 bytes
-rw-r--r--tools/designer/designer/images/designer_d_pushbutton.pngbin0 -> 445 bytes
-rw-r--r--tools/designer/designer/images/designer_d_radiobutton.pngbin0 -> 605 bytes
-rw-r--r--tools/designer/designer/images/designer_d_redo.pngbin0 -> 465 bytes
-rw-r--r--tools/designer/designer/images/designer_d_richtextedit.pngbin0 -> 562 bytes
-rw-r--r--tools/designer/designer/images/designer_d_right.pngbin0 -> 425 bytes
-rw-r--r--tools/designer/designer/images/designer_d_scrollbar.pngbin0 -> 364 bytes
-rw-r--r--tools/designer/designer/images/designer_d_searchfind.pngbin0 -> 501 bytes
-rw-r--r--tools/designer/designer/images/designer_d_setbuddy.pngbin0 -> 427 bytes
-rw-r--r--tools/designer/designer/images/designer_d_slider.pngbin0 -> 548 bytes
-rw-r--r--tools/designer/designer/images/designer_d_spacer.pngbin0 -> 519 bytes
-rw-r--r--tools/designer/designer/images/designer_d_spinbox.pngbin0 -> 477 bytes
-rw-r--r--tools/designer/designer/images/designer_d_table.pngbin0 -> 512 bytes
-rw-r--r--tools/designer/designer/images/designer_d_tabwidget.pngbin0 -> 404 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textbold.pngbin0 -> 517 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textbrowser.pngbin0 -> 534 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textcenter.pngbin0 -> 453 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textedit.pngbin0 -> 526 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textfont.pngbin0 -> 412 bytes
-rw-r--r--tools/designer/designer/images/designer_d_texth1.pngbin0 -> 475 bytes
-rw-r--r--tools/designer/designer/images/designer_d_texth2.pngbin0 -> 537 bytes
-rw-r--r--tools/designer/designer/images/designer_d_texth3.pngbin0 -> 508 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textitalic.pngbin0 -> 452 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textjustify.pngbin0 -> 442 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textlarger.pngbin0 -> 537 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textleft.pngbin0 -> 442 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textlinebreak.pngbin0 -> 526 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textparagraph.pngbin0 -> 543 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textright.pngbin0 -> 443 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textsmaller.pngbin0 -> 512 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textteletext.pngbin0 -> 462 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textunderline.pngbin0 -> 497 bytes
-rw-r--r--tools/designer/designer/images/designer_d_textview.pngbin0 -> 529 bytes
-rw-r--r--tools/designer/designer/images/designer_d_timeedit.pngbin0 -> 827 bytes
-rw-r--r--tools/designer/designer/images/designer_d_toolbox.pngbin0 -> 465 bytes
-rw-r--r--tools/designer/designer/images/designer_d_toolbutton.pngbin0 -> 670 bytes
-rw-r--r--tools/designer/designer/images/designer_d_undo.pngbin0 -> 471 bytes
-rw-r--r--tools/designer/designer/images/designer_d_up.pngbin0 -> 444 bytes
-rw-r--r--tools/designer/designer/images/designer_d_widgetstack.pngbin0 -> 558 bytes
-rw-r--r--tools/designer/designer/images/designer_d_wizarddata.pngbin0 -> 294 bytes
-rw-r--r--tools/designer/designer/images/designer_d_wizarddialog.pngbin0 -> 421 bytes
-rw-r--r--tools/designer/designer/images/designer_d_wordwrap.pngbin0 -> 506 bytes
-rw-r--r--tools/designer/designer/images/designer_databrowser.pngbin0 -> 907 bytes
-rw-r--r--tools/designer/designer/images/designer_datatable.pngbin0 -> 923 bytes
-rw-r--r--tools/designer/designer/images/designer_dataview.pngbin0 -> 1039 bytes
-rw-r--r--tools/designer/designer/images/designer_dateedit.pngbin0 -> 505 bytes
-rw-r--r--tools/designer/designer/images/designer_datetimeedit.pngbin0 -> 1074 bytes
-rw-r--r--tools/designer/designer/images/designer_dial.pngbin0 -> 994 bytes
-rw-r--r--tools/designer/designer/images/designer_down.pngbin0 -> 595 bytes
-rw-r--r--tools/designer/designer/images/designer_editbreaklayout.pngbin0 -> 744 bytes
-rw-r--r--tools/designer/designer/images/designer_editcopy.pngbin0 -> 485 bytes
-rw-r--r--tools/designer/designer/images/designer_editcut.pngbin0 -> 649 bytes
-rw-r--r--tools/designer/designer/images/designer_editdelete.pngbin0 -> 833 bytes
-rw-r--r--tools/designer/designer/images/designer_editgrid.pngbin0 -> 513 bytes
-rw-r--r--tools/designer/designer/images/designer_edithlayout.pngbin0 -> 295 bytes
-rw-r--r--tools/designer/designer/images/designer_edithlayoutsplit.pngbin0 -> 344 bytes
-rw-r--r--tools/designer/designer/images/designer_editlower.pngbin0 -> 609 bytes
-rw-r--r--tools/designer/designer/images/designer_editpaste.pngbin0 -> 907 bytes
-rw-r--r--tools/designer/designer/images/designer_editraise.pngbin0 -> 614 bytes
-rw-r--r--tools/designer/designer/images/designer_editslots.pngbin0 -> 690 bytes
-rw-r--r--tools/designer/designer/images/designer_editvlayout.pngbin0 -> 289 bytes
-rw-r--r--tools/designer/designer/images/designer_editvlayoutsplit.pngbin0 -> 355 bytes
-rw-r--r--tools/designer/designer/images/designer_filenew.pngbin0 -> 313 bytes
-rw-r--r--tools/designer/designer/images/designer_fileopen.pngbin0 -> 681 bytes
-rw-r--r--tools/designer/designer/images/designer_filesave.pngbin0 -> 328 bytes
-rw-r--r--tools/designer/designer/images/designer_folder.pngbin0 -> 1366 bytes
-rw-r--r--tools/designer/designer/images/designer_form.pngbin0 -> 301 bytes
-rw-r--r--tools/designer/designer/images/designer_frame.pngbin0 -> 400 bytes
-rw-r--r--tools/designer/designer/images/designer_groupbox.pngbin0 -> 439 bytes
-rw-r--r--tools/designer/designer/images/designer_hand.pngbin0 -> 197 bytes
-rw-r--r--tools/designer/designer/images/designer_help.pngbin0 -> 1561 bytes
-rw-r--r--tools/designer/designer/images/designer_home.pngbin0 -> 1083 bytes
-rw-r--r--tools/designer/designer/images/designer_hsplit.pngbin0 -> 203 bytes
-rw-r--r--tools/designer/designer/images/designer_ibeam.pngbin0 -> 162 bytes
-rw-r--r--tools/designer/designer/images/designer_iconview.pngbin0 -> 613 bytes
-rw-r--r--tools/designer/designer/images/designer_image.pngbin0 -> 769 bytes
-rw-r--r--tools/designer/designer/images/designer_label.pngbin0 -> 953 bytes
-rw-r--r--tools/designer/designer/images/designer_layout.pngbin0 -> 706 bytes
-rw-r--r--tools/designer/designer/images/designer_lcdnumber.pngbin0 -> 558 bytes
-rw-r--r--tools/designer/designer/images/designer_left.pngbin0 -> 678 bytes
-rw-r--r--tools/designer/designer/images/designer_line.pngbin0 -> 287 bytes
-rw-r--r--tools/designer/designer/images/designer_lineedit.pngbin0 -> 405 bytes
-rw-r--r--tools/designer/designer/images/designer_listbox.pngbin0 -> 384 bytes
-rw-r--r--tools/designer/designer/images/designer_listview.pngbin0 -> 759 bytes
-rw-r--r--tools/designer/designer/images/designer_multilineedit.pngbin0 -> 452 bytes
-rw-r--r--tools/designer/designer/images/designer_newform.pngbin0 -> 531 bytes
-rw-r--r--tools/designer/designer/images/designer_no.pngbin0 -> 230 bytes
-rw-r--r--tools/designer/designer/images/designer_object.pngbin0 -> 1065 bytes
-rw-r--r--tools/designer/designer/images/designer_ordertool.pngbin0 -> 587 bytes
-rw-r--r--tools/designer/designer/images/designer_pixlabel.pngbin0 -> 1228 bytes
-rw-r--r--tools/designer/designer/images/designer_pointer.pngbin0 -> 586 bytes
-rw-r--r--tools/designer/designer/images/designer_print.pngbin0 -> 742 bytes
-rw-r--r--tools/designer/designer/images/designer_progress.pngbin0 -> 559 bytes
-rw-r--r--tools/designer/designer/images/designer_project.pngbin0 -> 1275 bytes
-rw-r--r--tools/designer/designer/images/designer_pushbutton.pngbin0 -> 408 bytes
-rw-r--r--tools/designer/designer/images/designer_qtlogo.pngbin0 -> 12615 bytes
-rw-r--r--tools/designer/designer/images/designer_radiobutton.pngbin0 -> 586 bytes
-rw-r--r--tools/designer/designer/images/designer_redo.pngbin0 -> 592 bytes
-rw-r--r--tools/designer/designer/images/designer_resetproperty.pngbin0 -> 184 bytes
-rw-r--r--tools/designer/designer/images/designer_richtextedit.pngbin0 -> 834 bytes
-rw-r--r--tools/designer/designer/images/designer_right.pngbin0 -> 656 bytes
-rw-r--r--tools/designer/designer/images/designer_s_down.pngbin0 -> 574 bytes
-rw-r--r--tools/designer/designer/images/designer_s_editcut.pngbin0 -> 444 bytes
-rw-r--r--tools/designer/designer/images/designer_s_left.pngbin0 -> 564 bytes
-rw-r--r--tools/designer/designer/images/designer_s_right.pngbin0 -> 557 bytes
-rw-r--r--tools/designer/designer/images/designer_s_up.pngbin0 -> 586 bytes
-rw-r--r--tools/designer/designer/images/designer_scrollbar.pngbin0 -> 408 bytes
-rw-r--r--tools/designer/designer/images/designer_searchfind.pngbin0 -> 843 bytes
-rw-r--r--tools/designer/designer/images/designer_setbuddy.pngbin0 -> 427 bytes
-rw-r--r--tools/designer/designer/images/designer_sizeall.pngbin0 -> 208 bytes
-rw-r--r--tools/designer/designer/images/designer_sizeb.pngbin0 -> 203 bytes
-rw-r--r--tools/designer/designer/images/designer_sizef.pngbin0 -> 203 bytes
-rw-r--r--tools/designer/designer/images/designer_sizeh.pngbin0 -> 179 bytes
-rw-r--r--tools/designer/designer/images/designer_sizev.pngbin0 -> 177 bytes
-rw-r--r--tools/designer/designer/images/designer_slider.pngbin0 -> 729 bytes
-rw-r--r--tools/designer/designer/images/designer_spacer.pngbin0 -> 715 bytes
-rw-r--r--tools/designer/designer/images/designer_spinbox.pngbin0 -> 455 bytes
-rw-r--r--tools/designer/designer/images/designer_splash.pngbin0 -> 123917 bytes
-rw-r--r--tools/designer/designer/images/designer_table.pngbin0 -> 483 bytes
-rw-r--r--tools/designer/designer/images/designer_tabwidget.pngbin0 -> 572 bytes
-rw-r--r--tools/designer/designer/images/designer_textbold.pngbin0 -> 494 bytes
-rw-r--r--tools/designer/designer/images/designer_textbrowser.pngbin0 -> 514 bytes
-rw-r--r--tools/designer/designer/images/designer_textcenter.pngbin0 -> 429 bytes
-rw-r--r--tools/designer/designer/images/designer_textedit.pngbin0 -> 495 bytes
-rw-r--r--tools/designer/designer/images/designer_textfont.pngbin0 -> 494 bytes
-rw-r--r--tools/designer/designer/images/designer_texth1.pngbin0 -> 462 bytes
-rw-r--r--tools/designer/designer/images/designer_texth2.pngbin0 -> 511 bytes
-rw-r--r--tools/designer/designer/images/designer_texth3.pngbin0 -> 485 bytes
-rw-r--r--tools/designer/designer/images/designer_textitalic.pngbin0 -> 442 bytes
-rw-r--r--tools/designer/designer/images/designer_textjustify.pngbin0 -> 408 bytes
-rw-r--r--tools/designer/designer/images/designer_textlarger.pngbin0 -> 710 bytes
-rw-r--r--tools/designer/designer/images/designer_textleft.pngbin0 -> 409 bytes
-rw-r--r--tools/designer/designer/images/designer_textlinebreak.pngbin0 -> 509 bytes
-rw-r--r--tools/designer/designer/images/designer_textparagraph.pngbin0 -> 527 bytes
-rw-r--r--tools/designer/designer/images/designer_textright.pngbin0 -> 408 bytes
-rw-r--r--tools/designer/designer/images/designer_textsmaller.pngbin0 -> 654 bytes
-rw-r--r--tools/designer/designer/images/designer_textteletext.pngbin0 -> 445 bytes
-rw-r--r--tools/designer/designer/images/designer_textunderline.pngbin0 -> 471 bytes
-rw-r--r--tools/designer/designer/images/designer_textview.pngbin0 -> 498 bytes
-rw-r--r--tools/designer/designer/images/designer_timeedit.pngbin0 -> 1520 bytes
-rw-r--r--tools/designer/designer/images/designer_toolbox.pngbin0 -> 783 bytes
-rw-r--r--tools/designer/designer/images/designer_toolbutton.pngbin0 -> 1261 bytes
-rw-r--r--tools/designer/designer/images/designer_undo.pngbin0 -> 572 bytes
-rw-r--r--tools/designer/designer/images/designer_up.pngbin0 -> 692 bytes
-rw-r--r--tools/designer/designer/images/designer_uparrow.pngbin0 -> 169 bytes
-rw-r--r--tools/designer/designer/images/designer_vsplit.pngbin0 -> 192 bytes
-rw-r--r--tools/designer/designer/images/designer_wait.pngbin0 -> 216 bytes
-rw-r--r--tools/designer/designer/images/designer_widgetstack.pngbin0 -> 831 bytes
-rw-r--r--tools/designer/designer/images/designer_wizarddata.pngbin0 -> 323 bytes
-rw-r--r--tools/designer/designer/images/designer_wizarddialog.pngbin0 -> 632 bytes
-rw-r--r--tools/designer/designer/images/designer_wordwrap.pngbin0 -> 643 bytes
-rw-r--r--tools/designer/designer/layout.cpp1024
-rw-r--r--tools/designer/designer/layout.h195
-rw-r--r--tools/designer/designer/listboxdnd.cpp312
-rw-r--r--tools/designer/designer/listboxdnd.h70
-rw-r--r--tools/designer/designer/listboxeditor.ui461
-rw-r--r--tools/designer/designer/listboxeditorimpl.cpp250
-rw-r--r--tools/designer/designer/listboxeditorimpl.h68
-rw-r--r--tools/designer/designer/listboxrename.cpp164
-rw-r--r--tools/designer/designer/listboxrename.h64
-rw-r--r--tools/designer/designer/listdnd.cpp149
-rw-r--r--tools/designer/designer/listdnd.h70
-rw-r--r--tools/designer/designer/listeditor.ui182
-rw-r--r--tools/designer/designer/listeditor.ui.h72
-rw-r--r--tools/designer/designer/listviewdnd.cpp439
-rw-r--r--tools/designer/designer/listviewdnd.h73
-rw-r--r--tools/designer/designer/listvieweditor.ui938
-rw-r--r--tools/designer/designer/listvieweditorimpl.cpp655
-rw-r--r--tools/designer/designer/listvieweditorimpl.h109
-rw-r--r--tools/designer/designer/mainwindow.cpp3784
-rw-r--r--tools/designer/designer/mainwindow.h503
-rw-r--r--tools/designer/designer/mainwindowactions.cpp2061
-rw-r--r--tools/designer/designer/menubareditor.cpp1134
-rw-r--r--tools/designer/designer/menubareditor.h205
-rw-r--r--tools/designer/designer/metadatabase.cpp1693
-rw-r--r--tools/designer/designer/metadatabase.h276
-rw-r--r--tools/designer/designer/multilineeditor.ui188
-rw-r--r--tools/designer/designer/multilineeditorimpl.cpp417
-rw-r--r--tools/designer/designer/multilineeditorimpl.h116
-rw-r--r--tools/designer/designer/newform.ui245
-rw-r--r--tools/designer/designer/newformimpl.cpp418
-rw-r--r--tools/designer/designer/newformimpl.h171
-rw-r--r--tools/designer/designer/orderindicator.cpp119
-rw-r--r--tools/designer/designer/orderindicator.h64
-rw-r--r--tools/designer/designer/outputwindow.cpp214
-rw-r--r--tools/designer/designer/outputwindow.h105
-rw-r--r--tools/designer/designer/paletteeditor.ui503
-rw-r--r--tools/designer/designer/paletteeditoradvanced.ui755
-rw-r--r--tools/designer/designer/paletteeditoradvancedimpl.cpp650
-rw-r--r--tools/designer/designer/paletteeditoradvancedimpl.h103
-rw-r--r--tools/designer/designer/paletteeditorimpl.cpp311
-rw-r--r--tools/designer/designer/paletteeditorimpl.h83
-rw-r--r--tools/designer/designer/pixmapchooser.cpp206
-rw-r--r--tools/designer/designer/pixmapchooser.h79
-rw-r--r--tools/designer/designer/pixmapcollection.cpp187
-rw-r--r--tools/designer/designer/pixmapcollection.h87
-rw-r--r--tools/designer/designer/pixmapcollectioneditor.ui225
-rw-r--r--tools/designer/designer/pixmapcollectioneditor.ui.h156
-rw-r--r--tools/designer/designer/pixmapfunction.ui937
-rw-r--r--tools/designer/designer/popupmenueditor.cpp1469
-rw-r--r--tools/designer/designer/popupmenueditor.h242
-rw-r--r--tools/designer/designer/preferences.ui670
-rw-r--r--tools/designer/designer/previewframe.cpp64
-rw-r--r--tools/designer/designer/previewframe.h66
-rw-r--r--tools/designer/designer/previewwidget.ui311
-rw-r--r--tools/designer/designer/previewwidgetimpl.cpp72
-rw-r--r--tools/designer/designer/previewwidgetimpl.h50
-rw-r--r--tools/designer/designer/project.cpp1598
-rw-r--r--tools/designer/designer/project.h280
-rw-r--r--tools/designer/designer/projectsettings.ui308
-rw-r--r--tools/designer/designer/projectsettingsimpl.cpp132
-rw-r--r--tools/designer/designer/projectsettingsimpl.h63
-rw-r--r--tools/designer/designer/propertyeditor.cpp4308
-rw-r--r--tools/designer/designer/propertyeditor.h874
-rw-r--r--tools/designer/designer/propertyobject.cpp165
-rw-r--r--tools/designer/designer/propertyobject.h43
-rw-r--r--tools/designer/designer/qcompletionedit.cpp217
-rw-r--r--tools/designer/designer/qcompletionedit.h86
-rw-r--r--tools/designer/designer/replacedialog.ui325
-rw-r--r--tools/designer/designer/replacedialog.ui.h82
-rw-r--r--tools/designer/designer/resource.cpp3359
-rw-r--r--tools/designer/designer/resource.h172
-rw-r--r--tools/designer/designer/richtextfontdialog.ui354
-rw-r--r--tools/designer/designer/richtextfontdialog.ui.h49
-rw-r--r--tools/designer/designer/sizehandle.cpp394
-rw-r--r--tools/designer/designer/sizehandle.h104
-rw-r--r--tools/designer/designer/sourceeditor.cpp325
-rw-r--r--tools/designer/designer/sourceeditor.h113
-rw-r--r--tools/designer/designer/sourcefile.cpp302
-rw-r--r--tools/designer/designer/sourcefile.h93
-rw-r--r--tools/designer/designer/startdialog.ui331
-rw-r--r--tools/designer/designer/startdialogimpl.cpp177
-rw-r--r--tools/designer/designer/startdialogimpl.h87
-rw-r--r--tools/designer/designer/styledbutton.cpp302
-rw-r--r--tools/designer/designer/styledbutton.h110
-rw-r--r--tools/designer/designer/syntaxhighlighter_html.cpp167
-rw-r--r--tools/designer/designer/syntaxhighlighter_html.h64
-rw-r--r--tools/designer/designer/tableeditor.ui831
-rw-r--r--tools/designer/designer/tableeditorimpl.cpp501
-rw-r--r--tools/designer/designer/tableeditorimpl.h89
-rw-r--r--tools/designer/designer/timestamp.cpp93
-rw-r--r--tools/designer/designer/timestamp.h70
-rw-r--r--tools/designer/designer/variabledialog.ui301
-rw-r--r--tools/designer/designer/variabledialogimpl.cpp185
-rw-r--r--tools/designer/designer/variabledialogimpl.h63
-rw-r--r--tools/designer/designer/widgetaction.cpp65
-rw-r--r--tools/designer/designer/widgetaction.h72
-rw-r--r--tools/designer/designer/widgetfactory.cpp1821
-rw-r--r--tools/designer/designer/widgetfactory.h509
-rw-r--r--tools/designer/designer/wizardeditor.ui345
-rw-r--r--tools/designer/designer/wizardeditorimpl.cpp258
-rw-r--r--tools/designer/designer/wizardeditorimpl.h81
-rw-r--r--tools/designer/designer/workspace.cpp713
-rw-r--r--tools/designer/designer/workspace.h158
-rw-r--r--tools/designer/editor/arghintwidget.cpp239
-rw-r--r--tools/designer/editor/arghintwidget.h69
-rw-r--r--tools/designer/editor/browser.cpp149
-rw-r--r--tools/designer/editor/browser.h66
-rw-r--r--tools/designer/editor/cindent.cpp163
-rw-r--r--tools/designer/editor/cindent.h63
-rw-r--r--tools/designer/editor/completion.cpp714
-rw-r--r--tools/designer/editor/completion.h110
-rw-r--r--tools/designer/editor/conf.cpp269
-rw-r--r--tools/designer/editor/conf.h75
-rw-r--r--tools/designer/editor/editor.cpp251
-rw-r--r--tools/designer/editor/editor.h111
-rw-r--r--tools/designer/editor/editor.pro40
-rw-r--r--tools/designer/editor/markerwidget.cpp491
-rw-r--r--tools/designer/editor/markerwidget.h75
-rw-r--r--tools/designer/editor/paragdata.h65
-rw-r--r--tools/designer/editor/parenmatcher.cpp215
-rw-r--r--tools/designer/editor/parenmatcher.h78
-rw-r--r--tools/designer/editor/preferences.ui510
-rw-r--r--tools/designer/editor/preferences.ui.h181
-rw-r--r--tools/designer/editor/viewmanager.cpp276
-rw-r--r--tools/designer/editor/viewmanager.h100
-rw-r--r--tools/designer/editor/yyindent.cpp1170
-rw-r--r--tools/designer/examples/addressbook/addressbook.pro14
-rw-r--r--tools/designer/examples/addressbook/addressbook.ui324
-rw-r--r--tools/designer/examples/addressbook/addressbook.ui.h137
-rw-r--r--tools/designer/examples/addressbook/addressdetails.ui243
-rw-r--r--tools/designer/examples/addressbook/addressdetails.ui.h24
-rw-r--r--tools/designer/examples/addressbook/images/editcut.pngbin0 -> 163 bytes
-rw-r--r--tools/designer/examples/addressbook/images/filenew.pngbin0 -> 150 bytes
-rw-r--r--tools/designer/examples/addressbook/images/fileopen.pngbin0 -> 179 bytes
-rw-r--r--tools/designer/examples/addressbook/images/filesave.pngbin0 -> 157 bytes
-rw-r--r--tools/designer/examples/addressbook/images/searchfind.pngbin0 -> 587 bytes
-rw-r--r--tools/designer/examples/addressbook/main.cpp11
-rw-r--r--tools/designer/examples/addressbook/search.ui136
-rw-r--r--tools/designer/examples/addressbook/search.ui.h13
-rw-r--r--tools/designer/examples/book/book.sql42
-rw-r--r--tools/designer/examples/book/book1/book.ui71
-rw-r--r--tools/designer/examples/book/book1/book.ui.h5
-rw-r--r--tools/designer/examples/book/book1/book1.pro8
-rw-r--r--tools/designer/examples/book/book1/main.cpp27
-rw-r--r--tools/designer/examples/book/book2/book.ui77
-rw-r--r--tools/designer/examples/book/book2/book.ui.h10
-rw-r--r--tools/designer/examples/book/book2/book2.pro8
-rw-r--r--tools/designer/examples/book/book2/main.cpp27
-rw-r--r--tools/designer/examples/book/book3/book.ui141
-rw-r--r--tools/designer/examples/book/book3/book.ui.h16
-rw-r--r--tools/designer/examples/book/book3/book3.pro8
-rw-r--r--tools/designer/examples/book/book3/main.cpp27
-rw-r--r--tools/designer/examples/book/book4/book.ui179
-rw-r--r--tools/designer/examples/book/book4/book.ui.h16
-rw-r--r--tools/designer/examples/book/book4/book4.pro8
-rw-r--r--tools/designer/examples/book/book4/main.cpp29
-rw-r--r--tools/designer/examples/book/book5/book.ui188
-rw-r--r--tools/designer/examples/book/book5/book.ui.h23
-rw-r--r--tools/designer/examples/book/book5/book5.pro8
-rw-r--r--tools/designer/examples/book/book5/editbook.ui291
-rw-r--r--tools/designer/examples/book/book5/editbook.ui.h10
-rw-r--r--tools/designer/examples/book/book5/main.cpp27
-rw-r--r--tools/designer/examples/book/book6/book.ui189
-rw-r--r--tools/designer/examples/book/book6/book.ui.h33
-rw-r--r--tools/designer/examples/book/book6/book6.pro8
-rw-r--r--tools/designer/examples/book/book6/editbook.ui300
-rw-r--r--tools/designer/examples/book/book6/editbook.ui.h10
-rw-r--r--tools/designer/examples/book/book6/main.cpp27
-rw-r--r--tools/designer/examples/book/book7/book.ui189
-rw-r--r--tools/designer/examples/book/book7/book.ui.h33
-rw-r--r--tools/designer/examples/book/book7/book7.pro7
-rw-r--r--tools/designer/examples/book/book7/editbook.ui384
-rw-r--r--tools/designer/examples/book/book7/editbook.ui.h42
-rw-r--r--tools/designer/examples/book/book7/main.cpp27
-rw-r--r--tools/designer/examples/book/book8/book.ui189
-rw-r--r--tools/designer/examples/book/book8/book.ui.h33
-rw-r--r--tools/designer/examples/book/book8/book8.pro7
-rw-r--r--tools/designer/examples/book/book8/editbook.ui386
-rw-r--r--tools/designer/examples/book/book8/editbook.ui.h47
-rw-r--r--tools/designer/examples/book/book8/main.cpp27
-rw-r--r--tools/designer/examples/book/connection.cpp52
-rw-r--r--tools/designer/examples/book/connection.h18
-rw-r--r--tools/designer/examples/colortool/colornameform.ui168
-rw-r--r--tools/designer/examples/colortool/colornameform.ui.h27
-rw-r--r--tools/designer/examples/colortool/colortool.pro27
-rw-r--r--tools/designer/examples/colortool/findform.ui141
-rw-r--r--tools/designer/examples/colortool/findform.ui.h18
-rw-r--r--tools/designer/examples/colortool/images/editcopy.pngbin0 -> 187 bytes
-rw-r--r--tools/designer/examples/colortool/images/editcut.pngbin0 -> 163 bytes
-rw-r--r--tools/designer/examples/colortool/images/editraise.pngbin0 -> 489 bytes
-rw-r--r--tools/designer/examples/colortool/images/filenew.pngbin0 -> 127 bytes
-rw-r--r--tools/designer/examples/colortool/images/fileopen.pngbin0 -> 178 bytes
-rw-r--r--tools/designer/examples/colortool/images/filesave.pngbin0 -> 158 bytes
-rw-r--r--tools/designer/examples/colortool/images/iconview.pngbin0 -> 898 bytes
-rw-r--r--tools/designer/examples/colortool/images/richtextedit.pngbin0 -> 878 bytes
-rw-r--r--tools/designer/examples/colortool/images/searchfind.pngbin0 -> 554 bytes
-rw-r--r--tools/designer/examples/colortool/images/table.pngbin0 -> 371 bytes
-rw-r--r--tools/designer/examples/colortool/images/tabwidget.pngbin0 -> 545 bytes
-rw-r--r--tools/designer/examples/colortool/images/widgetstack.pngbin0 -> 662 bytes
-rw-r--r--tools/designer/examples/colortool/main.cpp10
-rw-r--r--tools/designer/examples/colortool/mainform.ui601
-rw-r--r--tools/designer/examples/colortool/mainform.ui.h585
-rw-r--r--tools/designer/examples/colortool/optionsform.ui153
-rw-r--r--tools/designer/examples/colortool/optionsform.ui.h7
-rw-r--r--tools/designer/examples/credit/credit.pro11
-rw-r--r--tools/designer/examples/credit/creditform.cpp20
-rw-r--r--tools/designer/examples/credit/creditform.h12
-rw-r--r--tools/designer/examples/credit/creditformbase.cpp122
-rw-r--r--tools/designer/examples/credit/creditformbase.h48
-rw-r--r--tools/designer/examples/credit/creditformbase.ui212
-rw-r--r--tools/designer/examples/credit/creditformbase.ui.h5
-rw-r--r--tools/designer/examples/credit/main.cpp25
-rw-r--r--tools/designer/examples/filechooser/plugin/plugin.cpp95
-rw-r--r--tools/designer/examples/filechooser/plugin/plugin.h16
-rw-r--r--tools/designer/examples/filechooser/plugin/plugin.pro14
-rw-r--r--tools/designer/examples/filechooser/widget/filechooser.cpp62
-rw-r--r--tools/designer/examples/filechooser/widget/filechooser.h48
-rw-r--r--tools/designer/examples/filechooser/widget/filechooser.pro9
-rw-r--r--tools/designer/examples/filechooser/widget/main.cpp10
-rw-r--r--tools/designer/examples/metric/main.cpp12
-rw-r--r--tools/designer/examples/metric/metric.pro12
-rw-r--r--tools/designer/examples/metric/metric.ui366
-rw-r--r--tools/designer/examples/metric/metric.ui.h72
-rw-r--r--tools/designer/examples/multiclip/main.cpp25
-rw-r--r--tools/designer/examples/multiclip/multiclip.pro9
-rw-r--r--tools/designer/examples/multiclip/multiclip.ui206
-rw-r--r--tools/designer/examples/multiclip/multiclip.ui.h70
-rw-r--r--tools/designer/examples/opengl/glwidget.cpp170
-rw-r--r--tools/designer/examples/opengl/glwidget.h75
-rw-r--r--tools/designer/examples/opengl/main.cpp305
-rw-r--r--tools/designer/examples/opengl/opengl.pro11
-rw-r--r--tools/designer/examples/receiver1/main.cpp24
-rw-r--r--tools/designer/examples/receiver1/mainform.ui87
-rw-r--r--tools/designer/examples/receiver1/mainform.ui.h25
-rw-r--r--tools/designer/examples/receiver1/receiver.pro11
-rw-r--r--tools/designer/examples/receiver2/main.cpp25
-rw-r--r--tools/designer/examples/receiver2/mainform.ui82
-rw-r--r--tools/designer/examples/receiver2/mainform.ui.h20
-rw-r--r--tools/designer/examples/receiver2/receiver.cpp29
-rw-r--r--tools/designer/examples/receiver2/receiver.h13
-rw-r--r--tools/designer/examples/receiver2/receiver.pro12
-rw-r--r--tools/designer/examples/richedit/images/editcopy.pngbin0 -> 187 bytes
-rw-r--r--tools/designer/examples/richedit/images/editcut.pngbin0 -> 163 bytes
-rw-r--r--tools/designer/examples/richedit/images/editpaste.pngbin0 -> 209 bytes
-rw-r--r--tools/designer/examples/richedit/images/filenew.pngbin0 -> 127 bytes
-rw-r--r--tools/designer/examples/richedit/images/fileopen.pngbin0 -> 178 bytes
-rw-r--r--tools/designer/examples/richedit/images/filesave.pngbin0 -> 158 bytes
-rw-r--r--tools/designer/examples/richedit/images/redo.pngbin0 -> 149 bytes
-rw-r--r--tools/designer/examples/richedit/images/textbold.pngbin0 -> 119 bytes
-rw-r--r--tools/designer/examples/richedit/images/textcenter.pngbin0 -> 92 bytes
-rw-r--r--tools/designer/examples/richedit/images/textitalic.pngbin0 -> 102 bytes
-rw-r--r--tools/designer/examples/richedit/images/textleft.pngbin0 -> 90 bytes
-rw-r--r--tools/designer/examples/richedit/images/textright.pngbin0 -> 93 bytes
-rw-r--r--tools/designer/examples/richedit/images/textunder.pngbin0 -> 115 bytes
-rw-r--r--tools/designer/examples/richedit/images/undo.pngbin0 -> 150 bytes
-rw-r--r--tools/designer/examples/richedit/main.cpp25
-rw-r--r--tools/designer/examples/richedit/richedit.pro10
-rw-r--r--tools/designer/examples/richedit/richedit.ui612
-rw-r--r--tools/designer/examples/richedit/richedit.ui.h120
-rw-r--r--tools/designer/examples/sizeaware/main.cpp11
-rw-r--r--tools/designer/examples/sizeaware/sizeaware.cpp38
-rw-r--r--tools/designer/examples/sizeaware/sizeaware.h23
-rw-r--r--tools/designer/examples/sizeaware/sizeaware.pro6
-rw-r--r--tools/designer/examples/vcr/main.cpp10
-rw-r--r--tools/designer/examples/vcr/play.xpm23
-rw-r--r--tools/designer/examples/vcr/vcr.cpp117
-rw-r--r--tools/designer/examples/vcr/vcr.h17
-rw-r--r--tools/designer/examples/vcr/vcr.pro8
-rw-r--r--tools/designer/integration/designer.el19
-rw-r--r--tools/designer/interfaces/actioninterface.h85
-rw-r--r--tools/designer/interfaces/classbrowserinterface.h70
-rw-r--r--tools/designer/interfaces/designerinterface.h268
-rw-r--r--tools/designer/interfaces/editorinterface.h109
-rw-r--r--tools/designer/interfaces/filterinterface.h75
-rw-r--r--tools/designer/interfaces/interpreterinterface.h66
-rw-r--r--tools/designer/interfaces/languageinterface.h138
-rw-r--r--tools/designer/interfaces/preferenceinterface.h75
-rw-r--r--tools/designer/interfaces/projectsettingsiface.h76
-rw-r--r--tools/designer/interfaces/sourcetemplateiface.h72
-rw-r--r--tools/designer/interfaces/templatewizardiface.h67
-rw-r--r--tools/designer/interfaces/widgetinterface.h42
-rw-r--r--tools/designer/plugins/cppeditor/common.cpp111
-rw-r--r--tools/designer/plugins/cppeditor/cppbrowser.cpp78
-rw-r--r--tools/designer/plugins/cppeditor/cppbrowser.h50
-rw-r--r--tools/designer/plugins/cppeditor/cppcompletion.cpp220
-rw-r--r--tools/designer/plugins/cppeditor/cppcompletion.h60
-rw-r--r--tools/designer/plugins/cppeditor/cppeditor.cpp168
-rw-r--r--tools/designer/plugins/cppeditor/cppeditor.h78
-rw-r--r--tools/designer/plugins/cppeditor/cppeditor.pro21
-rw-r--r--tools/designer/plugins/cppeditor/editorinterfaceimpl.cpp338
-rw-r--r--tools/designer/plugins/cppeditor/editorinterfaceimpl.h107
-rw-r--r--tools/designer/plugins/cppeditor/languageinterfaceimpl.cpp249
-rw-r--r--tools/designer/plugins/cppeditor/languageinterfaceimpl.h90
-rw-r--r--tools/designer/plugins/cppeditor/mainfilesettings.ui211
-rw-r--r--tools/designer/plugins/cppeditor/mainfilesettings.ui.h36
-rw-r--r--tools/designer/plugins/cppeditor/preferenceinterfaceimpl.cpp102
-rw-r--r--tools/designer/plugins/cppeditor/preferenceinterfaceimpl.h64
-rw-r--r--tools/designer/plugins/cppeditor/projectsettings.ui347
-rw-r--r--tools/designer/plugins/cppeditor/projectsettings.ui.h106
-rw-r--r--tools/designer/plugins/cppeditor/projectsettingsinterfaceimpl.cpp106
-rw-r--r--tools/designer/plugins/cppeditor/projectsettingsinterfaceimpl.h62
-rw-r--r--tools/designer/plugins/cppeditor/sourcetemplateinterfaceimpl.cpp117
-rw-r--r--tools/designer/plugins/cppeditor/sourcetemplateinterfaceimpl.h54
-rw-r--r--tools/designer/plugins/cppeditor/syntaxhighliter_cpp.cpp550
-rw-r--r--tools/designer/plugins/cppeditor/syntaxhighliter_cpp.h73
-rw-r--r--tools/designer/plugins/cppeditor/yyreg.cpp800
-rw-r--r--tools/designer/plugins/cppeditor/yyreg.h88
-rw-r--r--tools/designer/plugins/dlg/dlg.pro13
-rw-r--r--tools/designer/plugins/dlg/dlg2ui.cpp1632
-rw-r--r--tools/designer/plugins/dlg/dlg2ui.h144
-rw-r--r--tools/designer/plugins/dlg/main.cpp108
-rw-r--r--tools/designer/plugins/glade/glade.pro13
-rw-r--r--tools/designer/plugins/glade/glade2ui.cpp2203
-rw-r--r--tools/designer/plugins/glade/glade2ui.h169
-rw-r--r--tools/designer/plugins/glade/main.cpp109
-rw-r--r--tools/designer/plugins/kdevdlg/kdevdlg.pro11
-rw-r--r--tools/designer/plugins/kdevdlg/kdevdlg2ui.cpp524
-rw-r--r--tools/designer/plugins/kdevdlg/kdevdlg2ui.h90
-rw-r--r--tools/designer/plugins/kdevdlg/main.cpp120
-rw-r--r--tools/designer/plugins/plugins.pro9
-rw-r--r--tools/designer/plugins/rc/main.cpp117
-rw-r--r--tools/designer/plugins/rc/rc.pro11
-rw-r--r--tools/designer/plugins/rc/rc2ui.cpp888
-rw-r--r--tools/designer/plugins/rc/rc2ui.h103
-rw-r--r--tools/designer/plugins/wizards/images/qtwizards_menu_1.pngbin0 -> 10172 bytes
-rw-r--r--tools/designer/plugins/wizards/images/qtwizards_menu_2.pngbin0 -> 12582 bytes
-rw-r--r--tools/designer/plugins/wizards/images/qtwizards_menu_3.pngbin0 -> 11653 bytes
-rw-r--r--tools/designer/plugins/wizards/images/qtwizards_table_1.pngbin0 -> 13382 bytes
-rw-r--r--tools/designer/plugins/wizards/images/qtwizards_table_2.pngbin0 -> 15245 bytes
-rw-r--r--tools/designer/plugins/wizards/images/qtwizards_table_3.pngbin0 -> 16105 bytes
-rw-r--r--tools/designer/plugins/wizards/images/qtwizards_table_4.pngbin0 -> 7894 bytes
-rw-r--r--tools/designer/plugins/wizards/images/re-sort.pngbin0 -> 254 bytes
-rw-r--r--tools/designer/plugins/wizards/images/small/editcopy.pngbin0 -> 172 bytes
-rw-r--r--tools/designer/plugins/wizards/images/small/editcut.pngbin0 -> 157 bytes
-rw-r--r--tools/designer/plugins/wizards/images/small/editpaste.pngbin0 -> 199 bytes
-rw-r--r--tools/designer/plugins/wizards/images/small/filenew.pngbin0 -> 119 bytes
-rw-r--r--tools/designer/plugins/wizards/images/small/fileopen.pngbin0 -> 165 bytes
-rw-r--r--tools/designer/plugins/wizards/images/small/filesave.pngbin0 -> 150 bytes
-rw-r--r--tools/designer/plugins/wizards/images/small/print.pngbin0 -> 586 bytes
-rw-r--r--tools/designer/plugins/wizards/images/small/redo.pngbin0 -> 137 bytes
-rw-r--r--tools/designer/plugins/wizards/images/small/searchfind.pngbin0 -> 534 bytes
-rw-r--r--tools/designer/plugins/wizards/images/small/undo.pngbin0 -> 137 bytes
-rw-r--r--tools/designer/plugins/wizards/main.cpp142
-rw-r--r--tools/designer/plugins/wizards/mainwindowwizard.ui757
-rw-r--r--tools/designer/plugins/wizards/mainwindowwizard.ui.h321
-rw-r--r--tools/designer/plugins/wizards/sqlformwizard.ui1776
-rw-r--r--tools/designer/plugins/wizards/sqlformwizardimpl.cpp624
-rw-r--r--tools/designer/plugins/wizards/sqlformwizardimpl.h87
-rw-r--r--tools/designer/plugins/wizards/wizards.pro21
-rw-r--r--tools/designer/shared/domtool.cpp460
-rw-r--r--tools/designer/shared/domtool.h60
-rw-r--r--tools/designer/shared/globaldefs.h69
-rw-r--r--tools/designer/shared/parser.cpp79
-rw-r--r--tools/designer/shared/parser.h46
-rw-r--r--tools/designer/shared/ui2uib.cpp900
-rw-r--r--tools/designer/shared/ui2uib.h42
-rw-r--r--tools/designer/shared/uib.cpp49
-rw-r--r--tools/designer/shared/uib.h159
-rw-r--r--tools/designer/shared/widgetdatabase.cpp960
-rw-r--r--tools/designer/shared/widgetdatabase.h103
-rw-r--r--tools/designer/templates/Configuration_Dialog.ui162
-rw-r--r--tools/designer/templates/Dialog_with_Buttons_(Bottom).ui122
-rw-r--r--tools/designer/templates/Dialog_with_Buttons_(Right).ui122
-rw-r--r--tools/designer/templates/Tab_Dialog.ui146
-rw-r--r--tools/designer/tools/conv2ui/conv2ui.pro10
-rw-r--r--tools/designer/tools/conv2ui/main.cpp220
-rw-r--r--tools/designer/tools/createcw/README18
-rw-r--r--tools/designer/tools/createcw/createcw.pro8
-rw-r--r--tools/designer/tools/createcw/main.cpp190
-rw-r--r--tools/designer/uic/embed.cpp316
-rw-r--r--tools/designer/uic/form.cpp1452
-rw-r--r--tools/designer/uic/main.cpp358
-rw-r--r--tools/designer/uic/object.cpp745
-rw-r--r--tools/designer/uic/subclassing.cpp352
-rw-r--r--tools/designer/uic/uic.cpp1129
-rw-r--r--tools/designer/uic/uic.h176
-rw-r--r--tools/designer/uic/uic.pro42
-rw-r--r--tools/designer/uilib/qwidgetfactory.cpp2623
-rw-r--r--tools/designer/uilib/qwidgetfactory.h187
-rw-r--r--tools/designer/uilib/test/main.cpp50
-rw-r--r--tools/designer/uilib/test/test.pro7
-rw-r--r--tools/designer/uilib/uilib.pro30
667 files changed, 120860 insertions, 0 deletions
diff --git a/tools/designer/LICENSE.GPL b/tools/designer/LICENSE.GPL
new file mode 100644
index 0000000..3221c03
--- /dev/null
+++ b/tools/designer/LICENSE.GPL
@@ -0,0 +1,280 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/tools/designer/app/app.pro b/tools/designer/app/app.pro
new file mode 100644
index 0000000..0d66797
--- /dev/null
+++ b/tools/designer/app/app.pro
@@ -0,0 +1,26 @@
+TEMPLATE = app
+TARGET = designer
+
+CONFIG -= moc
+DESTDIR = $$QT_BUILD_TREE/bin
+
+SOURCES += main.cpp
+INCLUDEPATH += ../designer
+LIBS += -ldesignercore -lqui -lqassistantclient -L$$QT_BUILD_TREE/lib
+win32 {
+ RC_FILE = designer.rc
+ win32-g++ {
+ TARGETDEPS += $$QT_BUILD_TREE/lib/libdesignercore.a
+ } else {
+ TARGETDEPS += $$QT_BUILD_TREE/lib/designercore.lib
+ }
+}
+mac {
+ RC_FILE = designer.icns
+ QMAKE_INFO_PLIST = Info_mac.plist
+ staticlib:CONFIG -= global_init_link_order #yuck
+}
+
+
+target.path=$$bins.path
+INSTALLS += target
diff --git a/tools/designer/app/designer.icns b/tools/designer/app/designer.icns
new file mode 100644
index 0000000..211cc24
--- /dev/null
+++ b/tools/designer/app/designer.icns
Binary files differ
diff --git a/tools/designer/app/designer.ico b/tools/designer/app/designer.ico
new file mode 100644
index 0000000..7312d20
--- /dev/null
+++ b/tools/designer/app/designer.ico
Binary files differ
diff --git a/tools/designer/app/designer.rc b/tools/designer/app/designer.rc
new file mode 100644
index 0000000..4b6324b
--- /dev/null
+++ b/tools/designer/app/designer.rc
@@ -0,0 +1,2 @@
+IDI_ICON1 ICON DISCARDABLE "designer.ico"
+
diff --git a/tools/designer/app/main.cpp b/tools/designer/app/main.cpp
new file mode 100644
index 0000000..ef3e907
--- /dev/null
+++ b/tools/designer/app/main.cpp
@@ -0,0 +1,228 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "qplatformdefs.h"
+
+// SCO OpenServer redefines raise -> kill
+#if defined(raise)
+# undef raise
+#endif
+
+#include "mainwindow.h"
+#include "formwindow.h"
+
+#include "designerapp.h"
+
+#include <qtextstream.h>
+#include <qobjectlist.h>
+#include <qsettings.h>
+#include <qsplashscreen.h>
+#include <qdir.h>
+
+#include <stdlib.h>
+#include <signal.h>
+
+// SCO OpenServer redefines raise -> kill
+#if defined(raise)
+# undef raise
+#endif
+
+#if defined(Q_WS_WIN)
+#include <qt_windows.h>
+#include <process.h>
+#endif
+
+#if defined(Q_OS_UNIX)
+#if defined(Q_C_CALLBACKS)
+extern "C" {
+#endif
+
+static void signalHandler( QT_SIGNAL_ARGS )
+{
+ QFile f( QDir::homeDirPath() + "/.designerargs" );
+ f.open( IO_ReadOnly );
+ QString args;
+ f.readLine( args, f.size() );
+ QStringList lst = QStringList::split( " ", args );
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ QString arg = (*it).stripWhiteSpace();
+ if ( arg[0] != '-' ) {
+ QObjectList* l = MainWindow::self->queryList( "FormWindow" );
+ FormWindow* fw = (FormWindow*) l->first();
+#if 0 // ### what's this dead code for?
+ FormWindow* totop;
+#endif
+ bool haveit = FALSE;
+ while ( fw ) {
+ haveit = haveit || fw->fileName() == arg;
+#if 0 // ### what's this dead code for?
+ if ( haveit )
+ totop = fw;
+#endif
+ fw = (FormWindow*) l->next();
+ }
+ if ( !haveit )
+ MainWindow::self->openFormWindow( arg );
+ }
+ }
+ MainWindow::self->raise();
+ MainWindow::self->setActiveWindow();
+}
+
+#if defined(Q_C_CALLBACKS)
+}
+#endif
+
+#endif
+
+#if defined(Q_C_CALLBACKS)
+extern "C" {
+#endif
+
+static void exitHandler( QT_SIGNAL_ARGS )
+{
+ QDir d( QDir::homeDirPath() );
+ d.remove( ".designerpid" );
+ exit( -1 );
+}
+
+#if defined(Q_C_CALLBACKS)
+}
+#endif
+
+int main( int argc, char *argv[] )
+{
+ QApplication::setColorSpec( QApplication::ManyColor );
+
+ DesignerApplication a( argc, argv );
+
+ DesignerApplication::setOverrideCursor( Qt::WaitCursor );
+
+ bool creatPid = FALSE;
+ if ( a.argc() > 1 ) {
+ QString arg1 = a.argv()[ 1 ];
+ if ( arg1 == "-client" ) {
+ QFile pf( QDir::homeDirPath() + "/.designerpid" );
+ if ( pf.exists() && pf.open( IO_ReadOnly ) ) {
+ QString pidStr;
+ pf.readLine( pidStr, pf.size() );
+ QFile f( QDir::homeDirPath() + "/.designerargs" );
+ f.open( IO_WriteOnly );
+ QTextStream ts( &f );
+ for ( int i = 1; i < a.argc(); ++i )
+ ts << a.argv()[ i ] << " ";
+ ts << endl;
+ f.close();
+#if defined(Q_OS_UNIX)
+ if ( kill( pidStr.toInt(), SIGUSR1 ) == -1 )
+ creatPid = TRUE;
+ else
+ return 0;
+#elif defined(Q_OS_WIN32)
+ if ( !GetProcessVersion( pidStr.toUInt() ) ) {
+ creatPid = TRUE;
+ } else {
+ if ( a.winVersion() & Qt::WV_NT_based )
+ SendMessage( HWND_BROADCAST, RegisterWindowMessage((TCHAR*)"QT_DESIGNER_OPEN_FILE"), 0, 0 );
+ else
+ SendMessage( HWND_BROADCAST, RegisterWindowMessageA("QT_DESIGNER_OPEN_FILE"), 0, 0 );
+ return 0;
+ }
+#endif
+ } else {
+ creatPid = TRUE;
+ }
+ } else if(arg1 == "-debug_stderr") {
+ extern bool debugToStderr; //outputwindow.cpp
+ debugToStderr = TRUE;
+ }
+ }
+
+ if ( creatPid ) {
+ QFile pf( QDir::homeDirPath() + "/.designerpid" );
+ pf.open( IO_WriteOnly );
+ QTextStream ts( &pf );
+#if defined(Q_OS_UNIX)
+ signal( SIGUSR1, signalHandler );
+#endif
+ ts << getpid() << endl;
+
+ pf.close();
+ signal( SIGABRT, exitHandler );
+ signal( SIGFPE, exitHandler );
+ signal( SIGILL, exitHandler );
+ signal( SIGINT, exitHandler );
+ signal( SIGSEGV, exitHandler );
+ signal( SIGTERM, exitHandler );
+ }
+
+ extern void qInitImages_designercore();
+ qInitImages_designercore();
+
+ QSettings config;
+ QString keybase = DesignerApplication::settingsKey();
+ config.insertSearchPath( QSettings::Windows, "/Trolltech" );
+ QStringList pluginPaths = config.readListEntry( keybase + "PluginPaths" );
+ if (pluginPaths.count())
+ QApplication::setLibraryPaths(pluginPaths);
+
+ QSplashScreen *splash = a.showSplash();
+
+ MainWindow *mw = new MainWindow( creatPid );
+ a.setMainWidget( mw );
+#if defined(QT_NON_COMMERCIAL)
+ mw->setCaption( "Qt Designer by Trolltech for non-commercial use" );
+#else
+ mw->setCaption( "Qt Designer by Trolltech" );
+#endif
+ if ( config.readBoolEntry( keybase + "Geometries/MainwindowMaximized", FALSE ) ) {
+ int x = config.readNumEntry( keybase + "Geometries/MainwindowX", 0 );
+ int y = config.readNumEntry( keybase + "Geometries/MainwindowY", 0 );
+ mw->move( x, y );
+ mw->showMaximized();
+ } else {
+ mw->show();
+ }
+ if ( splash )
+ splash->finish( mw );
+ delete splash;
+
+ QApplication::restoreOverrideCursor();
+ for ( int i = 1; i < a.argc(); ++i ) {
+ QString arg = a.argv()[ i ];
+ if ( arg[0] != '-' )
+ mw->fileOpen( "", "", arg );
+ }
+
+ return a.exec();
+}
diff --git a/tools/designer/designer.pro b/tools/designer/designer.pro
new file mode 100644
index 0000000..337bbb4
--- /dev/null
+++ b/tools/designer/designer.pro
@@ -0,0 +1,14 @@
+TEMPLATE = subdirs
+
+CONFIG += ordered
+
+SUBDIRS = uic \
+ uilib \
+ designer \
+ app \
+ tools/createcw \
+ tools/conv2ui
+
+dll:SUBDIRS *= editor plugins
+shared:SUBDIRS *= editor plugins
+REQUIRES=full-config nocrosscompiler
diff --git a/tools/designer/designer/about.ui b/tools/designer/designer/about.ui
new file mode 100644
index 0000000..261ed9d
--- /dev/null
+++ b/tools/designer/designer/about.ui
@@ -0,0 +1,222 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>AboutDialog</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AboutDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>544</width>
+ <height>667</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Qt Designer</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>aboutPixmap</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_splash.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>aboutVersion</cstring>
+ </property>
+ <property name="text">
+ <string>Version 3.2</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>aboutCopyright</cstring>
+ </property>
+ <property name="text">
+ <string>Copyright (C) 2000-2008 Trolltech ASA. All Rights Reserved.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>aboutLicense</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;Qt Commercial Edition license holders: This program is licensed to you under the terms of the Qt Commercial License Agreement. For details, see the file LICENSE that came with this software distribution.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Qt Open Source Edition users: This program is licensed to you under the terms of the GNU General Public License Version 2. For details, see the file LICENSE.GPL that came with this software distribution.&lt;/p&gt;&lt;p&gt;The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;/p&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter|AlignLeft</set>
+ </property>
+ <property name="wordwrap" stdset="0">
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>AboutDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/actiondnd.cpp b/tools/designer/designer/actiondnd.cpp
new file mode 100644
index 0000000..84ec0f6
--- /dev/null
+++ b/tools/designer/designer/actiondnd.cpp
@@ -0,0 +1,743 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "actiondnd.h"
+#include "command.h"
+#include "defs.h"
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "metadatabase.h"
+#include "widgetfactory.h"
+#include "hierarchyview.h"
+
+#include <qaction.h>
+#include <qapplication.h>
+#include <qbitmap.h>
+#include <qdragobject.h>
+#include <qinputdialog.h>
+#include <qlayout.h>
+#include <qmainwindow.h>
+#include <qmenudata.h>
+#include <qmessagebox.h>
+#include <qobjectlist.h>
+#include <qpainter.h>
+#include <qstyle.h>
+#include <qtimer.h>
+
+QAction *ActionDrag::the_action = 0;
+
+ActionDrag::ActionDrag(QAction *action, QWidget *source)
+: QStoredDrag("application/x-designer-actions", source)
+{
+ Q_ASSERT(the_action == 0);
+ the_action = action;
+}
+
+ActionDrag::ActionDrag(QActionGroup *group, QWidget *source)
+: QStoredDrag("application/x-designer-actiongroup", source)
+{
+ Q_ASSERT(the_action == 0);
+ the_action = group;
+}
+
+ActionDrag::ActionDrag(const QString &type, QAction *action, QWidget *source)
+: QStoredDrag(type, source)
+{
+ Q_ASSERT(the_action == 0);
+ the_action = action;
+}
+
+bool ActionDrag::canDecode(QDropEvent *e)
+{
+ return e->provides( "application/x-designer-actions" ) ||
+ e->provides( "application/x-designer-actiongroup" ) ||
+ e->provides( "application/x-designer-separator" );
+}
+
+ActionDrag::~ActionDrag()
+{
+ the_action = 0;
+}
+
+void QDesignerAction::init()
+{
+ MetaDataBase::addEntry( this );
+ int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( this ) );
+ WidgetFactory::saveDefaultProperties( this, id );
+ WidgetFactory::saveChangedProperties( this, id );
+}
+
+void QDesignerActionGroup::init()
+{
+ MetaDataBase::addEntry( this );
+ int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( this ) );
+ WidgetFactory::saveDefaultProperties( this, id );
+ WidgetFactory::saveChangedProperties( this, id );
+}
+
+bool QDesignerAction::addTo( QWidget *w )
+{
+ if ( !widgetToInsert )
+ return QAction::addTo( w );
+
+ if ( ::qt_cast<QPopupMenu*>(w) )
+ return FALSE;
+
+ widgetToInsert->reparent( w, QPoint( 0, 0 ), FALSE );
+ widgetToInsert->show();
+ addedTo( widgetToInsert, w );
+ return TRUE;
+}
+
+bool QDesignerAction::removeFrom( QWidget *w )
+{
+ if ( !widgetToInsert )
+ return QAction::removeFrom( w );
+
+ remove();
+ return TRUE;
+}
+
+void QDesignerAction::remove()
+{
+ if ( !widgetToInsert )
+ return;
+ MainWindow::self->formWindow()->selectWidget( widgetToInsert, FALSE );
+ widgetToInsert->reparent( 0, QPoint( 0, 0 ), FALSE );
+}
+
+class QDesignerIndicatorWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ QDesignerIndicatorWidget( QWidget *p )
+ : QWidget( p, "qt_dockwidget_internal" ) {
+ setBackgroundColor( red );
+ }
+
+};
+
+QDesignerToolBarSeparator::QDesignerToolBarSeparator(Orientation o , QToolBar *parent,
+ const char* name )
+ : QWidget( parent, name )
+{
+ connect( parent, SIGNAL(orientationChanged(Orientation)),
+ this, SLOT(setOrientation(Orientation)) );
+ setOrientation( o );
+ setBackgroundMode( parent->backgroundMode() );
+ setBackgroundOrigin( ParentOrigin );
+ setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ) );
+}
+
+void QDesignerToolBarSeparator::setOrientation( Orientation o )
+{
+ orient = o;
+}
+
+void QDesignerToolBarSeparator::styleChange( QStyle& )
+{
+ setOrientation( orient );
+}
+
+QSize QDesignerToolBarSeparator::sizeHint() const
+{
+ int extent = style().pixelMetric( QStyle::PM_DockWindowSeparatorExtent,
+ this );
+ if ( orient == Horizontal )
+ return QSize( extent, 0 );
+ else
+ return QSize( 0, extent );
+}
+
+void QDesignerToolBarSeparator::paintEvent( QPaintEvent * )
+{
+ QPainter p( this );
+ QStyle::SFlags flags = QStyle::Style_Default;
+
+ if ( orientation() == Horizontal )
+ flags |= QStyle::Style_Horizontal;
+
+ style().drawPrimitive( QStyle::PE_DockWindowSeparator, &p, rect(),
+ colorGroup(), flags );
+}
+
+
+
+QSeparatorAction::QSeparatorAction( QObject *parent )
+ : QAction( parent, "qt_designer_separator" ), wid( 0 )
+{
+}
+
+bool QSeparatorAction::addTo( QWidget *w )
+{
+ if ( ::qt_cast<QToolBar*>(w) ) {
+ QToolBar *tb = (QToolBar*)w;
+ wid = new QDesignerToolBarSeparator( tb->orientation(), tb );
+ return TRUE;
+ } else if ( ::qt_cast<QPopupMenu*>(w) ) {
+ idx = ( (QPopupMenu*)w )->count();
+ ( (QPopupMenu*)w )->insertSeparator( idx );
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool QSeparatorAction::removeFrom( QWidget *w )
+{
+ if ( ::qt_cast<QToolBar*>(w) ) {
+ delete wid;
+ return TRUE;
+ } else if ( ::qt_cast<QPopupMenu*>(w) ) {
+ ( (QPopupMenu*)w )->removeItemAt( idx );
+ return TRUE;
+ }
+ return FALSE;
+}
+
+QWidget *QSeparatorAction::widget() const
+{
+ return wid;
+}
+
+
+
+QDesignerToolBar::QDesignerToolBar( QMainWindow *mw )
+ : QToolBar( mw ), lastIndicatorPos( -1, -1 )
+{
+ insertAnchor = 0;
+ afterAnchor = TRUE;
+ setAcceptDrops( TRUE );
+ MetaDataBase::addEntry( this );
+ lastIndicatorPos = QPoint( -1, -1 );
+ indicator = new QDesignerIndicatorWidget( this );
+ indicator->hide();
+ installEventFilter( this );
+ widgetInserting = FALSE;
+ findFormWindow();
+ mw->setDockEnabled( DockTornOff, FALSE );
+}
+
+QDesignerToolBar::QDesignerToolBar( QMainWindow *mw, Dock dock )
+ : QToolBar( QString::null, mw, dock), lastIndicatorPos( -1, -1 )
+{
+ insertAnchor = 0;
+ afterAnchor = TRUE;
+ setAcceptDrops( TRUE );
+ indicator = new QDesignerIndicatorWidget( this );
+ indicator->hide();
+ MetaDataBase::addEntry( this );
+ installEventFilter( this );
+ widgetInserting = FALSE;
+ findFormWindow();
+ mw->setDockEnabled( DockTornOff, FALSE );
+}
+
+void QDesignerToolBar::findFormWindow()
+{
+ QWidget *w = this;
+ while ( w ) {
+ formWindow = ::qt_cast<FormWindow*>(w);
+ if ( formWindow )
+ break;
+ w = w->parentWidget();
+ }
+}
+
+void QDesignerToolBar::addAction( QAction *a )
+{
+ actionList.append( a );
+ connect( a, SIGNAL( destroyed() ), this, SLOT( actionRemoved() ) );
+ if ( ::qt_cast<QActionGroup*>(a) ) {
+ ( (QDesignerActionGroup*)a )->widget()->installEventFilter( this );
+ actionMap.insert( ( (QDesignerActionGroup*)a )->widget(), a );
+ } else if ( ::qt_cast<QSeparatorAction*>(a) ) {
+ ( (QSeparatorAction*)a )->widget()->installEventFilter( this );
+ actionMap.insert( ( (QSeparatorAction*)a )->widget(), a );
+ } else {
+ ( (QDesignerAction*)a )->widget()->installEventFilter( this );
+ actionMap.insert( ( (QDesignerAction*)a )->widget(), a );
+ }
+}
+
+static void fixObject( QObject *&o )
+{
+ while ( o && o->parent() && !::qt_cast<QDesignerToolBar*>(o->parent()) )
+ o = o->parent();
+}
+
+bool QDesignerToolBar::eventFilter( QObject *o, QEvent *e )
+{
+ if ( !o || !e || o->inherits( "QDockWindowHandle" ) || o->inherits( "QDockWindowTitleBar" ) )
+ return QToolBar::eventFilter( o, e );
+
+ if ( o == this && e->type() == QEvent::MouseButtonPress &&
+ ( ( QMouseEvent*)e )->button() == LeftButton ) {
+ mousePressEvent( (QMouseEvent*)e );
+ return TRUE;
+ }
+
+ if ( o == this )
+ return QToolBar::eventFilter( o, e );
+
+ if ( e->type() == QEvent::MouseButtonPress ) {
+ QMouseEvent *ke = (QMouseEvent*)e;
+ fixObject( o );
+ if ( !o )
+ return FALSE;
+ buttonMousePressEvent( ke, o );
+ return TRUE;
+ } else if(e->type() == QEvent::ContextMenu ) {
+ QContextMenuEvent *ce = (QContextMenuEvent*)e;
+ fixObject( o );
+ if( !o )
+ return FALSE;
+ buttonContextMenuEvent( ce, o );
+ return TRUE;
+ } else if ( e->type() == QEvent::MouseMove ) {
+ QMouseEvent *ke = (QMouseEvent*)e;
+ fixObject( o );
+ if ( !o )
+ return FALSE;
+ buttonMouseMoveEvent( ke, o );
+ return TRUE;
+ } else if ( e->type() == QEvent::MouseButtonRelease ) {
+ QMouseEvent *ke = (QMouseEvent*)e;
+ fixObject( o );
+ if ( !o )
+ return FALSE;
+ buttonMouseReleaseEvent( ke, o );
+ return TRUE;
+ } else if ( e->type() == QEvent::DragEnter ) {
+ QDragEnterEvent *de = (QDragEnterEvent*)e;
+ if (ActionDrag::canDecode(de))
+ de->accept();
+ } else if ( e->type() == QEvent::DragMove ) {
+ QDragMoveEvent *de = (QDragMoveEvent*)e;
+ if (ActionDrag::canDecode(de))
+ de->accept();
+ }
+
+ return QToolBar::eventFilter( o, e );
+}
+
+void QDesignerToolBar::paintEvent( QPaintEvent *e )
+{
+ QToolBar::paintEvent( e );
+ if ( e->rect() != rect() )
+ return;
+ lastIndicatorPos = QPoint( -1, -1 );
+}
+
+void QDesignerToolBar::contextMenuEvent( QContextMenuEvent *e )
+{
+ e->accept();
+ QPopupMenu menu( 0 );
+ menu.insertItem( tr( "Delete Toolbar" ), 1 );
+ int res = menu.exec( e->globalPos() );
+ if ( res != -1 ) {
+ RemoveToolBarCommand *cmd = new RemoveToolBarCommand( tr( "Delete Toolbar '%1'" ).arg( name() ),
+ formWindow, 0, this );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+}
+
+void QDesignerToolBar::mousePressEvent( QMouseEvent *e )
+{
+ widgetInserting = FALSE;
+ if ( e->button() == LeftButton &&
+ MainWindow::self->currentTool() != POINTER_TOOL &&
+ MainWindow::self->currentTool() != ORDER_TOOL &&
+ MainWindow::self->currentTool() != CONNECT_TOOL &&
+ MainWindow::self->currentTool() != BUDDY_TOOL )
+ widgetInserting = TRUE;
+}
+
+void QDesignerToolBar::mouseReleaseEvent( QMouseEvent *e )
+{
+ if ( widgetInserting )
+ doInsertWidget( mapFromGlobal( e->globalPos() ) );
+ widgetInserting = FALSE;
+}
+
+void QDesignerToolBar::buttonMouseReleaseEvent( QMouseEvent *e, QObject *w )
+{
+ if ( widgetInserting )
+ doInsertWidget( mapFromGlobal( e->globalPos() ) );
+ else if ( w->isWidgetType() && formWindow->widgets()->find( w ) ) {
+ formWindow->clearSelection( FALSE );
+ formWindow->selectWidget( w );
+ }
+ widgetInserting = FALSE;
+}
+
+void QDesignerToolBar::buttonContextMenuEvent( QContextMenuEvent *e, QObject *o )
+{
+ e->accept();
+ QPopupMenu menu( 0 );
+ const int ID_DELETE = 1;
+ const int ID_SEP = 2;
+ const int ID_DELTOOLBAR = 3;
+ QMap<QWidget*, QAction*>::Iterator it = actionMap.find( (QWidget*)o );
+ if ( it != actionMap.end() && ::qt_cast<QSeparatorAction*>(*it) )
+ menu.insertItem( tr( "Delete Separator" ), ID_DELETE );
+ else
+ menu.insertItem( tr( "Delete Item" ), ID_DELETE );
+ menu.insertItem( tr( "Insert Separator" ), ID_SEP );
+ menu.insertSeparator();
+ menu.insertItem( tr( "Delete Toolbar" ), ID_DELTOOLBAR );
+ int res = menu.exec( e->globalPos() );
+ if ( res == ID_DELETE ) {
+ QMap<QWidget*, QAction*>::Iterator it = actionMap.find( (QWidget*)o );
+ if ( it == actionMap.end() )
+ return;
+ QAction *a = *it;
+ int index = actionList.find( a );
+ RemoveActionFromToolBarCommand *cmd = new RemoveActionFromToolBarCommand(
+ tr( "Delete Action '%1' from Toolbar '%2'" ).
+ arg( a->name() ).arg( caption() ),
+ formWindow, a, this, index );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ } else if ( res == ID_SEP ) {
+ calcIndicatorPos( mapFromGlobal( e->globalPos() ) );
+ QAction *a = new QSeparatorAction( 0 );
+ int index = actionList.findRef( *actionMap.find( insertAnchor ) );
+ if ( index != -1 && afterAnchor )
+ ++index;
+ if ( !insertAnchor )
+ index = 0;
+
+ AddActionToToolBarCommand *cmd = new AddActionToToolBarCommand(
+ tr( "Add Separator to Toolbar '%1'" ).
+ arg( a->name() ),
+ formWindow, a, this, index );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ } else if ( res == ID_DELTOOLBAR ) {
+ RemoveToolBarCommand *cmd = new RemoveToolBarCommand( tr( "Delete Toolbar '%1'" ).arg( name() ),
+ formWindow, 0, this );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+}
+
+void QDesignerToolBar::buttonMousePressEvent( QMouseEvent *e, QObject * )
+{
+ widgetInserting = FALSE;
+
+ if ( e->button() == MidButton )
+ return;
+
+ if ( e->button() == LeftButton &&
+ MainWindow::self->currentTool() != POINTER_TOOL &&
+ MainWindow::self->currentTool() != ORDER_TOOL &&
+ MainWindow::self->currentTool() != CONNECT_TOOL &&
+ MainWindow::self->currentTool() != BUDDY_TOOL ) {
+ widgetInserting = TRUE;
+ return;
+ }
+
+ dragStartPos = e->pos();
+}
+
+void QDesignerToolBar::removeWidget( QWidget *w )
+{
+ QMap<QWidget*, QAction*>::Iterator it = actionMap.find( w );
+ if ( it == actionMap.end() )
+ return;
+ QAction *a = *it;
+ int index = actionList.find( a );
+ RemoveActionFromToolBarCommand *cmd =
+ new RemoveActionFromToolBarCommand( tr( "Delete Action '%1' from Toolbar '%2'" ).
+ arg( a->name() ).arg( caption() ),
+ formWindow, a, this, index );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ QApplication::sendPostedEvents();
+ adjustSize();
+}
+
+void QDesignerToolBar::buttonMouseMoveEvent( QMouseEvent *e, QObject *o )
+{
+ if ( widgetInserting || ( e->state() & LeftButton ) == 0 )
+ return;
+ if ( QABS( QPoint( dragStartPos - e->pos() ).manhattanLength() ) < QApplication::startDragDistance() )
+ return;
+ QMap<QWidget*, QAction*>::Iterator it = actionMap.find( (QWidget*)o );
+ if ( it == actionMap.end() )
+ return;
+ QAction *a = *it;
+ if ( !a )
+ return;
+ int index = actionList.find( a );
+ RemoveActionFromToolBarCommand *cmd =
+ new RemoveActionFromToolBarCommand( tr( "Delete Action '%1' from Toolbar '%2'" ).
+ arg( a->name() ).arg( caption() ),
+ formWindow, a, this, index );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ QApplication::sendPostedEvents();
+ adjustSize();
+
+ QString type = ::qt_cast<QActionGroup*>(a) ? QString( "application/x-designer-actiongroup" ) :
+ ::qt_cast<QSeparatorAction*>(a) ? QString( "application/x-designer-separator" ) : QString( "application/x-designer-actions" );
+ QStoredDrag *drag = new ActionDrag( type, a, this );
+ drag->setPixmap( a->iconSet().pixmap() );
+ if ( ::qt_cast<QDesignerAction*>(a) ) {
+ if ( formWindow->widgets()->find( ( (QDesignerAction*)a )->widget() ) )
+ formWindow->selectWidget( ( (QDesignerAction*)a )->widget(), FALSE );
+ }
+ if ( !drag->drag() ) {
+ AddActionToToolBarCommand *cmd = new AddActionToToolBarCommand( tr( "Add Action '%1' to Toolbar '%2'" ).
+ arg( a->name() ).arg( caption() ),
+ formWindow, a, this, index );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+ lastIndicatorPos = QPoint( -1, -1 );
+ indicator->hide();
+}
+
+#ifndef QT_NO_DRAGANDDROP
+
+void QDesignerToolBar::dragEnterEvent( QDragEnterEvent *e )
+{
+ widgetInserting = FALSE;
+ lastIndicatorPos = QPoint( -1, -1 );
+ if (ActionDrag::canDecode(e))
+ e->accept();
+}
+
+void QDesignerToolBar::dragMoveEvent( QDragMoveEvent *e )
+{
+ if (ActionDrag::canDecode(e)) {
+ e->accept();
+ drawIndicator( calcIndicatorPos( e->pos() ) );
+ }
+}
+
+void QDesignerToolBar::dragLeaveEvent( QDragLeaveEvent * )
+{
+ indicator->hide();
+ insertAnchor = 0;
+ afterAnchor = TRUE;
+}
+
+void QDesignerToolBar::dropEvent( QDropEvent *e )
+{
+ if (!ActionDrag::canDecode(e))
+ return;
+
+ e->accept();
+
+ indicator->hide();
+ QAction *a = 0;
+ int index = actionList.findRef( *actionMap.find( insertAnchor ) );
+ if ( index != -1 && afterAnchor )
+ ++index;
+ if ( !insertAnchor )
+ index = 0;
+ if ( e->provides( "application/x-designer-actions" ) ||
+ e->provides( "application/x-designer-separator" ) ) {
+ if ( e->provides( "application/x-designer-actions" ) )
+ a = ::qt_cast<QDesignerAction*>(ActionDrag::action());
+ else
+ a = ::qt_cast<QSeparatorAction*>(ActionDrag::action());
+ } else {
+ a = ::qt_cast<QDesignerActionGroup*>(ActionDrag::action());
+ }
+
+ if ( actionList.findRef( a ) != -1 ) {
+ QMessageBox::warning( MainWindow::self, tr( "Insert/Move Action" ),
+ tr( "Action '%1' has already been added to this toolbar.\n"
+ "An Action may only occur once in a given toolbar." ).
+ arg( a->name() ) );
+ return;
+ }
+
+ AddActionToToolBarCommand *cmd = new AddActionToToolBarCommand( tr( "Add Action '%1' to Toolbar '%2'" ).
+ arg( a->name() ).arg( caption() ),
+ formWindow, a, this, index );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+
+ lastIndicatorPos = QPoint( -1, -1 );
+}
+
+#endif
+
+void QDesignerToolBar::reInsert()
+{
+ QAction *a = 0;
+ actionMap.clear();
+ clear();
+ for ( a = actionList.first(); a; a = actionList.next() ) {
+ a->addTo( this );
+ if ( ::qt_cast<QActionGroup*>(a) ) {
+ actionMap.insert( ( (QDesignerActionGroup*)a )->widget(), a );
+ if ( ( (QDesignerActionGroup*)a )->widget() )
+ ( (QDesignerActionGroup*)a )->widget()->installEventFilter( this );
+ } else if ( ::qt_cast<QDesignerAction*>(a) ) {
+ actionMap.insert( ( (QDesignerAction*)a )->widget(), a );
+ ( (QDesignerAction*)a )->widget()->installEventFilter( this );
+ } else if ( ::qt_cast<QSeparatorAction*>(a) ) {
+ actionMap.insert( ( (QSeparatorAction*)a )->widget(), a );
+ ( (QSeparatorAction*)a )->widget()->installEventFilter( this );
+ }
+ }
+ QApplication::sendPostedEvents();
+ adjustSize();
+}
+
+void QDesignerToolBar::actionRemoved()
+{
+ actionList.removeRef( (QAction*)sender() );
+}
+
+QPoint QDesignerToolBar::calcIndicatorPos( const QPoint &pos )
+{
+ if ( orientation() == Horizontal ) {
+ QPoint pnt( width() - 2, 0 );
+ insertAnchor = 0;
+ afterAnchor = TRUE;
+ if ( !children() )
+ return pnt;
+ pnt = QPoint( 13, 0 );
+ QObjectListIt it( *children() );
+ QObject * obj;
+ while( (obj=it.current()) != 0 ) {
+ ++it;
+ if ( obj->isWidgetType() &&
+ qstrcmp( "qt_dockwidget_internal", obj->name() ) != 0 ) {
+ QWidget *w = (QWidget*)obj;
+ if ( w->x() < pos.x() ) {
+ pnt.setX( w->x() + w->width() + 1 );
+ insertAnchor = w;
+ afterAnchor = TRUE;
+ }
+ }
+ }
+ return pnt;
+ } else {
+ QPoint pnt( 0, height() - 2 );
+ insertAnchor = 0;
+ afterAnchor = TRUE;
+ if ( !children() )
+ return pnt;
+ pnt = QPoint( 0, 13 );
+ QObjectListIt it( *children() );
+ QObject * obj;
+ while( (obj=it.current()) != 0 ) {
+ ++it;
+ if ( obj->isWidgetType() &&
+ qstrcmp( "qt_dockwidget_internal", obj->name() ) != 0 ) {
+ QWidget *w = (QWidget*)obj;
+ if ( w->y() < pos.y() ) {
+ pnt.setY( w->y() + w->height() + 1 );
+ insertAnchor = w;
+ afterAnchor = TRUE;
+ }
+ }
+ }
+ return pnt;
+ }
+}
+
+void QDesignerToolBar::drawIndicator( const QPoint &pos )
+{
+ if ( lastIndicatorPos == pos )
+ return;
+ bool wasVsisible = indicator->isVisible();
+ if ( orientation() == Horizontal ) {
+ indicator->resize( 3, height() );
+ if ( pos != QPoint( -1, -1 ) )
+ indicator->move( pos.x() - 1, 0 );
+ indicator->show();
+ indicator->raise();
+ lastIndicatorPos = pos;
+ } else {
+ indicator->resize( width(), 3 );
+ if ( pos != QPoint( -1, -1 ) )
+ indicator->move( 0, pos.y() - 1 );
+ indicator->show();
+ indicator->raise();
+ lastIndicatorPos = pos;
+ }
+ if ( !wasVsisible )
+ QApplication::sendPostedEvents();
+}
+
+void QDesignerToolBar::doInsertWidget( const QPoint &p )
+{
+ if ( formWindow != MainWindow::self->formWindow() )
+ return;
+ calcIndicatorPos( p );
+ QWidget *w = WidgetFactory::create( MainWindow::self->currentTool(), this, 0, TRUE );
+ installEventFilters( w );
+ MainWindow::self->formWindow()->insertWidget( w, TRUE );
+ QDesignerAction *a = new QDesignerAction( w, parent() );
+ int index = actionList.findRef( *actionMap.find( insertAnchor ) );
+ if ( index != -1 && afterAnchor )
+ ++index;
+ if ( !insertAnchor )
+ index = 0;
+ AddActionToToolBarCommand *cmd = new AddActionToToolBarCommand( tr( "Add Widget '%1' to Toolbar '%2'" ).
+ arg( w->name() ).arg( caption() ),
+ formWindow, a, this, index );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ MainWindow::self->resetTool();
+}
+
+void QDesignerToolBar::clear()
+{
+ for ( QAction *a = actionList.first(); a; a = actionList.next() ) {
+ if ( ::qt_cast<QDesignerAction*>(a) )
+ ( (QDesignerAction*)a )->remove();
+ }
+ QToolBar::clear();
+}
+
+void QDesignerToolBar::installEventFilters( QWidget *w )
+{
+ if ( !w )
+ return;
+ QObjectList *l = w->queryList( "QWidget" );
+ for ( QObject *o = l->first(); o; o = l->next() )
+ o->installEventFilter( this );
+ delete l;
+}
+
+#include "actiondnd.moc"
diff --git a/tools/designer/designer/actiondnd.h b/tools/designer/designer/actiondnd.h
new file mode 100644
index 0000000..5c3d16b
--- /dev/null
+++ b/tools/designer/designer/actiondnd.h
@@ -0,0 +1,242 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef ACTIONDND_H
+#define ACTIONDND_H
+
+#include <qaction.h>
+#include <qdragobject.h>
+#include <qmap.h>
+#include <qmenubar.h>
+#include <qpixmap.h>
+#include <qpopupmenu.h>
+#include <qptrlist.h>
+#include <qtoolbar.h>
+#include <qguardedptr.h>
+#include "../shared/widgetdatabase.h"
+
+//class QDesignerPopupMenu;
+class QDesignerIndicatorWidget;
+class FormWindow;
+class QPopupMenu;
+
+class ActionDrag : public QStoredDrag
+{
+ Q_OBJECT
+
+public:
+ ActionDrag(const QString &type, QAction *action, QWidget *source);
+ ActionDrag(QAction *action, QWidget *source);
+ ActionDrag(QActionGroup *group, QWidget *source);
+
+ ~ActionDrag();
+
+ static bool canDecode(QDropEvent *e);
+
+ static QAction *action()
+ {
+ return the_action;
+ }
+
+private:
+ static QAction *the_action;
+};
+
+class QDesignerActionGroup : public QActionGroup
+{
+ Q_OBJECT
+
+public:
+ QDesignerActionGroup( QObject *parent )
+ : QActionGroup( ::qt_cast<QActionGroup*>(parent) ? parent : 0 ), wid( 0 ), idx( -1 ) { init(); }
+
+ void init();
+
+ QWidget *widget() const { return wid; }
+ QWidget *widget( QAction *a ) const { return *widgets.find( a ); }
+ int index() const { return idx; }
+
+protected:
+#if !defined(Q_NO_USING_KEYWORD)
+ using QActionGroup::addedTo;
+#endif
+ void addedTo( QWidget *w, QWidget * ) {
+ wid = w;
+ }
+ void addedTo( QWidget *w, QWidget *, QAction *a ) {
+ widgets.insert( a, w );
+ }
+ void addedTo( int index, QPopupMenu * ) {
+ idx = index;
+ }
+
+private:
+ QWidget *wid;
+ QMap<QAction *, QWidget *> widgets;
+ int idx;
+
+};
+
+class QDesignerAction : public QAction
+{
+ Q_OBJECT
+
+public:
+ QDesignerAction( QObject *parent )
+ : QAction( ::qt_cast<QActionGroup*>(parent) ? parent : 0 ), wid( 0 ), idx( -1 ), widgetToInsert( 0 ) { init(); }
+ QDesignerAction( QWidget *w, QObject *parent )
+ : QAction( ::qt_cast<QActionGroup*>(parent) ? parent : 0 ), wid( 0 ), idx( -1 ), widgetToInsert( w ) { init(); }
+
+ void init();
+
+ QWidget *widget() const { return wid; }
+ int index() const { return idx; }
+
+ bool addTo( QWidget *w );
+ bool removeFrom( QWidget *w );
+
+ void remove();
+ bool supportsMenu() const { return !widgetToInsert; }
+
+protected:
+ void addedTo( QWidget *w, QWidget * ) {
+ wid = w;
+ }
+ void addedTo( int index, QPopupMenu * ) {
+ idx = index;
+ }
+
+private:
+ QWidget *wid;
+ int idx;
+ QWidget *widgetToInsert;
+
+};
+
+class QDesignerToolBarSeparator : public QWidget
+{
+ Q_OBJECT
+
+public:
+ QDesignerToolBarSeparator( Orientation, QToolBar *parent, const char* name=0 );
+
+ QSize sizeHint() const;
+ Orientation orientation() const { return orient; }
+public slots:
+ void setOrientation( Orientation );
+protected:
+ void styleChange( QStyle& );
+ void paintEvent( QPaintEvent * );
+private:
+ Orientation orient;
+};
+
+
+class QSeparatorAction : public QAction
+{
+ Q_OBJECT
+
+public:
+ QSeparatorAction( QObject *parent );
+
+ bool addTo( QWidget *w );
+ bool removeFrom( QWidget *w );
+ QWidget *widget() const;
+ int index() const;
+
+private:
+ QWidget *wid;
+ int idx;
+
+};
+
+
+class QDesignerToolBar : public QToolBar
+{
+ Q_OBJECT
+
+public:
+ QDesignerToolBar( QMainWindow *mw );
+ QDesignerToolBar( QMainWindow *mw, Dock dock );
+ QPtrList<QAction> insertedActions() const { return actionList; }
+ void addAction( QAction *a );
+
+ void clear();
+ void installEventFilters( QWidget *w );
+ void insertAction( QWidget *w, QAction *a ) { actionMap.insert( w, a ); }
+ void insertAction( int index, QAction *a ) { actionList.insert( index, a ); }
+ void appendAction( QAction *a ) { actionList.append( a ); }
+ void removeAction( QAction *a ) { actionList.remove( a ); }
+ void reInsert();
+ void removeWidget( QWidget *w );
+
+protected:
+ bool eventFilter( QObject *, QEvent * );
+ void paintEvent( QPaintEvent * );
+#ifndef QT_NO_DRAGANDDROP
+ void dragEnterEvent( QDragEnterEvent * );
+ void dragMoveEvent( QDragMoveEvent * );
+ void dragLeaveEvent( QDragLeaveEvent * );
+ void dropEvent( QDropEvent * );
+#endif
+ void contextMenuEvent( QContextMenuEvent *e );
+ void mousePressEvent( QMouseEvent *e );
+ void mouseReleaseEvent( QMouseEvent *e );
+
+private slots:
+ void actionRemoved();
+
+private:
+ void drawIndicator( const QPoint &pos );
+ QPoint calcIndicatorPos( const QPoint &pos );
+ void buttonContextMenuEvent( QContextMenuEvent *e, QObject *o );
+ void buttonMousePressEvent( QMouseEvent *e, QObject *o );
+ void buttonMouseMoveEvent( QMouseEvent *e, QObject *o );
+ void buttonMouseReleaseEvent( QMouseEvent *e, QObject *o );
+ void doInsertWidget( const QPoint &p );
+ void findFormWindow();
+
+private:
+ QPoint lastIndicatorPos;
+ QWidget *insertAnchor;
+ bool afterAnchor;
+ QPtrList<QAction> actionList;
+ QMap<QWidget*, QAction*> actionMap;
+ QPoint dragStartPos;
+ QDesignerIndicatorWidget *indicator;
+ bool widgetInserting;
+ FormWindow *formWindow;
+
+};
+
+#endif
diff --git a/tools/designer/designer/actioneditor.ui b/tools/designer/designer/actioneditor.ui
new file mode 100644
index 0000000..97efa6a
--- /dev/null
+++ b/tools/designer/designer/actioneditor.ui
@@ -0,0 +1,230 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ActionEditorBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ActionEditorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>206</width>
+ <height>227</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Actions</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>4</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>buttonNewAction</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_filenew.png</pixmap>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Create new Action</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>buttonDeleteAction</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_editcut.png</pixmap>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete current Action</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>buttonConnect</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_connecttool.png</pixmap>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Connect current Action</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="ActionListView">
+ <property name="name">
+ <cstring>listActions</cstring>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>ActionListView</class>
+ <header location="local">actionlistview.h</header>
+ <sizehint>
+ <width>200</width>
+ <height>200</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>7</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>selectionChanged( QListViewItem * )</signal>
+ <signal>currentChanged( QListViewItem * )</signal>
+ <signal>clicked( QListViewItem * )</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>listActions</sender>
+ <signal>currentChanged( QListViewItem * )</signal>
+ <receiver>ActionEditorBase</receiver>
+ <slot>currentActionChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>listActions</sender>
+ <signal>clicked( QListViewItem * )</signal>
+ <receiver>ActionEditorBase</receiver>
+ <slot>currentActionChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>listActions</sender>
+ <signal>selectionChanged( QListViewItem * )</signal>
+ <receiver>ActionEditorBase</receiver>
+ <slot>currentActionChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>buttonNewAction</sender>
+ <signal>clicked()</signal>
+ <receiver>ActionEditorBase</receiver>
+ <slot>newAction()</slot>
+ </connection>
+ <connection>
+ <sender>buttonConnect</sender>
+ <signal>clicked()</signal>
+ <receiver>ActionEditorBase</receiver>
+ <slot>connectionsClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonDeleteAction</sender>
+ <signal>clicked()</signal>
+ <receiver>ActionEditorBase</receiver>
+ <slot>deleteAction()</slot>
+ </connection>
+</connections>
+<forwards>
+ <forward>class QListViewItem;</forward>
+</forwards>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot access="protected">connectionsClicked()</slot>
+ <slot access="protected">currentActionChanged( QListViewItem * )</slot>
+ <slot access="protected">deleteAction()</slot>
+ <slot access="protected">newAction()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/actioneditorimpl.cpp b/tools/designer/designer/actioneditorimpl.cpp
new file mode 100644
index 0000000..fc2dff4
--- /dev/null
+++ b/tools/designer/designer/actioneditorimpl.cpp
@@ -0,0 +1,325 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "actioneditorimpl.h"
+#include "formwindow.h"
+#include "metadatabase.h"
+#include "actionlistview.h"
+#include "connectiondialog.h"
+#include "mainwindow.h"
+#include "hierarchyview.h"
+#include "formfile.h"
+
+#include <qaction.h>
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qtoolbutton.h>
+#include <qlistview.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <qpopupmenu.h>
+#include <qobjectlist.h>
+
+ActionEditor::ActionEditor( QWidget* parent, const char* name, WFlags fl )
+ : ActionEditorBase( parent, name, fl ), currentAction( 0 ), formWindow( 0 ),
+ explicitlyClosed(false)
+{
+ listActions->addColumn( tr( "Actions" ) );
+ setEnabled( FALSE );
+ buttonConnect->setEnabled( FALSE );
+
+ QPopupMenu *popup = new QPopupMenu( this );
+ popup->insertItem( tr( "New &Action" ), this, SLOT( newAction() ) );
+ popup->insertItem( tr( "New Action &Group" ), this, SLOT( newActionGroup() ) );
+ popup->insertItem( tr( "New &Dropdown Action Group" ), this, SLOT( newDropDownActionGroup() ) );
+ buttonNewAction->setPopup( popup );
+ buttonNewAction->setPopupDelay( 0 );
+
+ connect( listActions, SIGNAL( insertAction() ), this, SLOT( newAction() ) );
+ connect( listActions, SIGNAL( insertActionGroup() ), this, SLOT( newActionGroup() ) );
+ connect( listActions, SIGNAL( insertDropDownActionGroup() ), this, SLOT( newDropDownActionGroup() ) );
+ connect( listActions, SIGNAL( deleteAction() ), this, SLOT( deleteAction() ) );
+ connect( listActions, SIGNAL( connectAction() ), this, SLOT( connectionsClicked() ) );
+}
+
+void ActionEditor::closeEvent( QCloseEvent *e )
+{
+ emit hidden();
+ e->accept();
+}
+
+void ActionEditor::currentActionChanged( QListViewItem *i )
+{
+ buttonConnect->setEnabled( i != 0 );
+ if ( !i )
+ return;
+ currentAction = ( (ActionItem*)i )->action();
+ if ( !currentAction )
+ currentAction = ( (ActionItem*)i )->actionGroup();
+ if ( formWindow && currentAction )
+ formWindow->setActiveObject( currentAction );
+ MainWindow::self->objectHierarchy()->hierarchyList()->setCurrent( currentAction );
+}
+
+void ActionEditor::setCurrentAction( QAction *a )
+{
+ QListViewItemIterator it( listActions );
+ while ( it.current() ) {
+ if ( ( (ActionItem*)it.current() )->action() == a || ( (ActionItem*)it.current() )->actionGroup() == a ) {
+ listActions->setCurrentItem( it.current() );
+ listActions->ensureItemVisible( it.current() );
+ break;
+ }
+ ++it;
+ }
+}
+
+QAction *ActionEditor::newActionEx()
+{
+ ActionItem *i = new ActionItem( listActions, (bool)FALSE );
+ QAction *a = i->action();
+ QObject::connect( a, SIGNAL( destroyed( QObject * ) ),
+ this, SLOT( removeConnections( QObject* ) ) );
+ MetaDataBase::addEntry( i->action() );
+ QString n = "Action";
+ formWindow->unify( i->action(), n, TRUE );
+ i->setText( 0, n );
+ i->action()->setName( n );
+ i->action()->setText( i->action()->name() );
+ MetaDataBase::setPropertyChanged( i->action(), "text", TRUE );
+ MetaDataBase::setPropertyChanged( i->action(), "name", TRUE );
+ formWindow->actionList().append( i->action() );
+ if ( formWindow->formFile() )
+ formWindow->formFile()->setModified( TRUE );
+ return i->action();
+}
+
+void ActionEditor::deleteAction()
+{
+ if ( !currentAction )
+ return;
+
+ QListViewItemIterator it( listActions );
+ ActionItem *ai = 0;
+ while ( it.current() ) {
+ ai = (ActionItem*)it.current();
+ if ( ai->action() == currentAction || ai->actionGroup() == currentAction ) {
+ emit removing( currentAction );
+ formWindow->actionList().removeRef( currentAction );
+ delete currentAction;
+ currentAction = 0;
+ delete it.current();
+ break;
+ }
+ ++it;
+ }
+ if ( formWindow ) {
+ formWindow->setActiveObject( formWindow->mainContainer() );
+ if ( formWindow->formFile() )
+ formWindow->formFile()->setModified( TRUE );
+ }
+}
+
+void ActionEditor::newAction()
+{
+ ActionItem *actionParent = (ActionItem*)listActions->selectedItem();
+ if ( actionParent ) {
+ if ( !::qt_cast<QActionGroup*>(actionParent->actionGroup()) )
+ actionParent = (ActionItem*)actionParent->parent();
+ }
+
+ ActionItem *i = 0;
+ if ( actionParent )
+ i = new ActionItem( actionParent );
+ else
+ i = new ActionItem( listActions, (bool)FALSE );
+ QAction *a = i->action();
+ QObject::connect( a, SIGNAL( destroyed( QObject * ) ),
+ this, SLOT( removeConnections( QObject* ) ) );
+ MetaDataBase::addEntry( i->action() );
+ QString n = "Action";
+ formWindow->unify( i->action(), n, TRUE );
+ i->setText( 0, n );
+ i->action()->setName( n );
+ i->action()->setText( i->action()->name() );
+ if ( actionParent && actionParent->actionGroup() &&
+ actionParent->actionGroup()->usesDropDown() ) {
+ i->action()->setToggleAction( TRUE );
+ MetaDataBase::setPropertyChanged( i->action(), "toggleAction", TRUE );
+ }
+ MetaDataBase::setPropertyChanged( i->action(), "text", TRUE );
+ MetaDataBase::setPropertyChanged( i->action(), "name", TRUE );
+ listActions->setCurrentItem( i );
+ if ( !actionParent )
+ formWindow->actionList().append( i->action() );
+ if ( formWindow->formFile() )
+ formWindow->formFile()->setModified( TRUE );
+}
+
+void ActionEditor::newActionGroup()
+{
+ ActionItem *actionParent = (ActionItem*)listActions->selectedItem();
+ if ( actionParent ) {
+ if ( !::qt_cast<QActionGroup*>(actionParent->actionGroup()) )
+ actionParent = (ActionItem*)actionParent->parent();
+ }
+
+ ActionItem *i = 0;
+ if ( actionParent )
+ i = new ActionItem( actionParent, TRUE );
+ else
+ i = new ActionItem( listActions, TRUE );
+ QAction *ag = i->actionGroup();
+ QObject::connect( ag, SIGNAL( destroyed( QObject * ) ),
+ this, SLOT( removeConnections( QObject* ) ) );
+ MetaDataBase::addEntry( i->actionGroup() );
+ MetaDataBase::setPropertyChanged( i->actionGroup(), "usesDropDown", TRUE );
+ QString n = "ActionGroup";
+ formWindow->unify( i->action(), n, TRUE );
+ i->setText( 0, n );
+ i->actionGroup()->setName( n );
+ i->actionGroup()->setText( i->actionGroup()->name() );
+ MetaDataBase::setPropertyChanged( i->actionGroup(), "text", TRUE );
+ MetaDataBase::setPropertyChanged( i->actionGroup(), "name", TRUE );
+ listActions->setCurrentItem( i );
+ i->setOpen( TRUE );
+ if ( !actionParent )
+ formWindow->actionList().append( i->actionGroup() );
+ if ( formWindow->formFile() )
+ formWindow->formFile()->setModified( TRUE );
+}
+
+void ActionEditor::newDropDownActionGroup()
+{
+ newActionGroup();
+ ( (ActionItem*)listActions->currentItem() )->actionGroup()->setUsesDropDown( TRUE );
+}
+
+void ActionEditor::setFormWindow( FormWindow *fw )
+{
+ listActions->clear();
+ formWindow = fw;
+ if ( !formWindow ||
+ !::qt_cast<QMainWindow*>(formWindow->mainContainer()) ) {
+ setEnabled( FALSE );
+ } else {
+ setEnabled( TRUE );
+ for ( QAction *a = formWindow->actionList().first(); a; a = formWindow->actionList().next() ) {
+ ActionItem *i = 0;
+ if ( ::qt_cast<QAction*>(a->parent()) )
+ continue;
+ i = new ActionItem( listActions, a );
+ i->setText( 0, a->name() );
+ i->setPixmap( 0, a->iconSet().pixmap() );
+ // make sure we don't duplicate the connection
+ QObject::disconnect( a, SIGNAL( destroyed( QObject * ) ),
+ this, SLOT( removeConnections( QObject * ) ) );
+ QObject::connect( a, SIGNAL( destroyed( QObject * ) ),
+ this, SLOT( removeConnections( QObject* ) ) );
+ if ( ::qt_cast<QActionGroup*>(a) ) {
+ insertChildActions( i );
+ }
+ }
+ if ( listActions->firstChild() ) {
+ listActions->setCurrentItem( listActions->firstChild() );
+ listActions->setSelected( listActions->firstChild(), TRUE );
+ }
+ }
+}
+
+void ActionEditor::insertChildActions( ActionItem *i )
+{
+ if ( !i->actionGroup() || !i->actionGroup()->children() )
+ return;
+ QObjectListIt it( *i->actionGroup()->children() );
+ while ( it.current() ) {
+ QObject *o = it.current();
+ ++it;
+ if ( !::qt_cast<QAction*>(o) )
+ continue;
+ QAction *a = (QAction*)o;
+ ActionItem *i2 = new ActionItem( (QListViewItem*)i, a );
+ i->setOpen( TRUE );
+ i2->setText( 0, a->name() );
+ i2->setPixmap( 0, a->iconSet().pixmap() );
+ // make sure we don't duplicate the connection
+ QObject::disconnect( o, SIGNAL( destroyed( QObject * ) ),
+ this, SLOT( removeConnections( QObject * ) ) );
+ QObject::connect( o, SIGNAL( destroyed( QObject * ) ),
+ this, SLOT( removeConnections( QObject * ) ) );
+ if ( ::qt_cast<QActionGroup*>(a) )
+ insertChildActions( i2 );
+ }
+}
+
+void ActionEditor::updateActionName( QAction *a )
+{
+ QListViewItemIterator it( listActions );
+ while ( it.current() ) {
+ if ( ( (ActionItem*)it.current() )->action() == a )
+ ( (ActionItem*)it.current() )->setText( 0, a->name() );
+ else if ( ( (ActionItem*)it.current() )->actionGroup() == a )
+ ( (ActionItem*)it.current() )->setText( 0, a->name() );
+ ++it;
+ }
+}
+
+void ActionEditor::updateActionIcon( QAction *a )
+{
+ QListViewItemIterator it( listActions );
+ while ( it.current() ) {
+ if ( ( (ActionItem*)it.current() )->action() == a )
+ ( (ActionItem*)it.current() )->setPixmap( 0, a->iconSet().pixmap() );
+ else if ( ( (ActionItem*)it.current() )->actionGroup() == a )
+ ( (ActionItem*)it.current() )->setPixmap( 0, a->iconSet().pixmap() );
+ ++it;
+ }
+}
+
+void ActionEditor::connectionsClicked()
+{
+ ConnectionDialog dlg( formWindow->mainWindow() );
+ dlg.setDefault( currentAction, formWindow );
+ dlg.addConnection();
+ dlg.exec();
+}
+
+void ActionEditor::removeConnections( QObject *o )
+{
+ QValueList<MetaDataBase::Connection> conns =
+ MetaDataBase::connections( formWindow, o );
+ for ( QValueList<MetaDataBase::Connection>::Iterator it2 = conns.begin();
+ it2 != conns.end(); ++it2 )
+ MetaDataBase::removeConnection( formWindow, (*it2).sender, (*it2).signal,
+ (*it2).receiver, (*it2).slot );
+}
diff --git a/tools/designer/designer/actioneditorimpl.h b/tools/designer/designer/actioneditorimpl.h
new file mode 100644
index 0000000..86beb38
--- /dev/null
+++ b/tools/designer/designer/actioneditorimpl.h
@@ -0,0 +1,86 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef ACTIONEDITORIMPL_H
+#define ACTIONEDITORIMPL_H
+
+#include "actioneditor.h"
+
+class QAction;
+class FormWindow;
+class ActionItem;
+
+class ActionEditor : public ActionEditorBase
+{
+ Q_OBJECT
+
+public:
+ ActionEditor( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ void setFormWindow( FormWindow *fw );
+ void updateActionName( QAction *a );
+ void updateActionIcon( QAction *a );
+ FormWindow *form() const { return formWindow; }
+
+ bool wantToBeShown() const { return !explicitlyClosed; }
+ void setWantToBeShown( bool b ) { explicitlyClosed = !b; }
+
+ void setCurrentAction( QAction *a );
+ QAction *newActionEx();
+
+protected:
+ void closeEvent( QCloseEvent *e );
+
+protected slots:
+ void currentActionChanged( QListViewItem * );
+ void deleteAction();
+ void newAction();
+ void newActionGroup();
+ void newDropDownActionGroup();
+ void connectionsClicked();
+ void removeConnections( QObject *o );
+
+signals:
+ void hidden();
+ void removing( QAction * );
+
+private:
+ void insertChildActions( ActionItem *i );
+
+private:
+ QAction *currentAction;
+ FormWindow *formWindow;
+ bool explicitlyClosed;
+
+};
+
+#endif // ACTIONEDITORIMPL_H
diff --git a/tools/designer/designer/actionlistview.cpp b/tools/designer/designer/actionlistview.cpp
new file mode 100644
index 0000000..7d1a6d9
--- /dev/null
+++ b/tools/designer/designer/actionlistview.cpp
@@ -0,0 +1,115 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "actiondnd.h"
+#include "actionlistview.h"
+#include <qheader.h>
+
+ActionListView::ActionListView( QWidget *parent, const char *name )
+ : QListView( parent, name )
+{
+ setShowSortIndicator( TRUE );
+ setResizeMode( LastColumn );
+ setRootIsDecorated( TRUE );
+ connect( this, SIGNAL( contextMenuRequested( QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( rmbMenu( QListViewItem *, const QPoint & ) ) );
+}
+
+ActionItem::ActionItem( QListView *lv, QAction *ac )
+ : QListViewItem( lv ), a( 0 ), g( 0 )
+{
+ g = ::qt_cast<QDesignerActionGroup*>(ac);
+ if ( !g )
+ a = ::qt_cast<QDesignerAction*>(ac);
+ setDragEnabled( TRUE );
+}
+
+ActionItem::ActionItem( QListViewItem *i, QAction *ac )
+ : QListViewItem( i ), a( 0 ), g( 0 )
+{
+ g = ::qt_cast<QDesignerActionGroup*>(ac);
+ if ( !g )
+ a = ::qt_cast<QDesignerAction*>(ac);
+ setDragEnabled( TRUE );
+ moveToEnd();
+}
+
+void ActionItem::moveToEnd()
+{
+ QListViewItem *i = this;
+ while ( i->nextSibling() )
+ i = i->nextSibling();
+ if ( i != this )
+ moveItem( i );
+}
+
+QDragObject *ActionListView::dragObject()
+{
+ ActionItem *i = (ActionItem*)currentItem();
+ if ( !i )
+ return 0;
+ QStoredDrag *drag = 0;
+ if ( i->action() ) {
+ drag = new ActionDrag( i->action(), viewport() );
+ drag->setPixmap( i->action()->iconSet().pixmap() );
+ } else {
+ drag = new ActionDrag( i->actionGroup(), viewport() );
+ drag->setPixmap( i->actionGroup()->iconSet().pixmap() );
+ }
+ return drag;
+}
+
+void ActionListView::rmbMenu( QListViewItem *i, const QPoint &p )
+{
+ QPopupMenu *popup = new QPopupMenu( this );
+ popup->insertItem( tr( "New &Action" ), 0 );
+ popup->insertItem( tr( "New Action &Group" ), 1 );
+ popup->insertItem( tr( "New &Dropdown Action Group" ), 2 );
+ if ( i ) {
+ popup->insertSeparator();
+ popup->insertItem( tr( "&Connect Action..." ), 3 );
+ popup->insertSeparator();
+ popup->insertItem( tr( "Delete Action" ), 4 );
+ }
+ int res = popup->exec( p );
+ if ( res == 0 )
+ emit insertAction();
+ else if ( res == 1 )
+ emit insertActionGroup();
+ else if ( res == 2 )
+ emit insertDropDownActionGroup();
+ else if ( res == 3 )
+ emit connectAction();
+ else if ( res == 4 )
+ emit deleteAction();
+}
diff --git a/tools/designer/designer/actionlistview.h b/tools/designer/designer/actionlistview.h
new file mode 100644
index 0000000..6a5edaa
--- /dev/null
+++ b/tools/designer/designer/actionlistview.h
@@ -0,0 +1,88 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef ACTIONLISTVIEW_H
+#define ACTIONLISTVIEW_H
+
+#include <qlistview.h>
+#include "actiondnd.h"
+
+class ActionItem : public QListViewItem
+{
+public:
+ ActionItem( QListView *lv, bool group )
+ : QListViewItem( lv ),
+ a( group ? 0 : new QDesignerAction( 0 ) ),
+ g( group ? new QDesignerActionGroup( 0 ) : 0 ) { setDragEnabled( TRUE ); }
+ ActionItem( QListView *lv, QAction *ac );
+ ActionItem( QListViewItem *i, QAction *ac );
+ ActionItem( ActionItem *parent, bool group = FALSE )
+ : QListViewItem( parent ),
+ a( group ? 0 : new QDesignerAction( parent->actionGroup() ) ),
+ g( group ? new QDesignerActionGroup( parent->actionGroup() ) : 0 ) { setDragEnabled( TRUE ); moveToEnd(); }
+
+ QDesignerAction *action() const { return a; }
+ QDesignerActionGroup *actionGroup() const { return g; }
+
+private:
+ void moveToEnd();
+
+private:
+ QDesignerAction *a;
+ QDesignerActionGroup *g;
+
+};
+
+class ActionListView : public QListView
+{
+ Q_OBJECT
+
+public:
+ ActionListView( QWidget *parent = 0, const char *name = 0 );
+
+protected:
+ QDragObject *dragObject();
+
+private slots:
+ void rmbMenu( QListViewItem *i, const QPoint &p );
+
+signals:
+ void insertAction();
+ void insertActionGroup();
+ void insertDropDownActionGroup();
+ void deleteAction();
+ void connectAction();
+
+};
+
+#endif
diff --git a/tools/designer/designer/asciivalidator.cpp b/tools/designer/designer/asciivalidator.cpp
new file mode 100644
index 0000000..e4f92e6
--- /dev/null
+++ b/tools/designer/designer/asciivalidator.cpp
@@ -0,0 +1,101 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "asciivalidator.h"
+
+#include <qstring.h>
+
+AsciiValidator::AsciiValidator( QObject * parent, const char *name )
+ : QValidator( parent, name ), functionName( FALSE )
+{
+}
+
+AsciiValidator::AsciiValidator( bool funcName, QObject * parent, const char *name )
+ : QValidator( parent, name ), functionName( funcName )
+{
+}
+
+AsciiValidator::AsciiValidator( const QString &allow, QObject * parent, const char *name )
+ : QValidator( parent, name ), functionName( FALSE ), allowedChars( allow )
+{
+}
+
+AsciiValidator::~AsciiValidator()
+{
+}
+
+QValidator::State AsciiValidator::validate( QString &s, int & ) const
+{
+ bool inParen = FALSE;
+ bool outParen = FALSE;
+ if ( !s.isEmpty() && s[0].row() == 0 && s[0].cell() >= '0' && s[0].cell() <= '9' )
+ s[0] = '_';
+ for ( int i = 0, j = 0; i < (int) s.length(); i++ ) {
+ uchar r = s[i].row();
+ uchar c = s[i].cell();
+
+ if ( outParen ) { // check if we have 'const' or 'volatile'
+ static const QString con = " const";
+ static const QString vol = " volatile";
+ QString mid = s.mid( j );
+ if ( !( con.startsWith( mid ) || vol.startsWith( mid ) ) )
+ return QValidator::Invalid;
+ }
+
+ if ( inParen && c != ')' )
+ continue;
+
+ if ( r == 0 && ( ( c >= '0' && c <= '9' ) ||
+ ( c >= 'a' && c <= 'z' ) ||
+ ( c >= 'A' && c <= 'Z' ) ) )
+ continue;
+
+ if ( functionName ) {
+ if ( c == '(' ) {
+ inParen = TRUE;
+ continue;
+ }
+ if ( c == ')' ) {
+ outParen = TRUE;
+ j = i + 1;
+ continue;
+ }
+ }
+
+ if ( allowedChars.find( s[ i ] ) != -1 )
+ continue;
+
+ s[i] = '_';
+ }
+ return QValidator::Acceptable;
+}
diff --git a/tools/designer/designer/asciivalidator.h b/tools/designer/designer/asciivalidator.h
new file mode 100644
index 0000000..13bdced
--- /dev/null
+++ b/tools/designer/designer/asciivalidator.h
@@ -0,0 +1,59 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef ASCIIVALIDATOR_H
+#define ASCIIVALIDATOR_H
+
+
+#include <qvalidator.h>
+
+
+class AsciiValidator: public QValidator
+{
+ Q_OBJECT
+public:
+ AsciiValidator( QObject * parent, const char *name = 0 );
+ AsciiValidator( bool funcName, QObject * parent, const char *name = 0 );
+ AsciiValidator( const QString &allow, QObject * parent, const char *name = 0 );
+ ~AsciiValidator();
+
+ QValidator::State validate( QString &, int & ) const;
+
+private:
+ bool functionName;
+ QString allowedChars;
+
+};
+
+
+#endif
diff --git a/tools/designer/designer/command.cpp b/tools/designer/designer/command.cpp
new file mode 100644
index 0000000..74a6b19
--- /dev/null
+++ b/tools/designer/designer/command.cpp
@@ -0,0 +1,2402 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+#include "command.h"
+#include "formwindow.h"
+#include "widgetfactory.h"
+#include "propertyeditor.h"
+#include "metadatabase.h"
+#include <widgetdatabase.h>
+#include "mainwindow.h"
+#include "hierarchyview.h"
+#include "workspace.h"
+#include "actioneditorimpl.h"
+#include "actiondnd.h"
+#include "formfile.h"
+#include "../interfaces/languageinterface.h"
+#include "menubareditor.h"
+#include "popupmenueditor.h"
+
+#include <qfeatures.h>
+#include <qwidget.h>
+#include <qmetaobject.h>
+#include <qapplication.h>
+#include <qlayout.h>
+#include <qmessagebox.h>
+#include <qlistbox.h>
+#include <qiconview.h>
+#include <qtextedit.h>
+#include <qptrstack.h>
+#include <qheader.h>
+#include <qsplitter.h>
+#ifndef QT_NO_TABLE
+#include <qtable.h>
+#endif
+#include <qaction.h>
+
+CommandHistory::CommandHistory( int s )
+ : current( -1 ), steps( s ), savedAt( -1 )
+{
+ history.setAutoDelete( TRUE );
+ modified = FALSE;
+ compressedCommand = 0;
+}
+
+void CommandHistory::addCommand( Command *cmd, bool tryCompress )
+{
+ if ( tryCompress ) {
+ if ( !compressedCommand ||
+ compressedCommand->type() != cmd->type() ||
+ !compressedCommand->canMerge( cmd ) ) {
+ checkCompressedCommand();
+ compressedCommand = 0;
+ }
+
+ if ( compressedCommand ) {
+ compressedCommand->merge( cmd );
+ modified = TRUE;
+ modificationChanged( modified );
+ return;
+ }
+ compressedCommand = cmd;
+ } else {
+ checkCompressedCommand();
+ }
+
+ if ( current < (int)history.count() - 1 ) {
+ if ( current < savedAt )
+ savedAt = -2;
+
+ QPtrList<Command> commands;
+ commands.setAutoDelete( FALSE );
+
+ for( int i = 0; i <= current; ++i ) {
+ commands.insert( i, history.at( 0 ) );
+ history.take( 0 );
+ }
+
+ commands.append( cmd );
+ history.clear();
+ history = commands;
+ history.setAutoDelete( TRUE );
+ } else {
+ history.append( cmd );
+ }
+
+ if ( (int)history.count() > steps ) {
+ savedAt--;
+ history.removeFirst();
+ } else {
+ ++current;
+ }
+
+ emitUndoRedo();
+ modified = TRUE;
+ modificationChanged( modified );
+}
+
+void CommandHistory::undo()
+{
+ checkCompressedCommand();
+ compressedCommand = 0;
+ if ( current > -1 ) {
+ history.at( current )->unexecute();
+ --current;
+ }
+ emitUndoRedo();
+ modified = savedAt != current;
+ modificationChanged( modified );
+}
+
+void CommandHistory::redo()
+{
+ checkCompressedCommand();
+ compressedCommand = 0;
+ if ( current > -1 ) {
+ if ( current < (int)history.count() - 1 ) {
+ ++current;
+ history.at( current )->execute();
+ }
+ } else {
+ if ( history.count() > 0 ) {
+ ++current;
+ history.at( current )->execute();
+ }
+ }
+ emitUndoRedo();
+ modified = savedAt != current;
+ modificationChanged( modified );
+}
+
+void CommandHistory::emitUndoRedo()
+{
+ Command *undoCmd = 0;
+ Command *redoCmd = 0;
+
+ if ( current >= 0 && current < (int)history.count() )
+ undoCmd = history.at( current );
+ if ( current + 1 >= 0 && current + 1 < (int)history.count() )
+ redoCmd = history.at( current + 1 );
+
+ bool ua = (undoCmd != 0);
+ QString uc;
+ if ( ua )
+ uc = undoCmd->name();
+ bool ra = (redoCmd != 0);
+ QString rc;
+ if ( ra )
+ rc = redoCmd->name();
+ emit undoRedoChanged( ua, ra, uc, rc );
+}
+
+void CommandHistory::setModified( bool m )
+{
+ modified = m;
+ if ( !modified )
+ savedAt = current;
+ modificationChanged( modified );
+}
+
+bool CommandHistory::isModified() const
+{
+ return modified;
+}
+
+void CommandHistory::checkCompressedCommand()
+{
+ if ( compressedCommand && compressedCommand->type() == Command::SetProperty ) {
+ Command *c = compressedCommand;
+ compressedCommand = 0;
+ if ( !( (SetPropertyCommand*)c )->checkProperty() ) {
+ history.remove( current );
+ --current;
+ emitUndoRedo();
+ }
+ }
+}
+
+// ------------------------------------------------------------
+
+Command::Command( const QString &n, FormWindow *fw )
+ : cmdName( n ), formWin( fw )
+{
+}
+
+Command::~Command()
+{
+}
+
+QString Command::name() const
+{
+ return cmdName;
+}
+
+FormWindow *Command::formWindow() const
+{
+ return formWin;
+}
+
+void Command::merge( Command * )
+{
+}
+
+bool Command::canMerge( Command * )
+{
+ return FALSE;
+}
+
+// ------------------------------------------------------------
+
+ResizeCommand::ResizeCommand( const QString &n, FormWindow *fw,
+ QWidget *w, const QRect &oldr, const QRect &nr )
+ : Command( n, fw ), widget( w ), oldRect( oldr ), newRect( nr )
+{
+}
+
+void ResizeCommand::execute()
+{
+ widget->setGeometry( newRect );
+ formWindow()->updateSelection( widget );
+ formWindow()->emitUpdateProperties( widget );
+ if ( WidgetFactory::layoutType( widget ) != WidgetFactory::NoLayout )
+ formWindow()->updateChildSelections( widget );
+}
+
+void ResizeCommand::unexecute()
+{
+ widget->setGeometry( oldRect );
+ formWindow()->updateSelection( widget );
+ formWindow()->emitUpdateProperties( widget );
+ if ( WidgetFactory::layoutType( widget ) != WidgetFactory::NoLayout )
+ formWindow()->updateChildSelections( widget );
+}
+
+// ------------------------------------------------------------
+
+InsertCommand::InsertCommand( const QString &n, FormWindow *fw,
+ QWidget *w, const QRect &g )
+ : Command( n, fw ), widget( w ), geometry( g )
+{
+}
+
+void InsertCommand::execute()
+{
+ if ( geometry.size() == QSize( 0, 0 ) ) {
+ widget->move( geometry.topLeft() );
+ widget->adjustSize();
+ } else {
+ QSize s = geometry.size().expandedTo( widget->minimumSize() );
+ s = s.expandedTo( widget->minimumSizeHint() );
+ QRect r( geometry.topLeft(), s );
+ widget->setGeometry( r );
+ }
+ widget->show();
+ formWindow()->widgets()->insert( widget, widget );
+ formWindow()->clearSelection( FALSE );
+ formWindow()->selectWidget( widget );
+ formWindow()->mainWindow()->objectHierarchy()->widgetInserted( widget );
+}
+
+void InsertCommand::unexecute()
+{
+ widget->hide();
+ formWindow()->selectWidget( widget, FALSE );
+ formWindow()->widgets()->remove( widget );
+ formWindow()->mainWindow()->objectHierarchy()->widgetRemoved( widget );
+ }
+
+// ------------------------------------------------------------
+
+MoveCommand::MoveCommand( const QString &n, FormWindow *fw,
+ const QWidgetList &w,
+ const QValueList<QPoint> op,
+ const QValueList<QPoint> np,
+ QWidget *opr, QWidget *npr )
+ : Command( n, fw ), widgets( w ), oldPos( op ), newPos( np ),
+ oldParent( opr ), newParent( npr )
+{
+ widgets.setAutoDelete( FALSE );
+}
+
+void MoveCommand::merge( Command *c )
+{
+ MoveCommand *cmd = (MoveCommand*)c;
+ newPos = cmd->newPos;
+}
+
+bool MoveCommand::canMerge( Command *c )
+{
+ MoveCommand *cmd = (MoveCommand*)c;
+ return widgets == cmd->widgets;
+}
+
+
+void MoveCommand::execute()
+{
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ if ( !w->parentWidget() || WidgetFactory::layoutType( w->parentWidget() ) == WidgetFactory::NoLayout ) {
+ if ( newParent && oldParent && newParent != oldParent ) {
+ QPoint pos = newParent->mapFromGlobal( w->mapToGlobal( QPoint( 0,0 ) ) );
+ w->reparent( newParent, pos, TRUE );
+ formWindow()->raiseSelection( w );
+ formWindow()->raiseChildSelections( w );
+ formWindow()->widgetChanged( w );
+ formWindow()->mainWindow()->objectHierarchy()->widgetRemoved( w );
+ formWindow()->mainWindow()->objectHierarchy()->widgetInserted( w );
+ }
+ w->move( newPos[ widgets.at() ] );
+ }
+ formWindow()->updateSelection( w );
+ formWindow()->updateChildSelections( w );
+ formWindow()->emitUpdateProperties( w );
+ }
+}
+
+void MoveCommand::unexecute()
+{
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ if ( !w->parentWidget() || WidgetFactory::layoutType( w->parentWidget() ) == WidgetFactory::NoLayout ) {
+ if ( newParent && oldParent && newParent != oldParent ) {
+ QPoint pos = oldParent->mapFromGlobal( w->mapToGlobal( QPoint( 0,0 ) ) );
+ w->reparent( oldParent, pos, TRUE );
+ formWindow()->raiseSelection( w );
+ formWindow()->raiseChildSelections( w );
+ formWindow()->widgetChanged( w );
+ formWindow()->mainWindow()->objectHierarchy()->widgetRemoved( w );
+ formWindow()->mainWindow()->objectHierarchy()->widgetInserted( w );
+ }
+ w->move( oldPos[ widgets.at() ] );
+ }
+ formWindow()->updateSelection( w );
+ formWindow()->updateChildSelections( w );
+ formWindow()->emitUpdateProperties( w );
+ }
+}
+
+// ------------------------------------------------------------
+
+DeleteCommand::DeleteCommand( const QString &n, FormWindow *fw,
+ const QWidgetList &wl )
+ : Command( n, fw ), widgets( wl )
+{
+ widgets.setAutoDelete( FALSE );
+ QWidgetList copyOfWidgets = widgets;
+ copyOfWidgets.setAutoDelete(FALSE);
+
+ // Include the children of the selected items when deleting
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ QObjectList *children = w->queryList( "QWidget" );
+ for ( QWidget *c = (QWidget *)children->first(); c; c = (QWidget *)children->next() ) {
+ if ( copyOfWidgets.find( c ) == -1 && formWindow()->widgets()->find( c ) ) {
+ widgets.insert(widgets.at() + 1, c);
+ widgets.prev();
+ copyOfWidgets.append(c);
+ }
+ }
+ delete children;
+ }
+}
+
+void DeleteCommand::execute()
+{
+ formWindow()->setPropertyShowingBlocked( TRUE );
+ connections.clear();
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ w->hide();
+ QString s = w->name();
+ s.prepend( "qt_dead_widget_" );
+ w->setName( s );
+ formWindow()->selectWidget( w, FALSE );
+ formWindow()->widgets()->remove( w );
+ QValueList<MetaDataBase::Connection> conns = MetaDataBase::connections( formWindow(), w );
+ connections.insert( w, conns );
+ QValueList<MetaDataBase::Connection>::Iterator it = conns.begin();
+ for ( ; it != conns.end(); ++it ) {
+ MetaDataBase::removeConnection( formWindow(), (*it).sender,
+ (*it).signal, (*it).receiver, (*it).slot );
+ }
+ }
+ formWindow()->setPropertyShowingBlocked( FALSE );
+ formWindow()->emitShowProperties();
+ formWindow()->mainWindow()->objectHierarchy()->widgetsRemoved( widgets );
+
+}
+
+void DeleteCommand::unexecute()
+{
+ formWindow()->setPropertyShowingBlocked( TRUE );
+ formWindow()->clearSelection( FALSE );
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ w->show();
+ QString s = w->name();
+ s.remove( 0, QString( "qt_dead_widget_" ).length() );
+ w->setName( s );
+ formWindow()->widgets()->insert( w, w );
+ formWindow()->selectWidget( w );
+ QValueList<MetaDataBase::Connection> conns = *connections.find( w );
+ QValueList<MetaDataBase::Connection>::Iterator it = conns.begin();
+ for ( ; it != conns.end(); ++it ) {
+ MetaDataBase::addConnection( formWindow(), (*it).sender,
+ (*it).signal, (*it).receiver, (*it).slot );
+ }
+ }
+ formWindow()->setPropertyShowingBlocked( FALSE );
+ formWindow()->emitShowProperties();
+ formWindow()->mainWindow()->objectHierarchy()->widgetsInserted( widgets );
+}
+
+// ------------------------------------------------------------
+
+SetPropertyCommand::SetPropertyCommand( const QString &n, FormWindow *fw,
+ QObject *w, PropertyEditor *e,
+ const QString &pn, const QVariant &ov,
+ const QVariant &nv, const QString &ncut,
+ const QString &ocut, bool reset )
+ : Command( n, fw ), widget( w ), editor( e ), propName( pn ),
+ oldValue( ov ), newValue( nv ), oldCurrentItemText( ocut ), newCurrentItemText( ncut ),
+ wasChanged( TRUE ), isResetCommand( reset )
+{
+ wasChanged = MetaDataBase::isPropertyChanged( w, propName );
+ if ( oldCurrentItemText.isNull() )
+ oldCurrentItemText = "";
+ if ( newCurrentItemText.isNull() )
+ newCurrentItemText = "";
+}
+
+
+void SetPropertyCommand::execute()
+{
+ if ( !wasChanged )
+ MetaDataBase::setPropertyChanged( widget, propName, TRUE );
+ if ( isResetCommand ) {
+ MetaDataBase::setPropertyChanged( widget, propName, FALSE );
+ if ( WidgetFactory::resetProperty( widget, propName ) ) {
+ if ( !formWindow()->isWidgetSelected( widget ) && formWindow() != (QObject *)widget )
+ formWindow()->selectWidget( (QObject *)widget );
+ if ( editor->widget() != widget )
+ editor->setWidget( widget, formWindow() );
+ editor->propertyList()->setCurrentProperty( propName );
+ PropertyItem *i = (PropertyItem*)editor->propertyList()->currentItem();
+ if ( !i )
+ return;
+ i->setValue( widget->property( propName ) );
+ i->setChanged( FALSE );
+ editor->refetchData();
+ editor->emitWidgetChanged();
+ return;
+ }
+ }
+ setProperty( newValue, newCurrentItemText );
+}
+
+void SetPropertyCommand::unexecute()
+{
+ if ( !wasChanged )
+ MetaDataBase::setPropertyChanged( widget, propName, FALSE );
+ if ( isResetCommand )
+ MetaDataBase::setPropertyChanged( widget, propName, TRUE );
+ setProperty( oldValue, oldCurrentItemText );
+}
+
+bool SetPropertyCommand::canMerge( Command *c )
+{
+ SetPropertyCommand *cmd = (SetPropertyCommand*)c;
+ if ( !widget )
+ return FALSE;
+ const QMetaProperty *p =
+ widget->metaObject()->property( widget->metaObject()->findProperty( propName, TRUE ), TRUE );
+ if ( !p ) {
+ if ( propName == "toolTip" || propName == "whatsThis" )
+ return TRUE;
+ if ( ::qt_cast<CustomWidget*>((QObject *)widget) ) {
+ MetaDataBase::CustomWidget *cw = ((CustomWidget*)(QObject*)widget)->customWidget();
+ if ( !cw )
+ return FALSE;
+ for ( QValueList<MetaDataBase::Property>::Iterator it = cw->lstProperties.begin(); it != cw->lstProperties.end(); ++it ) {
+ if ( QString( (*it ).property ) == propName ) {
+ if ( (*it).type == "String" || (*it).type == "CString" || (*it).type == "Int" || (*it).type == "UInt" )
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+ }
+ QVariant::Type t = QVariant::nameToType( p->type() );
+ return ( cmd->propName == propName &&
+ t == QVariant::String || t == QVariant::CString || t == QVariant::Int || t == QVariant::UInt );
+}
+
+void SetPropertyCommand::merge( Command *c )
+{
+ SetPropertyCommand *cmd = (SetPropertyCommand*)c;
+ newValue = cmd->newValue;
+ newCurrentItemText = cmd->newCurrentItemText;
+}
+
+bool SetPropertyCommand::checkProperty()
+{
+ if ( propName == "name" /*|| propName == "itemName"*/ ) { // ### fix that
+ QString s = newValue.toString();
+ if ( !formWindow()->unify( widget, s, FALSE ) ) {
+ QMessageBox::information( formWindow()->mainWindow(),
+ FormWindow::tr( "Set 'name' property" ),
+ FormWindow::tr( "The name of a widget must be unique.\n"
+ "'%1' is already used in form '%2',\n"
+ "so the name has been reverted to '%3'." ).
+ arg( newValue.toString() ).
+ arg( formWindow()->name() ).
+ arg( oldValue.toString() ));
+ setProperty( oldValue, oldCurrentItemText, FALSE );
+ return FALSE;
+ }
+ if ( s.isEmpty() ) {
+ QMessageBox::information( formWindow()->mainWindow(),
+ FormWindow::tr( "Set 'name' property" ),
+ FormWindow::tr( "The name of a widget must not be null.\n"
+ "The name has been reverted to '%1'." ).
+ arg( oldValue.toString() ));
+ setProperty( oldValue, oldCurrentItemText, FALSE );
+ return FALSE;
+ }
+
+ if ( ::qt_cast<FormWindow*>(widget->parent()) )
+ formWindow()->mainWindow()->formNameChanged( (FormWindow*)((QWidget*)(QObject*)widget)->parentWidget() );
+ }
+ return TRUE;
+}
+
+void SetPropertyCommand::setProperty( const QVariant &v, const QString &currentItemText, bool select )
+{
+ if ( !widget )
+ return;
+
+ if ( !formWindow()->isWidgetSelected( widget ) && !formWindow()->isMainContainer( widget ) && select )
+ formWindow()->selectWidget( widget );
+ if ( editor->widget() != widget && select )
+ editor->setWidget( widget, formWindow() );
+ if ( select )
+ editor->propertyList()->setCurrentProperty( propName );
+ const QMetaProperty *p =
+ widget->metaObject()->property( widget->metaObject()->findProperty( propName, TRUE ), TRUE );
+ if ( !p ) {
+ if ( propName == "hAlign" ) {
+ p = widget->metaObject()->property( widget->metaObject()->findProperty( "alignment", TRUE ), TRUE );
+ int align = widget->property( "alignment" ).toInt();
+ align &= ~( AlignHorizontal_Mask );
+ align |= p->keyToValue( currentItemText );
+ widget->setProperty( "alignment", QVariant( align ) );
+ } else if ( propName == "vAlign" ) {
+ p = widget->metaObject()->property( widget->metaObject()->findProperty( "alignment", TRUE ), TRUE );
+ int align = widget->property( "alignment" ).toInt();
+ align &= ~( AlignVertical_Mask );
+ align |= p->keyToValue( currentItemText );
+ widget->setProperty( "alignment", QVariant( align ) );
+ } else if ( propName == "wordwrap" ) {
+ int align = widget->property( "alignment" ).toInt();
+ align &= ~WordBreak;
+ if ( v.toBool() )
+ align |= WordBreak;
+ widget->setProperty( "alignment", QVariant( align ) );
+ } else if ( propName == "layoutSpacing" ) {
+ QVariant val = v;
+ if ( val.toString() == "default" )
+ val = -1;
+ MetaDataBase::setSpacing( WidgetFactory::containerOfWidget( (QWidget*)editor->widget() ), val.toInt() );
+ } else if ( propName == "layoutMargin" ) {
+ QVariant val = v;
+ if ( val.toString() == "default" )
+ val = -1;
+ MetaDataBase::setMargin( WidgetFactory::containerOfWidget( (QWidget*)editor->widget() ), val.toInt() );
+ } else if ( propName == "resizeMode" ) {
+ MetaDataBase::setResizeMode( WidgetFactory::containerOfWidget( (QWidget*)editor->widget() ), currentItemText );
+ } else if ( propName == "toolTip" || propName == "whatsThis" || propName == "database" || propName == "frameworkCode" ) {
+ MetaDataBase::setFakeProperty( editor->widget(), propName, v );
+ } else if ( ::qt_cast<CustomWidget*>(editor->widget()) ) {
+ MetaDataBase::CustomWidget *cw = ((CustomWidget *)(QObject *)widget)->customWidget();
+ if ( cw ) {
+ MetaDataBase::setFakeProperty( editor->widget(), propName, v );
+ }
+ }
+ editor->refetchData();
+ editor->emitWidgetChanged();
+ ( ( PropertyItem* )editor->propertyList()->currentItem() )->setChanged( MetaDataBase::isPropertyChanged( widget, propName ) );
+#ifndef QT_NO_SQL
+ if ( propName == "database" ) {
+ formWindow()->mainWindow()->objectHierarchy()->databasePropertyChanged( (QWidget*)((QObject *)widget), MetaDataBase::fakeProperty( widget, "database" ).toStringList() );
+ }
+#endif
+ return;
+ }
+
+ if ( p->isSetType() ) {
+ QStrList strlst;
+ QStringList lst = QStringList::split( "|", currentItemText );
+ QValueListConstIterator<QString> it = lst.begin();
+ for ( ; it != lst.end(); ++it )
+ strlst.append( (*it).latin1() );
+ widget->setProperty( propName, p->keysToValue( strlst ) );
+ } else if ( p->isEnumType() ) {
+ widget->setProperty( propName, p->keyToValue( currentItemText ) );
+ } else if ( qstrcmp( p->name(), "buddy" ) == 0 ) {
+ widget->setProperty( propName, currentItemText );
+ } else {
+ QVariant ov;
+ if ( propName == "name" || propName == "itemName" )
+ ov = widget->property( propName );
+ int oldSerNum = -1;
+ if ( v.type() == QVariant::Pixmap )
+ oldSerNum = v.toPixmap().serialNumber();
+ widget->setProperty( propName, v );
+ if ( oldSerNum != -1 && oldSerNum != widget->property( propName ).toPixmap().serialNumber() )
+ MetaDataBase::setPixmapKey( formWindow(),
+ widget->property( propName ).toPixmap().serialNumber(),
+ MetaDataBase::pixmapKey( formWindow(), oldSerNum ) );
+ if ( propName == "cursor" ) {
+ MetaDataBase::setCursor( (QWidget*)((QObject *)widget), v.toCursor() );
+ }
+ if ( propName == "name" && widget->isWidgetType() ) {
+ formWindow()->mainWindow()->objectHierarchy()->namePropertyChanged( ((QWidget*)(QObject *)widget), ov );
+ if ( formWindow()->isMainContainer( widget ) )
+ formWindow()->setName( v.toCString() );
+ }
+ if ( propName == "name" && ::qt_cast<QAction*>((QObject *)widget) && ::qt_cast<QMainWindow*>(formWindow()->mainContainer()) ) {
+ formWindow()->mainWindow()->actioneditor()->updateActionName( (QAction*)(QObject *)widget );
+ }
+ if ( propName == "iconSet" && ::qt_cast<QAction*>((QObject *)widget) && ::qt_cast<QMainWindow*>(formWindow()->mainContainer()) ) {
+ formWindow()->mainWindow()->actioneditor()->updateActionIcon( (QAction*)(QObject *)widget );
+ }
+ if ( propName == "caption" ) {
+ if ( formWindow()->isMainContainer( widget ) )
+ formWindow()->setCaption( v.toString() );
+ }
+ if ( propName == "icon" ) {
+ if ( formWindow()->isMainContainer( widget ) )
+ formWindow()->setIcon( v.toPixmap() );
+ }
+ }
+ editor->refetchData();
+ if ( editor->propertyList()->currentItem() && select ) {
+ ( ( PropertyItem* )editor->propertyList()->currentItem() )->showEditor();
+ ( ( PropertyItem* )editor->propertyList()->currentItem() )->setChanged( MetaDataBase::isPropertyChanged( widget, propName ) );
+ }
+ editor->emitWidgetChanged();
+ formWindow()->killAccels( widget );
+}
+
+// ------------------------------------------------------------
+
+LayoutHorizontalCommand::LayoutHorizontalCommand( const QString &n, FormWindow *fw,
+ QWidget *parent, QWidget *layoutBase,
+ const QWidgetList &wl )
+ : Command( n, fw ), layout( wl, parent, fw, layoutBase )
+{
+}
+
+void LayoutHorizontalCommand::execute()
+{
+ formWindow()->clearSelection( FALSE );
+ layout.doLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void LayoutHorizontalCommand::unexecute()
+{
+ formWindow()->clearSelection( FALSE );
+ layout.undoLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+LayoutHorizontalSplitCommand::LayoutHorizontalSplitCommand( const QString &n, FormWindow *fw,
+ QWidget *parent, QWidget *layoutBase,
+ const QWidgetList &wl )
+ : Command( n, fw ), layout( wl, parent, fw, layoutBase, TRUE, TRUE )
+{
+}
+
+void LayoutHorizontalSplitCommand::execute()
+{
+ formWindow()->clearSelection( FALSE );
+ layout.doLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void LayoutHorizontalSplitCommand::unexecute()
+{
+ formWindow()->clearSelection( FALSE );
+ layout.undoLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+LayoutVerticalCommand::LayoutVerticalCommand( const QString &n, FormWindow *fw,
+ QWidget *parent, QWidget *layoutBase,
+ const QWidgetList &wl )
+ : Command( n, fw ), layout( wl, parent, fw, layoutBase )
+{
+}
+
+void LayoutVerticalCommand::execute()
+{
+ formWindow()->clearSelection( FALSE );
+ layout.doLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void LayoutVerticalCommand::unexecute()
+{
+ formWindow()->clearSelection( FALSE );
+ layout.undoLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+LayoutVerticalSplitCommand::LayoutVerticalSplitCommand( const QString &n, FormWindow *fw,
+ QWidget *parent, QWidget *layoutBase,
+ const QWidgetList &wl )
+ : Command( n, fw ), layout( wl, parent, fw, layoutBase, TRUE, TRUE )
+{
+}
+
+void LayoutVerticalSplitCommand::execute()
+{
+ formWindow()->clearSelection( FALSE );
+ layout.doLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void LayoutVerticalSplitCommand::unexecute()
+{
+ formWindow()->clearSelection( FALSE );
+ layout.undoLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+LayoutGridCommand::LayoutGridCommand( const QString &n, FormWindow *fw,
+ QWidget *parent, QWidget *layoutBase,
+ const QWidgetList &wl, int xres, int yres )
+ : Command( n, fw ), layout( wl, parent, fw, layoutBase, QSize( QMAX(5,xres), QMAX(5,yres) ) )
+{
+}
+
+void LayoutGridCommand::execute()
+{
+ formWindow()->clearSelection( FALSE );
+ layout.doLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void LayoutGridCommand::unexecute()
+{
+ formWindow()->clearSelection( FALSE );
+ layout.undoLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+BreakLayoutCommand::BreakLayoutCommand( const QString &n, FormWindow *fw,
+ QWidget *layoutBase, const QWidgetList &wl )
+ : Command( n, fw ), lb( layoutBase ), widgets( wl )
+{
+ WidgetFactory::LayoutType lay = WidgetFactory::layoutType( layoutBase );
+ spacing = MetaDataBase::spacing( layoutBase );
+ margin = MetaDataBase::margin( layoutBase );
+ layout = 0;
+ if ( lay == WidgetFactory::HBox )
+ layout = new HorizontalLayout( wl, layoutBase, fw, layoutBase, FALSE, ::qt_cast<QSplitter*>(layoutBase) != 0 );
+ else if ( lay == WidgetFactory::VBox )
+ layout = new VerticalLayout( wl, layoutBase, fw, layoutBase, FALSE, ::qt_cast<QSplitter*>(layoutBase) != 0 );
+ else if ( lay == WidgetFactory::Grid )
+ layout = new GridLayout( wl, layoutBase, fw, layoutBase, QSize( QMAX( 5, fw->grid().x()), QMAX( 5, fw->grid().y()) ), FALSE );
+}
+
+void BreakLayoutCommand::execute()
+{
+ if ( !layout )
+ return;
+ formWindow()->clearSelection( FALSE );
+ layout->breakLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() )
+ w->resize( QMAX( 16, w->width() ), QMAX( 16, w->height() ) );
+}
+
+void BreakLayoutCommand::unexecute()
+{
+ if ( !layout )
+ return;
+ formWindow()->clearSelection( FALSE );
+ layout->doLayout();
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+ MetaDataBase::setSpacing( WidgetFactory::containerOfWidget( lb ), spacing );
+ MetaDataBase::setMargin( WidgetFactory::containerOfWidget( lb ), margin );
+}
+
+// ------------------------------------------------------------
+
+MacroCommand::MacroCommand( const QString &n, FormWindow *fw,
+ const QPtrList<Command> &cmds )
+ : Command( n, fw ), commands( cmds )
+{
+}
+
+void MacroCommand::execute()
+{
+ for ( Command *c = commands.first(); c; c = commands.next() )
+ c->execute();
+}
+
+void MacroCommand::unexecute()
+{
+ for ( Command *c = commands.last(); c; c = commands.prev() )
+ c->unexecute();
+}
+
+// ------------------------------------------------------------
+
+AddTabPageCommand::AddTabPageCommand( const QString &n, FormWindow *fw,
+ QTabWidget *tw, const QString &label )
+ : Command( n, fw ), tabWidget( tw ), tabLabel( label )
+{
+ tabPage = new QDesignerWidget( formWindow(), tabWidget, "TabPage" );
+ tabPage->hide();
+ index = -1;
+ MetaDataBase::addEntry( tabPage );
+}
+
+void AddTabPageCommand::execute()
+{
+ if ( index == -1 )
+ index = ( (QDesignerTabWidget*)tabWidget )->count();
+ tabWidget->insertTab( tabPage, tabLabel, index );
+ tabWidget->showPage( tabPage );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget );
+}
+
+void AddTabPageCommand::unexecute()
+{
+ tabWidget->removePage( tabPage );
+ tabPage->hide();
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget );
+}
+
+// ------------------------------------------------------------
+
+MoveTabPageCommand::MoveTabPageCommand( const QString &n, FormWindow *fw,
+ QTabWidget *tw, QWidget* page, const QString& label, int nIndex, int oIndex )
+ : Command( n, fw ), tabWidget( tw ), tabPage( page ), tabLabel( label )
+{
+ newIndex = nIndex;
+ oldIndex = oIndex;
+}
+
+void MoveTabPageCommand::execute()
+{
+ ((QDesignerTabWidget*)tabWidget )->removePage( tabPage );
+ ((QDesignerTabWidget*)tabWidget )->insertTab( tabPage, tabLabel, newIndex );
+ ((QDesignerTabWidget*)tabWidget )->showPage( tabPage );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget );
+}
+
+void MoveTabPageCommand::unexecute()
+{
+ ((QDesignerTabWidget*)tabWidget )->removePage( tabPage );
+ ((QDesignerTabWidget*)tabWidget )->insertTab( tabPage, tabLabel, oldIndex );
+ ((QDesignerTabWidget*)tabWidget )->showPage( tabPage );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget );
+}
+
+// ------------------------------------------------------------
+
+DeleteTabPageCommand::DeleteTabPageCommand( const QString &n, FormWindow *fw,
+ QTabWidget *tw, QWidget *page )
+ : Command( n, fw ), tabWidget( tw ), tabPage( page )
+{
+ tabLabel = ( (QDesignerTabWidget*)tabWidget )->pageTitle();
+ index = ( (QDesignerTabWidget*)tabWidget )->currentPage();
+}
+
+void DeleteTabPageCommand::execute()
+{
+ tabWidget->removePage( tabPage );
+ tabPage->hide();
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget );
+}
+
+void DeleteTabPageCommand::unexecute()
+{
+ tabWidget->insertTab( tabPage, tabLabel, index );
+ tabWidget->showPage( tabPage );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->tabsChanged( tabWidget );
+}
+
+// ------------------------------------------------------------
+
+AddWidgetStackPageCommand::AddWidgetStackPageCommand( const QString &n, FormWindow *fw,
+ QDesignerWidgetStack *ws )
+ : Command( n, fw ), widgetStack( ws )
+{
+ stackPage = new QDesignerWidget( formWindow(), widgetStack, "WStackPage" );
+ stackPage->hide();
+ index = -1;
+ MetaDataBase::addEntry( stackPage );
+}
+
+void AddWidgetStackPageCommand::execute()
+{
+ index = widgetStack->insertPage( stackPage, index );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->tabsChanged( 0 );
+}
+
+void AddWidgetStackPageCommand::unexecute()
+{
+ index = widgetStack->removePage( stackPage );
+ stackPage->hide();
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->tabsChanged( 0 );
+}
+
+DeleteWidgetStackPageCommand::DeleteWidgetStackPageCommand( const QString &n, FormWindow *fw,
+ QDesignerWidgetStack *ws, QWidget *page )
+ : Command( n, fw), widgetStack( ws ), stackPage( page )
+{
+ index = -1;
+}
+
+void DeleteWidgetStackPageCommand::execute()
+{
+ index = widgetStack->removePage( stackPage );
+ stackPage->hide();
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->widgetRemoved( stackPage );
+}
+
+void DeleteWidgetStackPageCommand::unexecute()
+{
+ index = widgetStack->insertPage( stackPage, index );
+ widgetStack->raiseWidget( stackPage );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->widgetInserted( stackPage );
+}
+
+// ------------------------------------------------------------
+
+AddWizardPageCommand::AddWizardPageCommand( const QString &n, FormWindow *fw,
+ QWizard *w, const QString &label, int i, bool s )
+ : Command( n, fw ), wizard( w ), pageLabel( label )
+{
+ page = new QDesignerWidget( formWindow(), wizard, "WizardPage" );
+ page->hide();
+ index = i;
+ show = s;
+ MetaDataBase::addEntry( page );
+}
+
+void AddWizardPageCommand::execute()
+{
+ if ( index == -1 )
+ index = wizard->pageCount();
+ wizard->insertPage( page, pageLabel, index );
+ if ( show )
+ ( (QDesignerWizard*)wizard )->setCurrentPage( ( (QDesignerWizard*)wizard )->pageNum( page ) );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard );
+}
+
+void AddWizardPageCommand::unexecute()
+{
+ wizard->removePage( page );
+ page->hide();
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard );
+}
+
+// ------------------------------------------------------------
+
+DeleteWizardPageCommand::DeleteWizardPageCommand( const QString &n, FormWindow *fw,
+ QWizard *w, int i, bool s )
+ : Command( n, fw ), wizard( w ), index( i )
+{
+ show = s;
+}
+
+void DeleteWizardPageCommand::execute()
+{
+ page = wizard->page( index );
+ pageLabel = wizard->title( page );
+ wizard->removePage( page );
+ page->hide();
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard );
+}
+
+void DeleteWizardPageCommand::unexecute()
+{
+ wizard->insertPage( page, pageLabel, index );
+ if ( show )
+ ( (QDesignerWizard*)wizard )->setCurrentPage( ( (QDesignerWizard*)wizard )->pageNum( page ) );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard );
+}
+
+// ------------------------------------------------------------
+
+RenameWizardPageCommand::RenameWizardPageCommand( const QString &n, FormWindow *fw,
+ QWizard *w, int i, const QString& name )
+ : Command( n, fw ), wizard( w ), index( i ), label( name )
+{
+
+}
+
+void RenameWizardPageCommand::execute()
+{
+ page = wizard->page( index );
+ QString oldLabel = wizard->title( page );
+
+ wizard->setTitle( page, label );
+ label = oldLabel;
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+}
+
+void RenameWizardPageCommand::unexecute()
+{
+ execute();
+}
+
+// ------------------------------------------------------------
+
+SwapWizardPagesCommand::SwapWizardPagesCommand( const QString &n, FormWindow *fw, QWizard *w, int i1, int i2 )
+ : Command( n, fw ), wizard( w ), index1( i1 ), index2( i2 )
+{
+}
+
+void SwapWizardPagesCommand::execute()
+{
+ QWidget *page1 = wizard->page( index1 );
+ QWidget *page2 = wizard->page( index2 );
+ QString page1Label = wizard->title( page1 );
+ QString page2Label = wizard->title( page2 );
+ wizard->removePage( page1 );
+ wizard->removePage( page2 );
+ wizard->insertPage( page1, page1Label, index2 );
+ wizard->insertPage( page2, page2Label, index1 );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard );
+}
+
+void SwapWizardPagesCommand::unexecute()
+{
+ execute();
+}
+
+// ------------------------------------------------------------
+
+MoveWizardPageCommand::MoveWizardPageCommand( const QString &n, FormWindow *fw, QWizard *w, int i1, int i2 )
+ : Command( n, fw ), wizard( w ), index1( i1 ), index2( i2 )
+{
+}
+
+void MoveWizardPageCommand::execute()
+{
+ QWidget *page = wizard->page( index1 );
+ QString pageLabel = wizard->title( page );
+ wizard->removePage( page );
+ wizard->insertPage( page, pageLabel, index2 );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard );
+}
+
+void MoveWizardPageCommand::unexecute()
+{
+ // ###FIX: index1 may be the wrong place
+ QWidget *page = wizard->page( index2 );
+ QString pageLabel = wizard->title( page );
+ wizard->removePage( page );
+ wizard->insertPage( page, pageLabel, index1 );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->pagesChanged( wizard );
+}
+
+// ------------------------------------------------------------
+
+AddConnectionCommand::AddConnectionCommand( const QString &name, FormWindow *fw,
+ MetaDataBase::Connection c )
+ : Command( name, fw ), connection( c )
+{
+}
+
+void AddConnectionCommand::execute()
+{
+ MetaDataBase::addConnection( formWindow(), connection.sender,
+ connection.signal, connection.receiver, connection.slot );
+ if ( connection.receiver == formWindow()->mainContainer() )
+ formWindow()->mainWindow()->propertyeditor()->eventList()->setup();
+}
+
+void AddConnectionCommand::unexecute()
+{
+ MetaDataBase::removeConnection( formWindow(), connection.sender,
+ connection.signal, connection.receiver, connection.slot );
+ if ( connection.receiver == formWindow()->mainContainer() )
+ formWindow()->mainWindow()->propertyeditor()->eventList()->setup();
+}
+
+// ------------------------------------------------------------
+
+RemoveConnectionCommand::RemoveConnectionCommand( const QString &name, FormWindow *fw,
+ MetaDataBase::Connection c )
+ : Command( name, fw ), connection( c )
+{
+}
+
+void RemoveConnectionCommand::execute()
+{
+ MetaDataBase::removeConnection( formWindow(), connection.sender,
+ connection.signal, connection.receiver, connection.slot );
+ if ( connection.receiver == formWindow()->mainContainer() )
+ formWindow()->mainWindow()->propertyeditor()->eventList()->setup();
+}
+
+void RemoveConnectionCommand::unexecute()
+{
+ MetaDataBase::addConnection( formWindow(), connection.sender,
+ connection.signal, connection.receiver, connection.slot );
+ if ( connection.receiver == formWindow()->mainContainer() )
+ formWindow()->mainWindow()->propertyeditor()->eventList()->setup();
+}
+
+// ------------------------------------------------------------
+
+AddFunctionCommand::AddFunctionCommand( const QString &name, FormWindow *fw, const QCString &f,
+ const QString& spec, const QString &a, const QString &t,
+ const QString &l, const QString &rt )
+ : Command( name, fw ), function( f ), specifier( spec ), access( a ), functionType( t ), language( l ),
+ returnType( rt )
+{
+}
+
+void AddFunctionCommand::execute()
+{
+ MetaDataBase::addFunction( formWindow(), function, specifier, access, functionType, language, returnType );
+ formWindow()->mainWindow()->functionsChanged();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+void AddFunctionCommand::unexecute()
+{
+ MetaDataBase::removeFunction( formWindow(), function, specifier, access, functionType, language, returnType );
+ formWindow()->mainWindow()->functionsChanged();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+// ------------------------------------------------------------
+
+ChangeFunctionAttribCommand::ChangeFunctionAttribCommand( const QString &name, FormWindow *fw, MetaDataBase::Function f,
+ const QString &on, const QString &os,
+ const QString &oa, const QString &ot, const QString &ol,
+ const QString &ort )
+ : Command( name, fw ), oldName( on ), oldSpec( os ), oldAccess( oa ),
+ oldType( ot ), oldLang( ol ), oldReturnType( ort )
+{
+ newName = f.function;
+ newSpec = f.specifier;
+ newAccess = f.access;
+ newType = f.type;
+ newLang = f.language;
+ newReturnType = f.returnType;
+}
+
+void ChangeFunctionAttribCommand::execute()
+{
+ MetaDataBase::changeFunctionAttributes( formWindow(), oldName, newName, newSpec, newAccess,
+ newType, newLang, newReturnType );
+ formWindow()->formFile()->functionNameChanged( oldName, newName );
+ formWindow()->formFile()->functionRetTypeChanged( newName, oldReturnType, newReturnType );
+ formWindow()->mainWindow()->functionsChanged();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+void ChangeFunctionAttribCommand::unexecute()
+{
+ MetaDataBase::changeFunctionAttributes( formWindow(), newName, oldName, oldSpec, oldAccess,
+ oldType, oldLang, oldReturnType );
+ formWindow()->formFile()->functionNameChanged( newName, oldName );
+ formWindow()->formFile()->functionRetTypeChanged( oldName, newReturnType, oldReturnType );
+ formWindow()->mainWindow()->functionsChanged();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+// ------------------------------------------------------------
+
+RemoveFunctionCommand::RemoveFunctionCommand( const QString &name, FormWindow *fw, const QCString &f,
+ const QString& spec, const QString &a, const QString &t,
+ const QString &l, const QString &rt )
+ : Command( name, fw ), function( f ), specifier( spec ), access( a ), functionType( t ), language( l ),
+ returnType( rt )
+{
+ if ( spec.isNull() ) {
+ QValueList<MetaDataBase::Function> lst = MetaDataBase::functionList( fw );
+ for ( QValueList<MetaDataBase::Function>::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ if ( MetaDataBase::normalizeFunction( (*it).function ) ==
+ MetaDataBase::normalizeFunction( function ) ) {
+ specifier = (*it).specifier;
+ access = (*it).access;
+ functionType = (*it).type;
+ returnType = (*it).returnType;
+ language = (*it).language;
+ break;
+ }
+ }
+ }
+}
+
+void RemoveFunctionCommand::execute()
+{
+ MetaDataBase::removeFunction( formWindow(), function, specifier, access, functionType, language, returnType );
+ formWindow()->mainWindow()->functionsChanged();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+void RemoveFunctionCommand::unexecute()
+{
+ if ( MetaDataBase::hasFunction( formWindow(), function ) )
+ return;
+ MetaDataBase::addFunction( formWindow(), function, specifier, access, functionType, language, returnType );
+ formWindow()->mainWindow()->functionsChanged();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+// ------------------------------------------------------------
+
+AddVariableCommand::AddVariableCommand( const QString &name, FormWindow *fw, const QString &vn, const QString &a )
+ : Command( name, fw ), varName( vn ), access( a )
+{
+}
+
+void AddVariableCommand::execute()
+{
+ MetaDataBase::addVariable( formWindow(), varName, access );
+ formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+void AddVariableCommand::unexecute()
+{
+ MetaDataBase::removeVariable( formWindow(), varName );
+ formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+// ------------------------------------------------------------
+
+SetVariablesCommand::SetVariablesCommand( const QString &name, FormWindow *fw,
+ QValueList<MetaDataBase::Variable> lst )
+ : Command( name, fw ), newList( lst )
+{
+ oldList = MetaDataBase::variables( formWindow() );
+}
+
+void SetVariablesCommand::execute()
+{
+ MetaDataBase::setVariables( formWindow(), newList );
+ formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+void SetVariablesCommand::unexecute()
+{
+ MetaDataBase::setVariables( formWindow(), oldList );
+ formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+// ------------------------------------------------------------
+
+RemoveVariableCommand::RemoveVariableCommand( const QString &name, FormWindow *fw, const QString &vn )
+ : Command( name, fw ), varName( vn )
+{
+ QValueList<MetaDataBase::Variable> lst = MetaDataBase::variables( fw );
+ for ( QValueList<MetaDataBase::Variable>::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ if ( (*it).varName == varName ) {
+ access = (*it).varAccess;
+ break;
+ }
+ }
+}
+
+void RemoveVariableCommand::execute()
+{
+ MetaDataBase::removeVariable( formWindow(), varName );
+ formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+void RemoveVariableCommand::unexecute()
+{
+ MetaDataBase::addVariable( formWindow(), varName, access );
+ formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+// ------------------------------------------------------------
+
+EditDefinitionsCommand::EditDefinitionsCommand( const QString &name, FormWindow *fw, LanguageInterface *lf,
+ const QString &n, const QStringList &nl )
+ : Command( name, fw ), lIface( lf ), defName( n ), newList( nl )
+{
+ oldList = lIface->definitionEntries( defName, formWindow()->mainWindow()->designerInterface() );
+}
+
+void EditDefinitionsCommand::execute()
+{
+ lIface->setDefinitionEntries( defName, newList, formWindow()->mainWindow()->designerInterface() );
+ lIface->release();
+ formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+void EditDefinitionsCommand::unexecute()
+{
+ lIface->setDefinitionEntries( defName, oldList, formWindow()->mainWindow()->designerInterface() );
+ lIface->release();
+ formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ if ( formWindow()->formFile() )
+ formWindow()->formFile()->setModified( TRUE );
+}
+
+// ------------------------------------------------------------
+
+LowerCommand::LowerCommand( const QString &name, FormWindow *fw, const QWidgetList &w )
+ : Command( name, fw ), widgets( w )
+{
+}
+
+void LowerCommand::execute()
+{
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ w->lower();
+ formWindow()->raiseSelection( w );
+ }
+
+}
+
+void LowerCommand::unexecute()
+{
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ w->raise();
+ formWindow()->raiseSelection( w );
+ }
+}
+
+// ------------------------------------------------------------
+
+RaiseCommand::RaiseCommand( const QString &name, FormWindow *fw, const QWidgetList &w )
+ : Command( name, fw ), widgets( w )
+{
+}
+
+void RaiseCommand::execute()
+{
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ w->raise();
+ formWindow()->raiseSelection( w );
+ }
+
+}
+
+void RaiseCommand::unexecute()
+{
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ w->lower();
+ formWindow()->raiseSelection( w );
+ }
+}
+
+// ------------------------------------------------------------
+
+PasteCommand::PasteCommand( const QString &n, FormWindow *fw,
+ const QWidgetList &w )
+ : Command( n, fw ), widgets( w )
+{
+}
+
+void PasteCommand::execute()
+{
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ w->show();
+ formWindow()->selectWidget( w );
+ formWindow()->widgets()->insert( w, w );
+ formWindow()->mainWindow()->objectHierarchy()->widgetInserted( w );
+ }
+}
+
+void PasteCommand::unexecute()
+{
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ w->hide();
+ formWindow()->selectWidget( w, FALSE );
+ formWindow()->widgets()->remove( w );
+ formWindow()->mainWindow()->objectHierarchy()->widgetRemoved( w );
+ }
+ }
+
+// ------------------------------------------------------------
+
+TabOrderCommand::TabOrderCommand( const QString &n, FormWindow *fw,
+ const QWidgetList &ol, const QWidgetList &nl )
+ : Command( n, fw ), oldOrder( ol ), newOrder( nl )
+{
+}
+
+void TabOrderCommand::merge( Command *c )
+{
+ TabOrderCommand *cmd = (TabOrderCommand*)c;
+ newOrder = cmd->newOrder;
+}
+
+bool TabOrderCommand::canMerge( Command * )
+{
+ return TRUE;
+}
+
+void TabOrderCommand::execute()
+{
+ MetaDataBase::setTabOrder( formWindow(), newOrder );
+}
+
+void TabOrderCommand::unexecute()
+{
+ MetaDataBase::setTabOrder( formWindow(), oldOrder );
+}
+
+// ------------------------------------------------------------
+
+PopulateListBoxCommand::PopulateListBoxCommand( const QString &n, FormWindow *fw,
+ QListBox *lb, const QValueList<Item> &items )
+ : Command( n, fw ), newItems( items ), listbox( lb )
+{
+ QListBoxItem *i = 0;
+ for ( i = listbox->firstItem(); i; i = i->next() ) {
+ Item item;
+ if ( i->pixmap() )
+ item.pix = *i->pixmap();
+ item.text = i->text();
+ oldItems.append( item );
+ }
+}
+
+void PopulateListBoxCommand::execute()
+{
+ listbox->clear();
+ for ( QValueList<Item>::Iterator it = newItems.begin(); it != newItems.end(); ++it ) {
+ Item i = *it;
+ if ( !i.pix.isNull() )
+ (void)new QListBoxPixmap( listbox, i.pix, i.text );
+ else
+ (void)new QListBoxText( listbox, i.text );
+ }
+ formWindow()->mainWindow()->propertyeditor()->refetchData();
+}
+
+void PopulateListBoxCommand::unexecute()
+{
+ listbox->clear();
+ for ( QValueList<Item>::Iterator it = oldItems.begin(); it != oldItems.end(); ++it ) {
+ Item i = *it;
+ if ( !i.pix.isNull() )
+ (void)new QListBoxPixmap( listbox, i.pix, i.text );
+ else
+ (void)new QListBoxText( listbox, i.text );
+ }
+ formWindow()->mainWindow()->propertyeditor()->refetchData();
+}
+
+// ------------------------------------------------------------
+
+PopulateIconViewCommand::PopulateIconViewCommand( const QString &n, FormWindow *fw,
+ QIconView *iv, const QValueList<Item> &items )
+ : Command( n, fw ), newItems( items ), iconview( iv )
+{
+#ifndef QT_NO_ICONVIEW
+ QIconViewItem *i = 0;
+ for ( i = iconview->firstItem(); i; i = i->nextItem() ) {
+ Item item;
+ if ( i->pixmap() )
+ item.pix = *i->pixmap();
+ item.text = i->text();
+ oldItems.append( item );
+ }
+#endif
+}
+
+void PopulateIconViewCommand::execute()
+{
+#ifndef QT_NO_ICONVIEW
+ iconview->clear();
+ for ( QValueList<Item>::Iterator it = newItems.begin(); it != newItems.end(); ++it ) {
+ Item i = *it;
+ (void)new QIconViewItem( iconview, i.text, i.pix );
+ }
+#endif
+}
+
+void PopulateIconViewCommand::unexecute()
+{
+#ifndef QT_NO_ICONVIEW
+ iconview->clear();
+ for ( QValueList<Item>::Iterator it = oldItems.begin(); it != oldItems.end(); ++it ) {
+ Item i = *it;
+ (void)new QIconViewItem( iconview, i.text, i.pix );
+ }
+#endif
+}
+
+// ------------------------------------------------------------
+
+PopulateListViewCommand::PopulateListViewCommand( const QString &n, FormWindow *fw,
+ QListView *lv, QListView *from )
+ : Command( n, fw ), listview( lv )
+{
+ newItems = new QListView();
+ newItems->hide();
+ transferItems( from, newItems );
+ oldItems = new QListView();
+ oldItems->hide();
+ transferItems( listview, oldItems );
+}
+
+void PopulateListViewCommand::execute()
+{
+ listview->clear();
+ transferItems( newItems, listview );
+}
+
+void PopulateListViewCommand::unexecute()
+{
+ listview->clear();
+ transferItems( oldItems, listview );
+}
+
+void PopulateListViewCommand::transferItems( QListView *from, QListView *to )
+{
+ QHeader *header = to->header();
+ while ( header->count() )
+ to->removeColumn( 0 );
+ QHeader *h2 = from->header();
+ for ( int i = 0; i < h2->count(); ++i ) {
+ to->addColumn( h2->label( i ) );
+ if ( h2->iconSet( i ) && !h2->iconSet( i )->pixmap().isNull() )
+ header->setLabel( i, *h2->iconSet( i ), h2->label( i ) );
+ header->setResizeEnabled( h2->isResizeEnabled( i ), i );
+ header->setClickEnabled( h2->isClickEnabled( i ), i );
+ }
+
+ QListViewItemIterator it( from );
+ QPtrStack<QListViewItem> fromParents, toParents;
+ fromParents.push( 0 );
+ toParents.push( 0 );
+ QPtrStack<QListViewItem> toLasts;
+ QListViewItem *fromLast = 0;
+ toLasts.push( 0 );
+ int cols = from->columns();
+ to->setSorting( -1 );
+ from->setSorting( -1 );
+ for ( ; it.current(); ++it ) {
+ QListViewItem *i = it.current();
+ if ( i->parent() == fromParents.top() ) {
+ QListViewItem *pi = toParents.top();
+ QListViewItem *ni = 0;
+ if ( pi )
+ ni = new QListViewItem( pi, toLasts.top() );
+ else
+ ni = new QListViewItem( to, toLasts.top() );
+ for ( int c = 0; c < cols; ++c ) {
+ ni->setText( c, i->text( c ) );
+ if ( i->pixmap( c ) )
+ ni->setPixmap( c, *i->pixmap( c ) );
+ }
+ toLasts.pop();
+ toLasts.push( ni );
+ if ( pi )
+ pi->setOpen( TRUE );
+ } else {
+ if ( i->parent() == fromLast ) {
+ fromParents.push( fromLast );
+ toParents.push( toLasts.top() );
+ toLasts.push( 0 );
+ QListViewItem *pi = toParents.top();
+ QListViewItem *ni = 0;
+ if ( pi )
+ ni = new QListViewItem( pi );
+ else
+ ni = new QListViewItem( to );
+ for ( int c = 0; c < cols; ++c ) {
+ ni->setText( c, i->text( c ) );
+ if ( i->pixmap( c ) )
+ ni->setPixmap( c, *i->pixmap( c ) );
+ }
+ toLasts.pop();
+ toLasts.push( ni );
+ if ( pi )
+ pi->setOpen( TRUE );
+ } else {
+ while ( fromParents.top() != i->parent() ) {
+ fromParents.pop();
+ toParents.pop();
+ toLasts.pop();
+ }
+
+ QListViewItem *pi = toParents.top();
+ QListViewItem *ni = 0;
+ if ( pi )
+ ni = new QListViewItem( pi, toLasts.top() );
+ else
+ ni = new QListViewItem( to, toLasts.top() );
+ for ( int c = 0; c < cols; ++c ) {
+ ni->setText( c, i->text( c ) );
+ if ( i->pixmap( c ) )
+ ni->setPixmap( c, *i->pixmap( c ) );
+ }
+ if ( pi )
+ pi->setOpen( TRUE );
+ toLasts.pop();
+ toLasts.push( ni );
+ }
+ }
+ fromLast = i;
+ }
+}
+
+
+
+// ------------------------------------------------------------
+
+PopulateMultiLineEditCommand::PopulateMultiLineEditCommand( const QString &n, FormWindow *fw,
+ QTextEdit *mle, const QString &txt )
+ : Command( n, fw ), newText( txt ), mlined( mle )
+{
+ oldText = mlined->text();
+ wasChanged = MetaDataBase::isPropertyChanged( mlined, "text" );
+}
+
+void PopulateMultiLineEditCommand::execute()
+{
+ mlined->setText( newText );
+ MetaDataBase::setPropertyChanged( mlined, "text", TRUE );
+ formWindow()->emitUpdateProperties( mlined );
+}
+
+void PopulateMultiLineEditCommand::unexecute()
+{
+ mlined->setText( oldText );
+ MetaDataBase::setPropertyChanged( mlined, "text", wasChanged );
+ formWindow()->emitUpdateProperties( mlined );
+}
+
+// ------------------------------------------------------------
+
+PopulateTableCommand::PopulateTableCommand( const QString &n, FormWindow *fw, QTable *t,
+ const QValueList<Row> &rows,
+ const QValueList<Column> &columns )
+ : Command( n, fw ), newRows( rows ), newColumns( columns ), table( t )
+{
+#ifndef QT_NO_TABLE
+ int i = 0;
+ QMap<QString, QString> columnFields = MetaDataBase::columnFields( table );
+ for ( i = 0; i < table->horizontalHeader()->count(); ++i ) {
+ PopulateTableCommand::Column col;
+ col.text = table->horizontalHeader()->label( i );
+ if ( table->horizontalHeader()->iconSet( i ) )
+ col.pix = table->horizontalHeader()->iconSet( i )->pixmap();
+ col.field = *columnFields.find( col.text );
+ oldColumns.append( col );
+ }
+ for ( i = 0; i < table->verticalHeader()->count(); ++i ) {
+ PopulateTableCommand::Row row;
+ row.text = table->verticalHeader()->label( i );
+ if ( table->verticalHeader()->iconSet( i ) )
+ row.pix = table->verticalHeader()->iconSet( i )->pixmap();
+ oldRows.append( row );
+ }
+#endif
+}
+
+void PopulateTableCommand::execute()
+{
+#ifndef QT_NO_TABLE
+ QMap<QString, QString> columnFields;
+ table->setNumCols( (int)newColumns.count() );
+ int i = 0;
+ for ( QValueList<Column>::Iterator cit = newColumns.begin(); cit != newColumns.end(); ++cit, ++i ) {
+ table->horizontalHeader()->setLabel( i, (*cit).pix, (*cit).text );
+ if ( !(*cit).field.isEmpty() )
+ columnFields.insert( (*cit).text, (*cit).field );
+ }
+ MetaDataBase::setColumnFields( table, columnFields );
+ table->setNumRows( (int)newRows.count() );
+ i = 0;
+ for ( QValueList<Row>::Iterator rit = newRows.begin(); rit != newRows.end(); ++rit, ++i )
+ table->verticalHeader()->setLabel( i, (*rit).pix, (*rit).text );
+#endif
+}
+
+void PopulateTableCommand::unexecute()
+{
+#ifndef QT_NO_TABLE
+ QMap<QString, QString> columnFields;
+ table->setNumCols( (int)oldColumns.count() );
+ int i = 0;
+ for ( QValueList<Column>::Iterator cit = oldColumns.begin(); cit != oldColumns.end(); ++cit, ++i ) {
+ table->horizontalHeader()->setLabel( i, (*cit).pix, (*cit).text );
+ if ( !(*cit).field.isEmpty() )
+ columnFields.insert( (*cit).text, (*cit).field );
+ }
+ MetaDataBase::setColumnFields( table, columnFields );
+ table->setNumRows( (int)oldRows.count() );
+ i = 0;
+ for ( QValueList<Row>::Iterator rit = oldRows.begin(); rit != oldRows.end(); ++rit, ++i )
+ table->verticalHeader()->setLabel( i, (*rit).pix, (*rit).text );
+#endif
+}
+
+// ------------------------------------------------------------
+
+AddActionToToolBarCommand::AddActionToToolBarCommand( const QString &n, FormWindow *fw,
+ QAction *a, QDesignerToolBar *tb, int idx )
+ : Command( n, fw ), action( a ), toolBar( tb ), index( idx )
+{
+}
+
+void AddActionToToolBarCommand::execute()
+{
+ action->addTo( toolBar );
+
+ if ( ::qt_cast<QDesignerAction*>(action) ) {
+ QString s = ( (QDesignerAction*)action )->widget()->name();
+ if ( s.startsWith( "qt_dead_widget_" ) ) {
+ s.remove( 0, QString( "qt_dead_widget_" ).length() );
+ ( (QDesignerAction*)action )->widget()->setName( s );
+ }
+ toolBar->insertAction( ( (QDesignerAction*)action )->widget(), action );
+ ( (QDesignerAction*)action )->widget()->installEventFilter( toolBar );
+ } else if ( ::qt_cast<QDesignerActionGroup*>(action) ) {
+ if ( ( (QDesignerActionGroup*)action )->usesDropDown() ) {
+ toolBar->insertAction( ( (QDesignerActionGroup*)action )->widget(), action );
+ ( (QDesignerActionGroup*)action )->widget()->installEventFilter( toolBar );
+ }
+ } else if ( ::qt_cast<QSeparatorAction*>(action) ) {
+ toolBar->insertAction( ( (QSeparatorAction*)action )->widget(), action );
+ ( (QSeparatorAction*)action )->widget()->installEventFilter( toolBar );
+ }
+ if ( !::qt_cast<QActionGroup*>(action) || ( (QActionGroup*)action )->usesDropDown()) {
+ if ( index == -1 )
+ toolBar->appendAction( action );
+ else
+ toolBar->insertAction( index, action );
+ toolBar->reInsert();
+ QObject::connect( action, SIGNAL( destroyed() ), toolBar, SLOT( actionRemoved() ) );
+ } else {
+ if ( action->children() ) {
+ QObjectListIt it( *action->children() );
+ int i = 0;
+ while ( it.current() ) {
+ QObject *o = it.current();
+ ++it;
+ if ( !::qt_cast<QAction*>(o) )
+ continue;
+ // ### fix it for nested actiongroups
+ if ( ::qt_cast<QDesignerAction*>(o) ) {
+ QDesignerAction *ac = (QDesignerAction*)o;
+ toolBar->insertAction( ac->widget(), ac );
+ ac->widget()->installEventFilter( toolBar );
+ if ( index == -1 )
+ toolBar->appendAction( ac );
+ else
+ toolBar->insertAction( index + (i++), ac );
+ }
+ QObject::connect( o, SIGNAL( destroyed() ), toolBar, SLOT( actionRemoved() ) );
+ }
+ }
+ toolBar->reInsert();
+ QObject::connect( action, SIGNAL( destroyed() ), toolBar, SLOT( actionRemoved() ) );
+ }
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void AddActionToToolBarCommand::unexecute()
+{
+ if ( ::qt_cast<QDesignerAction*>(action) ) {
+ QString s = ( (QDesignerAction*)action )->widget()->name();
+ s.prepend( "qt_dead_widget_" );
+ ( (QDesignerAction*)action )->widget()->setName( s );
+ }
+
+ toolBar->removeAction( action );
+ action->removeFrom( toolBar );
+ QObject::disconnect( action, SIGNAL( destroyed() ), toolBar, SLOT( actionRemoved() ) );
+ if ( !::qt_cast<QActionGroup*>(action) || ( (QActionGroup*)action )->usesDropDown()) {
+ action->removeEventFilter( toolBar );
+ } else {
+ if ( action->children() ) {
+ QObjectListIt it( *action->children() );
+ while ( it.current() ) {
+ QObject *o = it.current();
+ ++it;
+ if ( !::qt_cast<QAction*>(o) )
+ continue;
+ if ( ::qt_cast<QDesignerAction*>(o) ) {
+ o->removeEventFilter( toolBar );
+ toolBar->removeAction( (QAction*)o );
+ }
+ QObject::disconnect( o, SIGNAL( destroyed() ), toolBar, SLOT( actionRemoved() ) );
+ }
+ }
+ }
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+AddToolBarCommand::AddToolBarCommand( const QString &n, FormWindow *fw, QMainWindow *mw )
+ : Command( n, fw ), toolBar( 0 ), mainWindow( mw )
+{
+}
+
+void AddToolBarCommand::execute()
+{
+ if ( !toolBar ) {
+ toolBar = new QDesignerToolBar( mainWindow );
+ QString n = "Toolbar";
+ formWindow()->unify( toolBar, n, TRUE );
+ toolBar->setName( n );
+ mainWindow->addToolBar( toolBar, n );
+ } else {
+ toolBar->show();
+ QString s = toolBar->name();
+ s.remove( 0, QString( "qt_dead_widget_" ).length() );
+ toolBar->setName( s );
+ }
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void AddToolBarCommand::unexecute()
+{
+ toolBar->hide();
+ QString s = toolBar->name();
+ s.prepend( "qt_dead_widget_" );
+ toolBar->setName( s );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+AddContainerPageCommand::AddContainerPageCommand( const QString &n, FormWindow *fw,
+ QWidget *c, const QString &label )
+ : Command( n, fw ), container( c ), index( -1 ), pageLabel( label ), page( 0 )
+{
+ WidgetInterface *iface = 0;
+ widgetManager()->queryInterface( WidgetFactory::classNameOf( container ), &iface );
+ if ( !iface )
+ return;
+ iface->queryInterface( IID_QWidgetContainer, (QUnknownInterface**)&wiface );
+ if ( !wiface )
+ return;
+ wClassName = WidgetFactory::classNameOf( container );
+}
+
+AddContainerPageCommand::~AddContainerPageCommand()
+{
+ if ( wiface )
+ wiface->release();
+}
+
+void AddContainerPageCommand::execute()
+{
+ if ( !wiface || !wiface->supportsPages( wClassName ) )
+ return;
+ if ( index == -1 )
+ index = wiface->count( wClassName, container );
+ if ( !page )
+ page = wiface->addPage( wClassName, container, pageLabel, index );
+ else
+ wiface->insertPage( wClassName, container, pageLabel, index, page );
+
+ MetaDataBase::addEntry( page );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ // #### show and update pages in object hierarchy view
+}
+
+void AddContainerPageCommand::unexecute()
+{
+ if ( !wiface || !wiface->supportsPages( wClassName ) )
+ return;
+ wiface->removePage( wClassName, container, index );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ // #### show and update pages in object hierarchy view
+}
+
+// ------------------------------------------------------------
+
+DeleteContainerPageCommand::DeleteContainerPageCommand( const QString &n, FormWindow *fw,
+ QWidget *c, int idx )
+ : Command( n, fw ), container( c ), index( idx )
+{
+ WidgetInterface *iface = 0;
+ widgetManager()->queryInterface( WidgetFactory::classNameOf( container ), &iface );
+ if ( !iface )
+ return;
+ iface->queryInterface( IID_QWidgetContainer, (QUnknownInterface**)&wiface );
+ if ( !wiface )
+ return;
+ wClassName = WidgetFactory::classNameOf( container );
+ page = wiface->page( wClassName, container, index );
+ pageLabel = wiface->pageLabel( wClassName, container, index );
+}
+
+DeleteContainerPageCommand::~DeleteContainerPageCommand()
+{
+ if ( wiface )
+ wiface->release();
+}
+
+void DeleteContainerPageCommand::execute()
+{
+ if ( !wiface || !wiface->supportsPages( wClassName ) )
+ return;
+
+ wiface->removePage( wClassName, container, index );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ // #### show and update pages in object hierarchy view
+}
+
+void DeleteContainerPageCommand::unexecute()
+{
+ if ( !wiface || !wiface->supportsPages( wClassName ) )
+ return;
+ if ( index == -1 )
+ index = wiface->count( wClassName, container );
+
+ wiface->insertPage( wClassName, container, pageLabel, index, page );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ // #### show and update pages in object hierarchy view
+}
+
+// ------------------------------------------------------------
+
+RenameContainerPageCommand::RenameContainerPageCommand( const QString &n, FormWindow *fw,
+ QWidget *c, int idx,
+ const QString &label )
+ : Command( n, fw ), container( c ), index( idx ), newLabel( label )
+{
+ WidgetInterface *iface = 0;
+ widgetManager()->queryInterface( WidgetFactory::classNameOf( container ), &iface );
+ if ( !iface )
+ return;
+ iface->queryInterface( IID_QWidgetContainer, (QUnknownInterface**)&wiface );
+ if ( !wiface )
+ return;
+ wClassName = WidgetFactory::classNameOf( container );
+ oldLabel = wiface->pageLabel( wClassName, container, index );
+}
+
+RenameContainerPageCommand::~RenameContainerPageCommand()
+{
+ if ( wiface )
+ wiface->release();
+}
+
+void RenameContainerPageCommand::execute()
+{
+ if ( !wiface || !wiface->supportsPages( wClassName ) )
+ return;
+ wiface->renamePage( wClassName, container, index, newLabel );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ // #### show and update pages in object hierarchy view
+}
+
+void RenameContainerPageCommand::unexecute()
+{
+ if ( !wiface || !wiface->supportsPages( wClassName ) )
+ return;
+ wiface->renamePage( wClassName, container, index, oldLabel );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ // #### show and update pages in object hierarchy view
+}
+#endif // QT_CONTAINER_CUSTOM_WIDGETS
+// ------------------------------------------------------------
+
+AddActionToPopupCommand::AddActionToPopupCommand( const QString &n,
+ FormWindow *fw,
+ PopupMenuEditor *m,
+ PopupMenuEditorItem *i,
+ int idx )
+ : Command( n, fw ), menu( m ), item( i ), index( idx )
+{ }
+
+void AddActionToPopupCommand::execute()
+{
+ menu->insert( item, index );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void AddActionToPopupCommand::unexecute()
+{
+ item->hideMenu();
+ int i = menu->find( item->action() );
+ menu->remove( i );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+RemoveActionFromPopupCommand::RemoveActionFromPopupCommand( const QString &n,
+ FormWindow *fw,
+ PopupMenuEditor *m,
+ int idx )
+ : AddActionToPopupCommand( n, fw, m, 0, idx )
+{
+ item = menu->at( index );
+}
+
+void RemoveActionFromPopupCommand::execute()
+{
+ AddActionToPopupCommand::unexecute();
+}
+
+void RemoveActionFromPopupCommand::unexecute()
+{
+ AddActionToPopupCommand::execute();
+}
+
+// ------------------------------------------------------------
+
+ExchangeActionInPopupCommand::ExchangeActionInPopupCommand( const QString &n,
+ FormWindow *fw,
+ PopupMenuEditor *m,
+ int a,
+ int b )
+ : Command( n, fw ), menu( m ), c( a ), d( b )
+{ }
+
+void ExchangeActionInPopupCommand::execute()
+{
+ menu->exchange( c, d );
+}
+
+void ExchangeActionInPopupCommand::unexecute()
+{
+ execute();
+}
+
+// ------------------------------------------------------------
+
+ActionEditor *ActionCommand::actionEditor()
+{
+ // FIXME: handle multiple action editors
+ return (ActionEditor *) formWindow()->mainWindow()->child( 0, "ActionEditor" );
+}
+
+// ------------------------------------------------------------
+
+RenameActionCommand::RenameActionCommand( const QString &n,
+ FormWindow *fw,
+ QAction *a,
+ PopupMenuEditor *m,
+ QString nm )
+ : ActionCommand( n, fw, a ), menu( m ), newName( nm )
+{
+ oldName = action->menuText();
+}
+
+void RenameActionCommand::execute()
+{
+ QString actionText = newName;
+ actionText.replace("&&", "&");
+ QString menuText = newName;
+ action->setText( actionText );
+ action->setMenuText( menuText );
+
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void RenameActionCommand::unexecute()
+{
+ action->setMenuText( oldName );
+ action->setText( oldName );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+SetActionIconsCommand::SetActionIconsCommand( const QString &n,
+ FormWindow *fw,
+ QAction *a,
+ PopupMenuEditor *m,
+ QIconSet &icons )
+ : ActionCommand( n, fw, a ), menu( m ), newIcons( icons )
+{
+ oldIcons = a->iconSet();
+}
+
+void SetActionIconsCommand::execute()
+{
+ action->setIconSet( newIcons );
+ ActionEditor *ae = actionEditor();
+ if ( ae )
+ ae->updateActionIcon( action );
+ MetaDataBase::setPropertyChanged( action, "iconSet", TRUE );
+}
+
+void SetActionIconsCommand::unexecute()
+{
+ action->setIconSet( oldIcons );
+ ActionEditor *ae = actionEditor();
+ if ( ae )
+ ae->updateActionIcon( action );
+ MetaDataBase::setPropertyChanged( action, "iconSet", TRUE );
+}
+
+// ------------------------------------------------------------
+
+AddMenuCommand::AddMenuCommand( const QString &n,
+ FormWindow *fw,
+ MenuBarEditor *b,
+ MenuBarEditorItem *i,
+ int idx )
+ : Command( n, fw ), mb( b ), item( i ), name( 0 ), index( idx )
+{ }
+
+AddMenuCommand::AddMenuCommand( const QString &n,
+ FormWindow *fw,
+ QMainWindow *mw,
+ const QString &nm )
+ : Command( n, fw ), mb( 0 ), item( 0 ), name( nm ), index( -1 )
+{
+ if ( mw )
+ mb = (MenuBarEditor *)mw->child( 0, "MenuBarEditor" );
+}
+
+void AddMenuCommand::execute()
+{
+ QString n;
+ QMainWindow *mw = (QMainWindow*)formWindow()->mainContainer();
+ if ( !mb ) {
+ mb = new MenuBarEditor( formWindow(), mw );
+ mb->setName( "MenuBarEditor" );
+ formWindow()->insertWidget( mb, TRUE );
+ }
+ if ( !item ) {
+ PopupMenuEditor *popup = new PopupMenuEditor( formWindow(), mw );
+ popup->setName( "PopupMenuEditor" );
+ formWindow()->insertWidget( popup, TRUE );
+ mb->insertItem( name, popup, index );
+ index = mb->findItem( popup );
+ item = mb->item( index );
+ } else {
+ PopupMenuEditor *popup = item->menu();
+ popup->setName( item->menuText() );
+ formWindow()->insertWidget( popup, TRUE );
+ mb->insertItem( item, index );
+ }
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void AddMenuCommand::unexecute()
+{
+ if ( !item ) {
+ qWarning( "The AddMenuCommand was created without a menu item." );
+ return;
+ }
+ item->menu()->hide();
+ int i = mb->findItem( item );
+ formWindow()->removeWidget( item->menu() );
+ mb->removeItemAt( i );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+RemoveMenuCommand::RemoveMenuCommand( const QString &n,
+ FormWindow *fw,
+ MenuBarEditor *b,
+ int idx )
+ : AddMenuCommand( n, fw, b, 0, idx )
+{
+ item = mb->item( index );
+}
+
+void RemoveMenuCommand::execute()
+{
+ mb->hideItem( index );
+ AddMenuCommand::unexecute();
+}
+
+void RemoveMenuCommand::unexecute()
+{
+ AddMenuCommand::execute();
+}
+
+// ------------------------------------------------------------
+
+ExchangeMenuCommand::ExchangeMenuCommand( const QString &n,
+ FormWindow *fw,
+ MenuBarEditor *b,
+ int i,
+ int j )
+ : Command( n, fw ), bar( b ), k( i ), l( j )
+{ }
+
+void ExchangeMenuCommand::execute()
+{
+ bar->exchange( k, l );
+}
+
+void ExchangeMenuCommand::unexecute()
+{
+ execute();
+}
+
+// ------------------------------------------------------------
+
+MoveMenuCommand::MoveMenuCommand( const QString &n,
+ FormWindow *fw,
+ MenuBarEditor *b,
+ int i,
+ int j )
+ : Command( n, fw ), bar( b ), from( i ), to( j )
+{ }
+
+void MoveMenuCommand::execute()
+{
+ bar->hideItem( from );
+ MenuBarEditorItem * i = bar->item( from );
+ bar->removeItemAt( from );
+ int t = ( from > to ? to : to - 1 );
+ bar->insertItem( i, t );
+}
+
+void MoveMenuCommand::unexecute()
+{
+ bar->hideItem( to );
+ int t = ( from > to ? to : to - 1 );
+ MenuBarEditorItem * i = bar->item( t );
+ bar->removeItemAt( t );
+ bar->insertItem( i, from );
+}
+
+// ------------------------------------------------------------
+
+RenameMenuCommand::RenameMenuCommand( const QString &n,
+ FormWindow *fw,
+ MenuBarEditor *b,
+ QString nm,
+ MenuBarEditorItem *i )
+ : Command( n, fw ), bar( b ), item( i ), newName( nm )
+{
+ oldName = item->menu()->name();
+}
+
+QString RenameMenuCommand::makeLegal( const QString &str )
+{
+ // remove illegal characters
+ QString d;
+ char c = 0, i = 0;
+ while ( !str.at(i).isNull() ) {
+ c = str.at(i).latin1();
+ if ( c == '-' || c == ' ' )
+ d += '_';
+ else if ( ( c >= '0' && c <= '9') || ( c >= 'A' && c <= 'Z' )
+ || c == '_' || ( c >= 'a' && c <= 'z' ) )
+ d += c;
+ ++i;
+ }
+ return d;
+}
+
+void RenameMenuCommand::execute()
+{
+ PopupMenuEditor *popup = item->menu();
+ item->setMenuText( newName );
+ QString legal = makeLegal( newName );
+ formWindow()->unify( popup, legal, TRUE );
+ popup->setName( legal );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void RenameMenuCommand::unexecute()
+{
+ PopupMenuEditor *popup = item->menu();
+ item->setMenuText( oldName );
+ popup->setName( oldName );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+AddToolBoxPageCommand::AddToolBoxPageCommand( const QString &n, FormWindow *fw,
+ QToolBox *tw, const QString &label )
+ : Command( n, fw ), toolBox( tw ), toolBoxLabel( label )
+{
+ toolBoxPage = new QDesignerWidget( formWindow(), toolBox, "page" );
+ toolBoxPage->hide();
+ index = -1;
+ MetaDataBase::addEntry( toolBoxPage );
+}
+
+void AddToolBoxPageCommand::execute()
+{
+ index = toolBox->insertItem( index, toolBoxPage, toolBoxLabel);
+ toolBox->setCurrentIndex( index );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void AddToolBoxPageCommand::unexecute()
+{
+ toolBox->removeItem( toolBoxPage );
+ toolBoxPage->hide();
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+// ------------------------------------------------------------
+
+DeleteToolBoxPageCommand::DeleteToolBoxPageCommand( const QString &n, FormWindow *fw,
+ QToolBox *tw, QWidget *page )
+ : Command( n, fw ), toolBox( tw ), toolBoxPage( page )
+{
+ toolBoxLabel = toolBox->itemLabel( toolBox->currentIndex() );
+ index = toolBox->currentIndex();
+}
+
+void DeleteToolBoxPageCommand::execute()
+{
+ toolBox->removeItem( toolBoxPage );
+ toolBoxPage->hide();
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
+
+void DeleteToolBoxPageCommand::unexecute()
+{
+ index = toolBox->insertItem( index, toolBoxPage, toolBoxLabel );
+ toolBox->setCurrentIndex( index );
+ formWindow()->emitUpdateProperties( formWindow()->currentWidget() );
+ formWindow()->mainWindow()->objectHierarchy()->rebuild();
+}
diff --git a/tools/designer/designer/command.h b/tools/designer/designer/command.h
new file mode 100644
index 0000000..a1f5620
--- /dev/null
+++ b/tools/designer/designer/command.h
@@ -0,0 +1,1266 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef COMMAND_H
+#define COMMAND_H
+
+#include "metadatabase.h"
+#include "layout.h"
+
+#include <qstring.h>
+#include <qrect.h>
+#include <qvaluelist.h>
+#include <qvariant.h>
+#include <qobject.h>
+#include <qlistview.h>
+#include <qptrlist.h>
+#include <qmap.h>
+#include <qiconset.h>
+
+class QWizard;
+class QTabWidget;
+class Command;
+class QWidget;
+class FormWindow;
+class PropertyEditor;
+class QListBox;
+class QIconView;
+class QTable;
+class QAction;
+class QDesignerToolBar;
+class QMainWindow;
+class QTextEdit;
+struct LanguageInterface;
+class QToolBox;
+
+class MenuBarEditor;
+class MenuBarEditorItem;
+class PopupMenuEditor;
+class PopupMenuEditorItem;
+class ActionEditor;
+
+class Command : public Qt
+{
+public:
+ Command( const QString &n, FormWindow *fw );
+ virtual ~Command();
+
+ enum Type {
+ Resize,
+ Insert,
+ Move,
+ Delete,
+ SetProperty,
+ LayoutHorizontal,
+ LayoutVertical,
+ LayoutHorizontalSplitter,
+ LayoutVerticalSplitter,
+ LayoutGrid,
+ BreakLayout,
+ Macro,
+ AddTabPage,
+ DeleteTabPage,
+ MoveTabPage,
+ AddWidgetStackPage,
+ DeleteWidgetStackPage,
+ AddWizardPage,
+ DeleteWizardPage,
+ SwapWizardPages,
+ MoveWizardPage,
+ RenameWizardPage,
+ AddConnection,
+ RemoveConnection,
+ Lower,
+ Raise,
+ Paste,
+ TabOrder,
+ PopulateListBox,
+ PopulateIconView,
+ PopulateListView,
+ PopulateMultiLineEdit,
+ PopulateTable,
+ AddActionToToolBar,
+ RemoveActionFromToolBar,
+ AddToolBar,
+ RemoveToolBar,
+ AddFunction,
+ ChangeFunctionAttrib,
+ RemoveFunction,
+ AddVariable,
+ SetVariables,
+ RemoveVariable,
+ EditDefinitions,
+ AddContainerPage,
+ DeleteContainerPage,
+ RenameContainerPage,
+ AddActionToPopup,
+ RemoveActionFromPopup,
+ ExchangeActionInPopup,
+ //MoveActionInPopup,
+ RenameAction,
+ SetActionIcons,
+ AddMenu,
+ RemoveMenu,
+ ExchangeMenu,
+ MoveMenu,
+ RenameMenu,
+ AddToolBoxPage,
+ DeleteToolBoxPage
+ };
+
+ QString name() const;
+
+ virtual void execute() = 0;
+ virtual void unexecute() = 0;
+ virtual Type type() const = 0;
+ virtual void merge( Command *c );
+ virtual bool canMerge( Command *c );
+
+ FormWindow *formWindow() const;
+
+private:
+ QString cmdName;
+ FormWindow *formWin;
+
+};
+
+class CommandHistory : public QObject
+{
+ Q_OBJECT
+
+public:
+ CommandHistory( int s );
+
+ void addCommand( Command *cmd, bool tryCompress = FALSE );
+ void undo();
+ void redo();
+
+ void emitUndoRedo();
+
+ void setModified( bool m );
+ bool isModified() const;
+
+public slots:
+ void checkCompressedCommand();
+
+signals:
+ void undoRedoChanged( bool undoAvailable, bool redoAvailable,
+ const QString &undoCmd, const QString &redoCmd );
+ void modificationChanged( bool m );
+
+private:
+ QPtrList<Command> history;
+ int current, steps;
+ bool modified;
+ int savedAt;
+ Command *compressedCommand;
+
+};
+
+class ResizeCommand : public Command
+{
+public:
+ ResizeCommand( const QString &n, FormWindow *fw,
+ QWidget *w, const QRect &oldr, const QRect &nr );
+
+ void execute();
+ void unexecute();
+ Type type() const { return Resize; }
+
+private:
+ QWidget *widget;
+ QRect oldRect, newRect;
+
+};
+
+class InsertCommand : public Command
+{
+public:
+ InsertCommand( const QString &n, FormWindow *fw, QWidget *w, const QRect &g );
+
+ void execute();
+ void unexecute();
+ Type type() const { return Insert; }
+
+private:
+ QWidget *widget;
+ QRect geometry;
+
+};
+
+class MoveCommand : public Command
+{
+public:
+ MoveCommand( const QString &n, FormWindow *fw,
+ const QWidgetList &w,
+ const QValueList<QPoint> op,
+ const QValueList<QPoint> np,
+ QWidget *opr, QWidget *npr );
+ void execute();
+ void unexecute();
+ Type type() const { return Move; }
+ void merge( Command *c );
+ bool canMerge( Command *c );
+
+private:
+ QWidgetList widgets;
+ QValueList<QPoint> oldPos, newPos;
+ QWidget *oldParent, *newParent;
+
+};
+
+class DeleteCommand : public Command
+{
+public:
+ DeleteCommand( const QString &n, FormWindow *fw,
+ const QWidgetList &w );
+ void execute();
+ void unexecute();
+ Type type() const { return Delete; }
+
+private:
+ QWidgetList widgets;
+ QMap< QWidget*, QValueList<MetaDataBase::Connection> > connections;
+
+};
+
+class SetPropertyCommand : public Command
+{
+public:
+ SetPropertyCommand( const QString &n, FormWindow *fw,
+ QObject *w, PropertyEditor *e,
+ const QString &pn, const QVariant &ov,
+ const QVariant &nv, const QString &ncut,
+ const QString &ocut,
+ bool reset = FALSE );
+
+ void execute();
+ void unexecute();
+ Type type() const { return SetProperty; }
+ void merge( Command *c );
+ bool canMerge( Command *c );
+ bool checkProperty();
+
+private:
+ void setProperty( const QVariant &v, const QString &currentItemText, bool select = TRUE );
+
+ QGuardedPtr<QObject> widget;
+ PropertyEditor *editor;
+ QString propName;
+ QVariant oldValue, newValue;
+ QString oldCurrentItemText, newCurrentItemText;
+ bool wasChanged;
+ bool isResetCommand;
+
+};
+
+class LayoutHorizontalCommand : public Command
+{
+public:
+ LayoutHorizontalCommand( const QString &n, FormWindow *fw,
+ QWidget *parent, QWidget *layoutBase,
+ const QWidgetList &wl );
+
+ void execute();
+ void unexecute();
+ Type type() const { return LayoutHorizontal; }
+
+private:
+ HorizontalLayout layout;
+
+};
+
+class LayoutHorizontalSplitCommand : public Command
+{
+public:
+ LayoutHorizontalSplitCommand( const QString &n, FormWindow *fw,
+ QWidget *parent, QWidget *layoutBase,
+ const QWidgetList &wl );
+
+ void execute();
+ void unexecute();
+ Type type() const { return LayoutHorizontalSplitter; }
+
+private:
+ HorizontalLayout layout;
+
+};
+
+class LayoutVerticalCommand : public Command
+{
+public:
+ LayoutVerticalCommand( const QString &n, FormWindow *fw,
+ QWidget *parent, QWidget *layoutBase,
+ const QWidgetList &wl );
+
+ void execute();
+ void unexecute();
+ Type type() const { return LayoutVertical; }
+
+private:
+ VerticalLayout layout;
+
+};
+
+class LayoutVerticalSplitCommand : public Command
+{
+public:
+ LayoutVerticalSplitCommand( const QString &n, FormWindow *fw,
+ QWidget *parent, QWidget *layoutBase,
+ const QWidgetList &wl );
+
+ void execute();
+ void unexecute();
+ Type type() const { return LayoutVerticalSplitter; }
+
+private:
+ VerticalLayout layout;
+
+};
+
+class LayoutGridCommand : public Command
+{
+public:
+ LayoutGridCommand( const QString &n, FormWindow *fw,
+ QWidget *parent, QWidget *layoutBase,
+ const QWidgetList &wl, int xres, int yres );
+
+ void execute();
+ void unexecute();
+ Type type() const { return LayoutGrid; }
+
+private:
+ GridLayout layout;
+
+};
+
+class BreakLayoutCommand : public Command
+{
+public:
+ BreakLayoutCommand( const QString &n, FormWindow *fw,
+ QWidget *layoutBase, const QWidgetList &wl );
+
+ void execute();
+ void unexecute();
+ Type type() const { return BreakLayout; }
+
+private:
+ Layout *layout;
+ int spacing;
+ int margin;
+ QWidget *lb;
+ QWidgetList widgets;
+
+};
+
+class MacroCommand : public Command
+{
+public:
+ MacroCommand( const QString &n, FormWindow *fw,
+ const QPtrList<Command> &cmds );
+
+ void execute();
+ void unexecute();
+ Type type() const { return Macro; }
+
+private:
+ QPtrList<Command> commands;
+
+};
+
+class AddTabPageCommand : public Command
+{
+public:
+ AddTabPageCommand( const QString &n, FormWindow *fw,
+ QTabWidget *tw, const QString &label );
+
+ void execute();
+ void unexecute();
+ Type type() const { return AddTabPage; }
+
+private:
+ QTabWidget *tabWidget;
+ int index;
+ QWidget *tabPage;
+ QString tabLabel;
+
+};
+
+class DeleteTabPageCommand : public Command
+{
+public:
+ DeleteTabPageCommand( const QString &n, FormWindow *fw,
+ QTabWidget *tw, QWidget *page );
+
+ void execute();
+ void unexecute();
+ Type type() const { return DeleteTabPage; }
+
+private:
+ QTabWidget *tabWidget;
+ int index;
+ QWidget *tabPage;
+ QString tabLabel;
+
+};
+
+class MoveTabPageCommand : public Command
+{
+public:
+ MoveTabPageCommand(const QString &n, FormWindow *fw,
+ QTabWidget *tw, QWidget *page, const QString& label, int nIndex, int oIndex );
+
+ void execute();
+ void unexecute();
+ Type type() const { return MoveTabPage; }
+
+private:
+ QTabWidget *tabWidget;
+ int newIndex, oldIndex;
+ QWidget *tabPage;
+ QString tabLabel;
+
+};
+class QDesignerWidgetStack;
+class AddWidgetStackPageCommand : public Command
+{
+public:
+ AddWidgetStackPageCommand( const QString &n, FormWindow *fw,
+ QDesignerWidgetStack *ws );
+
+ void execute();
+ void unexecute();
+ Type type() const { return AddWidgetStackPage; }
+
+private:
+ QDesignerWidgetStack *widgetStack;
+ int index;
+ QWidget *stackPage;
+};
+
+class DeleteWidgetStackPageCommand : public Command
+{
+public:
+ DeleteWidgetStackPageCommand( const QString &n, FormWindow *fw,
+ QDesignerWidgetStack *ws, QWidget *page );
+
+ void execute();
+ void unexecute();
+ Type type() const { return DeleteWidgetStackPage; }
+
+private:
+ QDesignerWidgetStack *widgetStack;
+ int index;
+ QWidget *stackPage;
+};
+
+
+
+class AddWizardPageCommand : public Command
+{
+public:
+ AddWizardPageCommand( const QString &n, FormWindow *fw,
+ QWizard *w, const QString &label, int index = -1, bool show = TRUE );
+
+ void execute();
+ void unexecute();
+ Type type() const { return AddWizardPage; }
+
+private:
+ QWizard *wizard;
+ int index;
+ bool show;
+ QWidget *page;
+ QString pageLabel;
+
+};
+
+class DeleteWizardPageCommand : public Command
+{
+public:
+ DeleteWizardPageCommand( const QString &n, FormWindow *fw,
+ QWizard *w, int index, bool show = TRUE );
+
+ void execute();
+ void unexecute();
+ Type type() const { return DeleteWizardPage; }
+
+private:
+ QWizard *wizard;
+ int index;
+ bool show;
+ QWidget *page;
+ QString pageLabel;
+
+};
+
+class RenameWizardPageCommand : public Command
+{
+public:
+ RenameWizardPageCommand( const QString &n, FormWindow *fw,
+ QWizard *w, int index, const QString& name );
+
+ void execute();
+ void unexecute();
+ Type type() const { return RenameWizardPage; }
+
+private:
+ QWizard *wizard;
+ int index;
+ QWidget *page;
+ QString label;
+
+};
+
+class SwapWizardPagesCommand : public Command
+{
+public:
+ SwapWizardPagesCommand( const QString &n, FormWindow *fw,
+ QWizard *w, int index1, int index2 );
+
+ void execute();
+ void unexecute();
+ Type type() const { return SwapWizardPages; }
+
+private:
+ QWizard *wizard;
+ int index1, index2;
+
+};
+
+class MoveWizardPageCommand : public Command
+{
+public:
+ MoveWizardPageCommand( const QString &n, FormWindow *fw,
+ QWizard *w, int index1, int index2 );
+
+ void execute();
+ void unexecute();
+ Type type() const { return MoveWizardPage; }
+
+private:
+ QWizard *wizard;
+ int index1, index2;
+
+};
+
+class AddConnectionCommand : public Command
+{
+public:
+ AddConnectionCommand( const QString &name, FormWindow *fw,
+ MetaDataBase::Connection c );
+
+ void execute();
+ void unexecute();
+ Type type() const { return AddConnection; }
+
+private:
+ MetaDataBase::Connection connection;
+
+};
+
+class RemoveConnectionCommand : public Command
+{
+public:
+ RemoveConnectionCommand( const QString &name, FormWindow *fw,
+ MetaDataBase::Connection c );
+
+ void execute();
+ void unexecute();
+ Type type() const { return RemoveConnection; }
+
+private:
+ MetaDataBase::Connection connection;
+
+};
+
+
+class AddFunctionCommand : public Command
+{
+public:
+ AddFunctionCommand( const QString &name, FormWindow *fw, const QCString &f, const QString& spec,
+ const QString &a, const QString &t, const QString &l, const QString &rt );
+
+ void execute();
+ void unexecute();
+ Type type() const { return AddFunction; }
+
+private:
+ QCString function;
+ QString specifier;
+ QString access;
+ QString functionType;
+ QString language;
+ QString returnType;
+};
+
+class ChangeFunctionAttribCommand : public Command
+{
+public:
+ ChangeFunctionAttribCommand( const QString &name, FormWindow *fw, MetaDataBase::Function f,
+ const QString &on, const QString &os, const QString &oa,
+ const QString &ot, const QString &ol, const QString &ort );
+
+ void execute();
+ void unexecute();
+ Type type() const { return ChangeFunctionAttrib; }
+
+private:
+ QString oldName, newName;
+ QString oldSpec, newSpec;
+ QString oldAccess, newAccess;
+ QString oldType, newType;
+ QString oldLang, newLang;
+ QString oldReturnType, newReturnType;
+};
+
+class RemoveFunctionCommand : public Command
+{
+public:
+ RemoveFunctionCommand( const QString &name, FormWindow *fw, const QCString &f, const QString& spec,
+ const QString &a, const QString &t, const QString &l, const QString &rt );
+
+ void execute();
+ void unexecute();
+ Type type() const { return RemoveFunction; }
+
+private:
+ QCString function;
+ QString specifier;
+ QString access;
+ QString functionType;
+ QString language;
+ QString returnType;
+};
+
+class AddVariableCommand : public Command
+{
+public:
+ AddVariableCommand( const QString &name, FormWindow *fw, const QString &vn, const QString &a );
+ void execute();
+ void unexecute();
+ Type type() const { return AddVariable; }
+
+private:
+ QString varName;
+ QString access;
+};
+
+class SetVariablesCommand : public Command
+{
+public:
+ SetVariablesCommand( const QString &name, FormWindow *fw, QValueList<MetaDataBase::Variable> lst );
+ void execute();
+ void unexecute();
+ Type type() const { return SetVariables; }
+
+private:
+ QValueList<MetaDataBase::Variable> oldList, newList;
+};
+
+class RemoveVariableCommand : public Command
+{
+public:
+ RemoveVariableCommand( const QString &name, FormWindow *fw, const QString &vn );
+ void execute();
+ void unexecute();
+ Type type() const { return RemoveVariable; }
+
+private:
+ QString varName;
+ QString access;
+};
+
+class EditDefinitionsCommand : public Command
+{
+public:
+ EditDefinitionsCommand( const QString &name, FormWindow *fw, LanguageInterface *lf,
+ const QString &n, const QStringList &l );
+ void execute();
+ void unexecute();
+ Type type() const { return EditDefinitions; }
+
+private:
+ LanguageInterface *lIface;
+ QString defName;
+ QStringList newList, oldList;
+};
+
+class LowerCommand : public Command
+{
+public:
+ LowerCommand( const QString &name, FormWindow *fw, const QWidgetList &w );
+
+ void execute();
+ void unexecute();
+ Type type() const { return Lower; }
+
+private:
+ QWidgetList widgets;
+
+};
+
+class RaiseCommand : public Command
+{
+public:
+ RaiseCommand( const QString &name, FormWindow *fw, const QWidgetList &w );
+
+ void execute();
+ void unexecute();
+ Type type() const { return Raise; }
+
+private:
+ QWidgetList widgets;
+
+};
+
+class PasteCommand : public Command
+{
+public:
+ PasteCommand( const QString &n, FormWindow *fw, const QWidgetList &w );
+
+ void execute();
+ void unexecute();
+ Type type() const { return Paste; }
+
+private:
+ QWidgetList widgets;
+
+};
+
+class TabOrderCommand : public Command
+{
+public:
+ TabOrderCommand( const QString &n, FormWindow *fw, const QWidgetList &ol, const QWidgetList &nl );
+
+ void execute();
+ void unexecute();
+ Type type() const { return TabOrder; }
+ void merge( Command *c );
+ bool canMerge( Command *c );
+
+private:
+ QWidgetList oldOrder, newOrder;
+
+};
+
+class PopulateListBoxCommand : public Command
+{
+public:
+ struct Item
+ {
+ QString text;
+ QPixmap pix;
+ Q_DUMMY_COMPARISON_OPERATOR( Item )
+ };
+
+ PopulateListBoxCommand( const QString &n, FormWindow *fw,
+ QListBox *lb, const QValueList<Item> &items );
+ void execute();
+ void unexecute();
+ Type type() const { return PopulateListBox; }
+
+ bool operator==( const PopulateListBoxCommand & ) const;
+
+private:
+ QValueList<Item> oldItems, newItems;
+ QListBox *listbox;
+
+};
+
+class PopulateIconViewCommand : public Command
+{
+public:
+ struct Item
+ {
+ QString text;
+ QPixmap pix;
+ Q_DUMMY_COMPARISON_OPERATOR( Item )
+ };
+
+ PopulateIconViewCommand( const QString &n, FormWindow *fw,
+ QIconView *iv, const QValueList<Item> &items );
+ void execute();
+ void unexecute();
+ Type type() const { return PopulateIconView; }
+
+ bool operator==( const PopulateIconViewCommand & ) const;
+
+private:
+ QValueList<Item> oldItems, newItems;
+ QIconView *iconview;
+
+};
+
+class PopulateListViewCommand : public Command
+{
+public:
+ PopulateListViewCommand( const QString &n, FormWindow *fw,
+ QListView *lv, QListView *from );
+ void execute();
+ void unexecute();
+ Type type() const { return PopulateListView; }
+ static void transferItems( QListView *from, QListView *to );
+
+ bool operator==( const PopulateListViewCommand & ) const;
+
+private:
+ QListView *oldItems, *newItems;
+ QListView *listview;
+
+};
+
+class PopulateMultiLineEditCommand : public Command
+{
+public:
+ PopulateMultiLineEditCommand( const QString &n, FormWindow *fw,
+ QTextEdit *mle, const QString &txt );
+ void execute();
+ void unexecute();
+ Type type() const { return PopulateMultiLineEdit; }
+
+private:
+ QString newText, oldText;
+ QTextEdit *mlined;
+ bool wasChanged;
+
+};
+
+class PopulateTableCommand : public Command
+{
+public:
+ struct Row
+ {
+ QString text;
+ QPixmap pix;
+ Q_DUMMY_COMPARISON_OPERATOR( Row )
+ };
+
+ struct Column
+ {
+ QString text;
+ QPixmap pix;
+ QString field;
+ Q_DUMMY_COMPARISON_OPERATOR( Column )
+ };
+
+ PopulateTableCommand( const QString &n, FormWindow *fw, QTable *t,
+ const QValueList<Row> &rows,
+ const QValueList<Column> &columns );
+
+ void execute();
+ void unexecute();
+ Type type() const { return PopulateTable; }
+
+private:
+ QValueList<Row> oldRows, newRows;
+ QValueList<Column> oldColumns, newColumns;
+ QTable *table;
+
+};
+
+class AddActionToToolBarCommand : public Command
+{
+public:
+ AddActionToToolBarCommand( const QString &n, FormWindow *fw,
+ QAction *a, QDesignerToolBar *tb, int idx );
+
+ void execute();
+ void unexecute();
+ Type type() const { return AddActionToToolBar; }
+
+private:
+ QAction *action;
+ QDesignerToolBar *toolBar;
+ int index;
+
+};
+
+class RemoveActionFromToolBarCommand : public AddActionToToolBarCommand
+{
+public:
+ RemoveActionFromToolBarCommand( const QString &n, FormWindow *fw,
+ QAction *a, QDesignerToolBar *tb, int idx )
+ : AddActionToToolBarCommand( n, fw, a, tb, idx ) {}
+
+ void execute() { AddActionToToolBarCommand::unexecute(); }
+ void unexecute() { AddActionToToolBarCommand::execute(); }
+ Type type() const { return RemoveActionFromToolBar; }
+
+};
+
+// MenuCommands
+
+class AddToolBarCommand : public Command
+{
+public:
+ AddToolBarCommand( const QString &n, FormWindow *fw, QMainWindow *mw );
+
+ void execute();
+ void unexecute();
+ Type type() const { return AddToolBar; }
+
+protected:
+ QDesignerToolBar *toolBar;
+ QMainWindow *mainWindow;
+
+};
+
+class RemoveToolBarCommand : public AddToolBarCommand
+{
+public:
+ RemoveToolBarCommand( const QString &n, FormWindow *fw, QMainWindow *mw, QDesignerToolBar *tb )
+ : AddToolBarCommand( n, fw, mw ) { toolBar = tb; }
+
+ void execute() { AddToolBarCommand::unexecute(); }
+ void unexecute() { AddToolBarCommand::execute(); }
+ Type type() const { return RemoveToolBar; }
+
+};
+
+struct QWidgetContainerInterfacePrivate;
+
+class AddContainerPageCommand : public Command
+{
+public:
+ AddContainerPageCommand( const QString &n, FormWindow *fw,
+ QWidget *c, const QString &label );
+
+ ~AddContainerPageCommand();
+
+ void execute();
+ void unexecute();
+ Type type() const { return AddContainerPage; }
+
+private:
+ QString wClassName;
+ QWidget *container;
+ int index;
+ QString pageLabel;
+ QWidget *page;
+ QWidgetContainerInterfacePrivate *wiface;
+
+};
+
+class DeleteContainerPageCommand : public Command
+{
+public:
+ DeleteContainerPageCommand( const QString &n, FormWindow *fw,
+ QWidget *container, int index );
+ ~DeleteContainerPageCommand();
+
+ void execute();
+ void unexecute();
+ Type type() const { return DeleteContainerPage; }
+
+private:
+ QString wClassName;
+ QWidget *container;
+ int index;
+ QString pageLabel;
+ QWidget *page;
+ QWidgetContainerInterfacePrivate *wiface;
+
+};
+
+class RenameContainerPageCommand : public Command
+{
+public:
+ RenameContainerPageCommand( const QString &n, FormWindow *fw,
+ QWidget *container, int index,
+ const QString &label );
+ ~RenameContainerPageCommand();
+
+ void execute();
+ void unexecute();
+ Type type() const { return RenameContainerPage; }
+
+private:
+ QString wClassName;
+ QWidget *container;
+ int index;
+ QString oldLabel, newLabel;
+ QWidgetContainerInterfacePrivate *wiface;
+
+};
+
+class AddActionToPopupCommand : public Command
+{
+public:
+ AddActionToPopupCommand( const QString &n,
+ FormWindow *fw,
+ PopupMenuEditor *m,
+ PopupMenuEditorItem *i,
+ int idx = -1 );
+ void execute();
+ void unexecute();
+ Type type() const { return AddActionToPopup; }
+protected:
+ QString constructName() const;
+ PopupMenuEditor *menu;
+ PopupMenuEditorItem *item;
+ int index;
+private:
+};
+
+class RemoveActionFromPopupCommand : public AddActionToPopupCommand
+{
+public:
+ RemoveActionFromPopupCommand( const QString &n,
+ FormWindow *fw,
+ PopupMenuEditor *m,
+ int idx );
+ void execute();
+ void unexecute();
+ Type type() const { return RemoveActionFromPopup; }
+protected:
+private:
+};
+
+class ExchangeActionInPopupCommand : public Command
+{
+public:
+ ExchangeActionInPopupCommand( const QString &n,
+ FormWindow *fw,
+ PopupMenuEditor *m,
+ int a,
+ int b );
+ void execute();
+ void unexecute();
+ Type type() const { return ExchangeActionInPopup; }
+protected:
+private:
+ PopupMenuEditor *menu;
+ int c;
+ int d;
+};
+/*
+class MoveActionInPopupCommand : public Command
+{
+public:
+ MoveActionInPopupCommand( const QString &n,
+ FormWindow *fw,
+ PopupMenuEditor *m,
+ int a,
+ int b );
+ void execute();
+ void unexecute();
+ Type type() const { return MoveActionInPopup; }
+protected:
+private:
+ PopupMenuEditor *menu;
+ int from;
+ int to;
+};
+*/
+class ActionCommand : public Command
+{
+public:
+ ActionCommand( const QString &n,
+ FormWindow *fw,
+ QAction *a )
+ : Command( n, fw ), action( a ) { }
+ virtual Type type() const = 0;
+protected:
+ ActionEditor *actionEditor();
+ QAction *action;
+};
+
+class RenameActionCommand : public ActionCommand
+{
+public:
+ RenameActionCommand( const QString &n,
+ FormWindow *fw,
+ QAction *a,
+ PopupMenuEditor *m,
+ QString nm );
+ void execute();
+ void unexecute();
+ Type type() const { return RenameAction; }
+private:
+ PopupMenuEditor *menu;
+ QString newName;
+ QString oldName;
+};
+
+class SetActionIconsCommand : public ActionCommand
+{
+public:
+ SetActionIconsCommand( const QString &n,
+ FormWindow *fw,
+ QAction *a,
+ PopupMenuEditor *m,
+ QIconSet &icons );
+ void execute();
+ void unexecute();
+ Type type() const { return SetActionIcons; }
+protected:
+ void updateActionEditorItem();
+private:
+ PopupMenuEditor *menu;
+ QIconSet newIcons;
+ QIconSet oldIcons;
+};
+
+class AddMenuCommand : public Command
+{
+public:
+ AddMenuCommand( const QString &n,
+ FormWindow *fw,
+ MenuBarEditor *b,
+ MenuBarEditorItem *i,
+ int idx = -1 );
+
+ AddMenuCommand( const QString &n,
+ FormWindow *fw,
+ QMainWindow *mw,
+ const QString &nm = "Menu" );
+
+ void execute();
+ void unexecute();
+ Type type() const { return AddMenu; }
+protected:
+ MenuBarEditor *mb;
+ MenuBarEditorItem *item;
+ QString name;
+ int index;
+private:
+};
+
+class RemoveMenuCommand : public AddMenuCommand
+{
+public:
+ RemoveMenuCommand( const QString &n,
+ FormWindow *fw,
+ MenuBarEditor *b,
+ int idx );
+ void execute();
+ void unexecute();
+ Type type() const { return RemoveMenu; }
+protected:
+private:
+};
+
+class ExchangeMenuCommand : public Command
+{
+public:
+ ExchangeMenuCommand( const QString &n,
+ FormWindow *fw,
+ MenuBarEditor *b,
+ int i,
+ int j );
+ void execute();
+ void unexecute();
+ Type type() const { return ExchangeMenu; }
+protected:
+private:
+ MenuBarEditor *bar;
+ int k;
+ int l;
+};
+
+
+class MoveMenuCommand : public Command
+{
+public:
+ MoveMenuCommand( const QString &n,
+ FormWindow *fw,
+ MenuBarEditor *b,
+ int i,
+ int j );
+ void execute();
+ void unexecute();
+ Type type() const { return MoveMenu; }
+protected:
+private:
+ MenuBarEditor *bar;
+ int from;
+ int to;
+};
+
+class RenameMenuCommand : public Command
+{
+public:
+ RenameMenuCommand( const QString &n,
+ FormWindow *fw,
+ MenuBarEditor *m,
+ QString nm,
+ MenuBarEditorItem *i );
+ void execute();
+ void unexecute();
+ Type type() const { return RenameMenu; }
+ static QString makeLegal( const QString &str );
+private:
+ MenuBarEditor *bar;
+ MenuBarEditorItem *item;
+ QString newName;
+ QString oldName;
+};
+
+class AddToolBoxPageCommand : public Command
+{
+public:
+ AddToolBoxPageCommand( const QString &n, FormWindow *fw,
+ QToolBox *tw, const QString &label );
+
+ void execute();
+ void unexecute();
+ Type type() const { return AddToolBoxPage; }
+
+private:
+ QToolBox *toolBox;
+ int index;
+ QWidget *toolBoxPage;
+ QString toolBoxLabel;
+
+};
+
+class DeleteToolBoxPageCommand : public Command
+{
+public:
+ DeleteToolBoxPageCommand( const QString &n, FormWindow *fw,
+ QToolBox *tw, QWidget *page );
+
+ void execute();
+ void unexecute();
+ Type type() const { return DeleteToolBoxPage; }
+
+private:
+ QToolBox *toolBox;
+ int index;
+ QWidget *toolBoxPage;
+ QString toolBoxLabel;
+
+};
+
+#endif
diff --git a/tools/designer/designer/configtoolboxdialog.ui b/tools/designer/designer/configtoolboxdialog.ui
new file mode 100644
index 0000000..98a5893
--- /dev/null
+++ b/tools/designer/designer/configtoolboxdialog.ui
@@ -0,0 +1,329 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ConfigToolboxDialog</class>
+<comment>*********************************************************************
+** Copyright (C) 2002-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ConfigToolboxDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>403</width>
+ <height>467</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Configure Toolbox</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>342</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton4</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>buttonAdd</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>111</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QListView" row="0" column="0" rowspan="1" colspan="2">
+ <column>
+ <property name="text">
+ <string>Available Tools</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>listViewTools</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>Extended</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>buttonRemove</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="0" column="0" rowspan="1" colspan="4">
+ <column>
+ <property name="text">
+ <string>Common Widgets Page</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>listViewCommon</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>Extended</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="1" column="3">
+ <property name="name">
+ <cstring>buttonDown</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_down.png</pixmap>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QToolButton" row="1" column="2">
+ <property name="name">
+ <cstring>buttonUp</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_up.png</pixmap>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonAdd</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigToolboxDialog</receiver>
+ <slot>addTool()</slot>
+ </connection>
+ <connection>
+ <sender>buttonRemove</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigToolboxDialog</receiver>
+ <slot>removeTool()</slot>
+ </connection>
+ <connection>
+ <sender>buttonUp</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigToolboxDialog</receiver>
+ <slot>moveToolUp()</slot>
+ </connection>
+ <connection>
+ <sender>buttonDown</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigToolboxDialog</receiver>
+ <slot>moveToolDown()</slot>
+ </connection>
+ <connection>
+ <sender>listViewTools</sender>
+ <signal>clicked(QListViewItem*)</signal>
+ <receiver>ConfigToolboxDialog</receiver>
+ <slot>currentToolChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>listViewCommon</sender>
+ <signal>clicked(QListViewItem*)</signal>
+ <receiver>ConfigToolboxDialog</receiver>
+ <slot>currentCommonToolChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>PushButton3</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigToolboxDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton4</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigToolboxDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton3</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigToolboxDialog</receiver>
+ <slot>ok()</slot>
+ </connection>
+ <connection>
+ <sender>listViewTools</sender>
+ <signal>doubleClicked(QListViewItem*)</signal>
+ <receiver>ConfigToolboxDialog</receiver>
+ <slot>addTool()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">configtoolboxdialog.ui.h</include>
+</includes>
+<slots>
+ <slot>addTool()</slot>
+ <slot>removeTool()</slot>
+ <slot>moveToolUp()</slot>
+ <slot>moveToolDown()</slot>
+ <slot>currentToolChanged( QListViewItem * i )</slot>
+ <slot>currentCommonToolChanged( QListViewItem * i )</slot>
+ <slot>ok()</slot>
+</slots>
+<functions>
+ <function access="private">init()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/configtoolboxdialog.ui.h b/tools/designer/designer/configtoolboxdialog.ui.h
new file mode 100644
index 0000000..a98f0ee
--- /dev/null
+++ b/tools/designer/designer/configtoolboxdialog.ui.h
@@ -0,0 +1,222 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "mainwindow.h"
+#include "widgetaction.h"
+#include "listviewdnd.h"
+#include <qlistview.h>
+
+void ConfigToolboxDialog::init()
+{
+ listViewTools->setSorting( -1 );
+ listViewCommon->setSorting( -1 );
+
+ ListViewDnd *toolsDnd = new ListViewDnd( listViewTools );
+ toolsDnd->setDragMode( ListViewDnd::External | ListViewDnd::NullDrop | ListViewDnd::Flat );
+
+ ListViewDnd *commonDnd = new ListViewDnd( listViewCommon );
+ commonDnd->setDragMode( ListViewDnd::Both | ListViewDnd::Move | ListViewDnd::Flat );
+
+ QObject::connect( toolsDnd, SIGNAL( dropped( QListViewItem * ) ),
+ commonDnd, SLOT( confirmDrop( QListViewItem * ) ) );
+ QObject::connect( commonDnd, SIGNAL( dropped( QListViewItem * ) ),
+ commonDnd, SLOT( confirmDrop( QListViewItem * ) ) );
+
+ QDict<QListViewItem> groups;
+ QAction *a;
+ for ( a = MainWindow::self->toolActions.last();
+ a;
+ a = MainWindow::self->toolActions.prev() ) {
+ QString grp = ( (WidgetAction*)a )->group();
+ QListViewItem *parent = groups.find( grp );
+ if ( !parent ) {
+ parent = new QListViewItem( listViewTools );
+ parent->setText( 0, grp );
+ parent->setOpen( TRUE );
+ groups.insert( grp, parent );
+ }
+ QListViewItem *i = new QListViewItem( parent );
+ i->setText( 0, a->text() );
+ i->setPixmap( 0, a->iconSet().pixmap() );
+ }
+ for ( a = MainWindow::self->commonWidgetsPage.last(); a;
+ a = MainWindow::self->commonWidgetsPage.prev() ) {
+ QListViewItem *i = new QListViewItem( listViewCommon );
+ i->setText( 0, a->text() );
+ i->setPixmap( 0, a->iconSet().pixmap() );
+ }
+
+}
+
+
+void ConfigToolboxDialog::addTool()
+{
+ QListView *src = listViewTools;
+
+ bool addKids = FALSE;
+ QListViewItem *nextSibling = 0;
+ QListViewItem *nextParent = 0;
+ QListViewItemIterator it = src->firstChild();
+ for ( ; *it; it++ ) {
+ // Hit the nextSibling, turn of child processing
+ if ( (*it) == nextSibling )
+ addKids = FALSE;
+
+ if ( (*it)->isSelected() ) {
+ if ( (*it)->childCount() == 0 ) {
+ // Selected, no children
+ QListViewItem *i = new QListViewItem( listViewCommon, listViewCommon->lastItem() );
+ i->setText( 0, (*it)->text(0) );
+ i->setPixmap( 0, *((*it)->pixmap(0)) );
+ listViewCommon->setCurrentItem( i );
+ listViewCommon->ensureItemVisible( i );
+ } else if ( !addKids ) {
+ // Children processing not set, so set it
+ // Also find the item were we shall quit
+ // processing children...if any such item
+ addKids = TRUE;
+ nextSibling = (*it)->nextSibling();
+ nextParent = (*it)->parent();
+ while ( nextParent && !nextSibling ) {
+ nextSibling = nextParent->nextSibling();
+ nextParent = nextParent->parent();
+ }
+ }
+ } else if ( ((*it)->childCount() == 0) && addKids ) {
+ // Leaf node, and we _do_ process children
+ QListViewItem *i = new QListViewItem( listViewCommon, listViewCommon->lastItem() );
+ i->setText( 0, (*it)->text(0) );
+ i->setPixmap( 0, *((*it)->pixmap(0)) );
+ listViewCommon->setCurrentItem( i );
+ listViewCommon->ensureItemVisible( i );
+ }
+ }
+}
+
+
+void ConfigToolboxDialog::removeTool()
+{
+ QListViewItemIterator it = listViewCommon->firstChild();
+ while ( *it ) {
+ if ( (*it)->isSelected() )
+ delete (*it);
+ else
+ it++;
+ }
+}
+
+
+void ConfigToolboxDialog::moveToolUp()
+{
+ QListViewItem *next = 0;
+ QListViewItem *item = listViewCommon->firstChild();
+ for ( int i = 0; i < listViewCommon->childCount(); ++i ) {
+ next = item->itemBelow();
+ if ( item->isSelected() && (i > 0) && !item->itemAbove()->isSelected() )
+ item->itemAbove()->moveItem( item );
+ item = next;
+ }
+}
+
+
+void ConfigToolboxDialog::moveToolDown()
+{
+ int count = listViewCommon->childCount();
+ QListViewItem *next = 0;
+ QListViewItem *item = listViewCommon->lastItem();
+ for ( int i = 0; i < count; ++i ) {
+ next = item->itemAbove();
+ if ( item->isSelected() && (i > 0) && !item->itemBelow()->isSelected() )
+ item->moveItem( item->itemBelow() );
+ item = next;
+ }
+
+ // QListViewItem *item = listViewCommon->firstChild();
+ // for ( int i = 0; i < listViewCommon->childCount(); ++i ) {
+ //if ( item == listViewCommon->currentItem() ) {
+ // item->moveItem( item->itemBelow() );
+ // currentCommonToolChanged( item );
+ // break;
+ //}
+ //item = item->itemBelow();
+ // }
+}
+
+
+void ConfigToolboxDialog::currentToolChanged( QListViewItem *i )
+{
+ bool canAdd = FALSE;
+ QListViewItemIterator it = listViewTools->firstChild();
+ for ( ; *it; it++ ) {
+ if ( (*it)->isSelected() ) {
+ canAdd = TRUE;
+ break;
+ }
+ }
+ buttonAdd->setEnabled( canAdd || ( i && i->isSelected() ) );
+}
+
+
+void ConfigToolboxDialog::currentCommonToolChanged( QListViewItem *i )
+{
+ buttonUp->setEnabled( (bool) (i && i->itemAbove()) );
+ buttonDown->setEnabled( (bool) (i && i->itemBelow()) );
+
+ bool canRemove = FALSE;
+ QListViewItemIterator it = listViewCommon->firstChild();
+ for ( ; *it; it++ ) {
+ if ( (*it)->isSelected() ) {
+ canRemove = TRUE;
+ break;
+ }
+ }
+ buttonRemove->setEnabled( canRemove || ( i && i->isSelected() ) );
+}
+
+
+void ConfigToolboxDialog::ok()
+{
+ MainWindow::self->commonWidgetsPage.clear();
+ QListViewItem *item = listViewCommon->firstChild();
+ for ( int j = 0; j < listViewCommon->childCount(); item = item->itemBelow(), ++j ) {
+ QAction *a = 0;
+ for ( a = MainWindow::self->toolActions.last();
+ a;
+ a = MainWindow::self->toolActions.prev() ) {
+ if ( a->text() == item->text( 0 ) )
+ break;
+ }
+ if ( a )
+ MainWindow::self->commonWidgetsPage.insert( j, a );
+ }
+}
diff --git a/tools/designer/designer/connectiondialog.ui b/tools/designer/designer/connectiondialog.ui
new file mode 100644
index 0000000..be1bba4
--- /dev/null
+++ b/tools/designer/designer/connectiondialog.ui
@@ -0,0 +1,226 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ConnectionDialog</class>
+<comment>*********************************************************************
+** Copyright (C) 2002-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ConnectionDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>365</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>View and Edit Connections</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Connections:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>connectionsTable</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="6" column="1">
+ <property name="name">
+ <cstring>PushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="1">
+ <property name="name">
+ <cstring>PushButton7</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>buttonEditSlots</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Edit Slots...</string>
+ </property>
+ </widget>
+ <widget class="ConnectionTable" row="1" column="0" rowspan="6" colspan="1">
+ <property name="name">
+ <cstring>connectionsTable</cstring>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>ConnectionTable</class>
+ <header location="local">connectiontable.h</header>
+ <sizehint>
+ <width>50</width>
+ <height>50</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>7</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4830">789c9597c972e3480e40eff5158ec2ada203cd3549c6c41cbcc9b6bccabbddd1078014bdcb9b6449ee987f9f240072caac9e4357d6c1cf5812890490f4ef3f562e8ff6577efcfeed7d4ad3bb72a5bca5b7951fd5ece969f9c79ffffeebdbf7285a69fec7f14af4fdb76fdf47d39572e5e079326e00c10304f24ff8b9c7d463ee71d9e3aac7e31ed70d67dc2ce1cb9e7cd0e3c957863eaff778d4b3bfe8c97be781a71eaff5f8e82bf37ecfff4dc314364b58fdb966096ff6ecf77af6b70d1771b3841f1b8ef366099ff7ec17bdf8faf7970847cd12f9b2e344f8b563890f5e3a96fda0ea98c45fdc71299c765c354c67c249bb1fcd3a56ff271d8b3d9d1b271a0f1d742c725874acfe9d70eef3a9f65bc2e47fa3f16a7d55411d6a3e4e1b0e03bf349e8171144a7e49ceeb295239cb79c3384ccdff76c7b23f14c269e8ccdfa9716ef6b5b18f407857d88585e57bbf65b39f18971a0fc8fd7b6fc624f723e524f9e3d2b8d4f391d49ba74ae5bed585a3c8e49b1d6b7c929f701ca5e65feac10b9dd967c2519485a9dcaf33ce952110cea3caec23e53830f9863045b5ca79ae1c8741263cec58eb59ed390ecd3e378e8d651e44651c85527f20f51cd55eae5c1b27a1f823b9bf388c0b65b831a6b090fd24be384bc24098a6d65fb5ca29ed58fd5f35eccbaf34ff320f922819ab3e487e93d4b3d6eb9b711d4abda0f44352a685d5f39d709db2ca296c380dd2c238366ee5605c1acb3c96f2d3feff148ed25aeb0d1e955d60fd22f94a63178632df79d5d8fa95971d8b9cee5b8e647ec1d038567b40e1a4d567a9d73475b1f14ecb5a7f2cf94a9d4b343eba304e357e3814ce5c6afd22f33b2d5c6ee7295bb6fc4abda4e40af3f7d972a4f52df79bb223ebff79cb2a2736e650ce470fc2652b67b9cfb4726dff5d195776bead96adbf1e3bd67a9779928ebbfdc898357f34346ee7c3a0658d07359eba5922d7fbaebd3fdd6f6e3c567d96f9e4c22cb4780a63eb7f90f7c525596cf11c1a2791ce9bd8d869bd93e4dba55eaeefc781b1dd17ee1b9b3e4b3e9dcbfcc4107f9fc671a4ef9dcc139765763fa4f6943965947a7355b3c45eceebc65965fb851deb79655e662ecfcddf93716172999759966791f67f689ceb79e9a363951f1b9b3d1e76acf36fcf98544e529fdebc954b3f67d42ce1eb86f3465df3fb2e5c14a5d53b2b53a0f316773ad6f922f32c2fa9cd9fdc6f5e79d6f8768d13ebc79d96559fe47dcd6b8a63cdcfbb71126bfcd21f45e0f5f57dbb357691c63f342e2cbea063d597f7b808c9e6151e1993c573d1b2de0fc8fd1711151a1fdf187324f393671debfe92df22a134d67e93fb2a1cd93c05630ef4fe48f25d641c683de2b171a8f399ef3a56f989b1bd273c6dd9f697f7bcc85b7dca8da348be4f41fabf2838b1f7e9cc38d5f715e4fd2888439b9f53639ba72cf55a701b3f0c8cad3ff9de38b57c4bfd15a5678d6f646cfd87857166ef95f46b51f9fdf57c609cda7b756edcbee7ceb850a671c7faf7809e7fccb9d63b6c1b93d5f7ac63d5d7fcd41c245a8fabc685e68f1f8c49ef93e5bda4c0fbd7f9b16b4c5a9ff060ccf63e4b3d52c889c6433bc685da33195bbfc2bd31dbfc947aa5982bf37fddb1c623f39c7cbbda7c94f889cac4ea4df24f55c9367fe43da47159da3c907ea39ac74ebfdfe5fe39e0dac9f71f4abed87fb02993d42b475562effb5dcb36ff243fec3f3f327d4fd1384db5ffd68c9db1bc579cb6faf8619cdafe321f39f39f33721fb46bec4cfe699c19cf3bd6f3ad1ae7c6f2de71ce2549fe71a9dcc917c685324b7eb8aac6767ff27dc763cf92afd1b4590848c8586285e3deaafc6fd94b61346df5b1c61bbcc53bbcff9bf5808ff884136ff5acfadef70dbee02bbee13b4e71861f38c7052ef1d3af555cc375dcc04d1c6069fae47dbfe2166ee30e0e7117f7701f0ff0108f7084c77882a77886e7788197a6cf3e922baf7d8d018618618c895f293acc30c702478000403831fdd247f90e8c019450610c63a8e1066efd4f15dcc13d3cc0a3d77f8256bff2fa531cc233bcc02bbcc13b4c61061f3087052ce11356c5ff1aac9bfed8ebcf701736bc741306b005dbb00343d8853def611f0ee0d0eb1fc1e827fd0f38861338f5becfe01c2ee0d26b5ec13504de4708d12ffa7388bd2481141c64907bed020f0909604944fc8bfe924a4ca8a231d5e2fb956ee896eee8deeb3fd0e32ffa0b7ac29426f041fed4f442afdee28dde694a33faa0f9aff1d0829618d327add21aadd3066dfafd06b445dbb443c3be3eedd21eed7bfd033aa4231ad1319dd0299dd1395dd0255dfd8dff6b0a28c4042af27fcc907fafc879ed73ff199053f145bfc207463c666062e6d2dfd9d2db2db9a20b1e73cd377cfbe5be4a5fb1eb7cc7f7fcc08ffcc4137ee6177ee5377ee729cff883e7bcf8a91ed8d7f7069ef1923f7995d7789d37789307bc4557bccd3b3ce45ddefba9defc4fbebecfe1fffce305eff1fe4ff50c3ea2015e00f93dd7fcb9beae35ff5bf2da5dbf788b676f71891398c03a8c7a6b1d267effcbfff5e33fe8f7fffcebdb7f01520e2ea3</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>ConnectionDialog</receiver>
+ <slot>addConnection()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton7</sender>
+ <signal>clicked()</signal>
+ <receiver>ConnectionDialog</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton3</sender>
+ <signal>clicked()</signal>
+ <receiver>ConnectionDialog</receiver>
+ <slot>cancelClicked()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>ConnectionDialog</receiver>
+ <slot>deleteClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonEditSlots</sender>
+ <signal>clicked()</signal>
+ <receiver>ConnectionDialog</receiver>
+ <slot>editSlots()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in declaration">qptrlist.h</include>
+ <include location="local" impldecl="in declaration">connectionitems.h</include>
+ <include location="local" impldecl="in implementation">connectiondialog.ui.h</include>
+</includes>
+<variables>
+ <variable>QPtrList&lt;ConnectionContainer&gt; connections;</variable>
+ <variable>QObject *defaultSender;</variable>
+ <variable>QObject *defaultReceiver;</variable>
+</variables>
+<slots>
+ <slot>init()</slot>
+ <slot>addConnection()</slot>
+ <slot returnType="ConnectionContainer *">addConnection( QObject * sender, QObject * receiver, const QString &amp; signal, const QString &amp; slot )</slot>
+ <slot>updateConnectionState( ConnectionContainer * c )</slot>
+ <slot>okClicked()</slot>
+ <slot>cancelClicked()</slot>
+ <slot>deleteClicked()</slot>
+ <slot>editSlots()</slot>
+ <slot>setDefault( QObject * sender, QObject * receiver )</slot>
+ <slot>updateEditSlotsButton()</slot>
+ <slot>updateConnectionContainers()</slot>
+ <slot>ensureConnectionVisible()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/connectiondialog.ui.h b/tools/designer/designer/connectiondialog.ui.h
new file mode 100644
index 0000000..add7ffd
--- /dev/null
+++ b/tools/designer/designer/connectiondialog.ui.h
@@ -0,0 +1,318 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+#include "mainwindow.h"
+#include "formwindow.h"
+#include "editfunctionsimpl.h"
+
+static const char *valid_connection[] = {
+ "16 14 7 1",
+ ". c none",
+ "# c #00c000",
+ "a c #008000",
+ "b c #004000",
+ "c c #000000",
+ "d c #c0fcc0",
+ "e c #400000",
+ "...............d",
+ "..............d#",
+ ".............d#a",
+ "............d#ab",
+ "...........d#abc",
+ "..da......d#abc.",
+ ".d##a....d#abe..",
+ "cba##a..d#abc...",
+ ".cba##ad#abe....",
+ "..eba###abe.....",
+ "...cba#abc......",
+ "....cbabc.......",
+ ".....cec........",
+ "................"
+};
+
+static const char * invalid_connection[] = {
+ "17 18 7 1",
+ " c None",
+ ". c #000000",
+ "+ c #C3C3C3",
+ "@ c #FFFFFF",
+ "# c #C00000",
+ "$ c #FFC0C0",
+ "% c #FF0000",
+ " ",
+ " . ",
+ " ... ",
+ " .+.. ",
+ " ...+@+.. ",
+ "..+@@@+#.. ",
+ ".@@@@$#%#.. ",
+ ".@@$$#%##.. ",
+ " .$%%%##.... ",
+ " .%%%##. .. ",
+ " .%#.. .. ",
+ " .. .. ",
+ " .. ",
+ " .. ",
+ " .. ",
+ " .. ",
+ " ",
+ " "
+};
+
+static QPixmap *invalidConnection = 0;
+static QPixmap *validConnection = 0;
+
+void ConnectionDialog::init()
+{
+ connect( connectionsTable, SIGNAL( currentChanged( int, int ) ),
+ this, SLOT( updateEditSlotsButton() ) );
+ connect( connectionsTable, SIGNAL( resorted() ),
+ this, SLOT( updateConnectionContainers() ) );
+ buttonEditSlots->setEnabled( FALSE );
+
+ if ( !invalidConnection ) {
+ invalidConnection = new QPixmap( invalid_connection );
+ validConnection = new QPixmap( valid_connection );
+ }
+
+ QValueList<MetaDataBase::Connection> conns =
+ MetaDataBase::connections( MainWindow::self->formWindow() );
+ for ( QValueList<MetaDataBase::Connection>::Iterator it = conns.begin();
+ it != conns.end(); ++it ) {
+ ConnectionContainer *c = addConnection( (*it).sender, (*it).receiver,
+ (*it).signal, (*it).slot );
+ c->setModified( FALSE );
+ updateConnectionState( c );
+ }
+
+ defaultSender = defaultReceiver = 0;
+ connectionsTable->setCurrentCell( 0, 0 );
+}
+
+void ConnectionDialog::addConnection()
+{
+ addConnection( defaultSender, defaultReceiver, QString::null, QString::null );
+ ensureConnectionVisible();
+}
+
+ConnectionContainer *ConnectionDialog::addConnection( QObject *sender, QObject *receiver,
+ const QString &signal,
+ const QString &slot )
+{
+ connectionsTable->insertRows( connectionsTable->numRows() );
+
+ int row = connectionsTable->numRows() - 1;
+ SenderItem *se;
+ SignalItem *si;
+ ReceiverItem *re;
+ SlotItem *sl;
+ connectionsTable->setItem( row, 0,
+ ( se = new SenderItem( connectionsTable,
+ MainWindow::self->formWindow() ) ) );
+ connectionsTable->setItem( row, 1,
+ ( si = new SignalItem( connectionsTable,
+ MainWindow::self->formWindow() ) ) );
+ connectionsTable->setItem( row, 2,
+ ( re = new ReceiverItem( connectionsTable,
+ MainWindow::self->formWindow() ) ) );
+ connectionsTable->setItem( row, 3,
+ ( sl = new SlotItem( connectionsTable,
+ MainWindow::self->formWindow() ) ) );
+
+ si->setSender( se );
+ re->setSender( se );
+ sl->setSender( se );
+ se->setSender( se );
+
+ se->setSignal( si );
+ re->setSignal( si );
+ sl->setSignal( si );
+ si->setSignal( si );
+
+ se->setReceiver( re );
+ si->setReceiver( re );
+ sl->setReceiver( re );
+ re->setReceiver( re );
+
+ se->setSlot( sl );
+ si->setSlot( sl );
+ re->setSlot( sl );
+ sl->setSlot( sl );
+
+ connect( re, SIGNAL( currentReceiverChanged( QObject * ) ),
+ this, SLOT( updateEditSlotsButton() ) );
+
+ ConnectionContainer *c = new ConnectionContainer( this, se, si, re, sl, row );
+ connections.append( c );
+ connect( c, SIGNAL( changed( ConnectionContainer * ) ),
+ this, SLOT( updateConnectionState( ConnectionContainer * ) ) );
+
+ connectionsTable->setCurrentCell( row, 0 );
+
+ connectionsTable->verticalHeader()->setLabel( row, *invalidConnection, QString::null );
+
+ if ( sender )
+ se->setSenderEx( sender );
+ defaultSender = sender;
+ if ( receiver )
+ re->setReceiverEx( receiver );
+ defaultReceiver = receiver;
+
+ if ( !signal.isEmpty() && !slot.isEmpty() ) {
+ si->setCurrentItem( signal );
+ sl->signalChanged( signal );
+ sl->setCurrentItem( slot );
+ }
+
+ c->setModified( TRUE );
+ return c;
+}
+
+void ConnectionDialog::updateConnectionState( ConnectionContainer *c )
+{
+ c->repaint();
+ if ( c->isValid() )
+ connectionsTable->verticalHeader()->setLabel( c->row(),
+ *validConnection, QString::null );
+ else
+ connectionsTable->verticalHeader()->setLabel( c->row(),
+ *invalidConnection, QString::null );
+}
+
+
+void ConnectionDialog::okClicked()
+{
+ QValueList<MetaDataBase::Connection> oldConnections =
+ MetaDataBase::connections( MainWindow::self->formWindow() );
+ QPtrList<Command> newConnectionCmds;
+ QPtrList<Command> oldConnectionCmds;
+ for ( ConnectionContainer *c = connections.first(); c; c = connections.next() ) {
+ MetaDataBase::Connection conn;
+
+ // find sender widget
+ conn.sender = MainWindow::self->formWindow()->child( c->senderItem()->currentText() );
+ if ( !conn.sender ) // if no sender widget, find sender action
+ conn.sender = MainWindow::self->formWindow()->findAction( c->senderItem()->currentText() );
+
+ // find receiver widget
+ conn.receiver = MainWindow::self->formWindow()->child( c->receiverItem()->currentText() );
+ if ( !conn.receiver ) // if no receiver widget, find receiver action
+ conn.receiver = MainWindow::self->formWindow()->findAction( c->receiverItem()->currentText() );
+
+ conn.signal = c->signalItem()->currentText();
+ conn.slot = c->slotItem()->currentText();
+ AddConnectionCommand *cmd = new AddConnectionCommand( tr( "Add Signal/Slot "
+ "Connection" ),
+ MainWindow::self->formWindow(),
+ conn );
+ newConnectionCmds.append( cmd );
+ }
+
+
+ QValueList<MetaDataBase::Connection> conns =
+ MetaDataBase::connections( MainWindow::self->formWindow() );
+ for ( QValueList<MetaDataBase::Connection>::Iterator it = conns.begin();
+ it != conns.end(); ++it ) {
+ RemoveConnectionCommand *cmd = new RemoveConnectionCommand( tr( "Remove Signal/Slot "
+ "Connection" ),
+ MainWindow::self->
+ formWindow(), *it );
+ oldConnectionCmds.append( cmd );
+ }
+
+ MacroCommand *cmd1 = new MacroCommand( tr( "Add Signal/Slot Connections" ),
+ MainWindow::self->formWindow(),
+ newConnectionCmds );
+ MacroCommand *cmd2 = new MacroCommand( tr( "Remove Signal/Slot Connections" ),
+ MainWindow::self->formWindow(),
+ oldConnectionCmds );
+ QPtrList<Command> cmds;
+ cmds.append( cmd2 );
+ cmds.append( cmd1 );
+ MacroCommand *cmd = new MacroCommand( tr( "Edit Signal/Slot Connections" ),
+ MainWindow::self->formWindow(),
+ cmds );
+ MainWindow::self->formWindow()->commandHistory()->addCommand( cmd );
+ cmd->execute();
+
+ accept();
+}
+
+
+void ConnectionDialog::cancelClicked()
+{
+ reject();
+}
+
+
+void ConnectionDialog::deleteClicked()
+{
+ int cr = connectionsTable->currentRow();
+ connections.remove( cr );
+ connectionsTable->removeRow( cr );
+ int i = 0;
+ for ( ConnectionContainer *c = connections.first(); c; c = connections.next() )
+ c->setRow( i++ );
+}
+
+
+void ConnectionDialog::editSlots()
+{
+ EditFunctions dlg( this, MainWindow::self->formWindow(), TRUE );
+ dlg.exec();
+ int currentCol = connectionsTable->currentColumn();
+ connectionsTable->setCurrentCell( connectionsTable->currentRow(), 0 );
+ for ( ConnectionContainer *c = connections.first(); c; c = connections.next() ) {
+ if ( c->receiverItem()->currentText() !=
+ QString( MainWindow::self->formWindow()->mainContainer()->name() ) )
+ continue;
+ c->slotItem()->customSlotsChanged();
+ }
+ connectionsTable->setCurrentCell( connectionsTable->currentRow(), currentCol );
+}
+
+void ConnectionDialog::setDefault( QObject *sender, QObject *receiver )
+{
+ defaultSender = sender;
+ defaultReceiver = receiver;
+}
+
+void ConnectionDialog::updateEditSlotsButton()
+{
+ if ( connectionsTable->currentRow() < 0 ||
+ connectionsTable->currentRow() > (int)connections.count() - 1 )
+ return;
+ ConnectionContainer *c = connections.at( connectionsTable->currentRow() );
+ if ( !c || !c->receiverItem() )
+ return;
+ buttonEditSlots->setEnabled( c->receiverItem()->currentText() ==
+ QString( MainWindow::self->formWindow()->
+ mainContainer()->name() ) );
+}
+
+void ConnectionDialog::updateConnectionContainers()
+{
+ QPtrList<ConnectionContainer> newContainers;
+ for ( int i = 0; i < connectionsTable->numRows(); ++i ) {
+ for ( ConnectionContainer *c = connections.first(); c; c = connections.next() ) {
+ if ( c->senderItem() == connectionsTable->item( i, 0 ) ) {
+ newContainers.append( c );
+ c->setRow( i );
+ updateConnectionState(c);
+ break;
+ }
+ }
+ }
+ connections = newContainers;
+ updateEditSlotsButton();
+}
+
+void ConnectionDialog::ensureConnectionVisible()
+{
+ connectionsTable->ensureCellVisible( connectionsTable->numRows() - 1, 0 );
+}
diff --git a/tools/designer/designer/connectionitems.cpp b/tools/designer/designer/connectionitems.cpp
new file mode 100644
index 0000000..da903bd
--- /dev/null
+++ b/tools/designer/designer/connectionitems.cpp
@@ -0,0 +1,524 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "connectionitems.h"
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "metadatabase.h"
+#include "widgetfactory.h"
+#include "project.h"
+#include <qpainter.h>
+#include <qcombobox.h>
+#include <qmetaobject.h>
+#include <qcombobox.h>
+#include <qlistbox.h>
+#include <qaction.h>
+#include <qdatabrowser.h>
+
+static const char* const ignore_slots[] = {
+ "destroyed()",
+ "setCaption(const QString&)",
+ "setIcon(const QPixmap&)",
+ "setIconText(const QString&)",
+ "setMouseTracking(bool)",
+ "clearFocus()",
+ "setUpdatesEnabled(bool)",
+ "update()",
+ "update(int,int,int,int)",
+ "update(const QRect&)",
+ "repaint()",
+ "repaint(bool)",
+ "repaint(int,int,int,int,bool)",
+ "repaint(const QRect&,bool)",
+ "repaint(const QRegion&,bool)",
+ "show()",
+ "hide()",
+ "iconify()",
+ "showMinimized()",
+ "showMaximized()",
+ "showFullScreen()",
+ "showNormal()",
+ "polish()",
+ "constPolish()",
+ "raise()",
+ "lower()",
+ "stackUnder(QWidget*)",
+ "move(int,int)",
+ "move(const QPoint&)",
+ "resize(int,int)",
+ "resize(const QSize&)",
+ "setGeometry(int,int,int,int)",
+ "setGeometry(const QRect&)",
+ "focusProxyDestroyed()",
+ "showExtension(bool)",
+ "setUpLayout()",
+ "showDockMenu(const QPoint&)",
+ "init()",
+ "destroy()",
+ "deleteLater()",
+ 0
+};
+
+ConnectionItem::ConnectionItem( QTable *table, FormWindow *fw )
+ : QComboTableItem( table, QStringList(), FALSE ), formWindow( fw ), conn( 0 )
+{
+ setReplaceable( FALSE );
+}
+
+void ConnectionItem::senderChanged( QObject * )
+{
+ emit changed();
+ QWidget *w = table()->cellWidget( row(), col() );
+ if ( w )
+ setContentFromEditor( w );
+}
+
+void ConnectionItem::receiverChanged( QObject * )
+{
+ emit changed();
+ QWidget *w = table()->cellWidget( row(), col() );
+ if ( w )
+ setContentFromEditor( w );
+}
+
+void ConnectionItem::signalChanged( const QString & )
+{
+ emit changed();
+ QWidget *w = table()->cellWidget( row(), col() );
+ if ( w )
+ setContentFromEditor( w );
+}
+
+void ConnectionItem::slotChanged( const QString & )
+{
+ emit changed();
+ QWidget *w = table()->cellWidget( row(), col() );
+ if ( w )
+ setContentFromEditor( w );
+}
+
+void ConnectionItem::setSender( SenderItem *i )
+{
+ connect( i, SIGNAL( currentSenderChanged( QObject * ) ),
+ this, SLOT( senderChanged( QObject * ) ) );
+}
+
+void ConnectionItem::setReceiver( ReceiverItem *i )
+{
+ connect( i, SIGNAL( currentReceiverChanged( QObject * ) ),
+ this, SLOT( receiverChanged( QObject * ) ) );
+}
+
+void ConnectionItem::setSignal( SignalItem *i )
+{
+ connect( i, SIGNAL( currentSignalChanged( const QString & ) ),
+ this, SLOT( signalChanged( const QString & ) ) );
+}
+
+void ConnectionItem::setSlot( SlotItem *i )
+{
+ connect( i, SIGNAL( currentSlotChanged( const QString & ) ),
+ this, SLOT( slotChanged( const QString & ) ) );
+}
+
+void ConnectionItem::paint( QPainter *p, const QColorGroup &cg,
+ const QRect &cr, bool selected )
+{
+ p->fillRect( 0, 0, cr.width(), cr.height(),
+ selected ? cg.brush( QColorGroup::Highlight )
+ : cg.brush( QColorGroup::Base ) );
+
+ int w = cr.width();
+ int h = cr.height();
+
+ int x = 0;
+
+ if ( currentText()[0] == '<' )
+ p->setPen( QObject::red );
+ else if ( selected )
+ p->setPen( cg.highlightedText() );
+ else
+ p->setPen( cg.text() );
+
+ QFont f( p->font() );
+ QFont oldf( p->font() );
+ if ( conn && conn->isModified() ) {
+ f.setBold( TRUE );
+ p->setFont( f );
+ }
+
+ p->drawText( x + 2, 0, w - x - 4, h, alignment(), currentText() );
+ p->setFont( oldf );
+}
+
+void ConnectionItem::setConnection( ConnectionContainer *c )
+{
+ conn = c;
+}
+
+// ------------------------------------------------------------------
+
+static void appendChildActions( QAction *action, QStringList &lst )
+{
+ QObjectListIt it( *action->children() );
+ while ( it.current() ) {
+ QObject *o = it.current();
+ ++it;
+ if ( !::qt_cast<QAction*>(o) )
+ continue;
+ lst << o->name();
+ if ( o->children() && ::qt_cast<QActionGroup*>(o) )
+ appendChildActions( (QAction*)o, lst );
+ }
+}
+
+static QStringList flatActions( const QPtrList<QAction> &l )
+{
+ QStringList lst;
+
+ QPtrListIterator<QAction> it( l );
+ while ( it.current() ) {
+ QAction *action = it.current();
+ lst << action->name();
+ if ( action->children() && ::qt_cast<QActionGroup*>(action) )
+ appendChildActions( action, lst );
+ ++it;
+ }
+
+ return lst;
+}
+
+// ------------------------------------------------------------------
+
+SenderItem::SenderItem( QTable *table, FormWindow *fw )
+ : ConnectionItem( table, fw )
+{
+ QStringList lst;
+
+ QPtrDictIterator<QWidget> it( *formWindow->widgets() );
+ while ( it.current() ) {
+ if ( lst.find( it.current()->name() ) != lst.end() ) {
+ ++it;
+ continue;
+ }
+ if ( !QString( it.current()->name() ).startsWith( "qt_dead_widget_" ) &&
+ !::qt_cast<QLayoutWidget*>(it.current()) &&
+ !::qt_cast<Spacer*>(it.current()) &&
+ !::qt_cast<SizeHandle*>(it.current()) &&
+ qstrcmp( it.current()->name(), "central widget" ) != 0 ) {
+ lst << it.current()->name();
+ }
+ ++it;
+ }
+
+ lst += flatActions( formWindow->actionList() );
+
+ lst.prepend( "<No Sender>" );
+ lst.sort();
+ setStringList( lst );
+}
+
+QWidget *SenderItem::createEditor() const
+{
+ QComboBox *cb = (QComboBox*)ConnectionItem::createEditor();
+ cb->listBox()->setMinimumWidth( cb->fontMetrics().width( "01234567890123456789012345678901234567890123456789" ) );
+ connect( cb, SIGNAL( activated( const QString & ) ),
+ this, SLOT( senderChanged( const QString & ) ) );
+ return cb;
+}
+
+void SenderItem::setSenderEx( QObject *sender )
+{
+ setCurrentItem( sender->name() );
+ emit currentSenderChanged( sender );
+}
+
+void SenderItem::senderChanged( const QString &sender )
+{
+ QObject *o = formWindow->child( sender, "QObject" );
+ if ( !o )
+ o = formWindow->findAction( sender );
+ if ( !o )
+ return;
+ emit currentSenderChanged( o );
+}
+
+
+
+// ------------------------------------------------------------------
+
+ReceiverItem::ReceiverItem( QTable *table, FormWindow *fw )
+ : ConnectionItem( table, fw )
+{
+ QStringList lst;
+
+ QPtrDictIterator<QWidget> it( *formWindow->widgets() );
+ while ( it.current() ) {
+ if ( lst.find( it.current()->name() ) != lst.end() ) {
+ ++it;
+ continue;
+ }
+ if ( !QString( it.current()->name() ).startsWith( "qt_dead_widget_" ) &&
+ !::qt_cast<QLayoutWidget*>(it.current()) &&
+ !::qt_cast<Spacer*>(it.current()) &&
+ !::qt_cast<SizeHandle*>(it.current()) &&
+ qstrcmp( it.current()->name(), "central widget" ) != 0 ) {
+ lst << it.current()->name();
+ }
+ ++it;
+ }
+
+ lst += flatActions( formWindow->actionList() );
+
+ lst.prepend( "<No Receiver>" );
+ lst.sort();
+ setStringList( lst );
+}
+
+QWidget *ReceiverItem::createEditor() const
+{
+ QComboBox *cb = (QComboBox*)ConnectionItem::createEditor();
+ cb->listBox()->setMinimumWidth( cb->fontMetrics().width( "01234567890123456789012345678901234567890123456789" ) );
+ connect( cb, SIGNAL( activated( const QString & ) ),
+ this, SLOT( receiverChanged( const QString & ) ) );
+ return cb;
+}
+
+void ReceiverItem::setReceiverEx( QObject *receiver )
+{
+ setCurrentItem( receiver->name() );
+ emit currentReceiverChanged( receiver );
+}
+
+void ReceiverItem::receiverChanged( const QString &receiver )
+{
+ QObject *o = formWindow->child( receiver, "QObject" );
+ if ( !o )
+ o = formWindow->findAction( receiver );
+ if ( !o )
+ return;
+ emit currentReceiverChanged( o );
+}
+
+
+
+// ------------------------------------------------------------------
+
+SignalItem::SignalItem( QTable *table, FormWindow *fw )
+ : ConnectionItem( table, fw )
+{
+ QStringList lst;
+ lst << "<No Signal>";
+ lst.sort();
+ setStringList( lst );
+}
+
+void SignalItem::senderChanged( QObject *sender )
+{
+ QStrList sigs = sender->metaObject()->signalNames( TRUE );
+ sigs.remove( "destroyed()" );
+ sigs.remove( "destroyed(QObject*)" );
+ sigs.remove( "accessibilityChanged(int)" );
+ sigs.remove( "accessibilityChanged(int,int)" );
+
+ QStringList lst = QStringList::fromStrList( sigs );
+
+ if ( ::qt_cast<CustomWidget*>(sender) ) {
+ MetaDataBase::CustomWidget *w = ( (CustomWidget*)sender )->customWidget();
+ for ( QValueList<QCString>::Iterator it = w->lstSignals.begin();
+ it != w->lstSignals.end(); ++it )
+ lst << MetaDataBase::normalizeFunction( *it );
+ }
+
+ if ( sender == formWindow->mainContainer() ) {
+ QStringList extra = MetaDataBase::signalList( formWindow );
+ if ( !extra.isEmpty() )
+ lst += extra;
+ }
+
+ lst.prepend( "<No Signal>" );
+
+ lst.sort();
+ setStringList( lst );
+
+ ConnectionItem::senderChanged( sender );
+}
+
+QWidget *SignalItem::createEditor() const
+{
+ QComboBox *cb = (QComboBox*)ConnectionItem::createEditor();
+ cb->listBox()->setMinimumWidth( cb->fontMetrics().width( "01234567890123456789012345678901234567890123456789" ) );
+ connect( cb, SIGNAL( activated( const QString & ) ),
+ this, SIGNAL( currentSignalChanged( const QString & ) ) );
+ return cb;
+}
+
+// ------------------------------------------------------------------
+
+SlotItem::SlotItem( QTable *table, FormWindow *fw )
+ : ConnectionItem( table, fw )
+{
+ QStringList lst;
+ lst << "<No Slot>";
+ lst.sort();
+ setStringList( lst );
+
+ lastReceiver = 0;
+ lastSignal = "<No Signal>";
+}
+
+void SlotItem::receiverChanged( QObject *receiver )
+{
+ lastReceiver = receiver;
+ updateSlotList();
+ ConnectionItem::receiverChanged( receiver );
+}
+
+void SlotItem::signalChanged( const QString &signal )
+{
+ lastSignal = signal;
+ updateSlotList();
+ ConnectionItem::signalChanged( signal );
+}
+
+bool SlotItem::ignoreSlot( const char* slot ) const
+{
+#ifndef QT_NO_SQL
+ if ( qstrcmp( slot, "update()" ) == 0 &&
+ ::qt_cast<QDataBrowser*>(lastReceiver) )
+ return FALSE;
+#endif
+
+ for ( int i = 0; ignore_slots[i]; i++ ) {
+ if ( qstrcmp( slot, ignore_slots[i] ) == 0 )
+ return TRUE;
+ }
+
+ if ( !formWindow->isMainContainer( (QWidget*)lastReceiver ) ) {
+ if ( qstrcmp( slot, "close()" ) == 0 )
+ return TRUE;
+ }
+
+ if ( qstrcmp( slot, "setFocus()" ) == 0 )
+ if ( lastReceiver->isWidgetType() &&
+ ( (QWidget*)lastReceiver )->focusPolicy() == QWidget::NoFocus )
+ return TRUE;
+
+ return FALSE;
+}
+
+void SlotItem::updateSlotList()
+{
+ QStringList lst;
+ if ( !lastReceiver || lastSignal == "<No Signal>" ) {
+ lst << "<No Slot>";
+ lst.sort();
+ setStringList( lst );
+ return;
+ }
+
+ QString signal = MetaDataBase::normalizeFunction( lastSignal );
+ int n = lastReceiver->metaObject()->numSlots( TRUE );
+ QStringList slts;
+
+ for( int i = 0; i < n; ++i ) {
+ // accept only public slots. For the form window, also accept protected slots
+ const QMetaData* md = lastReceiver->metaObject()->slot( i, TRUE );
+ if ( ( (lastReceiver->metaObject()->slot( i, TRUE )->access == QMetaData::Public) ||
+ (formWindow->isMainContainer( (QWidget*)lastReceiver ) &&
+ lastReceiver->metaObject()->slot(i, TRUE)->access ==
+ QMetaData::Protected) ) &&
+ !ignoreSlot( md->name ) &&
+ checkConnectArgs( signal.latin1(), lastReceiver, md->name ) )
+ if ( lst.find( md->name ) == lst.end() )
+ lst << MetaDataBase::normalizeFunction( md->name );
+ }
+
+ LanguageInterface *iface =
+ MetaDataBase::languageInterface( formWindow->project()->language() );
+ if ( !iface || iface->supports( LanguageInterface::ConnectionsToCustomSlots ) ) {
+ if ( formWindow->isMainContainer( (QWidget*)lastReceiver ) ) {
+ QValueList<MetaDataBase::Function> moreSlots = MetaDataBase::slotList( formWindow );
+ if ( !moreSlots.isEmpty() ) {
+ for ( QValueList<MetaDataBase::Function>::Iterator it = moreSlots.begin();
+ it != moreSlots.end(); ++it ) {
+ QCString s = (*it).function;
+ if ( !s.data() )
+ continue;
+ s = MetaDataBase::normalizeFunction( s );
+ if ( checkConnectArgs( signal.latin1(), lastReceiver, s ) ) {
+ if ( lst.find( (*it).function ) == lst.end() )
+ lst << s;
+ }
+ }
+ }
+ }
+ }
+
+ if ( ::qt_cast<CustomWidget*>(lastReceiver) ) {
+ MetaDataBase::CustomWidget *w = ( (CustomWidget*)lastReceiver )->customWidget();
+ for ( QValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin();
+ it != w->lstSlots.end(); ++it ) {
+ QCString s = (*it).function;
+ if ( !s.data() )
+ continue;
+ s = MetaDataBase::normalizeFunction( s );
+ if ( checkConnectArgs( signal.latin1(), lastReceiver, s ) ) {
+ if ( lst.find( (*it).function ) == lst.end() )
+ lst << s;
+ }
+ }
+ }
+
+ lst.prepend( "<No Slot>" );
+ lst.sort();
+ setStringList( lst );
+}
+
+QWidget *SlotItem::createEditor() const
+{
+ QComboBox *cb = (QComboBox*)ConnectionItem::createEditor();
+ cb->listBox()->setMinimumWidth( cb->fontMetrics().width( "01234567890123456789012345678901234567890123456789" ) );
+ connect( cb, SIGNAL( activated( const QString & ) ),
+ this, SIGNAL( currentSlotChanged( const QString & ) ) );
+ return cb;
+}
+
+void SlotItem::customSlotsChanged()
+{
+ QString currSlot = currentText();
+ updateSlotList();
+ setCurrentItem( "<No Slot>" );
+ setCurrentItem( currSlot );
+ emit currentSlotChanged( currentText() );
+}
diff --git a/tools/designer/designer/connectionitems.h b/tools/designer/designer/connectionitems.h
new file mode 100644
index 0000000..f60ef2c
--- /dev/null
+++ b/tools/designer/designer/connectionitems.h
@@ -0,0 +1,227 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef CONNECTIONITEMS_H
+#define CONNECTIONITEMS_H
+
+class FormWindow;
+
+#include <qtable.h>
+
+class SenderItem;
+class ReceiverItem;
+class SignalItem;
+class SlotItem;
+class ConnectionContainer;
+
+
+class ConnectionItem : public QObject,
+ public QComboTableItem
+{
+ Q_OBJECT
+
+public:
+ ConnectionItem( QTable *table, FormWindow *fw );
+
+ void paint( QPainter *p, const QColorGroup &cg,
+ const QRect &cr, bool selected );
+
+ void setSender( SenderItem *i );
+ void setReceiver( ReceiverItem *i );
+ void setSignal( SignalItem *i );
+ void setSlot( SlotItem *i );
+ void setConnection( ConnectionContainer *c );
+
+public slots:
+ virtual void senderChanged( QObject *sender );
+ virtual void receiverChanged( QObject *receiver );
+ virtual void signalChanged( const QString &sig );
+ virtual void slotChanged( const QString &slot );
+
+signals:
+ void changed();
+
+protected:
+ FormWindow *formWindow;
+
+private:
+ ConnectionContainer *conn;
+
+};
+
+// ------------------------------------------------------------------
+
+class SenderItem : public ConnectionItem
+{
+ Q_OBJECT
+
+public:
+ SenderItem( QTable *table, FormWindow *fw );
+ QWidget *createEditor() const;
+ void setSenderEx( QObject *sender );
+
+signals:
+ void currentSenderChanged( QObject *sender );
+
+private slots:
+ void senderChanged( const QString &sender );
+
+};
+
+// ------------------------------------------------------------------
+
+class ReceiverItem : public ConnectionItem
+{
+ Q_OBJECT
+
+public:
+ ReceiverItem( QTable *table, FormWindow *fw );
+ QWidget *createEditor() const;
+ void setReceiverEx( QObject *receiver );
+
+signals:
+ void currentReceiverChanged( QObject *receiver );
+
+private slots:
+ void receiverChanged( const QString &receiver );
+
+};
+
+// ------------------------------------------------------------------
+
+class SignalItem : public ConnectionItem
+{
+ Q_OBJECT
+
+public:
+ SignalItem( QTable *table, FormWindow *fw );
+
+ void senderChanged( QObject *sender );
+ QWidget *createEditor() const;
+
+signals:
+ void currentSignalChanged( const QString & );
+
+};
+
+// ------------------------------------------------------------------
+
+class SlotItem : public ConnectionItem
+{
+ Q_OBJECT
+
+public:
+ SlotItem( QTable *table, FormWindow *fw );
+
+ void receiverChanged( QObject *receiver );
+ void signalChanged( const QString &signal );
+ QWidget *createEditor() const;
+
+ void customSlotsChanged();
+
+signals:
+ void currentSlotChanged( const QString & );
+
+private:
+ void updateSlotList();
+ bool ignoreSlot( const char* slot ) const;
+
+private:
+ QObject *lastReceiver;
+ QString lastSignal;
+
+};
+
+// ------------------------------------------------------------------
+
+class ConnectionContainer : public QObject
+{
+ Q_OBJECT
+
+public:
+ ConnectionContainer( QObject *parent, SenderItem *i1, SignalItem *i2,
+ ReceiverItem *i3, SlotItem *i4, int r )
+ : QObject( parent ), mod( FALSE ), se( i1 ), si( i2 ),
+ re( i3 ), sl( i4 ), rw ( r ) {
+ i1->setConnection( this );
+ i2->setConnection( this );
+ i3->setConnection( this );
+ i4->setConnection( this );
+ connect( i1, SIGNAL( changed() ), this, SLOT( somethingChanged() ) );
+ connect( i2, SIGNAL( changed() ), this, SLOT( somethingChanged() ) );
+ connect( i3, SIGNAL( changed() ), this, SLOT( somethingChanged() ) );
+ connect( i4, SIGNAL( changed() ), this, SLOT( somethingChanged() ) );
+ }
+
+ bool isModified() const { return mod; }
+ void setModified( bool b ) { mod = b; repaint(); }
+ bool isValid() const {
+ return se->currentText()[0] != '<' &&
+ si->currentText()[0] != '<' &&
+ re->currentText()[0] != '<' &&
+ sl->currentText()[0] != '<';
+ }
+
+ void repaint() {
+ se->table()->updateCell( se->row(), se->col() );
+ si->table()->updateCell( si->row(), si->col() );
+ re->table()->updateCell( re->row(), re->col() );
+ sl->table()->updateCell( sl->row(), sl->col() );
+ }
+
+ int row() const { return rw; }
+ void setRow( int r ) { rw = r; }
+
+ SenderItem *senderItem() const { return se; }
+ SignalItem *signalItem() const { return si; }
+ ReceiverItem *receiverItem() const { return re; }
+ SlotItem *slotItem() const { return sl; }
+
+public slots:
+ void somethingChanged() { mod = TRUE; emit changed( this ); }
+
+signals:
+ void changed( ConnectionContainer *c );
+
+private:
+ bool mod;
+ SenderItem *se;
+ SignalItem *si;
+ ReceiverItem *re;
+ SlotItem *sl;
+ int rw;
+
+};
+
+
+#endif
diff --git a/tools/designer/designer/connectiontable.cpp b/tools/designer/designer/connectiontable.cpp
new file mode 100644
index 0000000..e262f7f
--- /dev/null
+++ b/tools/designer/designer/connectiontable.cpp
@@ -0,0 +1,61 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "connectiontable.h"
+
+ConnectionTable::ConnectionTable( QWidget *parent, const char *name )
+ : QTable( 0, 4, parent, name )
+{
+ setSorting( TRUE );
+ setShowGrid( FALSE );
+ setFocusStyle( FollowStyle );
+ setSelectionMode( SingleRow );
+ horizontalHeader()->setLabel( 0, tr( "Sender" ) );
+ horizontalHeader()->setLabel( 1, tr( "Signal" ) );
+ horizontalHeader()->setLabel( 2, tr( "Receiver" ) );
+ horizontalHeader()->setLabel( 3, tr( "Slot" ) );
+ setColumnStretchable( 0, TRUE );
+ setColumnStretchable( 1, TRUE );
+ setColumnStretchable( 2, TRUE );
+ setColumnStretchable( 3, TRUE );
+}
+
+void ConnectionTable::sortColumn( int col, bool ascending, bool )
+{
+ horizontalHeader()->setSortIndicator( col, ascending );
+ if ( isEditing() )
+ endEdit( currEditRow(), currEditCol(), FALSE, FALSE );
+ QTable::sortColumn( col, ascending, TRUE );
+ setCurrentCell( 0, 0 );
+ emit resorted();
+}
diff --git a/tools/designer/designer/connectiontable.h b/tools/designer/designer/connectiontable.h
new file mode 100644
index 0000000..4d0c50e
--- /dev/null
+++ b/tools/designer/designer/connectiontable.h
@@ -0,0 +1,53 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef CONNECTIONTABLE_H
+#define CONNECTIONTABLE_H
+
+#include <qtable.h>
+
+class ConnectionTable : public QTable
+{
+ Q_OBJECT
+
+public:
+ ConnectionTable( QWidget *parent, const char *name );
+
+ void sortColumn( int col, bool ascending, bool wholeRows );
+
+signals:
+ void resorted();
+
+};
+
+#endif
diff --git a/tools/designer/designer/createtemplate.ui b/tools/designer/designer/createtemplate.ui
new file mode 100644
index 0000000..110cfc8
--- /dev/null
+++ b/tools/designer/designer/createtemplate.ui
@@ -0,0 +1,236 @@
+<!DOCTYPE UI><UI>
+<class>CreateTemplate</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget>
+ <class>QDialog</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>CreateTemplate</cstring>
+ </property>
+ <property stdset="1">
+ <name>geometry</name>
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>347</width>
+ <height>248</height>
+ </rect>
+ </property>
+ <property stdset="1">
+ <name>caption</name>
+ <string>Create Template</string>
+ </property>
+ <property stdset="1">
+ <name>sizeGripEnabled</name>
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property stdset="1">
+ <name>margin</name>
+ <number>11</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget row="0" column="0" >
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Template &amp;Name:</string>
+ </property>
+ <property>
+ <name>buddy</name>
+ <cstring>editName</cstring>
+ </property>
+ </widget>
+ <widget row="0" column="1" >
+ <class>QLineEdit</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>editName</cstring>
+ </property>
+ <property>
+ <name>toolTip</name>
+ <string>Name of the new template</string>
+ </property>
+ <property>
+ <name>whatsThis</name>
+ <string>Enter the name of the new template</string>
+ </property>
+ </widget>
+ <widget row="1" column="1" rowspan="2" colspan="1" >
+ <class>QListBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>listClass</cstring>
+ </property>
+ <property>
+ <name>toolTip</name>
+ <string>Class of the new template</string>
+ </property>
+ <property>
+ <name>whatsThis</name>
+ <string>Enter the name of the class which should be used as the template's base class</string>
+ </property>
+ </widget>
+ <widget row="3" column="0" rowspan="1" colspan="2" >
+ <class>QLayoutWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <spacer>
+ <property>
+ <name>name</name>
+ <cstring>Spacer1</cstring>
+ </property>
+ <property stdset="1">
+ <name>orientation</name>
+ <enum>Horizontal</enum>
+ </property>
+ <property stdset="1">
+ <name>sizeType</name>
+ <enum>Expanding</enum>
+ </property>
+ <property>
+ <name>sizeHint</name>
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>buttonCreate</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>C&amp;reate</string>
+ </property>
+ <property stdset="1">
+ <name>default</name>
+ <bool>true</bool>
+ </property>
+ <property>
+ <name>whatsThis</name>
+ <string>Creates the new template</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>PushButton1</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>&amp;Cancel</string>
+ </property>
+ <property>
+ <name>whatsThis</name>
+ <string>Closes the Dialog</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget row="1" column="0" >
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>&amp;Baseclass for Template:</string>
+ </property>
+ <property>
+ <name>buddy</name>
+ <cstring>listClass</cstring>
+ </property>
+ </widget>
+ <spacer row="2" column="0" >
+ <property>
+ <name>name</name>
+ <cstring>Spacer2</cstring>
+ </property>
+ <property stdset="1">
+ <name>orientation</name>
+ <enum>Vertical</enum>
+ </property>
+ <property stdset="1">
+ <name>sizeType</name>
+ <enum>Expanding</enum>
+ </property>
+ <property>
+ <name>sizeHint</name>
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonCreate</sender>
+ <signal>clicked()</signal>
+ <receiver>CreateTemplate</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>CreateTemplate</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+</UI>
diff --git a/tools/designer/designer/customwidgeteditor.ui b/tools/designer/designer/customwidgeteditor.ui
new file mode 100644
index 0000000..6f025fc
--- /dev/null
+++ b/tools/designer/designer/customwidgeteditor.ui
@@ -0,0 +1,1385 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>CustomWidgetEditorBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CustomWidgetEditorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>712</width>
+ <height>386</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Custom Widgets</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Edit Custom Widgets&lt;/b&gt;&lt;p&gt;Add or delete custom widgets from &lt;i&gt;Qt Designer&lt;/i&gt;'s database, and edit the properties of existing widgets.&lt;/p&gt;</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListBox" row="0" column="0" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>boxWidgets</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The list of all custom widgets known to Qt Designer.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>buttonNewWidget</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Widget</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Add new custom widget.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Create an empty custom widget and add it to the list.&lt;/b&gt;&lt;p&gt;New custom widgets have a default name and header file, which must both be changed to appropriate values.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>buttonDeleteWidget</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Widget</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete custom widget</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Delete the selected custom widget.&lt;/b&gt;&lt;p&gt;You can only delete widgets that are not used in any open form.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="5" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>helpButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Closes the Dialog.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>Vertical Spacing1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>buttonLoad</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Load Descriptions...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Loads widget description file</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Load Descriptions&lt;/b&gt;&lt;p&gt;Loads a file which contains descriptions of custom widgets, so that these custom widgets can be used in the Qt Designer.&lt;/p&gt;
+&lt;p&gt;Since it is a lot of work to type in all the information for custom widgets, you should consider using the createcw tool which is in $QTDIR/tools/designer/tools/createcw. Using createcw you can create custom widget description files for your custom widgets without the need to type in all the information manually. For more information about the README file in the createcw directory&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>buttonSave</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Save Descriptions...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Saves widget description file</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Save Descriptions&lt;/b&gt;&lt;p&gt;Saves all the descriptions of the shown custom widgets to a file which can then be used to import the custom widgets elsewhere.</string>
+ </property>
+ </widget>
+ <widget class="QTabWidget" row="0" column="2" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>TabWidget1</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Change the properties of the selected custom widget.</string>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget2</cstring>
+ </property>
+ <attribute name="title">
+ <string>De&amp;finition</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="2" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>previewPixmap</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonChoosePixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select a Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Select a pixmap file.&lt;/b&gt;&lt;p&gt;The pixmap will be used to represent the widget in forms.&lt;/b&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>editHeader</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enter filename</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change the header file's name for the selected custom widget.&lt;/b&gt;&lt;p&gt;The header file will be included by forms using the widget.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonChooseHeader</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Choose headerfile</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Look for the header file using a filedialog.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Global</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Local</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>localGlobalCombo</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select access</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change how the include file will be included.&lt;/b&gt;&lt;p&gt;Global include files will be included using &amp;lt;&amp;gt;-brackets, while local files will included using quotation marks.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>editClass</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change classname</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Enter the classname for the selected custom widget.&lt;/b&gt;&lt;p&gt;A class of that name must be defined in the header file.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>Label11</cstring>
+ </property>
+ <property name="text">
+ <string>Heade&amp;rfile:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editHeader</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Label10</cstring>
+ </property>
+ <property name="text">
+ <string>Cl&amp;ass:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editClass</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>Label2</cstring>
+ </property>
+ <property name="text">
+ <string>Pixmap:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>Label7</cstring>
+ </property>
+ <property name="text">
+ <string>Si&amp;ze Hint:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spinWidth</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Size P&amp;olicy</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>sizeHor</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="4" column="2">
+ <item>
+ <property name="text">
+ <string>Fixed</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Minimum</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Maximum</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Preferred</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>MinimumExpanding</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Expanding</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>sizeVer</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Vertical Sizepolicy</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose the Vertical size policy</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="3" column="1">
+ <property name="name">
+ <cstring>spinWidth</cstring>
+ </property>
+ <property name="maxValue">
+ <number>32767</number>
+ </property>
+ <property name="minValue">
+ <number>-1</number>
+ </property>
+ <property name="value">
+ <number>-1</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Size hint width</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Set the size hint for the selected widget.&lt;/b&gt;&lt;p&gt;The size hint provides the recommended size for the widget. Enter a sizehint of -1/-1 if no size is recommended.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="3" column="2">
+ <property name="name">
+ <cstring>spinHeight</cstring>
+ </property>
+ <property name="maxValue">
+ <number>32767</number>
+ </property>
+ <property name="minValue">
+ <number>-1</number>
+ </property>
+ <property name="value">
+ <number>-1</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Size hint height</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Set the size hint for the selected widget.&lt;/b&gt;&lt;p&gt;The size hint provides the recommended size for the widget. Enter a sizehint of -1/-1 if no size is recommended.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="4" column="1">
+ <item>
+ <property name="text">
+ <string>Fixed</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Minimum</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Maximum</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Preferred</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>MinimumExpanding</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Expanding</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>sizeHor</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Horizontal Sizepolicy</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose the horizontal size policy for the widget</string>
+ </property>
+ </widget>
+ <spacer row="6" column="2">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="5" column="1">
+ <property name="name">
+ <cstring>checkContainer</cstring>
+ </property>
+ <property name="text">
+ <string>Con&amp;tainer Widget</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Container Widget</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;&lt;b&gt;Container Widget&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;If this custom widget is able to contain other widgets (children), check this checkbox.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget3</cstring>
+ </property>
+ <attribute name="title">
+ <string>Si&amp;gnals</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>listSignals</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The list of all the signals that the selected widget can emit.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout40</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonAddSignal</cstring>
+ </property>
+ <property name="text">
+ <string>N&amp;ew Signal</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Add new signal</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Add a new signal for the current custom widget.&lt;/b&gt;&lt;p&gt;An argument list should be provided in the signal's name, and the name must be unique.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonRemoveSignal</cstring>
+ </property>
+ <property name="text">
+ <string>Dele&amp;te Signal</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete signal</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Delete the signal.&lt;/b&gt;&lt;p&gt;All connections using this signal will also be deleted.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout38</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;ignal:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editSignal</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>editSignal</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change signal name</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change the name of the selected slot.&lt;/b&gt;&lt;p&gt;An argument list should be provided in the signal's name, and the name must be unique.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget4</cstring>
+ </property>
+ <attribute name="title">
+ <string>S&amp;lots</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListView" row="0" column="0" rowspan="1" colspan="4">
+ <column>
+ <property name="text">
+ <string>Slot</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Access</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>listSlots</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The list of all the custom widget's slots.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Sl&amp;ot:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editSlot</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>editSlot</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change slot name</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change the name of the selected slot.&lt;/b&gt;&lt;p&gt;An argument list should be provided in the signal's name, and the name must be unique.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="2">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Access:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboAccess</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="3">
+ <item>
+ <property name="text">
+ <string>public</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>protected</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>comboAccess</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change slot access</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change the slot's access policy.&lt;/b&gt;&lt;p&gt;You can only connect to the widget's public slots.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>Layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonAddSlot</cstring>
+ </property>
+ <property name="text">
+ <string>N&amp;ew Slot</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Add new slot</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Add a new slot to the current custom widget.&lt;/b&gt;&lt;p&gt;An argument list should be provided in the signal's name, and the name must be unique.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonRemoveSlot</cstring>
+ </property>
+ <property name="text">
+ <string>Dele&amp;te Slot</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete slot</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Delete the slot.&lt;/b&gt;&lt;p&gt;All connections using this slot will also be deleted.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget5</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Properties</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>Layout7_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonAddProperty</cstring>
+ </property>
+ <property name="text">
+ <string>N&amp;ew Property</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Add new property</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Add a new property to the current custom widget.&lt;/b&gt;&lt;p&gt;The properties must be implemented in the class using Qt's property system.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonRemoveProperty</cstring>
+ </property>
+ <property name="text">
+ <string>Dele&amp;te Property</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete property</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Deletes the selected property.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QComboBox" row="2" column="3">
+ <item>
+ <property name="text">
+ <string>String</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>CString</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>StringList</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Bool</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Int</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>UInt</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Font</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Color</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Rect</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Point</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Pixmap</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Palette</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Cursor</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>SizePolicy</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>comboType</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select property type</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Select the type of the property.&lt;/b&gt;&lt;p&gt;The propertiy must be implemented in the class using Qt's property system.&lt;/p&gt;&lt;p&gt;You can use integer types to support enumeration properties in the property editor.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="0" column="0" rowspan="1" colspan="4">
+ <column>
+ <property name="text">
+ <string>Property</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>listProperties</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;The list of the current widget's properties.&lt;/b&gt;&lt;p&gt;The properties of the custom widget can be changed in the property editor.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>editProperty</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change property name</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Enter a name for the property.&lt;/b&gt;&lt;p&gt;The properties must be implemented in the class using Qt's property system.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>P&amp;roperty Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editProperty</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="2">
+ <property name="name">
+ <cstring>TextLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>T&amp;ype:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboType</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>boxWidgets</sender>
+ <signal>selectionChanged(QListBoxItem*)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>currentWidgetChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>boxWidgets</sender>
+ <signal>currentChanged(QListBoxItem*)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>currentWidgetChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>buttonNewWidget</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>addWidgetClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonDeleteWidget</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>deleteWidgetClicked()</slot>
+ </connection>
+ <connection>
+ <sender>editClass</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>classNameChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>editHeader</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>headerFileChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>spinWidth</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>widthChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>spinHeight</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>heightChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>buttonChoosePixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>pixmapChoosen()</slot>
+ </connection>
+ <connection>
+ <sender>localGlobalCombo</sender>
+ <signal>highlighted(int)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>includePolicyChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>buttonChooseHeader</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>chooseHeader()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>closeClicked()</slot>
+ </connection>
+ <connection>
+ <sender>listSignals</sender>
+ <signal>currentChanged(QListBoxItem*)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>currentSignalChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>listSignals</sender>
+ <signal>selectionChanged(QListBoxItem*)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>currentSignalChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>buttonRemoveSignal</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>removeSignal()</slot>
+ </connection>
+ <connection>
+ <sender>editSignal</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>signalNameChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>listSlots</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>currentSlotChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>listSlots</sender>
+ <signal>selectionChanged(QListViewItem*)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>currentSlotChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>buttonRemoveSlot</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>removeSlot()</slot>
+ </connection>
+ <connection>
+ <sender>editSlot</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>slotNameChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>comboAccess</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>slotAccessChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>listProperties</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>currentPropertyChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>listProperties</sender>
+ <signal>selectionChanged(QListViewItem*)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>currentPropertyChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>buttonRemoveProperty</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>removeProperty()</slot>
+ </connection>
+ <connection>
+ <sender>editProperty</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>propertyNameChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>comboType</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>propertyTypeChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>buttonLoad</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>loadDescription()</slot>
+ </connection>
+ <connection>
+ <sender>buttonSave</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>saveDescription()</slot>
+ </connection>
+ <connection>
+ <sender>sizeHor</sender>
+ <signal>activated(int)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>horDataChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>sizeVer</sender>
+ <signal>activated(int)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>verDataChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>buttonAddProperty</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>addProperty()</slot>
+ </connection>
+ <connection>
+ <sender>checkContainer</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>widgetIsContainer(bool)</slot>
+ </connection>
+ <connection>
+ <sender>buttonAddSignal</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>addSignal()</slot>
+ </connection>
+ <connection>
+ <sender>buttonAddSlot</sender>
+ <signal>clicked()</signal>
+ <receiver>CustomWidgetEditorBase</receiver>
+ <slot>addSlot()</slot>
+ </connection>
+ <slot access="protected" language="C++" returnType="void">init()</slot>
+ <slot access="protected" language="C++" returnType="void">destroy()</slot>
+ <slot access="protected" language="C++" returnType="void">addProperty()</slot>
+ <slot access="public" language="C++" returnType="void">addSignal()</slot>
+ <slot access="protected" language="C++" returnType="void">addWidgetClicked()</slot>
+ <slot access="protected" language="C++" returnType="void">chooseHeader()</slot>
+ <slot access="protected" language="C++" returnType="void">classNameChanged( const QString &amp; )</slot>
+ <slot access="protected" language="C++" returnType="void">closeClicked()</slot>
+ <slot access="protected" language="C++" returnType="void">currentPropertyChanged( QListViewItem * )</slot>
+ <slot access="protected" language="C++" returnType="void">currentSignalChanged( QListBoxItem * )</slot>
+ <slot access="protected" language="C++" returnType="void">currentSlotChanged( QListViewItem * )</slot>
+ <slot access="protected" language="C++" returnType="void">currentWidgetChanged( QListBoxItem * )</slot>
+ <slot access="protected" language="C++" returnType="void">deleteWidgetClicked()</slot>
+ <slot access="protected" language="C++" returnType="void">headerFileChanged( const QString &amp; )</slot>
+ <slot access="protected" language="C++" returnType="void">heightChanged( int )</slot>
+ <slot access="protected" language="C++" returnType="void">horDataChanged(int)</slot>
+ <slot access="protected" language="C++" returnType="void">includePolicyChanged( int )</slot>
+ <slot access="public" language="C++" returnType="void">loadDescription()</slot>
+ <slot access="public" language="C++" returnType="void">addSlot()</slot>
+ <slot access="protected" language="C++" returnType="void">pixmapChoosen()</slot>
+ <slot access="protected" language="C++" returnType="void">propertyNameChanged( const QString &amp; )</slot>
+ <slot access="protected" language="C++" returnType="void">propertyTypeChanged( const QString &amp; )</slot>
+ <slot access="protected" language="C++" returnType="void">removeProperty()</slot>
+ <slot access="protected" language="C++" returnType="void">removeSignal()</slot>
+ <slot access="protected" language="C++" returnType="void">removeSlot()</slot>
+ <slot access="protected" language="C++" returnType="void">saveDescription()</slot>
+ <slot access="protected" language="C++" returnType="void">signalNameChanged( const QString &amp; )</slot>
+ <slot access="protected" language="C++" returnType="void">slotAccessChanged( const QString &amp; )</slot>
+ <slot access="protected" language="C++" returnType="void">slotNameChanged( const QString &amp; )</slot>
+ <slot access="protected" language="C++" returnType="void">verDataChanged(int)</slot>
+ <slot access="protected" language="C++" returnType="void">widgetIsContainer(bool)</slot>
+ <slot access="protected" language="C++" returnType="void">widthChanged( int )</slot>
+</connections>
+<tabstops>
+ <tabstop>buttonCancel</tabstop>
+ <tabstop>boxWidgets</tabstop>
+ <tabstop>buttonNewWidget</tabstop>
+ <tabstop>buttonDeleteWidget</tabstop>
+ <tabstop>buttonLoad</tabstop>
+ <tabstop>buttonSave</tabstop>
+ <tabstop>TabWidget1</tabstop>
+ <tabstop>editClass</tabstop>
+ <tabstop>editHeader</tabstop>
+ <tabstop>buttonChooseHeader</tabstop>
+ <tabstop>localGlobalCombo</tabstop>
+ <tabstop>buttonChoosePixmap</tabstop>
+ <tabstop>spinWidth</tabstop>
+ <tabstop>spinHeight</tabstop>
+ <tabstop>sizeHor</tabstop>
+ <tabstop>sizeVer</tabstop>
+ <tabstop>checkContainer</tabstop>
+ <tabstop>helpButton</tabstop>
+ <tabstop>listSignals</tabstop>
+ <tabstop>buttonAddSignal</tabstop>
+ <tabstop>buttonRemoveSignal</tabstop>
+ <tabstop>editSignal</tabstop>
+ <tabstop>listSlots</tabstop>
+ <tabstop>buttonAddSlot</tabstop>
+ <tabstop>buttonRemoveSlot</tabstop>
+ <tabstop>editSlot</tabstop>
+ <tabstop>comboAccess</tabstop>
+ <tabstop>listProperties</tabstop>
+ <tabstop>buttonAddProperty</tabstop>
+ <tabstop>buttonRemoveProperty</tabstop>
+ <tabstop>editProperty</tabstop>
+ <tabstop>comboType</tabstop>
+</tabstops>
+</UI>
diff --git a/tools/designer/designer/customwidgeteditorimpl.cpp b/tools/designer/designer/customwidgeteditorimpl.cpp
new file mode 100644
index 0000000..412f50f
--- /dev/null
+++ b/tools/designer/designer/customwidgeteditorimpl.cpp
@@ -0,0 +1,845 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "customwidgeteditorimpl.h"
+#include "defs.h"
+#include "pixmapchooser.h"
+#include "mainwindow.h"
+#include "asciivalidator.h"
+#include "resource.h"
+#include "widgetfactory.h"
+#include "widgetdatabase.h"
+
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qmessagebox.h>
+#include <qfiledialog.h>
+#include <qmessagebox.h>
+#include <qtimer.h>
+#include <qapplication.h>
+#include <qlistview.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qdom.h>
+#include <qtextcodec.h>
+#include <qcheckbox.h>
+
+CustomWidgetEditor::CustomWidgetEditor( QWidget *parent, MainWindow *mw )
+ : CustomWidgetEditorBase( parent, 0, TRUE ), mainWindow( mw )
+{
+ connect( helpButton, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+ checkTimer = new QTimer( this );
+ connect( checkTimer, SIGNAL( timeout() ),
+ this, SLOT( checkWidgetName() ) );
+
+ editClass->setEnabled( FALSE );
+ editHeader->setEnabled( FALSE );
+ buttonChooseHeader->setEnabled( FALSE );
+ buttonChoosePixmap->setEnabled( FALSE );
+ spinWidth->setEnabled( FALSE );
+ spinHeight->setEnabled( FALSE );
+ sizeHor->setEnabled( FALSE );
+ sizeVer->setEnabled( FALSE );
+ checkContainer->setEnabled( FALSE );
+ localGlobalCombo->setEnabled( FALSE );
+ editClass->setValidator( new AsciiValidator( QString(":"), editClass ) );
+ editSignal->setValidator( new AsciiValidator( TRUE, editSignal ) );
+ editSlot->setValidator( new AsciiValidator( TRUE, editSignal ) );
+ editProperty->setValidator( new AsciiValidator( editSignal ) );
+ editSignal->setEnabled( FALSE );
+ buttonRemoveSignal->setEnabled( FALSE );
+
+ setupDefinition();
+ setupSignals();
+ setupSlots();
+ setupProperties();
+}
+
+void CustomWidgetEditor::setupDefinition()
+{
+ QPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets();
+ for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) {
+ QListBoxItem *i;
+ if ( w->pixmap )
+ i = new QListBoxPixmap( boxWidgets, *w->pixmap, w->className );
+ else
+ i = new QListBoxText( boxWidgets, w->className );
+ customWidgets.insert( i, w );
+ }
+
+ if ( boxWidgets->firstItem() ) {
+ boxWidgets->setCurrentItem( boxWidgets->firstItem() );
+ boxWidgets->setSelected( boxWidgets->firstItem(), TRUE );
+ }
+ oldItem = 0;
+}
+
+void CustomWidgetEditor::setupSignals()
+{
+ editSignal->setEnabled( FALSE );
+ buttonRemoveSignal->setEnabled( FALSE );
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( !w )
+ return;
+ listSignals->clear();
+ for ( QValueList<QCString>::Iterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it )
+ listSignals->insertItem( QString( *it ) );
+ if ( listSignals->firstItem() ) {
+ listSignals->setCurrentItem( listSignals->firstItem() );
+ listSignals->setSelected( listSignals->firstItem(), TRUE );
+ }
+}
+
+void CustomWidgetEditor::setupSlots()
+{
+ editSlot->setEnabled( FALSE );
+ comboAccess->setEnabled( FALSE );
+ buttonRemoveSlot->setEnabled( FALSE );
+
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( !w )
+ return;
+ listSlots->clear();
+ for ( QValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it )
+ (void)new QListViewItem( listSlots, (*it).function, (*it).access );
+
+ if ( listSlots->firstChild() ) {
+ listSlots->setCurrentItem( listSlots->firstChild() );
+ listSlots->setSelected( listSlots->firstChild(), TRUE );
+ }
+}
+
+void CustomWidgetEditor::setupProperties()
+{
+ editProperty->setEnabled( FALSE );
+ comboType->setEnabled( FALSE );
+ buttonRemoveProperty->setEnabled( FALSE );
+
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( !w )
+ return;
+ listProperties->clear();
+ for ( QValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.begin(); it != w->lstProperties.end(); ++it )
+ (void)new QListViewItem( listProperties, (*it).property, (*it).type );
+
+ if ( listProperties->firstChild() ) {
+ listProperties->setCurrentItem( listProperties->firstChild() );
+ listProperties->setSelected( listProperties->firstChild(), TRUE );
+ }
+}
+
+void CustomWidgetEditor::currentWidgetChanged( QListBoxItem *i )
+{
+ checkTimer->stop();
+ checkWidgetName();
+
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w ) {
+ buttonChooseHeader->setEnabled( FALSE );
+ editClass->setEnabled( FALSE );
+ editHeader->setEnabled( FALSE );
+ buttonChoosePixmap->setEnabled( FALSE );
+ spinWidth->setEnabled( FALSE );
+ spinHeight->setEnabled( FALSE );
+ localGlobalCombo->setEnabled( FALSE );
+ sizeHor->setEnabled( FALSE );
+ sizeVer->setEnabled( FALSE );
+ checkContainer->setEnabled( FALSE );
+ return;
+ }
+
+ buttonChooseHeader->setEnabled( TRUE );
+ editClass->setEnabled( TRUE );
+ editHeader->setEnabled( TRUE );
+ buttonChoosePixmap->setEnabled( TRUE );
+ spinWidth->setEnabled( TRUE );
+ spinHeight->setEnabled( TRUE );
+ localGlobalCombo->setEnabled( TRUE );
+ sizeHor->setEnabled( TRUE );
+ sizeVer->setEnabled( TRUE );
+ checkContainer->setEnabled( TRUE );
+
+ editClass->blockSignals( TRUE );
+ editClass->setText( w->className );
+ editClass->blockSignals( FALSE );
+ editHeader->setText( w->includeFile );
+ localGlobalCombo->setCurrentItem( (int)w->includePolicy );
+ if ( w->pixmap )
+ previewPixmap->setPixmap( *w->pixmap );
+ else
+ previewPixmap->setText( "" );
+ spinWidth->setValue( w->sizeHint.width() );
+ spinHeight->setValue( w->sizeHint.height() );
+ sizeHor->setCurrentItem( size_type_to_int( w->sizePolicy.horData() ) );
+ sizeVer->setCurrentItem( size_type_to_int( w->sizePolicy.verData() ) );
+ checkContainer->setChecked( w->isContainer );
+
+ setupSignals();
+ setupSlots();
+ setupProperties();
+}
+
+void CustomWidgetEditor::addWidgetClicked()
+{
+ oldItem = 0;
+ checkTimer->stop();
+ checkWidgetName();
+
+ MetaDataBase::CustomWidget *w = new MetaDataBase::CustomWidget;
+ QString s = w->className;
+ if ( !MetaDataBase::addCustomWidget( w ) ) {
+ QMessageBox::information( this, tr( "Adding a Custom Widget" ),
+ tr( "Custom widget names must be unique.\n"
+ "A custom widget called '%1' already exists, so it is not possible "
+ "to add another widget with this name." ).arg( s ) );
+ return;
+ }
+
+ QListBoxPixmap *i = new QListBoxPixmap( boxWidgets, *w->pixmap, w->className );
+ customWidgets.insert( i, w );
+
+ boxWidgets->setCurrentItem( i );
+ boxWidgets->setSelected( i, TRUE );
+}
+
+void CustomWidgetEditor::classNameChanged( const QString &s )
+{
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w )
+ return;
+
+ WidgetDatabase::customWidgetClassNameChanged( w->className, s );
+
+ checkTimer->stop();
+ boxWidgets->blockSignals( TRUE );
+ oldName = w->className;
+ w->className = s;
+ QListBoxItem *old = i;
+ if ( w->pixmap )
+ boxWidgets->changeItem( *w->pixmap, s, boxWidgets->currentItem() );
+ else
+ boxWidgets->changeItem( s, boxWidgets->currentItem() );
+ i = boxWidgets->item( boxWidgets->currentItem() );
+ oldItem = i;
+ customWidgets.insert( i, w );
+ customWidgets.remove( old );
+ boxWidgets->blockSignals( FALSE );
+ checkTimer->start( 1000, TRUE );
+}
+
+void CustomWidgetEditor::deleteWidgetClicked()
+{
+ oldItem = 0;
+ checkTimer->stop();
+ checkWidgetName();
+
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+
+ if ( mainWindow->isCustomWidgetUsed( w ) ) {
+ QMessageBox::information( mainWindow, tr( "Removing Custom Widget" ),
+ tr( "The custom widget '%1' is in use, so it cannot be removed." ).
+ arg( w->className ) );
+ return;
+ }
+
+ if ( !i || !w )
+ return;
+
+ MetaDataBase::CustomWidget *cw = MetaDataBase::customWidget( mainWindow->currentTool() );
+ if ( cw == w )
+ mainWindow->resetTool();
+
+ MetaDataBase::removeCustomWidget( w );
+ customWidgets.remove( i );
+ delete i;
+
+ i = boxWidgets->item( boxWidgets->currentItem() );
+ if ( i ) {
+ boxWidgets->setCurrentItem( i );
+ boxWidgets->setSelected( i, TRUE );
+ }
+}
+
+void CustomWidgetEditor::headerFileChanged( const QString &s )
+{
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w )
+ return;
+
+ w->includeFile = s;
+}
+
+void CustomWidgetEditor::heightChanged( int h )
+{
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w )
+ return;
+
+ w->sizeHint.setHeight( h );
+ updateCustomWidgetSizes();
+}
+
+void CustomWidgetEditor::includePolicyChanged( int p )
+{
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w )
+ return;
+
+ w->includePolicy = (MetaDataBase::CustomWidget::IncludePolicy)p;
+}
+
+void CustomWidgetEditor::pixmapChoosen()
+{
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w )
+ return;
+
+ QPixmap pix = qChoosePixmap( this );
+ if ( pix.isNull() )
+ return;
+ delete w->pixmap;
+ w->pixmap = new QPixmap( pix );
+
+ boxWidgets->blockSignals( TRUE );
+ QListBoxItem *old = i;
+ boxWidgets->changeItem( *w->pixmap, w->className, boxWidgets->currentItem() );
+ i = boxWidgets->item( boxWidgets->currentItem() );
+ customWidgets.insert( i, w );
+ customWidgets.remove( old );
+ boxWidgets->blockSignals( FALSE );
+ previewPixmap->setPixmap( *w->pixmap );
+}
+
+void CustomWidgetEditor::widthChanged( int wid )
+{
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w )
+ return;
+
+ w->sizeHint.setWidth( wid );
+ updateCustomWidgetSizes();
+}
+
+MetaDataBase::CustomWidget *CustomWidgetEditor::findWidget( QListBoxItem *i )
+{
+ if ( !i )
+ return 0;
+
+ QMap<QListBoxItem*, MetaDataBase::CustomWidget*>::Iterator it = customWidgets.find( i );
+ if ( it == customWidgets.end() )
+ return 0;
+ return *it;
+}
+
+void CustomWidgetEditor::chooseHeader()
+{
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w )
+ return;
+
+ QString h = QFileDialog::getOpenFileName( QString::null, tr( "Header Files (*.h *.h++ *.hxx *.hh)" ), this );
+ if ( h.isEmpty() )
+ return;
+ editHeader->setText( h );
+ localGlobalCombo->setCurrentItem( (int)MetaDataBase::CustomWidget::Global );
+}
+
+void CustomWidgetEditor::checkWidgetName()
+{
+ QListBoxItem *i = oldItem ? oldItem : boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ oldItem = 0;
+ if ( !i || !w )
+ return;
+
+ if ( MetaDataBase::isWidgetNameUsed( w ) ) {
+ QString s = w->className;
+ w->className = oldName;
+ QMessageBox::information( this, tr( "Renaming a Custom Widget" ),
+ tr( "Custom widget names must be unique.\n"
+ "A custom widget called '%1' already exists, so it is not possible "
+ "to rename this widget with this name." ).arg( s ) );
+ if ( i != boxWidgets->item( boxWidgets->currentItem() ) ) {
+ boxWidgets->setCurrentItem( i );
+ qApp->processEvents();
+ }
+ editClass->setText( w->className );
+ classNameChanged( w->className );
+ }
+}
+
+void CustomWidgetEditor::closeClicked()
+{
+ oldItem = 0;
+ checkTimer->stop();
+ checkWidgetName();
+ accept();
+}
+
+void CustomWidgetEditor::currentSignalChanged( QListBoxItem *i )
+{
+ editSignal->blockSignals( TRUE );
+ editSignal->setText( "" );
+ editSignal->blockSignals( FALSE );
+
+ if ( !i ) {
+ editSignal->setEnabled( FALSE );
+ buttonRemoveSignal->setEnabled( FALSE );
+ return;
+ }
+
+ editSignal->blockSignals( TRUE );
+ editSignal->setEnabled( TRUE );
+ buttonRemoveSignal->setEnabled( TRUE );
+ editSignal->setText( i->text() );
+ editSignal->blockSignals( FALSE );
+}
+
+void CustomWidgetEditor::addSignal()
+{
+ QListBoxItem *i = new QListBoxText( listSignals, "signal()" );
+ listSignals->setCurrentItem( i );
+ listSignals->setSelected( i, TRUE );
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( w )
+ w->lstSignals.append( i->text().latin1() );
+}
+
+void CustomWidgetEditor::removeSignal()
+{
+ QString s = listSignals->currentText();
+ delete listSignals->item( listSignals->currentItem() );
+ if ( listSignals->currentItem() != -1 )
+ listSignals->setSelected( listSignals->currentItem(), TRUE );
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( w )
+ w->lstSignals.remove( s.latin1() );
+}
+
+void CustomWidgetEditor::signalNameChanged( const QString &s )
+{
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( !w || listSignals->currentItem() == -1 )
+ return;
+
+ QValueList<QCString>::Iterator it = w->lstSignals.find( listSignals->currentText().latin1() );
+ if ( it != w->lstSignals.end() )
+ w->lstSignals.remove( it );
+ listSignals->blockSignals( TRUE );
+ listSignals->changeItem( s, listSignals->currentItem() );
+ listSignals->blockSignals( FALSE );
+ w->lstSignals.append( s.latin1() );
+}
+
+void CustomWidgetEditor::slotAccessChanged( const QString &s )
+{
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( !w || !listSlots->currentItem() )
+ return;
+
+ MetaDataBase::Function slot;
+ slot.function = listSlots->currentItem()->text( 0 );
+ slot.access = listSlots->currentItem()->text( 1 );
+ QValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.find( slot );
+ if ( it != w->lstSlots.end() )
+ w->lstSlots.remove( it );
+ listSlots->currentItem()->setText( 1, s );
+ slot.function = listSlots->currentItem()->text( 0 );
+ slot.access = listSlots->currentItem()->text( 1 );
+ w->lstSlots.append( slot );
+}
+
+void CustomWidgetEditor::slotNameChanged( const QString &s )
+{
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( !w || !listSlots->currentItem() )
+ return;
+
+ MetaDataBase::Function slot;
+ slot.function = listSlots->currentItem()->text( 0 );
+ slot.access = listSlots->currentItem()->text( 1 );
+ slot.type = "slot";
+ QValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.find( slot );
+ if ( it != w->lstSlots.end() )
+ w->lstSlots.remove( it );
+ listSlots->currentItem()->setText( 0, s );
+ slot.function = listSlots->currentItem()->text( 0 );
+ slot.access = listSlots->currentItem()->text( 1 );
+ w->lstSlots.append( slot );
+}
+
+void CustomWidgetEditor::addSlot()
+{
+ QListViewItem *i = new QListViewItem( listSlots, "slot()", "public" );
+ listSlots->setCurrentItem( i );
+ listSlots->setSelected( i, TRUE );
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( w ) {
+ MetaDataBase::Function slot;
+ slot.function = "slot()";
+ slot.access = "public";
+ slot.type = "slot";
+ w->lstSlots.append( slot );
+ }
+}
+
+void CustomWidgetEditor::removeSlot()
+{
+ MetaDataBase::Function slot;
+ slot.function = "1 2 3";
+ if ( listSlots->currentItem() ) {
+ slot.function = listSlots->currentItem()->text( 0 );
+ slot.access = listSlots->currentItem()->text( 1 );
+ }
+ delete listSlots->currentItem();
+ if ( listSlots->currentItem() )
+ listSlots->setSelected( listSlots->currentItem(), TRUE );
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( w && slot.function != "1 2 3" )
+ w->lstSlots.remove( slot );
+}
+
+void CustomWidgetEditor::currentSlotChanged( QListViewItem *i )
+{
+ editSlot->blockSignals( TRUE );
+ editSlot->setText( "" );
+ editSignal->blockSignals( FALSE );
+
+ if ( !i ) {
+ editSlot->setEnabled( FALSE );
+ comboAccess->setEnabled( FALSE );
+ buttonRemoveSlot->setEnabled( FALSE );
+ return;
+ }
+
+ editSlot->setEnabled( TRUE );
+ comboAccess->setEnabled( TRUE );
+ buttonRemoveSlot->setEnabled( TRUE );
+ editSlot->blockSignals( TRUE );
+ comboAccess->blockSignals( TRUE );
+ editSlot->setText( i->text( 0 ) );
+ if ( i->text( 1 ) == tr( "protected" ) )
+ comboAccess->setCurrentItem( 1 );
+ else
+ comboAccess->setCurrentItem( 0 );
+ editSlot->blockSignals( FALSE );
+ comboAccess->blockSignals( FALSE );
+}
+
+void CustomWidgetEditor::propertyTypeChanged( const QString &s )
+{
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( !w || !listProperties->currentItem() )
+ return;
+
+ MetaDataBase::Property property;
+ property.property = listProperties->currentItem()->text( 0 );
+ property.type = listProperties->currentItem()->text( 1 );
+ QValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.find( property );
+ if ( it != w->lstProperties.end() )
+ w->lstProperties.remove( it );
+ listProperties->currentItem()->setText( 1, s );
+ property.property = listProperties->currentItem()->text( 0 );
+ property.type = listProperties->currentItem()->text( 1 );
+ w->lstProperties.append( property );
+}
+
+void CustomWidgetEditor::propertyNameChanged( const QString &s )
+{
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( !w || !listProperties->currentItem() )
+ return;
+
+ MetaDataBase::Property property;
+ property.property = listProperties->currentItem()->text( 0 );
+ property.type = listProperties->currentItem()->text( 1 );
+ QValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.find( property );
+ if ( it != w->lstProperties.end() )
+ w->lstProperties.remove( it );
+ listProperties->currentItem()->setText( 0, s );
+ property.property = listProperties->currentItem()->text( 0 );
+ property.type = listProperties->currentItem()->text( 1 );
+ w->lstProperties.append( property );
+}
+
+void CustomWidgetEditor::addProperty()
+{
+ QListViewItem *i = new QListViewItem( listProperties, "property", "String" );
+ listProperties->setCurrentItem( i );
+ listProperties->setSelected( i, TRUE );
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( w ) {
+ MetaDataBase::Property prop;
+ prop.property = "property";
+ prop.type = "String";
+ w->lstProperties.append( prop );
+ }
+}
+
+void CustomWidgetEditor::removeProperty()
+{
+ MetaDataBase::Property property;
+ property.property = "1 2 3";
+ if ( listProperties->currentItem() ) {
+ property.property = listProperties->currentItem()->text( 0 );
+ property.type = listProperties->currentItem()->text( 1 );
+ }
+ delete listProperties->currentItem();
+ if ( listProperties->currentItem() )
+ listProperties->setSelected( listProperties->currentItem(), TRUE );
+ MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) );
+ if ( w && property.property != "1 2 3" )
+ w->lstProperties.remove( property );
+}
+
+void CustomWidgetEditor::currentPropertyChanged( QListViewItem *i )
+{
+ editProperty->blockSignals( TRUE );
+ editProperty->setText( "" );
+ editSignal->blockSignals( FALSE );
+
+ if ( !i ) {
+ editProperty->setEnabled( FALSE );
+ comboType->setEnabled( FALSE );
+ buttonRemoveProperty->setEnabled( FALSE );
+ return;
+ }
+
+ editProperty->setEnabled( TRUE );
+ comboType->setEnabled( TRUE );
+ buttonRemoveProperty->setEnabled( TRUE );
+ editProperty->blockSignals( TRUE );
+ comboType->blockSignals( TRUE );
+ editProperty->setText( i->text( 0 ) );
+
+ for ( int j = 0; j < comboType->count(); ++j ) {
+ if ( i->text( 1 ) == comboType->text( j ) ) {
+ comboType->setCurrentItem( j );
+ break;
+ }
+ }
+ editProperty->blockSignals( FALSE );
+ comboType->blockSignals( FALSE );
+}
+
+static QString makeIndent2( int indent )
+{
+ QString s;
+ s.fill( ' ', indent * 4 );
+ return s;
+}
+
+static QString entitize2( const QString &s )
+{
+ QString s2 = s;
+ s2 = s2.replace( "\"", "&quot;" );
+ s2 = s2.replace( "&", "&amp;" );
+ s2 = s2.replace( ">", "&gt;" );
+ s2 = s2.replace( "<", "&lt;" );
+ s2 = s2.replace( "'", "&apos;" );
+ return s2;
+}
+
+void CustomWidgetEditor::saveDescription()
+{
+ QString fn = QFileDialog::getSaveFileName( QString::null, tr( "Custom-Widget Description (*.cw);;All Files (*)" ), this );
+ if ( fn.isEmpty() )
+ return;
+
+ if ( QFileInfo( fn ).extension() != "cw" )
+ fn += ".cw";
+ QFile f( fn );
+ if ( !f.open( IO_WriteOnly ) )
+ return;
+
+ QTextStream ts( &f );
+ ts.setCodec( QTextCodec::codecForName( "UTF-8" ) );
+ int indent = 0;
+
+ ts << "<!DOCTYPE CW><CW>" << endl;
+
+ ts << makeIndent2( indent ) << "<customwidgets>" << endl;
+ indent++;
+
+ QPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets();
+ for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) {
+ ts << makeIndent2( indent ) << "<customwidget>" << endl;
+ indent++;
+ ts << makeIndent2( indent ) << "<class>" << w->className << "</class>" << endl;
+ ts << makeIndent2( indent ) << "<header location=\""
+ << ( w->includePolicy == MetaDataBase::CustomWidget::Local ? "local" : "global" )
+ << "\">" << w->includeFile << "</header>" << endl;
+ ts << makeIndent2( indent ) << "<sizehint>" << endl;
+ indent++;
+ ts << makeIndent2( indent ) << "<width>" << w->sizeHint.width() << "</width>" << endl;
+ ts << makeIndent2( indent ) << "<height>" << w->sizeHint.height() << "</height>" << endl;
+ indent--;
+ ts << makeIndent2( indent ) << "</sizehint>" << endl;
+ ts << makeIndent2( indent ) << "<container>" << (int)w->isContainer << "</container>" << endl;
+ ts << makeIndent2( indent ) << "<sizepolicy>" << endl;
+ indent++;
+ ts << makeIndent2( indent ) << "<hordata>" << (int)w->sizePolicy.horData() << "</hordata>" << endl;
+ ts << makeIndent2( indent ) << "<verdata>" << (int)w->sizePolicy.verData() << "</verdata>" << endl;
+ indent--;
+ ts << makeIndent2( indent ) << "</sizepolicy>" << endl;
+ ts << makeIndent2( indent ) << "<pixmap>" << endl;
+ indent++;
+ Resource::saveImageData( w->pixmap->convertToImage(), ts, indent );
+ indent--;
+ ts << makeIndent2( indent ) << "</pixmap>" << endl;
+ if ( !w->lstSignals.isEmpty() ) {
+ for ( QValueList<QCString>::Iterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it )
+ ts << makeIndent2( indent ) << "<signal>" << entitize2( *it ) << "</signal>" << endl;
+ }
+ if ( !w->lstSlots.isEmpty() ) {
+ for ( QValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it )
+ ts << makeIndent2( indent ) << "<slot access=\"" << (*it).access << "\">" << entitize2( (*it).function ) << "</slot>" << endl;
+ }
+ if ( !w->lstProperties.isEmpty() ) {
+ for ( QValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.begin(); it != w->lstProperties.end(); ++it )
+ ts << makeIndent2( indent ) << "<property type=\"" << (*it).type << "\">" << entitize2( (*it).property ) << "</property>" << endl;
+ }
+ indent--;
+ ts << makeIndent2( indent ) << "</customwidget>" << endl;
+ }
+
+ indent--;
+ ts << makeIndent2( indent ) << "</customwidgets>" << endl;
+ ts << "</CW>" << endl;
+}
+
+void CustomWidgetEditor::loadDescription()
+{
+ QString fn = QFileDialog::getOpenFileName( QString::null, tr( "Custom-Widget Description (*.cw);;All Files (*)" ), this );
+ if ( fn.isEmpty() )
+ return;
+
+ QFile f( fn );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+
+ QDomDocument doc;
+ QString errMsg;
+ int errLine;
+ if ( !doc.setContent( &f, &errMsg, &errLine ) ) {
+ qDebug( QString("Parse error: ") + errMsg + QString(" in line %d"), errLine );
+ return;
+ }
+
+ QDomElement firstWidget = doc.firstChild().toElement().firstChild().toElement();
+
+ while ( firstWidget.tagName() != "customwidgets" )
+ firstWidget = firstWidget.nextSibling().toElement();
+
+ Resource::loadCustomWidgets( firstWidget, 0 );
+ boxWidgets->clear();
+ setupDefinition();
+ setupSignals();
+ setupSlots();
+ setupProperties();
+}
+
+void CustomWidgetEditor::updateCustomWidgetSizes()
+{
+ if ( cwLst.isEmpty() )
+ cwLst = *mainWindow->queryList( "CustomWidget" );
+ for ( QObject *o = cwLst.first(); o; o = cwLst.next() )
+ ( (QWidget*)o )->updateGeometry();
+}
+
+void CustomWidgetEditor::horDataChanged( int a )
+{
+ QSizePolicy::SizeType st = int_to_size_type( a );
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w )
+ return;
+
+ QSizePolicy osp = w->sizePolicy;
+ w->sizePolicy.setHorData( st );
+ if ( cwLst.isEmpty() )
+ cwLst = *mainWindow->queryList( "CustomWidget" );
+ for ( QObject *o = cwLst.first(); o; o = cwLst.next() ) {
+ CustomWidget *cw = (CustomWidget*)o;
+ if ( cw->realClassName() == boxWidgets->currentText() ) {
+ if ( cw->sizePolicy() == osp )
+ cw->setSizePolicy( w->sizePolicy );
+ }
+ }
+}
+
+void CustomWidgetEditor::verDataChanged( int a )
+{
+ QSizePolicy::SizeType st = int_to_size_type( a );
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w )
+ return;
+
+ QSizePolicy osp = w->sizePolicy;
+ w->sizePolicy.setVerData( st );
+ if ( cwLst.isEmpty() )
+ cwLst = *mainWindow->queryList( "CustomWidget" );
+ for ( QObject *o = cwLst.first(); o; o = cwLst.next() ) {
+ CustomWidget *cw = (CustomWidget*)o;
+ if ( cw->realClassName() == boxWidgets->currentText() ) {
+ if ( cw->sizePolicy() == osp )
+ cw->setSizePolicy( w->sizePolicy );
+ }
+ }
+}
+
+void CustomWidgetEditor::widgetIsContainer( bool b )
+{
+ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() );
+ MetaDataBase::CustomWidget *w = findWidget( i );
+ if ( !i || !w )
+ return;
+
+ w->isContainer = b;
+ WidgetDatabaseRecord *r = WidgetDatabase::at( w->id );
+ if ( r )
+ r->isContainer = b;
+}
diff --git a/tools/designer/designer/customwidgeteditorimpl.h b/tools/designer/designer/customwidgeteditorimpl.h
new file mode 100644
index 0000000..67e0141
--- /dev/null
+++ b/tools/designer/designer/customwidgeteditorimpl.h
@@ -0,0 +1,105 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef CUSTOMWIDGETEDITORIMPL_H
+#define CUSTOMWIDGETEDITORIMPL_H
+
+#include "customwidgeteditor.h"
+#include "metadatabase.h"
+
+#include <qmap.h>
+#include <qobjectlist.h>
+
+class QTimer;
+class QListBoxItem;
+class MainWindow;
+
+class CustomWidgetEditor : public CustomWidgetEditorBase
+{
+ Q_OBJECT
+
+public:
+ CustomWidgetEditor( QWidget *parent , MainWindow *mw);
+
+protected slots:
+ void addWidgetClicked();
+ void classNameChanged( const QString & );
+ void currentWidgetChanged( QListBoxItem * );
+ void deleteWidgetClicked();
+ void headerFileChanged( const QString & );
+ void heightChanged( int );
+ void includePolicyChanged( int );
+ void pixmapChoosen();
+ void widthChanged( int );
+ void chooseHeader();
+ void checkWidgetName();
+ void closeClicked();
+ void currentSignalChanged( QListBoxItem *i );
+ void addSignal();
+ void removeSignal();
+ void signalNameChanged( const QString &s );
+ void slotAccessChanged( const QString & );
+ void slotNameChanged( const QString & );
+ void addSlot();
+ void removeSlot();
+ void currentSlotChanged( QListViewItem * );
+ void propertyTypeChanged( const QString & );
+ void propertyNameChanged( const QString & );
+ void addProperty();
+ void removeProperty();
+ void currentPropertyChanged( QListViewItem * );
+ void saveDescription();
+ void loadDescription();
+ void horDataChanged( int );
+ void verDataChanged( int );
+ void widgetIsContainer( bool );
+
+private:
+ MetaDataBase::CustomWidget *findWidget( QListBoxItem *i );
+ void setupDefinition();
+ void setupSignals();
+ void setupSlots();
+ void setupProperties();
+ void updateCustomWidgetSizes();
+
+private:
+ QMap<QListBoxItem*, MetaDataBase::CustomWidget*> customWidgets;
+ QString oldName;
+ QTimer *checkTimer;
+ QListBoxItem *oldItem;
+ MainWindow *mainWindow;
+ QObjectList cwLst;
+
+};
+
+#endif
diff --git a/tools/designer/designer/database.cpp b/tools/designer/designer/database.cpp
new file mode 100644
index 0000000..22c4f87
--- /dev/null
+++ b/tools/designer/designer/database.cpp
@@ -0,0 +1,129 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#if defined(DESIGNER)
+#include "database.h"
+#else
+#include "database2.h"
+#endif
+
+#ifndef QT_NO_SQL
+
+#if defined(DESIGNER)
+#include "formwindow.h"
+#include "mainwindow.h"
+#endif
+
+#include <qsqldatabase.h>
+#include <qsqlform.h>
+#include <qsqlcursor.h>
+#include <qsqlrecord.h>
+
+DatabaseSupport::DatabaseSupport()
+{
+ con = 0;
+ frm = 0;
+ parent = 0;
+}
+
+void DatabaseSupport::initPreview( const QString &connection, const QString &table, QObject *o,
+ const QMap<QString, QString> &databaseControls )
+{
+ tbl = table;
+ dbControls = databaseControls;
+ parent = o;
+
+ if ( connection != "(default)" )
+ con = QSqlDatabase::database( connection );
+ else
+ con = QSqlDatabase::database();
+ frm = new QSqlForm( o, table );
+ for ( QMap<QString, QString>::Iterator it = dbControls.begin(); it != dbControls.end(); ++it ) {
+ QObject *chld = parent->child( it.key(), "QWidget" );
+ if ( !chld )
+ continue;
+ frm->insert( (QWidget*)chld, *it );
+ }
+}
+
+QDesignerDataBrowser::QDesignerDataBrowser( QWidget *parent, const char *name )
+ : QDataBrowser( parent, name )
+{
+}
+
+bool QDesignerDataBrowser::event( QEvent* e )
+{
+ bool b = QDataBrowser::event( e );
+#if defined(DESIGNER)
+ if ( MainWindow::self->isPreviewing() ) {
+#endif
+ if ( e->type() == QEvent::Show ) {
+ if ( con ) {
+ QSqlCursor* cursor = new QSqlCursor( tbl, TRUE, con );
+ setSqlCursor( cursor, TRUE );
+ setForm( frm );
+ refresh();
+ first();
+ }
+ return TRUE;
+ }
+#if defined(DESIGNER)
+ }
+#endif
+ return b;
+}
+
+QDesignerDataView::QDesignerDataView( QWidget *parent, const char *name )
+ : QDataView( parent, name )
+{
+}
+
+bool QDesignerDataView::event( QEvent* e )
+{
+ bool b = QDataView::event( e );
+#if defined(DESIGNER)
+ if ( MainWindow::self->isPreviewing() ) {
+#endif
+ if ( e->type() == QEvent::Show ) {
+ setForm( frm );
+ readFields();
+ return TRUE;
+ }
+#if defined(DESIGNER)
+ }
+#endif
+ return b;
+}
+
+
+#endif
diff --git a/tools/designer/designer/database.h b/tools/designer/designer/database.h
new file mode 100644
index 0000000..7643c10
--- /dev/null
+++ b/tools/designer/designer/database.h
@@ -0,0 +1,90 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef DATABASE_H
+#define DATABASE_H
+
+#include "qfeatures.h"
+
+#ifndef QT_NO_SQL
+#include <qdataview.h>
+#include <qdatabrowser.h>
+#include <qsqlcursor.h>
+#include <qstring.h>
+
+class QSqlDatabase;
+class QSqlForm;
+
+class DatabaseSupport
+{
+public:
+ DatabaseSupport();
+ virtual ~DatabaseSupport() {}
+
+ void initPreview( const QString &connection, const QString &table, QObject *o,
+ const QMap<QString, QString> &databaseControls );
+
+protected:
+ QSqlDatabase* con;
+ QSqlForm* frm;
+ QString tbl;
+ QMap<QString, QString> dbControls;
+ QObject *parent;
+
+};
+
+class QDesignerDataBrowser : public QDataBrowser, public DatabaseSupport
+{
+ Q_OBJECT
+
+public:
+ QDesignerDataBrowser( QWidget *parent, const char *name );
+
+protected:
+ bool event( QEvent* e );
+};
+
+class QDesignerDataView : public QDataView, public DatabaseSupport
+{
+ Q_OBJECT
+
+public:
+ QDesignerDataView( QWidget *parent, const char *name );
+
+protected:
+ bool event( QEvent* e );
+
+};
+#endif
+
+#endif
diff --git a/tools/designer/designer/database2.h b/tools/designer/designer/database2.h
new file mode 100644
index 0000000..5830b45
--- /dev/null
+++ b/tools/designer/designer/database2.h
@@ -0,0 +1,95 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef DATABASE2_H
+#define DATABASE2_H
+
+#include "qfeatures.h"
+
+#ifndef QT_NO_SQL
+#include <qdataview.h>
+#include <qdatabrowser.h>
+#include <qsqlcursor.h>
+#include <qstring.h>
+
+class QSqlDatabase;
+class QSqlForm;
+
+class DatabaseSupport2
+{
+public:
+ DatabaseSupport2();
+ virtual ~DatabaseSupport2() {}
+
+ void initPreview( const QString &connection, const QString &table, QObject *o,
+ const QMap<QString, QString> &databaseControls );
+
+protected:
+ QSqlDatabase* con;
+ QSqlForm* frm;
+ QString tbl;
+ QMap<QString, QString> dbControls;
+ QObject *parent;
+
+};
+
+class QDesignerDataBrowser2 : public QDataBrowser, public DatabaseSupport2
+{
+ Q_OBJECT
+
+public:
+ QDesignerDataBrowser2( QWidget *parent, const char *name );
+
+protected:
+ bool event( QEvent* e );
+};
+
+class QDesignerDataView2 : public QDataView, public DatabaseSupport2
+{
+ Q_OBJECT
+
+public:
+ QDesignerDataView2( QWidget *parent, const char *name );
+
+protected:
+ bool event( QEvent* e );
+
+};
+
+#define DatabaseSupport DatabaseSupport2
+#define QDesignerDataBrowser QDesignerDataBrowser2
+#define QDesignerDataView QDesignerDataView2
+
+#endif
+
+#endif
diff --git a/tools/designer/designer/dbconnection.ui b/tools/designer/designer/dbconnection.ui
new file mode 100644
index 0000000..b81f005
--- /dev/null
+++ b/tools/designer/designer/dbconnection.ui
@@ -0,0 +1,229 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>DatabaseConnectionWidget</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DatabaseConnectionWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>199</width>
+ <height>185</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Database Connection</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Database Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editDatabase</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Username:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editUsername</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>TextLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Password:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editPassword</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;river</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboDriver</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>editName</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Hostname:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editHostname</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>comboDriver</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editName</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="5" column="1">
+ <property name="name">
+ <cstring>editHostname</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="6" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>P&amp;ort</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editPort</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>editUsername</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>editPassword</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>editDatabase</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="6" column="1">
+ <property name="name">
+ <cstring>editPort</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="specialValueText">
+ <string>Default</string>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>-1</number>
+ </property>
+ <property name="value">
+ <number>-1</number>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+</connections>
+<tabstops>
+ <tabstop>editName</tabstop>
+ <tabstop>comboDriver</tabstop>
+ <tabstop>editDatabase</tabstop>
+ <tabstop>editUsername</tabstop>
+ <tabstop>editPassword</tabstop>
+ <tabstop>editHostname</tabstop>
+ <tabstop>editPort</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/dbconnectioneditor.ui b/tools/designer/designer/dbconnectioneditor.ui
new file mode 100644
index 0000000..9707293
--- /dev/null
+++ b/tools/designer/designer/dbconnectioneditor.ui
@@ -0,0 +1,154 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>DatabaseConnectionEditorBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>DatabaseConnectionEditorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>393</width>
+ <height>286</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Connect</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>grp</cstring>
+ </property>
+ <property name="title">
+ <string>Connection Details</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer row="0" column="0">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>DatabaseConnectionEditorBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>DatabaseConnectionEditorBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <slot access="protected" language="C++" returnType="void">init()</slot>
+ <slot access="protected" language="C++" returnType="void">destroy()</slot>
+</connections>
+<tabstops>
+ <tabstop>PushButton1</tabstop>
+ <tabstop>PushButton2</tabstop>
+</tabstops>
+</UI>
diff --git a/tools/designer/designer/dbconnectionimpl.cpp b/tools/designer/designer/dbconnectionimpl.cpp
new file mode 100644
index 0000000..b3a70ef
--- /dev/null
+++ b/tools/designer/designer/dbconnectionimpl.cpp
@@ -0,0 +1,87 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "dbconnectionimpl.h"
+#include "dbconnection.h"
+#include "project.h"
+#include "asciivalidator.h"
+#include <qgroupbox.h>
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qlineedit.h>
+#include <qlayout.h>
+#include <qsqldatabase.h>
+
+DatabaseConnectionEditor::DatabaseConnectionEditor( DatabaseConnection* connection, QWidget* parent,
+ const char* name, bool modal, WFlags fl )
+ : DatabaseConnectionEditorBase( parent, name, modal, fl ), conn( connection )
+{
+ connectionWidget = new DatabaseConnectionWidget( grp );
+ grpLayout->addWidget( connectionWidget, 0, 0 );
+ init();
+}
+
+DatabaseConnectionEditor::~DatabaseConnectionEditor()
+{
+}
+
+void DatabaseConnectionEditor::accept()
+{
+#ifndef QT_NO_SQL
+ conn->setUsername( connectionWidget->editUsername->text() );
+ conn->setPassword( connectionWidget->editPassword->text() );
+ conn->setHostname( connectionWidget->editHostname->text() );
+#endif
+ DatabaseConnectionEditorBase::accept();
+}
+
+void DatabaseConnectionEditor::init()
+{
+ connectionWidget->editName->setEnabled( FALSE );
+ connectionWidget->editName->setValidator( new AsciiValidator( connectionWidget->editName ) );
+ connectionWidget->editName->setText( conn->name() );
+ connectionWidget->comboDriver->setEnabled( FALSE );
+ connectionWidget->comboDriver->lineEdit()->setText( conn->driver() );
+ connectionWidget->editDatabase->setEnabled( FALSE );
+ connectionWidget->editDatabase->setText( conn->database() );
+ connectionWidget->editUsername->setEnabled( TRUE );
+ connectionWidget->editUsername->setText( conn->username() );
+ connectionWidget->editPassword->setEnabled( TRUE );
+ connectionWidget->editPassword->setText( "" );
+ connectionWidget->editHostname->setEnabled( TRUE );
+ connectionWidget->editHostname->setText( conn->hostname() );
+ connectionWidget->editPort->setEnabled( TRUE );
+ connectionWidget->editPort->setValue( conn->port() );
+ connectionWidget->editUsername->setFocus();
+ connectionWidget->editUsername->selectAll();
+}
diff --git a/tools/designer/designer/dbconnectionimpl.h b/tools/designer/designer/dbconnectionimpl.h
new file mode 100644
index 0000000..7e5a9cf
--- /dev/null
+++ b/tools/designer/designer/dbconnectionimpl.h
@@ -0,0 +1,64 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef DBCONNECTIONIMPL_H
+#define DBCONNECTIONIMPL_H
+
+#include "dbconnectioneditor.h"
+
+class DatabaseConnection;
+class DatabaseConnectionWidget;
+class QGridLayout;
+
+class DatabaseConnectionEditor : public DatabaseConnectionEditorBase
+{
+ Q_OBJECT
+
+public:
+ DatabaseConnectionEditor( DatabaseConnection* connection, QWidget* parent = 0,
+ const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~DatabaseConnectionEditor();
+
+public slots:
+ void accept();
+private:
+ void init();
+
+private:
+ DatabaseConnection *conn;
+ QGridLayout* lay;
+ DatabaseConnectionWidget* connectionWidget;
+
+};
+
+#endif // DBCONNECTIONIMPL_H
diff --git a/tools/designer/designer/dbconnections.ui b/tools/designer/designer/dbconnections.ui
new file mode 100644
index 0000000..9d1fdff
--- /dev/null
+++ b/tools/designer/designer/dbconnections.ui
@@ -0,0 +1,328 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>DatabaseConnectionBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>DatabaseConnectionBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>512</width>
+ <height>309</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Database Connections</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>buttonNew</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Connection</string>
+ </property>
+ </widget>
+ <widget class="QListBox" row="0" column="0" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>listConnections</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>buttonDelete</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Connection</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="5" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonClose</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="2" column="1" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="0" column="2" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>grp</cstring>
+ </property>
+ <property name="title">
+ <string>Connection</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer row="0" column="0">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="2">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonConnect</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Connec&amp;t</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer row="4" column="2">
+ <property name="name">
+ <cstring>Spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonClose</sender>
+ <signal>clicked()</signal>
+ <receiver>DatabaseConnectionBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonNew</sender>
+ <signal>clicked()</signal>
+ <receiver>DatabaseConnectionBase</receiver>
+ <slot>newConnection()</slot>
+ </connection>
+ <connection>
+ <sender>buttonDelete</sender>
+ <signal>clicked()</signal>
+ <receiver>DatabaseConnectionBase</receiver>
+ <slot>deleteConnection()</slot>
+ </connection>
+ <connection>
+ <sender>buttonConnect</sender>
+ <signal>clicked()</signal>
+ <receiver>DatabaseConnectionBase</receiver>
+ <slot>doConnect()</slot>
+ </connection>
+ <connection>
+ <sender>listConnections</sender>
+ <signal>highlighted(const QString&amp;)</signal>
+ <receiver>DatabaseConnectionBase</receiver>
+ <slot>currentConnectionChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>listConnections</sender>
+ <signal>selected(const QString&amp;)</signal>
+ <receiver>DatabaseConnectionBase</receiver>
+ <slot>currentConnectionChanged(const QString&amp;)</slot>
+ </connection>
+ <slot access="protected" language="C++" returnType="void">init()</slot>
+ <slot access="protected" language="C++" returnType="void">destroy()</slot>
+ <slot access="protected" language="C++" returnType="void">currentConnectionChanged( const QString &amp; )</slot>
+ <slot access="protected" language="C++" returnType="void">deleteConnection()</slot>
+ <slot access="protected" language="C++" returnType="void">newConnection()</slot>
+ <slot access="protected" language="C++" returnType="void">connectionNameChanged( const QString &amp; )</slot>
+ <slot access="protected" language="C++" returnType="void">doConnect()</slot>
+</connections>
+<tabstops>
+ <tabstop>buttonClose</tabstop>
+ <tabstop>listConnections</tabstop>
+ <tabstop>buttonNew</tabstop>
+ <tabstop>buttonDelete</tabstop>
+ <tabstop>buttonConnect</tabstop>
+ <tabstop>buttonHelp</tabstop>
+</tabstops>
+</UI>
diff --git a/tools/designer/designer/dbconnectionsimpl.cpp b/tools/designer/designer/dbconnectionsimpl.cpp
new file mode 100644
index 0000000..8980977
--- /dev/null
+++ b/tools/designer/designer/dbconnectionsimpl.cpp
@@ -0,0 +1,201 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "dbconnectionsimpl.h"
+#include <qptrlist.h>
+#include <qgroupbox.h>
+#include <qlayout.h>
+#include "project.h"
+#include <qlistbox.h>
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qsqldatabase.h>
+#include <qmessagebox.h>
+#include <qapplication.h>
+#include "mainwindow.h"
+#include "asciivalidator.h"
+
+static bool blockChanges = FALSE;
+
+/*
+ * Constructs a DatabaseConnectionsEditor which is a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'
+ *
+ * The dialog will by default be modeless, unless you set 'modal' to
+ * TRUE to construct a modal dialog.
+ */
+DatabaseConnectionsEditor::DatabaseConnectionsEditor( Project *pro, QWidget* parent, const char* name, bool modal, WFlags fl )
+ : DatabaseConnectionBase( parent, name, modal, fl ), project( pro )
+{
+ connect( buttonHelp, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+ connectionWidget = new DatabaseConnectionWidget( grp );
+ grpLayout->addWidget( connectionWidget, 0, 0 );
+#ifndef QT_NO_SQL
+ QPtrList<DatabaseConnection> lst = project->databaseConnections();
+ for ( DatabaseConnection *conn = lst.first(); conn; conn = lst.next() )
+ listConnections->insertItem( conn->name() );
+ connectionWidget->comboDriver->insertStringList( QSqlDatabase::drivers() );
+#endif
+ connectionWidget->editName->setValidator( new AsciiValidator( connectionWidget->editName ) );
+ enableAll( FALSE );
+}
+
+DatabaseConnectionsEditor::~DatabaseConnectionsEditor()
+{
+}
+
+void DatabaseConnectionsEditor::deleteConnection()
+{
+ if ( listConnections->currentItem() == -1 )
+ return;
+ project->removeDatabaseConnection( listConnections->currentText() );
+ delete listConnections->item( listConnections->currentItem() );
+ if ( listConnections->count() ) {
+ listConnections->setCurrentItem( 0 );
+ currentConnectionChanged( listConnections->currentText() );
+ } else {
+ enableAll( FALSE );
+ }
+ project->saveConnections();
+}
+
+void DatabaseConnectionsEditor::newConnection()
+{
+ blockChanges = TRUE;
+ enableAll( TRUE );
+ QString n( "(default)" );
+ if ( project->databaseConnection( n ) ) {
+ n = "connection";
+ int i = 2;
+ while ( project->databaseConnection( n + QString::number( i ) ) )
+ ++i;
+ n = n + QString::number( i );
+ }
+ connectionWidget->editName->setText( n );
+ listConnections->clearSelection();
+ buttonConnect->setDefault( TRUE );
+ connectionWidget->editName->setFocus();
+ blockChanges = FALSE;
+}
+
+void DatabaseConnectionsEditor::doConnect()
+{
+#ifndef QT_NO_SQL
+ if ( listConnections->currentItem() == -1 ||
+ !listConnections->item( listConnections->currentItem() )->isSelected() ) { // new connection
+ // ### do error checking for duplicated connection names
+ DatabaseConnection *conn = new DatabaseConnection( project );
+ conn->setName( connectionWidget->editName->text() );
+ conn->setDriver( connectionWidget->comboDriver->lineEdit()->text() );
+ conn->setDatabase( connectionWidget->editDatabase->text() );
+ conn->setUsername( connectionWidget->editUsername->text() );
+ conn->setPassword( connectionWidget->editPassword->text() );
+ conn->setHostname( connectionWidget->editHostname->text() );
+ conn->setPort( connectionWidget->editPort->value() );
+ if ( conn->refreshCatalog() ) {
+ project->addDatabaseConnection( conn );
+ listConnections->insertItem( conn->name() );
+ listConnections->setCurrentItem( listConnections->count() - 1 );
+ project->saveConnections();
+ } else {
+ QMessageBox::warning( MainWindow::self, QApplication::tr( "Connection" ),
+ QApplication::tr( "Could not connect to the database.\n"
+ "Please ensure that the database server is running "
+ "and that all the connection information is correct.\n"
+ "[ " + conn->lastError() + " ]" ) );
+ delete conn;
+ }
+ } else { // sync // ### should this do something else? right now it just overwrites all info about the connection...
+ DatabaseConnection *conn = project->databaseConnection( listConnections->currentText() );
+ conn->setName( connectionWidget->editName->text() );
+ conn->setDriver( connectionWidget->comboDriver->lineEdit()->text() );
+ conn->setDatabase( connectionWidget->editDatabase->text() );
+ conn->setUsername( connectionWidget->editUsername->text() );
+ conn->setPassword( connectionWidget->editPassword->text() );
+ conn->setHostname( connectionWidget->editHostname->text() );
+ conn->setPort( connectionWidget->editPort->value() );
+ conn->refreshCatalog();
+ project->saveConnections();
+ }
+#endif
+}
+
+void DatabaseConnectionsEditor::currentConnectionChanged( const QString &s )
+{
+#ifndef QT_NO_SQL
+ DatabaseConnection *conn = project->databaseConnection( s );
+ blockChanges = TRUE;
+ enableAll( conn != 0 );
+ connectionWidget->editName->setEnabled( FALSE );
+ blockChanges = FALSE;
+ if ( !conn )
+ return;
+ blockChanges = TRUE;
+ connectionWidget->editName->setText( conn->name() );
+ blockChanges = FALSE;
+ connectionWidget->comboDriver->lineEdit()->setText( conn->driver() );
+ connectionWidget->editDatabase->setText( conn->database() );
+ connectionWidget->editUsername->setText( conn->username() );
+ connectionWidget->editPassword->setText( conn->password() );
+ connectionWidget->editHostname->setText( conn->hostname() );
+ connectionWidget->editPort->setValue( conn->port() );
+#endif
+}
+
+void DatabaseConnectionsEditor::connectionNameChanged( const QString &s )
+{
+ if ( listConnections->currentItem() == 0 || blockChanges )
+ return;
+ listConnections->changeItem( s, listConnections->currentItem() );
+}
+
+void DatabaseConnectionsEditor::enableAll( bool b )
+{
+ connectionWidget->editName->setEnabled( b );
+ connectionWidget->editName->setText( "" );
+ connectionWidget->comboDriver->setEnabled( b );
+ connectionWidget->comboDriver->lineEdit()->setText( "" );
+ connectionWidget->editDatabase->setEnabled( b );
+ connectionWidget->editDatabase->setText( "" );
+ connectionWidget->editUsername->setEnabled( b );
+ connectionWidget->editUsername->setText( "" );
+ connectionWidget->editPassword->setEnabled( b );
+ connectionWidget->editPassword->setText( "" );
+ connectionWidget->editHostname->setEnabled( b );
+ connectionWidget->editHostname->setText( "" );
+ connectionWidget->editPort->setEnabled( b );
+ connectionWidget->editPort->setValue( -1 );
+ buttonConnect->setEnabled( b );
+}
diff --git a/tools/designer/designer/dbconnectionsimpl.h b/tools/designer/designer/dbconnectionsimpl.h
new file mode 100644
index 0000000..d1916fa
--- /dev/null
+++ b/tools/designer/designer/dbconnectionsimpl.h
@@ -0,0 +1,67 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef DBCONNECTIONSIMPL_H
+#define DBCONNECTIONSIMPL_H
+
+#include "dbconnections.h"
+#include "dbconnection.h"
+
+class Project;
+
+class DatabaseConnectionsEditor : public DatabaseConnectionBase
+{
+ Q_OBJECT
+
+public:
+ DatabaseConnectionsEditor( Project *pro, QWidget* parent = 0,
+ const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~DatabaseConnectionsEditor();
+
+protected slots:
+ void deleteConnection();
+ void newConnection();
+ void doConnect();
+ void currentConnectionChanged( const QString & );
+ void connectionNameChanged( const QString &s );
+
+private:
+ void enableAll( bool b );
+
+private:
+ Project *project;
+ DatabaseConnectionWidget* connectionWidget;
+
+};
+
+#endif // DBCONNECTIONSIMPL_H
diff --git a/tools/designer/designer/defs.cpp b/tools/designer/designer/defs.cpp
new file mode 100644
index 0000000..ebb610e
--- /dev/null
+++ b/tools/designer/designer/defs.cpp
@@ -0,0 +1,91 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "defs.h"
+
+int size_type_to_int( QSizePolicy::SizeType t )
+{
+ if ( t == QSizePolicy::Fixed )
+ return 0;
+ if ( t == QSizePolicy::Minimum )
+ return 1;
+ if ( t == QSizePolicy::Maximum )
+ return 2;
+ if ( t == QSizePolicy::Preferred )
+ return 3;
+ if ( t == QSizePolicy::MinimumExpanding )
+ return 4;
+ if ( t == QSizePolicy::Expanding )
+ return 5;
+ if ( t == QSizePolicy::Ignored )
+ return 6;
+ return 0;
+}
+
+QString size_type_to_string( QSizePolicy::SizeType t )
+{
+ if ( t == QSizePolicy::Fixed )
+ return "Fixed";
+ if ( t == QSizePolicy::Minimum )
+ return "Minimum";
+ if ( t == QSizePolicy::Maximum )
+ return "Maximum";
+ if ( t == QSizePolicy::Preferred )
+ return "Preferred";
+ if ( t == QSizePolicy::MinimumExpanding )
+ return "MinimumExpanding";
+ if ( t == QSizePolicy::Expanding )
+ return "Expanding";
+ if ( t == QSizePolicy::Ignored )
+ return "Ignored";
+ return QString();
+}
+
+QSizePolicy::SizeType int_to_size_type( int i )
+{
+ if ( i == 0 )
+ return QSizePolicy::Fixed;
+ if ( i == 1 )
+ return QSizePolicy::Minimum;
+ if ( i == 2 )
+ return QSizePolicy::Maximum;
+ if ( i == 3 )
+ return QSizePolicy::Preferred;
+ if ( i == 4 )
+ return QSizePolicy::MinimumExpanding;
+ if ( i == 5 )
+ return QSizePolicy::Expanding;
+ if ( i == 6 )
+ return QSizePolicy::Ignored;
+ return QSizePolicy::Preferred;
+}
diff --git a/tools/designer/designer/defs.h b/tools/designer/designer/defs.h
new file mode 100644
index 0000000..a8b5ac5
--- /dev/null
+++ b/tools/designer/designer/defs.h
@@ -0,0 +1,49 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef DEFS_H
+#define DEFS_H
+
+#include <qsizepolicy.h>
+#include <qstring.h>
+
+#define POINTER_TOOL 32000
+#define CONNECT_TOOL 32001
+#define ORDER_TOOL 32002
+#define BUDDY_TOOL 32004
+
+int size_type_to_int( QSizePolicy::SizeType t );
+QString size_type_to_string( QSizePolicy::SizeType t );
+QSizePolicy::SizeType int_to_size_type( int i );
+
+#endif
diff --git a/tools/designer/designer/designer.pro b/tools/designer/designer/designer.pro
new file mode 100644
index 0000000..95f58da
--- /dev/null
+++ b/tools/designer/designer/designer.pro
@@ -0,0 +1,443 @@
+TEMPLATE = lib
+
+CONFIG += qt warn_on staticlib qmake_cache
+CONFIG -= dll
+!force_static:!win32:contains(QT_PRODUCT,qt-internal) {
+ CONFIG -= staticlib
+ CONFIG += dll
+}
+
+TARGET = designercore
+
+DEFINES += DESIGNER
+DEFINES += QT_INTERNAL_XML
+DEFINES += QT_INTERNAL_WORKSPACE
+DEFINES += QT_INTERNAL_ICONVIEW
+DEFINES += QT_INTERNAL_TABLE
+table:win32-msvc:DEFINES+=QM_TEMPLATE_EXTERN_TABLE=extern
+
+unix {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_SHLIB
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_SHLIB
+}
+
+include( ../../../src/qt_professional.pri )
+
+SOURCES += command.cpp \
+ formwindow.cpp \
+ defs.cpp \
+ layout.cpp \
+ mainwindow.cpp \
+ mainwindowactions.cpp \
+ metadatabase.cpp \
+ pixmapchooser.cpp \
+ propertyeditor.cpp \
+ resource.cpp \
+ sizehandle.cpp \
+ orderindicator.cpp \
+ widgetfactory.cpp \
+ hierarchyview.cpp \
+ listboxeditorimpl.cpp \
+ newformimpl.cpp \
+ workspace.cpp \
+ listvieweditorimpl.cpp \
+ customwidgeteditorimpl.cpp \
+ paletteeditorimpl.cpp \
+ styledbutton.cpp \
+ iconvieweditorimpl.cpp \
+ multilineeditorimpl.cpp \
+ formsettingsimpl.cpp \
+ asciivalidator.cpp \
+ designerapp.cpp \
+ designerappiface.cpp \
+ actioneditorimpl.cpp \
+ actionlistview.cpp \
+ actiondnd.cpp \
+ project.cpp \
+ projectsettingsimpl.cpp \
+ sourceeditor.cpp \
+ outputwindow.cpp \
+ ../shared/widgetdatabase.cpp \
+ ../shared/parser.cpp \
+ pixmapcollection.cpp \
+ previewframe.cpp \
+ previewwidgetimpl.cpp \
+ paletteeditoradvancedimpl.cpp \
+ sourcefile.cpp \
+ wizardeditorimpl.cpp \
+ qcompletionedit.cpp \
+ timestamp.cpp \
+ formfile.cpp \
+ widgetaction.cpp \
+ propertyobject.cpp \
+ startdialogimpl.cpp \
+ syntaxhighlighter_html.cpp \
+ connectionitems.cpp \
+ editfunctionsimpl.cpp \
+ variabledialogimpl.cpp \
+ listviewdnd.cpp \
+ listboxdnd.cpp \
+ listdnd.cpp \
+ listboxrename.cpp \
+ connectiontable.cpp \
+ popupmenueditor.cpp \
+ menubareditor.cpp
+
+HEADERS += command.h \
+ defs.h \
+ formwindow.h \
+ layout.h \
+ mainwindow.h \
+ metadatabase.h \
+ pixmapchooser.h \
+ propertyeditor.h \
+ resource.h \
+ sizehandle.h \
+ orderindicator.h \
+ widgetfactory.h \
+ hierarchyview.h \
+ listboxeditorimpl.h \
+ newformimpl.h \
+ workspace.h \
+ listvieweditorimpl.h \
+ customwidgeteditorimpl.h \
+ paletteeditorimpl.h \
+ styledbutton.h \
+ iconvieweditorimpl.h \
+ multilineeditorimpl.h \
+ formsettingsimpl.h \
+ asciivalidator.h \
+ ../interfaces/widgetinterface.h \
+ ../interfaces/actioninterface.h \
+ ../interfaces/filterinterface.h \
+ ../interfaces/designerinterface.h \
+ designerapp.h \
+ designerappiface.h \
+ actioneditorimpl.h \
+ actionlistview.h \
+ actiondnd.h \
+ project.h \
+ projectsettingsimpl.h \
+ sourceeditor.h \
+ outputwindow.h \
+ ../shared/widgetdatabase.h \
+ ../shared/parser.h \
+ previewframe.h \
+ previewwidgetimpl.h \
+ paletteeditoradvancedimpl.h \
+ pixmapcollection.h \
+ sourcefile.h \
+ wizardeditorimpl.h \
+ qcompletionedit.h \
+ timestamp.h \
+ formfile.h \
+ widgetaction.h \
+ propertyobject.h \
+ startdialogimpl.h \
+ syntaxhighlighter_html.h \
+ connectionitems.h \
+ editfunctionsimpl.h \
+ variabledialogimpl.h \
+ listviewdnd.h \
+ listboxdnd.h \
+ listdnd.h \
+ listboxrename.h \
+ connectiontable.h \
+ popupmenueditor.h \
+ menubareditor.h
+
+FORMS += listboxeditor.ui \
+ editfunctions.ui \
+ newform.ui \
+ listvieweditor.ui \
+ customwidgeteditor.ui \
+ paletteeditor.ui \
+ iconvieweditor.ui \
+ preferences.ui \
+ multilineeditor.ui \
+ formsettings.ui \
+ about.ui \
+ pixmapfunction.ui \
+ createtemplate.ui \
+ actioneditor.ui \
+ projectsettings.ui \
+ finddialog.ui \
+ replacedialog.ui \
+ gotolinedialog.ui \
+ pixmapcollectioneditor.ui \
+ previewwidget.ui \
+ paletteeditoradvanced.ui \
+ wizardeditor.ui \
+ listeditor.ui \
+ startdialog.ui \
+ richtextfontdialog.ui \
+ connectiondialog.ui \
+ variabledialog.ui \
+ configtoolboxdialog.ui
+
+IMAGES += images/designer_adjustsize.png \
+ images/designer_edithlayoutsplit.png \
+ images/designer_left.png \
+ images/designer_sizeall.png \
+ images/designer_arrow.png \
+ images/designer_editlower.png \
+ images/designer_line.png \
+ images/designer_sizeb.png \
+ images/designer_background.png \
+ images/designer_editpaste.png \
+ images/designer_lineedit.png \
+ images/designer_sizef.png \
+ images/designer_book.png \
+ images/designer_editraise.png \
+ images/designer_listbox.png \
+ images/designer_sizeh.png \
+ images/designer_buttongroup.png \
+ images/designer_editslots.png \
+ images/designer_listview.png \
+ images/designer_sizev.png \
+ images/designer_checkbox.png \
+ images/designer_editvlayout.png \
+ images/designer_multilineedit.png \
+ images/designer_slider.png \
+ images/designer_combobox.png \
+ images/designer_editvlayoutsplit.png \
+ images/designer_newform.png \
+ images/designer_spacer.png \
+ images/designer_connecttool.png \
+ images/designer_filenew.png \
+ images/designer_no.png \
+ images/designer_spinbox.png \
+ images/designer_cross.png \
+ images/designer_fileopen.png \
+ images/designer_ordertool.png \
+ images/designer_splash.png \
+ images/designer_customwidget.png \
+ images/designer_filesave.png \
+ images/designer_pixlabel.png \
+ images/designer_table.png \
+ images/designer_databrowser.png \
+ images/designer_form.png \
+ images/designer_pointer.png \
+ images/designer_tabwidget.png \
+ images/designer_datatable.png \
+ images/designer_frame.png \
+ images/designer_print.png \
+ images/designer_textbrowser.png \
+ images/designer_dataview.png \
+ images/designer_groupbox.png \
+ images/designer_progress.png \
+ images/designer_textedit.png \
+ images/designer_dateedit.png \
+ images/designer_hand.png \
+ images/designer_project.png \
+ images/designer_textview.png \
+ images/designer_datetimeedit.png \
+ images/designer_help.png \
+ images/designer_pushbutton.png \
+ images/designer_timeedit.png \
+ images/designer_dial.png \
+ images/designer_home.png \
+ images/designer_qtlogo.png \
+ images/designer_toolbutton.png \
+ images/designer_toolbox.png \
+ images/designer_down.png \
+ images/designer_hsplit.png \
+ images/designer_radiobutton.png \
+ images/designer_undo.png \
+ images/designer_editbreaklayout.png \
+ images/designer_ibeam.png \
+ images/designer_redo.png \
+ images/designer_up.png \
+ images/designer_resetproperty.png \
+ images/designer_editcopy.png \
+ images/designer_iconview.png \
+ images/designer_resetproperty.png \
+ images/designer_uparrow.png \
+ images/designer_editcut.png \
+ images/designer_image.png \
+ images/designer_richtextedit.png \
+ images/designer_vsplit.png \
+ images/designer_editdelete.png \
+ images/designer_label.png \
+ images/designer_right.png \
+ images/designer_wait.png \
+ images/designer_editgrid.png \
+ images/designer_layout.png \
+ images/designer_scrollbar.png \
+ images/designer_widgetstack.png \
+ images/designer_edithlayout.png \
+ images/designer_lcdnumber.png \
+ images/designer_searchfind.png \
+ images/designer_folder.png \
+ images/designer_setbuddy.png \
+ images/designer_textbold.png \
+ images/designer_textcenter.png \
+ images/designer_texth1.png \
+ images/designer_texth2.png \
+ images/designer_texth3.png \
+ images/designer_textitalic.png \
+ images/designer_textjustify.png \
+ images/designer_textlarger.png \
+ images/designer_textleft.png \
+ images/designer_textlinebreak.png \
+ images/designer_textparagraph.png \
+ images/designer_textright.png \
+ images/designer_textsmaller.png \
+ images/designer_textteletext.png \
+ images/designer_textunderline.png \
+ images/designer_wizarddata.png \
+ images/designer_wizarddialog.png \
+ images/designer_d_adjustsize.png \
+ images/designer_d_label.png \
+ images/designer_d_book.png \
+ images/designer_d_layout.png \
+ images/designer_d_buttongroup.png \
+ images/designer_d_lcdnumber.png \
+ images/designer_d_checkbox.png \
+ images/designer_d_left.png \
+ images/designer_d_combobox.png \
+ images/designer_d_line.png \
+ images/designer_d_connecttool.png \
+ images/designer_d_lineedit.png \
+ images/designer_d_customwidget.png \
+ images/designer_d_listbox.png \
+ images/designer_d_databrowser.png \
+ images/designer_d_listview.png \
+ images/designer_d_datatable.png \
+ images/designer_d_multilineedit.png \
+ images/designer_d_dataview.png \
+ images/designer_d_newform.png \
+ images/designer_d_dateedit.png \
+ images/designer_d_ordertool.png \
+ images/designer_d_datetimeedit.png \
+ images/designer_d_pixlabel.png \
+ images/designer_d_dial.png \
+ images/designer_d_pointer.png \
+ images/designer_d_down.png \
+ images/designer_d_print.png \
+ images/designer_d_editbreaklayout.png \
+ images/designer_d_progress.png \
+ images/designer_d_editcopy.png \
+ images/designer_d_project.png \
+ images/designer_d_editcut.png \
+ images/designer_d_pushbutton.png \
+ images/designer_d_editdelete.png \
+ images/designer_d_radiobutton.png \
+ images/designer_d_editgrid.png \
+ images/designer_d_redo.png \
+ images/designer_d_edithlayout.png \
+ images/designer_d_richtextedit.png \
+ images/designer_d_edithlayoutsplit.png \
+ images/designer_d_right.png \
+ images/designer_d_editlower.png \
+ images/designer_d_scrollbar.png \
+ images/designer_d_editpaste.png \
+ images/designer_d_searchfind.png \
+ images/designer_d_editraise.png \
+ images/designer_d_slider.png \
+ images/designer_d_editslots.png \
+ images/designer_d_spacer.png \
+ images/designer_d_editvlayout.png \
+ images/designer_d_spinbox.png \
+ images/designer_d_editvlayoutsplit.png \
+ images/designer_d_table.png \
+ images/designer_d_filenew.png \
+ images/designer_d_folder.png \
+ images/designer_d_tabwidget.png \
+ images/designer_d_fileopen.png \
+ images/designer_d_textbrowser.png \
+ images/designer_d_filesave.png \
+ images/designer_d_textedit.png \
+ images/designer_d_form.png \
+ images/designer_d_textview.png \
+ images/designer_d_frame.png \
+ images/designer_d_timeedit.png \
+ images/designer_d_groupbox.png \
+ images/designer_d_toolbutton.png \
+ images/designer_d_toolbox.png \
+ images/designer_d_help.png \
+ images/designer_d_undo.png \
+ images/designer_d_home.png \
+ images/designer_d_up.png \
+ images/designer_d_iconview.png \
+ images/designer_d_widgetstack.png \
+ images/designer_d_setbuddy.png \
+ images/designer_d_textbold.png \
+ images/designer_d_texth1.png \
+ images/designer_d_texth2.png \
+ images/designer_d_texth3.png \
+ images/designer_d_textitalic.png \
+ images/designer_d_textjustify.png \
+ images/designer_d_textlarger.png \
+ images/designer_d_textleft.png \
+ images/designer_d_textlinebreak.png \
+ images/designer_d_textparagraph.png \
+ images/designer_d_textright.png \
+ images/designer_d_textsmaller.png \
+ images/designer_d_textteletext.png \
+ images/designer_d_textunderline.png \
+ images/designer_d_textcenter.png \
+ images/designer_d_wizarddata.png \
+ images/designer_d_wizarddialog.png \
+ images/designer_s_editcut.png \
+ images/designer_s_up.png \
+ images/designer_s_down.png \
+ images/designer_s_left.png \
+ images/designer_s_right.png \
+ images/designer_d_image.png \
+ images/designer_d_textfont.png \
+ images/designer_textfont.png \
+ images/designer_object.png \
+ images/designer_appicon.png \
+ images/designer_wordwrap.png \
+ images/designer_d_wordwrap.png
+
+
+OBJECTS_DIR = .
+
+DEPENDPATH += $$QT_SOURCE_TREE/include
+VERSION = 1.0.0
+DESTDIR = $$QT_BUILD_TREE/lib
+
+aix-g++ {
+ QMAKE_CFLAGS += -mminimal-toc
+ QMAKE_CXXFLAGS += -mminimal-toc
+}
+
+sql {
+ SOURCES += database.cpp dbconnectionimpl.cpp dbconnectionsimpl.cpp
+ HEADERS += database.h dbconnectionimpl.h dbconnectionsimpl.h
+ FORMS += dbconnections.ui dbconnection.ui dbconnectioneditor.ui
+}
+
+table {
+ HEADERS += tableeditorimpl.h
+ SOURCES += tableeditorimpl.cpp
+ FORMS += tableeditor.ui
+}
+
+INCLUDEPATH += ../shared ../uilib
+LIBS += -L$$QT_BUILD_TREE/lib -lqui
+
+hpux-acc* {
+ LIBS += $$QT_BUILD_TREE/lib/libqassistantclient.a
+}
+
+!hpux-acc* {
+ LIBS += -lqassistantclient
+}
+
+TRANSLATIONS = designer_de.ts designer_fr.ts
+
+target.path=$$libs.path
+INSTALLS += target
+
+templates.path=$$data.path/templates
+templates.files = ../templates/*
+INSTALLS += templates
+
+designertranlations.files = *.qm
+designertranlations.path = $$translations.path
+INSTALLS += designertranlations
+
+!macx-g++:PRECOMPILED_HEADER = designer_pch.h
diff --git a/tools/designer/designer/designer_de.ts b/tools/designer/designer/designer_de.ts
new file mode 100644
index 0000000..64f3cf3
--- /dev/null
+++ b/tools/designer/designer/designer_de.ts
@@ -0,0 +1,4969 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>AboutDialog</name>
+ <message encoding="UTF-8">
+ <source>Qt Designer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Version 2.0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Copyright (C) 2000-2008 Trolltech AS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;p&gt;This program is licensed to you under the terms of the GNU General Public License Version 2 as published by the Free Software Foundation. This gives you legal permission to copy, distribute and/or modify this software under certain conditions. For details, see the file &apos;COPYING&apos; that came with this software distribution. If you did not get the file, send email to info@trolltech.com.&lt;/p&gt;
+&lt;p&gt;The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ActionEditor</name>
+ <message>
+ <source>Actions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New &amp;Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Action &amp;Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New &amp;Dropdown Action Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ActionEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Actions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Create new Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete current Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connect current action</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ActionListView</name>
+ <message>
+ <source>New &amp;Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Action &amp;Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New &amp;Dropdown Action Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Connect Action...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ConnectionEditor</name>
+ <message>
+ <source>Signals (%1):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect/Disconnect signals and slots of &apos;%1&apos; and &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ConnectionEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Connections&lt;/b&gt;&lt;p&gt;Add and remove connections in the current form .&lt;/p&gt;&lt;p&gt;Select a signal and a corresponding slot and press the &lt;b&gt;Connect&lt;/b&gt;-button to create a connection.&lt;/p&gt;&lt;p&gt;Select a connection from the list and press the &lt;b&gt;Disconnect&lt;/b&gt;-button to delete the connection.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sender</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Receiver</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Displays the connections between the sender and the receiver.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Si&amp;gnals:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;A list of slots for the receiver.&lt;/b&gt;&lt;p&gt;Only those slots are displayed that have arguments corresponding with the signal selected in the Signal-list.&lt;/b&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connec&amp;tions:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Co&amp;nnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Create connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Create the connection between signal and slot.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Remove selected connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Remove the selected connection.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Edit Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Displays a list of signals for the emitting widget.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Slots:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ConnectionViewer</name>
+ <message>
+ <source>Remove connection between %1 and %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ConnectionViewerBase</name>
+ <message encoding="UTF-8">
+ <source>View Connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;View Connections&lt;/b&gt;&lt;p&gt;Displays all connections in the current form Select a connection from the list and click the &lt;b&gt;Edit&lt;/b&gt;-button to change the connection.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close the Dialog.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sender</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Receiver</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Displays a list of connections.&lt;/b&gt;&lt;p&gt;Select a connection and choose edit, or double-click on an item to change the connection.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Edit connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Opens a dialog to change the selected connection.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>CreateTemplate</name>
+ <message encoding="UTF-8">
+ <source>Create Template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Template &amp;Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Name of the new template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter the name of the new template here</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Class of the new template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose the class which should be used as baseclass for the new template here</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>C&amp;reate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Creates the new template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Closes the Dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Baseclass for Template:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CustomWidgetEditor</name>
+ <message>
+ <source>Adding a Custom Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>There exists already a custom widget with the name &apos;%1&apos;,
+so it is not possible to add another one with this name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Removing Custom Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The custom widget &apos;%1&apos; is currently used, so it can&apos;t be removed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Header Files (*.h *.h++ *.hxx *.hh)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Renaming a Custom Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The name &apos;%1&apos; is already use by another custom widget,
+so it is not possible to rename it to this name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom-Widget Description (*.cw);;All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>CustomWidgetEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Custom Widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Custom Widgets&lt;/b&gt;&lt;p&gt;Add and remove custom widgets to the designer&apos;s database, and change the properties of existing widgets.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of all custom widgets known to the designer.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add new custom widget.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Create an empty custom widget and add it to the list.&lt;/b&gt;&lt;p&gt;New custom widgets have a default name and header-file, which must both be provided.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete custom widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the selected custom widget.&lt;/b&gt;&lt;p&gt;You can only delete widgets that are not used in any open form.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Closes the Dialog.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Load Descriptions...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Loads widget description file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Load Descriptions&lt;/b&gt;&lt;p&gt;Loads a file which contains descriptions of custom widgets, so that these custom widgets can be used in the Qt Designer.&lt;/p&gt;
+&lt;p&gt;As it is a lot of work to type in all the information for custom widgets, you should check the tool createcw which you can find in $QTDIR/tools/designer/tools/createcw. Using that tool you can create custom widget description files for your custom widgets without the need of typing in all that information. For more information about that see the README file in that directory&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Save Descriptions...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Saves widget description file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Save Descriptions&lt;/b&gt;&lt;p&gt;Saves all descriptions of the shown custom widgets to file which can be used to import these custom widgets somewhere else.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change properties for the selected custom widget.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>De&amp;finition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a pixmap-file.&lt;/b&gt;&lt;p&gt;The pixmap will be used to represent the widget in forms.&lt;/b&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter filename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the headerfile&apos;s name for the selected custom widget.&lt;/b&gt;&lt;p&gt;The headerfile will be included by forms using the widget.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose headerfile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Look for the headerfile in a filedialog.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Local</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change how the include file will be included.&lt;/b&gt;&lt;p&gt;Global include-files will be included using &amp;lt;&amp;gt;-brackets, while local files will included using quotation marks.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change classname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Enter the classname for the selected customwidget.&lt;/b&gt;&lt;p&gt;A class of that name has to be defined in the headerfile.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Heade&amp;rfile:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Cl&amp;ass:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Si&amp;ze Hint:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size P&amp;olicy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Fixed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Minimum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Maximum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Preferred</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>MinimumExpanding</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Expanding</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Horizontal Sizepolicy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose the horizontal sizepolicy here</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size hint width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Set the sizehint for the selected widget.&lt;/b&gt;&lt;p&gt;The sizehint provides the recommended size for the widget. Enter a sizehint of -1/-1 if no size is recommended.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size hint height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Vertical Sizepolicy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose the verical sizepolicy for the widget here</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Con&amp;tainer Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Container Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;p&gt;&lt;b&gt;Container Widget&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;If this customwidget should be able to contain other widgets (children), check this checkbox.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Si&amp;gnals</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of all signals the selected widget can emit.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>N&amp;ew Signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add new signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Add a new signal for the current custom widget.&lt;/b&gt;&lt;p&gt;An argument list should be provided in the signal&apos;s name, and the name has to be unique.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Dele&amp;te Signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the signal.&lt;/b&gt;&lt;p&gt;All connections using this signal will be deleted, too.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>S&amp;ignal:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change signal name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the name of the selected slot.&lt;/b&gt;&lt;p&gt;An argument list should be provided in the signal&apos;s name, and the name has to be unique.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>S&amp;lots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of all slots of the selected custom widget.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sl&amp;ot:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change slot name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Access:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>public</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change slot access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the access policy of the slot.&lt;/b&gt;&lt;p&gt;You can only connect to public slots of the widget.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>N&amp;ew Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add new slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Add a new slot to the current custom widget.&lt;/b&gt;&lt;p&gt;An argument list should be provided in the signal&apos;s name, and the name has to be unique.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Dele&amp;te Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the slot.&lt;/b&gt;&lt;p&gt;All connections using this slot will be deleted, too.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>N&amp;ew Property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add new property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Add a new property to the current customwidget.&lt;/b&gt;&lt;p&gt;The properties have to be implemented in the class using the property system of Qt.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Dele&amp;te Property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Deletes the selected property.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>String</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>CString</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>StringList</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Bool</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Int</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>UInt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Font</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Point</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>SizePolicy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select property type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select the type of the property.&lt;/b&gt;&lt;p&gt;The propertiy has to be implemented in the class using the property system of Qt.&lt;/p&gt;&lt;p&gt;You can use integer types to support enumeration properties in the property editor.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;The list of properties of the current custom widget.&lt;/b&gt;&lt;p&gt;The properties of the custom widget can be changed in the property editor.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change property name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Enter a name for the property.&lt;/b&gt;&lt;p&gt;The properties have to be implemented in the class using the property system of Qt.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>P&amp;roperty Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>T&amp;ype:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>DatabaseConnectionBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Database Connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Conn&amp;ection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connec&amp;t</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>DatabaseConnectionEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connection Details</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>DatabaseConnectionWidget</name>
+ <message encoding="UTF-8">
+ <source>Edit Database Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Database Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Username:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>D&amp;river</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Hostname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>P&amp;ort</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Default</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditSlots</name>
+ <message>
+ <source>Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add/Remove slots of &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some syntatically wrong slots defined.
+Remove these slots?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>EditSlotsBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Slots&lt;/b&gt;&lt;p&gt;Add, change and remove slots of the current form.&lt;/p&gt;&lt;p&gt;Press the &lt;b&gt;Add Slot&lt;/b&gt;-button to create a new slot, enter a slot name and choose an access mode.&lt;/p&gt;&lt;p&gt;Select an entry from the list and press the &lt;b&gt;Delete Slot&lt;/b&gt;-button to remove a slot. All connections using this slot will be removed, too.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Specifier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>In Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;This form&apos;s slots.&lt;/b&gt;&lt;p&gt;Select the slot you want to change or delete.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add new slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Add a new slot.&lt;/b&gt;&lt;p&gt;New slots have a default name and public access.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the selected slot.&lt;/b&gt;&lt;p&gt;All connections using this slot are removed, too.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Slot Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Slot:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change slot name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the name of the selected slot.&lt;/b&gt;&lt;p&gt;The name should include the argument list and has to be syntactically correct.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Return type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>S&amp;pecifier:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>non virtual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>virtual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>pure virtual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change slot access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the access policy of the slot&lt;/b&gt;&lt;p&gt;All slots will be created virtual and should be reimplemented in subclasses.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Access:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>public</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>private</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventList</name>
+ <message>
+ <source>New Signal Handler</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete Signal Handler</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>FindDialog</name>
+ <message encoding="UTF-8">
+ <source>Find Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Find:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Find</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Forwar&amp;d</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Backward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Whole words only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Case sensitive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Start at &amp;Beginning</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FormDefinitionView</name>
+ <message>
+ <source>Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>private</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>public</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Properties...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Goto Implementation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit...<byte value="x9"/>Alt+V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Class Variables</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FormFile</name>
+ <message>
+ <source>Failed to save file %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 saved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt User-Interface Files (*.ui)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save form &apos;%1&apos; as ....</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save changes to the form &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Designer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The file %1 has been changed outside Qt Designer.
+Do you want to reload it?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid Filename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The project contains already a form with the
+filename &apos;%1&apos;. Please choose a new filename.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>FormSettingsBase</name>
+ <message encoding="UTF-8">
+ <source>Form Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Form Settings&lt;/b&gt;&lt;p&gt;Change settings for the form. Settings like &lt;b&gt;Comment&lt;/b&gt; and &lt;b&gt;Author&lt;/b&gt; are for personal use and not required.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Pixmaps</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Save In&amp;line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Save pixmaps into the .ui files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Save Inline&lt;/b&gt;&lt;p&gt;Saves the pixmaps you choose as binary data into the .ui files. Pixmaps are not shared between forms. We recommend using Project Imagefiles instead.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Project &amp;Imagefile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use the Project&apos;s Image file to load pixmaps</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Use the Project&apos;s Image file to open pixmaps&lt;/b&gt;
+&lt;p&gt;Each project has a collection of pixmaps. If you use a project, we recommend that you use this option since it shares images and is the fastest and most efficient way to use pixmaps in your forms.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Specify Pixmap-Loader function (only function-name, no parentheses!)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Specify Pixmap-Loader function&lt;/b&gt;&lt;p&gt;Specify the function which should be used for loading a pixmap in the generated code. &lt;em&gt;Only enter the function-name, no parentheses!&lt;/em&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use &amp;Function:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use a defined function to load pixmaps</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Use a defined function to open pixmaps&lt;/b&gt;&lt;p&gt;If you choose this option you must define a function in the line edit at the right which will be used in the generated code for loading pixmaps. When choosing a pixmap in &lt;i&gt;Qt Designer&lt;/i&gt; you will be asked to specify the arguments which will be passed to the function in the generated code.&lt;p&gt; This approach makes it possible to use your own icon-loader function for loading pixmaps. &lt;i&gt;Qt Designer&lt;/i&gt; can&apos;t preview the correct image if you use your own function.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change class name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Enter the name of the class that will be created.&lt;/b&gt;&lt;p&gt;&lt;em&gt;classname.h&lt;/em&gt; and &lt;em&gt;classname.cpp&lt;/em&gt; will be generated as C++-output when it is compiled with the uic.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>A&amp;uthor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter your name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter your name here.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Class &amp;Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Co&amp;mment:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter a comment about the form.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>La&amp;youts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Default Mar&amp;gin:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>D&amp;efault Spacing:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FormWindow</name>
+ <message>
+ <source>Set &apos;name&apos; property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The name of a widget has to be unique!
+&apos;%1&apos; is already used in the form &apos;%2&apos;,
+so the name has been changed back to &apos;%3&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The name of a widget must not be null!
+The name has been changed back to &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Horizontal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Vertical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;A %1 (custom widget)&lt;/b&gt; &lt;p&gt;Select &lt;b&gt;Edit Custom Widgets...&lt;/b&gt; in the &lt;b&gt;Tools-&gt;Custom&lt;/b&gt; menu to add and change the custom widgets. You can add properties as well as signals and slots to integrate them into the designer, and provide a pixmap which will be used to represent the widget on the form.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A %1 (custom widget)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reparent Widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect &apos;%1&apos; with...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Change Tab Order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect &apos;%1&apos; with &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inserting a Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You tried to insert a widget into the laid out Container Widget &apos;%1&apos;.
+This is not possible. In order to insert the widget, the layout of &apos;%1&apos;
+has to be broken. Break the layout or cancel the operation?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Break Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use Size Hint</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adjust Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click widgets to change tab order...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag a line to create a connection...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click on the form to insert a %1...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Following custom widgets are used in &apos;%1&apos;,
+but they are not known to the designer:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check Accelerators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The accelerator &apos;%1&apos; is used %2 times.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Select</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No accelerator is used more than once!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Raise</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout horizontally</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout vertically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout horizontally (in splitter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout vertically (in splitter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout in a grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout children horizontally</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout children vertically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout children in a grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Break Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit connections...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Page</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>GotoLineDialog</name>
+ <message encoding="UTF-8">
+ <source>Goto Line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Line:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Goto</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HierarchyList</name>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Class</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Page to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Page %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HierarchyView</name>
+ <message>
+ <source>Widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> Classes</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IconViewEditor</name>
+ <message>
+ <source>New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Items of &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>IconViewEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Iconview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Iconview&lt;/b&gt;&lt;p&gt;Add, change and remove items in the icon view.&lt;/p&gt;&lt;p&gt;Press the &lt;b&gt;New Item&lt;/b&gt;-button to create a new entry, and enter a text or choose a pixmap.&lt;/p&gt;&lt;p&gt;Select an item from the view and press the &lt;b&gt;Delete Item&lt;/b&gt;-button to remove the item from the view.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>All items in the view.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add an item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Create a new item for the view.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Item Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Text:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change the text for the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Pixmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Label4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete the pixmap of the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a pixmap-file for the current item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListBoxEditor</name>
+ <message>
+ <source>New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Items of &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ListBoxEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Listbox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Listbox&lt;/b&gt;&lt;p&gt;Add, change and remove items in the listbox.&lt;/p&gt;&lt;p&gt;Press the &lt;b&gt;New Item&lt;/b&gt;-button to create a new listbox entry, and enter text or choose a pixmap.&lt;/p&gt;&lt;p&gt;Select an item from the list and press the &lt;b&gt;Delete Item&lt;/b&gt;-button to remove the item from the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of items.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Item Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Pixmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Label4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete the pixmap of the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a pixmap-file for the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Text:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change the text of the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add an item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Add a new item.&lt;/b&gt;&lt;p&gt;New items are appended to the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete the selected item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Moves the selected item up.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move down</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move the selected item down.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ListEditor</name>
+ <message encoding="UTF-8">
+ <source>Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Column 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Re&amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListViewEditor</name>
+ <message>
+ <source>Edit Items and Columns of &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Items</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ListViewEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Listview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Listview&lt;/b&gt;&lt;p&gt;Use the controls on the &lt;b&gt;Items&lt;/b&gt;-tab to add, change and remove items in the listview. Change the column configuration of the view using the controls on the &lt;b&gt;Columns&lt;/b&gt;-tab.&lt;/p&gt;Press the &lt;b&gt;New Item&lt;/b&gt;-button to create a new item and enter a text or provide a pixmap.&lt;/p&gt;&lt;p&gt;Select an item from the list and press the &lt;b&gt;Delete Item&lt;/b&gt;-button to remove the item from the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Deletes the selected item.&lt;/b&gt;&lt;p&gt;Existing subitems are deleted, too.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item &amp;Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pi&amp;xmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Text:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the text of the item.&lt;/b&gt;&lt;p&gt;The text will be changed in the current column of the selected item.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select the current column.&lt;/b&gt;&lt;p&gt;Itemtext and pixmap will be changed for the current column&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Colu&amp;mn:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Label4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the pixmap of the selected item.&lt;/b&gt;&lt;p&gt;The pixmap in the current column of the selected item will be deleted.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a pixmap-file for the item.&lt;/b&gt;&lt;p&gt;The pixmap will be changed in the current column of the selected item.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add an item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Adds a new item to the list.&lt;/b&gt;&lt;p&gt;The item will be inserted at the top of the list and can be moved using the up- and down-buttons.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of items.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>New &amp;Subitem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add a subitem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Create a new subitem for the selected item.&lt;/b&gt;&lt;p&gt;New subitems are inserted at the top of the list of subitems, and new levels will be created automatically.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item up.&lt;/b&gt;&lt;p&gt;The item will be moved within the hierarchy level.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move down</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item down.&lt;/b&gt;&lt;p&gt;The item will be moved within the hierarchy level.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item one level up.&lt;/b&gt;&lt;p&gt;This will also change the level of the parent item.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item one level down.&lt;/b&gt;&lt;p&gt;This will also change the level of the parent item.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Co&amp;lumns</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Column Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Pixmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete the pixmap of the selected column.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a pixmap-file for the selected column.&lt;/b&gt;&lt;p&gt;The pixmap will be displayed in the header of the listview.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter column text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Enter the text for the selected column.&lt;/b&gt;&lt;p&gt;The text will be displayed in the header of the listview.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Clicka&amp;ble</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>If this option is checked, the selected column will react on mouseclicks on the header.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Re&amp;sizable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The column&apos;s width will be resizeable if this option is checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Deletes the selected Column.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item down.&lt;/b&gt;&lt;p&gt;The topmost column will be the first column of the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add a Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Create a new column.&lt;/b&gt;&lt;p&gt;New columns are appended to the list and may be moved using the up- and down-buttons.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item up.&lt;/b&gt;&lt;p&gt;The topmost column will be the first column of the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of columns.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <source>Qt User-Interface Files (*.ui)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ready - This is the non-commercial version of Qt - For commercial evaluation purposes, use the help menu to register with Trolltech.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Property Editor/Signal Handlers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Property Editor&lt;/b&gt;&lt;p&gt;You can change the appearance and behaviour of the selected widget in the property editor.&lt;/p&gt;&lt;p&gt;You can set properties for components and forms at design time and see the changes immediately. Each property has its own editor which you can use to enter new values, open a special dialog or select values from a predefined list. Use &lt;b&gt;F1&lt;/b&gt; to get detailed help for the selected property.&lt;/p&gt;&lt;p&gt;You can resize the columns of the editor by dragging the separators of the list header.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Signal Handlers&lt;/b&gt;&lt;/p&gt;&lt;p&gt;In the Signal Handlers tab you can define connections between signals of widgets and slots of the form. That is just a convenience way, you can use the connection tool to do that as well.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Object Explorer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Object Explorer&lt;/b&gt;&lt;p&gt;The object explorer gives a quick overview about the relations between the widgets in your form. You can use the clipboard functions using a context menu for each item in the view.&lt;/p&gt;&lt;p&gt;The columns can be resized by dragging the separator in the list header.&lt;/p&gt;&lt;p&gt;On the second tab you can see all the declared slots, variables, includes, etc. of the form.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start typing the buffer you want to switch to here (ALT+B)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File Overview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The File Overview box&lt;/b&gt;&lt;p&gt;The File Overview Box displays all files of all projects, including forms and source files.&lt;/p&gt;&lt;p&gt;Its search field allows rapid switching between files.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Action Editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Action Editor&lt;/b&gt;&lt;p&gt;Todo Whatsthis&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Couldn&apos;t find the Qt documentation property index file!
+Define the correct documentation path in the preferences dialog.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Form Window&lt;/b&gt;&lt;p&gt;Use the different tools to add widgets or to change the layout and behaviour of the components in your form. Select one or multiple widgets and move them, or resize a single widget using the handles.&lt;/p&gt;&lt;p&gt;Changes in the &lt;b&gt;Property Editor&lt;/b&gt; can be seen at design time, and you can open a preview of your form in different styles.&lt;/p&gt;&lt;p&gt;You can change the grid resolution, or turn the grid off in the &lt;b&gt;Preferences&lt;/b&gt; dialog in the &lt;b&gt;Edit&lt;/b&gt; menu.&lt;p&gt;You can have several forms open, and all open forms are listed in the &lt;b&gt;Form List&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot create invalid project.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Undo: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Undo: Not Available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redo: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redo: Not Available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose Pixmap...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Text...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Title...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Page Title...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Pages...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Menu Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Toolbar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set &apos;text&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set &apos;title&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Page Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New page title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set &apos;pageTitle&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set &apos;pixmap&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Page to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Page %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename page %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Toolbar to &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Menu to &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Project Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save changes to &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit %1...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Restoring last session</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The Qt Designer found some temporary saved files, which have been
+written when the Qt Designer crashed last time. Do you want to
+load these files?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>There is no help available for this dialog at the moment.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not open &apos;%1&apos;. File does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reverses the last action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redoes the last undone operation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cuts the selected widgets and puts them on the clipboard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copies the selected widgets to the clipboard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pastes clipboard contents</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deletes the selected widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select &amp;All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects all widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bring to Front</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bring to &amp;Front</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Raises the selected widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send to Back</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send to &amp;Back</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lowers the selected widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check Accelerators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Chec&amp;k Accelerators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Checks if the accelerators used in the form are unique</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&amp;lots...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to edit slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Co&amp;nnections...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to edit connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Source...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens an editor to edit the source of the form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Form Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Form Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to change the settings of the form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preferences...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to change preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Edit toolbar&lt;/b&gt;%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Find...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find Incremental</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find &amp;Incremental</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Replace...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Goto Line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Goto Line...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Incremetal Search (ALT+I)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adjust Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adjust &amp;Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adjusts the size of the selected widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Horizontally</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out &amp;Horizontally</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lays out the selected widgets horizontally</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Vertically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out &amp;Vertically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lays out the selected widgets vertically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out in a Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out in a &amp;Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lays out the selected widgets in a grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Horizontally (in Splitter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Horizontally (in S&amp;plitter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lays out the selected widgets horizontally in a splitter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Vertically (in Splitter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Vertically (in Sp&amp;litter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lays out the selected widgets vertically in a splitter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Break Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Break Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Breaks the selected layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert a %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Layout toolbar&lt;/b&gt;%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pointer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Pointer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects the pointer tool</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect Signal/Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Connect Signal/Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects the connection tool</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tab Order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tab &amp;Order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects the tab order tool</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Tools toolbar&lt;/b&gt;%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Tools</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom Widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit &amp;Custom Widgets...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to change the custom widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The %1&lt;/b&gt;%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> Click on a button to insert a single widget, or double click to insert multiple %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The %1 Widgets&lt;/b&gt;%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> Click on a button to insert a single %1 widget, or double click to insert multiple widgets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Double click on this tool to keep it selected.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Custom Widgets toolbar&lt;/b&gt;%1&lt;p&gt;Select &lt;b&gt;Edit Custom Widgets...&lt;/b&gt; in the &lt;b&gt;Tools-&gt;Custom&lt;/b&gt; menu to add and change custom widgets&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> Click on the buttons to insert a single widget, or double click to insert multiple widgets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The File toolbar&lt;/b&gt;%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Creates a new project, form or source file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens an existing project, form for source file </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Closes the current project or document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saves the current project or document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saves the current form with a new filename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sa&amp;ve All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saves all open documents</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create Template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create &amp;Template...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Creates a new template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recently opened files </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recently opened projects</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quits the application and prompts to save changed forms, source files and project settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pr&amp;oject</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;No Project&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add File...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adds a file to the current project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Image Collection...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Image Collection...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to edit the image collection of the current project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database Connections...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Database Connections...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to edit the database connections of the current project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Project Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Project Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to change the settings of the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preview Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preview &amp;Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use the Motif Look&amp;Feel used as the default style on most UNIX-Systems.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use the Windows Look&amp;Feel used as the default style on Windows-Systems.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use the Platinum Look&amp;Feel resembling a Macinosh-like GUI style.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use the CDE Look&amp;Feel which is similar to some versions of the Common Desktop Environment.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use the Motif Look&amp;Feel used as the default style on SGI-systems.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use an advanced Motif Look&amp;Feel as used by the GIMP toolkit (GTK) on Linux.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preview Form in %1 Style</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>... in %1 Style</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a preview in %1 style</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Open a preview in %1 style.&lt;/b&gt;&lt;p&gt;Use the preview to test the design and signal-slot connections of the current form. %2&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Tile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranges all windows tiled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cascade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cascade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arrange all windows cascaded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cl&amp;ose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Closes the active window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close Al&amp;l</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Closes all form windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ne&amp;xt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activates the next window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pre&amp;vious</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activates the previous window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Vie&amp;ws</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool&amp;bars</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Contents</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens the online help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens the Qt Designer manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;About</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Displays information about this product</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Displays information about the Qt Toolkit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Register Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Register Qt...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Launches web browser with evaluation form at www.trolltech.com</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Register with Trolltech</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&quot;What&apos;s This?&quot; context sensitive help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Help toolbar&lt;/b&gt;%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select new item ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select a file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Designer Files (*.ui *.pro)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QMAKE Project Files (*.pro)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No import filter available for %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Importing %1 using import filter ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Nothing to load in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reading file %1...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File %1 opened.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to load file %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Couldn&apos;t load file %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Project &apos;%1&apos; saved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter a filename...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Designer is crashing - attempting to save work...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NewTemplate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Couldn&apos;t create the template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit slots of current form...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit connections in current form...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit settings of current form...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit preferences...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit custom widgets...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Column 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tab 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tab 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load Template</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MultiLineEditor</name>
+ <message>
+ <source>Set text of &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>MultiLineEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Multiline Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Multiline Edit&lt;/b&gt;&lt;p&gt;Enter the text and press the &lt;b&gt;OK&lt;/b&gt;-Button to apply the changes.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Text:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter your text here.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NewForm</name>
+ <message>
+ <source>Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wizard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>NewFormBase</name>
+ <message encoding="UTF-8">
+ <source>New File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;New Form&lt;/b&gt;&lt;p&gt;Select a template for the new form and click the &lt;b&gt;OK&lt;/b&gt;-button to open it.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Open a new form using the selected template.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and do not open a form.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Displays a list of available templates.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Insert into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OutputWindow</name>
+ <message>
+ <source>Error Messages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PaletteEditorAdvancedBase</name>
+ <message encoding="UTF-8">
+ <source>Tune Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Palette&lt;/b&gt;&lt;p&gt;Change the palette of the current widget or form.&lt;/p&gt;&lt;p&gt;Use a generated palette or select colors for each color group and each color role.&lt;/p&gt;&lt;p&gt;The palette can be tested with different widget layouts in the preview section.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select &amp;Palette:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Active Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Inactive Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Disabled Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Auto</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Build inactive palette from active.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Build disabled palette from active.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Central color &amp;roles</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Foreground</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Button</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Base</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>BrightText</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>ButtonText</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Highlight</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>HighlightText</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Link</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>LinkVisited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose central color role</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a color role.&lt;/b&gt;&lt;p&gt;Available central roles are: &lt;ul&gt; &lt;li&gt;Background - general background color.&lt;/li&gt; &lt;li&gt;Foreground - general foreground color. &lt;/li&gt; &lt;li&gt;Base - used as background color for e.g. text entry widgets, usually white or another light color. &lt;/li&gt; &lt;li&gt;Text - the forground color used with Base. Usually this is the same as the Foreground, in what case it must provide good contrast both with Background and Base. &lt;/li&gt; &lt;li&gt;Button - general button background color, where buttons need a background different from Background, as in the Macintosh style. &lt;/li&gt; &lt;li&gt;ButtonText - a foreground color used with the Button color. &lt;/li&gt; &lt;li&gt;Highlight - a color to indicate a selected or highlighted item. &lt;/li&gt; &lt;li&gt;HighlightedText - a text color that contrasts to Highlight. &lt;/li&gt; &lt;li&gt;BrightText - a text color that is very different from Foreground and contrasts well with e.g. black. &lt;/li&gt; &lt;/ul&gt; &lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose Pi&amp;xmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a pixmap-file for the selected central color role.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Select Color:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a color for the selected central color role.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>3-D shadow &amp;effects</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Build &amp;from button color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Generate shadings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Check to let 3D-effect colors be calculated from button-color.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Light</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Midlight</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Mid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Dark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Shadow</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose 3D-effect color role</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a color role.&lt;/b&gt;&lt;p&gt;Available effect roles are: &lt;ul&gt; &lt;li&gt;Light - lighter than Button color. &lt;/li&gt; &lt;li&gt;Midlight - between Button and Light. &lt;/li&gt; &lt;li&gt;Mid - between Button and Dark. &lt;/li&gt; &lt;li&gt;Dark - darker than Button. &lt;/li&gt; &lt;li&gt;Shadow - a very dark color. &lt;/li&gt; &lt;/ul&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select Co&amp;lor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a color for the selected effect color role.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PaletteEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Build Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;3-D Effects:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose the effect-color for the generated palette.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Back&amp;ground:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose the background color for the generated palette.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Tune Palette...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select &amp;Palette:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Active Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Inactive Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Disabled Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PixmapCollectionEditor</name>
+ <message encoding="UTF-8">
+ <source>Manage Image Collection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Add...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose an Image</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PixmapFunction</name>
+ <message encoding="UTF-8">
+ <source>Choose Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Enter arguments for loading the pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>QPixmap(</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>Preferences</name>
+ <message encoding="UTF-8">
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Preferences&lt;/b&gt;&lt;p&gt;Change the preferences of the designer application. There is always one tab with general preferenced. Depending on installed plugins, there might be more tabs for plugin preferences.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Backgro&amp;und</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a color in the colordialog.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Co&amp;lor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use a background color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use a background color.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use a background pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use a background pixmap.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a pixmap-file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show &amp;Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Customize the grid appearance for all forms.&lt;/b&gt;&lt;p&gt;When &lt;b&gt;Show Grid&lt;/b&gt; is checked, all forms show a grid.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Gr&amp;id</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sn&amp;ap to Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Snap to the grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Customize the grid-settings for all forms.&lt;/b&gt;&lt;p&gt;When &lt;b&gt;Snap to Grid&lt;/b&gt; is checked, the widgets snap to the grid using the the X/Y resolution.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Grid resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Customize the grid-settings for all forms.&lt;/b&gt;&lt;p&gt;When &lt;b&gt;Show Grid&lt;/b&gt; is checked, a grid is shown on all forms using the X/Y resolution.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Grid-&amp;X:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Grid-&amp;Y:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>A splashscreen is displayed when starting the designer if this option is checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ge&amp;neral</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Restore Last &amp;Workspace on Startup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Restore last workspace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The current workspace settings will be restored next time you start the designer if this option is checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show &amp;Splash Screen on Startup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show Splashscreen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Disable Data&amp;base Auto-Edit in Preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Documentation Path:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Enter the path to the documentation.&lt;/b&gt;&lt;p&gt;You may provide an $environment variable as first part of your pathname.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select path</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Look for the documentation path.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Toolbars</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show &amp;Big Icons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Big Icons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Uses big icons in the toolbars when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show Text Lab&amp;els</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Text Labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Shows textlabels in the toolbars when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PreviewWidgetBase</name>
+ <message encoding="UTF-8">
+ <source>Preview Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>ButtonGroup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>RadioButton1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>RadioButton2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>RadioButton3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>ButtonGroup2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>CheckBox1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>CheckBox2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>LineEdit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>ComboBox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>PushButton</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;p&gt;
+&lt;a href=&quot;http://www.trolltech.com&quot;&gt; http://www.trolltech.com &lt;/a&gt;
+&lt;/p&gt;
+&lt;p&gt;
+&lt;a href=&quot;http://www.kde.org&quot;&gt; http://www.kde.org &lt;/a&gt;
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Project</name>
+ <message>
+ <source>&lt;No Project&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ProjectSettings</name>
+ <message>
+ <source>unnamed.pro</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database Files (*.db);;All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Project Files (*.pro);;All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ProjectSettingsBase</name>
+ <message encoding="UTF-8">
+ <source>Project Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Project File:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>For&amp;ms and Sources:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Filename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Database File:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyBoolItem</name>
+ <message>
+ <source>False</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>True</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyColorItem</name>
+ <message>
+ <source>Red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyCoordItem</name>
+ <message>
+ <source>x</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>y</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>height</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyCursorItem</name>
+ <message>
+ <source>Arrow</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Up-Arrow</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cross</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>iBeam</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size Vertical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size Horizontal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size Slash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size Backslash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Blank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Split Vertical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Split Horizontal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pointing Hand</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Forbidden</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyDatabaseItem</name>
+ <message>
+ <source>Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Table</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Field</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyEditor</name>
+ <message>
+ <source>Reset property to its default value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click this button to reset the property to its default value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Property Editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Signal Handlers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Property Editor (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyFontItem</name>
+ <message>
+ <source>Family</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Point Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Strikeout</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyList</name>
+ <message>
+ <source>Property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set &apos;%1&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sort &amp;Categorized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sort &amp;Alphabetically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reset &apos;%1&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;QWidget::%1&lt;/b&gt;&lt;/p&gt;&lt;p&gt;There is no documentation available for this property.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertySizePolicyItem</name>
+ <message>
+ <source>hSizeType</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>vSizeType</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>horizontalStretch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>verticalStretch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1/%2/%2/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyTextItem</name>
+ <message>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QApplication</name>
+ <message>
+ <source>Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not connect to the database.
+Press &apos;OK&apos; to continue or &apos;Cancel&apos; to specify different
+connection information.
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerMenuBar</name>
+ <message>
+ <source>Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename Item...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Menu &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename Menuitem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Menu Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename Menu &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move menu &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerPopupMenu</name>
+ <message>
+ <source>Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Separator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Action &apos;%1&apos; from the Popup Menu &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Separator to the Popup Menu &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Action &apos;%1&apos; to the Popup Menu &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert/Move Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The Action &apos;%1&apos; has already been added to this menu.
+An Action can only be added once to the same menu.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerTabWidget</name>
+ <message>
+ <source>Move Tab Page</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerToolBar</name>
+ <message>
+ <source>Delete Toolbar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Toolbar &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Separator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Action &apos;%1&apos; from Toolbar &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Separator to Toolbar &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Action &apos;%1&apos; to Toolbar &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert/Move Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The Action &apos;%1&apos; has already been added to this toolbar.
+An Action can only be added once to the same toolbar.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Widget &apos;%1&apos; to Toolbar &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ReplaceDialog</name>
+ <message encoding="UTF-8">
+ <source>Replace Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>R&amp;eplace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Find</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Replace &amp;All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Whole words only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Case sensitive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Start at Beginning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Forwar&amp;d</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Backward</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SizeHandle</name>
+ <message>
+ <source>%1/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Resize</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SourceEditor</name>
+ <message>
+ <source>Edit %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SourceFile</name>
+ <message>
+ <source>Edit %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Code</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save changes to &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Designer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The file %1 has been changed outside Qt Designer.
+Do you want to reload it?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid Filename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The project contains already a sourcefile with the
+filename &apos;%1&apos;. Please choose a new filename.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TableEditor</name>
+ <message>
+ <source>Edit Rows and Columns of &apos;%1&apos; </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>TableEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Table</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Co&amp;lumns</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item up.&lt;/b&gt;&lt;p&gt;The topmost column will be the first column of the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move down</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item down.&lt;/b&gt;&lt;p&gt;The topmost column will be the first column of the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Table:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Label4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the pixmap of the selected item.&lt;/b&gt;&lt;p&gt;The pixmap in the current column of the selected item will be deleted.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a pixmap-file for the item.&lt;/b&gt;&lt;p&gt;The pixmap will be changed in the current column of the selected item.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Label:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Field:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;no table&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Rows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Row</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Row</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TextEditor</name>
+ <message>
+ <source>Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WizardEditor</name>
+ <message>
+ <source>Edit Wizard Pages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Page to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Page %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Swap pages %1 and %2 of %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Page Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New page title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename page %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>WizardEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Wizard Page Editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Wizard Pages:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Workspace</name>
+ <message>
+ <source>Files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open source file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Remove source file from project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open form...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Remove form from project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open form source...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>qChoosePixmap</name>
+ <message>
+ <source>All Pixmaps (</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1-Pixmaps (%2)
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>)
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose Images...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a Pixmap...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/tools/designer/designer/designer_fr.ts b/tools/designer/designer/designer_fr.ts
new file mode 100644
index 0000000..64f3cf3
--- /dev/null
+++ b/tools/designer/designer/designer_fr.ts
@@ -0,0 +1,4969 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>AboutDialog</name>
+ <message encoding="UTF-8">
+ <source>Qt Designer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Version 2.0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Copyright (C) 2000-2008 Trolltech AS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;p&gt;This program is licensed to you under the terms of the GNU General Public License Version 2 as published by the Free Software Foundation. This gives you legal permission to copy, distribute and/or modify this software under certain conditions. For details, see the file &apos;COPYING&apos; that came with this software distribution. If you did not get the file, send email to info@trolltech.com.&lt;/p&gt;
+&lt;p&gt;The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ActionEditor</name>
+ <message>
+ <source>Actions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New &amp;Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Action &amp;Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New &amp;Dropdown Action Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ActionEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Actions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Create new Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete current Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connect current action</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ActionListView</name>
+ <message>
+ <source>New &amp;Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Action &amp;Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New &amp;Dropdown Action Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Connect Action...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ConnectionEditor</name>
+ <message>
+ <source>Signals (%1):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect/Disconnect signals and slots of &apos;%1&apos; and &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ConnectionEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Connections&lt;/b&gt;&lt;p&gt;Add and remove connections in the current form .&lt;/p&gt;&lt;p&gt;Select a signal and a corresponding slot and press the &lt;b&gt;Connect&lt;/b&gt;-button to create a connection.&lt;/p&gt;&lt;p&gt;Select a connection from the list and press the &lt;b&gt;Disconnect&lt;/b&gt;-button to delete the connection.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sender</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Receiver</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Displays the connections between the sender and the receiver.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Si&amp;gnals:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;A list of slots for the receiver.&lt;/b&gt;&lt;p&gt;Only those slots are displayed that have arguments corresponding with the signal selected in the Signal-list.&lt;/b&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connec&amp;tions:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Co&amp;nnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Create connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Create the connection between signal and slot.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Remove selected connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Remove the selected connection.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Edit Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Displays a list of signals for the emitting widget.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Slots:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ConnectionViewer</name>
+ <message>
+ <source>Remove connection between %1 and %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ConnectionViewerBase</name>
+ <message encoding="UTF-8">
+ <source>View Connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;View Connections&lt;/b&gt;&lt;p&gt;Displays all connections in the current form Select a connection from the list and click the &lt;b&gt;Edit&lt;/b&gt;-button to change the connection.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close the Dialog.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sender</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Receiver</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Displays a list of connections.&lt;/b&gt;&lt;p&gt;Select a connection and choose edit, or double-click on an item to change the connection.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Edit connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Opens a dialog to change the selected connection.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>CreateTemplate</name>
+ <message encoding="UTF-8">
+ <source>Create Template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Template &amp;Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Name of the new template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter the name of the new template here</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Class of the new template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose the class which should be used as baseclass for the new template here</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>C&amp;reate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Creates the new template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Closes the Dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Baseclass for Template:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CustomWidgetEditor</name>
+ <message>
+ <source>Adding a Custom Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>There exists already a custom widget with the name &apos;%1&apos;,
+so it is not possible to add another one with this name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Removing Custom Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The custom widget &apos;%1&apos; is currently used, so it can&apos;t be removed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Header Files (*.h *.h++ *.hxx *.hh)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Renaming a Custom Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The name &apos;%1&apos; is already use by another custom widget,
+so it is not possible to rename it to this name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom-Widget Description (*.cw);;All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>CustomWidgetEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Custom Widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Custom Widgets&lt;/b&gt;&lt;p&gt;Add and remove custom widgets to the designer&apos;s database, and change the properties of existing widgets.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of all custom widgets known to the designer.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add new custom widget.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Create an empty custom widget and add it to the list.&lt;/b&gt;&lt;p&gt;New custom widgets have a default name and header-file, which must both be provided.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete custom widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the selected custom widget.&lt;/b&gt;&lt;p&gt;You can only delete widgets that are not used in any open form.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Closes the Dialog.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Load Descriptions...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Loads widget description file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Load Descriptions&lt;/b&gt;&lt;p&gt;Loads a file which contains descriptions of custom widgets, so that these custom widgets can be used in the Qt Designer.&lt;/p&gt;
+&lt;p&gt;As it is a lot of work to type in all the information for custom widgets, you should check the tool createcw which you can find in $QTDIR/tools/designer/tools/createcw. Using that tool you can create custom widget description files for your custom widgets without the need of typing in all that information. For more information about that see the README file in that directory&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Save Descriptions...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Saves widget description file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Save Descriptions&lt;/b&gt;&lt;p&gt;Saves all descriptions of the shown custom widgets to file which can be used to import these custom widgets somewhere else.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change properties for the selected custom widget.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>De&amp;finition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a pixmap-file.&lt;/b&gt;&lt;p&gt;The pixmap will be used to represent the widget in forms.&lt;/b&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter filename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the headerfile&apos;s name for the selected custom widget.&lt;/b&gt;&lt;p&gt;The headerfile will be included by forms using the widget.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose headerfile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Look for the headerfile in a filedialog.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Local</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change how the include file will be included.&lt;/b&gt;&lt;p&gt;Global include-files will be included using &amp;lt;&amp;gt;-brackets, while local files will included using quotation marks.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change classname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Enter the classname for the selected customwidget.&lt;/b&gt;&lt;p&gt;A class of that name has to be defined in the headerfile.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Heade&amp;rfile:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Cl&amp;ass:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Si&amp;ze Hint:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size P&amp;olicy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Fixed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Minimum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Maximum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Preferred</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>MinimumExpanding</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Expanding</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Horizontal Sizepolicy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose the horizontal sizepolicy here</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size hint width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Set the sizehint for the selected widget.&lt;/b&gt;&lt;p&gt;The sizehint provides the recommended size for the widget. Enter a sizehint of -1/-1 if no size is recommended.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size hint height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Vertical Sizepolicy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose the verical sizepolicy for the widget here</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Con&amp;tainer Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Container Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;p&gt;&lt;b&gt;Container Widget&lt;/b&gt;&lt;/p&gt;
+&lt;p&gt;If this customwidget should be able to contain other widgets (children), check this checkbox.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Si&amp;gnals</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of all signals the selected widget can emit.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>N&amp;ew Signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add new signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Add a new signal for the current custom widget.&lt;/b&gt;&lt;p&gt;An argument list should be provided in the signal&apos;s name, and the name has to be unique.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Dele&amp;te Signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete signal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the signal.&lt;/b&gt;&lt;p&gt;All connections using this signal will be deleted, too.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>S&amp;ignal:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change signal name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the name of the selected slot.&lt;/b&gt;&lt;p&gt;An argument list should be provided in the signal&apos;s name, and the name has to be unique.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>S&amp;lots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of all slots of the selected custom widget.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sl&amp;ot:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change slot name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Access:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>public</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change slot access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the access policy of the slot.&lt;/b&gt;&lt;p&gt;You can only connect to public slots of the widget.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>N&amp;ew Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add new slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Add a new slot to the current custom widget.&lt;/b&gt;&lt;p&gt;An argument list should be provided in the signal&apos;s name, and the name has to be unique.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Dele&amp;te Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the slot.&lt;/b&gt;&lt;p&gt;All connections using this slot will be deleted, too.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>N&amp;ew Property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add new property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Add a new property to the current customwidget.&lt;/b&gt;&lt;p&gt;The properties have to be implemented in the class using the property system of Qt.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Dele&amp;te Property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Deletes the selected property.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>String</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>CString</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>StringList</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Bool</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Int</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>UInt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Font</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Point</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>SizePolicy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select property type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select the type of the property.&lt;/b&gt;&lt;p&gt;The propertiy has to be implemented in the class using the property system of Qt.&lt;/p&gt;&lt;p&gt;You can use integer types to support enumeration properties in the property editor.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;The list of properties of the current custom widget.&lt;/b&gt;&lt;p&gt;The properties of the custom widget can be changed in the property editor.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change property name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Enter a name for the property.&lt;/b&gt;&lt;p&gt;The properties have to be implemented in the class using the property system of Qt.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>P&amp;roperty Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>T&amp;ype:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>DatabaseConnectionBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Database Connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Conn&amp;ection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connec&amp;t</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>DatabaseConnectionEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connection Details</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>DatabaseConnectionWidget</name>
+ <message encoding="UTF-8">
+ <source>Edit Database Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Database Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Username:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>D&amp;river</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Hostname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>P&amp;ort</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Default</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditSlots</name>
+ <message>
+ <source>Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add/Remove slots of &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some syntatically wrong slots defined.
+Remove these slots?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>EditSlotsBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Slots&lt;/b&gt;&lt;p&gt;Add, change and remove slots of the current form.&lt;/p&gt;&lt;p&gt;Press the &lt;b&gt;Add Slot&lt;/b&gt;-button to create a new slot, enter a slot name and choose an access mode.&lt;/p&gt;&lt;p&gt;Select an entry from the list and press the &lt;b&gt;Delete Slot&lt;/b&gt;-button to remove a slot. All connections using this slot will be removed, too.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Specifier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>In Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;This form&apos;s slots.&lt;/b&gt;&lt;p&gt;Select the slot you want to change or delete.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add new slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Add a new slot.&lt;/b&gt;&lt;p&gt;New slots have a default name and public access.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete slot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the selected slot.&lt;/b&gt;&lt;p&gt;All connections using this slot are removed, too.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Slot Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Slot:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change slot name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the name of the selected slot.&lt;/b&gt;&lt;p&gt;The name should include the argument list and has to be syntactically correct.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Return type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>S&amp;pecifier:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>non virtual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>virtual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>pure virtual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change slot access</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the access policy of the slot&lt;/b&gt;&lt;p&gt;All slots will be created virtual and should be reimplemented in subclasses.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Access:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>public</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>private</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventList</name>
+ <message>
+ <source>New Signal Handler</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete Signal Handler</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>FindDialog</name>
+ <message encoding="UTF-8">
+ <source>Find Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Find:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Find</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Forwar&amp;d</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Backward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Whole words only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Case sensitive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Start at &amp;Beginning</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FormDefinitionView</name>
+ <message>
+ <source>Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>private</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>protected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>public</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Properties...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Goto Implementation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit...<byte value="x9"/>Alt+V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Class Variables</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FormFile</name>
+ <message>
+ <source>Failed to save file %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 saved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt User-Interface Files (*.ui)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save form &apos;%1&apos; as ....</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save changes to the form &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Designer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The file %1 has been changed outside Qt Designer.
+Do you want to reload it?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid Filename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The project contains already a form with the
+filename &apos;%1&apos;. Please choose a new filename.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>FormSettingsBase</name>
+ <message encoding="UTF-8">
+ <source>Form Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Form Settings&lt;/b&gt;&lt;p&gt;Change settings for the form. Settings like &lt;b&gt;Comment&lt;/b&gt; and &lt;b&gt;Author&lt;/b&gt; are for personal use and not required.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Pixmaps</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Save In&amp;line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Save pixmaps into the .ui files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Save Inline&lt;/b&gt;&lt;p&gt;Saves the pixmaps you choose as binary data into the .ui files. Pixmaps are not shared between forms. We recommend using Project Imagefiles instead.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Project &amp;Imagefile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use the Project&apos;s Image file to load pixmaps</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Use the Project&apos;s Image file to open pixmaps&lt;/b&gt;
+&lt;p&gt;Each project has a collection of pixmaps. If you use a project, we recommend that you use this option since it shares images and is the fastest and most efficient way to use pixmaps in your forms.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Specify Pixmap-Loader function (only function-name, no parentheses!)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Specify Pixmap-Loader function&lt;/b&gt;&lt;p&gt;Specify the function which should be used for loading a pixmap in the generated code. &lt;em&gt;Only enter the function-name, no parentheses!&lt;/em&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use &amp;Function:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use a defined function to load pixmaps</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Use a defined function to open pixmaps&lt;/b&gt;&lt;p&gt;If you choose this option you must define a function in the line edit at the right which will be used in the generated code for loading pixmaps. When choosing a pixmap in &lt;i&gt;Qt Designer&lt;/i&gt; you will be asked to specify the arguments which will be passed to the function in the generated code.&lt;p&gt; This approach makes it possible to use your own icon-loader function for loading pixmaps. &lt;i&gt;Qt Designer&lt;/i&gt; can&apos;t preview the correct image if you use your own function.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change class name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Enter the name of the class that will be created.&lt;/b&gt;&lt;p&gt;&lt;em&gt;classname.h&lt;/em&gt; and &lt;em&gt;classname.cpp&lt;/em&gt; will be generated as C++-output when it is compiled with the uic.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>A&amp;uthor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter your name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter your name here.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Class &amp;Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Co&amp;mment:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter a comment about the form.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>La&amp;youts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Default Mar&amp;gin:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>D&amp;efault Spacing:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FormWindow</name>
+ <message>
+ <source>Set &apos;name&apos; property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The name of a widget has to be unique!
+&apos;%1&apos; is already used in the form &apos;%2&apos;,
+so the name has been changed back to &apos;%3&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The name of a widget must not be null!
+The name has been changed back to &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Horizontal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Vertical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;A %1 (custom widget)&lt;/b&gt; &lt;p&gt;Select &lt;b&gt;Edit Custom Widgets...&lt;/b&gt; in the &lt;b&gt;Tools-&gt;Custom&lt;/b&gt; menu to add and change the custom widgets. You can add properties as well as signals and slots to integrate them into the designer, and provide a pixmap which will be used to represent the widget on the form.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A %1 (custom widget)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reparent Widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect &apos;%1&apos; with...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Change Tab Order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect &apos;%1&apos; with &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inserting a Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You tried to insert a widget into the laid out Container Widget &apos;%1&apos;.
+This is not possible. In order to insert the widget, the layout of &apos;%1&apos;
+has to be broken. Break the layout or cancel the operation?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Break Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use Size Hint</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adjust Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click widgets to change tab order...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag a line to create a connection...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click on the form to insert a %1...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Following custom widgets are used in &apos;%1&apos;,
+but they are not known to the designer:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check Accelerators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The accelerator &apos;%1&apos; is used %2 times.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Select</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No accelerator is used more than once!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Raise</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout horizontally</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout vertically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout horizontally (in splitter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout vertically (in splitter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout in a grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout children horizontally</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout children vertically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout children in a grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Break Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit connections...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Page</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>GotoLineDialog</name>
+ <message encoding="UTF-8">
+ <source>Goto Line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Line:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Goto</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HierarchyList</name>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Class</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Page to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Page %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HierarchyView</name>
+ <message>
+ <source>Widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> Classes</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IconViewEditor</name>
+ <message>
+ <source>New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Items of &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>IconViewEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Iconview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Iconview&lt;/b&gt;&lt;p&gt;Add, change and remove items in the icon view.&lt;/p&gt;&lt;p&gt;Press the &lt;b&gt;New Item&lt;/b&gt;-button to create a new entry, and enter a text or choose a pixmap.&lt;/p&gt;&lt;p&gt;Select an item from the view and press the &lt;b&gt;Delete Item&lt;/b&gt;-button to remove the item from the view.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>All items in the view.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add an item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Create a new item for the view.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Item Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Text:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change the text for the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Pixmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Label4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete the pixmap of the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a pixmap-file for the current item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListBoxEditor</name>
+ <message>
+ <source>New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Items of &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ListBoxEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Listbox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Listbox&lt;/b&gt;&lt;p&gt;Add, change and remove items in the listbox.&lt;/p&gt;&lt;p&gt;Press the &lt;b&gt;New Item&lt;/b&gt;-button to create a new listbox entry, and enter text or choose a pixmap.&lt;/p&gt;&lt;p&gt;Select an item from the list and press the &lt;b&gt;Delete Item&lt;/b&gt;-button to remove the item from the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of items.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Item Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Pixmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Label4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete the pixmap of the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a pixmap-file for the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Text:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change the text of the selected item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add an item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Add a new item.&lt;/b&gt;&lt;p&gt;New items are appended to the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete the selected item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Moves the selected item up.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move down</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move the selected item down.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ListEditor</name>
+ <message encoding="UTF-8">
+ <source>Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Column 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Re&amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListViewEditor</name>
+ <message>
+ <source>Edit Items and Columns of &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Items</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ListViewEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Listview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Listview&lt;/b&gt;&lt;p&gt;Use the controls on the &lt;b&gt;Items&lt;/b&gt;-tab to add, change and remove items in the listview. Change the column configuration of the view using the controls on the &lt;b&gt;Columns&lt;/b&gt;-tab.&lt;/p&gt;Press the &lt;b&gt;New Item&lt;/b&gt;-button to create a new item and enter a text or provide a pixmap.&lt;/p&gt;&lt;p&gt;Select an item from the list and press the &lt;b&gt;Delete Item&lt;/b&gt;-button to remove the item from the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Deletes the selected item.&lt;/b&gt;&lt;p&gt;Existing subitems are deleted, too.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item &amp;Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pi&amp;xmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Text:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Change the text of the item.&lt;/b&gt;&lt;p&gt;The text will be changed in the current column of the selected item.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Change column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select the current column.&lt;/b&gt;&lt;p&gt;Itemtext and pixmap will be changed for the current column&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Colu&amp;mn:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Label4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the pixmap of the selected item.&lt;/b&gt;&lt;p&gt;The pixmap in the current column of the selected item will be deleted.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a pixmap-file for the item.&lt;/b&gt;&lt;p&gt;The pixmap will be changed in the current column of the selected item.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add an item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Adds a new item to the list.&lt;/b&gt;&lt;p&gt;The item will be inserted at the top of the list and can be moved using the up- and down-buttons.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of items.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>New &amp;Subitem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add a subitem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Create a new subitem for the selected item.&lt;/b&gt;&lt;p&gt;New subitems are inserted at the top of the list of subitems, and new levels will be created automatically.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item up.&lt;/b&gt;&lt;p&gt;The item will be moved within the hierarchy level.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move down</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item down.&lt;/b&gt;&lt;p&gt;The item will be moved within the hierarchy level.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item one level up.&lt;/b&gt;&lt;p&gt;This will also change the level of the parent item.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item one level down.&lt;/b&gt;&lt;p&gt;This will also change the level of the parent item.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Co&amp;lumns</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Column Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Pixmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete the pixmap of the selected column.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a pixmap-file for the selected column.&lt;/b&gt;&lt;p&gt;The pixmap will be displayed in the header of the listview.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter column text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Enter the text for the selected column.&lt;/b&gt;&lt;p&gt;The text will be displayed in the header of the listview.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Clicka&amp;ble</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>If this option is checked, the selected column will react on mouseclicks on the header.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Re&amp;sizable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The column&apos;s width will be resizeable if this option is checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Deletes the selected Column.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item down.&lt;/b&gt;&lt;p&gt;The topmost column will be the first column of the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add a Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Create a new column.&lt;/b&gt;&lt;p&gt;New columns are appended to the list and may be moved using the up- and down-buttons.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item up.&lt;/b&gt;&lt;p&gt;The topmost column will be the first column of the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The list of columns.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <source>Qt User-Interface Files (*.ui)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ready - This is the non-commercial version of Qt - For commercial evaluation purposes, use the help menu to register with Trolltech.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Property Editor/Signal Handlers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Property Editor&lt;/b&gt;&lt;p&gt;You can change the appearance and behaviour of the selected widget in the property editor.&lt;/p&gt;&lt;p&gt;You can set properties for components and forms at design time and see the changes immediately. Each property has its own editor which you can use to enter new values, open a special dialog or select values from a predefined list. Use &lt;b&gt;F1&lt;/b&gt; to get detailed help for the selected property.&lt;/p&gt;&lt;p&gt;You can resize the columns of the editor by dragging the separators of the list header.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Signal Handlers&lt;/b&gt;&lt;/p&gt;&lt;p&gt;In the Signal Handlers tab you can define connections between signals of widgets and slots of the form. That is just a convenience way, you can use the connection tool to do that as well.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Object Explorer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Object Explorer&lt;/b&gt;&lt;p&gt;The object explorer gives a quick overview about the relations between the widgets in your form. You can use the clipboard functions using a context menu for each item in the view.&lt;/p&gt;&lt;p&gt;The columns can be resized by dragging the separator in the list header.&lt;/p&gt;&lt;p&gt;On the second tab you can see all the declared slots, variables, includes, etc. of the form.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start typing the buffer you want to switch to here (ALT+B)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File Overview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The File Overview box&lt;/b&gt;&lt;p&gt;The File Overview Box displays all files of all projects, including forms and source files.&lt;/p&gt;&lt;p&gt;Its search field allows rapid switching between files.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Action Editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Action Editor&lt;/b&gt;&lt;p&gt;Todo Whatsthis&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Couldn&apos;t find the Qt documentation property index file!
+Define the correct documentation path in the preferences dialog.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Form Window&lt;/b&gt;&lt;p&gt;Use the different tools to add widgets or to change the layout and behaviour of the components in your form. Select one or multiple widgets and move them, or resize a single widget using the handles.&lt;/p&gt;&lt;p&gt;Changes in the &lt;b&gt;Property Editor&lt;/b&gt; can be seen at design time, and you can open a preview of your form in different styles.&lt;/p&gt;&lt;p&gt;You can change the grid resolution, or turn the grid off in the &lt;b&gt;Preferences&lt;/b&gt; dialog in the &lt;b&gt;Edit&lt;/b&gt; menu.&lt;p&gt;You can have several forms open, and all open forms are listed in the &lt;b&gt;Form List&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot create invalid project.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Undo: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Undo: Not Available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redo: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redo: Not Available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose Pixmap...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Text...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Title...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Page Title...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Pages...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Menu Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Toolbar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set &apos;text&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set &apos;title&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Page Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New page title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set &apos;pageTitle&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set &apos;pixmap&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Page to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Page %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename page %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Toolbar to &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Menu to &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Project Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save changes to &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit %1...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Restoring last session</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The Qt Designer found some temporary saved files, which have been
+written when the Qt Designer crashed last time. Do you want to
+load these files?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>There is no help available for this dialog at the moment.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not open &apos;%1&apos;. File does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reverses the last action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redoes the last undone operation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cuts the selected widgets and puts them on the clipboard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copies the selected widgets to the clipboard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pastes clipboard contents</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deletes the selected widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select &amp;All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects all widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bring to Front</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bring to &amp;Front</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Raises the selected widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send to Back</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send to &amp;Back</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lowers the selected widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check Accelerators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Chec&amp;k Accelerators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Checks if the accelerators used in the form are unique</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&amp;lots...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to edit slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Co&amp;nnections...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to edit connections</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Source...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens an editor to edit the source of the form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Form Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Form Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to change the settings of the form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preferences...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to change preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Edit toolbar&lt;/b&gt;%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Find...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find Incremental</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find &amp;Incremental</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Replace...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Goto Line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Goto Line...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Incremetal Search (ALT+I)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adjust Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adjust &amp;Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adjusts the size of the selected widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Horizontally</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out &amp;Horizontally</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lays out the selected widgets horizontally</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Vertically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out &amp;Vertically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lays out the selected widgets vertically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out in a Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out in a &amp;Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lays out the selected widgets in a grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Horizontally (in Splitter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Horizontally (in S&amp;plitter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lays out the selected widgets horizontally in a splitter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Vertically (in Splitter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lay Out Vertically (in Sp&amp;litter)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lays out the selected widgets vertically in a splitter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Break Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Break Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Breaks the selected layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert a %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Layout toolbar&lt;/b&gt;%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Layout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pointer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Pointer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects the pointer tool</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect Signal/Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Connect Signal/Slots</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects the connection tool</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tab Order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tab &amp;Order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects the tab order tool</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Tools toolbar&lt;/b&gt;%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Tools</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom Widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit &amp;Custom Widgets...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to change the custom widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The %1&lt;/b&gt;%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> Click on a button to insert a single widget, or double click to insert multiple %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The %1 Widgets&lt;/b&gt;%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> Click on a button to insert a single %1 widget, or double click to insert multiple widgets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Double click on this tool to keep it selected.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Custom Widgets toolbar&lt;/b&gt;%1&lt;p&gt;Select &lt;b&gt;Edit Custom Widgets...&lt;/b&gt; in the &lt;b&gt;Tools-&gt;Custom&lt;/b&gt; menu to add and change custom widgets&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> Click on the buttons to insert a single widget, or double click to insert multiple widgets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The File toolbar&lt;/b&gt;%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Creates a new project, form or source file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens an existing project, form for source file </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Closes the current project or document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saves the current project or document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saves the current form with a new filename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sa&amp;ve All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saves all open documents</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create Template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create &amp;Template...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Creates a new template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recently opened files </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recently opened projects</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quits the application and prompts to save changed forms, source files and project settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pr&amp;oject</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;No Project&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add File...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Adds a file to the current project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Image Collection...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Image Collection...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to edit the image collection of the current project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database Connections...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Database Connections...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to edit the database connections of the current project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Project Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Project Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a dialog to change the settings of the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preview Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preview &amp;Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use the Motif Look&amp;Feel used as the default style on most UNIX-Systems.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use the Windows Look&amp;Feel used as the default style on Windows-Systems.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use the Platinum Look&amp;Feel resembling a Macinosh-like GUI style.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use the CDE Look&amp;Feel which is similar to some versions of the Common Desktop Environment.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use the Motif Look&amp;Feel used as the default style on SGI-systems.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preview will use an advanced Motif Look&amp;Feel as used by the GIMP toolkit (GTK) on Linux.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preview Form in %1 Style</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>... in %1 Style</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens a preview in %1 style</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Open a preview in %1 style.&lt;/b&gt;&lt;p&gt;Use the preview to test the design and signal-slot connections of the current form. %2&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Tile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranges all windows tiled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cascade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cascade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arrange all windows cascaded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cl&amp;ose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Closes the active window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close Al&amp;l</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Closes all form windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ne&amp;xt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activates the next window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pre&amp;vious</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activates the previous window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Vie&amp;ws</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool&amp;bars</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Contents</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens the online help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opens the Qt Designer manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;About</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Displays information about this product</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Displays information about the Qt Toolkit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Register Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Register Qt...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Launches web browser with evaluation form at www.trolltech.com</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Register with Trolltech</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&quot;What&apos;s This?&quot; context sensitive help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The Help toolbar&lt;/b&gt;%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select new item ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select a file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Designer Files (*.ui *.pro)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QMAKE Project Files (*.pro)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No import filter available for %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Importing %1 using import filter ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Nothing to load in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reading file %1...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File %1 opened.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to load file %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Couldn&apos;t load file %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Project &apos;%1&apos; saved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter a filename...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Designer is crashing - attempting to save work...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NewTemplate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Couldn&apos;t create the template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit slots of current form...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit connections in current form...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit settings of current form...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit preferences...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit custom widgets...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Column 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tab 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tab 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load Template</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MultiLineEditor</name>
+ <message>
+ <source>Set text of &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>MultiLineEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Multiline Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Multiline Edit&lt;/b&gt;&lt;p&gt;Enter the text and press the &lt;b&gt;OK&lt;/b&gt;-Button to apply the changes.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Text:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter your text here.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NewForm</name>
+ <message>
+ <source>Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wizard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Widget</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>NewFormBase</name>
+ <message encoding="UTF-8">
+ <source>New File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;New Form&lt;/b&gt;&lt;p&gt;Select a template for the new form and click the &lt;b&gt;OK&lt;/b&gt;-button to open it.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Open a new form using the selected template.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and do not open a form.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Displays a list of available templates.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Insert into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OutputWindow</name>
+ <message>
+ <source>Error Messages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PaletteEditorAdvancedBase</name>
+ <message encoding="UTF-8">
+ <source>Tune Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Edit Palette&lt;/b&gt;&lt;p&gt;Change the palette of the current widget or form.&lt;/p&gt;&lt;p&gt;Use a generated palette or select colors for each color group and each color role.&lt;/p&gt;&lt;p&gt;The palette can be tested with different widget layouts in the preview section.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select &amp;Palette:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Active Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Inactive Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Disabled Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Auto</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Build inactive palette from active.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Build disabled palette from active.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Central color &amp;roles</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Foreground</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Button</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Base</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>BrightText</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>ButtonText</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Highlight</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>HighlightText</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Link</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>LinkVisited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose central color role</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a color role.&lt;/b&gt;&lt;p&gt;Available central roles are: &lt;ul&gt; &lt;li&gt;Background - general background color.&lt;/li&gt; &lt;li&gt;Foreground - general foreground color. &lt;/li&gt; &lt;li&gt;Base - used as background color for e.g. text entry widgets, usually white or another light color. &lt;/li&gt; &lt;li&gt;Text - the forground color used with Base. Usually this is the same as the Foreground, in what case it must provide good contrast both with Background and Base. &lt;/li&gt; &lt;li&gt;Button - general button background color, where buttons need a background different from Background, as in the Macintosh style. &lt;/li&gt; &lt;li&gt;ButtonText - a foreground color used with the Button color. &lt;/li&gt; &lt;li&gt;Highlight - a color to indicate a selected or highlighted item. &lt;/li&gt; &lt;li&gt;HighlightedText - a text color that contrasts to Highlight. &lt;/li&gt; &lt;li&gt;BrightText - a text color that is very different from Foreground and contrasts well with e.g. black. &lt;/li&gt; &lt;/ul&gt; &lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose Pi&amp;xmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a pixmap-file for the selected central color role.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Select Color:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a color for the selected central color role.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>3-D shadow &amp;effects</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Build &amp;from button color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Generate shadings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Check to let 3D-effect colors be calculated from button-color.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Light</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Midlight</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Mid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Dark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Shadow</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose 3D-effect color role</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a color role.&lt;/b&gt;&lt;p&gt;Available effect roles are: &lt;ul&gt; &lt;li&gt;Light - lighter than Button color. &lt;/li&gt; &lt;li&gt;Midlight - between Button and Light. &lt;/li&gt; &lt;li&gt;Mid - between Button and Dark. &lt;/li&gt; &lt;li&gt;Dark - darker than Button. &lt;/li&gt; &lt;li&gt;Shadow - a very dark color. &lt;/li&gt; &lt;/ul&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select Co&amp;lor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a color for the selected effect color role.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PaletteEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Build Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;3-D Effects:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose the effect-color for the generated palette.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Back&amp;ground:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose the background color for the generated palette.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Tune Palette...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select &amp;Palette:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Active Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Inactive Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Disabled Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PixmapCollectionEditor</name>
+ <message encoding="UTF-8">
+ <source>Manage Image Collection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Add...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose an Image</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PixmapFunction</name>
+ <message encoding="UTF-8">
+ <source>Choose Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Enter arguments for loading the pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>QPixmap(</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>Preferences</name>
+ <message encoding="UTF-8">
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Preferences&lt;/b&gt;&lt;p&gt;Change the preferences of the designer application. There is always one tab with general preferenced. Depending on installed plugins, there might be more tabs for plugin preferences.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Backgro&amp;und</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a color in the colordialog.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Co&amp;lor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use a background color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use a background color.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use a background pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Use a background pixmap.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Choose a pixmap-file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show &amp;Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Customize the grid appearance for all forms.&lt;/b&gt;&lt;p&gt;When &lt;b&gt;Show Grid&lt;/b&gt; is checked, all forms show a grid.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Gr&amp;id</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sn&amp;ap to Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Snap to the grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Customize the grid-settings for all forms.&lt;/b&gt;&lt;p&gt;When &lt;b&gt;Snap to Grid&lt;/b&gt; is checked, the widgets snap to the grid using the the X/Y resolution.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Grid resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Customize the grid-settings for all forms.&lt;/b&gt;&lt;p&gt;When &lt;b&gt;Show Grid&lt;/b&gt; is checked, a grid is shown on all forms using the X/Y resolution.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Grid-&amp;X:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Grid-&amp;Y:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>A splashscreen is displayed when starting the designer if this option is checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ge&amp;neral</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Restore Last &amp;Workspace on Startup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Restore last workspace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The current workspace settings will be restored next time you start the designer if this option is checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show &amp;Splash Screen on Startup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show Splashscreen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Disable Data&amp;base Auto-Edit in Preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Documentation Path:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Enter the path to the documentation.&lt;/b&gt;&lt;p&gt;You may provide an $environment variable as first part of your pathname.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select path</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Look for the documentation path.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Toolbars</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show &amp;Big Icons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Big Icons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Uses big icons in the toolbars when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Show Text Lab&amp;els</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Text Labels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Shows textlabels in the toolbars when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PreviewWidgetBase</name>
+ <message encoding="UTF-8">
+ <source>Preview Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>ButtonGroup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>RadioButton1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>RadioButton2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>RadioButton3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>ButtonGroup2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>CheckBox1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>CheckBox2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>LineEdit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>ComboBox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>PushButton</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;p&gt;
+&lt;a href=&quot;http://www.trolltech.com&quot;&gt; http://www.trolltech.com &lt;/a&gt;
+&lt;/p&gt;
+&lt;p&gt;
+&lt;a href=&quot;http://www.kde.org&quot;&gt; http://www.kde.org &lt;/a&gt;
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Project</name>
+ <message>
+ <source>&lt;No Project&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ProjectSettings</name>
+ <message>
+ <source>unnamed.pro</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Database Files (*.db);;All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Project Files (*.pro);;All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ProjectSettingsBase</name>
+ <message encoding="UTF-8">
+ <source>Project Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Project File:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>For&amp;ms and Sources:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Filename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Add...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Database File:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyBoolItem</name>
+ <message>
+ <source>False</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>True</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyColorItem</name>
+ <message>
+ <source>Red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyCoordItem</name>
+ <message>
+ <source>x</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>y</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>height</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyCursorItem</name>
+ <message>
+ <source>Arrow</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Up-Arrow</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cross</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>iBeam</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size Vertical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size Horizontal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size Slash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size Backslash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Blank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Split Vertical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Split Horizontal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pointing Hand</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Forbidden</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyDatabaseItem</name>
+ <message>
+ <source>Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Table</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Field</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyEditor</name>
+ <message>
+ <source>Reset property to its default value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click this button to reset the property to its default value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Property Editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Signal Handlers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Property Editor (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyFontItem</name>
+ <message>
+ <source>Family</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Point Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Strikeout</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyList</name>
+ <message>
+ <source>Property</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set &apos;%1&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sort &amp;Categorized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sort &amp;Alphabetically</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reset &apos;%1&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;b&gt;QWidget::%1&lt;/b&gt;&lt;/p&gt;&lt;p&gt;There is no documentation available for this property.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertySizePolicyItem</name>
+ <message>
+ <source>hSizeType</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>vSizeType</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>horizontalStretch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>verticalStretch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1/%2/%2/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PropertyTextItem</name>
+ <message>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QApplication</name>
+ <message>
+ <source>Connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Could not connect to the database.
+Press &apos;OK&apos; to continue or &apos;Cancel&apos; to specify different
+connection information.
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerMenuBar</name>
+ <message>
+ <source>Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename Item...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Menu &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename Menuitem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Menu Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename Menu &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move menu &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerPopupMenu</name>
+ <message>
+ <source>Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Separator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Action &apos;%1&apos; from the Popup Menu &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Separator to the Popup Menu &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Action &apos;%1&apos; to the Popup Menu &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert/Move Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The Action &apos;%1&apos; has already been added to this menu.
+An Action can only be added once to the same menu.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerTabWidget</name>
+ <message>
+ <source>Move Tab Page</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerToolBar</name>
+ <message>
+ <source>Delete Toolbar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Toolbar &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete Item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Separator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Action &apos;%1&apos; from Toolbar &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Separator to Toolbar &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Action &apos;%1&apos; to Toolbar &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert/Move Action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The Action &apos;%1&apos; has already been added to this toolbar.
+An Action can only be added once to the same toolbar.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Widget &apos;%1&apos; to Toolbar &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ReplaceDialog</name>
+ <message encoding="UTF-8">
+ <source>Replace Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>R&amp;eplace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Find</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Replace &amp;All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Whole words only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Case sensitive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Start at Beginning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Direction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Forwar&amp;d</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Backward</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SizeHandle</name>
+ <message>
+ <source>%1/%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Resize</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SourceEditor</name>
+ <message>
+ <source>Edit %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SourceFile</name>
+ <message>
+ <source>Edit %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Code</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save changes to &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Designer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The file %1 has been changed outside Qt Designer.
+Do you want to reload it?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid Filename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The project contains already a sourcefile with the
+filename &apos;%1&apos;. Please choose a new filename.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TableEditor</name>
+ <message>
+ <source>Edit Rows and Columns of &apos;%1&apos; </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>TableEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Edit Table</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Co&amp;lumns</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item up.&lt;/b&gt;&lt;p&gt;The topmost column will be the first column of the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Move down</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Move the selected item down.&lt;/b&gt;&lt;p&gt;The topmost column will be the first column of the list.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Table:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Label4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Delete Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Delete the pixmap of the selected item.&lt;/b&gt;&lt;p&gt;The pixmap in the current column of the selected item will be deleted.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Select a Pixmap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;b&gt;Select a pixmap-file for the item.&lt;/b&gt;&lt;p&gt;The pixmap will be changed in the current column of the selected item.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Label:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Field:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;no table&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Rows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;New Row</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete Row</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TextEditor</name>
+ <message>
+ <source>Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WizardEditor</name>
+ <message>
+ <source>Edit Wizard Pages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Page to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove Page %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Swap pages %1 and %2 of %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Page Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New page title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename page %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>WizardEditorBase</name>
+ <message encoding="UTF-8">
+ <source>Wizard Page Editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Wizard Pages:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and apply all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Close dialog and discard all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Workspace</name>
+ <message>
+ <source>Files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open source file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Remove source file from project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open form...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Remove form from project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open form source...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>qChoosePixmap</name>
+ <message>
+ <source>All Pixmaps (</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1-Pixmaps (%2)
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>)
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose Images...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a Pixmap...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/tools/designer/designer/designer_pch.h b/tools/designer/designer/designer_pch.h
new file mode 100644
index 0000000..6b53f98
--- /dev/null
+++ b/tools/designer/designer/designer_pch.h
@@ -0,0 +1,44 @@
+/*
+ * This is a precompiled header file for use in Xcode / Mac GCC /
+ * GCC >= 3.4 / VC to greatly speed the building of Qt Designer. It may
+ * also be of use to people developing their own project, but it is
+ * probably better to define your own header. Use of this header is
+ * currently UNSUPPORTED.
+ */
+
+#if defined __cplusplus
+
+#include <private/qucomextra_p.h>
+#include <qaction.h>
+#include <qapplication.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qdialog.h>
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qlistbox.h>
+#include <qlistview.h>
+#include <qmap.h>
+#include <qmessagebox.h>
+#include <qmetaobject.h>
+#include <qobjectlist.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvariant.h>
+#include <qwhatsthis.h>
+#include <qwidget.h>
+
+#include "command.h"
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "metadatabase.h"
+#include "project.h"
+#include "widgetfactory.h"
+
+#endif
diff --git a/tools/designer/designer/designerapp.cpp b/tools/designer/designer/designerapp.cpp
new file mode 100644
index 0000000..d546d1d
--- /dev/null
+++ b/tools/designer/designer/designerapp.cpp
@@ -0,0 +1,181 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "designerappiface.h"
+#include "designerapp.h"
+#include "mainwindow.h"
+#include "formwindow.h"
+
+#include <qfile.h>
+#include <qdir.h>
+#include <qsettings.h>
+#include <qsplashscreen.h>
+
+#ifdef Q_WS_WIN
+#include <qt_windows.h>
+#include <process.h>
+#endif
+
+static QSplashScreen *splash = 0;
+
+void set_splash_status( const QString &txt )
+{
+ if ( !splash )
+ return;
+ QString splashText = "Licensed to "
+ + QString::fromLatin1( QT_PRODUCT_LICENSEE ) + "\n"
+ + txt;
+ splash->message( splashText, Qt::AlignRight|Qt::AlignTop );
+}
+
+DesignerApplication::DesignerApplication( int &argc, char **argv )
+ : QApplication( argc, argv )
+{
+#if defined(Q_WS_WIN)
+ if ( winVersion() & Qt::WV_NT_based )
+ DESIGNER_OPENFILE = RegisterWindowMessage((TCHAR*)"QT_DESIGNER_OPEN_FILE");
+ else
+ DESIGNER_OPENFILE = RegisterWindowMessageA("QT_DESIGNER_OPEN_FILE");
+#endif
+}
+
+QSplashScreen *DesignerApplication::showSplash()
+{
+ QRect screen = QApplication::desktop()->screenGeometry();
+ QSettings config;
+ config.insertSearchPath( QSettings::Windows, "/Trolltech" );
+
+ QRect mainRect;
+ QString keybase = settingsKey();
+ bool show = config.readBoolEntry( keybase + "SplashScreen", TRUE );
+ mainRect.setX( config.readNumEntry( keybase + "Geometries/MainwindowX", 0 ) );
+ mainRect.setY( config.readNumEntry( keybase + "Geometries/MainwindowY", 0 ) );
+ mainRect.setWidth( config.readNumEntry( keybase + "Geometries/MainwindowWidth", 500 ) );
+ mainRect.setHeight( config.readNumEntry( keybase + "Geometries/MainwindowHeight", 500 ) );
+ screen = QApplication::desktop()->screenGeometry( QApplication::desktop()->screenNumber( mainRect.center() ) );
+
+ if ( show ) {
+ splash = new QSplashScreen( QPixmap::fromMimeSource("designer_splash.png") );
+ splash->show();
+ set_splash_status( "Initializing..." );
+ }
+
+ return splash;
+}
+
+void DesignerApplication::closeSplash()
+{
+ splash->hide();
+}
+
+static QString *settings_key = 0;
+static QString *old_settings_key = 0;
+
+QString DesignerApplication::settingsKey()
+{
+ if ( !settings_key )
+ settings_key = new QString( "/Qt Designer/" +
+ QString::number( (QT_VERSION >> 16) & 0xff ) +
+ "." + QString::number( (QT_VERSION >> 8) & 0xff ) + "/" );
+ return *settings_key;
+}
+
+QString DesignerApplication::oldSettingsKey()
+{
+ if ( !old_settings_key ) {
+ int majorVer = (QT_VERSION >> 16) & 0xff;
+ int minorVer = (QT_VERSION >> 8) & 0xff;
+
+ // If minorVer is 0 (e.g. 4.0) then we don't want to read the
+ // old settings, too much might have changed.
+ if ( !minorVer == 0 )
+ minorVer--;
+
+ old_settings_key = new QString( "/Qt Designer/" +
+ QString::number( majorVer ) +
+ "." + QString::number( minorVer ) + "/" );
+ }
+ return *old_settings_key;
+}
+
+void DesignerApplication::setSettingsKey( const QString &key )
+{
+ if ( !settings_key )
+ settings_key = new QString( key );
+ else
+ *settings_key = key;
+}
+
+#if defined(Q_WS_WIN)
+bool DesignerApplication::winEventFilter( MSG *msg )
+{
+ if ( msg->message == DESIGNER_OPENFILE ) {
+ QFile f( QDir::homeDirPath() + "/.designerargs" );
+ QFileInfo fi(f);
+ if ( fi.lastModified() == lastMod )
+ return QApplication::winEventFilter( msg );
+ lastMod = fi.lastModified();
+ f.open( IO_ReadOnly );
+ QString args;
+ f.readLine( args, f.size() );
+ QStringList lst = QStringList::split( " ", args );
+
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ QString arg = (*it).stripWhiteSpace();
+ if ( arg[0] != '-' ) {
+ QObjectList* l = MainWindow::self->queryList( "FormWindow" );
+ FormWindow* fw = (FormWindow*) l->first();
+ FormWindow* totop = 0;
+ bool haveit = FALSE;
+ while ( fw ) {
+ haveit = haveit || fw->fileName() == arg;
+ if ( haveit )
+ totop = fw;
+
+ fw = (FormWindow*) l->next();
+ }
+
+ if ( !haveit ) {
+ FlashWindow( MainWindow::self->winId(), TRUE );
+ MainWindow::self->openFormWindow( arg );
+ } else if ( totop ) {
+ totop->setFocus();
+ }
+ delete l;
+ }
+ }
+ return TRUE;
+ }
+ return QApplication::winEventFilter( msg );
+}
+#endif
diff --git a/tools/designer/designer/designerapp.h b/tools/designer/designer/designerapp.h
new file mode 100644
index 0000000..e59b5b9
--- /dev/null
+++ b/tools/designer/designer/designerapp.h
@@ -0,0 +1,65 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef DESIGNERAPP_H
+#define DESIGNERAPP_H
+
+class QSplashScreen;
+
+#include <qapplication.h>
+
+class DesignerApplication : public QApplication
+{
+public:
+ const char *className() const { return "DesignerApplication"; }
+
+ DesignerApplication( int &argc, char **argv );
+
+ QSplashScreen *showSplash();
+ static void closeSplash();
+
+ static QString settingsKey();
+ static QString oldSettingsKey();
+ static void setSettingsKey( const QString &key );
+
+protected:
+ QDateTime lastMod;
+
+#if defined(Q_WS_WIN)
+ bool winEventFilter( MSG *msg );
+ uint DESIGNER_OPENFILE;
+#endif
+
+};
+
+#endif
diff --git a/tools/designer/designer/designerappiface.cpp b/tools/designer/designer/designerappiface.cpp
new file mode 100644
index 0000000..770d39d
--- /dev/null
+++ b/tools/designer/designer/designerappiface.cpp
@@ -0,0 +1,1100 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include "designerappiface.h"
+#include "mainwindow.h"
+#include "project.h"
+#include "formwindow.h"
+#include "workspace.h"
+#include "widgetfactory.h"
+#include "command.h"
+#include "outputwindow.h"
+#include "../shared/widgetdatabase.h"
+#include <qvariant.h>
+#include <qlistview.h>
+#include <qtextedit.h>
+#include <qstatusbar.h>
+#include "pixmapcollection.h"
+#include "hierarchyview.h"
+#include <stdlib.h>
+#include <qmetaobject.h>
+#include "popupmenueditor.h"
+#include "menubareditor.h"
+
+DesignerInterfaceImpl::DesignerInterfaceImpl( MainWindow *mw )
+ : mainWindow( mw )
+{
+}
+
+QRESULT DesignerInterfaceImpl::queryInterface( const QUuid &uuid, QUnknownInterface** iface )
+{
+ *iface = 0;
+
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)this;
+ else if ( uuid == IID_QComponentInformation )
+ *iface = (QComponentInformationInterface*)this;
+ else if ( uuid == IID_Designer )
+ *iface = (DesignerInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+
+DesignerProject *DesignerInterfaceImpl::currentProject() const
+{
+ return mainWindow->currProject()->iFace();
+}
+
+DesignerFormWindow *DesignerInterfaceImpl::currentForm() const
+{
+ if ( mainWindow->formWindow() )
+ return mainWindow->formWindow()->iFace();
+ return 0;
+}
+
+DesignerSourceFile *DesignerInterfaceImpl::currentSourceFile() const
+{
+ if ( mainWindow->sourceFile() )
+ return mainWindow->sourceFile()->iFace();
+ return 0;
+}
+
+QPtrList<DesignerProject> DesignerInterfaceImpl::projectList() const
+{
+ return mainWindow->projectList();
+}
+
+void DesignerInterfaceImpl::showStatusMessage( const QString &text, int ms ) const
+{
+ if ( text.isEmpty() ) {
+ mainWindow->statusBar()->clear();
+ return;
+ }
+ if ( ms )
+ mainWindow->statusBar()->message( text, ms );
+ else
+ mainWindow->statusBar()->message( text );
+}
+
+DesignerDock *DesignerInterfaceImpl::createDock() const
+{
+ return 0;
+}
+
+DesignerOutputDock *DesignerInterfaceImpl::outputDock() const
+{
+ return mainWindow->outputWindow() ? mainWindow->outputWindow()->iFace() : 0;
+}
+
+void DesignerInterfaceImpl::setModified( bool b, QWidget *window )
+{
+ mainWindow->setModified( b, window );
+}
+
+void DesignerInterfaceImpl::updateFunctionList()
+{
+ mainWindow->updateFunctionList();
+ if ( mainWindow->objectHierarchy()->sourceEditor() )
+ mainWindow->objectHierarchy()->updateClassBrowsers();
+}
+
+void DesignerInterfaceImpl::onProjectChange( QObject *receiver, const char *slot )
+{
+ QObject::connect( mainWindow, SIGNAL( projectChanged() ), receiver, slot );
+}
+
+void DesignerInterfaceImpl::onFormChange( QObject *receiver, const char *slot )
+{
+ QObject::connect( mainWindow, SIGNAL( formWindowChanged() ), receiver, slot );
+ QObject::connect( mainWindow, SIGNAL( editorChanged() ), receiver, slot );
+}
+
+bool DesignerInterfaceImpl::singleProjectMode() const
+{
+ return mainWindow->singleProjectMode();
+}
+
+void DesignerInterfaceImpl::showError( QWidget *widget,
+ int line, const QString &message )
+{
+ mainWindow->showErrorMessage( widget, line, message );
+}
+
+void DesignerInterfaceImpl::runFinished()
+{
+ mainWindow->finishedRun();
+}
+
+void DesignerInterfaceImpl::showStackFrame( QWidget *w, int line )
+{
+ mainWindow->showStackFrame( w, line );
+}
+
+void DesignerInterfaceImpl::showDebugStep( QWidget *w, int line )
+{
+ mainWindow->showDebugStep( w, line );
+}
+
+void DesignerInterfaceImpl::runProjectPrecondition()
+{
+ mainWindow->runProjectPrecondition();
+}
+
+void DesignerInterfaceImpl::runProjectPostcondition( QObjectList *l )
+{
+ mainWindow->runProjectPostcondition( l );
+}
+
+DesignerProjectImpl::DesignerProjectImpl( Project *pr )
+ : project( pr )
+{
+}
+
+QPtrList<DesignerFormWindow> DesignerProjectImpl::formList() const
+{
+ QPtrList<DesignerFormWindow> list;
+ QObjectList *forms = project->formList();
+ if ( !forms )
+ return list;
+
+ QPtrListIterator<QObject> it( *forms );
+ while ( it.current() ) {
+ QObject *obj = it.current();
+ ++it;
+ QWidget *par = ::qt_cast<FormWindow*>(obj->parent());
+ if ( !obj->isWidgetType() || !par )
+ continue;
+
+ list.append( ((FormWindow*)par)->iFace() );
+ }
+
+ delete forms;
+ return list;
+}
+
+QString DesignerProjectImpl::formFileName( const QString &form ) const
+{
+ for ( QPtrListIterator<FormFile> forms = project->formFiles();
+ forms.current(); ++forms ) {
+ if ( QString( forms.current()->formName() ) == form )
+ return forms.current()->fileName();
+ }
+ return QString::null;
+}
+
+QStringList DesignerProjectImpl::formNames() const
+{
+ QStringList l;
+ for ( QPtrListIterator<FormFile> forms = project->formFiles();
+ forms.current(); ++forms ) {
+ FormFile* f = forms.current();
+ if ( f->isFake() )
+ continue;
+ l << f->formName();
+ }
+ return l;
+}
+
+void DesignerProjectImpl::addForm( DesignerFormWindow * )
+{
+}
+
+void DesignerProjectImpl::removeForm( DesignerFormWindow * )
+{
+}
+
+QString DesignerProjectImpl::fileName() const
+{
+ return project->fileName();
+}
+
+void DesignerProjectImpl::setFileName( const QString & )
+{
+}
+
+QString DesignerProjectImpl::projectName() const
+{
+ return project->projectName();
+}
+
+void DesignerProjectImpl::setProjectName( const QString & )
+{
+}
+
+QString DesignerProjectImpl::databaseFile() const
+{
+ return QString::null;
+}
+
+void DesignerProjectImpl::setDatabaseFile( const QString & )
+{
+}
+
+void DesignerProjectImpl::setupDatabases() const
+{
+ MainWindow::self->editDatabaseConnections();
+}
+
+QPtrList<DesignerDatabase> DesignerProjectImpl::databaseConnections() const
+{
+ QPtrList<DesignerDatabase> lst;
+#ifndef QT_NO_SQL
+ QPtrList<DatabaseConnection> conns = project->databaseConnections();
+ for ( DatabaseConnection *d = conns.first(); d; d = conns.next() )
+ lst.append( d->iFace() );
+#endif
+ return lst;
+}
+
+void DesignerProjectImpl::addDatabase( DesignerDatabase * )
+{
+}
+
+void DesignerProjectImpl::removeDatabase( DesignerDatabase * )
+{
+}
+
+void DesignerProjectImpl::save() const
+{
+}
+
+void DesignerProjectImpl::setLanguage( const QString &l )
+{
+ project->setLanguage( l );
+}
+
+QString DesignerProjectImpl::language() const
+{
+ return project->language();
+}
+
+void DesignerProjectImpl::setCustomSetting( const QString &key, const QString &value )
+{
+ project->setCustomSetting( key, value );
+}
+
+QString DesignerProjectImpl::customSetting( const QString &key ) const
+{
+ if ( key == "QTSCRIPT_PACKAGES" ) {
+ QString s = getenv( "QTSCRIPT_PACKAGES" );
+ QString s2 = project->customSetting( "QUICK_PACKAGES" );
+ if ( !s.isEmpty() && !s2.isEmpty() )
+#if defined(Q_OS_WIN32)
+ s += ";";
+#else
+ s += ":";
+#endif
+ s += s2;
+ return s;
+ }
+ return project->customSetting( key );
+}
+
+DesignerPixmapCollection *DesignerProjectImpl::pixmapCollection() const
+{
+ return project->pixmapCollection()->iFace();
+}
+
+void DesignerProjectImpl::breakPoints( QMap<QString, QValueList<uint> > &bps ) const
+{
+ MainWindow::self->saveAllBreakPoints();
+ for ( QPtrListIterator<SourceFile> sources = project->sourceFiles();
+ sources.current(); ++sources ) {
+ SourceFile* f = sources.current();
+ bps.insert( project->makeRelative( f->fileName() ) + " <Source-File>", MetaDataBase::breakPoints( f ) );
+ }
+ for ( QPtrListIterator<FormFile> forms = project->formFiles();
+ forms.current(); ++forms ) {
+ if ( forms.current()->formWindow() )
+ bps.insert( QString( forms.current()->formWindow()->name() ) + " <Form>", MetaDataBase::breakPoints( forms.current()->formWindow() ) );
+ }
+}
+
+QString DesignerProjectImpl::breakPointCondition( QObject *o, int line ) const
+{
+ return MetaDataBase::breakPointCondition( MainWindow::self->findRealObject( o ), line );
+}
+
+void DesignerProjectImpl::setBreakPointCondition( QObject *o, int line, const QString &condition )
+{
+ MetaDataBase::setBreakPointCondition( MainWindow::self->findRealObject( o ), line, condition );
+}
+
+void DesignerProjectImpl::clearAllBreakpoints() const
+{
+ QValueList<uint> empty;
+ for ( QPtrListIterator<SourceFile> sources = project->sourceFiles();
+ sources.current(); ++sources ) {
+ SourceFile* f = sources.current();
+ MetaDataBase::setBreakPoints( f, empty );
+ }
+ for ( QPtrListIterator<FormFile> forms = project->formFiles();
+ forms.current(); ++forms ) {
+ if ( forms.current()->formWindow() )
+ MetaDataBase::setBreakPoints( forms.current()->formWindow(), empty );
+ MainWindow::self->resetBreakPoints();
+ }
+}
+
+void DesignerProjectImpl::setIncludePath( const QString &platform, const QString &path )
+{
+ project->setIncludePath( platform, path );
+}
+
+void DesignerProjectImpl::setLibs( const QString &platform, const QString &path )
+{
+ project->setLibs( platform, path );
+}
+
+void DesignerProjectImpl::setDefines( const QString &platform, const QString &path )
+{
+ project->setDefines( platform, path );
+}
+
+void DesignerProjectImpl::setConfig( const QString &platform, const QString &config )
+{
+ project->setConfig( platform, config );
+}
+
+void DesignerProjectImpl::setTemplate( const QString &t )
+{
+ project->setTemplate( t );
+}
+
+QString DesignerProjectImpl::config( const QString &platform ) const
+{
+ return project->config( platform );
+}
+
+QString DesignerProjectImpl::libs( const QString &platform ) const
+{
+ return project->libs( platform );
+}
+
+QString DesignerProjectImpl::defines( const QString &platform ) const
+{
+ return project->defines( platform );
+}
+
+QString DesignerProjectImpl::includePath( const QString &platform ) const
+{
+ return project->includePath( platform );
+}
+
+QString DesignerProjectImpl::templte() const
+{
+ return project->templte();
+}
+
+bool DesignerProjectImpl::isGenericObject( QObject *o ) const
+{
+ return !!project->fakeFormFileFor( o );
+}
+
+
+
+
+
+
+
+#ifndef QT_NO_SQL
+DesignerDatabaseImpl::DesignerDatabaseImpl( DatabaseConnection *d )
+ : db( d )
+{
+}
+
+QString DesignerDatabaseImpl::name() const
+{
+ return db->name();
+}
+
+void DesignerDatabaseImpl::setName( const QString & )
+{
+}
+
+QString DesignerDatabaseImpl::driver() const
+{
+ return db->driver();
+}
+
+void DesignerDatabaseImpl::setDriver( const QString & )
+{
+}
+
+QString DesignerDatabaseImpl::database() const
+{
+ return db->database();
+}
+
+void DesignerDatabaseImpl::setDatabase( const QString & )
+{
+}
+
+QString DesignerDatabaseImpl::userName() const
+{
+ return db->username();
+}
+
+void DesignerDatabaseImpl::setUserName( const QString & )
+{
+}
+
+QString DesignerDatabaseImpl::password() const
+{
+ return db->password();
+}
+
+void DesignerDatabaseImpl::setPassword( const QString & )
+{
+}
+
+QString DesignerDatabaseImpl::hostName() const
+{
+ return db->hostname();
+}
+
+void DesignerDatabaseImpl::setHostName( const QString & )
+{
+}
+
+QStringList DesignerDatabaseImpl::tables() const
+{
+ return db->tables();
+}
+
+QMap<QString, QStringList> DesignerDatabaseImpl::fields() const
+{
+ return db->fields();
+}
+
+void DesignerDatabaseImpl::open( bool suppressDialog ) const
+{
+ db->open( suppressDialog );
+}
+
+void DesignerDatabaseImpl::close() const
+{
+ db->close();
+}
+
+void DesignerDatabaseImpl::setFields( const QMap<QString, QStringList> & )
+{
+}
+
+void DesignerDatabaseImpl::setTables( const QStringList & )
+{
+}
+
+QSqlDatabase* DesignerDatabaseImpl::connection()
+{
+ return db->connection();
+}
+#endif
+
+
+
+DesignerPixmapCollectionImpl::DesignerPixmapCollectionImpl( PixmapCollection *coll )
+ : pixCollection( coll )
+{
+}
+
+void DesignerPixmapCollectionImpl::addPixmap( const QPixmap &p, const QString &name, bool force )
+{
+ PixmapCollection::Pixmap pix;
+ pix.pix = p;
+ pix.name = name;
+ pixCollection->addPixmap( pix, force );
+ FormWindow *fw = MainWindow::self->formWindow();
+ if ( fw )
+ MetaDataBase::setPixmapKey( fw, p.serialNumber(), name );
+}
+
+QPixmap DesignerPixmapCollectionImpl::pixmap( const QString &name ) const
+{
+ return pixCollection->pixmap( name );
+}
+
+
+
+DesignerFormWindowImpl::DesignerFormWindowImpl( FormWindow *fw )
+ : formWindow( fw )
+{
+}
+
+QString DesignerFormWindowImpl::name() const
+{
+ return formWindow->name();
+ }
+
+void DesignerFormWindowImpl::setName( const QString &n )
+{
+ formWindow->setName( n );
+}
+
+QString DesignerFormWindowImpl::fileName() const
+{
+ return formWindow->fileName();
+}
+
+void DesignerFormWindowImpl::setFileName( const QString & )
+{
+}
+
+void DesignerFormWindowImpl::save() const
+{
+}
+
+bool DesignerFormWindowImpl::isModified() const
+{
+ return formWindow->commandHistory()->isModified();
+}
+
+void DesignerFormWindowImpl::insertWidget( QWidget * )
+{
+}
+
+QWidget *DesignerFormWindowImpl::create( const char *className, QWidget *parent, const char *name )
+{
+ QWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( className ), parent, name );
+ formWindow->insertWidget( w, TRUE );
+ formWindow->killAccels( formWindow->mainContainer() );
+ return w;
+}
+
+void DesignerFormWindowImpl::removeWidget( QWidget * )
+{
+}
+
+QWidgetList DesignerFormWindowImpl::widgets() const
+{
+ return QWidgetList();
+}
+
+void DesignerFormWindowImpl::undo()
+{
+}
+
+void DesignerFormWindowImpl::redo()
+{
+}
+
+void DesignerFormWindowImpl::cut()
+{
+}
+
+void DesignerFormWindowImpl::copy()
+{
+}
+
+void DesignerFormWindowImpl::paste()
+{
+}
+
+void DesignerFormWindowImpl::adjustSize()
+{
+}
+
+void DesignerFormWindowImpl::editConnections()
+{
+}
+
+void DesignerFormWindowImpl::checkAccels()
+{
+}
+
+void DesignerFormWindowImpl::layoutH()
+{
+ formWindow->layoutHorizontal();
+}
+
+void DesignerFormWindowImpl::layoutV()
+{
+}
+
+void DesignerFormWindowImpl::layoutHSplit()
+{
+}
+
+void DesignerFormWindowImpl::layoutVSplit()
+{
+}
+
+void DesignerFormWindowImpl::layoutG()
+{
+ formWindow->layoutGrid();
+}
+
+void DesignerFormWindowImpl::layoutHContainer( QWidget* w )
+{
+ formWindow->layoutHorizontalContainer( w );
+}
+
+void DesignerFormWindowImpl::layoutVContainer( QWidget* w )
+{
+ formWindow->layoutVerticalContainer( w );
+}
+
+void DesignerFormWindowImpl::layoutGContainer( QWidget* w )
+{
+ formWindow->layoutGridContainer( w );
+}
+
+void DesignerFormWindowImpl::breakLayout()
+{
+}
+
+void DesignerFormWindowImpl::selectWidget( QWidget * w )
+{
+ formWindow->selectWidget( w, TRUE );
+}
+
+void DesignerFormWindowImpl::selectAll()
+{
+}
+
+void DesignerFormWindowImpl::clearSelection()
+{
+ formWindow->clearSelection();
+}
+
+bool DesignerFormWindowImpl::isWidgetSelected( QWidget * ) const
+{
+ return FALSE;
+}
+
+QWidgetList DesignerFormWindowImpl::selectedWidgets() const
+{
+ return formWindow->selectedWidgets();
+}
+
+QWidget *DesignerFormWindowImpl::currentWidget() const
+{
+ return formWindow->currentWidget();
+}
+
+QWidget *DesignerFormWindowImpl::form() const
+{
+ return formWindow;
+}
+
+
+void DesignerFormWindowImpl::setCurrentWidget( QWidget * )
+{
+}
+
+QPtrList<QAction> DesignerFormWindowImpl::actionList() const
+{
+ return QPtrList<QAction>();
+}
+
+QAction *DesignerFormWindowImpl::createAction( const QString& text, const QIconSet& icon, const QString& menuText, int accel,
+ QObject* parent, const char* name, bool toggle )
+{
+ QDesignerAction *a = new QDesignerAction( parent );
+ a->setName( name );
+ a->setText( text );
+ if ( !icon.isNull() && !icon.pixmap().isNull() )
+ a->setIconSet( icon );
+ a->setMenuText( menuText );
+ a->setAccel( accel );
+ a->setToggleAction( toggle );
+ return a;
+}
+
+void DesignerFormWindowImpl::addAction( QAction *a )
+{
+ if ( formWindow->actionList().findRef( a ) != -1 )
+ return;
+ formWindow->actionList().append( a );
+ MetaDataBase::addEntry( a );
+ setPropertyChanged( a, "name", TRUE );
+ setPropertyChanged( a, "text", TRUE );
+ setPropertyChanged( a, "menuText", TRUE );
+ setPropertyChanged( a, "accel", TRUE );
+ if ( !a->iconSet().isNull() && !a->iconSet().pixmap().isNull() )
+ setPropertyChanged( a, "iconSet", TRUE );
+}
+
+void DesignerFormWindowImpl::removeAction( QAction *a )
+{
+ formWindow->actionList().removeRef( a );
+}
+
+void DesignerFormWindowImpl::preview() const
+{
+}
+
+void DesignerFormWindowImpl::addConnection( QObject *sender, const char *signal, QObject *receiver, const char *slot )
+{
+ MetaDataBase::addConnection( formWindow, sender, signal, receiver, slot );
+}
+
+void DesignerFormWindowImpl::addFunction( const QCString &function, const QString &specifier,
+ const QString &access, const QString &type,
+ const QString &language, const QString &returnType )
+{
+ MetaDataBase::addFunction( formWindow, function, specifier, access, type, language, returnType );
+ formWindow->mainWindow()->functionsChanged();
+}
+
+
+
+void DesignerFormWindowImpl::setProperty( QObject *o, const char *property, const QVariant &value )
+{
+ int id = o->metaObject()->findProperty( property, TRUE );
+ const QMetaProperty* p = o->metaObject()->property( id, TRUE );
+ if ( p && p->isValid() )
+ o->setProperty( property, value );
+ else
+ MetaDataBase::setFakeProperty( o, property, value );
+}
+
+QVariant DesignerFormWindowImpl::property( QObject *o, const char *prop ) const
+{
+ int id = o->metaObject()->findProperty( prop, TRUE );
+ const QMetaProperty* p = o->metaObject()->property( id, TRUE );
+ if ( p && p->isValid() )
+ return o->property( prop );
+ return MetaDataBase::fakeProperty( o, prop );
+}
+
+void DesignerFormWindowImpl::setPropertyChanged( QObject *o, const char *property, bool changed )
+{
+ MetaDataBase::setPropertyChanged( o, property, changed );
+}
+
+bool DesignerFormWindowImpl::isPropertyChanged( QObject *o, const char *property ) const
+{
+ return MetaDataBase::isPropertyChanged( o, property );
+}
+
+void DesignerFormWindowImpl::setColumnFields( QObject *o, const QMap<QString, QString> &f )
+{
+ MetaDataBase::setColumnFields( o, f );
+}
+
+QStringList DesignerFormWindowImpl::implementationIncludes() const
+{
+ QValueList<MetaDataBase::Include> includes = MetaDataBase::includes( formWindow );
+ QStringList lst;
+ for ( QValueList<MetaDataBase::Include>::Iterator it = includes.begin(); it != includes.end(); ++it ) {
+ MetaDataBase::Include inc = *it;
+ if ( inc.implDecl != "in implementation" )
+ continue;
+ QString s = inc.header;
+ if ( inc.location == "global" ) {
+ s.prepend( "<" );
+ s.append( ">" );
+ } else {
+ s.prepend( "\"" );
+ s.append( "\"" );
+ }
+ lst << s;
+ }
+ return lst;
+}
+
+QStringList DesignerFormWindowImpl::declarationIncludes() const
+{
+ QValueList<MetaDataBase::Include> includes = MetaDataBase::includes( formWindow );
+ QStringList lst;
+ for ( QValueList<MetaDataBase::Include>::Iterator it = includes.begin(); it != includes.end(); ++it ) {
+ MetaDataBase::Include inc = *it;
+ if ( inc.implDecl == "in implementation" )
+ continue;
+ QString s = inc.header;
+ if ( inc.location == "global" ) {
+ s.prepend( "<" );
+ s.append( ">" );
+ } else {
+ s.prepend( "\"" );
+ s.append( "\"" );
+ }
+ lst << s;
+ }
+ return lst;
+}
+
+void DesignerFormWindowImpl::setImplementationIncludes( const QStringList &lst )
+{
+ QValueList<MetaDataBase::Include> oldIncludes = MetaDataBase::includes( formWindow );
+ QValueList<MetaDataBase::Include> includes;
+ for ( QValueList<MetaDataBase::Include>::Iterator it = oldIncludes.begin(); it != oldIncludes.end(); ++it ) {
+ MetaDataBase::Include inc = *it;
+ if ( inc.implDecl == "in implementation" )
+ continue;
+ includes << inc;
+ }
+
+ for ( QStringList::ConstIterator sit = lst.begin(); sit != lst.end(); ++sit ) {
+ QString s = *sit;
+ if ( s.startsWith( "#include" ) )
+ s.remove( (uint)0, 8 );
+ s = s.simplifyWhiteSpace();
+ if ( s[ 0 ] != '<' && s[ 0 ] != '"' ) {
+ s.prepend( "\"" );
+ s.append( "\"" );
+ }
+ if ( s[ 0 ] == '<' ) {
+ s.remove( (uint)0, 1 );
+ s.remove( s.length() - 1, 1 );
+ MetaDataBase::Include inc;
+ inc.header = s;
+ inc.implDecl = "in implementation";
+ inc.location = "global";
+ includes << inc;
+ } else {
+ s.remove( (uint)0, 1 );
+ s.remove( s.length() - 1, 1 );
+ MetaDataBase::Include inc;
+ inc.header = s;
+ inc.implDecl = "in implementation";
+ inc.location = "local";
+ includes << inc;
+ }
+ }
+ MetaDataBase::setIncludes( formWindow, includes );
+ formWindow->mainWindow()->objectHierarchy()->formDefinitionView()->setup();
+}
+
+void DesignerFormWindowImpl::setDeclarationIncludes( const QStringList &lst )
+{
+ QValueList<MetaDataBase::Include> oldIncludes = MetaDataBase::includes( formWindow );
+ QValueList<MetaDataBase::Include> includes;
+ for ( QValueList<MetaDataBase::Include>::Iterator it = oldIncludes.begin(); it != oldIncludes.end(); ++it ) {
+ MetaDataBase::Include inc = *it;
+ if ( inc.implDecl == "in declaration" )
+ continue;
+ includes << inc;
+ }
+
+ for ( QStringList::ConstIterator sit = lst.begin(); sit != lst.end(); ++sit ) {
+ QString s = *sit;
+ if ( s.startsWith( "#include" ) )
+ s.remove( (uint)0, 8 );
+ s = s.simplifyWhiteSpace();
+ if ( s[ 0 ] != '<' && s[ 0 ] != '"' ) {
+ s.prepend( "\"" );
+ s.append( "\"" );
+ }
+ if ( s[ 0 ] == '<' ) {
+ s.remove( (uint)0, 1 );
+ s.remove( s.length() - 1, 1 );
+ MetaDataBase::Include inc;
+ inc.header = s;
+ inc.implDecl = "in declaration";
+ inc.location = "global";
+ includes << inc;
+ } else {
+ s.remove( (uint)0, 1 );
+ s.remove( s.length() - 1, 1 );
+ MetaDataBase::Include inc;
+ inc.header = s;
+ inc.implDecl = "in declaration";
+ inc.location = "local";
+ includes << inc;
+ }
+ }
+ MetaDataBase::setIncludes( formWindow, includes );
+ formWindow->mainWindow()->objectHierarchy()->formDefinitionView()->setup();
+}
+
+QStringList DesignerFormWindowImpl::forwardDeclarations() const
+{
+ return MetaDataBase::forwards( formWindow );
+}
+
+void DesignerFormWindowImpl::setForwardDeclarations( const QStringList &lst )
+{
+ MetaDataBase::setForwards( formWindow, lst );
+ formWindow->mainWindow()->objectHierarchy()->formDefinitionView()->setup();
+}
+
+QStringList DesignerFormWindowImpl::signalList() const
+{
+ return MetaDataBase::signalList( formWindow );
+}
+
+void DesignerFormWindowImpl::setSignalList( const QStringList &lst )
+{
+ MetaDataBase::setSignalList( formWindow, lst );
+ formWindow->mainWindow()->objectHierarchy()->formDefinitionView()->setup();
+}
+
+void DesignerFormWindowImpl::onModificationChange( QObject *receiver, const char *slot )
+{
+ QObject::connect( formWindow, SIGNAL( modificationChanged( bool, FormWindow * ) ), receiver, slot );
+}
+
+void DesignerFormWindowImpl::addMenu( const QString &text, const QString &name )
+{
+ if ( !::qt_cast<QMainWindow*>(formWindow->mainContainer()) )
+ return;
+
+ QMainWindow *mw = (QMainWindow*)formWindow->mainContainer();
+ PopupMenuEditor *popup = new PopupMenuEditor( formWindow, mw );
+ QString n = name;
+ formWindow->unify( popup, n, TRUE );
+ popup->setName( n );
+ MenuBarEditor *mb = (MenuBarEditor *)mw->child( 0, "MenuBarEditor" );
+ if ( !mb ) {
+ mb = new MenuBarEditor( formWindow, mw );
+ mb->setName( "MenuBar" );
+ MetaDataBase::addEntry( mb );
+ }
+ mb->insertItem( text, popup );
+ MetaDataBase::addEntry( popup );
+}
+
+void DesignerFormWindowImpl::addMenuAction( const QString &menu, QAction *a )
+{
+ if ( !::qt_cast<QMainWindow*>(formWindow->mainContainer()) )
+ return;
+ QMainWindow *mw = (QMainWindow*)formWindow->mainContainer();
+ if ( !mw->child( 0, "MenuBarEditor" ) )
+ return;
+ PopupMenuEditor *popup = (PopupMenuEditor*)mw->child( menu, "PopupMenuEditor" );
+ if ( !popup )
+ return;
+ popup->insert( a );
+}
+
+void DesignerFormWindowImpl::addMenuSeparator( const QString &menu )
+{
+ if ( !::qt_cast<QMainWindow*>(formWindow->mainContainer()) )
+ return;
+ QMainWindow *mw = (QMainWindow*)formWindow->mainContainer();
+ if ( !mw->child( 0, "MenuBarEditor" ) )
+ return;
+ PopupMenuEditor *popup = (PopupMenuEditor*)mw->child( menu, "PopupMenuEditor" );
+ if ( !popup )
+ return;
+ QAction *a = new QSeparatorAction( 0 );
+ popup->insert( a );
+}
+
+void DesignerFormWindowImpl::addToolBar( const QString &text, const QString &name )
+{
+ if ( !::qt_cast<QMainWindow*>(formWindow->mainContainer()) )
+ return;
+ QMainWindow *mw = (QMainWindow*)formWindow->mainContainer();
+ QToolBar *tb = new QDesignerToolBar( mw );
+ QString n = name;
+ formWindow->unify( tb, n, TRUE );
+ tb->setName( n );
+ mw->addToolBar( tb, text );
+}
+
+void DesignerFormWindowImpl::addToolBarAction( const QString &tbn, QAction *a )
+{
+ if ( !::qt_cast<QMainWindow*>(formWindow->mainContainer()) )
+ return;
+ QMainWindow *mw = (QMainWindow*)formWindow->mainContainer();
+ QDesignerToolBar *tb = (QDesignerToolBar*)mw->child( tbn, "QDesignerToolBar" );
+ if ( !tb )
+ return;
+ a->addTo( tb );
+ tb->addAction( a );
+}
+
+void DesignerFormWindowImpl::addToolBarSeparator( const QString &tbn )
+{
+ if ( !::qt_cast<QMainWindow*>(formWindow->mainContainer()) )
+ return;
+ QMainWindow *mw = (QMainWindow*)formWindow->mainContainer();
+ QDesignerToolBar *tb = (QDesignerToolBar*)mw->child( tbn, "QDesignerToolBar" );
+ if ( !tb )
+ return;
+ QAction *a = new QSeparatorAction( 0 );
+ a->addTo( tb );
+ tb->addAction( a );
+}
+
+DesignerDockImpl::DesignerDockImpl()
+{
+}
+
+QDockWindow *DesignerDockImpl::dockWindow() const
+{
+ return 0;
+}
+
+DesignerOutputDockImpl::DesignerOutputDockImpl( OutputWindow *ow )
+ : outWin( ow )
+{
+}
+
+QWidget *DesignerOutputDockImpl::addView( const QString &title )
+{
+ QWidget *page = new QWidget( outWin );
+ outWin->addTab( page, title );
+ return page;
+}
+
+void DesignerOutputDockImpl::appendDebug( const QString &s )
+{
+ outWin->appendDebug( s );
+}
+
+void DesignerOutputDockImpl::clearDebug()
+{
+}
+
+void DesignerOutputDockImpl::appendError( const QString &s, int l )
+{
+ QStringList ls;
+ ls << s;
+ QValueList<uint> ll;
+ ll << l;
+ outWin->setErrorMessages( ls, ll, FALSE, QStringList(), QObjectList() );
+}
+
+void DesignerOutputDockImpl::clearError()
+{
+}
+
+DesignerSourceFileImpl::DesignerSourceFileImpl( SourceFile *e )
+ : ed( e )
+{
+}
+
+QString DesignerSourceFileImpl::fileName() const
+{
+ return ed->fileName();
+}
diff --git a/tools/designer/designer/designerappiface.h b/tools/designer/designer/designerappiface.h
new file mode 100644
index 0000000..91c29a5
--- /dev/null
+++ b/tools/designer/designer/designerappiface.h
@@ -0,0 +1,284 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef DESIGNERAPPIFACE_H
+#define DESIGNERAPPIFACE_H
+
+#include "../interfaces/designerinterface.h"
+#include "project.h"
+
+class FormWindow;
+class MainWindow;
+class Project;
+class OutputWindow;
+class SourceFile;
+
+class DesignerInterfaceImpl : public DesignerInterface
+{
+public:
+ DesignerInterfaceImpl( MainWindow *mw );
+
+ DesignerProject *currentProject() const;
+ DesignerFormWindow *currentForm() const;
+ DesignerSourceFile *currentSourceFile() const;
+ QPtrList<DesignerProject> projectList() const;
+ void showStatusMessage( const QString &, int ms = 0 ) const;
+ DesignerDock *createDock() const;
+ DesignerOutputDock *outputDock() const;
+ void setModified( bool b, QWidget *window );
+ void updateFunctionList();
+
+ void onProjectChange( QObject *receiver, const char *slot );
+ void onFormChange( QObject *receiver, const char *slot );
+
+ bool singleProjectMode() const;
+ void showError( QWidget *widget, int line, const QString &message );
+ void runFinished();
+ void showStackFrame( QWidget *w, int line );
+ void showDebugStep( QWidget *w, int line );
+ void runProjectPrecondition();
+ void runProjectPostcondition( QObjectList *l );
+
+
+ QRESULT queryInterface( const QUuid &uuid, QUnknownInterface** iface );
+ Q_REFCOUNT
+
+private:
+ MainWindow *mainWindow;
+
+};
+
+class DesignerProjectImpl: public DesignerProject
+{
+public:
+ DesignerProjectImpl( Project *pr );
+
+ QPtrList<DesignerFormWindow> formList() const;
+ QStringList formNames() const;
+ QString formFileName( const QString &form ) const;
+ void addForm( DesignerFormWindow * );
+ void removeForm( DesignerFormWindow * );
+ QString fileName() const;
+ void setFileName( const QString & );
+ QString projectName() const;
+ void setProjectName( const QString & );
+ QString databaseFile() const;
+ void setDatabaseFile( const QString & );
+ void setupDatabases() const;
+ QPtrList<DesignerDatabase> databaseConnections() const;
+ void addDatabase( DesignerDatabase * );
+ void removeDatabase( DesignerDatabase * );
+ void save() const;
+ void setLanguage( const QString & );
+ QString language() const;
+ void setCustomSetting( const QString &key, const QString &value );
+ QString customSetting( const QString &key ) const;
+ DesignerPixmapCollection *pixmapCollection() const;
+ void breakPoints( QMap<QString, QValueList<uint> > &bps ) const;
+ QString breakPointCondition( QObject *o, int line ) const;
+ void setBreakPointCondition( QObject *o, int line, const QString &condition );
+ void clearAllBreakpoints() const;
+ void setIncludePath( const QString &platform, const QString &path );
+ void setLibs( const QString &platform, const QString &path );
+ void setDefines( const QString &platform, const QString &path );
+ void setConfig( const QString &platform, const QString &config );
+ void setTemplate( const QString &t );
+ QString config( const QString &platform ) const;
+ QString libs( const QString &platform ) const;
+ QString defines( const QString &platform ) const;
+ QString includePath( const QString &platform ) const;
+ QString templte() const;
+ bool isGenericObject( QObject *o ) const;
+
+private:
+ Project *project;
+
+};
+
+#ifndef QT_NO_SQL
+class QSqlDatabase;
+
+class DesignerDatabaseImpl: public DesignerDatabase
+{
+public:
+ DesignerDatabaseImpl( DatabaseConnection *d );
+
+ QString name() const;
+ void setName( const QString & );
+ QString driver() const;
+ void setDriver( const QString & );
+ QString database() const;
+ void setDatabase( const QString & );
+ QString userName() const;
+ void setUserName( const QString & );
+ QString password() const;
+ void setPassword( const QString & );
+ QString hostName() const;
+ void setHostName( const QString & );
+ QStringList tables() const;
+ void setTables( const QStringList & );
+ QMap<QString, QStringList> fields() const;
+ void setFields( const QMap<QString, QStringList> & );
+ void open( bool suppressDialog = TRUE ) const;
+ void close() const;
+ QSqlDatabase* connection();
+private:
+ DatabaseConnection *db;
+
+};
+#endif
+
+class DesignerPixmapCollectionImpl : public DesignerPixmapCollection
+{
+public:
+ DesignerPixmapCollectionImpl( PixmapCollection *coll );
+ void addPixmap( const QPixmap &p, const QString &name, bool force );
+ QPixmap pixmap( const QString &name ) const;
+
+private:
+ PixmapCollection *pixCollection;
+
+};
+
+class DesignerFormWindowImpl: public DesignerFormWindow
+{
+public:
+ DesignerFormWindowImpl( FormWindow *fw );
+
+ QString name() const;
+ void setName( const QString &n );
+ QString fileName() const;
+ void setFileName( const QString & );
+ void save() const;
+ bool isModified() const;
+ void insertWidget( QWidget * );
+ QWidget *create( const char *className, QWidget *parent, const char *name );
+ void removeWidget( QWidget * );
+ QWidgetList widgets() const;
+ void undo();
+ void redo();
+ void cut();
+ void copy();
+ void paste();
+ void adjustSize();
+ void editConnections();
+ void checkAccels();
+ void layoutH();
+ void layoutV();
+ void layoutHSplit();
+ void layoutVSplit();
+ void layoutG();
+ void layoutHContainer( QWidget* w );
+ void layoutVContainer( QWidget* w );
+ void layoutGContainer( QWidget* w );
+ void breakLayout();
+ void selectWidget( QWidget * );
+ void selectAll();
+ void clearSelection();
+ bool isWidgetSelected( QWidget * ) const;
+ QWidgetList selectedWidgets() const;
+ QWidget *currentWidget() const;
+ QWidget *form() const;
+ void setCurrentWidget( QWidget * );
+ QPtrList<QAction> actionList() const;
+ QAction *createAction( const QString& text, const QIconSet& icon, const QString& menuText, int accel,
+ QObject* parent, const char* name = 0, bool toggle = FALSE );
+ void addAction( QAction * );
+ void removeAction( QAction * );
+ void preview() const;
+ void addFunction( const QCString &function, const QString& specifier, const QString &access,
+ const QString &type, const QString &language, const QString &returnType );
+ void addConnection( QObject *sender, const char *signal, QObject *receiver, const char *slot );
+ void setProperty( QObject *o, const char *property, const QVariant &value );
+ QVariant property( QObject *o, const char *property ) const;
+ void setPropertyChanged( QObject *o, const char *property, bool changed );
+ bool isPropertyChanged( QObject *o, const char *property ) const;
+ void setColumnFields( QObject *o, const QMap<QString, QString> & );
+ QStringList implementationIncludes() const;
+ QStringList declarationIncludes() const;
+ void setImplementationIncludes( const QStringList &lst );
+ void setDeclarationIncludes( const QStringList &lst );
+ QStringList forwardDeclarations() const;
+ void setForwardDeclarations( const QStringList &lst );
+ QStringList signalList() const;
+ void setSignalList( const QStringList &lst );
+ void addMenu( const QString &text, const QString &name );
+ void addMenuAction( const QString &menu, QAction *a );
+ void addMenuSeparator( const QString &menu );
+ void addToolBar( const QString &text, const QString &name );
+ void addToolBarAction( const QString &tb, QAction *a );
+ void addToolBarSeparator( const QString &tb );
+
+ void onModificationChange( QObject *receiver, const char *slot );
+
+private:
+ FormWindow *formWindow;
+
+};
+
+class DesignerDockImpl: public DesignerDock
+{
+public:
+ DesignerDockImpl();
+
+ QDockWindow *dockWindow() const;
+};
+
+class DesignerOutputDockImpl: public DesignerOutputDock
+{
+public:
+ DesignerOutputDockImpl( OutputWindow *ow );
+
+ QWidget *addView( const QString &pageName );
+ void appendDebug( const QString & );
+ void clearDebug();
+ void appendError( const QString &, int );
+ void clearError();
+
+private:
+ OutputWindow *outWin;
+
+};
+
+class DesignerSourceFileImpl : public DesignerSourceFile
+{
+public:
+ DesignerSourceFileImpl( SourceFile *e );
+ QString fileName() const;
+
+private:
+ SourceFile *ed;
+
+};
+
+#endif
diff --git a/tools/designer/designer/editfunctions.ui b/tools/designer/designer/editfunctions.ui
new file mode 100644
index 0000000..74f799c
--- /dev/null
+++ b/tools/designer/designer/editfunctions.ui
@@ -0,0 +1,721 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>EditFunctionsBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>EditFunctionsBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>371</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Functions</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Edit Functions&lt;/b&gt;&lt;p&gt;Add, edit or delete the current form's slots or functions.&lt;/p&gt;&lt;p&gt;Click the &lt;b&gt;Add Function&lt;/b&gt;-button to create a new function; enter a name, choose an access mode and specify if it should be a slot or normal function.&lt;/p&gt;&lt;p&gt;Select an entry from the list and click the &lt;b&gt;Delete Function&lt;/b&gt;-button to remove a function; in case of a slot all connections using this slot will also be removed.&lt;/p&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Function</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Return Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Specifier</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Access</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>In Use</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>functionListView</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;This form's functions.&lt;/b&gt;&lt;p&gt;Select the function you want to change or delete.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>showOnlySlots</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>StrongFocus</enum>
+ </property>
+ <property name="text">
+ <string>Only d&amp;isplay slots</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change displaying mode for functions</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Check this button if only the slots should be displayed&lt;/b&gt;&lt;p&gt;Otherwise all functions, i.e. normal C++ functions and slots are displayed.&lt;/p&gt;
+</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Vertical Spacing1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>addFunction</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Function</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Add new function</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Add a new function.&lt;/b&gt;&lt;p&gt;New functions have a default name and public access.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>deleteFunction</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Function</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete function</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Delete the selected function.&lt;/b&gt;&lt;p&gt;All connections using this function are also removed.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>boxProperties</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Function Properties</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout14</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Label8</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Function:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>functionName</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>functionName</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change function name</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change the name of the selected function.&lt;/b&gt;&lt;p&gt;The name should include the argument list and must be syntactically correct.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>labelType</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Return type:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editType</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>editType</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change the return type of the function</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change the return type of the selected function.&lt;/b&gt;&lt;p&gt;Specifiy here the datatype which should be returned by the function.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer6_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Label9_2</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;pecifier:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>functionSpecifier</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>non virtual</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>virtual</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>pure virtual</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>static</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>functionSpecifier</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change function access</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change the access policy of the function&lt;/b&gt;&lt;p&gt;All functions are created virtual and should be reimplemented in subclasses.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Access:</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter|AlignRight</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>functionAccess</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>public</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>protected</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>private</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>functionAccess</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change function access</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change the access policy of the function&lt;/b&gt;&lt;p&gt;All functions are created virtual and should be reimplemented in subclasses.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Type:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>functionType</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>slot</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>function</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>functionType</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change function type</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change the type of the function.&lt;/b&gt;&lt;p&gt;The type specifies if the function is either a slot or a normal C++ function.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>helpButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>deleteFunction</sender>
+ <signal>clicked()</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>functionRemove()</slot>
+ </connection>
+ <connection>
+ <sender>addFunction</sender>
+ <signal>clicked()</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>functionAdd()</slot>
+ </connection>
+ <connection>
+ <sender>functionName</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>currentTextChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>functionListView</sender>
+ <signal>selectionChanged(QListViewItem*)</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>currentItemChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>functionListView</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>currentItemChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>editType</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>currentReturnTypeChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>functionSpecifier</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>currentSpecifierChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>functionAccess</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>currentAccessChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>functionType</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>currentTypeChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>showOnlySlots</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>EditFunctionsBase</receiver>
+ <slot>displaySlots(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>functionName</tabstop>
+ <tabstop>editType</tabstop>
+ <tabstop>functionSpecifier</tabstop>
+ <tabstop>functionAccess</tabstop>
+ <tabstop>functionType</tabstop>
+ <tabstop>helpButton</tabstop>
+ <tabstop>okButton</tabstop>
+ <tabstop>cancelButton</tabstop>
+ <tabstop>functionListView</tabstop>
+ <tabstop>showOnlySlots</tabstop>
+ <tabstop>addFunction</tabstop>
+ <tabstop>deleteFunction</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">currentItemChanged( QListViewItem * )</slot>
+ <slot access="protected">currentSpecifierChanged( const QString &amp; )</slot>
+ <slot access="protected">currentTextChanged( const QString &amp; )</slot>
+ <slot access="protected">currentReturnTypeChanged( const QString &amp; )</slot>
+ <slot access="protected">destroy()</slot>
+ <slot access="protected">init()</slot>
+ <slot access="protected">currentAccessChanged( const QString &amp; )</slot>
+ <slot access="protected">currentTypeChanged( const QString &amp; )</slot>
+ <slot access="protected">okClicked()</slot>
+ <slot access="protected">functionAdd()</slot>
+ <slot access="protected">functionRemove()</slot>
+ <slot access="protected">displaySlots( bool )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/editfunctionsimpl.cpp b/tools/designer/designer/editfunctionsimpl.cpp
new file mode 100644
index 0000000..3e0bac4
--- /dev/null
+++ b/tools/designer/designer/editfunctionsimpl.cpp
@@ -0,0 +1,536 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "editfunctionsimpl.h"
+#include "formwindow.h"
+#include "metadatabase.h"
+#include "asciivalidator.h"
+#include "mainwindow.h"
+#include "hierarchyview.h"
+#include "project.h"
+
+#include <qlistview.h>
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qstrlist.h>
+#include <qmessagebox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qgroupbox.h>
+#include <qheader.h>
+#include <qcheckbox.h>
+
+EditFunctions::EditFunctions( QWidget *parent, FormWindow *fw, bool justSlots )
+ : EditFunctionsBase( parent, 0, TRUE ), formWindow( fw )
+{
+ connect( helpButton, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+
+ id = 0;
+ functList.clear();
+
+ QValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( fw );
+ for ( QValueList<MetaDataBase::Function>::Iterator it = functionList.begin(); it != functionList.end(); ++it ) {
+ QListViewItem *i = new QListViewItem( functionListView );
+
+ i->setPixmap( 0, QPixmap::fromMimeSource( "designer_editslots.png" ) );
+ i->setText( 0, (*it).function );
+ i->setText( 1, (*it).returnType );
+ i->setText( 2, (*it).specifier );
+ i->setText( 3, (*it).access );
+ i->setText( 4, (*it).type );
+
+ FunctItem fui;
+ fui.id = id;
+ fui.oldName = (*it).function;
+ fui.newName = fui.oldName;
+ fui.oldRetTyp = (*it).returnType;
+ fui.retTyp = fui.oldRetTyp;
+ fui.oldSpec = (*it).specifier;
+ fui.spec = fui.oldSpec;
+ fui.oldAccess = (*it).access;
+ fui.access = fui.oldAccess;
+ fui.oldType = (*it).type;
+ fui.type = fui.oldType;
+ functList.append( fui );
+
+ functionIds.insert( i, id );
+ id++;
+
+ if ( (*it).type == "slot" ) {
+ if ( MetaDataBase::isSlotUsed( formWindow, MetaDataBase::normalizeFunction( (*it).function ).latin1() ) )
+ i->setText( 5, tr( "Yes" ) );
+ else
+ i->setText( 5, tr( "No" ) );
+ } else {
+ i->setText( 5, "---" );
+ }
+ }
+
+ boxProperties->setEnabled( FALSE );
+ functionName->setValidator( new AsciiValidator( TRUE, functionName ) );
+
+ if ( functionListView->firstChild() )
+ functionListView->setCurrentItem( functionListView->firstChild() );
+
+ showOnlySlots->setChecked( justSlots );
+ lastType = "function";
+
+ // Enable rename for all QListViewItems
+ QListViewItemIterator lvit = functionListView->firstChild();
+ for ( ; *lvit; lvit++ )
+ (*lvit)->setRenameEnabled( 0, TRUE );
+
+ // Connect listview signal to signal-relay
+ QObject::connect( functionListView,
+ SIGNAL( itemRenamed( QListViewItem*, int, const QString & ) ),
+ this,
+ SLOT( emitItemRenamed(QListViewItem*, int, const QString&) ) );
+
+ // Connect signal-relay to QLineEdit "functionName"
+ QObjectList *l = parent->queryList( "QLineEdit", "functionName" );
+ QObject *obj;
+ QObjectListIt itemsLineEditIt( *l );
+ while ( (obj = itemsLineEditIt.current()) != 0 ) {
+ ++itemsLineEditIt;
+ QObject::connect( this,
+ SIGNAL( itemRenamed( const QString & ) ),
+ obj,
+ SLOT( setText( const QString & ) ) );
+ }
+ delete l;
+}
+
+void EditFunctions::okClicked()
+{
+ QValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( formWindow );
+ QString n = tr( "Add/Remove functions of '%1'" ).arg( formWindow->name() );
+ QPtrList<Command> commands;
+ QValueList<MetaDataBase::Function>::Iterator fit;
+ if ( !functionList.isEmpty() ) {
+ for ( fit = functionList.begin(); fit != functionList.end(); ++fit ) {
+ bool functionFound = FALSE;
+ QValueList<FunctItem>::Iterator it = functList.begin();
+ for ( ; it != functList.end(); ++it ) {
+ if ( MetaDataBase::normalizeFunction( (*it).oldName ) ==
+ MetaDataBase::normalizeFunction( (*fit).function ) ) {
+ functionFound = TRUE;
+ break;
+ }
+ }
+ if ( !functionFound )
+ commands.append( new RemoveFunctionCommand( tr( "Remove function" ),
+ formWindow, (*fit).function, (*fit).specifier,
+ (*fit).access,
+ (*fit).type,
+ formWindow->project()->language(),
+ (*fit).returnType ) );
+ }
+ }
+
+ bool invalidFunctions = FALSE;
+ QValueList<FunctItem> invalidItems;
+
+ if ( !functList.isEmpty() ) {
+ QStrList lst;
+ QValueList<FunctItem>::Iterator it = functList.begin();
+ for ( ; it != functList.end(); ++it ) {
+ MetaDataBase::Function function;
+ function.function = (*it).newName;
+ function.returnType = (*it).retTyp;
+ function.specifier = (*it).spec;
+ function.access = (*it).access;
+ function.type = (*it).type;
+ function.language = formWindow->project()->language();
+ if ( function.returnType.isEmpty() )
+ function.returnType = "void";
+ QString s = function.function;
+ s = s.simplifyWhiteSpace();
+ bool startNum = s[ 0 ] >= '0' && s[ 0 ] <= '9';
+ bool noParens = s.contains( '(' ) != 1 || s.contains( ')' ) != 1;
+ bool illegalSpace = s.find( ' ' ) != -1 && s.find( ' ' ) < s.find( '(' );
+
+ if ( startNum || noParens || illegalSpace || lst.find( function.function ) != -1 ) {
+ invalidFunctions = TRUE;
+ invalidItems.append( (*it) );
+ continue;
+ }
+ bool functionFound = FALSE;
+ for ( fit = functionList.begin(); fit != functionList.end(); ++fit ) {
+ if ( MetaDataBase::normalizeFunction( (*fit).function ) ==
+ MetaDataBase::normalizeFunction( (*it).oldName ) ) {
+ functionFound = TRUE;
+ break;
+ }
+ }
+ if ( !functionFound )
+ commands.append( new AddFunctionCommand( tr( "Add function" ),
+ formWindow, function.function, function.specifier,
+ function.access,
+ function.type, formWindow->project()->language(),
+ function.returnType ) );
+ if ( MetaDataBase::normalizeFunction( (*it).newName ) != MetaDataBase::normalizeFunction( (*it).oldName ) ||
+ (*it).spec != (*it).oldSpec || (*it).access != (*it).oldAccess || (*it).type != (*it).oldType ||
+ (*it).retTyp != (*it).oldRetTyp ) {
+ QString normalizedOldName = MetaDataBase::normalizeFunction( (*it).oldName );
+ if ((*it).oldName.endsWith("const")) // make sure we get the 'const' when we remove the old name
+ normalizedOldName += " const";
+ commands.append( new ChangeFunctionAttribCommand( tr( "Change function attributes" ),
+ formWindow, function, normalizedOldName,
+ (*it).oldSpec, (*it).oldAccess, (*it).oldType,
+ formWindow->project()->language(), (*it).oldRetTyp ) );
+ }
+ lst.append( function.function );
+ }
+ }
+
+ if ( invalidFunctions ) {
+ if ( QMessageBox::information( this, tr( "Edit Functions" ),
+ tr( "Some syntactically incorrect functions have been defined.\n"
+ "Remove these functions?" ), tr( "&Yes" ), tr( "&No" ) ) == 0 ) {
+ QValueList<FunctItem>::Iterator it = functList.begin();
+ while ( it != functList.end() ) {
+ bool found = FALSE;
+ QValueList<FunctItem>::Iterator vit = invalidItems.begin();
+ for ( ; vit != invalidItems.end(); ++vit ) {
+ if ( (*vit).newName == (*it).newName ) {
+ invalidItems.remove( vit );
+ found = TRUE;
+ break;
+ }
+ }
+ if ( found ) {
+ int delId = (*it).id;
+ it = functList.remove( it );
+ QMap<QListViewItem*, int>::Iterator fit = functionIds.begin();
+ while ( fit != functionIds.end() ) {
+ if ( *fit == delId ) {
+ QListViewItem *litem = fit.key();
+ functionIds.remove( fit );
+ delete litem;
+ if ( functionListView->currentItem() )
+ functionListView->setSelected( functionListView->currentItem(), TRUE );
+ currentItemChanged( functionListView->currentItem() );
+ break;
+ }
+ ++fit;
+ }
+ }
+ else
+ ++it;
+ }
+ if ( functionListView->firstChild() ) {
+ functionListView->setCurrentItem( functionListView->firstChild() );
+ functionListView->setSelected( functionListView->firstChild(), TRUE );
+ }
+ }
+ formWindow->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ return;
+ }
+
+ if ( !commands.isEmpty() ) {
+ MacroCommand *cmd = new MacroCommand( n, formWindow, commands );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+
+ formWindow->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ accept();
+}
+
+void EditFunctions::functionAdd( const QString &access, const QString &type )
+{
+ QListViewItem *i = new QListViewItem( functionListView );
+ i->setPixmap( 0, QPixmap::fromMimeSource( "designer_editslots.png" ) );
+ i->setRenameEnabled( 0, TRUE );
+ i->setText( 1, "void" );
+ i->setText( 2, "virtual" );
+
+ if ( access.isEmpty() )
+ i->setText( 3, "public" );
+ else
+ i->setText( 3, access );
+
+ if( type.isEmpty() ) {
+ if ( showOnlySlots->isChecked() )
+ i->setText( 4, "slot" );
+ else {
+ i->setText( 4, lastType );
+ }
+ } else {
+ i->setText( 4, type );
+ }
+
+ if ( i->text( 4 ) == "slot" ) {
+ i->setText( 0, "newSlot()" );
+ if ( MetaDataBase::isSlotUsed( formWindow, "newSlot()" ) )
+ i->setText( 5, tr( "Yes" ) );
+ else
+ i->setText( 5, tr( "No" ) );
+ } else {
+ i->setText( 0, "newFunction()" );
+ i->setText( 5, "---" );
+ }
+
+ functionListView->setCurrentItem( i );
+ functionListView->setSelected( i, TRUE );
+ functionListView->ensureItemVisible( i );
+ functionName->setFocus();
+ functionName->selectAll();
+
+ FunctItem fui;
+ fui.id = id;
+ fui.oldName = i->text( 0 );
+ fui.newName = fui.oldName;
+ fui.oldRetTyp = i->text( 1 );
+ fui.retTyp = fui.oldRetTyp;
+ fui.oldSpec = i->text ( 2 );
+ fui.spec = fui.oldSpec;
+ fui.oldAccess = i->text( 3 );
+ fui.access = fui.oldAccess;
+ fui.oldType = i->text( 4 );
+ fui.type = fui.oldType;
+ lastType = fui.oldType;
+ functList.append( fui );
+ functionIds.insert( i, id );
+ id++;
+}
+
+void EditFunctions::functionRemove()
+{
+ if ( !functionListView->currentItem() )
+ return;
+
+ functionListView->blockSignals( TRUE );
+ removedFunctions << MetaDataBase::normalizeFunction( functionListView->currentItem()->text( 0 ) );
+ int delId = functionIds[ functionListView->currentItem() ];
+ QValueList<FunctItem>::Iterator it = functList.begin();
+ while ( it != functList.end() ) {
+ if ( (*it).id == delId ) {
+ functList.remove( it );
+ break;
+ }
+ ++it;
+ }
+ functionIds.remove( functionListView->currentItem() );
+ delete functionListView->currentItem();
+ if ( functionListView->currentItem() )
+ functionListView->setSelected( functionListView->currentItem(), TRUE );
+ functionListView->blockSignals( FALSE );
+ currentItemChanged( functionListView->currentItem() );
+}
+
+void EditFunctions::currentItemChanged( QListViewItem *i )
+{
+ functionName->blockSignals( TRUE );
+ functionName->setText( "" );
+ functionAccess->setCurrentItem( 0 );
+ functionName->blockSignals( FALSE );
+
+ if ( !i ) {
+ boxProperties->setEnabled( FALSE );
+ return;
+ }
+
+ functionName->blockSignals( TRUE );
+ functionName->setText( i->text( 0 ) );
+ editType->setText( i->text( 1 ) );
+ QString specifier = i->text( 2 );
+ QString access = i->text( 3 );
+ QString type = i->text( 4 );
+ if ( specifier == "pure virtual" )
+ functionSpecifier->setCurrentItem( 2 );
+ else if ( specifier == "non virtual" )
+ functionSpecifier->setCurrentItem( 0 );
+ else if ( specifier == "virtual" )
+ functionSpecifier->setCurrentItem( 1 );
+ else
+ functionSpecifier->setCurrentItem( 3 );
+ if ( access == "private" )
+ functionAccess->setCurrentItem( 2 );
+ else if ( access == "protected" )
+ functionAccess->setCurrentItem( 1 );
+ else
+ functionAccess->setCurrentItem( 0 );
+ if ( type == "slot" )
+ functionType->setCurrentItem( 0 );
+ else
+ functionType->setCurrentItem( 1 );
+
+ functionName->blockSignals( FALSE );
+ boxProperties->setEnabled( TRUE );
+}
+
+void EditFunctions::currentTextChanged( const QString &txt )
+{
+ if ( !functionListView->currentItem() )
+ return;
+
+ changeItem( functionListView->currentItem(), Name, txt );
+ functionListView->currentItem()->setText( 0, txt );
+
+ if ( functionListView->currentItem()->text( 4 ) == "slot" ) {
+ if ( MetaDataBase::isSlotUsed( formWindow, MetaDataBase::normalizeFunction( txt.latin1() ).latin1() ) )
+ functionListView->currentItem()->setText( 5, tr( "Yes" ) );
+ else
+ functionListView->currentItem()->setText( 5, tr( "No" ) );
+ } else {
+ functionListView->currentItem()->setText( 5, "---" );
+ }
+}
+
+void EditFunctions::currentSpecifierChanged( const QString& s )
+{
+ if ( !functionListView->currentItem() )
+ return;
+
+ changeItem( functionListView->currentItem(), Specifier, s );
+ functionListView->currentItem()->setText( 2, s );
+}
+
+void EditFunctions::currentAccessChanged( const QString& a )
+{
+ if ( !functionListView->currentItem() )
+ return;
+ changeItem( functionListView->currentItem(), Access, a );
+ functionListView->currentItem()->setText( 3, a );
+}
+
+
+void EditFunctions::currentReturnTypeChanged( const QString &type )
+{
+ if ( !functionListView->currentItem() )
+ return;
+ changeItem( functionListView->currentItem(), ReturnType, type );
+ functionListView->currentItem()->setText( 1, type );
+}
+
+void EditFunctions::currentTypeChanged( const QString &type )
+{
+ if ( !functionListView->currentItem() )
+ return;
+ changeItem( functionListView->currentItem(), Type, type );
+ lastType = type;
+ functionListView->currentItem()->setText( 4, type );
+ if ( type == "slot" ) {
+ if ( MetaDataBase::isSlotUsed( formWindow,
+ MetaDataBase::normalizeFunction( functionListView->currentItem()->text( 0 ).latin1() ).latin1() ) )
+ functionListView->currentItem()->setText( 5, tr( "Yes" ) );
+ else
+ functionListView->currentItem()->setText( 5, tr( "No" ) );
+ } else {
+ functionListView->currentItem()->setText( 5, "---" );
+ }
+}
+
+void EditFunctions::changeItem( QListViewItem *item, Attribute a, const QString &nV )
+{
+ int itemId;
+ QMap<QListViewItem*, int>::Iterator fit = functionIds.find( item );
+ if ( fit != functionIds.end() )
+ itemId = *fit;
+ else
+ return;
+
+ QValueList<FunctItem>::Iterator it = functList.begin();
+ for ( ; it != functList.end(); ++it ) {
+ if ( (*it).id == itemId ) {
+ switch( a ) {
+ case Name:
+ (*it).newName = nV;
+ break;
+ case Specifier:
+ (*it).spec = nV;
+ break;
+ case Access:
+ (*it).access = nV;
+ break;
+ case ReturnType:
+ (*it).retTyp = nV;
+ break;
+ case Type:
+ (*it).type = nV;
+ break;
+ }
+ }
+ }
+}
+
+void EditFunctions::setCurrentFunction( const QString &function )
+{
+ QListViewItemIterator it( functionListView );
+ while ( it.current() ) {
+ if ( MetaDataBase::normalizeFunction( it.current()->text( 0 ) ) == function ) {
+ functionListView->setCurrentItem( it.current() );
+ functionListView->setSelected( it.current(), TRUE );
+ currentItemChanged( it.current() );
+ return;
+ }
+ ++it;
+ }
+}
+
+void EditFunctions::displaySlots( bool justSlots )
+{
+ functionIds.clear();
+ functionListView->clear();
+ for ( QValueList<FunctItem>::Iterator it = functList.begin(); it != functList.end(); ++it ) {
+ if ( (*it).type == "function" && justSlots )
+ continue;
+ QListViewItem *i = new QListViewItem( functionListView );
+ functionIds.insert( i, (*it).id );
+ i->setPixmap( 0, QPixmap::fromMimeSource( "designer_editslots.png" ) );
+ i->setText( 0, (*it).newName );
+ i->setText( 1, (*it).retTyp );
+ i->setText( 2, (*it).spec );
+ i->setText( 3, (*it).access );
+ i->setText( 4, (*it).type );
+
+ if ( (*it).type == "slot" ) {
+ if ( MetaDataBase::isSlotUsed( formWindow, MetaDataBase::normalizeFunction( (*it).newName ).latin1() ) )
+ i->setText( 5, tr( "Yes" ) );
+ else
+ i->setText( 5, tr( "No" ) );
+ } else {
+ i->setText( 5, "---" );
+ }
+ }
+
+ if ( functionListView->firstChild() )
+ functionListView->setSelected( functionListView->firstChild(), TRUE );
+}
+
+void EditFunctions::emitItemRenamed( QListViewItem *, int, const QString & text )
+{
+ emit itemRenamed( text ); // Relay signal ( to QLineEdit )
+}
diff --git a/tools/designer/designer/editfunctionsimpl.h b/tools/designer/designer/editfunctionsimpl.h
new file mode 100644
index 0000000..a51ae24
--- /dev/null
+++ b/tools/designer/designer/editfunctionsimpl.h
@@ -0,0 +1,101 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef EDITFUNCTIONSIMPL_H
+#define EDITFUNCTIONSIMPL_H
+
+#include "editfunctions.h"
+#include "hierarchyview.h"
+#include "metadatabase.h"
+#include <qmap.h>
+
+class FormWindow;
+class QListViewItem;
+
+class EditFunctions : public EditFunctionsBase
+{
+ Q_OBJECT
+
+public:
+ EditFunctions( QWidget *parent, FormWindow *fw, bool showOnlySlots = FALSE );
+
+ void setCurrentFunction( const QString &function );
+ void functionAdd( const QString &access = QString::null,
+ const QString &type = QString::null );
+ void functionAdd() { functionAdd( "public" ); }
+
+signals:
+ void itemRenamed(const QString &);
+
+protected slots:
+ void okClicked();
+ void functionRemove();
+ void currentItemChanged( QListViewItem * );
+ void currentTextChanged( const QString &txt );
+ void currentSpecifierChanged( const QString &s );
+ void currentAccessChanged( const QString &a );
+ void currentReturnTypeChanged( const QString &type );
+ void currentTypeChanged( const QString &type );
+ void displaySlots( bool justSlots );
+ void emitItemRenamed( QListViewItem *, int, const QString & );
+
+private:
+ enum Attribute { Name, Specifier, Access, ReturnType, Type };
+ struct FunctItem {
+ int id;
+ QString oldName;
+ QString newName;
+ QString oldRetTyp;
+ QString retTyp;
+ QString spec;
+ QString oldSpec;
+ QString access;
+ QString oldAccess;
+ QString type;
+ QString oldType;
+
+ Q_DUMMY_COMPARISON_OPERATOR( FunctItem )
+ };
+
+ void changeItem( QListViewItem *item, Attribute a, const QString &nV );
+
+ FormWindow *formWindow;
+ QMap<QListViewItem*, int> functionIds;
+ QStringList removedFunctions;
+ QValueList<MetaDataBase::Function> itemList;
+ QValueList<FunctItem> functList;
+ int id;
+ QString lastType;
+};
+
+#endif
diff --git a/tools/designer/designer/finddialog.ui b/tools/designer/designer/finddialog.ui
new file mode 100644
index 0000000..a5f9ba7
--- /dev/null
+++ b/tools/designer/designer/finddialog.ui
@@ -0,0 +1,281 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>FindDialog</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>FindDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>285</width>
+ <height>189</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Find Text</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>F&amp;ind:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboFind</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>comboFind</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Find</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="1">
+ <property name="name">
+ <cstring>ButtonGroup2</cstring>
+ </property>
+ <property name="title">
+ <string>Direction</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioForward</cstring>
+ </property>
+ <property name="text">
+ <string>Forwar&amp;d</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioBackward</cstring>
+ </property>
+ <property name="text">
+ <string>Bac&amp;kward</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="0">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkWords</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Whole words only</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkCase</cstring>
+ </property>
+ <property name="text">
+ <string>Case &amp;sensitive</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBegin</cstring>
+ </property>
+ <property name="text">
+ <string>Start at &amp;Beginning</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>FindDialog</receiver>
+ <slot>doFind()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>FindDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>comboFind</tabstop>
+ <tabstop>checkWords</tabstop>
+ <tabstop>checkCase</tabstop>
+ <tabstop>checkBegin</tabstop>
+ <tabstop>radioForward</tabstop>
+ <tabstop>radioBackward</tabstop>
+ <tabstop>PushButton1</tabstop>
+ <tabstop>PushButton2</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">qlineedit.h</include>
+ <include location="local" impldecl="in implementation">../interfaces/editorinterface.h</include>
+ <include location="local" impldecl="in implementation">finddialog.ui.h</include>
+</includes>
+<forwards>
+ <forward>struct EditorInterface;</forward>
+</forwards>
+<variables>
+ <variable>EditorInterface *editor;</variable>
+ <variable>QObject *formWindow;</variable>
+</variables>
+<slots>
+ <slot>init()</slot>
+ <slot>destroy()</slot>
+ <slot>doFind()</slot>
+ <slot>setEditor( EditorInterface * e, QObject * fw )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/finddialog.ui.h b/tools/designer/designer/finddialog.ui.h
new file mode 100644
index 0000000..ed531ec
--- /dev/null
+++ b/tools/designer/designer/finddialog.ui.h
@@ -0,0 +1,68 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+void FindDialog::init()
+{
+ editor = 0;
+ formWindow = 0;
+}
+
+void FindDialog::destroy()
+{
+ if ( editor )
+ editor->release();
+}
+
+void FindDialog::doFind()
+{
+ if ( !editor )
+ return;
+
+ if ( !editor->find( comboFind->currentText(), checkCase->isChecked(),
+ checkWords->isChecked(), radioForward->isChecked(), !checkBegin->isChecked() ) )
+ checkBegin->setChecked( TRUE );
+ else
+ checkBegin->setChecked( FALSE );
+
+}
+
+void FindDialog::setEditor( EditorInterface * e, QObject * fw )
+{
+ if ( fw != formWindow )
+ checkBegin->setChecked( TRUE );
+ formWindow = fw;
+ if ( editor )
+ editor->release();
+ editor = e;
+ editor->addRef();
+}
diff --git a/tools/designer/designer/formfile.cpp b/tools/designer/designer/formfile.cpp
new file mode 100644
index 0000000..a410f7e
--- /dev/null
+++ b/tools/designer/designer/formfile.cpp
@@ -0,0 +1,924 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "formfile.h"
+#include "timestamp.h"
+#include "project.h"
+#include "formwindow.h"
+#include "command.h"
+#include "sourceeditor.h"
+#include "mainwindow.h"
+#include "../interfaces/languageinterface.h"
+#include "resource.h"
+#include "workspace.h"
+#include <qmessagebox.h>
+#include <qfile.h>
+#include <qstatusbar.h>
+#include "propertyeditor.h"
+#include <qworkspace.h>
+#include <stdlib.h>
+#include "designerappiface.h"
+#include <qapplication.h>
+
+static QString make_func_pretty( const QString &s )
+{
+ QString res = s;
+ if ( res.find( ")" ) - res.find( "(" ) == 1 )
+ return res;
+ res.replace( "(", "( " );
+ res.replace( ")", " )" );
+ res.replace( "&", " &" );
+ res.replace( "*", " *" );
+ res.replace( ",", ", " );
+ res.replace( ":", " : " );
+ res = res.simplifyWhiteSpace();
+ res.replace( " : : ", "::" );
+ res.replace( ">>", "> >" );
+ return res;
+}
+
+FormFile::FormFile( const QString &fn, bool temp, Project *p, const char *name )
+ : filename( fn ), fileNameTemp( temp ), pro( p ), fw( 0 ), ed( 0 ),
+ timeStamp( 0, fn + codeExtension() ), codeEdited( FALSE ), pkg( FALSE ),
+ cm( FALSE ), codeFileStat( None ), timeStampUi(0, fn)
+{
+ MetaDataBase::addEntry( this );
+ fake = qstrcmp( name, "qt_fakewindow" ) == 0;
+ //codeFileStat = FormFile::None;
+ pro->addFormFile( this );
+ loadCode();
+ if ( !temp )
+ checkFileName( FALSE );
+ timeStampUi.update();
+}
+
+FormFile::~FormFile()
+{
+ pro->removeFormFile( this );
+ if ( formWindow() )
+ formWindow()->setFormFile( 0 );
+}
+
+void FormFile::setFormWindow( FormWindow *f )
+{
+ if ( f == fw )
+ return;
+ if ( fw )
+ fw->setFormFile( 0 );
+ fw = f;
+ if ( fw )
+ fw->setFormFile( this );
+ parseCode( cod, FALSE );
+ QTimer::singleShot( 0, this, SLOT( notifyFormWindowChange() ) );
+}
+
+void FormFile::setEditor( SourceEditor *e )
+{
+ ed = e;
+}
+
+void FormFile::setFileName( const QString &fn )
+{
+ if ( fn == filename )
+ return;
+ if ( fn.isEmpty() ) {
+ fileNameTemp = TRUE;
+ if ( filename.find( "unnamed" ) != 0 )
+ filename = createUnnamedFileName();
+ return;
+ } else {
+ fileNameTemp = FALSE;
+ }
+ filename = fn;
+ timeStamp.setFileName( filename + codeExtension() );
+ timeStampUi.setFileName( filename );
+ cod = "";
+ loadCode();
+}
+
+void FormFile::setCode( const QString &c )
+{
+ cod = c;
+}
+
+FormWindow *FormFile::formWindow() const
+{
+ return fw;
+}
+
+SourceEditor *FormFile::editor() const
+{
+ return ed;
+}
+
+QString FormFile::fileName() const
+{
+ return filename;
+}
+
+QString FormFile::absFileName() const
+{
+ return pro->makeAbsolute( filename );
+}
+
+QString FormFile::codeFile() const
+{
+ QString codeExt = codeExtension();
+ if ( codeExt.isEmpty() )
+ return "";
+ return filename + codeExt;
+}
+
+QString FormFile::code()
+{
+ return cod;
+}
+
+bool FormFile::save( bool withMsgBox, bool ignoreModified )
+{
+ if ( fileNameTemp )
+ return saveAs();
+ if ( !ignoreModified && !isModified() )
+ return TRUE;
+ if ( ed )
+ ed->save();
+ if (!shouldOverwriteUi())
+ return TRUE;
+
+ if ( formWindow() && isModified( WFormWindow ) ) {
+ if ( withMsgBox ) {
+ if ( !formWindow()->checkCustomWidgets() )
+ return FALSE;
+ }
+
+ if ( QFile::exists( pro->makeAbsolute( filename ) ) ) {
+ QString fn( pro->makeAbsolute( filename ) );
+#if defined(Q_OS_WIN32)
+ fn += ".bak";
+#else
+ fn += "~";
+#endif
+ QFile f( pro->makeAbsolute( filename ) );
+ if ( f.open( IO_ReadOnly ) ) {
+ QFile f2( fn );
+ if ( f2.open( IO_WriteOnly | IO_Translate ) ) {
+ QCString data( f.size() );
+ f.readBlock( data.data(), f.size() );
+ f2.writeBlock( data );
+ } else {
+ QMessageBox::warning( MainWindow::self, "Save", "The file " +
+ codeFile() + " could not be saved" );
+ }
+ }
+ }
+ }
+
+ if ( isModified( WFormCode ) ) {
+ if ( QFile::exists( pro->makeAbsolute( codeFile() ) ) ) {
+ QString fn( pro->makeAbsolute( codeFile() ) );
+#if defined(Q_OS_WIN32)
+ fn += ".bak";
+#else
+ fn += "~";
+#endif
+ QFile f( pro->makeAbsolute( codeFile() ) );
+ if ( f.open( IO_ReadOnly ) ) {
+ QFile f2( fn );
+ if ( f2.open( IO_WriteOnly | IO_Translate) ) {
+ QCString data( f.size() );
+ f.readBlock( data.data(), f.size() );
+ f2.writeBlock( data );
+ } else if ( qApp->type() != QApplication::Tty ) {
+ QMessageBox::warning( MainWindow::self, "Save", "The file " +
+ codeFile() + " could not be saved" );
+ }
+ }
+ }
+ }
+
+ if ( formWindow() ) {
+ Resource resource( MainWindow::self );
+ resource.setWidget( formWindow() );
+ bool formCodeOnly = isModified( WFormCode ) && !isModified( WFormWindow );
+ if ( !resource.save( pro->makeAbsolute( filename ), formCodeOnly ) ) {
+ if ( MainWindow::self )
+ MainWindow::self->statusBar()->message( tr( "Failed to save file '%1'.").arg( formCodeOnly ? codeFile(): filename ),
+ 5000 );
+ if ( formCodeOnly )
+ return FALSE;
+ return saveAs();
+ }
+ if ( MainWindow::self )
+ MainWindow::self->statusBar()->message( tr( "'%1' saved.").
+ arg( formCodeOnly ? codeFile() : filename ),
+ 3000 );
+ } else {
+ if ( !Resource::saveFormCode(this, MetaDataBase::languageInterface(pro->language())) )
+ return FALSE;
+ }
+ timeStamp.update();
+ timeStampUi.update();
+ setModified( FALSE );
+ return TRUE;
+}
+
+bool FormFile::shouldOverwriteUi() const
+{
+ if (timeStampUi.isUpToDate())
+ return TRUE;
+ return (QMessageBox::information(MainWindow::self, tr( "Qt Designer" ),
+ tr("File '%1' has been changed outside Qt Designer.\n"
+ "Do you want to overwrite it?" ).arg(timeStampUi.fileName()),
+ tr("&Yes"), tr("&No")) == 0);
+}
+
+bool FormFile::saveAs( bool ignoreModified )
+{
+ QString f = pro->makeAbsolute( fileName() );
+ if ( fileNameTemp && formWindow() ) {
+ f = QString( formWindow()->name() ).lower();
+ f.replace( "::", "_" );
+ f = pro->makeAbsolute( f + ".ui" );
+ }
+ bool saved = FALSE;
+ if ( ignoreModified ) {
+ QString dir = QStringList::split( ':', pro->iFace()->customSetting( "QTSCRIPT_PACKAGES" ) ).first();
+ f = QFileInfo( f ).fileName();
+ f.prepend( dir + "/" );
+ }
+ QString fn;
+ while ( !saved ) {
+ fn = QFileDialog::getSaveFileName( f,
+ tr( "Qt User-Interface Files (*.ui)" ) + ";;" +
+ tr( "All Files (*)" ), MainWindow::self, 0,
+ tr( "Save Form '%1' As ...").arg( formName() ),
+ MainWindow::self ? &MainWindow::self->lastSaveFilter : 0 );
+ if ( fn.isEmpty() )
+ return FALSE;
+ QFileInfo fi( fn );
+ if ( fi.extension() != "ui" )
+ fn += ".ui";
+ fileNameTemp = FALSE;
+ filename = pro->makeRelative( fn );
+ QFileInfo relfi( filename );
+ if ( relfi.exists() ) {
+ if ( QMessageBox::warning( MainWindow::self, tr( "File Already Exists" ),
+ tr( "The file already exists. Do you wish to overwrite it?" ),
+ QMessageBox::Yes,
+ QMessageBox::No ) == QMessageBox::Yes ) {
+ saved = TRUE;
+ } else {
+ filename = f;
+ }
+
+ } else {
+ saved = TRUE;
+ }
+ }
+ if ( !checkFileName( TRUE ) ) {
+ filename = f;
+ return FALSE;
+ }
+ pro->setModified( TRUE );
+ timeStamp.setFileName( pro->makeAbsolute( codeFile() ) );
+ if ( ed && formWindow() )
+ ed->setCaption( tr( "Edit %1" ).arg( formWindow()->name() ) );
+ setModified( TRUE );
+ if ( pro->isDummy() )
+ fw->mainWindow()->addRecentlyOpenedFile( fn );
+ return save( TRUE, ignoreModified );
+}
+
+bool FormFile::close()
+{
+ if ( editor() ) {
+ editor()->save();
+ editor()->close();
+ }
+ if ( formWindow() )
+ return formWindow()->close();
+ return TRUE;
+}
+
+bool FormFile::closeEvent()
+{
+ if ( !isModified() && fileNameTemp ) {
+ pro->removeFormFile( this );
+ return TRUE;
+ }
+
+ if ( !isModified() )
+ return TRUE;
+
+ if ( editor() )
+ editor()->save();
+
+ switch ( QMessageBox::warning( MainWindow::self, tr( "Save Form" ),
+ tr( "Save changes to form '%1'?" ).arg( filename ),
+ tr( "&Yes" ), tr( "&No" ), tr( "&Cancel" ), 0, 2 ) ) {
+ case 0: // save
+ if ( !save() )
+ return FALSE;
+ case 1: // don't save
+ loadCode();
+ if ( ed )
+ ed->editorInterface()->setText( cod );
+ if ( fileNameTemp )
+ pro->removeFormFile( this );
+ if ( MainWindow::self )
+ MainWindow::self->workspace()->update();
+ break;
+ case 2: // cancel
+ return FALSE;
+ default:
+ break;
+ }
+
+ setModified( FALSE );
+ if ( MainWindow::self )
+ MainWindow::self->updateFunctionList();
+ setCodeEdited( FALSE );
+ return TRUE;
+}
+
+void FormFile::setModified( bool m, int who )
+{
+ if ( ( who & WFormWindow ) == WFormWindow )
+ setFormWindowModified( m );
+ if ( ( who & WFormCode ) == WFormCode )
+ setCodeModified( m );
+}
+
+bool FormFile::isModified( int who )
+{
+ if ( who == WFormWindow )
+ return isFormWindowModified();
+ if ( who == WFormCode )
+ return isCodeModified();
+ return isCodeModified() || isFormWindowModified();
+}
+
+bool FormFile::isFormWindowModified() const
+{
+ if ( !formWindow() || !formWindow()->commandHistory() )
+ return FALSE;
+ return formWindow()->commandHistory()->isModified();
+}
+
+bool FormFile::isCodeModified() const
+{
+ if ( !editor() )
+ return cm;
+ return editor()->isModified();
+}
+
+void FormFile::setFormWindowModified( bool m )
+{
+ bool b = isFormWindowModified();
+ if ( m == b )
+ return;
+ if ( !formWindow() || !formWindow()->commandHistory() )
+ return;
+ formWindow()->commandHistory()->setModified( m );
+ emit somethingChanged( this );
+}
+
+void FormFile::setCodeModified( bool m )
+{
+ bool b = isCodeModified();
+ if ( m == b )
+ return;
+ emit somethingChanged( this );
+ cm = m;
+ if ( !editor() )
+ return;
+ editor()->setModified( m );
+}
+
+void FormFile::showFormWindow()
+{
+ if ( !MainWindow::self )
+ return;
+ if ( formWindow() ) {
+ if ( ( formWindow()->hasFocus() ||
+ MainWindow::self->qWorkspace()->activeWindow() == formWindow() ) &&
+ MainWindow::self->propertyeditor()->formWindow() != formWindow() ) {
+ MainWindow::self->propertyeditor()->setWidget( formWindow()->currentWidget(), formWindow() );
+ MainWindow::self->objectHierarchy()->setFormWindow( formWindow(),
+ formWindow()->currentWidget() );
+ }
+ formWindow()->setFocus();
+ return;
+ }
+ MainWindow::self->openFormWindow( pro->makeAbsolute( filename ), TRUE, this );
+}
+
+bool FormFile::setupUihFile( bool askForUih )
+{
+ if ( !pro->isCpp() || !askForUih ) {
+ if ( !hasFormCode() ) {
+ createFormCode();
+ setModified( TRUE );
+ }
+ codeFileStat = FormFile::Ok;
+ return TRUE;
+ }
+ if ( codeFileStat != FormFile::Ok && !ed ) {
+ if ( hasFormCode() ) {
+ int i = QMessageBox::information( MainWindow::self, tr( "Using ui.h file" ),
+ tr( "An \"ui.h\" file for this form already exists.\n"
+ "Do you want to use it or create a new one?" ),
+ tr( "Use existing" ), tr( "Create new" ),
+ tr( "Cancel" ), 2, 2 );
+ if ( i == 2 )
+ return FALSE;
+ if ( i == 1 )
+ createFormCode();
+ } else {
+ if ( QMessageBox::Yes != QMessageBox::information( MainWindow::self, tr( "Creating ui.h file" ),
+ tr( "Do you want to create an new \"ui.h\" file?" ),
+ QMessageBox::Yes, QMessageBox::No ) )
+ return FALSE;
+ createFormCode();
+ }
+ setModified( TRUE );
+ }
+ codeFileStat = FormFile::Ok;
+ return TRUE;
+}
+
+SourceEditor *FormFile::showEditor( bool askForUih )
+{
+ if ( !MainWindow::self )
+ return 0;
+ showFormWindow();
+ if ( !setupUihFile( askForUih ) )
+ return 0;
+ SourceEditor *se = MainWindow::self->openSourceEditor();
+ if ( !se )
+ return 0;
+ se->setActiveWindow();
+ se->setFocus();
+ return se;
+}
+
+static int ui_counter = 0;
+QString FormFile::createUnnamedFileName()
+{
+ return QString( "unnamed" ) + QString::number( ++ui_counter ) + QString( ".ui" );
+}
+
+QString FormFile::codeExtension() const
+{
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( iface )
+ return iface->formCodeExtension();
+ return "";
+}
+
+QString FormFile::codeComment() const
+{
+ return QString( "/****************************************************************************\n"
+ "** ui.h extension file, included from the uic-generated form implementation.\n"
+ "**\n"
+ "** If you want to add, delete, or rename functions or slots, use\n"
+ "** Qt Designer to update this file, preserving your code.\n"
+ "**\n"
+ "** You should not define a constructor or destructor in this file.\n"
+ "** Instead, write your code in functions called init() and destroy().\n"
+ "** These will automatically be called by the form's constructor and\n"
+ "** destructor.\n"
+ "*****************************************************************************/\n" );
+}
+
+bool FormFile::hasFormCode() const
+{
+ return !cod.isEmpty() && cod != QString( codeComment() );
+}
+
+int FormFile::codeFileState() const
+{
+ return hasFormCode() ? codeFileStat : None;
+}
+
+void FormFile::setCodeFileState( UihState s )
+{
+ codeFileStat = s;
+}
+
+void FormFile::createFormCode()
+{
+ if ( !formWindow() )
+ return;
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( !iface )
+ return;
+ if ( pro->isCpp() )
+ cod = codeComment();
+ QValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( formWindow() );
+ for ( QValueList<MetaDataBase::Function>::Iterator it = functionList.begin(); it != functionList.end(); ++it ) {
+ cod += (!cod.isEmpty() ? "\n\n" : "") +
+ iface->createFunctionStart( formWindow()->name(), make_func_pretty((*it).function),
+ (*it).returnType.isEmpty() ?
+ QString( "void" ) :
+ (*it).returnType, (*it).access ) +
+ "\n" + iface->createEmptyFunction();
+ }
+ parseCode( cod, FALSE );
+}
+
+void FormFile::load()
+{
+ showFormWindow();
+ code();
+}
+
+bool FormFile::loadCode()
+{
+ QString fn = pro->makeAbsolute( codeFile() );
+ if ( fn.isEmpty() )
+ return FALSE;
+
+ QFile f( fn );
+ if ( !f.open( IO_ReadOnly ) ) {
+ cod = "";
+ setCodeFileState( FormFile::None );
+ return FALSE;
+ }
+ QTextStream ts( &f );
+ cod = ts.read();
+ parseCode( cod, FALSE );
+ if ( hasFormCode() && codeFileStat != FormFile::Ok )
+ setCodeFileState( FormFile::Deleted );
+ timeStamp.update();
+ return TRUE;
+}
+
+bool FormFile::isCodeEdited() const
+{
+ return codeEdited;
+}
+
+void FormFile::setCodeEdited( bool b )
+{
+ codeEdited = b;
+}
+
+void FormFile::parseCode( const QString &txt, bool allowModify )
+{
+ if ( !formWindow() )
+ return;
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( !iface )
+ return;
+ QValueList<LanguageInterface::Function> functions;
+ QValueList<MetaDataBase::Function> newFunctions, oldFunctions;
+ oldFunctions = MetaDataBase::functionList( formWindow() );
+ iface->functions( txt, &functions );
+ QMap<QString, QString> funcs;
+ for ( QValueList<LanguageInterface::Function>::Iterator it = functions.begin();
+ it != functions.end(); ++it ) {
+ bool found = FALSE;
+ for ( QValueList<MetaDataBase::Function>::Iterator fit = oldFunctions.begin();
+ fit != oldFunctions.end(); ++fit ) {
+ QString f( (*fit).function );
+ if ( MetaDataBase::normalizeFunction( f ) ==
+ MetaDataBase::normalizeFunction( (*it).name ) ) {
+ found = TRUE;
+ MetaDataBase::Function function;
+ function.function = make_func_pretty( (*it).name );
+ function.specifier = (*fit).specifier;
+ function.type = (*fit).type;
+ if ( !pro->isCpp() )
+ function.access = (*it).access;
+ else
+ function.access = (*fit).access;
+ function.language = (*fit).language;
+ function.returnType = (*it).returnType;
+ newFunctions << function;
+ funcs.insert( (*it).name, (*it).body );
+ oldFunctions.remove( fit );
+ break;
+ }
+ }
+ if ( !found ) {
+ MetaDataBase::Function function;
+ function.function = make_func_pretty( (*it).name );
+ function.specifier = "virtual";
+ function.access = "public";
+ function.language = pro->language();
+ function.returnType = (*it).returnType;
+ if ( function.returnType == "void" )
+ function.type = "slot";
+ else
+ function.type = "function";
+ if ( function.function == "init()" || function.function == "destroy()" ) {
+ function.type = "function";
+ function.access = "private";
+ function.specifier = "non virtual";
+ }
+ newFunctions << function;
+ funcs.insert( (*it).name, (*it).body );
+ if ( allowModify )
+ setFormWindowModified( TRUE );
+ }
+ }
+
+ if ( allowModify && oldFunctions.count() > 0 )
+ setFormWindowModified( TRUE );
+
+ MetaDataBase::setFunctionList( formWindow(), newFunctions );
+}
+
+void FormFile::syncCode()
+{
+ if ( !editor() )
+ return;
+ parseCode( editor()->editorInterface()->text(), TRUE );
+ cod = editor()->editorInterface()->text();
+}
+
+void FormFile::checkTimeStamp()
+{
+ if ( timeStamp.isUpToDate() )
+ return;
+ timeStamp.update();
+ if ( codeEdited ) {
+ if ( QMessageBox::information( MainWindow::self, tr( "Qt Designer" ),
+ tr( "File '%1' has been changed outside Qt Designer.\n"
+ "Do you want to reload it?" ).arg( timeStamp.fileName() ),
+ tr( "&Yes" ), tr( "&No" ) ) == 0 ) {
+ QFile f( timeStamp.fileName() );
+ if ( f.open( IO_ReadOnly ) ) {
+ QTextStream ts( &f );
+ editor()->editorInterface()->setText( ts.read() );
+ editor()->save();
+ if ( MainWindow::self )
+ MainWindow::self->functionsChanged();
+ }
+ }
+ } else {
+ loadCode();
+ }
+}
+
+bool FormFile::isUihFileUpToDate()
+{
+ if ( timeStamp.isUpToDate() )
+ return TRUE;
+ if ( !editor() ) {
+ MainWindow::self->editSource();
+ parseCode( editor()->editorInterface()->text(), TRUE );
+ }
+ checkTimeStamp();
+ return FALSE;
+}
+
+void FormFile::addFunctionCode( MetaDataBase::Function function )
+{
+ if ( pro->isCpp() && !hasFormCode() && !codeEdited )
+ return;
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( !iface )
+ return;
+
+ QValueList<LanguageInterface::Function> funcs;
+ iface->functions( cod, &funcs );
+ bool hasFunc = FALSE;
+ for ( QValueList<LanguageInterface::Function>::Iterator it = funcs.begin();
+ it != funcs.end(); ++it ) {
+ if ( MetaDataBase::normalizeFunction( (*it).name ) == MetaDataBase::normalizeFunction( function.function ) ) {
+ hasFunc = TRUE;
+ break;
+ }
+ }
+
+ if ( !hasFunc ) {
+ if ( !codeEdited && !timeStamp.isUpToDate() )
+ loadCode();
+ MetaDataBase::MetaInfo mi = MetaDataBase::metaInfo( formWindow() );
+ QString cn;
+ if ( mi.classNameChanged )
+ cn = mi.className;
+ if ( cn.isEmpty() )
+ cn = formWindow()->name();
+ QString body = "\n\n" + iface->createFunctionStart( cn,
+ make_func_pretty( function.function ),
+ function.returnType.isEmpty() ?
+ QString( "void" ) :
+ function.returnType, function.access ) +
+ "\n" + iface->createEmptyFunction();
+ cod += body;
+ if ( codeEdited ) {
+ setModified( TRUE );
+ emit somethingChanged( this );
+ }
+ }
+}
+
+void FormFile::removeFunctionCode( MetaDataBase::Function function )
+{
+ if ( pro->isCpp() && !hasFormCode() && !codeEdited )
+ return;
+
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( !iface )
+ return;
+
+ checkTimeStamp();
+ QString sourceCode = code();
+ if ( sourceCode.isEmpty() )
+ return;
+ QValueList<LanguageInterface::Function> functions;
+ iface->functions( sourceCode, &functions );
+ QString fu = MetaDataBase::normalizeFunction( function.function );
+ for ( QValueList<LanguageInterface::Function>::Iterator fit = functions.begin(); fit != functions.end(); ++fit ) {
+ if ( MetaDataBase::normalizeFunction( (*fit).name ) == fu ) {
+ int line = 0;
+ int start = 0;
+ while ( line < (*fit).start - 1 ) {
+ start = sourceCode.find( '\n', start );
+ if ( start == -1 )
+ return;
+ start++;
+ line++;
+ }
+ if ( start == -1 )
+ return;
+ int end = start;
+ while ( line < (*fit).end + 1 ) {
+ end = sourceCode.find( '\n', end );
+ if ( end == -1 ) {
+ if ( line <= (*fit).end )
+ end = sourceCode.length() - 1;
+ else
+ return;
+ }
+ end++;
+ line++;
+ }
+ if ( end < start )
+ return;
+ sourceCode.remove( start, end - start );
+ setCode( sourceCode );
+ }
+ }
+}
+
+void FormFile::functionNameChanged( const QString &oldName, const QString &newName )
+{
+ if ( !cod.isEmpty() ) {
+ QString funcStart = QString( formWindow()->name() ) + QString( "::" );
+ int i = cod.find( funcStart + oldName );
+ if ( i != -1 ) {
+ cod.remove( i + funcStart.length(), oldName.length() );
+ cod.insert( i + funcStart.length(), newName );
+ }
+ }
+}
+
+void FormFile::functionRetTypeChanged( const QString &fuName, const QString &oldType, const QString &newType )
+{
+ if ( !cod.isEmpty() ) {
+ QString oldFunct = oldType + " " + QString( formWindow()->name() ) + "::" + fuName;
+ QString newFunct = newType + " " + QString( formWindow()->name() ) + "::" + fuName;
+
+ int i = cod.find( oldFunct );
+ if ( i != -1 ) {
+ cod.remove( i, oldFunct.length() );
+ cod.insert( i, newFunct );
+ }
+ }
+}
+
+QString FormFile::formName() const
+{
+ FormFile* that = (FormFile*) this;
+ if ( formWindow() ) {
+ that->cachedFormName = formWindow()->name();
+ return cachedFormName;
+ }
+ if ( !cachedFormName.isNull() )
+ return cachedFormName;
+ QFile f( pro->makeAbsolute( filename ) );
+ if ( f.open( IO_ReadOnly ) ) {
+ QTextStream ts( &f );
+ QString line;
+ QString className;
+ while ( !ts.eof() ) {
+ line = ts.readLine();
+ if ( !className.isEmpty() ) {
+ int end = line.find( "</class>" );
+ if ( end == -1 ) {
+ className += line;
+ } else {
+ className += line.left( end );
+ break;
+ }
+ continue;
+ }
+ int start;
+ if ( ( start = line.find( "<class>" ) ) != -1 ) {
+ int end = line.find( "</class>" );
+ if ( end == -1 ) {
+ className = line.mid( start + 7 );
+ } else {
+ className = line.mid( start + 7, end - ( start + 7 ) );
+ break;
+ }
+ }
+ }
+ that->cachedFormName = className;
+ }
+ if ( cachedFormName.isEmpty() )
+ that->cachedFormName = filename;
+ return cachedFormName;
+}
+
+void FormFile::formWindowChangedSomehow()
+{
+ emit somethingChanged( this );
+}
+
+bool FormFile::checkFileName( bool allowBreak )
+{
+ FormFile *ff = pro->findFormFile( filename, this );
+ if ( ff )
+ QMessageBox::warning( MainWindow::self, tr( "Invalid Filename" ),
+ tr( "The project already contains a form with a\n"
+ "filename of '%1'. Please choose a new filename." ).arg( filename ) );
+ if (!formWindow()) // We are starting up
+ return FALSE;
+ while ( ff ) {
+ QString fn;
+ while ( fn.isEmpty() ) {
+ fn = QFileDialog::getSaveFileName( pro->makeAbsolute( fileName() ),
+ tr( "Qt User-Interface Files (*.ui)" ) + ";;" +
+ tr( "All Files (*)" ), MainWindow::self, 0,
+ tr( "Save Form '%1' As ...").
+ arg( formWindow()->name() ),
+ MainWindow::self ? &MainWindow::self->lastSaveFilter : 0 );
+ if ( allowBreak && fn.isEmpty() )
+ return FALSE;
+ }
+ filename = pro->makeRelative( fn );
+ ff = pro->findFormFile( filename, this );
+ }
+ return TRUE;
+}
+
+void FormFile::addConnection( const QString &sender, const QString &signal,
+ const QString &receiver, const QString &slot )
+{
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( iface )
+ iface->addConnection( sender, signal, receiver, slot, &cod );
+ if ( ed )
+ ed->editorInterface()->setText( cod );
+}
+
+void FormFile::removeConnection( const QString &sender, const QString &signal,
+ const QString &receiver, const QString &slot )
+{
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ if ( iface )
+ iface->removeConnection( sender, signal, receiver, slot, &cod );
+ if ( ed )
+ ed->editorInterface()->setText( cod );
+}
+
+void FormFile::notifyFormWindowChange()
+{
+ if ( fw )
+ pro->formOpened( fw );
+}
diff --git a/tools/designer/designer/formfile.h b/tools/designer/designer/formfile.h
new file mode 100644
index 0000000..73f7139
--- /dev/null
+++ b/tools/designer/designer/formfile.h
@@ -0,0 +1,153 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef FORMFILE_H
+#define FORMFILE_H
+
+#include <qobject.h>
+#include "timestamp.h"
+#include "metadatabase.h"
+
+class Project;
+class FormWindow;
+class SourceEditor;
+
+class FormFile : public QObject
+{
+ Q_OBJECT
+ friend class SourceEditor;
+
+public:
+ enum Who {
+ WFormWindow = 1,
+ WFormCode = 2,
+ WAnyOrAll = WFormWindow | WFormCode
+ };
+
+ enum UihState { None, Ok, Deleted };
+
+ FormFile( const QString &fn, bool temp, Project *p, const char *name = 0 );
+ ~FormFile();
+
+ void setFormWindow( FormWindow *f );
+ void setEditor( SourceEditor *e );
+ void setFileName( const QString &fn );
+ void setCode( const QString &c );
+ void setModified( bool m, int who = WAnyOrAll );
+ void setCodeEdited( bool b );
+
+ FormWindow *formWindow() const;
+ SourceEditor *editor() const;
+ QString fileName() const;
+ QString absFileName() const;
+
+ bool supportsCodeFile() const { return !codeExtension().isEmpty(); }
+ QString codeComment() const;
+ QString codeFile() const;
+ QString code();
+ bool isCodeEdited() const;
+
+ bool loadCode();
+ void load();
+ bool save( bool withMsgBox = TRUE, bool ignoreModified = FALSE );
+ bool saveAs( bool ignoreModified = FALSE );
+ bool close();
+ bool closeEvent();
+ bool isModified( int who = WAnyOrAll );
+ bool hasFormCode() const;
+ void createFormCode();
+ void syncCode();
+ void checkTimeStamp();
+ bool isUihFileUpToDate();
+ void addFunctionCode( MetaDataBase::Function function );
+ void removeFunctionCode( MetaDataBase::Function function );
+ void functionNameChanged( const QString &oldName, const QString &newName );
+ void functionRetTypeChanged( const QString &fuName, const QString &oldType, const QString &newType );
+
+ void showFormWindow();
+ SourceEditor *showEditor( bool askForUih = TRUE );
+
+ static QString createUnnamedFileName();
+ QString formName() const;
+
+ bool isFake() const { return fake; }
+
+ void parseCode( const QString &txt, bool allowModify );
+
+ void addConnection( const QString &sender, const QString &signal,
+ const QString &receiver, const QString &slot );
+ void removeConnection( const QString &sender, const QString &signal,
+ const QString &receiver, const QString &slot );
+
+ bool hasTempFileName() const { return fileNameTemp; }
+ void setCodeFileState( UihState );
+ int codeFileState() const;
+ bool setupUihFile( bool askForUih = TRUE );
+
+ Project *project() const { return pro; }
+
+signals:
+ void somethingChanged( FormFile* );
+
+private slots:
+ void formWindowChangedSomehow();
+ void notifyFormWindowChange();
+
+private:
+ bool isFormWindowModified() const;
+ bool isCodeModified() const;
+ void setFormWindowModified( bool m );
+ void setCodeModified( bool m );
+ QString codeExtension() const;
+ bool checkFileName( bool allowBreak );
+ bool shouldOverwriteUi() const;
+
+private:
+ QString filename;
+ bool fileNameTemp;
+ Project *pro;
+ FormWindow *fw;
+ SourceEditor *ed;
+ QString cod;
+ TimeStamp timeStamp;
+ bool codeEdited;
+ QString cachedFormName;
+ bool fake;
+ bool pkg;
+ bool cm;
+ UihState codeFileStat;
+
+ TimeStamp timeStampUi;
+};
+
+#endif
diff --git a/tools/designer/designer/formsettings.ui b/tools/designer/designer/formsettings.ui
new file mode 100644
index 0000000..a531acd
--- /dev/null
+++ b/tools/designer/designer/formsettings.ui
@@ -0,0 +1,556 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>FormSettingsBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>FormSettingsBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>597</width>
+ <height>458</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form Settings</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Form Settings&lt;/b&gt;&lt;p&gt;Change settings for the form. Settings like &lt;b&gt;Comment&lt;/b&gt; and &lt;b&gt;Author&lt;/b&gt; are for your own use and are not required.&lt;/p&gt;</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QButtonGroup" row="1" column="0">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Pixmaps</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>radioPixmapInline</cstring>
+ </property>
+ <property name="text">
+ <string>Save In&amp;line</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Save pixmaps in the .ui files</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Save Inline&lt;/b&gt;&lt;p&gt;Saves the pixmaps as binary data in the .ui files. Pixmaps saved like this are not shared between forms. We recommend using Project image files instead.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>radioProjectImageFile</cstring>
+ </property>
+ <property name="text">
+ <string>Project &amp;Imagefile</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Use the Project's Image file for pixmaps</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Use the Project's Image file for pixmaps&lt;/b&gt;
+&lt;p&gt;Each project may have a collection of pixmaps. If you use a project, we recommend that you use this option since it shares the images and is the fastest and most efficient way to use pixmaps in your forms.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>editPixmapFunction</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Specify Pixmap-Loader function (only the function's name, no parentheses!)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Specify Pixmap-Loader function&lt;/b&gt;&lt;p&gt;Specify the function which should be used for loading a pixmap in the generated code. &lt;em&gt;Only enter the function's name, with no parentheses.&lt;/em&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>radioPixmapFunction</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;Function:</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Use the given function for pixmaps</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Use a given function for pixmaps&lt;/b&gt;&lt;p&gt;If you choose this option you must define a function in the line edit at the right which will be used in the generated code for loading pixmaps. When choosing a pixmap in &lt;i&gt;Qt Designer&lt;/i&gt; you will be asked to specify the arguments which will be passed to the function in the generated code.&lt;p&gt; This approach makes it possible to use your own icon-loader function for loading pixmaps. &lt;i&gt;Qt Designer&lt;/i&gt; can't preview the correct image if you use your own function.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="title">
+ <string>Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>editClassName</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change class name</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Enter the name of the class that will be created.&lt;/b&gt;&lt;p&gt;&lt;em&gt;classname.h&lt;/em&gt; and &lt;em&gt;classname.cpp&lt;/em&gt; will be generated as C++ output when it is compiled by uic.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>A&amp;uthor:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editAuthor</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>editAuthor</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enter your name</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter your name.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Class &amp;Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editClassName</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Co&amp;mment:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editComment</cstring>
+ </property>
+ </widget>
+ <widget class="QMultiLineEdit" row="1" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>editComment</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter a comment about the form.</string>
+ </property>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="1">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>La&amp;youts</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSpinBox" row="0" column="2">
+ <property name="name">
+ <cstring>spinMargin</cstring>
+ </property>
+ <property name="value">
+ <number>11</number>
+ </property>
+ </widget>
+ <spacer row="0" column="3">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;efault Spacing:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spinSpacing</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>checkLayoutFunctions</cstring>
+ </property>
+ <property name="text">
+ <string>Use Func&amp;tions:</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Use functions to get the margin and spacing</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Use a given function for margin and/or spacing&lt;/b&gt;&lt;p&gt;If you choose this option you must define functions in the line edit below which will be used in the generated code for getting the margin and spacing value. &lt;i&gt;Qt Designer&lt;/i&gt; can't preview the correct margin or spacing if you use your own function. Instead, the default values will be used for preview.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="2">
+ <property name="name">
+ <cstring>spinSpacing</cstring>
+ </property>
+ <property name="value">
+ <number>6</number>
+ </property>
+ </widget>
+ <spacer row="1" column="3">
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>TextLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Default Mar&amp;gin:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spinMargin</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>spaFuLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>S&amp;pacing:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editSpacingFunction</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>marFuLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Ma&amp;rgin:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editMarginFunction</cstring>
+ </property>
+ </widget>
+ <spacer row="2" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ <widget class="QLineEdit" row="4" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>editSpacingFunction</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Specify spacing function (only the function's name, no parentheses!)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Specify spacing function&lt;/b&gt;&lt;p&gt;Specify the function which should be used for getting the spacing in the generated code. &lt;em&gt;Only enter the function's name, with no parentheses.&lt;/em&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>editMarginFunction</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Specify margin function (only the function's name, no parentheses!)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Specify margin function&lt;/b&gt;&lt;p&gt;Specify the function which should be used for getting the margin in the generated code. &lt;em&gt;Only enter the function's name, with no parentheses.&lt;/em&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>FormSettingsBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>FormSettingsBase</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>radioPixmapFunction</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>editPixmapFunction</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkLayoutFunctions</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>editSpacingFunction</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkLayoutFunctions</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>editMarginFunction</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkLayoutFunctions</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>marFuLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkLayoutFunctions</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>spaFuLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>editClassName</tabstop>
+ <tabstop>editComment</tabstop>
+ <tabstop>editAuthor</tabstop>
+ <tabstop>radioPixmapInline</tabstop>
+ <tabstop>radioPixmapFunction</tabstop>
+ <tabstop>editPixmapFunction</tabstop>
+ <tabstop>radioProjectImageFile</tabstop>
+ <tabstop>spinMargin</tabstop>
+ <tabstop>spinSpacing</tabstop>
+ <tabstop>checkLayoutFunctions</tabstop>
+ <tabstop>editMarginFunction</tabstop>
+ <tabstop>editSpacingFunction</tabstop>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+ <tabstop>buttonHelp</tabstop>
+</tabstops>
+<slots>
+ <slot>okClicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/formsettingsimpl.cpp b/tools/designer/designer/formsettingsimpl.cpp
new file mode 100644
index 0000000..fa7c1bd
--- /dev/null
+++ b/tools/designer/designer/formsettingsimpl.cpp
@@ -0,0 +1,125 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "formsettingsimpl.h"
+#include "formwindow.h"
+#include "metadatabase.h"
+#include "command.h"
+#include "asciivalidator.h"
+#include "mainwindow.h"
+#include "project.h"
+
+#include <qmultilineedit.h>
+#include <qpushbutton.h>
+#include <qcombobox.h>
+#include <qradiobutton.h>
+#include <qlineedit.h>
+#include <qspinbox.h>
+#include <qcheckbox.h>
+
+FormSettings::FormSettings( QWidget *parent, FormWindow *fw )
+ : FormSettingsBase( parent, 0, TRUE ), formwindow( fw )
+{
+ connect( buttonHelp, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+ MetaDataBase::MetaInfo info = MetaDataBase::metaInfo( fw );
+ if ( info.classNameChanged && !info.className.isEmpty() )
+ editClassName->setText( info.className );
+ else
+ editClassName->setText( fw->name() );
+ editComment->setText( info.comment );
+ editAuthor->setText( info.author );
+
+ editClassName->setValidator( new AsciiValidator( QString( ":" ), editClassName ) );
+ editPixmapFunction->setValidator( new AsciiValidator( QString( ":" ), editPixmapFunction ) );
+
+ if ( formwindow->savePixmapInline() )
+ radioPixmapInline->setChecked( TRUE );
+ else if ( formwindow->savePixmapInProject() )
+ radioProjectImageFile->setChecked( TRUE );
+ else
+ radioPixmapFunction->setChecked( TRUE );
+ editPixmapFunction->setText( formwindow->pixmapLoaderFunction() );
+ radioProjectImageFile->setEnabled( !fw->project()->isDummy() );
+ spinSpacing->setValue( formwindow->layoutDefaultSpacing() );
+ spinMargin->setValue( formwindow->layoutDefaultMargin() );
+ editSpacingFunction->setValidator( new AsciiValidator( QString( ":" ), editSpacingFunction ) );
+ editMarginFunction->setValidator( new AsciiValidator( QString( ":" ), editMarginFunction ) );
+ checkLayoutFunctions->setChecked( formwindow->hasLayoutFunctions() );
+ editSpacingFunction->setText( formwindow->spacingFunction() );
+ editMarginFunction->setText( formwindow->marginFunction() );
+}
+
+void FormSettings::okClicked()
+{
+ MetaDataBase::MetaInfo info;
+ info.className = editClassName->text();
+ info.classNameChanged = info.className != QString( formwindow->name() );
+ info.comment = editComment->text();
+ info.author = editAuthor->text();
+ MetaDataBase::setMetaInfo( formwindow, info );
+
+ formwindow->commandHistory()->setModified( TRUE );
+
+ if ( formwindow->savePixmapInline() ) {
+ MetaDataBase::clearPixmapArguments( formwindow );
+ MetaDataBase::clearPixmapKeys( formwindow );
+ } else if ( formwindow->savePixmapInProject() ) {
+ MetaDataBase::clearPixmapArguments( formwindow );
+ } else {
+ MetaDataBase::clearPixmapKeys( formwindow );
+ }
+
+ if ( radioPixmapInline->isChecked() ) {
+ formwindow->setSavePixmapInline( TRUE );
+ formwindow->setSavePixmapInProject( FALSE );
+ } else if ( radioProjectImageFile->isChecked() ){
+ formwindow->setSavePixmapInline( FALSE );
+ formwindow->setSavePixmapInProject( TRUE );
+ } else {
+ formwindow->setSavePixmapInline( FALSE );
+ formwindow->setSavePixmapInProject( FALSE );
+ }
+
+ if ( checkLayoutFunctions->isChecked() )
+ formwindow->hasLayoutFunctions( TRUE );
+ else
+ formwindow->hasLayoutFunctions( FALSE );
+
+ formwindow->setPixmapLoaderFunction( editPixmapFunction->text() );
+ formwindow->setLayoutDefaultSpacing( spinSpacing->value() );
+ formwindow->setSpacingFunction( editSpacingFunction->text() );
+ formwindow->setLayoutDefaultMargin( spinMargin->value() );
+ formwindow->setMarginFunction( editMarginFunction->text() );
+
+ accept();
+}
diff --git a/tools/designer/designer/formsettingsimpl.h b/tools/designer/designer/formsettingsimpl.h
new file mode 100644
index 0000000..cdda83c
--- /dev/null
+++ b/tools/designer/designer/formsettingsimpl.h
@@ -0,0 +1,56 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef FORMSETTINGSIMPL_H
+#define FORMSETTINGSIMPL_H
+
+#include "formsettings.h"
+
+class FormWindow;
+
+class FormSettings : public FormSettingsBase
+{
+ Q_OBJECT
+
+public:
+ FormSettings( QWidget *parent, FormWindow *fw );
+
+protected slots:
+ void okClicked();
+
+private:
+ FormWindow *formwindow;
+
+};
+
+#endif
diff --git a/tools/designer/designer/formwindow.cpp b/tools/designer/designer/formwindow.cpp
new file mode 100644
index 0000000..ec620e7
--- /dev/null
+++ b/tools/designer/designer/formwindow.cpp
@@ -0,0 +1,2761 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "formwindow.h"
+#include "defs.h"
+#include "mainwindow.h"
+#include "widgetfactory.h"
+#include "sizehandle.h"
+#include "metadatabase.h"
+#include "resource.h"
+#include "layout.h"
+#include "connectiondialog.h"
+#include <widgetdatabase.h>
+#include "pixmapchooser.h"
+#include "orderindicator.h"
+#include "hierarchyview.h"
+#include "designerappiface.h"
+#include "menubareditor.h"
+#define NO_STATIC_COLORS
+#include "globaldefs.h"
+
+#include <stdlib.h>
+
+#include <qevent.h>
+#include <qpainter.h>
+#include <qpen.h>
+#include <qlabel.h>
+#include <qobjectlist.h>
+#include <qtimer.h>
+#include <qapplication.h>
+#include <qlayout.h>
+#include <qspinbox.h>
+#include <qstatusbar.h>
+#include <qapplication.h>
+#include <qpalette.h>
+#include <qmessagebox.h>
+#include <qpopupmenu.h>
+#include <qsizegrip.h>
+#include <qpushbutton.h>
+#include <qwhatsthis.h>
+#include <qmetaobject.h>
+#include <qtooltip.h>
+#include <qfeatures.h>
+#include <qaccel.h>
+#include <qpixmapcache.h>
+#include <qbitmap.h>
+#include <qsplitter.h>
+
+// FormWindow should be able to work to some limited degree
+// (existance, loading) without a MainWindow. Functions which require
+// a MainWindow in theory should never be called if no MainWindow
+// exists. These macros are used to let us know if that happens anyway
+// and to ensure that we don't crash
+#define CHECK_MAINWINDOW Q_ASSERT( mainWindow() ); if ( !mainWindow() ) return
+#define CHECK_MAINWINDOW_VALUE( v ) Q_ASSERT( mainWindow() ); if ( !mainWindow() ) return v
+
+static void setCursorToAll( const QCursor &c, QWidget *start )
+{
+ start->setCursor( c );
+ QObjectList *l = (QObjectList*)start->children();
+ if ( l ) {
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o->isWidgetType() && !::qt_cast<SizeHandle*>(o) )
+ setCursorToAll( c, ( (QWidget*)o ) );
+ }
+ }
+}
+
+static void restoreCursors( QWidget *start, FormWindow *fw )
+{
+ if ( fw->widgets()->find( start ) )
+ start->setCursor( MetaDataBase::cursor( start ) );
+ else
+ start->setCursor( Qt::ArrowCursor );
+ QObjectList *l = (QObjectList*)start->children();
+ if ( l ) {
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o->isWidgetType() && !::qt_cast<SizeHandle*>(o) )
+ restoreCursors( ( (QWidget*)o ), fw );
+ }
+ }
+}
+
+#if defined(Q_WS_WIN32) // #### needed for the workaround for repaint problem on windows
+#include <qt_windows.h>
+static void flickerfree_update( QWidget *w )
+{
+ InvalidateRect( w->winId(), 0, FALSE );
+}
+#endif
+
+/*!
+ \class FormWindow formwindow.h
+ \brief Editor window for a form
+
+ The FormWindow is the widget which is used as editor for forms. It
+ handles inserting, deleting, moving, resizing, etc. of widgets.
+
+ Normally multiple formwindows are used at the same time in the
+ Designer. So each formwindow has its own undo/redo buffer, etc.
+
+ Also the formwindow has some signals to inform e.g. about selection
+ changes which is interesting for the PropertyEditor.
+
+ For handling the events of the child widgets (moving, etc.) the
+ handleMousePress(), etc. functions are called from the application
+ event filter which is implemented in MainWindow::eventFilter().
+*/
+
+FormWindow::FormWindow( FormFile *f, MainWindow *mw, QWidget *parent, const char *name )
+ : QWidget( parent, name, WDestructiveClose ), mainwindow( mw ),
+ commands( 100 ), pixInline( TRUE ), pixProject( FALSE )
+{
+ ff = f;
+ init();
+ initSlots();
+}
+
+FormWindow::FormWindow( FormFile *f, QWidget *parent, const char *name )
+ : QWidget( parent, name, WDestructiveClose ), mainwindow( 0 ),
+ commands( 100 ), pixInline( TRUE )
+{
+ ff = f;
+ init();
+}
+
+void FormWindow::init()
+{
+ fake = qstrcmp( name(), "qt_fakewindow" ) == 0;
+ MetaDataBase::addEntry( this );
+ ff->setFormWindow( this );
+ iface = 0;
+ proj = 0;
+ propertyWidget = 0;
+ toolFixed = FALSE;
+ checkedSelectionsForMove = FALSE;
+ mContainer = 0;
+ startWidget = endWidget = 0;
+ currTool = POINTER_TOOL;
+ unclippedPainter = 0;
+ widgetPressed = FALSE;
+ drawRubber = FALSE;
+ setFocusPolicy( ClickFocus );
+ sizePreviewLabel = 0;
+ checkSelectionsTimer = new QTimer( this, "checkSelectionsTimer" );
+ connect( checkSelectionsTimer, SIGNAL( timeout() ),
+ this, SLOT( invalidCheckedSelections() ) );
+ updatePropertiesTimer = new QTimer( this );
+ connect( updatePropertiesTimer, SIGNAL( timeout() ),
+ this, SLOT( updatePropertiesTimerDone() ) );
+ showPropertiesTimer = new QTimer( this );
+ connect( showPropertiesTimer, SIGNAL( timeout() ),
+ this, SLOT( showPropertiesTimerDone() ) );
+ selectionChangedTimer = new QTimer( this );
+ connect( selectionChangedTimer, SIGNAL( timeout() ),
+ this, SLOT( selectionChangedTimerDone() ) );
+ windowsRepaintWorkaroundTimer = new QTimer( this );
+ connect( windowsRepaintWorkaroundTimer, SIGNAL( timeout() ),
+ this, SLOT( windowsRepaintWorkaroundTimerTimeout() ) );
+ insertParent = 0;
+ connect( &commands, SIGNAL( undoRedoChanged( bool, bool, const QString &, const QString & ) ),
+ this, SIGNAL( undoRedoChanged( bool, bool, const QString &, const QString & ) ) );
+ propShowBlocked = FALSE;
+
+ setIcon( QPixmap::fromMimeSource( "designer_form.png" ) );
+
+ connect( &commands, SIGNAL( modificationChanged( bool ) ),
+ this, SLOT( modificationChanged( bool ) ) );
+ buffer = 0;
+
+ QWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QFrame" ), this );
+ setMainContainer( w );
+ propertyWidget = w;
+ targetContainer = 0;
+ hadOwnPalette = FALSE;
+
+ defSpacing = BOXLAYOUT_DEFAULT_SPACING;
+ defMargin = BOXLAYOUT_DEFAULT_MARGIN;
+ hasLayoutFunc = FALSE;
+}
+
+void FormWindow::setMainWindow( MainWindow *w )
+{
+ mainwindow = w;
+ MetaDataBase::addEntry( this );
+ initSlots();
+}
+
+void FormWindow::initSlots()
+{
+ if ( isFake() )
+ return;
+ Q_ASSERT( project() || MainWindow::self );
+ if ( !project() && !MainWindow::self )
+ return;
+ Project *p = project() ? project() : MainWindow::self->currProject();
+ if ( p && p->isCpp() ) {
+ QString code = formFile()->code();
+ if ( code.isEmpty() )
+ formFile()->setCode( formFile()->codeComment() );
+ }
+}
+
+FormWindow::~FormWindow()
+{
+ if ( MainWindow::self && MainWindow::self->objectHierarchy()->formWindow() == this )
+ MainWindow::self->objectHierarchy()->setFormWindow( 0, 0 );
+
+ MetaDataBase::clear( this );
+ if ( ff )
+ ff->setFormWindow( 0 );
+ delete iface;
+}
+
+void FormWindow::closeEvent( QCloseEvent *e )
+{
+ QGuardedPtr<FormWindow> that = this;
+ if ( ff->closeEvent() && ( !that || ( mainwindow && mainwindow->unregisterClient( this ) ) ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void FormWindow::paintGrid( QWidget *w, QPaintEvent *e )
+{
+ if ( !mainWindow() || !mainWindow()->showGrid() )
+ return;
+ QPixmap grid;
+ QString grid_name;
+ grid_name.sprintf("FormWindowGrid_%d_%d", mainWindow()->grid().x(), mainWindow()->grid().y());
+ if( !QPixmapCache::find( grid_name, grid ) ) {
+ grid = QPixmap( 350 + ( 350 % mainWindow()->grid().x() ), 350 + ( 350 % mainWindow()->grid().y() ) );
+ grid.fill( colorGroup().color( QColorGroup::Foreground ) );
+ QBitmap mask( grid.width(), grid.height() );
+ mask.fill( color0 );
+ QPainter p( &mask );
+ p.setPen( color1 );
+ for ( int y = 0; y < grid.width(); y += mainWindow()->grid().y()) {
+ for ( int x = 0; x < grid.height(); x += mainWindow()->grid().x() ) {
+ p.drawPoint( x, y );
+ }
+ }
+ grid.setMask( mask );
+ QPixmapCache::insert( grid_name, grid );
+ }
+ QPainter p( w );
+ p.setClipRegion( e->rect() );
+ p.drawTiledPixmap( QRect( 0, 0, width(), height() ), grid );
+}
+
+/*! For operations like drawing a rubber band or drawing the rect
+ when inserting a new widget, a unclipped painter (which draws also
+ on child widgets) is needed. This method does all the initialization.
+*/
+
+void FormWindow::beginUnclippedPainter( bool doNot )
+{
+ endUnclippedPainter();
+ bool unclipped = testWFlags( WPaintUnclipped );
+ setWFlags( WPaintUnclipped );
+ unclippedPainter = new QPainter;
+ unclippedPainter->begin( this );
+ if ( !unclipped )
+ clearWFlags( WPaintUnclipped );
+ if ( doNot ) {
+ unclippedPainter->setPen( QPen( color0, 2 ) );
+ unclippedPainter->setRasterOp( NotROP );
+ }
+}
+
+/*!
+ Gets rid of an open unclipped painter.
+
+ \sa beginUnclippedPainter()
+*/
+
+void FormWindow::endUnclippedPainter()
+{
+ if ( unclippedPainter )
+ unclippedPainter->end();
+ delete unclippedPainter;
+ unclippedPainter = 0;
+}
+
+QPoint FormWindow::gridPoint( const QPoint &p )
+{
+ return QPoint( ( p.x() / grid().x() ) * grid().x(),
+ ( p.y() / grid().y() ) * grid().y() );
+}
+
+void FormWindow::drawSizePreview( const QPoint &pos, const QString& text )
+{
+ unclippedPainter->save();
+ unclippedPainter->setPen( QPen( colorGroup().foreground(), 1 ));
+ unclippedPainter->setRasterOp( CopyROP );
+ if ( !sizePreviewPixmap.isNull() )
+ unclippedPainter->drawPixmap( sizePreviewPos, sizePreviewPixmap );
+ if ( text.isNull() ) {
+ sizePreviewPixmap = QPixmap(); // set null again
+ unclippedPainter->restore();
+ return;
+ }
+ QRect r = fontMetrics().boundingRect( 0, 0, 0, 0, AlignCenter, text );
+ r = QRect( pos + QPoint( 10, 10 ), r.size() + QSize( 5, 5 ) );
+
+ checkPreviewGeometry( r );
+
+ sizePreviewPos = r.topLeft();
+ sizePreviewPixmap = QPixmap::grabWindow( winId(), r.x(), r.y(), r.width(), r.height() );
+ unclippedPainter->setBrush( QColor( 255, 255, 128 ) );
+ unclippedPainter->drawRect( r );
+ unclippedPainter->drawText( r, AlignCenter, text );
+ unclippedPainter->restore();
+}
+
+void FormWindow::insertWidget()
+{
+ CHECK_MAINWINDOW;
+ if ( !insertParent )
+ return;
+
+ if ( currTool == POINTER_TOOL )
+ return;
+
+ bool useSizeHint = !oldRectValid || ( currRect.width() < 2 && currRect.height() < 2 );
+ Orientation orient = Horizontal;
+ QString n = WidgetDatabase::className( currTool );
+ if ( useSizeHint && ( n == "Spacer" || n == "QSlider" || n == "Line" || n == "QScrollBar" ) ) {
+ QPopupMenu m( mainWindow() );
+ m.insertItem( tr( "&Horizontal" ) );
+ int ver = m.insertItem( tr( "&Vertical" ) );
+ int r = m.exec( QCursor::pos() );
+ if ( r == ver )
+ orient = Vertical;
+ }
+
+
+ QWidget *w = WidgetFactory::create( currTool, insertParent, 0, TRUE, &currRect, orient );
+ if ( !w )
+ return;
+
+ if ( !savePixmapInline() && currTool == WidgetDatabase::idFromClassName( "PixmapLabel" ) ) { // ### what to do for pixmaps in project
+ QPixmap pix;
+ // we have to force the pixmap to get a new and unique serial number. Unfortunately detatch() doesn't do that
+ pix.convertFromImage( QPixmap::fromMimeSource( "designer_image.png" ).convertToImage() );
+ ( (QLabel*)w )->setPixmap( pix );
+ }
+ int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf(w) );
+ if ( WidgetDatabase::isCustomWidget( id ) ) {
+ QWhatsThis::add( w, tr("<b>A %1 (custom widget)</b> "
+ "<p>Click <b>Edit Custom Widgets...</b> in the <b>Tools|Custom</b> "
+ "menu to add and change custom widgets. You can add "
+ "properties as well as signals and slots to integrate custom widgets into "
+ "<i>Qt Designer</i>, and provide a pixmap which will be used to represent "
+ "the widget on the form.</p>")
+ .arg(WidgetDatabase::toolTip( id )) );
+ QToolTip::add( w, tr("A %1 (custom widget)").arg(WidgetDatabase::toolTip( id )) );
+ } else {
+ QString tt = WidgetDatabase::toolTip( id );
+ QString wt = WidgetDatabase::whatsThis( id );
+ if ( !wt.isEmpty() && !tt.isEmpty() )
+ QWhatsThis::add( w, QString("<b>A %1</b><p>%2</p>").arg( tt ).arg( wt ) );
+ }
+
+ QString s = w->name();
+ unify( w, s, TRUE );
+ w->setName( s );
+ insertWidget( w );
+ QRect r( currRect );
+ if ( !oldRectValid ||
+ ( currRect.width() < 2 && currRect.height() < 2 ) )
+ r = QRect( rectAnchor, QSize( 0, 0 ) );
+
+ QPoint p = r.topLeft();
+ p = mapToGlobal( p );
+ p = insertParent->mapFromGlobal( p );
+ r = QRect( p, r.size() );
+
+ if ( useSizeHint ) {
+ if ( n == "Spacer" ) {
+ if ( orient == Vertical ) {
+ r.setWidth( 20 );
+ r.setHeight( 40 );
+ } else {
+ r.setWidth( 40 );
+ r.setHeight( 20 );
+ }
+ } else {
+ r.setWidth( w->sizeHint().width() );
+ r.setHeight( w->sizeHint().height() );
+ }
+ }
+
+ if ( r.width() < 2 * grid().x() )
+ r.setWidth( 2 * grid().x() );
+ if ( r.height() < 2 * grid().y() )
+ r.setHeight( 2 * grid().y() );
+
+ const QObjectList *l = insertParent->children();
+ QObjectListIt it( *l );
+ QWidgetList lst;
+ if ( WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( w ) ) ) ) {
+ for ( ; it.current(); ) {
+ QObject *o = it.current();
+ ++it;
+ if ( o->isWidgetType() &&
+ ( (QWidget*)o )->isVisibleTo( this ) &&
+ insertedWidgets.find( (QWidget*)o ) && o != w ) {
+ QRect r2( ( (QWidget*)o )->pos(),
+ ( (QWidget*)o )->size() );
+ if ( r.contains( r2 ) )
+ lst.append( (QWidget*)o );
+ }
+ }
+ }
+
+ if ( !lst.isEmpty() ) {
+ QWidget *pw = WidgetFactory::containerOfWidget( w );
+ if (pw) {
+ QValueList<QPoint> op, np;
+ for ( QWidget *i = lst.first(); i; i = lst.next() ) {
+ op.append( i->pos() );
+ QPoint pos = pw->mapFromGlobal( i->mapToGlobal( QPoint( 0, 0 ) ) );
+ pos -= r.topLeft();
+ np.append( pos );
+ }
+
+ MoveCommand *mv = new MoveCommand( tr( "Reparent Widgets" ), this,
+ lst, op, np, insertParent, pw );
+
+ if ( !toolFixed )
+ mainwindow->resetTool();
+ else
+ setCursorToAll( CrossCursor, w );
+
+ InsertCommand *cmd = new InsertCommand( tr( "Insert %1" ).arg( w->name() ), this, w, r );
+
+ QPtrList<Command> commands;
+ commands.append( mv );
+ commands.append( cmd );
+
+ MacroCommand *mc = new MacroCommand( tr( "Insert %1" ).arg( w->name() ), this, commands );
+ commandHistory()->addCommand( mc );
+ mc->execute();
+ }
+ } else {
+ if ( !toolFixed )
+ mainwindow->resetTool();
+ else
+ setCursorToAll( CrossCursor, w );
+
+ InsertCommand *cmd = new InsertCommand( tr( "Insert %1" ).arg( w->name() ), this, w, r );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+
+ TemplateWizardInterface *iface = mainWindow()->templateWizardInterface( w->className() );
+ if ( iface ) {
+ iface->setup( w->className(), w, iFace(), mainWindow()->designerInterface() );
+ iface->release();
+ }
+}
+
+void FormWindow::insertWidget( QWidget *w, bool checkName )
+{
+ if ( !w )
+ return;
+ if ( checkName ) {
+ QString s = w->name();
+ unify( w, s, TRUE );
+ w->setName( s );
+ }
+
+ MetaDataBase::addEntry( w );
+ int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf(w) );
+ if ( WidgetDatabase::isCustomWidget( id ) ) {
+ QWhatsThis::add( w, tr("<b>A %1 (custom widget)</b> "
+ "<p>Click <b>Edit Custom Widgets...</b> in the <b>Tools|Custom</b> "
+ "menu to add and change custom widgets. You can add "
+ "properties as well as signals and slots to integrate custom widgets into "
+ "<i>Qt Designer</i>, and provide a pixmap which will be used to represent "
+ "the widget on the form.</p>")
+ .arg(WidgetDatabase::toolTip( id )) );
+ QToolTip::add( w, tr("A %1 (custom widget)").arg(WidgetDatabase::toolTip( id )) );
+ } else {
+ QString tt = WidgetDatabase::toolTip( id );
+ QString wt = WidgetDatabase::whatsThis( id );
+ if ( !wt.isEmpty() && !tt.isEmpty() )
+ QWhatsThis::add( w, QString("<b>A %1</b><p>%2</p>").arg( tt ).arg( wt ) );
+ }
+
+ restoreCursors( w, this );
+ widgets()->insert( w, w );
+ w->show();
+}
+
+void FormWindow::removeWidget( QWidget *w )
+{
+ MetaDataBase::removeEntry( w );
+ widgets()->take( w );
+}
+
+void FormWindow::handleContextMenu( QContextMenuEvent *e, QWidget *w )
+{
+ CHECK_MAINWINDOW;
+ switch ( currTool ) {
+ case POINTER_TOOL: {
+ if ( !isMainContainer( w ) && qstrcmp( w->name(), "central widget" ) != 0 ) { // press on a child widget
+ raiseChildSelections( w ); // raise selections and select widget
+ selectWidget( w );
+ // if widget is laid out, find the first non-laid out super-widget
+ QWidget *realWidget = w; // but store the original one
+ while ( w->parentWidget() &&
+ ( WidgetFactory::layoutType( w->parentWidget()) != WidgetFactory::NoLayout ||
+ !insertedWidgets.find(w) ) )
+ w = w->parentWidget();
+ if ( ::qt_cast<QMainWindow*>(mainContainer()) && ((QMainWindow*)mainContainer())->centralWidget() == realWidget ) {
+ e->accept();
+ mainwindow->popupFormWindowMenu( e->globalPos(), this );
+ } else {
+ e->accept();
+ mainwindow->popupWidgetMenu( e->globalPos(), this, realWidget);
+ }
+ } else {
+ e->accept();
+ clearSelection();
+ mainwindow->popupFormWindowMenu( e->globalPos(), this );
+ }
+ break; }
+ default:
+ break;
+ }
+}
+
+void FormWindow::handleMousePress( QMouseEvent *e, QWidget *w )
+{
+ CHECK_MAINWINDOW;
+ checkedSelectionsForMove = FALSE;
+ checkSelectionsTimer->stop();
+ if ( !sizePreviewLabel ) {
+ sizePreviewLabel = new QLabel( this );
+ sizePreviewLabel->hide();
+ sizePreviewLabel->setBackgroundColor( QColor( 255, 255, 128 ) );
+ sizePreviewLabel->setFrameStyle( QFrame::Plain | QFrame::Box );
+ }
+
+ switch ( currTool ) {
+ case POINTER_TOOL:
+ if ( !isMainContainer( w ) && qstrcmp( w->name(), "central widget" ) != 0 ) { // press on a child widget
+ // if the clicked widget is not in a layout, raise it
+ if ( !w->parentWidget() || WidgetFactory::layoutType( w->parentWidget() ) == WidgetFactory::NoLayout )
+ w->raise();
+ if ( ( e->state() & ControlButton ) ) { // with control pressed, always start rubber band selection
+ drawRubber = TRUE;
+ currRect = QRect( 0, 0, -1, -1 );
+ startRectDraw( mapFromGlobal( e->globalPos() ), e->globalPos(), this, Rubber );
+ break;
+ }
+
+ bool sel = isWidgetSelected( w );
+ if ( !( ( e->state() & ControlButton ) || ( e->state() & ShiftButton ) ) ) { // control not pressed...
+ if ( !sel ) { // ...and widget no selectted: unselect all
+ clearSelection( FALSE );
+ } else { // ...widget selected
+ // only if widget has a layout (it is a layout meta widget or a laid out container!), unselect its childs
+ if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout ) {
+ QObjectList *l = w->queryList( "QWidget" );
+ setPropertyShowingBlocked( TRUE );
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( !o->isWidgetType() )
+ continue;
+ if ( insertedWidgets.find( (QWidget*)o ) )
+ selectWidget( (QWidget*)o, FALSE );
+ }
+ setPropertyShowingBlocked( FALSE );
+ delete l;
+ }
+ }
+ qApp->processEvents();
+ }
+ if ( ( ( e->state() & ControlButton ) || ( e->state() & ShiftButton ) ) &&
+ sel && e->button() == LeftButton ) { // control pressed and selected, unselect widget
+ selectWidget( w, FALSE );
+ break;
+ }
+
+ raiseChildSelections( w ); // raise selections and select widget
+ selectWidget( w );
+
+ // if widget is laid out, find the first non-laid out super-widget
+ while ( w->parentWidget() &&
+ ( WidgetFactory::layoutType( w->parentWidget()) != WidgetFactory::NoLayout || !insertedWidgets.find(w) ) )
+ w = w->parentWidget();
+
+ if ( e->button() == LeftButton ) { // left button: store original geometry and more as the widget might start moving
+ widgetPressed = TRUE;
+ widgetGeom = QRect( w->pos(), w->size() );
+ oldPressPos = w->mapFromGlobal( e->globalPos() );
+ origPressPos = oldPressPos;
+ checkedSelectionsForMove = FALSE;
+ moving.clear();
+ if ( w->parentWidget() && !isMainContainer( w->parentWidget() ) && !isCentralWidget( w->parentWidget() ) ) {
+ targetContainer = w->parentWidget();
+ hadOwnPalette = w->parentWidget()->ownPalette();
+ restorePalette = w->parentWidget()->palette();
+ }
+ }
+ } else { // press was on the formwindow
+ if ( e->button() == LeftButton ) { // left button: start rubber selection and show formwindow properties
+ drawRubber = TRUE;
+ if ( !( ( e->state() & ControlButton ) || ( e->state() & ShiftButton ) ) ) {
+ clearSelection( FALSE );
+ QObject *opw = propertyWidget;
+ propertyWidget = mainContainer();
+ if ( opw->isWidgetType() )
+ repaintSelection( (QWidget*)opw );
+ }
+ currRect = QRect( 0, 0, -1, -1 );
+ startRectDraw( mapFromGlobal( e->globalPos() ), e->globalPos(), this, Rubber );
+ }
+ }
+ break;
+ case CONNECT_TOOL:
+ case BUDDY_TOOL:
+ if ( e->button() != LeftButton )
+ break;
+ validForBuddy = FALSE;
+ if ( currTool == BUDDY_TOOL ) {
+ if ( !::qt_cast<QLabel*>(w) )
+ break;
+ clearSelection( FALSE );
+ validForBuddy = TRUE;
+ mainWindow()->statusBar()->message( tr( "Set buddy for '%1' to..." ).arg( w->name() ) );
+ } else {
+ mainWindow()->statusBar()->message( tr( "Connect '%1' with..." ).arg( w->name() ) );
+ }
+ saveBackground();
+ startPos = mapFromGlobal( e->globalPos() );
+ currentPos = startPos;
+ startWidget = designerWidget( w );
+ endWidget = startWidget;
+ beginUnclippedPainter( FALSE );
+ drawConnectionLine();
+ break;
+ case ORDER_TOOL:
+ if ( !isMainContainer( w ) ) { // press on a child widget
+ orderedWidgets.removeRef( w );
+ orderedWidgets.append( w );
+ for ( QWidget *wid = orderedWidgets.last(); wid; wid = orderedWidgets.prev() ) {
+ int i = stackedWidgets.findRef( wid );
+ if ( i != -1 ) {
+ stackedWidgets.removeRef( wid );
+ stackedWidgets.insert( 0, wid );
+ }
+ }
+ QWidgetList oldl = MetaDataBase::tabOrder( this );
+ TabOrderCommand *cmd = new TabOrderCommand( tr( "Change Tab Order" ), this, oldl, stackedWidgets );
+ cmd->execute();
+ commandHistory()->addCommand( cmd, TRUE );
+ updateOrderIndicators();
+ }
+ break;
+ default: // any insert widget tool
+ if ( e->button() == LeftButton ) {
+ insertParent = WidgetFactory::containerOfWidget( mainContainer() ); // default parent for new widget is the formwindow
+ if ( !isMainContainer( w ) ) { // press was not on formwindow, check if we can find another parent
+ QWidget *wid = w;
+ for (;;) {
+ int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( wid ) );
+ if ( ( WidgetDatabase::isContainer( id ) || wid == mainContainer() ) &&
+ !::qt_cast<QLayoutWidget*>(wid) && !::qt_cast<QSplitter*>(wid) ) {
+ insertParent = WidgetFactory::containerOfWidget( wid ); // found another parent, store it
+ break;
+ } else {
+ wid = wid->parentWidget();
+ if ( !wid )
+ break;
+ }
+ }
+ }
+ startRectDraw( w->mapFromGlobal( e->globalPos() ), e->globalPos(), w, Insert );
+ }
+ break;
+ }
+}
+
+void FormWindow::handleMouseDblClick( QMouseEvent *, QWidget *w )
+{
+ CHECK_MAINWINDOW;
+ switch ( currTool ) {
+ case ORDER_TOOL:
+ if ( !isMainContainer( w ) ) { // press on a child widget
+ orderedWidgets.clear();
+ orderedWidgets.append( w );
+ for ( QWidget *wid = orderedWidgets.last(); wid; wid = orderedWidgets.prev() ) {
+ int i = stackedWidgets.findRef( wid );
+ if ( i != -1 ) {
+ stackedWidgets.removeRef( wid );
+ stackedWidgets.insert( 0, wid );
+ }
+ }
+ QWidgetList oldl = MetaDataBase::tabOrder( this );
+ TabOrderCommand *cmd = new TabOrderCommand( tr( "Change Tab Order" ), this, oldl, stackedWidgets );
+ cmd->execute();
+ commandHistory()->addCommand( cmd, TRUE );
+ updateOrderIndicators();
+ }
+ default:
+ if ( !WidgetFactory::isPassiveInteractor( w ) &&
+ ( isMainContainer( w ) || w == this ) )
+ mainWindow()->editSource();
+ break;
+ }
+}
+
+void FormWindow::handleMouseMove( QMouseEvent *e, QWidget *w )
+{
+ CHECK_MAINWINDOW;
+ if ( ( e->state() & LeftButton ) != LeftButton )
+ return;
+
+ QWidget *newendWidget = endWidget, *oldendWidget = endWidget, *wid;
+ bool drawRecRect;
+ switch ( currTool ) {
+ case POINTER_TOOL:
+ if ( widgetPressed && allowMove( w ) ) { // we are prepated for a move
+
+ // if widget is laid out, find the first non-laid out super-widget
+ while ( w->parentWidget() &&
+ ( WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout || !insertedWidgets.find(w ) ) )
+ w = w->parentWidget();
+
+ // calc correct position
+ QPoint pos = w->mapFromGlobal( e->globalPos() );
+
+#if 0
+ QPoint mpos = w->mapToParent( pos );
+ // check if we are not outside the visible area, else correct coords
+ if ( mpos.x() < 0 )
+ pos.setX( w->mapFromParent( QPoint( 0, mpos.y() ) ).x() );
+ if ( mpos.y() < 0 )
+ pos.setY( w->mapFromParent( QPoint( mpos.x(), 0 ) ).y() );
+ if ( mpos.x() > w->parentWidget()->width() )
+ pos.setX( w->mapFromParent( QPoint( w->parentWidget()->width(), mpos.y() ) ).x() );
+ if ( mpos.y() > w->parentWidget()->height() )
+ pos.setY( w->mapFromParent( QPoint( mpos.x(), w->parentWidget()->height() ) ).y() );
+#endif
+
+ // calc move distance and store it
+ QPoint d = oldPressPos - pos;
+ if ( QABS( d.x() ) < grid().x() )
+ d.setX( 0 );
+ if ( QABS( d.y() ) < grid().y() )
+ d.setY( 0 );
+ if ( d.x() == 0 )
+ pos.setX( oldPressPos.x() );
+ if ( d.y() == 0 )
+ pos.setY( oldPressPos.y() );
+ oldPressPos = pos;
+
+ // snap to grid
+ int x = widgetGeom.x() - d.x();
+ widgetGeom.setX( x );
+ x = ( x / grid().x() ) * grid().x();
+ int y = widgetGeom.y() - d.y();
+ widgetGeom.setY( y );
+ y = ( y / grid().y() ) * grid().y();
+ QPoint p = w->pos();
+
+ if ( x - p.x() != 0 || y - p.y() != 0 ) { // if we actually have to move
+ if ( !checkedSelectionsForMove ) { // if not checked yet, check if the correct widget are selected...
+ if ( !isWidgetSelected( w ) ) { // and unselect others. Only siblings can be moved at the same time
+ setPropertyShowingBlocked( TRUE );
+ selectWidget( w );
+ setPropertyShowingBlocked( FALSE );
+ }
+ checkSelectionsForMove( w );
+ }
+
+ // check whether we would have to reparent the selection and highlight the possible new parent container
+ QMapConstIterator<QWidget*, QPoint> it = moving.begin();
+ QWidget* wa = containerAt( e->globalPos(), it.key() );
+ if ( wa && !isMainContainer( wa ) && !isCentralWidget( wa ) ) {
+ wa = WidgetFactory::containerOfWidget( wa );
+ // ok, looks like we moved onto a container
+
+ if ( wa != targetContainer ) {
+ if ( targetContainer ) {
+ if ( hadOwnPalette )
+ targetContainer->setPalette( restorePalette );
+ else
+ targetContainer->unsetPalette();
+ }
+ targetContainer = wa;
+ hadOwnPalette = wa->ownPalette();
+ restorePalette = wa->palette();
+ wa->setPaletteBackgroundColor( wa->colorGroup().midlight() );
+ }
+ }
+ else if ( targetContainer ) {
+ if( hadOwnPalette )
+ targetContainer->setPalette( restorePalette );
+ else
+ targetContainer->unsetPalette();
+ targetContainer = 0;
+ }
+
+ // finally move the selected widgets and show/update preview label
+ moveSelectedWidgets( x - p.x(), y - p.y() );
+ sizePreviewLabel->setText( tr( "%1/%2" ).arg( w->pos().x() ).arg( w->pos().y() ) );
+ sizePreviewLabel->adjustSize();
+ QRect lg( mapFromGlobal( e->globalPos() ) + QPoint( 16, 16 ), sizePreviewLabel->size() );
+ checkPreviewGeometry( lg );
+ sizePreviewLabel->setGeometry( lg );
+ sizePreviewLabel->raise();
+ sizePreviewLabel->show();
+#if defined(Q_WS_WIN32)
+ windowsRepaintWorkaroundTimer->start( 100, TRUE );
+#endif
+ } else { // if we don't need to move, do some indication
+ QRect lg( mapFromGlobal( e->globalPos() ) + QPoint( 16, 16 ), sizePreviewLabel->size() );
+ checkPreviewGeometry( lg );
+ sizePreviewLabel->move( lg.x(), lg.y() );
+ }
+
+ oldPressPos += ( p - w->pos() );
+ } else if ( drawRubber ) { // draw rubber if we are in rubber-selection mode
+ continueRectDraw( mapFromGlobal( e->globalPos() ), e->globalPos(), this, Rubber );
+ }
+ break;
+ case CONNECT_TOOL:
+ restoreConnectionLine();
+ wid = qApp->widgetAt( e->globalPos(), TRUE );
+ if ( wid )
+ wid = designerWidget( wid );
+ if ( wid && ( isMainContainer( wid ) || insertedWidgets.find( wid ) ) && wid->isVisibleTo( this ) )
+ newendWidget = wid;
+ if ( ::qt_cast<QLayoutWidget*>(newendWidget) || ::qt_cast<Spacer*>(newendWidget) )
+ newendWidget = (QWidget*)endWidget;
+ drawRecRect = newendWidget != endWidget;
+ if ( newendWidget &&
+ ( isMainContainer( newendWidget ) || insertedWidgets.find( newendWidget ) ) && !isCentralWidget( newendWidget ) )
+ endWidget = newendWidget;
+ mainWindow()->statusBar()->message( tr( "Connect '%1' to '%2'" ).arg( startWidget->name() ).
+ arg( endWidget->name() ) );
+ currentPos = mapFromGlobal( e->globalPos() );
+ qApp->processEvents();
+ if ( drawRecRect )
+ restoreRect( QRect( mapToForm( ( (QWidget*)oldendWidget )->parentWidget(), ( (QWidget*)oldendWidget )->pos() ),
+ ( (QWidget*)oldendWidget )->size() ) );
+ drawConnectionLine();
+ break;
+ case BUDDY_TOOL:
+ if ( !validForBuddy )
+ break;
+ restoreConnectionLine();
+ wid = qApp->widgetAt( e->globalPos(), TRUE );
+ if ( wid )
+ wid = designerWidget( wid );
+ if ( wid && canBeBuddy( wid ) && wid->isVisibleTo( this ) )
+ newendWidget = wid;
+ else
+ newendWidget = 0;
+ if ( ::qt_cast<QLayoutWidget*>(newendWidget) || ::qt_cast<Spacer*>(newendWidget) )
+ newendWidget = (QWidget*)endWidget;
+ drawRecRect = newendWidget != endWidget;
+ if ( !newendWidget )
+ endWidget = newendWidget;
+ else if ( insertedWidgets.find( newendWidget ) && !isCentralWidget( newendWidget ) )
+ endWidget = newendWidget;
+ if ( endWidget )
+ mainWindow()->statusBar()->message( tr( "Set buddy '%1' to '%2'" ).arg( startWidget->name() ).
+ arg( endWidget->name() ) );
+ else
+ mainWindow()->statusBar()->message( tr( "Set buddy '%1' to ..." ).arg( startWidget->name() ) );
+ currentPos = mapFromGlobal( e->globalPos() );
+ qApp->processEvents();
+ if ( drawRecRect && oldendWidget )
+ restoreRect( QRect( mapToForm( ( (QWidget*)oldendWidget )->parentWidget(), ( (QWidget*)oldendWidget )->pos() ),
+ ( (QWidget*)oldendWidget )->size() ) );
+ drawConnectionLine();
+ break;
+ case ORDER_TOOL:
+ break;
+ default: // we are in an insert-widget tool
+ if ( insertParent ) // draw insert rect
+ continueRectDraw( w->mapFromGlobal( e->globalPos() ), e->globalPos(), w, Insert );
+ break;
+ }
+}
+
+void FormWindow::handleMouseRelease( QMouseEvent *e, QWidget *w )
+{
+ CHECK_MAINWINDOW;
+ if ( e->button() != LeftButton )
+ return;
+
+ switch ( currTool ) {
+ case POINTER_TOOL:
+ if ( widgetPressed && allowMove( w ) ) { // we moved the widget
+ sizePreviewLabel->hide();
+
+ if ( moving.isEmpty() || w->pos() == *moving.find(w) )
+ break;
+
+ // restore targetContainer
+ if ( targetContainer ) {
+ if( hadOwnPalette )
+ targetContainer->setPalette( restorePalette );
+ else
+ targetContainer->unsetPalette();
+ }
+
+ // tell property editor to update
+ if ( propertyWidget && propertyWidget->isWidgetType() && !isMainContainer( propertyWidget ) )
+ emitUpdateProperties( propertyWidget );
+
+ QMapConstIterator<QWidget*,QPoint> it = moving.begin();
+ QWidget *oldParent = it.key()->parentWidget();
+ QWidget *newParent = oldParent;
+ // check whether we have to reparent the selection
+ QWidget* wa = containerAt( e->globalPos(), it.key() );
+ if ( wa ) {
+ wa = WidgetFactory::containerOfWidget( wa );
+ // ok, looks like we moved onto a container
+
+ // check whether we really have different parents.
+ if ( wa == it.key()->parentWidget() )
+ goto make_move_command;
+
+ // break layout if necessary
+ if ( WidgetFactory::layoutType( wa ) != WidgetFactory::NoLayout ) {
+ if ( QMessageBox::information( mainWindow(), tr( "Inserting a Widget" ),
+ tr( "You tried to insert a widget into the "
+ "layout Container Widget '%1'.\n"
+ "This is not possible. "
+ "In order to insert the widget, the layout of '%1'\n"
+ "must first be broken.\n"
+ "Break the layout or cancel the operation?" ).
+ arg( wa->name() ).
+ arg( wa->name() ), tr( "&Break Layout" ), tr( "&Cancel" ) ) )
+ goto make_move_command; // cancel
+ breakLayout( wa );
+ }
+
+ // doesn't need to be a command, the MoveCommand does reparenting too
+ bool emitSelChanged = FALSE;
+ for ( QMap<QWidget*, QPoint>::Iterator it = moving.begin(); it != moving.end(); ++it ) {
+ QWidget *i = it.key();
+ if ( !emitSelChanged && ::qt_cast<QButton*>(i) ) {
+ if ( ::qt_cast<QButtonGroup*>(i->parentWidget()) || ::qt_cast<QButtonGroup*>(wa) )
+ emitSelChanged = TRUE;
+ if ( !::qt_cast<QButtonGroup*>(wa) ) {
+ MetaDataBase::setPropertyChanged( i, "buttonGroupId", FALSE );
+ if ( ::qt_cast<QButtonGroup*>(i->parentWidget()) )
+ ( (QButtonGroup*)i->parentWidget() )->remove( (QButton*)i );
+ }
+ }
+ QPoint pos = wa->mapFromGlobal( i->mapToGlobal( QPoint(0,0) ) );
+ i->reparent( wa, pos, TRUE );
+ raiseSelection( i );
+ raiseChildSelections( i );
+ widgetChanged( i );
+ mainWindow()->objectHierarchy()->widgetRemoved( i );
+ mainWindow()->objectHierarchy()->widgetInserted( i );
+ }
+ if ( emitSelChanged ) {
+ emit showProperties( wa );
+ emit showProperties( propertyWidget );
+ }
+ newParent = wa;
+ }
+
+ make_move_command:
+ QWidgetList widgets; // collect the widgets and its old and new positions which have been moved
+ QValueList<QPoint> oldPos, newPos;
+ for ( it = moving.begin(); it != moving.end(); ++it ) {
+ widgets.append( it.key() );
+ oldPos.append( *it );
+ newPos.append( it.key()->pos() );
+ }
+ // add move command, don't execute it, this is just a summary of the operations we did during the move-event handling
+ commandHistory()->addCommand( new MoveCommand( tr( "Move" ),
+ this, widgets,
+ oldPos, newPos, oldParent, newParent ) );
+ } else if ( drawRubber ) { // we were drawing a rubber selection
+ endRectDraw(); // get rid of the rectangle
+ blockSignals( TRUE );
+ selectWidgets(); // select widgets which intersect the rect
+ blockSignals( FALSE );
+ emitSelectionChanged(); // inform about selection changes
+ if ( propertyWidget )
+ emitShowProperties( propertyWidget );
+ }
+ break;
+ case CONNECT_TOOL:
+ case BUDDY_TOOL:
+ restoreConnectionLine();
+ if ( startWidget )
+ restoreRect( QRect( mapToForm( ( (QWidget*)startWidget )->parentWidget(),
+ ( (QWidget*)startWidget )->pos() ),
+ ((QWidget*)startWidget )->size() ) );
+ if ( endWidget )
+ restoreRect( QRect( mapToForm( ( (QWidget*)endWidget )->parentWidget(),
+ ( (QWidget*)endWidget )->pos() ),
+ ( (QWidget*)endWidget )->size() ) );
+ endUnclippedPainter();
+ qApp->processEvents();
+
+ if ( startWidget && endWidget ) {
+ if ( currTool == CONNECT_TOOL )
+ editConnections();
+ else if ( currTool == BUDDY_TOOL && validForBuddy && startWidget != endWidget ) {
+ QString oldBuddy = startWidget->property( "buddy" ).toString();
+ if ( oldBuddy.isNull() )
+ oldBuddy = "";
+ SetPropertyCommand *cmd = new SetPropertyCommand( tr( "Set buddy for " + QString( startWidget->name() ) ),
+ this, startWidget, mainWindow()->propertyeditor(),
+ "buddy", startWidget->property( "buddy" ),
+ endWidget->name(), endWidget->name(),
+ oldBuddy );
+ commandHistory()->addCommand( cmd, TRUE );
+ cmd->execute();
+ emitUpdateProperties( startWidget );
+ }
+ }
+ if ( !toolFixed )
+ mainwindow->resetTool();
+ startWidget = endWidget = 0;
+ mainWindow()->statusBar()->clear();
+ break;
+ case ORDER_TOOL:
+ break;
+ default: // any insert widget tool is active
+ if ( insertParent ) { // we should insert the new widget now
+ endRectDraw();
+ if ( WidgetFactory::layoutType( insertParent ) != WidgetFactory::NoLayout ) {
+ if ( QMessageBox::information( mainWindow(), tr( "Inserting a Widget" ),
+ tr( "You tried to insert a widget into the "
+ "layout Container Widget '%1'.\n"
+ "This is not possible. "
+ "In order to insert the widget, the layout of '%1'\n"
+ "must first be broken.\n"
+ "Break the layout or cancel the operation?" ).
+ arg( insertParent->name() ).
+ arg( insertParent->name() ), tr( "&Break Layout" ), tr( "&Cancel" ) ) == 0 ) {
+ breakLayout( insertParent );
+ } else {
+ if ( !toolFixed )
+ mainWindow()->resetTool();
+ break;
+ }
+ }
+ insertWidget(); // so do it
+ }
+ break;
+ }
+ widgetPressed = FALSE;
+ drawRubber = FALSE;
+ insertParent = 0;
+ delete buffer;
+ buffer = 0;
+}
+
+void FormWindow::handleKeyPress( QKeyEvent *e, QWidget *w )
+{
+ CHECK_MAINWINDOW;
+ e->ignore();
+ checkSelectionsTimer->stop();
+ if ( !checkedSelectionsForMove &&
+ ( e->key() == Key_Left ||
+ e->key() == Key_Right ||
+ e->key() == Key_Up ||
+ e->key() == Key_Down ) &&
+ propertyWidget->isWidgetType() )
+ checkSelectionsForMove( (QWidget*)propertyWidget );
+ checkSelectionsTimer->start( 1000, TRUE );
+ if ( e->key() == Key_Left || e->key() == Key_Right ||
+ e->key() == Key_Up || e->key() == Key_Down ) {
+ QWidgetList widgets;
+ QValueList<QPoint> oldPos, newPos;
+ for ( WidgetSelection *s = selections.first(); s; s = selections.next() ) {
+ if ( s->isUsed() ) {
+ int dx = 0, dy = 0;
+ bool control = e->state() & ControlButton;
+
+ switch ( e->key() ) {
+ case Key_Left: {
+ e->accept();
+ if ( control )
+ dx = -1;
+ else
+ dx = -grid().x();
+ } break;
+ case Key_Right: {
+ e->accept();
+ if ( control )
+ dx = 1;
+ else
+ dx = grid().x();
+ } break;
+ case Key_Up: {
+ e->accept();
+ if ( control )
+ dy = -1;
+ else
+ dy = -grid().y();
+ } break;
+ case Key_Down: {
+ e->accept();
+ if ( control )
+ dy = 1;
+ else
+ dy = grid().y();
+ } break;
+ default:
+ break;
+ }
+
+ widgets.append( s->widget() );
+ oldPos.append( s->widget()->pos() );
+ newPos.append( s->widget()->pos() + QPoint( dx, dy ) );
+ }
+ }
+ if ( !widgets.isEmpty() ) {
+ MoveCommand *cmd = new MoveCommand( tr( "Move" ), this,
+ widgets, oldPos, newPos, 0, 0 );
+ commandHistory()->addCommand( cmd, TRUE );
+ cmd->execute();
+ }
+ }
+ if ( !e->isAccepted() ) {
+ QObjectList *l = queryList( "QWidget" );
+ if ( !l )
+ return;
+ if ( l->find( w ) != -1 )
+ e->accept();
+ delete l;
+ }
+
+}
+
+void FormWindow::handleKeyRelease( QKeyEvent *e, QWidget * )
+{
+ e->ignore();
+}
+
+void FormWindow::selectWidget( QObject *o, bool select )
+{
+ CHECK_MAINWINDOW;
+ if ( !o->isWidgetType() ) {
+ // ########### do QObject stuff
+ return;
+ }
+
+ QWidget *w = (QWidget*)o;
+
+ if ( isMainContainer( w ) ) {
+ QObject *opw = propertyWidget;
+ propertyWidget = mainContainer();
+ if ( opw->isWidgetType() )
+ repaintSelection( (QWidget*)opw );
+ emitShowProperties( propertyWidget );
+ return;
+ }
+
+ if ( ::qt_cast<QMainWindow*>(mainContainer()) && w == ( (QMainWindow*)mainContainer() )->centralWidget() ) {
+ QObject *opw = propertyWidget;
+ propertyWidget = mainContainer();
+ if ( opw->isWidgetType() )
+ repaintSelection( (QWidget*)opw );
+ emitShowProperties( propertyWidget );
+ return;
+ }
+
+ if ( ::qt_cast<QDesignerToolBar*>(o) )
+ return;
+
+ if ( select ) {
+ QObject *opw = propertyWidget;
+ propertyWidget = w;
+ if ( opw->isWidgetType() )
+ repaintSelection( (QWidget*)opw );
+ if ( !isPropertyShowingBlocked() )
+ emitShowProperties( propertyWidget );
+ WidgetSelection *s = usedSelections.find( w );
+ if ( s ) {
+ s->show();
+ return;
+ }
+
+ for ( WidgetSelection *s2 = selections.first(); s2; s2 = selections.next() ) {
+ if ( !s2->isUsed() ) {
+ s = s2;
+ }
+ }
+
+ if ( !s ) {
+ s = new WidgetSelection( this, &usedSelections );
+ selections.append( s );
+ }
+
+ s->setWidget( w );
+ emitSelectionChanged();
+ } else {
+ WidgetSelection *s = usedSelections.find( w );
+ if ( s )
+ s->setWidget( 0 );
+ QObject *opw = propertyWidget;
+ if ( !usedSelections.isEmpty() )
+ propertyWidget = QPtrDictIterator<WidgetSelection>( usedSelections ).current()->widget();
+ else
+ propertyWidget = mainContainer();
+ if ( opw->isWidgetType() )
+ repaintSelection( (QWidget*)opw );
+ if ( !isPropertyShowingBlocked() )
+ emitShowProperties( propertyWidget );
+ emitSelectionChanged();
+ }
+}
+
+QPoint FormWindow::grid() const
+{
+ if ( !mainWindow() || !mainWindow()->snapGrid() )
+ return QPoint( 1, 1 );
+ return mainWindow()->grid();
+}
+
+void FormWindow::updateSelection( QWidget *w )
+{
+ WidgetSelection *s = usedSelections.find( w );
+ if ( !w->isVisibleTo( this ) )
+ selectWidget( w, FALSE );
+ else if ( s )
+ s->updateGeometry();
+}
+
+void FormWindow::raiseSelection( QWidget *w )
+{
+ WidgetSelection *s = usedSelections.find( w );
+ if ( s )
+ s->show();
+}
+
+void FormWindow::repaintSelection( QWidget *w )
+{
+ WidgetSelection *s = usedSelections.find( w );
+ if ( s )
+ s->update();
+}
+
+void FormWindow::clearSelection( bool changePropertyDisplay )
+{
+ QPtrDictIterator<WidgetSelection> it( usedSelections );
+ for ( ; it.current(); ++it )
+ it.current()->setWidget( 0, FALSE );
+
+ usedSelections.clear();
+ if ( changePropertyDisplay ) {
+ QObject *opw = propertyWidget;
+ propertyWidget = mainContainer();
+ if ( opw->isWidgetType() )
+ repaintSelection( (QWidget*)opw );
+ emitShowProperties( propertyWidget );
+ }
+ emitSelectionChanged();
+}
+
+void FormWindow::startRectDraw( const QPoint &p, const QPoint &global, QWidget *, RectType t )
+{
+ QPoint pos( p );
+ pos = mapFromGlobal( global );
+ oldRectValid = FALSE;
+ beginUnclippedPainter( TRUE );
+ if ( t == Rubber )
+ unclippedPainter->setPen( QPen( color0, 1 ) );
+ if ( t == Insert )
+ rectAnchor = gridPoint( pos );
+ else if ( t == Rubber )
+ rectAnchor = pos;
+ currRect = QRect( rectAnchor, QPoint( 0, 0 ) );
+ if ( t == Insert )
+ drawSizePreview( pos, tr("Use Size Hint") );
+}
+
+void FormWindow::continueRectDraw( const QPoint &p, const QPoint &global, QWidget *, RectType t )
+{
+ QPoint pos =p;
+ pos = mapFromGlobal( global );
+ QPoint p2;
+ if ( t == Insert )
+ p2 = gridPoint( pos );
+ else if ( t == Rubber )
+ p2 = pos;
+ QRect r( rectAnchor, p2 );
+ r = r.normalize();
+
+ if ( currRect == r ) {
+ QString t = tr( "%1/%2" );
+ t = t.arg( r.width() - 1 ).arg( r.height() - 1 );
+ drawSizePreview( pos, t );
+ return;
+ }
+
+ if ( oldRectValid )
+ unclippedPainter->drawRect( currRect );
+ if ( r.width() > 1 || r.height() > 1 ) {
+ oldRectValid = TRUE;
+ currRect = r;
+ if ( t == Insert ) {
+ QString t = tr( "%1/%2" );
+ t = t.arg( r.width() - 1 ).arg( r.height() - 1 );
+ drawSizePreview( pos, t );
+ }
+ unclippedPainter->setClipRegion( QRegion( rect() ).subtract( QRect( sizePreviewPos, sizePreviewPixmap.size() ) ) );
+ unclippedPainter->drawRect( currRect );
+ unclippedPainter->setClipping( FALSE );
+ } else {
+ oldRectValid = FALSE;
+ if ( t == Insert )
+ drawSizePreview( pos, tr("Use Size Hint") );
+ }
+}
+
+void FormWindow::endRectDraw()
+{
+ if ( !unclippedPainter )
+ return;
+
+ if ( oldRectValid )
+ unclippedPainter->drawRect( currRect );
+ drawSizePreview( QPoint(-1,-1), QString::null );
+ endUnclippedPainter();
+}
+
+void FormWindow::selectWidgets()
+{
+ QObjectList *l = mainContainer()->queryList( "QWidget" );
+ if ( l ) {
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( ( (QWidget*)o )->isVisibleTo( this ) &&
+ insertedWidgets[ (void*)o ] ) {
+ QPoint p = ( (QWidget*)o )->mapToGlobal( QPoint(0,0) );
+ p = mapFromGlobal( p );
+ QRect r( p, ( (QWidget*)o )->size() );
+ if ( r.intersects( currRect ) && !r.contains( currRect ) )
+ selectWidget( (QWidget*)o );
+ }
+ }
+ delete l;
+ }
+ emitSelectionChanged();
+}
+
+bool FormWindow::isWidgetSelected( QObject *w )
+{
+ if ( w->isWidgetType() )
+ return usedSelections.find( (QWidget*)w ) != 0;
+ return FALSE; // #### do stuff for QObjects
+}
+
+void FormWindow::moveSelectedWidgets( int dx, int dy )
+{
+ QPtrDictIterator<WidgetSelection> it( usedSelections );
+ for ( ; it.current(); ++it ) {
+ WidgetSelection *s = it.current();
+ QWidget *w = s->widget();
+ if ( w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout )
+ continue;
+ w->move( w->x() + dx, w->y() + dy );
+ s->updateGeometry();
+ updateChildSelections( w );
+ }
+}
+
+CommandHistory *FormWindow::commandHistory()
+{
+ return &commands;
+}
+
+void FormWindow::undo()
+{
+ commandHistory()->undo();
+}
+
+void FormWindow::redo()
+{
+ commandHistory()->redo();
+}
+
+void FormWindow::raiseChildSelections( QWidget *w )
+{
+ QObjectList *l = w->queryList( "QWidget" );
+ if ( !l || !l->first() ) {
+ delete l;
+ return;
+ }
+
+ QPtrDictIterator<WidgetSelection> it( usedSelections );
+ for ( ; it.current(); ++it ) {
+ if ( l->findRef( it.current()->widget() ) != -1 )
+ it.current()->show();
+ }
+ delete l;
+}
+
+void FormWindow::updateChildSelections( QWidget *w )
+{
+ QObjectList *l = w->queryList( "QWidget" );
+ if ( l ) {
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o->isWidgetType() &&
+ insertedWidgets.find( (QWidget*)o ) )
+ updateSelection( (QWidget*)o );
+ }
+ delete l;
+ }
+}
+
+void FormWindow::checkSelectionsForMove( QWidget *w )
+{
+ checkedSelectionsForMove = TRUE;
+
+ QObjectList *l = w->parentWidget()->queryList( "QWidget", 0, FALSE, FALSE );
+ moving.clear();
+ if ( l ) {
+ QPtrDictIterator<WidgetSelection> it( usedSelections );
+ WidgetSelection *sel;
+ while ( ( sel = it.current() ) != 0 ) {
+ if ( it.current()->widget() == mainContainer() )
+ continue;
+ ++it;
+ if ( l->find( sel->widget() ) == -1 ) {
+ if ( WidgetFactory::layoutType( w ) == WidgetFactory::NoLayout )
+ sel->setWidget( 0 );
+ } else {
+ if ( WidgetFactory::layoutType( sel->widget()->parentWidget() ) == WidgetFactory::NoLayout ) {
+ moving.insert( sel->widget(), sel->widget()->pos() );
+ sel->widget()->raise();
+ raiseChildSelections( sel->widget() );
+ raiseSelection( sel->widget() );
+ }
+ }
+ }
+ delete l;
+ }
+}
+
+void FormWindow::deleteWidgets()
+{
+ CHECK_MAINWINDOW;
+ QWidgetList widgets;
+ QPtrDictIterator<WidgetSelection> it( usedSelections );
+ for ( ; it.current(); ++it ) {
+ QWidget *tb = 0;
+ if ( !( tb = mainWindow()->isAToolBarChild( it.current()->widget() ) ) )
+ widgets.append( it.current()->widget() );
+ else
+ ( (QDesignerToolBar*)tb )->removeWidget( it.current()->widget() );
+ }
+
+ if ( widgets.isEmpty() )
+ return;
+
+ DeleteCommand *cmd = new DeleteCommand( tr( "Delete" ), this, widgets );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void FormWindow::editAdjustSize()
+{
+ QPtrList<Command> commands;
+ QWidgetList widgets = selectedWidgets();
+ if ( widgets.isEmpty() ) {
+ QRect oldr = geometry();
+ mainContainer()->adjustSize();
+ resize( mainContainer()->size() );
+ // check whether our own size constraint hit us
+ if ( size() != mainContainer()->size() )
+ mainContainer()->resize( size() );
+ QRect nr = geometry();
+ if ( oldr != nr ) {
+ ResizeCommand *cmd = new ResizeCommand( tr( "Adjust Size" ), this, this, oldr, nr );
+ commandHistory()->addCommand( cmd );
+ }
+ return;
+ }
+ for ( QWidget* w = widgets.first(); w; w = widgets.next() ) {
+ if ( w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout )
+ continue;
+ QRect oldr = w->geometry();
+ w->adjustSize();
+ QRect nr = w->geometry();
+ if ( oldr != nr )
+ commands.append( new ResizeCommand( tr("Adjust Size"), this, w, oldr, nr ) );
+ }
+
+ if ( commands.isEmpty() )
+ return;
+ for ( WidgetSelection *s = selections.first(); s; s = selections.next() )
+ s->updateGeometry();
+
+ MacroCommand *cmd = new MacroCommand( tr( "Adjust Size" ), this, commands );
+ commandHistory()->addCommand( cmd );
+}
+
+
+QWidgetList FormWindow::selectedWidgets() const
+{
+ QWidgetList widgets;
+ QPtrDictIterator<WidgetSelection> it( usedSelections );
+ for ( ; it.current(); ++it )
+ widgets.append( it.current()->widget() );
+ return widgets;
+}
+
+void FormWindow::widgetChanged( QObject *w )
+{
+ if ( w->isWidgetType() )
+ updateSelection( (QWidget*)w );
+ // ########## do QObject stuff
+}
+
+QLabel *FormWindow::sizePreview() const
+{
+ if ( !sizePreviewLabel ) {
+ ( (FormWindow*)this )->sizePreviewLabel = new QLabel( (FormWindow*)this );
+ ( (FormWindow*)this )->sizePreviewLabel->hide();
+ ( (FormWindow*)this )->sizePreviewLabel->setBackgroundColor( QColor( 255, 255, 128 ) );
+ ( (FormWindow*)this )->sizePreviewLabel->setFrameStyle( QFrame::Plain | QFrame::Box );
+ }
+ return sizePreviewLabel;
+}
+
+void FormWindow::invalidCheckedSelections()
+{
+ checkedSelectionsForMove = FALSE;
+}
+
+void FormWindow::checkPreviewGeometry( QRect &r )
+{
+ if ( !rect().contains( r ) ) {
+ if ( r.left() < rect().left() )
+ r.moveTopLeft( QPoint( 0, r.top() ) );
+ if ( r.right() > rect().right() )
+ r.moveBottomRight( QPoint( rect().right(), r.bottom() ) );
+ if ( r.top() < rect().top() )
+ r.moveTopLeft( QPoint( r.left(), rect().top() ) );
+ if ( r.bottom() > rect().bottom() )
+ r.moveBottomRight( QPoint( r.right(), rect().bottom() ) );
+ }
+}
+
+void FormWindow::focusInEvent( QFocusEvent * ){
+
+ if (ff)
+ ff->checkTimeStamp();
+}
+
+void FormWindow::focusOutEvent( QFocusEvent * )
+{
+ if ( propertyWidget && !isMainContainer( propertyWidget ) && !isWidgetSelected( propertyWidget ) ) {
+ QObject *opw = propertyWidget;
+ propertyWidget = mainContainer();
+ if ( opw->isWidgetType() )
+ repaintSelection( (QWidget*)opw );
+ }
+}
+
+void FormWindow::resizeEvent( QResizeEvent *e )
+{
+ QWidget::resizeEvent( e );
+ if ( currTool == ORDER_TOOL )
+ repositionOrderIndicators();
+ if ( isVisible() )
+ formFile()->setModified( TRUE, FormFile::WFormWindow );
+
+#if defined(Q_WS_WIN32)
+ windowsRepaintWorkaroundTimer->start( 100, TRUE );
+#endif
+}
+
+void FormWindow::windowsRepaintWorkaroundTimerTimeout()
+{
+#if defined(Q_WS_WIN32)
+ QObjectList *l = queryList( "QWidget" );
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ flickerfree_update( (QWidget*)o );
+ }
+ flickerfree_update( this );
+ delete l;
+#endif
+}
+
+QPtrDict<QWidget> *FormWindow::widgets()
+{
+ return &insertedWidgets;
+}
+
+QWidget *FormWindow::designerWidget( QObject *o ) const
+{
+ if ( !o || !o->isWidgetType() )
+ return 0;
+ QWidget *w = (QWidget*)o;
+ while ( w && !isMainContainer( w ) && !insertedWidgets[ (void*)w ] || isCentralWidget( w ) )
+ w = (QWidget*)w->parent();
+ return w;
+}
+
+void FormWindow::emitShowProperties( QObject *w )
+{
+ if ( w ) {
+ QObject *opw = propertyWidget;
+ propertyWidget = w;
+ if ( opw->isWidgetType() )
+ repaintSelection( (QWidget*)opw );
+ }
+ showPropertiesTimer->stop();
+ showPropertiesTimer->start( 0, TRUE );
+}
+
+void FormWindow::emitUpdateProperties( QObject *w )
+{
+ if ( w == propertyWidget ) {
+ updatePropertiesTimer->stop();
+ updatePropertiesTimer->start( 0, TRUE );
+ }
+}
+
+void FormWindow::emitSelectionChanged()
+{
+ selectionChangedTimer->stop();
+ selectionChangedTimer->start( 0, TRUE );
+}
+
+void FormWindow::updatePropertiesTimerDone()
+{
+ CHECK_MAINWINDOW;
+ if ( propertyWidget && mainWindow()->formWindow() == this )
+ emit updateProperties( propertyWidget );
+}
+
+void FormWindow::showPropertiesTimerDone()
+{
+ CHECK_MAINWINDOW;
+ if ( propertyWidget && mainWindow()->formWindow() == this )
+ emit showProperties( propertyWidget );
+}
+
+void FormWindow::selectionChangedTimerDone()
+{
+ emit selectionChanged();
+}
+
+void FormWindow::currentToolChanged()
+{
+ CHECK_MAINWINDOW;
+ toolFixed = FALSE;
+ int t = mainwindow->currentTool();
+ if ( currTool == t && t != ORDER_TOOL )
+ return;
+
+ // tool cleanup
+ switch ( currTool ) {
+ case ORDER_TOOL:
+ hideOrderIndicators();
+ break;
+ case CONNECT_TOOL:
+ case BUDDY_TOOL:
+ restoreConnectionLine();
+ if ( startWidget )
+ restoreRect( QRect( mapToForm( ( (QWidget*)startWidget )->parentWidget(),
+ ( (QWidget*)startWidget )->pos() ),
+ ( (QWidget*)startWidget )->size() ) );
+ if ( endWidget )
+ restoreRect( QRect( mapToForm( ( (QWidget*)endWidget )->parentWidget(),
+ ( (QWidget*)endWidget )->pos() ),
+ ( (QWidget*)endWidget )->size() ) );
+ endUnclippedPainter();
+ break;
+ case POINTER_TOOL:
+ break;
+ default:
+ if ( insertParent )
+ endRectDraw();
+ break;
+ }
+
+ startWidget = endWidget = 0;
+ widgetPressed = FALSE;
+ drawRubber = FALSE;
+ insertParent = 0;
+ delete buffer;
+ buffer = 0;
+
+ currTool = t;
+
+ if ( hasFocus() )
+ clearSelection( FALSE );
+
+ mainWindow()->statusBar()->clear();
+
+ // tool setup
+ switch ( currTool ) {
+ case POINTER_TOOL:
+ if ( propertyWidget && !isMainContainer( propertyWidget ) && !isWidgetSelected( propertyWidget ) )
+ emitShowProperties( mainContainer() );
+ restoreCursors( this, this );
+ break;
+ case ORDER_TOOL:
+ if ( mainWindow()->formWindow() == this ) {
+ mainWindow()->statusBar()->message( tr( "Click widgets to change the tab order...") );
+ orderedWidgets.clear();
+ showOrderIndicators();
+ if ( mainWindow()->formWindow() == this )
+ emitShowProperties( mainContainer() );
+ setCursorToAll( ArrowCursor, this );
+ }
+ break;
+ case CONNECT_TOOL:
+ case BUDDY_TOOL:
+ if ( currTool == CONNECT_TOOL )
+ mainWindow()->statusBar()->message( tr( "Drag a line to create a connection...") );
+ else
+ mainWindow()->statusBar()->message( tr( "Drag a line to set a buddy...") );
+ setCursorToAll( CrossCursor, this );
+ if ( mainWindow()->formWindow() == this )
+ emitShowProperties( mainContainer() );
+ break;
+ default:
+ mainWindow()->statusBar()->message( tr( "Click on the form to insert a %1..." ).arg( WidgetDatabase::toolTip( currTool ).lower() ) );
+ setCursorToAll( CrossCursor, this );
+ if ( mainWindow()->formWindow() == this )
+ emitShowProperties( mainContainer() );
+ break;
+ }
+}
+
+void FormWindow::showOrderIndicators()
+{
+ hideOrderIndicators();
+ orderIndicators.setAutoDelete( TRUE );
+ QObjectList *l = mainContainer()->queryList( "QWidget" );
+ stackedWidgets = MetaDataBase::tabOrder( this );
+ if ( l ) {
+ int order = 1;
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ QWidget* w = (QWidget*) o;
+ if ( w->isShown() &&
+ insertedWidgets[ (void*)w ] &&
+ w->focusPolicy() != NoFocus ) {
+ OrderIndicator* ind = new OrderIndicator( order++, w, this );
+ orderIndicators.append( ind );
+ if ( stackedWidgets.findRef( w ) == -1 )
+ stackedWidgets.append( w );
+ }
+ }
+ delete l;
+ }
+ updateOrderIndicators();
+}
+
+void FormWindow::hideOrderIndicators()
+{
+ orderIndicators.clear();
+}
+
+void FormWindow::updateOrderIndicators()
+{
+ int order = 1;
+ for ( QWidget *w = stackedWidgets.first(); w; w = stackedWidgets.next() ) {
+ for ( OrderIndicator* i = orderIndicators.first(); i; i = orderIndicators.next() )
+ i->setOrder( order, w );
+ order++;
+ }
+}
+
+void FormWindow::repositionOrderIndicators()
+{
+ for ( OrderIndicator* i = orderIndicators.first(); i; i = orderIndicators.next() )
+ i->reposition();
+}
+
+
+void FormWindow::updateUndoInfo()
+{
+ commandHistory()->emitUndoRedo();
+}
+
+bool FormWindow::checkCustomWidgets()
+{
+ QStringList missingCustomWidgets;
+ QPtrDictIterator<QWidget> it( insertedWidgets );
+ for ( ; it.current(); ++it ) {
+ if ( it.current()->isA( "CustomWidget" ) ) {
+ QString className = WidgetFactory::classNameOf( it.current() );
+ if ( !MetaDataBase::hasCustomWidget( className ) )
+ missingCustomWidgets << className;
+ }
+ }
+
+ if ( !missingCustomWidgets.isEmpty() ) {
+ QString txt = tr( "The following custom widgets are used in '%1',\n"
+ "but are not known to Qt Designer:\n" ).arg( name() );
+ for ( QStringList::Iterator sit = missingCustomWidgets.begin(); sit != missingCustomWidgets.end(); ++sit )
+ txt += " " + *sit + "\n";
+ txt += "If you save this form and generate code for it using uic, \n"
+ "the generated code will not compile.\n"
+ "Do you want to save this form now?";
+ if ( QMessageBox::information( mainWindow(), tr( "Save Form" ), txt ) == 1 )
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void FormWindow::setPropertyShowingBlocked( bool b )
+{
+ propShowBlocked = b;
+}
+
+bool FormWindow::isPropertyShowingBlocked() const
+{
+ return propShowBlocked;
+}
+
+int FormWindow::numSelectedWidgets() const
+{
+ return usedSelections.count();
+}
+
+QString FormWindow::copy()
+{
+ CHECK_MAINWINDOW_VALUE( QString::null );
+ Resource resource( mainWindow() );
+ resource.setWidget( this );
+ return resource.copy();
+}
+
+void FormWindow::lowerWidgets()
+{
+ QWidgetList widgets;
+ QPtrDictIterator<WidgetSelection> it( usedSelections );
+ for ( ; it.current(); ++it )
+ widgets.append( it.current()->widget() );
+
+ LowerCommand *cmd = new LowerCommand( tr( "Lower" ), this, widgets );
+ cmd->execute();
+ commandHistory()->addCommand( cmd );
+}
+
+void find_accel( const QString &txt, QMap<QChar, QWidgetList > &accels, QWidget *w )
+{
+ int i = txt.find( "&" );
+ if ( i == -1 )
+ return;
+ QChar c = txt[ i + 1 ];
+ if ( c.isNull() || c == '&' )
+ return;
+ c = c.lower();
+ QMap<QChar, QWidgetList >::Iterator it = accels.find( c );
+ if ( it == accels.end() ) {
+ QWidgetList wl;
+ wl.append( w );
+ accels.insert( c, wl );
+ } else {
+ QWidgetList *wl = &*it;
+ wl->append( w );
+ }
+}
+
+void FormWindow::checkAccels()
+{
+ CHECK_MAINWINDOW;
+ QMap<QChar, QWidgetList > accels;
+ QObjectList *l = mainContainer()->queryList( "QWidget" );
+ if ( l ) {
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( ( (QWidget*)o )->isVisibleTo( this ) &&
+ insertedWidgets[ (void*)o ] ) {
+ QWidget *w = (QWidget*)o;
+ const QMetaProperty* text =
+ w->metaObject()->property( w->metaObject()->findProperty( "text", TRUE ), TRUE );
+ const QMetaProperty* title =
+ w->metaObject()->property( w->metaObject()->findProperty( "title", TRUE ), TRUE );
+ const QMetaProperty* pageTitle =
+ w->metaObject()->property( w->metaObject()->findProperty( "pageTitle", TRUE ), TRUE );
+ if ( text )
+ find_accel( w->property( "text" ).toString(), accels, w );
+ if ( title )
+ find_accel( w->property( "title" ).toString(), accels, w );
+ if ( pageTitle )
+ find_accel( w->property( "pageTitle" ).toString(), accels, w );
+ } else if ( ::qt_cast<MenuBarEditor*>(o) ) {
+ ((MenuBarEditor *)o)->checkAccels( accels );
+ }
+ }
+ delete l;
+ }
+
+ bool ok = TRUE;
+ QWidget *wid;
+ for ( QMap<QChar, QWidgetList >::Iterator it = accels.begin(); it != accels.end(); ++it ) {
+ if ( (*it).count() > 1 ) {
+ ok = FALSE;
+ switch ( QMessageBox::information( mainWindow(), tr( "Check Accelerators" ),
+ tr( "Accelerator '%1' is used %2 times."
+ ).arg( it.key().upper() ).arg( (*it).count() ),
+ tr( "&Select" ),
+ tr( "&Cancel" ), QString::null, 2 ) ) {
+ case 0: // select
+ clearSelection( FALSE );
+ for ( wid = (*it).first(); wid; wid = (*it).next() )
+ selectWidget( wid, TRUE );
+ return;
+ case 1: // cancel
+ return;
+ }
+ }
+ }
+
+ if ( ok )
+ QMessageBox::information( mainWindow(), tr( "Check Accelerators" ),
+ tr( "No accelerator is used more than once." ) );
+}
+
+void FormWindow::raiseWidgets()
+{
+ QWidgetList widgets;
+ QPtrDictIterator<WidgetSelection> it( usedSelections );
+ for ( ; it.current(); ++it )
+ widgets.append( it.current()->widget() );
+
+ RaiseCommand *cmd = new RaiseCommand( tr( "Raise" ), this, widgets );
+ cmd->execute();
+ commandHistory()->addCommand( cmd );
+}
+
+void FormWindow::paste( const QString &cb, QWidget *parent )
+{
+ CHECK_MAINWINDOW;
+ Resource resource( mainWindow() );
+ resource.setWidget( this );
+ resource.paste( cb, parent );
+}
+
+void FormWindow::selectAll()
+{
+ checkedSelectionsForMove = FALSE;
+ blockSignals( TRUE );
+ QObjectList *l = mainContainer()->queryList( "QWidget" );
+ if ( l ) {
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( ( (QWidget*)o )->isVisibleTo( this ) &&
+ insertedWidgets[ (void*)o ] ) {
+ selectWidget( (QWidget*)o );
+ }
+ }
+ delete l;
+ }
+
+ blockSignals( FALSE );
+ emitSelectionChanged();
+ if ( propertyWidget )
+ emitShowProperties( propertyWidget );
+ emitSelectionChanged();
+}
+
+void FormWindow::layoutHorizontal()
+{
+ QWidgetList widgets( selectedWidgets() );
+ LayoutHorizontalCommand *cmd = new LayoutHorizontalCommand( tr( "Lay out horizontally" ),
+ this, mainContainer(), 0, widgets );
+ clearSelection( FALSE );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void FormWindow::layoutVertical()
+{
+ QWidgetList widgets( selectedWidgets() );
+ LayoutVerticalCommand *cmd = new LayoutVerticalCommand( tr( "Lay out vertically" ),
+ this, mainContainer(), 0, widgets );
+ clearSelection( FALSE );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void FormWindow::layoutHorizontalSplit()
+{
+ QWidgetList widgets( selectedWidgets() );
+ LayoutHorizontalSplitCommand *cmd = new LayoutHorizontalSplitCommand( tr( "Lay out horizontally (in splitter)" ),
+ this, mainContainer(), 0, widgets );
+ clearSelection( FALSE );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void FormWindow::layoutVerticalSplit()
+{
+ QWidgetList widgets( selectedWidgets() );
+ LayoutVerticalSplitCommand *cmd = new LayoutVerticalSplitCommand( tr( "Lay out vertically (in splitter)" ),
+ this, mainContainer(), 0, widgets );
+ clearSelection( FALSE );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void FormWindow::layoutGrid()
+{
+ int xres = grid().x();
+ int yres = grid().y();
+
+ QWidgetList widgets( selectedWidgets() );
+ LayoutGridCommand *cmd = new LayoutGridCommand( tr( "Lay out in a grid" ),
+ this, mainContainer(), 0, widgets, xres, yres );
+ clearSelection( FALSE );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void FormWindow::layoutHorizontalContainer( QWidget *w )
+{
+ if ( w == this )
+ w = mainContainer();
+ QObjectList *l = (QObjectList*)WidgetFactory::containerOfWidget(w)->children();
+ if ( !l )
+ return;
+ QWidgetList widgets;
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o->isWidgetType() &&
+ ( (QWidget*)o )->isVisibleTo( this ) &&
+ insertedWidgets.find( (QWidget*)o ) )
+ widgets.append( (QWidget*)o );
+ }
+ LayoutHorizontalCommand *cmd = new LayoutHorizontalCommand( tr( "Lay out children horizontally" ),
+ this, mainContainer(), w, widgets );
+ clearSelection( FALSE );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void FormWindow::layoutVerticalContainer( QWidget *w )
+{
+ if ( w == this )
+ w = mainContainer();
+ QObjectList *l = (QObjectList*)WidgetFactory::containerOfWidget(w)->children();
+ if ( !l )
+ return;
+ QWidgetList widgets;
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o->isWidgetType() &&
+ ( (QWidget*)o )->isVisibleTo( this ) &&
+ insertedWidgets.find( (QWidget*)o ) )
+ widgets.append( (QWidget*)o );
+ }
+ LayoutVerticalCommand *cmd = new LayoutVerticalCommand( tr( "Lay out children vertically" ),
+ this, mainContainer(), w, widgets );
+ clearSelection( FALSE );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void FormWindow::layoutGridContainer( QWidget *w )
+{
+ if ( w == this )
+ w = mainContainer();
+ int xres = grid().x();
+ int yres = grid().y();
+
+ QObjectList *l = (QObjectList*)WidgetFactory::containerOfWidget(w)->children();
+ if ( !l )
+ return;
+ QWidgetList widgets;
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o->isWidgetType() &&
+ ( (QWidget*)o )->isVisibleTo( this ) &&
+ insertedWidgets.find( (QWidget*)o ) )
+ widgets.append( (QWidget*)o );
+ }
+ LayoutGridCommand *cmd = new LayoutGridCommand( tr( "Lay out children in a grid" ),
+ this, mainContainer(), w, widgets, xres, yres );
+ clearSelection( FALSE );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void FormWindow::breakLayout( QWidget *w )
+{
+ if ( w == this )
+ w = mainContainer();
+ w = WidgetFactory::containerOfWidget( w );
+ QPtrList<Command> commands;
+
+ for (;;) {
+ if ( !w || w == this )
+ break;
+ if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout &&
+ WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( w ) ) ) ) {
+ Command *cmd = breakLayoutCommand( w );
+ if ( cmd )
+ commands.insert( 0, cmd );
+ if ( !::qt_cast<QLayoutWidget*>(w) && !::qt_cast<QSplitter*>(w) )
+ break;
+ }
+ w = w->parentWidget();
+ }
+
+ if ( commands.isEmpty() )
+ return;
+
+ clearSelection( FALSE );
+ MacroCommand *cmd = new MacroCommand( tr( "Break Layout" ), this, commands );
+ commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+BreakLayoutCommand *FormWindow::breakLayoutCommand( QWidget *w )
+{
+ CHECK_MAINWINDOW_VALUE( 0 );
+ QObjectList *l = (QObjectList*)w->children();
+ if ( !l )
+ return 0;
+
+ QWidgetList widgets;
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o->isWidgetType() &&
+ !mainWindow()->isAToolBarChild( (QWidget*)o ) &&
+ ( (QWidget*)o )->isVisibleTo( this ) &&
+ insertedWidgets.find( (QWidget*)o ) )
+ widgets.append( (QWidget*)o );
+ }
+ return new BreakLayoutCommand( tr( "Break Layout" ), this, WidgetFactory::widgetOfContainer( w ), widgets );
+}
+
+int FormWindow::numVisibleWidgets() const
+{
+ QPtrDictIterator<QWidget> it( insertedWidgets );
+ int visible = 0;
+ for ( ; it.current(); ++it ) {
+ if ( it.current()->isVisibleTo( (FormWindow*)this ) )
+ visible++;
+ }
+ return visible;
+}
+
+bool FormWindow::hasInsertedChildren( QWidget *w ) const
+{
+ if ( !w )
+ return FALSE;
+ w = WidgetFactory::containerOfWidget( w );
+ if ( !w )
+ return FALSE;
+ QObjectList *l = w->queryList( "QWidget" );
+ if ( !l || !l->first() ) {
+ delete l;
+ return FALSE;
+ }
+
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o->isWidgetType() &&
+ ( (QWidget*)o )->isVisibleTo( (FormWindow*)this ) &&
+ insertedWidgets.find( (QWidget*)o ) ) {
+ delete l;
+ return TRUE;
+ }
+ }
+
+ delete l;
+ return FALSE;
+}
+
+bool FormWindow::allowMove( QWidget *w )
+{
+ w = w->parentWidget();
+ while ( w ) {
+ if ( ( isMainContainer( w ) || insertedWidgets.find( w ) ) && WidgetFactory::layoutType( w ) == WidgetFactory::NoLayout )
+ return TRUE;
+ w = w->parentWidget();
+ }
+ return FALSE;
+}
+
+
+void FormWindow::editConnections()
+{
+ CHECK_MAINWINDOW;
+ buffer = 0;
+ if ( !startWidget || !endWidget )
+ return;
+
+ ConnectionDialog dlg( mainwindow );
+ mainWindow()->statusBar()->message( tr( "Edit connections...") );
+ dlg.addConnection( startWidget, endWidget, QString::null, QString::null );
+ QTimer::singleShot( 0, &dlg, SLOT(ensureConnectionVisible()) );
+ dlg.exec();
+}
+
+void FormWindow::saveBackground()
+{
+ if ( buffer )
+ delete buffer;
+ buffer = new QPixmap( width(), height() );
+ *buffer = QPixmap::grabWindow( winId() );
+}
+
+void FormWindow::restoreConnectionLine()
+{
+ if (!unclippedPainter || !buffer) // designer will occasionally crash if buffer is not tested to be non-zero
+ return;
+
+ int a =QABS( startPos.x() - currentPos.x() );
+ int b = QABS( startPos.y() - currentPos.y() );
+ QRect r( startPos, currentPos );
+
+ if ( a < 32 || b < 32 ) { // special case: vertical or horizontal line
+ r = r.normalize();
+ unclippedPainter->drawPixmap( r.x() - 2, r.y() - 2, *buffer,
+ r.x() - 2, r.y() - 2, r.width() + 4, r.height() + 4 );
+ return;
+ }
+
+ if ( a <= 0 )
+ a = 1;
+ if ( b <= 0 )
+ b = 1;
+ int w, h;
+ if ( b > a ) {
+ h = 64;
+ w = ( a * h ) / b;
+ } else {
+ w = 64;
+ h = ( b * w ) / a;
+ }
+
+ int dx = 2 * w / 3;
+ int dy = 2 * h / 3;
+ QPoint p( startPos );
+
+ if ( r.x() > r.right() ) {
+ dx = dx * -1;
+ p.setX( p.x() - 64 );
+ r.moveBy( -64, 0 );
+ }
+ if ( r.y() > r.bottom() ) {
+ dy = dy * -1;
+ p.setY( p.y() - 64 );
+ r.moveBy( 0, -64 );
+ }
+
+ w = h = 64;
+ r = r.normalize();
+ while ( r.contains( p ) ) {
+ unclippedPainter->drawPixmap( p, *buffer, QRect( p, QSize( w, h ) ) );
+ unclippedPainter->setPen( red );
+ p.setX( p.x() + dx );
+ p.setY( p.y() + dy );
+ }
+
+ unclippedPainter->drawPixmap( startPos.x() - 10, startPos.y() - 10, *buffer,
+ startPos.x() - 10, startPos.y() - 10, 20, 20 );
+}
+
+void FormWindow::restoreRect( const QRect &rect )
+{
+ if (!unclippedPainter || !buffer)
+ return;
+
+ QRect r( rect );
+ r = r.normalize();
+
+ r = QRect( r.x() + 2, r.y() + 2, r.width() - 4, r.height() - 4 );
+
+ unclippedPainter->drawPixmap( r.x() - 2, r.y() - 2, *buffer, r.x() - 2, r.y() - 2, r.width() + 4, 4 );
+ unclippedPainter->drawPixmap( r.x() - 2, r.y() - 2, *buffer, r.x() - 2, r.y() - 2, 4, r.height() + 4 );
+ unclippedPainter->drawPixmap( r.x() - 2, r.y() + r.height() - 3, *buffer, r.x() - 2, r.y() + r.height() - 3, r.width() + 4, 5 );
+ unclippedPainter->drawPixmap( r.x() + r.width() - 2, r.y(), *buffer, r.x() + r.width() - 2, r.y(), 4, r.height() + 4 );
+}
+
+void FormWindow::drawConnectionLine()
+{
+ if ( !unclippedPainter )
+ return;
+
+ unclippedPainter->setPen( QPen( white, 2 ) );
+ unclippedPainter->drawLine( startPos, currentPos );
+ if ( validForBuddy )
+ unclippedPainter->setPen( QPen( darkRed, 1 ) );
+ else
+ unclippedPainter->setPen( QPen( darkCyan, 1 ) );
+ unclippedPainter->drawLine( startPos, currentPos );
+
+ if ( validForBuddy )
+ unclippedPainter->setPen( QPen( darkGreen, 1 ) );
+ else
+ unclippedPainter->setPen( QPen( magenta, 1 ) );
+ if ( startWidget ) {
+ QWidget *s = (QWidget*)startWidget;
+ QPoint p = mapToForm( s, QPoint(0,0) );
+ unclippedPainter->drawRect( QRect( p + QPoint( 2, 2 ), s->size() - QSize( 4, 4 ) ) );
+ }
+ if ( endWidget ) {
+ QWidget *e = (QWidget*)endWidget;
+ QPoint p = mapToForm( e, QPoint(0,0) );
+ unclippedPainter->drawRect( QRect( p + QPoint( 2, 2 ), e->size() - QSize( 4, 4 ) ) );
+ }
+}
+
+QString FormWindow::fileName() const
+{
+ return ff->absFileName();
+}
+
+void FormWindow::setFileName( const QString &fn )
+{
+ ff->setFileName( fn );
+ emit fileNameChanged( ff->fileName(), this );
+}
+
+void FormWindow::modificationChanged( bool m )
+{
+ emit modificationChanged( m, this );
+ emit modificationChanged( m, ff->fileName() );
+}
+
+bool FormWindow::unify( QObject *w, QString &s, bool changeIt )
+{
+ bool found = !isMainContainer( w ) && qstrcmp( name(), s.latin1() ) == 0;
+ if ( !found ) {
+ QString orig = s;
+ int num = 1;
+ QPtrDictIterator<QWidget> it( insertedWidgets );
+ for ( ; it.current();) {
+ if ( it.current() != w &&
+ qstrcmp( it.current()->name(), s.latin1() ) == 0 ) {
+ found = TRUE;
+ if ( !changeIt )
+ break;
+ s = orig + "_" + QString::number( ++num );
+ it.toFirst();
+ } else {
+ ++it;
+ }
+ }
+ if ( !found ) {
+ QPtrList<QAction> al;
+ QAction *a = 0;
+ for ( a = actions.first(); a; a = actions.next() ) {
+ QObjectList *l = a->queryList( "QAction" );
+ al.append( a );
+ for ( QObject *ao = l->first(); ao; ao = l->next() )
+ al.append( (QAction*)ao );
+ delete l;
+ }
+ for ( a = al.first(); a; a = al.next() ) {
+ if ( a != w &&
+ qstrcmp( a->name(), s.latin1() ) == 0 ) {
+ found = TRUE;
+ if ( !changeIt )
+ break;
+ s = orig + "_" + QString::number( ++num );
+ a = actions.first();
+ }
+ }
+ }
+ if ( ::qt_cast<QMainWindow*>(mainContainer()) && !found ) {
+ QObjectList *l = mainContainer()->queryList( "PopupMenuEditor" );
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o != w &&
+ qstrcmp ( o->name(), s.latin1() ) == 0 ) {
+ found = TRUE;
+ if ( !changeIt )
+ break;
+ s = orig + "_" + QString::number( ++num );
+ o = l->first();
+ }
+ }
+ delete l;
+ }
+ if ( ::qt_cast<QMainWindow*>(mainContainer()) ) {
+ if ( !found ) {
+ QObjectList *l = mainContainer()->queryList( "QDockWindow", 0, TRUE );
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o != w &&
+ qstrcmp( o->name(), s.latin1() ) == 0 ) {
+ found = TRUE;
+ if ( !changeIt )
+ break;
+ s = orig + "_" + QString::number( ++num );
+ o = l->first();
+ }
+ }
+ delete l;
+ }
+ }
+ }
+
+ if ( !found )
+ return TRUE;
+ return FALSE;
+}
+
+bool FormWindow::isCustomWidgetUsed( MetaDataBase::CustomWidget *w )
+{
+ QPtrDictIterator<QWidget> it( insertedWidgets );
+ for ( ; it.current(); ++it ) {
+ if ( it.current()->isA( "CustomWidget" ) ) {
+ if ( qstrcmp( WidgetFactory::classNameOf( it.current() ), w->className.utf8() ) == 0 )
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool FormWindow::isDatabaseWidgetUsed() const
+{
+#ifndef QT_NO_SQL
+ QStringList dbClasses;
+ dbClasses << "QDataTable"; // add more here
+ QPtrDictIterator<QWidget> it( insertedWidgets );
+ for ( ; it.current(); ++it ) {
+ QString c( it.current()->className() );
+ if ( dbClasses.contains( c ) > 0 ) {
+ return TRUE;
+ }
+ }
+#endif
+ return FALSE;
+}
+
+bool FormWindow::isDatabaseAware() const
+{
+#ifndef QT_NO_SQL
+ if ( QString(mContainer->className()) == "QDesignerDataBrowser" || QString(mContainer->className()) == "QDesignerDataView" )
+ return TRUE;
+ return isDatabaseWidgetUsed();
+#else
+ return FALSE;
+#endif
+}
+
+void FormWindow::visibilityChanged()
+{
+ if ( currTool != ORDER_TOOL ) {
+ emitUpdateProperties( currentWidget() );
+ } else {
+ updateOrderIndicators();
+ repositionOrderIndicators();
+ }
+}
+
+
+/*!
+ Maps \a pos in \a w's coordinates to the form's coordinate system.
+
+ This is the equivalent to mapFromGlobal(w->mapToGlobal(pos) ) but
+ avoids the two roundtrips to the X-Server on Unix/X11.
+ */
+QPoint FormWindow::mapToForm( const QWidget* w, const QPoint& pos ) const
+{
+ QPoint p = pos;
+ const QWidget* i = w;
+ while ( i && !i->isTopLevel() && !isMainContainer( (QWidget*)i ) ) {
+ p = i->mapToParent( p );
+ i = i->parentWidget();
+ }
+ return mapFromGlobal( w->mapToGlobal( pos ) );
+}
+
+static int widgetDepth( QWidget *w )
+{
+ int d = -1;
+ while ( w && !w->isTopLevel() ) {
+ d++;
+ w = w->parentWidget();
+ }
+
+ return d;
+}
+
+static bool isChildOf( QWidget *c, QWidget *p )
+{
+ while ( c && !c->isTopLevel() ) {
+ if ( c == p )
+ return TRUE;
+ c = c->parentWidget();
+ }
+ return FALSE;
+}
+
+QWidget *FormWindow::containerAt( const QPoint &pos, QWidget *notParentOf )
+{
+ QPtrDictIterator<QWidget> it( insertedWidgets );
+ QWidget *container = 0;
+ int depth = -1;
+ QWidgetList selected = selectedWidgets();
+ if ( rect().contains( mapFromGlobal( pos ) ) ) {
+ container = mainContainer();
+ depth = widgetDepth( container );
+ }
+
+ for ( ; it.current(); ++it ) {
+ if ( ::qt_cast<QLayoutWidget*>(it.current())
+ || ::qt_cast<QSplitter*>(it.current()) )
+ continue;
+ if ( !it.current()->isVisibleTo( this ) )
+ continue;
+ if ( selected.find( it.current() ) != -1 )
+ continue;
+ if ( !WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( it.current() ) ) ) &&
+ it.current() != mainContainer() )
+ continue;
+
+ // the rectangles of all ancestors of the container must contain the insert position
+ QWidget *w = it.current();
+ while ( w && !w->isTopLevel() ) {
+ if ( !w->rect().contains( ( w->mapFromGlobal( pos ) ) ) )
+ break;
+ w = w->parentWidget();
+ }
+ if ( !( w == 0 || w->isTopLevel() ) ) continue; // we did not get through the full while loop
+
+ int wd = widgetDepth( it.current() );
+ if ( wd == depth && container ) {
+ if ( ( (QObjectList*)it.current()->parentWidget()->children() )->find( it.current() ) >
+ ( (QObjectList*)container->parentWidget()->children() )->find( container ) )
+ wd++;
+ }
+ if ( wd > depth && !isChildOf( it.current(), notParentOf ) ) {
+ depth = wd;
+ container = it.current();
+ }
+ }
+
+ return container;
+}
+
+bool FormWindow::isMainContainer( QObject *w ) const
+{
+ return w && w->isWidgetType() && ( w == (QWidget*)this || w == mainContainer() );
+}
+
+void FormWindow::setMainContainer( QWidget *w )
+{
+ bool resetPropertyWidget = isMainContainer( propertyWidget );
+ if ( mContainer )
+ insertedWidgets.remove( mContainer );
+ if ( propertyWidget == mContainer )
+ propertyWidget = 0;
+ delete mContainer;
+ mContainer = w;
+ insertedWidgets.insert( mContainer, mContainer );
+ delete layout();
+ QHBoxLayout *l = new QHBoxLayout( this );
+ l->addWidget( w );
+ if ( resetPropertyWidget ) {
+ QObject *opw = propertyWidget;
+ propertyWidget = mContainer;
+ if ( opw && opw->isWidgetType() )
+ repaintSelection( (QWidget*)opw );
+ }
+ if ( project() ) {
+ LanguageInterface *iface = MetaDataBase::languageInterface( project()->language() );
+ if ( iface && !project()->isCpp() && !isFake() ) {
+ if ( !MetaDataBase::hasFunction( this, "init()" ) )
+ MetaDataBase::addFunction( this, "init()", "", "private", "function",
+ project()->language(), "void" );
+ if ( !MetaDataBase::hasFunction( this, "destroy()" ) )
+ MetaDataBase::addFunction( this, "destroy()", "", "private", "function",
+ project()->language(), "void" );
+ if ( !MetaDataBase::hasConnection( this, mainContainer(), "shown()", mainContainer(), "init" ) )
+ MetaDataBase::addConnection( this, mainContainer(), "shown()", mainContainer(), "init" );
+ if ( !MetaDataBase::hasConnection( this, mainContainer(), "destroyed()", mainContainer(), "destroy" ) )
+ MetaDataBase::addConnection( this, mainContainer(), "destroyed()",
+ mainContainer(), "destroy" );
+ }
+ }
+}
+
+bool FormWindow::savePixmapInline() const
+{
+ return pixInline;
+}
+
+bool FormWindow::savePixmapInProject() const
+{
+ return pixProject;
+}
+
+QString FormWindow::pixmapLoaderFunction() const
+{
+ return pixLoader;
+}
+
+void FormWindow::setSavePixmapInline( bool b )
+{
+ pixInline = b;
+ if ( b )
+ pixProject = FALSE;
+}
+
+void FormWindow::setSavePixmapInProject( bool b )
+{
+ pixProject = b;
+ if ( b )
+ pixInline = FALSE;
+}
+
+void FormWindow::setPixmapLoaderFunction( const QString &func )
+{
+ pixLoader = func;
+}
+
+void FormWindow::setActiveObject( QObject *o )
+{
+ emitShowProperties( o );
+ propertyWidget = o;
+}
+
+void FormWindow::setProject( Project *pro )
+{
+ proj = pro;
+}
+
+Project *FormWindow::project() const
+{
+ return proj;
+}
+
+QAction *FormWindow::findAction( const QString &name )
+{
+ for ( QAction *a = actionList().first(); a; a = actionList().next() ) {
+ if ( QString( a->name() ) == name )
+ return a;
+ QAction *ac = (QAction*)a->child( name.latin1(), "QAction" );
+ if ( ac )
+ return ac;
+ }
+ return 0;
+}
+
+void FormWindow::killAccels( QObject *top )
+{
+ QObjectList *l = top->queryList( "QAccel" );
+ if ( !l )
+ return;
+ for ( QObject *o = l->first(); o; o = l->next() )
+ ( (QAccel*)o )->setEnabled( FALSE );
+ delete l;
+}
+
+DesignerFormWindow *FormWindow::iFace()
+{
+ if ( !iface )
+ iface = new DesignerFormWindowImpl( this );
+ return iface;
+}
+
+bool FormWindow::isCentralWidget( QObject *w ) const
+{
+ if ( !::qt_cast<QMainWindow*>(mainContainer()) )
+ return FALSE;
+ return w == ( (QMainWindow*)mainContainer() )->centralWidget();
+}
+
+int FormWindow::layoutDefaultSpacing() const
+{
+ return defSpacing;
+}
+
+int FormWindow::layoutDefaultMargin() const
+{
+ return defMargin;
+}
+
+void FormWindow::setLayoutDefaultSpacing( int s )
+{
+ defSpacing = s;
+}
+
+void FormWindow::setLayoutDefaultMargin( int s )
+{
+ defMargin = s;
+}
+
+void FormWindow::setSpacingFunction( const QString &funct )
+{
+ spacFunction = funct;
+}
+
+QString FormWindow::spacingFunction() const
+{
+ return spacFunction;
+}
+
+void FormWindow::hasLayoutFunctions( bool b )
+{
+ hasLayoutFunc = b;
+}
+
+bool FormWindow::hasLayoutFunctions() const
+{
+ return hasLayoutFunc;
+}
+
+void FormWindow::setMarginFunction( const QString &funct )
+{
+ margFunction = funct;
+}
+
+QString FormWindow::marginFunction() const
+{
+ return margFunction;
+}
+
+FormFile *FormWindow::formFile() const
+{
+ return ff;
+}
+
+void FormWindow::setFormFile( FormFile *f )
+{
+ ff = f;
+ if ( ff )
+ connect( this, SIGNAL( modificationChanged(bool, const QString&) ), ff, SLOT( formWindowChangedSomehow() ) );
+}
+
+bool FormWindow::canBeBuddy( const QWidget *w ) const
+{
+ return w->focusPolicy() != QWidget::NoFocus;
+}
diff --git a/tools/designer/designer/formwindow.h b/tools/designer/designer/formwindow.h
new file mode 100644
index 0000000..85dc3bf
--- /dev/null
+++ b/tools/designer/designer/formwindow.h
@@ -0,0 +1,328 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef FORMWINDOW_H
+#define FORMWINDOW_H
+
+#include "command.h"
+#include "metadatabase.h"
+#include "sizehandle.h"
+#include "actiondnd.h"
+
+#include <qwidget.h>
+#include <qptrdict.h>
+#include <qpixmap.h>
+#include <qwidgetlist.h>
+#include <qmap.h>
+
+class QPaintEvent;
+class QMouseEvent;
+class QKeyEvent;
+class QPainter;
+class QLabel;
+class MainWindow;
+class QTimer;
+class QFocusEvent;
+class QCloseEvent;
+class Resource;
+class QResizeEvent;
+class BreakLayoutCommand;
+class QPixmap;
+class QSizeGrip;
+class Project;
+struct DesignerFormWindow;
+class FormFile;
+
+#if defined(Q_CC_MSVC) || defined(Q_FULL_TEMPLATE_INSTANTIATION)
+#include "orderindicator.h"
+#else
+class OrderIndicator;
+#endif
+
+class FormWindow : public QWidget
+{
+ Q_OBJECT
+ Q_PROPERTY( QString fileName READ fileName WRITE setFileName )
+
+public:
+ FormWindow( FormFile *f, MainWindow *mw, QWidget *parent, const char *name = 0 );
+ FormWindow( FormFile *f, QWidget *parent, const char *name = 0 );
+ ~FormWindow();
+
+ void init();
+ virtual void setMainWindow( MainWindow *w );
+
+ virtual QString fileName() const;
+ virtual void setFileName( const QString &fn );
+
+ virtual QPoint grid() const;
+ virtual QPoint gridPoint( const QPoint &p );
+
+ virtual CommandHistory *commandHistory();
+
+ virtual void undo();
+ virtual void redo();
+ virtual QString copy();
+ virtual void paste( const QString &cb, QWidget *parent );
+ virtual void lowerWidgets();
+ virtual void raiseWidgets();
+ virtual void checkAccels();
+
+ virtual void layoutHorizontal();
+ virtual void layoutVertical();
+ virtual void layoutHorizontalSplit();
+ virtual void layoutVerticalSplit();
+ virtual void layoutGrid();
+
+ virtual void layoutHorizontalContainer( QWidget *w );
+ virtual void layoutVerticalContainer( QWidget *w );
+ virtual void layoutGridContainer( QWidget *w );
+
+ virtual void breakLayout( QWidget *w );
+
+ virtual void selectWidget( QObject *w, bool select = TRUE );
+ virtual void selectAll();
+ virtual void updateSelection( QWidget *w );
+ virtual void raiseSelection( QWidget *w );
+ virtual void repaintSelection( QWidget *w );
+ virtual void clearSelection( bool changePropertyDisplay = TRUE );
+ virtual void selectWidgets();
+ bool isWidgetSelected( QObject *w );
+ virtual void updateChildSelections( QWidget *w );
+ virtual void raiseChildSelections( QWidget *w );
+
+ virtual void emitUpdateProperties( QObject *w );
+ virtual void emitShowProperties( QObject *w = 0 );
+ virtual void emitSelectionChanged();
+
+ virtual void setPropertyShowingBlocked( bool b );
+ bool isPropertyShowingBlocked() const;
+
+ virtual QLabel *sizePreview() const;
+ virtual void checkPreviewGeometry( QRect &r );
+
+ virtual QPtrDict<QWidget> *widgets();
+ virtual QWidgetList selectedWidgets() const;
+
+ virtual QWidget *designerWidget( QObject *o ) const;
+
+ virtual void handleContextMenu( QContextMenuEvent *e, QWidget *w );
+ virtual void handleMousePress( QMouseEvent *e, QWidget *w );
+ virtual void handleMouseRelease( QMouseEvent *e, QWidget *w );
+ virtual void handleMouseDblClick( QMouseEvent *e, QWidget *w );
+ virtual void handleMouseMove( QMouseEvent *e, QWidget *w );
+ virtual void handleKeyPress( QKeyEvent *e, QWidget *w );
+ virtual void handleKeyRelease( QKeyEvent *e, QWidget *w );
+
+ virtual void updateUndoInfo();
+
+ virtual MainWindow *mainWindow() const { return mainwindow; }
+
+ bool checkCustomWidgets();
+ virtual void insertWidget( QWidget *w, bool checkName = FALSE );
+ virtual void removeWidget( QWidget *w );
+ virtual void deleteWidgets();
+ virtual void editAdjustSize();
+ virtual void editConnections();
+
+ virtual int numSelectedWidgets() const;
+ virtual int numVisibleWidgets() const;
+
+ virtual bool hasInsertedChildren( QWidget *w ) const;
+
+ virtual QWidget *currentWidget() const { return propertyWidget && propertyWidget->isWidgetType() ? (QWidget*)propertyWidget : 0; } // #####
+ virtual bool unify( QObject *w, QString &s, bool changeIt );
+
+ virtual bool isCustomWidgetUsed( MetaDataBase::CustomWidget *w );
+ virtual bool isDatabaseWidgetUsed() const;
+ virtual bool isDatabaseAware() const;
+
+ virtual QPoint mapToForm( const QWidget* w, const QPoint& ) const;
+
+ bool isMainContainer( QObject *w ) const;
+ bool isCentralWidget( QObject *w ) const;
+ QWidget *mainContainer() const { return mContainer; }
+ void setMainContainer( QWidget *w );
+
+ void paintGrid( QWidget *w, QPaintEvent *e );
+
+ bool savePixmapInline() const;
+ QString pixmapLoaderFunction() const;
+ void setSavePixmapInline( bool b );
+ void setPixmapLoaderFunction( const QString &func );
+
+ bool savePixmapInProject() const;
+ void setSavePixmapInProject( bool b );
+
+ void setToolFixed() { toolFixed = TRUE; }
+
+ void setActiveObject( QObject *o );
+
+ QPtrList<QAction> &actionList() { return actions; }
+ QAction *findAction( const QString &name );
+
+ void setProject( Project *pro );
+ Project *project() const;
+
+ void killAccels( QObject *top );
+
+ DesignerFormWindow *iFace();
+
+ int layoutDefaultSpacing() const;
+ int layoutDefaultMargin() const;
+ void setLayoutDefaultSpacing( int s );
+ void setLayoutDefaultMargin( int s );
+ QString spacingFunction() const;
+ QString marginFunction() const;
+ void setSpacingFunction( const QString &func );
+ void setMarginFunction( const QString &func );
+ bool hasLayoutFunctions() const;
+ void hasLayoutFunctions( bool b );
+
+ void initSlots();
+ FormFile *formFile() const;
+ void setFormFile( FormFile *f );
+
+ bool isFake() const { return fake; }
+ bool canBeBuddy( const QWidget* ) const;
+
+public slots:
+ virtual void widgetChanged( QObject *w );
+ virtual void currentToolChanged();
+ virtual void visibilityChanged();
+ virtual void modificationChanged( bool m );
+
+signals:
+ void showProperties( QObject *w );
+ void updateProperties( QObject *w );
+ void undoRedoChanged( bool undoAvailable, bool redoAvailable,
+ const QString &undoCmd, const QString &redoCmd );
+ void selectionChanged();
+ void modificationChanged( bool m, FormWindow *fw );
+ void modificationChanged( bool m, const QString &s );
+ void fileNameChanged( const QString &s, FormWindow *fw );
+
+protected:
+ virtual void closeEvent( QCloseEvent *e );
+ virtual void focusInEvent( QFocusEvent *e );
+ virtual void focusOutEvent( QFocusEvent *e );
+ virtual void resizeEvent( QResizeEvent *e );
+ void mouseDoubleClickEvent( QMouseEvent *e ) { handleMouseDblClick( e, mainContainer() ); }
+
+private:
+ enum RectType { Insert, Rubber };
+
+ void beginUnclippedPainter( bool doNot );
+ void endUnclippedPainter();
+ void drawConnectionLine();
+ void drawSizePreview( const QPoint &pos, const QString& text );
+
+ void insertWidget();
+ void moveSelectedWidgets( int dx, int dy );
+
+ void startRectDraw( const QPoint &p, const QPoint &global, QWidget *w, RectType t );
+ void continueRectDraw( const QPoint &p, const QPoint &global, QWidget *w, RectType t );
+ void endRectDraw();
+
+ void checkSelectionsForMove( QWidget *w );
+ BreakLayoutCommand *breakLayoutCommand( QWidget *w );
+
+ bool allowMove( QWidget *w );
+
+ void saveBackground();
+ void restoreConnectionLine();
+ void restoreRect( const QRect &rect ) ;
+
+ void showOrderIndicators();
+ void updateOrderIndicators();
+ void repositionOrderIndicators();
+ void hideOrderIndicators();
+
+ QWidget *containerAt( const QPoint &pos, QWidget *notParentOf );
+
+private slots:
+ void invalidCheckedSelections();
+ void updatePropertiesTimerDone();
+ void showPropertiesTimerDone();
+ void selectionChangedTimerDone();
+ void windowsRepaintWorkaroundTimerTimeout();
+
+private:
+ int currTool;
+ bool oldRectValid, widgetPressed, drawRubber, checkedSelectionsForMove;
+ bool validForBuddy;
+ QRect currRect;
+ QPoint rectAnchor;
+ QPainter *unclippedPainter;
+ QPoint sizePreviewPos;
+ QPixmap sizePreviewPixmap;
+ MainWindow *mainwindow;
+ QPtrList<WidgetSelection> selections;
+ QPtrDict<WidgetSelection> usedSelections;
+ QRect widgetGeom, rubber;
+ QPoint oldPressPos, origPressPos;
+ CommandHistory commands;
+ QMap<QWidget*, QPoint> moving;
+ QWidget *insertParent;
+ QObject *propertyWidget;
+ QLabel *sizePreviewLabel;
+ QTimer *checkSelectionsTimer;
+ QPtrDict<QWidget> insertedWidgets;
+ bool propShowBlocked;
+ QTimer* updatePropertiesTimer, *showPropertiesTimer, *selectionChangedTimer,
+ *windowsRepaintWorkaroundTimer;
+ QPoint startPos, currentPos;
+ QWidget *startWidget, *endWidget;
+ QPixmap *buffer;
+ QPtrList<OrderIndicator> orderIndicators;
+ QWidgetList orderedWidgets;
+ QWidgetList stackedWidgets;
+ QWidget *mContainer;
+ bool pixInline, pixProject;
+ QString pixLoader;
+ bool toolFixed;
+ QPtrList<QAction> actions;
+ Project *proj;
+ DesignerFormWindow *iface;
+ QWidget* targetContainer;
+ QPalette restorePalette;
+ bool hadOwnPalette;
+ int defSpacing, defMargin;
+ QString spacFunction, margFunction;
+ bool hasLayoutFunc;
+ FormFile *ff;
+ bool fake;
+
+};
+
+#endif
diff --git a/tools/designer/designer/gotolinedialog.ui b/tools/designer/designer/gotolinedialog.ui
new file mode 100644
index 0000000..a171812
--- /dev/null
+++ b/tools/designer/designer/gotolinedialog.ui
@@ -0,0 +1,176 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>GotoLineDialog</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<include location="local" impldecl="in implementation">../interfaces/editorinterface.h</include>
+<include location="local" implDecl="in declaration">gotolinedialog.ui.h</include>
+<forward>struct EditorInterface;</forward>
+<variable>EditorInterface *editor;</variable>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>GotoLineDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>243</width>
+ <height>85</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Goto Line</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Line:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spinLine</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>spinLine</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Goto</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>GotoLineDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>GotoLineDialog</receiver>
+ <slot>gotoLine()</slot>
+ </connection>
+ <slot access="protected" language="C++" returnType="void">init()</slot>
+ <slot access="protected" language="C++" returnType="void">destroy()</slot>
+ <slot access="public" language="C++" returnType="void">gotoLine()</slot>
+ <slot access="public" language="C++" returnType="void">setEditor( EditorInterface * e )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/designer/gotolinedialog.ui.h b/tools/designer/designer/gotolinedialog.ui.h
new file mode 100644
index 0000000..72ce7a1
--- /dev/null
+++ b/tools/designer/designer/gotolinedialog.ui.h
@@ -0,0 +1,57 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+void GotoLineDialog::init()
+{
+ editor = 0;
+}
+
+void GotoLineDialog::destroy()
+{
+ if ( editor )
+ editor->release();
+}
+
+void GotoLineDialog::gotoLine()
+{
+ if ( editor )
+ editor->gotoLine( spinLine->value() - 1 );
+ accept();
+}
+
+void GotoLineDialog::setEditor( EditorInterface *e )
+{
+ editor = e;
+ editor->addRef();
+}
+
diff --git a/tools/designer/designer/hierarchyview.cpp b/tools/designer/designer/hierarchyview.cpp
new file mode 100644
index 0000000..b4c68cc
--- /dev/null
+++ b/tools/designer/designer/hierarchyview.cpp
@@ -0,0 +1,1500 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "hierarchyview.h"
+#include "formwindow.h"
+#include "globaldefs.h"
+#include "mainwindow.h"
+#include "command.h"
+#include "widgetfactory.h"
+#include "widgetdatabase.h"
+#include "project.h"
+#include "sourceeditor.h"
+#include "propertyeditor.h"
+#include "editfunctionsimpl.h"
+#include "listeditor.h"
+#include "actiondnd.h"
+#include "actioneditorimpl.h"
+#include "variabledialogimpl.h"
+#include "popupmenueditor.h"
+#include "menubareditor.h"
+
+#include <qpalette.h>
+#include <qobjectlist.h>
+#include <qheader.h>
+#include <qpopupmenu.h>
+#include <qtabwidget.h>
+#include <qwizard.h>
+#include <qwidgetstack.h>
+#include <qtabbar.h>
+#include <qfeatures.h>
+#include <qapplication.h>
+#include <qtimer.h>
+#include "../interfaces/languageinterface.h"
+#include <qworkspace.h>
+#include <qaccel.h>
+#include <qmessagebox.h>
+
+#include <stdlib.h>
+
+QListViewItem *newItem = 0;
+
+static QPluginManager<ClassBrowserInterface> *classBrowserInterfaceManager = 0;
+
+HierarchyItem::HierarchyItem( Type type, QListViewItem *parent, QListViewItem *after,
+ const QString &txt1, const QString &txt2, const QString &txt3 )
+ : QListViewItem( parent, after, txt1, txt2, txt3 ), typ( type )
+{
+}
+
+HierarchyItem::HierarchyItem( Type type, QListView *parent, QListViewItem *after,
+ const QString &txt1, const QString &txt2, const QString &txt3 )
+ : QListViewItem( parent, after, txt1, txt2, txt3 ), typ( type )
+{
+}
+
+void HierarchyItem::paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int align )
+{
+ QColorGroup g( cg );
+ g.setColor( QColorGroup::Base, backgroundColor() );
+ g.setColor( QColorGroup::Foreground, Qt::black );
+ g.setColor( QColorGroup::Text, Qt::black );
+ QString txt = text( 0 );
+ if ( rtti() == Function &&
+ MainWindow::self->currProject()->isCpp() &&
+ ( txt == "init()" || txt == "destroy()" ) ) {
+ listView()->setUpdatesEnabled( FALSE );
+ if ( txt == "init()" )
+ setText( 0, txt + " " + "(Constructor)" );
+ else
+ setText( 0, txt + " " + "(Destructor)" );
+ QListViewItem::paintCell( p, g, column, width, align );
+ setText( 0, txt );
+ listView()->setUpdatesEnabled( TRUE );
+ } else {
+ QListViewItem::paintCell( p, g, column, width, align );
+ }
+ p->save();
+ p->setPen( QPen( cg.dark(), 1 ) );
+ if ( column == 0 )
+ p->drawLine( 0, 0, 0, height() - 1 );
+ if ( listView()->firstChild() != this ) {
+ if ( nextSibling() != itemBelow() && itemBelow()->depth() < depth() ) {
+ int d = depth() - itemBelow()->depth();
+ p->drawLine( -listView()->treeStepSize() * d, height() - 1, 0, height() - 1 );
+ }
+ }
+ p->drawLine( 0, height() - 1, width, height() - 1 );
+ p->drawLine( width - 1, 0, width - 1, height() );
+ p->restore();
+}
+
+QColor HierarchyItem::backgroundColor()
+{
+ updateBackColor();
+ return backColor;
+}
+
+void HierarchyItem::updateBackColor()
+{
+ if ( listView()->firstChild() == this ) {
+ backColor = *backColor1;
+ return;
+ }
+
+ QListViewItemIterator it( this );
+ --it;
+ if ( it.current() ) {
+ if ( ( ( HierarchyItem*)it.current() )->backColor == *backColor1 )
+ backColor = *backColor2;
+ else
+ backColor = *backColor1;
+ } else {
+ backColor = *backColor1;
+ }
+}
+
+void HierarchyItem::setObject( QObject *o )
+{
+ obj = o;
+}
+
+QObject *HierarchyItem::object() const
+{
+ return obj;
+}
+
+void HierarchyItem::okRename( int col )
+{
+ if ( newItem == this )
+ newItem = 0;
+ QListViewItem::okRename( col );
+}
+
+void HierarchyItem::cancelRename( int col )
+{
+ if ( newItem == this ) {
+ newItem = 0;
+ QListViewItem::cancelRename( col );
+ delete this;
+ return;
+ }
+ QListViewItem::cancelRename( col );
+}
+
+
+
+
+HierarchyList::HierarchyList( QWidget *parent, FormWindow *fw, bool doConnects )
+ : QListView( parent ), formWindow( fw )
+{
+ init_colors();
+
+ setDefaultRenameAction( Accept );
+ header()->setMovingEnabled( FALSE );
+ header()->setStretchEnabled( TRUE );
+ normalMenu = 0;
+ tabWidgetMenu = 0;
+ addColumn( tr( "Name" ) );
+ addColumn( tr( "Class" ) );
+ QPalette p( palette() );
+ p.setColor( QColorGroup::Base, QColor( *backColor2 ) );
+ (void)*selectedBack; // hack
+ setPalette( p );
+ disconnect( header(), SIGNAL( sectionClicked( int ) ),
+ this, SLOT( changeSortColumn( int ) ) );
+ setSorting( -1 );
+ setHScrollBarMode( AlwaysOff );
+ setVScrollBarMode( AlwaysOn );
+ if ( doConnects ) {
+ connect( this, SIGNAL( clicked( QListViewItem * ) ),
+ this, SLOT( objectClicked( QListViewItem * ) ) );
+ connect( this, SIGNAL( doubleClicked( QListViewItem * ) ),
+ this, SLOT( objectDoubleClicked( QListViewItem * ) ) );
+ connect( this, SIGNAL( returnPressed( QListViewItem * ) ),
+ this, SLOT( objectClicked( QListViewItem * ) ) );
+ connect( this, SIGNAL( contextMenuRequested( QListViewItem *, const QPoint&, int ) ),
+ this, SLOT( showRMBMenu( QListViewItem *, const QPoint & ) ) );
+ }
+ deselect = TRUE;
+ setColumnWidthMode( 1, Manual );
+}
+
+void HierarchyList::keyPressEvent( QKeyEvent *e )
+{
+ if ( e->key() == Key_Shift || e->key() == Key_Control )
+ deselect = FALSE;
+ else
+ deselect = TRUE;
+ QListView::keyPressEvent( e );
+}
+
+void HierarchyList::keyReleaseEvent( QKeyEvent *e )
+{
+ deselect = TRUE;
+ QListView::keyReleaseEvent( e );
+}
+
+void HierarchyList::viewportMousePressEvent( QMouseEvent *e )
+{
+ if ( e->state() & ShiftButton || e->state() & ControlButton )
+ deselect = FALSE;
+ else
+ deselect = TRUE;
+ QListView::viewportMousePressEvent( e );
+}
+
+void HierarchyList::viewportMouseReleaseEvent( QMouseEvent *e )
+{
+ QListView::viewportMouseReleaseEvent( e );
+}
+
+QObject *HierarchyList::handleObjectClick( QListViewItem *i )
+{
+ if ( !i )
+ return 0;
+
+ QObject *o = findObject( i );
+ if ( !o )
+ return 0;
+ if ( formWindow == o ) {
+ if ( deselect )
+ formWindow->clearSelection( FALSE );
+ formWindow->emitShowProperties( formWindow );
+ return 0;
+ }
+ if ( o->isWidgetType() ) {
+ QWidget *w = (QWidget*)o;
+ if ( !formWindow->widgets()->find( w ) ) {
+ if ( ::qt_cast<QWidgetStack*>(w->parent()) ) {
+ if (::qt_cast<QTabWidget*>(w->parent()->parent()) ) {
+ ((QTabWidget*)w->parent()->parent())->showPage( w );
+ o = (QWidget*)w->parent()->parent();
+ formWindow->emitUpdateProperties( formWindow->currentWidget() );
+ } else if ( ::qt_cast<QWizard*>(w->parent()->parent()) ) {
+ ((QDesignerWizard*)w->parent()->parent())->
+ setCurrentPage( ( (QDesignerWizard*)w->parent()->parent() )->pageNum( w ) );
+ o = (QWidget*)w->parent()->parent();
+ formWindow->emitUpdateProperties( formWindow->currentWidget() );
+ } else {
+ ( (QWidgetStack*)w->parent() )->raiseWidget( w );
+ if ( (QWidgetStack*)w->parent()->isA( "QDesignerWidgetStack" ) )
+ ( (QDesignerWidgetStack*)w->parent() )->updateButtons();
+ }
+ } else if ( ::qt_cast<QMenuBar*>(w) || ::qt_cast<QDockWindow*>(w) ) {
+ formWindow->setActiveObject( w );
+ } else if ( ::qt_cast<QPopupMenu*>(w) ) {
+ return 0; // ### we could try to find our menu bar and change the currentMenu to our index
+ } else {
+ return 0;
+ }
+ }
+ } else if ( ::qt_cast<QAction*>(o) ) {
+ MainWindow::self->actioneditor()->setCurrentAction( (QAction*)o );
+ deselect = TRUE;
+ }
+
+ if ( deselect )
+ formWindow->clearSelection( FALSE );
+
+ return o;
+}
+
+
+void HierarchyList::objectDoubleClicked( QListViewItem *i )
+{
+ QObject *o = handleObjectClick( i );
+ if ( !o )
+ return;
+ if ( o->isWidgetType() && ( (QWidget*)o )->isVisibleTo( formWindow ) ) {
+ QWidget *w = (QWidget*)o;
+ if ( !w->parentWidget() ||
+ WidgetFactory::layoutType( w->parentWidget() ) == WidgetFactory::NoLayout )
+ w->raise();
+ formWindow->selectWidget( w, TRUE );
+ }
+}
+
+void HierarchyList::objectClicked( QListViewItem *i )
+{
+ QObject *o = handleObjectClick( i );
+ if ( !o )
+ return;
+ if ( o->isWidgetType() && ( (QWidget*)o )->isVisibleTo( formWindow ) ) {
+ QWidget *w = (QWidget*)o;
+ formWindow->selectWidget( w, TRUE );
+ }
+}
+
+QObject *HierarchyList::findObject( QListViewItem *i )
+{
+ return ( (HierarchyItem*)i )->object();
+}
+
+QListViewItem *HierarchyList::findItem( QObject *o )
+{
+ QListViewItemIterator it( this );
+ while ( it.current() ) {
+ if ( ( (HierarchyItem*)it.current() )->object() == o )
+ return it.current();
+ ++it;
+ }
+ return 0;
+}
+
+QObject *HierarchyList::current() const
+{
+ if ( currentItem() )
+ return ( (HierarchyItem*)currentItem() )->object();
+ return 0;
+}
+
+void HierarchyList::changeNameOf( QObject *o, const QString &name )
+{
+ QListViewItem *item = findItem( o );
+ if ( !item )
+ return;
+ item->setText( 0, name );
+}
+
+
+void HierarchyList::changeDatabaseOf( QObject *o, const QString &info )
+{
+#ifndef QT_NO_SQL
+ if ( !formWindow->isDatabaseAware() )
+ return;
+ QListViewItem *item = findItem( o );
+ if ( !item )
+ return;
+ item->setText( 2, info );
+#endif
+}
+
+static QPtrList<QWidgetStack> *widgetStacks = 0;
+
+void HierarchyList::setup()
+{
+ if ( !formWindow || formWindow->isFake() )
+ return;
+ clear();
+ QWidget *w = formWindow->mainContainer();
+#ifndef QT_NO_SQL
+ if ( formWindow->isDatabaseAware() ) {
+ if ( columns() == 2 ) {
+ addColumn( tr( "Database" ) );
+ header()->resizeSection( 0, 1 );
+ header()->resizeSection( 1, 1 );
+ header()->resizeSection( 2, 1 );
+ header()->adjustHeaderSize();
+ }
+ } else {
+ if ( columns() == 3 ) {
+ removeColumn( 2 );
+ }
+ }
+#endif
+ if ( !widgetStacks )
+ widgetStacks = new QPtrList<QWidgetStack>;
+ if ( w )
+ insertObject( w, 0 );
+ widgetStacks->clear();
+}
+
+void HierarchyList::setOpen( QListViewItem *i, bool b )
+{
+ QListView::setOpen( i, b );
+}
+
+void HierarchyList::insertObject( QObject *o, QListViewItem *parent )
+{
+ if ( QString( o->name() ).startsWith( "qt_dead_widget_" ) )
+ return;
+ bool fakeMainWindow = FALSE;
+ if ( ::qt_cast<QMainWindow*>(o) ) {
+ QObject *cw = ( (QMainWindow*)o )->centralWidget();
+ if ( cw ) {
+ o = cw;
+ fakeMainWindow = TRUE;
+ }
+ }
+ QListViewItem *item = 0;
+ QString className = WidgetFactory::classNameOf( o );
+ if ( ::qt_cast<QLayoutWidget*>(o) ) {
+ switch ( WidgetFactory::layoutType( (QWidget*)o ) ) {
+ case WidgetFactory::HBox:
+ className = "HBox";
+ break;
+ case WidgetFactory::VBox:
+ className = "VBox";
+ break;
+ case WidgetFactory::Grid:
+ className = "Grid";
+ break;
+ default:
+ break;
+ }
+ }
+
+ QString dbInfo;
+#ifndef QT_NO_SQL
+ dbInfo = MetaDataBase::fakeProperty( o, "database" ).toStringList().join(".");
+#endif
+
+ QString name = o->name();
+ if ( ::qt_cast<QWidgetStack*>(o->parent()) ) {
+ if ( ::qt_cast<QTabWidget*>(o->parent()->parent()) )
+ name = ( (QTabWidget*)o->parent()->parent() )->tabLabel( (QWidget*)o );
+ else if ( ::qt_cast<QWizard*>(o->parent()->parent()) )
+ name = ( (QWizard*)o->parent()->parent() )->title( (QWidget*)o );
+ }
+
+ QToolBox *tb;
+ if ( o->parent() && o->parent()->parent() &&
+ (tb = ::qt_cast<QToolBox*>(o->parent()->parent()->parent())) )
+ name = tb->itemLabel( tb->indexOf((QWidget*)o) );
+
+ if ( fakeMainWindow ) {
+ name = o->parent()->name();
+ className = "QMainWindow";
+ }
+
+ if ( !parent )
+ item = new HierarchyItem( HierarchyItem::Widget, this, 0, name, className, dbInfo );
+ else
+ item = new HierarchyItem( HierarchyItem::Widget, parent, 0, name, className, dbInfo );
+ item->setOpen( TRUE );
+ if ( !parent )
+ item->setPixmap( 0, QPixmap::fromMimeSource( "designer_form.png" ) );
+ else if ( ::qt_cast<QLayoutWidget*>(o) )
+ item->setPixmap( 0, QPixmap::fromMimeSource( "designer_layout.png" ));
+ else
+ item->setPixmap( 0, WidgetDatabase::iconSet(
+ WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( o ) ) ).
+ pixmap( QIconSet::Small, QIconSet::Normal ) );
+ if ( ::qt_cast<QAction*>(o) )
+ item->setPixmap( 0, ( (QAction*)o )->iconSet().pixmap() );
+
+ ( (HierarchyItem*)item )->setObject( o );
+ const QObjectList *l = o->children();
+ if ( ::qt_cast<QDesignerToolBar*>(o) )
+ l = 0;
+ if ( l ) {
+ QObjectListIt it( *l );
+ it.toLast();
+ for ( ; it.current(); --it ) {
+ if ( !it.current()->isWidgetType() ||
+ ( (QWidget*)it.current() )->isHidden() )
+ continue;
+ if ( !formWindow->widgets()->find( (QWidget*)it.current() ) ) {
+ if ( ::qt_cast<QWidgetStack*>(it.current()->parent()) ||
+ ::qt_cast<QWidgetStack*>(it.current()) ) {
+ QObject *obj = it.current();
+ QDesignerTabWidget *tw = ::qt_cast<QDesignerTabWidget*>(it.current()->parent());
+ QDesignerWizard *dw = ::qt_cast<QDesignerWizard*>(it.current()->parent());
+ QWidgetStack *stack = 0;
+ if ( dw || tw || ::qt_cast<QWidgetStack*>(obj) )
+ stack = (QWidgetStack*)obj;
+ else
+ stack = (QWidgetStack*)obj->parent();
+ if ( widgetStacks->findRef( stack ) != -1 )
+ continue;
+ widgetStacks->append( stack );
+ QObjectList *l2 = stack->queryList( "QWidget", 0, TRUE, FALSE );
+ for ( obj = l2->last(); obj; obj = l2->prev() ) {
+ if ( qstrcmp( obj->className(),
+ "QWidgetStackPrivate::Invisible" ) == 0 ||
+ ( tw && !tw->tabBar()->tab( stack->id( (QWidget*)obj ) ) ) ||
+ ( dw && dw->isPageRemoved( (QWidget*)obj ) ) )
+ continue;
+ if ( qstrcmp( obj->name(), "designer_wizardstack_button" ) == 0 )
+ continue;
+ if ( stack->id( (QWidget*)obj ) == -1 )
+ continue;
+ insertObject( obj, item );
+ }
+ delete l2;
+ } else if ( ::qt_cast<QToolBox*>(it.current()->parent()) ) {
+ if ( !::qt_cast<QScrollView*>(it.current()) )
+ continue;
+ QToolBox *tb = (QToolBox*)it.current()->parent();
+ for ( int i = tb->count() - 1; i >= 0; --i )
+ insertObject( tb->item( i ), item );
+ }
+ continue;
+ }
+ insertObject( it.current(), item );
+ }
+ }
+
+ if ( fakeMainWindow ) {
+ QObjectList *l = o->parent()->queryList( "QDesignerToolBar" );
+ QObject *obj;
+ for ( obj = l->first(); obj; obj = l->next() )
+ insertObject( obj, item );
+ delete l;
+ l = o->parent()->queryList( "MenuBarEditor" );
+ for ( obj = l->first(); obj; obj = l->next() )
+ insertObject( obj, item );
+ delete l;
+ } else if ( ::qt_cast<QDesignerToolBar*>(o) || ::qt_cast<PopupMenuEditor*>(o) ) {
+ QPtrList<QAction> actions;
+ if ( ::qt_cast<QDesignerToolBar*>(o) )
+ actions = ( (QDesignerToolBar*)o )->insertedActions();
+ else
+ ( (PopupMenuEditor*)o )->insertedActions( actions );
+
+ QPtrListIterator<QAction> it( actions );
+ it.toLast();
+ while ( it.current() ) {
+ QAction *a = it.current();
+ if ( ::qt_cast<QDesignerAction*>(a) ) {
+ QDesignerAction *da = (QDesignerAction*)a;
+ if ( da->supportsMenu() )
+ insertObject( da, item );
+ else
+ insertObject( da->widget(), item );
+ } else if ( ::qt_cast<QDesignerActionGroup*>(a) ) {
+ insertObject( a, item );
+ }
+ --it;
+ }
+ } else if ( ::qt_cast<QDesignerActionGroup*>(o) && o->children() ) {
+ QObjectList *l = (QObjectList*)o->children();
+ for ( QObject *obj = l->last(); obj; obj = l->prev() ) {
+ if ( ::qt_cast<QDesignerAction*>(obj) ) {
+ QDesignerAction *da = (QDesignerAction*)obj;
+ if ( da->supportsMenu() )
+ insertObject( da, item );
+ else
+ insertObject( da->widget(), item );
+ } else if ( ::qt_cast<QDesignerActionGroup*>(obj) ) {
+ insertObject( obj, item );
+ }
+ }
+ } else if ( ::qt_cast<MenuBarEditor*>(o) ) {
+ MenuBarEditor *mb = (MenuBarEditor*)o;
+ for ( int i = mb->count() -1; i >= 0; --i ) {
+ MenuBarEditorItem *md = mb->item( i );
+ if ( !md || !md->menu() )
+ continue;
+ insertObject( md->menu(), item );
+ }
+ }
+}
+
+void HierarchyList::setCurrent( QObject *o )
+{
+ QListViewItemIterator it( this );
+ while ( it.current() ) {
+ if ( ( (HierarchyItem*)it.current() )->object() == o ) {
+ blockSignals( TRUE );
+ setCurrentItem( it.current() );
+ ensureItemVisible( it.current() );
+ blockSignals( FALSE );
+ return;
+ }
+ ++it;
+ }
+}
+
+void HierarchyList::showRMBMenu( QListViewItem *i, const QPoint & p )
+{
+ if ( !i )
+ return;
+
+ QObject *o = findObject( i );
+ if ( !o )
+ return;
+
+ if ( !o->isWidgetType() ||
+ ( o != formWindow && !formWindow->widgets()->find( (QWidget*)o ) ) )
+ return;
+
+ QWidget *w = (QWidget*)o;
+ if ( w->isVisibleTo( formWindow ) ) {
+ if ( !::qt_cast<QTabWidget*>(w) && !::qt_cast<QWizard*>(w) ) {
+ if ( !normalMenu )
+ normalMenu = formWindow->mainWindow()->setupNormalHierarchyMenu( this );
+ normalMenu->popup( p );
+ } else {
+ if ( !tabWidgetMenu )
+ tabWidgetMenu =
+ formWindow->mainWindow()->setupTabWidgetHierarchyMenu(
+ this, SLOT( addTabPage() ),
+ SLOT( removeTabPage() ) );
+ tabWidgetMenu->popup( p );
+ }
+ }
+}
+
+void HierarchyList::addTabPage()
+{
+ QObject *o = current();
+ if ( !o || !o->isWidgetType() )
+ return;
+ QWidget *w = (QWidget*)o;
+ if ( ::qt_cast<QTabWidget*>(w) ) {
+ QTabWidget *tw = (QTabWidget*)w;
+ AddTabPageCommand *cmd = new AddTabPageCommand( tr( "Add Page to %1" ).
+ arg( tw->name() ), formWindow,
+ tw, "Tab" );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ } else if ( ::qt_cast<QWizard*>(w) ) {
+ QWizard *wiz = (QWizard*)formWindow->mainContainer();
+ AddWizardPageCommand *cmd = new AddWizardPageCommand( tr( "Add Page to %1" ).
+ arg( wiz->name() ), formWindow,
+ wiz, "Page" );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+}
+
+void HierarchyList::removeTabPage()
+{
+ QObject *o = current();
+ if ( !o || !o->isWidgetType() )
+ return;
+ QWidget *w = (QWidget*)o;
+ if ( ::qt_cast<QTabWidget*>(w) ) {
+ QTabWidget *tw = (QTabWidget*)w;
+ if ( tw->currentPage() ) {
+ QDesignerTabWidget *dtw = (QDesignerTabWidget*)tw;
+ DeleteTabPageCommand *cmd =
+ new DeleteTabPageCommand( tr( "Delete Page %1 of %2" ).
+ arg( dtw->pageTitle() ).arg( tw->name() ),
+ formWindow, tw, tw->currentPage() );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+ } else if ( ::qt_cast<QWizard*>(w) ) {
+ QWizard *wiz = (QWizard*)formWindow->mainContainer();
+ if ( wiz->currentPage() ) {
+ QDesignerWizard *dw = (QDesignerWizard*)wiz;
+ DeleteWizardPageCommand *cmd =
+ new DeleteWizardPageCommand( tr( "Delete Page %1 of %2" ).
+ arg( dw->pageTitle() ).arg( wiz->name() ),
+ formWindow, wiz,
+ wiz->indexOf( wiz->currentPage() ), TRUE );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+ }
+}
+
+// ------------------------------------------------------------
+
+FormDefinitionView::FormDefinitionView( QWidget *parent, FormWindow *fw )
+ : HierarchyList( parent, fw, TRUE )
+{
+ header()->hide();
+ removeColumn( 1 );
+ connect( this, SIGNAL( itemRenamed( QListViewItem *, int, const QString & ) ),
+ this, SLOT( renamed( QListViewItem * ) ) );
+ popupOpen = FALSE;
+}
+
+void FormDefinitionView::setup()
+{
+ if ( popupOpen || !formWindow )
+ return;
+ if ( !formWindow->project()->isCpp() )
+ return;
+ QListViewItem *i = firstChild();
+ while ( i ) {
+ if ( i->rtti() == HierarchyItem::DefinitionParent ) {
+ QListViewItem *a = i;
+ i = i->nextSibling();
+ delete a;
+ continue;
+ }
+ i = i->nextSibling();
+ }
+
+ LanguageInterface *lIface = MetaDataBase::languageInterface( formWindow->project()->language() );
+ if ( lIface ) {
+ QStringList defs = lIface->definitions();
+ for ( QStringList::Iterator dit = defs.begin(); dit != defs.end(); ++dit ) {
+ HierarchyItem *itemDef = new HierarchyItem( HierarchyItem::DefinitionParent, this, 0,
+ tr( *dit ), QString::null, QString::null );
+ itemDef->setPixmap( 0, QPixmap::fromMimeSource( "designer_folder.png" ) );
+ itemDef->setOpen( TRUE );
+ QStringList entries =
+ lIface->definitionEntries( *dit, formWindow->mainWindow()->designerInterface() );
+ HierarchyItem *item = 0;
+ for ( QStringList::Iterator eit = entries.begin(); eit != entries.end(); ++eit ) {
+ item = new HierarchyItem( HierarchyItem::Definition,
+ itemDef, item, *eit, QString::null, QString::null );
+ item->setRenameEnabled( 0, TRUE );
+ }
+ }
+ lIface->release();
+ }
+ setupVariables();
+ refresh();
+}
+
+void FormDefinitionView::setupVariables()
+{
+ bool pubOpen, protOpen, privOpen;
+ pubOpen = protOpen = privOpen = TRUE;
+ QListViewItem *i = firstChild();
+ while ( i ) {
+ if ( i->rtti() == HierarchyItem::VarParent ) {
+ QListViewItem *a = i;
+ i = i->firstChild();
+ while ( i ) {
+ if ( i->rtti() == HierarchyItem::VarPublic )
+ pubOpen = i->isOpen();
+ else if ( i->rtti() == HierarchyItem::VarProtected )
+ protOpen = i->isOpen();
+ else if ( i->rtti() == HierarchyItem::VarPrivate )
+ privOpen = i->isOpen();
+ i = i->nextSibling();
+ }
+ delete a;
+ break;
+ }
+ i = i->nextSibling();
+ }
+
+ HierarchyItem *itemVar = new HierarchyItem( HierarchyItem::VarParent, this, 0, tr( "Class Variables" ),
+ QString::null, QString::null );
+ itemVar->setPixmap( 0, QPixmap::fromMimeSource( "designer_folder.png" ) );
+ itemVar->setOpen( TRUE );
+
+ itemVarPriv = new HierarchyItem( HierarchyItem::VarPrivate, itemVar, 0, tr( "private" ),
+ QString::null, QString::null );
+ itemVarProt = new HierarchyItem( HierarchyItem::VarProtected, itemVar, 0, tr( "protected" ),
+ QString::null, QString::null );
+ itemVarPubl = new HierarchyItem( HierarchyItem::VarPublic, itemVar, 0, tr( "public" ),
+ QString::null, QString::null );
+
+ QValueList<MetaDataBase::Variable> varList = MetaDataBase::variables( formWindow );
+ QValueList<MetaDataBase::Variable>::Iterator it = --( varList.end() );
+ if ( !varList.isEmpty() && itemVar ) {
+ for (;;) {
+ QListViewItem *item = 0;
+ if ( (*it).varAccess == "public" )
+ item = new HierarchyItem( HierarchyItem::Variable, itemVarPubl, 0, (*it).varName,
+ QString::null, QString::null );
+ else if ( (*it).varAccess == "private" )
+ item = new HierarchyItem( HierarchyItem::Variable, itemVarPriv, 0, (*it).varName,
+ QString::null, QString::null );
+ else // default is protected
+ item = new HierarchyItem( HierarchyItem::Variable, itemVarProt, 0, (*it).varName,
+ QString::null, QString::null );
+ item->setPixmap( 0, QPixmap::fromMimeSource( "designer_editslots.png" ) );
+ if ( it == varList.begin() )
+ break;
+ --it;
+ }
+ }
+ itemVar->setOpen( TRUE );
+ itemVarPriv->setOpen( privOpen );
+ itemVarProt->setOpen( protOpen );
+ itemVarPubl->setOpen( pubOpen );
+}
+
+void FormDefinitionView::refresh()
+{
+ if ( popupOpen || !formWindow || !formWindow->project()->isCpp() )
+ return;
+
+ bool fuPub, fuProt, fuPriv, slPub, slProt, slPriv;
+ fuPub = fuProt = fuPriv = slPub = slProt = slPriv = TRUE;
+ QListViewItem *i = firstChild();
+ while ( i ) {
+ if ( i->rtti() == HierarchyItem::SlotParent ||
+ i->rtti() == HierarchyItem::FunctParent ) {
+ QListViewItem *a = i;
+ i = i->firstChild();
+ while ( i ) {
+ switch( i->rtti() ) {
+ case HierarchyItem::FunctPublic:
+ fuPub = i->isOpen();
+ case HierarchyItem::FunctProtected:
+ fuProt = i->isOpen();
+ break;
+ case HierarchyItem::FunctPrivate:
+ fuPriv = i->isOpen();
+ break;
+ case HierarchyItem::SlotPublic:
+ slPub = i->isOpen();
+ if ( slPub )
+ break;
+ case HierarchyItem::SlotProtected:
+ slProt = i->isOpen();
+ break;
+ case HierarchyItem::SlotPrivate:
+ slPriv = i->isOpen();
+ }
+ i = i->nextSibling();
+ }
+ i = a->nextSibling();
+ delete a;
+ continue;
+ }
+ i = i->nextSibling();
+ }
+
+
+ itemFunct = new HierarchyItem( HierarchyItem::FunctParent,
+ this, 0, tr( "Functions" ), QString::null, QString::null );
+ itemFunct->moveItem( i );
+ itemFunct->setPixmap( 0, QPixmap::fromMimeSource( "designer_folder.png" ) );
+ itemFunctPriv = new HierarchyItem( HierarchyItem::FunctPrivate, itemFunct, 0,
+ tr( "private" ), QString::null, QString::null );
+ itemFunctProt = new HierarchyItem( HierarchyItem::FunctProtected, itemFunct, 0,
+ tr( "protected" ), QString::null, QString::null );
+ itemFunctPubl = new HierarchyItem( HierarchyItem::FunctPublic, itemFunct, 0,
+ tr( "public" ), QString::null, QString::null );
+
+ itemSlots = new HierarchyItem( HierarchyItem::SlotParent,
+ this, 0, tr( "Slots" ), QString::null, QString::null );
+ itemSlots->setPixmap( 0, QPixmap::fromMimeSource( "designer_folder.png" ) );
+ itemPrivate = new HierarchyItem( HierarchyItem::SlotPrivate, itemSlots, 0, tr( "private" ),
+ QString::null, QString::null );
+ itemProtected = new HierarchyItem( HierarchyItem::SlotProtected, itemSlots, 0, tr( "protected" ),
+ QString::null, QString::null );
+ itemPublic = new HierarchyItem( HierarchyItem::SlotPublic, itemSlots, 0, tr( "public" ),
+ QString::null, QString::null );
+
+ QValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( formWindow );
+ QValueList<MetaDataBase::Function>::Iterator it = --( functionList.end() );
+ if ( !functionList.isEmpty() && itemFunct ) {
+ for (;;) {
+ QListViewItem *item = 0;
+ if ( (*it).type == "slot" ) {
+ if ( (*it).access == "protected" )
+ item = new HierarchyItem( HierarchyItem::Slot, itemProtected, 0, (*it).function,
+ QString::null, QString::null );
+ else if ( (*it).access == "private" )
+ item = new HierarchyItem( HierarchyItem::Slot, itemPrivate, 0, (*it).function,
+ QString::null, QString::null );
+ else // default is public
+ item = new HierarchyItem( HierarchyItem::Slot, itemPublic, 0, (*it).function,
+ QString::null, QString::null );
+ } else {
+ if ( (*it).access == "protected" )
+ item = new HierarchyItem( HierarchyItem::Function, itemFunctProt, 0, (*it).function,
+ QString::null, QString::null );
+ else if ( (*it).access == "private" )
+ item = new HierarchyItem( HierarchyItem::Function, itemFunctPriv, 0, (*it).function,
+ QString::null, QString::null );
+ else // default is public
+ item = new HierarchyItem( HierarchyItem::Function, itemFunctPubl, 0, (*it).function,
+ QString::null, QString::null );
+ }
+ item->setPixmap( 0, QPixmap::fromMimeSource( "designer_editslots.png" ) );
+ if ( it == functionList.begin() )
+ break;
+ --it;
+ }
+ }
+
+ itemFunct->setOpen( TRUE );
+ itemFunctPubl->setOpen( fuPub );
+ itemFunctProt->setOpen( fuProt );
+ itemFunctPriv->setOpen( fuPriv );
+
+ itemSlots->setOpen( TRUE );
+ itemPublic->setOpen( slPub );
+ itemProtected->setOpen( slProt );
+ itemPrivate->setOpen( slPriv );
+}
+
+
+void FormDefinitionView::setCurrent( QWidget * )
+{
+}
+
+void FormDefinitionView::objectClicked( QListViewItem *i )
+{
+ if ( !i )
+ return;
+ if ( (i->rtti() == HierarchyItem::Slot) || (i->rtti() == HierarchyItem::Function) )
+ formWindow->mainWindow()->editFunction( i->text( 0 ) );
+}
+
+static HierarchyItem::Type getChildType( int type )
+{
+ switch ( (HierarchyItem::Type)type ) {
+ case HierarchyItem::Widget:
+ qWarning( "getChildType: Inserting childs dynamically to Widget or SlotParent is not allowed!" );
+ break;
+ case HierarchyItem::SlotParent:
+ case HierarchyItem::SlotPublic:
+ case HierarchyItem::SlotProtected:
+ case HierarchyItem::SlotPrivate:
+ case HierarchyItem::Slot:
+ return HierarchyItem::Slot;
+ case HierarchyItem::DefinitionParent:
+ case HierarchyItem::Definition:
+ return HierarchyItem::Definition;
+ case HierarchyItem::Event:
+ case HierarchyItem::EventFunction:
+ return HierarchyItem::Event;
+ case HierarchyItem::FunctParent:
+ case HierarchyItem::FunctPublic:
+ case HierarchyItem::FunctProtected:
+ case HierarchyItem::FunctPrivate:
+ case HierarchyItem::Function:
+ return HierarchyItem::Function;
+ case HierarchyItem::VarParent:
+ case HierarchyItem::VarPublic:
+ case HierarchyItem::VarProtected:
+ case HierarchyItem::VarPrivate:
+ case HierarchyItem::Variable:
+ return HierarchyItem::Variable;
+ }
+ return (HierarchyItem::Type)type;
+}
+
+void HierarchyList::insertEntry( QListViewItem *i, const QPixmap &pix, const QString &s )
+{
+ QListViewItem *after = i->firstChild();
+ while ( after && after->nextSibling() )
+ after = after->nextSibling();
+ HierarchyItem *item = new HierarchyItem( getChildType( i->rtti() ), i, after, s,
+ QString::null, QString::null );
+ if ( !pix.isNull() )
+ item->setPixmap( 0, pix );
+ item->setRenameEnabled( 0, TRUE );
+ setCurrentItem( item );
+ ensureItemVisible( item );
+ qApp->processEvents();
+ newItem = item;
+ item->startRename( 0 );
+}
+
+void FormDefinitionView::contentsMouseDoubleClickEvent( QMouseEvent *e )
+{
+ QListViewItem *i = itemAt( contentsToViewport( e->pos() ) );
+ if ( !i )
+ return;
+
+ if ( i->rtti() == HierarchyItem::SlotParent || i->rtti() == HierarchyItem::FunctParent ||
+ i->rtti() == HierarchyItem::VarParent )
+ return;
+
+ HierarchyItem::Type t = getChildType( i->rtti() );
+ if ( (int)t == i->rtti() )
+ i = i->parent();
+
+ if ( formWindow->project()->isCpp() )
+ switch( i->rtti() ) {
+ case HierarchyItem::FunctPublic:
+ execFunctionDialog( "public", "function", TRUE );
+ break;
+ case HierarchyItem::FunctProtected:
+ execFunctionDialog( "protected", "function", TRUE );
+ break;
+ case HierarchyItem::FunctPrivate:
+ execFunctionDialog( "private", "function", TRUE );
+ break;
+ case HierarchyItem::SlotPublic:
+ execFunctionDialog( "public", "slot", TRUE );
+ break;
+ case HierarchyItem::SlotProtected:
+ execFunctionDialog( "protected", "slot", TRUE );
+ break;
+ case HierarchyItem::SlotPrivate:
+ execFunctionDialog( "private", "slot", TRUE );
+ break;
+ case HierarchyItem::VarPublic:
+ case HierarchyItem::VarProtected:
+ case HierarchyItem::VarPrivate: {
+ VariableDialog varDia( formWindow, this );
+ QListViewItem *i = selectedItem();
+ if ( i )
+ varDia.setCurrentItem( i->text( 0 ) );
+ varDia.exec();
+ break;
+ }
+ default:
+ insertEntry( i );
+ } else
+ insertEntry( i );
+}
+
+void FormDefinitionView::execFunctionDialog( const QString &access, const QString &type, bool addFunc )
+{
+ FormFile *formFile = formWindow->formFile();
+ if ( !formFile || !formFile->isUihFileUpToDate() )
+ return;
+
+ // refresh the functions list in the metadatabase
+ SourceEditor *editor = formFile->editor();
+ if ( editor )
+ editor->refresh( TRUE );
+
+ EditFunctions dlg( this, formWindow );
+ if ( addFunc )
+ dlg.functionAdd( access, type );
+ dlg.exec();
+}
+
+void FormDefinitionView::showRMBMenu( QListViewItem *i, const QPoint &pos )
+{
+ if ( !i )
+ return;
+
+ const int EDIT = 1;
+ const int NEW = 2;
+ const int DEL = 3;
+ const int PROPS = 4;
+ const int GOIMPL = 5;
+
+ QPopupMenu menu;
+ bool insertDelete = FALSE;
+
+ if ( i->rtti() == HierarchyItem::FunctParent || i->rtti() == HierarchyItem::SlotParent ||
+ i->rtti() == HierarchyItem::VarParent ) {
+ menu.insertItem( QPixmap::fromMimeSource( "designer_editslots.png" ), tr( "Edit..." ), EDIT );
+ } else
+ menu.insertItem( QPixmap::fromMimeSource( "designer_filenew.png" ), tr( "New" ), NEW );
+ if ( i->rtti() == HierarchyItem::DefinitionParent || i->rtti() == HierarchyItem::Variable ||
+ i->rtti() == HierarchyItem::Definition ) {
+ menu.insertItem( QPixmap::fromMimeSource( "designer_editslots.png" ), tr( "Edit..." ), EDIT );
+ }
+ if ( i->rtti() == HierarchyItem::Function || i->rtti() == HierarchyItem::Slot ) {
+ if ( formWindow->project()->isCpp() )
+ menu.insertItem( QPixmap::fromMimeSource( "designer_editslots.png" ), tr( "Properties..." ), PROPS );
+ if ( MetaDataBase::hasEditor( formWindow->project()->language() ) )
+ menu.insertItem( tr( "Goto Implementation" ), GOIMPL );
+ insertDelete = TRUE;
+ }
+ if ( insertDelete || i->rtti() == HierarchyItem::Variable ||
+ i->rtti() == HierarchyItem::Function || i->rtti() == HierarchyItem::Slot ||
+ i->rtti() == HierarchyItem::Definition ) {
+ menu.insertSeparator();
+ menu.insertItem( QPixmap::fromMimeSource( "designer_editcut.png" ), tr( "Delete..." ), DEL );
+ }
+ popupOpen = TRUE;
+ int res = menu.exec( pos );
+ popupOpen = FALSE;
+ if ( res == -1 )
+ return;
+
+ if ( res == EDIT ) {
+ switch( i->rtti() ) {
+ case HierarchyItem::FunctParent:
+ execFunctionDialog( "public", "function", FALSE );
+ break;
+ case HierarchyItem::SlotParent:
+ execFunctionDialog( "public", "slot", FALSE );
+ break;
+ case HierarchyItem::VarParent:
+ case HierarchyItem::VarPublic:
+ case HierarchyItem::VarProtected:
+ case HierarchyItem::VarPrivate:
+ case HierarchyItem::Variable: {
+ VariableDialog varDia( formWindow, this );
+ QListViewItem *i = selectedItem();
+ if ( i )
+ varDia.setCurrentItem( i->text( 0 ) );
+ if ( varDia.exec() == QDialog::Accepted )
+ formWindow->commandHistory()->setModified( TRUE );
+ break;
+ }
+ case HierarchyItem::Definition:
+ case HierarchyItem::DefinitionParent:
+ LanguageInterface *lIface = MetaDataBase::languageInterface( formWindow->project()->language() );
+ if ( !lIface )
+ return;
+ if ( i->rtti() == HierarchyItem::Definition )
+ i = i->parent();
+ ListEditor dia( this, 0, TRUE );
+ dia.setCaption( tr( "Edit %1" ).arg( i->text( 0 ) ) );
+ QStringList entries = lIface->definitionEntries( i->text( 0 ), MainWindow::self->designerInterface() );
+ dia.setList( entries );
+ dia.exec();
+ Command *cmd = new EditDefinitionsCommand( tr( "Edit " ) + i->text( 0 ), formWindow,
+ lIface, i->text( 0 ), dia.items() );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+ } else if ( res == NEW ) {
+ HierarchyItem::Type t = getChildType( i->rtti() );
+ if ( (int)t == i->rtti() )
+ i = i->parent();
+ switch( i->rtti() ) {
+ case HierarchyItem::SlotPublic:
+ execFunctionDialog( "public", "slot", TRUE );
+ break;
+ case HierarchyItem::SlotProtected:
+ execFunctionDialog( "protected", "slot", TRUE );
+ break;
+ case HierarchyItem::SlotPrivate:
+ execFunctionDialog( "private" , "slot", TRUE );
+ break;
+ case HierarchyItem::FunctPublic:
+ execFunctionDialog( "public", "function", TRUE );
+ break;
+ case HierarchyItem::FunctProtected:
+ execFunctionDialog( "protected", "function", TRUE );
+ break;
+ case HierarchyItem::FunctPrivate:
+ execFunctionDialog( "private" , "function", TRUE );
+ break;
+ default:
+ insertEntry( i );
+ }
+ } else if ( res == DEL ) {
+ if ( i->rtti() == HierarchyItem::Slot || i->rtti() == HierarchyItem::Function ) {
+
+ QCString funct( MetaDataBase::normalizeFunction( i->text( 0 ) ).latin1() );
+ Command *cmd = new RemoveFunctionCommand( tr( "Remove function" ), formWindow, funct,
+ QString::null, QString::null, QString::null,
+ QString::null, formWindow->project()->language() );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ formWindow->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ } else if ( i->rtti() == HierarchyItem::Variable ) {
+ Command *cmd = new RemoveVariableCommand( tr( "Remove variable" ), formWindow,
+ i->text( 0 ) );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ } else {
+ QListViewItem *p = i->parent();
+ delete i;
+ save( p, 0 );
+ }
+ } else if ( res == PROPS ) {
+ if ( i->rtti() == HierarchyItem::Slot ||
+ i->rtti() == HierarchyItem::Function ) {
+ EditFunctions dlg( this, formWindow );
+ dlg.setCurrentFunction( MetaDataBase::normalizeFunction( i->text( 0 ) ) );
+ dlg.exec();
+ }
+ } else if ( res == GOIMPL ) {
+ if ( i->rtti() == HierarchyItem::Slot ||
+ i->rtti() == HierarchyItem::Function ) {
+ formWindow->mainWindow()->editFunction( i->text( 0 ) );
+ }
+ }
+}
+
+void FormDefinitionView::renamed( QListViewItem *i )
+{
+ if ( newItem == i )
+ newItem = 0;
+ if ( !i->parent() )
+ return;
+ save( i->parent(), i );
+}
+
+
+void FormDefinitionView::save( QListViewItem *p, QListViewItem *i )
+{
+ if ( i && i->text( 0 ).isEmpty() ) {
+ delete i;
+ return;
+ }
+
+ if ( i && i->rtti() == HierarchyItem::Variable ) {
+ i->setRenameEnabled( 0, FALSE );
+ QString varName = i->text( 0 );
+ varName = varName.simplifyWhiteSpace();
+ if ( varName[(int)varName.length() - 1] != ';' )
+ varName += ";";
+ if ( MetaDataBase::hasVariable( formWindow, varName ) ) {
+ QMessageBox::information( this, tr( "Edit Variables" ),
+ tr( "This variable has already been declared!" ) );
+ } else {
+ if ( p->rtti() == HierarchyItem::VarPublic )
+ addVariable( varName, "public" );
+ else if ( p->rtti() == HierarchyItem::VarProtected )
+ addVariable( varName, "protected" );
+ else if ( p->rtti() == HierarchyItem::VarPrivate )
+ addVariable( varName, "private" );
+ }
+ } else {
+ LanguageInterface *lIface = MetaDataBase::languageInterface( formWindow->project()->language() );
+ if ( !lIface )
+ return;
+ QStringList lst;
+ i = p->firstChild();
+ while ( i ) {
+ lst << i->text( 0 );
+ i = i->nextSibling();
+ }
+ Command *cmd = new EditDefinitionsCommand( tr( "Edit " ) + p->text( 0 ), formWindow,
+ lIface, p->text( 0 ), lst );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+}
+
+void FormDefinitionView::addVariable( const QString &varName, const QString &access )
+{
+ Command *cmd = new AddVariableCommand( tr( "Add variable" ), formWindow,
+ varName, access );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+// ------------------------------------------------------------
+
+HierarchyView::HierarchyView( QWidget *parent )
+ : QTabWidget( parent, 0, WStyle_Customize | WStyle_NormalBorder | WStyle_Title |
+ WStyle_Tool |WStyle_MinMax | WStyle_SysMenu )
+{
+ formwindow = 0;
+ editor = 0;
+ listview = new HierarchyList( this, formWindow() );
+ fView = new FormDefinitionView( this, formWindow() );
+ if ( !MainWindow::self->singleProjectMode() ) {
+ addTab( listview, tr( "Objects" ) );
+ setTabToolTip( listview, tr( "List of all widgets and objects of the current form in hierarchical order" ) );
+ addTab( fView, tr( "Members" ) );
+ setTabToolTip( fView, tr( "List of all members of the current form" ) );
+ } else {
+ listview->hide();
+ fView->hide();
+ }
+
+ if ( !classBrowserInterfaceManager ) {
+ classBrowserInterfaceManager =
+ new QPluginManager<ClassBrowserInterface>( IID_ClassBrowser, QApplication::libraryPaths(),
+ MainWindow::self->pluginDirectory() );
+ }
+
+ classBrowsers = new QMap<QString, ClassBrowser>();
+ QStringList langs = MetaDataBase::languages();
+ for ( QStringList::Iterator it = langs.begin(); it != langs.end(); ++it ) {
+ QInterfacePtr<ClassBrowserInterface> ciface = 0;
+ classBrowserInterfaceManager->queryInterface( *it, &ciface );
+ if ( ciface ) {
+ ClassBrowser cb( ciface->createClassBrowser( this ), ciface );
+ addTab( cb.lv, tr( "Class Declarations" ) );
+ setTabToolTip( cb.lv, tr( "List of all classes and its declarations of the current source file" ) );
+ ciface->onClick( this, SLOT( jumpTo( const QString &, const QString &, int ) ) );
+ classBrowsers->insert( *it, cb );
+ setTabEnabled( cb.lv, FALSE );
+ }
+ }
+}
+
+HierarchyView::~HierarchyView()
+{
+}
+
+void HierarchyView::clear()
+{
+ listview->clear();
+ fView->clear();
+ for ( QMap<QString, ClassBrowser>::Iterator it = classBrowsers->begin();
+ it != classBrowsers->end(); ++it ) {
+ (*it).iface->clear();
+ }
+}
+
+void HierarchyView::setFormWindow( FormWindow *fw, QObject *o )
+{
+ bool fake = fw && qstrcmp( fw->name(), "qt_fakewindow" ) == 0;
+ if ( fw == 0 || o == 0 ) {
+ listview->clear();
+ fView->clear();
+ listview->setFormWindow( fw );
+ fView->setFormWindow( fw );
+ formwindow = 0;
+ editor = 0;
+ }
+
+ setTabEnabled( listview, TRUE );
+ setTabEnabled( fView, fw && fw->project()->isCpp() );
+
+ if ( fw == formwindow ) {
+ if ( fw ) {
+ if ( !fake )
+ listview->setCurrent( (QWidget*)o );
+ else
+ listview->clear();
+ if ( MainWindow::self->qWorkspace()->activeWindow() == fw )
+ showPage( listview );
+ else if ( fw->project()->isCpp() )
+ showPage( fView );
+ else
+ showClasses( fw->formFile()->editor() );
+ }
+ }
+
+ formwindow = fw;
+ if ( !fake ) {
+ listview->setFormWindow( fw );
+ } else {
+ listview->setFormWindow( 0 );
+ listview->clear();
+ }
+
+ fView->setFormWindow( fw );
+ if ( !fake ) {
+ listview->setup();
+ listview->setCurrent( (QWidget*)o );
+ }
+ fView->setup();
+
+ for ( QMap<QString, ClassBrowser>::Iterator it = classBrowsers->begin();
+ it != classBrowsers->end(); ++it ) {
+ (*it).iface->clear();
+ setTabEnabled( (*it).lv, fw && !fw->project()->isCpp() );
+ }
+
+ if ( MainWindow::self->qWorkspace()->activeWindow() == fw )
+ showPage( listview );
+ else if ( fw && fw->project()->isCpp() )
+ showPage( fView );
+ else if ( fw )
+ showClasses( fw->formFile()->editor() );
+
+ editor = 0;
+}
+
+void HierarchyView::showClasses( SourceEditor *se )
+{
+ if ( !se->object() )
+ return;
+
+ lastSourceEditor = se;
+ QTimer::singleShot( 100, this, SLOT( showClassesTimeout() ) );
+}
+
+void HierarchyView::showClassesTimeout()
+{
+ if ( !lastSourceEditor )
+ return;
+ SourceEditor *se = (SourceEditor*)lastSourceEditor;
+ if ( !se->object() )
+ return;
+ if ( se->formWindow() && se->formWindow()->project()->isCpp() ) {
+ setFormWindow( se->formWindow(), se->formWindow()->currentWidget() );
+ MainWindow::self->propertyeditor()->setWidget( se->formWindow()->currentWidget(),
+ se->formWindow() );
+ return;
+ }
+
+ setTabEnabled( listview, !!se->formWindow() && !se->formWindow()->isFake() );
+ setTabEnabled( fView, FALSE );
+
+ formwindow = 0;
+ listview->setFormWindow( 0 );
+ fView->setFormWindow( 0 );
+ listview->clear();
+ fView->clear();
+ if ( !se->formWindow() )
+ MainWindow::self->propertyeditor()->setWidget( 0, 0 );
+ editor = se;
+
+ for ( QMap<QString, ClassBrowser>::Iterator it = classBrowsers->begin();
+ it != classBrowsers->end(); ++it ) {
+ if ( it.key() == se->project()->language() ) {
+ (*it).iface->update( se->text() );
+ setTabEnabled( (*it).lv, TRUE );
+ showPage( (*it).lv );
+ } else {
+ setTabEnabled( (*it).lv, FALSE );
+ (*it).iface->clear();
+ }
+ }
+}
+
+void HierarchyView::updateClassBrowsers()
+{
+ if ( !editor )
+ return;
+ for ( QMap<QString, ClassBrowser>::Iterator it = classBrowsers->begin();
+ it != classBrowsers->end(); ++it ) {
+ if ( it.key() == editor->project()->language() )
+ (*it).iface->update( editor->text() );
+ else
+ (*it).iface->clear();
+ }
+}
+
+FormWindow *HierarchyView::formWindow() const
+{
+ return formwindow;
+}
+
+void HierarchyView::closeEvent( QCloseEvent *e )
+{
+ emit hidden();
+ e->accept();
+}
+
+void HierarchyView::widgetInserted( QWidget * )
+{
+ listview->setup();
+}
+
+void HierarchyView::widgetRemoved( QWidget * )
+{
+ listview->setup();
+}
+
+void HierarchyView::widgetsInserted( const QWidgetList & )
+{
+ listview->setup();
+}
+
+void HierarchyView::widgetsRemoved( const QWidgetList & )
+{
+ listview->setup();
+}
+
+void HierarchyView::namePropertyChanged( QWidget *w, const QVariant & )
+{
+ QWidget *w2 = w;
+ if ( ::qt_cast<QMainWindow*>(w) )
+ w2 = ( (QMainWindow*)w )->centralWidget();
+ listview->changeNameOf( w2, w->name() );
+}
+
+
+void HierarchyView::databasePropertyChanged( QWidget *w, const QStringList& info )
+{
+#ifndef QT_NO_SQL
+ QString i = info.join( "." );
+ listview->changeDatabaseOf( w, i );
+#endif
+}
+
+
+void HierarchyView::tabsChanged( QTabWidget * )
+{
+ listview->setup();
+}
+
+void HierarchyView::pagesChanged( QWizard * )
+{
+ listview->setup();
+}
+
+void HierarchyView::rebuild()
+{
+ listview->setup();
+}
+
+void HierarchyView::closed( FormWindow *fw )
+{
+ if ( fw == formwindow ) {
+ listview->clear();
+ fView->clear();
+ }
+}
+
+void HierarchyView::updateFormDefinitionView()
+{
+ fView->setup();
+}
+
+void HierarchyView::jumpTo( const QString &func, const QString &clss, int type )
+{
+ if ( !editor )
+ return;
+ if ( type == ClassBrowserInterface::Class )
+ editor->setClass( func );
+ else
+ editor->setFunction( func, clss );
+}
+
+HierarchyView::ClassBrowser::ClassBrowser( QListView *l, ClassBrowserInterface *i )
+ : lv( l ), iface( i )
+{
+}
+
+HierarchyView::ClassBrowser::~ClassBrowser()
+{
+}
diff --git a/tools/designer/designer/hierarchyview.h b/tools/designer/designer/hierarchyview.h
new file mode 100644
index 0000000..39a13a4
--- /dev/null
+++ b/tools/designer/designer/hierarchyview.h
@@ -0,0 +1,251 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef HIRARCHYVIEW_H
+#define HIRARCHYVIEW_H
+
+#include <qvariant.h>
+#include <qlistview.h>
+#include <qtabwidget.h>
+#include <qguardedptr.h>
+#include <private/qcom_p.h>
+#include "../interfaces/classbrowserinterface.h"
+
+class FormWindow;
+class QCloseEvent;
+class QPopupMenu;
+class QKeyEvent;
+class QMouseEvent;
+class QWizard;
+class SourceEditor;
+
+class HierarchyItem : public QListViewItem
+{
+public:
+ enum Type {
+ Widget,
+ SlotParent,
+ SlotPublic,
+ SlotProtected,
+ SlotPrivate,
+ Slot,
+ DefinitionParent,
+ Definition,
+ Event,
+ EventFunction,
+ FunctParent,
+ FunctPublic,
+ FunctProtected,
+ FunctPrivate,
+ Function,
+ VarParent,
+ VarPublic,
+ VarProtected,
+ VarPrivate,
+ Variable
+ };
+
+ HierarchyItem( Type type, QListViewItem *parent, QListViewItem *after,
+ const QString &txt1, const QString &txt2, const QString &txt3 );
+ HierarchyItem( Type type, QListView *parent, QListViewItem *after,
+ const QString &txt1, const QString &txt2, const QString &txt3 );
+
+ void paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int align );
+ void updateBackColor();
+
+ void setObject( QObject *o );
+ QObject *object() const;
+
+ void setText( int col, const QString &txt ) { if ( !txt.isEmpty() ) QListViewItem::setText( col, txt ); }
+
+ int rtti() const { return (int)typ; }
+
+private:
+ void okRename( int col );
+ void cancelRename( int col );
+
+private:
+ QColor backgroundColor();
+ QColor backColor;
+ QObject *obj;
+ Type typ;
+
+};
+
+class HierarchyList : public QListView
+{
+ Q_OBJECT
+
+public:
+ HierarchyList( QWidget *parent, FormWindow *fw, bool doConnects = TRUE );
+
+ virtual void setup();
+ virtual void setCurrent( QObject *o );
+ void setOpen( QListViewItem *i, bool b );
+ void changeNameOf( QObject *o, const QString &name );
+ void changeDatabaseOf( QObject *o, const QString &info );
+ void setFormWindow( FormWindow *fw ) { formWindow = fw; }
+ void drawContentsOffset( QPainter *p, int ox, int oy,
+ int cx, int cy, int cw, int ch ) {
+ setUpdatesEnabled( FALSE );
+ triggerUpdate();
+ setUpdatesEnabled( TRUE );
+ QListView::drawContentsOffset( p, ox, oy, cx, cy, cw, ch );
+ }
+
+ void insertEntry( QListViewItem *i, const QPixmap &pix = QPixmap(), const QString &s = QString::null );
+
+protected:
+ void keyPressEvent( QKeyEvent *e );
+ void keyReleaseEvent( QKeyEvent *e );
+ void viewportMousePressEvent( QMouseEvent *e );
+ void viewportMouseReleaseEvent( QMouseEvent *e );
+
+public slots:
+ void addTabPage();
+ void removeTabPage();
+
+private:
+ void insertObject( QObject *o, QListViewItem *parent );
+ QObject *findObject( QListViewItem *i );
+ QListViewItem *findItem( QObject *o );
+ QObject *current() const;
+ QObject *handleObjectClick( QListViewItem *i );
+
+private slots:
+ virtual void objectClicked( QListViewItem *i );
+ virtual void objectDoubleClicked( QListViewItem *i );
+ virtual void showRMBMenu( QListViewItem *, const QPoint & );
+
+protected:
+ FormWindow *formWindow;
+ QPopupMenu *normalMenu, *tabWidgetMenu;
+ bool deselect;
+
+};
+
+class FormDefinitionView : public HierarchyList
+{
+ Q_OBJECT
+
+public:
+ FormDefinitionView( QWidget *parent, FormWindow *fw );
+
+ void setup();
+ void setupVariables();
+ void refresh();
+ void setCurrent( QWidget *w );
+
+protected:
+ void contentsMouseDoubleClickEvent( QMouseEvent *e );
+
+private:
+ void save( QListViewItem *p, QListViewItem *i );
+ void execFunctionDialog( const QString &access, const QString &type, bool addFunc );
+ void addVariable( const QString &varName, const QString &access );
+
+private slots:
+ void objectClicked( QListViewItem *i );
+ void showRMBMenu( QListViewItem *, const QPoint & );
+ void renamed( QListViewItem *i );
+
+private:
+ bool popupOpen;
+ HierarchyItem *itemSlots, *itemPrivate, *itemProtected, *itemPublic;
+ HierarchyItem *itemFunct, *itemFunctPriv, *itemFunctProt, *itemFunctPubl;
+ HierarchyItem *itemVar, *itemVarPriv, *itemVarProt, *itemVarPubl;
+};
+
+
+class HierarchyView : public QTabWidget
+{
+ Q_OBJECT
+
+public:
+ HierarchyView( QWidget *parent );
+ ~HierarchyView();
+
+ void setFormWindow( FormWindow *fw, QObject *o );
+ FormWindow *formWindow() const;
+ SourceEditor *sourceEditor() const { return editor; }
+ void clear();
+
+ void showClasses( SourceEditor *se );
+ void updateClassBrowsers();
+
+ void widgetInserted( QWidget *w );
+ void widgetRemoved( QWidget *w );
+ void widgetsInserted( const QWidgetList &l );
+ void widgetsRemoved( const QWidgetList &l );
+ void namePropertyChanged( QWidget *w, const QVariant &old );
+ void databasePropertyChanged( QWidget *w, const QStringList& info );
+ void tabsChanged( QTabWidget *w );
+ void pagesChanged( QWizard *w );
+ void rebuild();
+ void closed( FormWindow *fw );
+ void updateFormDefinitionView();
+
+ FormDefinitionView *formDefinitionView() const { return fView; }
+ HierarchyList *hierarchyList() const { return listview; }
+
+protected slots:
+ void jumpTo( const QString &func, const QString &clss,int type );
+ void showClassesTimeout();
+
+protected:
+ void closeEvent( QCloseEvent *e );
+
+signals:
+ void hidden();
+
+private:
+ struct ClassBrowser
+ {
+ ClassBrowser( QListView * = 0, ClassBrowserInterface * = 0 );
+ ~ClassBrowser();
+ QListView *lv;
+ QInterfacePtr<ClassBrowserInterface> iface;
+
+ Q_DUMMY_COMPARISON_OPERATOR( ClassBrowser )
+ };
+ FormWindow *formwindow;
+ HierarchyList *listview;
+ FormDefinitionView *fView;
+ SourceEditor *editor;
+ QMap<QString, ClassBrowser> *classBrowsers;
+ QGuardedPtr<SourceEditor> lastSourceEditor;
+
+};
+
+
+#endif
diff --git a/tools/designer/designer/iconvieweditor.ui b/tools/designer/designer/iconvieweditor.ui
new file mode 100644
index 0000000..fe75dab
--- /dev/null
+++ b/tools/designer/designer/iconvieweditor.ui
@@ -0,0 +1,464 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>IconViewEditorBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>IconViewEditorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>567</width>
+ <height>321</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Iconview</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Edit Iconview&lt;/b&gt;&lt;p&gt;Add, edit or delete items in the icon view.&lt;/p&gt;&lt;p&gt;Click the &lt;b&gt;New Item&lt;/b&gt;-button to create a new item, then enter text and choose a pixmap.&lt;/p&gt;&lt;p&gt;Select an item from the view and click the &lt;b&gt;Delete Item&lt;/b&gt;-button to remove the item from the iconview.&lt;/p&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QIconView">
+ <property name="name">
+ <cstring>preview</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>All items in the iconview.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>itemNew</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Item</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Add an item</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Create a new item for the iconview.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>itemDelete</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Item</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete item</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Delete the selected item.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Vertical Spacing1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>&amp;Item Properties</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Label1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Text:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>itemText</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>itemText</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change text</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Change the text for the selected item.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>Label2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Pixmap:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>itemChoosePixmap</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>itemPixmap</cstring>
+ </property>
+ <property name="text">
+ <string>Label4</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>itemDeletePixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_editcut.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Delete the selected item's pixmap.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>itemChoosePixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select a Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select a pixmap file for the current item.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonApply</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Apply all changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>itemNew</sender>
+ <signal>clicked()</signal>
+ <receiver>IconViewEditorBase</receiver>
+ <slot>insertNewItem()</slot>
+ </connection>
+ <connection>
+ <sender>itemDelete</sender>
+ <signal>clicked()</signal>
+ <receiver>IconViewEditorBase</receiver>
+ <slot>deleteCurrentItem()</slot>
+ </connection>
+ <connection>
+ <sender>itemText</sender>
+ <signal>textChanged( const QString &amp; )</signal>
+ <receiver>IconViewEditorBase</receiver>
+ <slot>currentTextChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>IconViewEditorBase</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonApply</sender>
+ <signal>clicked()</signal>
+ <receiver>IconViewEditorBase</receiver>
+ <slot>applyClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>IconViewEditorBase</receiver>
+ <slot>cancelClicked()</slot>
+ </connection>
+ <connection>
+ <sender>itemChoosePixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>IconViewEditorBase</receiver>
+ <slot>choosePixmap()</slot>
+ </connection>
+ <connection>
+ <sender>preview</sender>
+ <signal>selectionChanged(QIconViewItem*)</signal>
+ <receiver>IconViewEditorBase</receiver>
+ <slot>currentItemChanged(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>preview</sender>
+ <signal>currentChanged(QIconViewItem*)</signal>
+ <receiver>IconViewEditorBase</receiver>
+ <slot>currentItemChanged(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>itemDeletePixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>IconViewEditorBase</receiver>
+ <slot>deletePixmap()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+ <tabstop>preview</tabstop>
+ <tabstop>itemNew</tabstop>
+ <tabstop>itemDelete</tabstop>
+ <tabstop>itemText</tabstop>
+ <tabstop>itemDeletePixmap</tabstop>
+ <tabstop>itemChoosePixmap</tabstop>
+ <tabstop>buttonHelp</tabstop>
+ <tabstop>buttonApply</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot access="protected">applyClicked()</slot>
+ <slot access="protected">cancelClicked()</slot>
+ <slot access="protected">choosePixmap()</slot>
+ <slot access="protected">currentItemChanged( QIconViewItem * )</slot>
+ <slot access="protected">currentTextChanged( const QString &amp; )</slot>
+ <slot access="protected">deleteCurrentItem()</slot>
+ <slot access="protected">insertNewItem()</slot>
+ <slot access="protected">deletePixmap()</slot>
+ <slot access="protected">okClicked()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/iconvieweditorimpl.cpp b/tools/designer/designer/iconvieweditorimpl.cpp
new file mode 100644
index 0000000..09a686a
--- /dev/null
+++ b/tools/designer/designer/iconvieweditorimpl.cpp
@@ -0,0 +1,170 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "iconvieweditorimpl.h"
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "pixmapchooser.h"
+
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qiconview.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+
+IconViewEditor::IconViewEditor( QWidget *parent, QWidget *editWidget, FormWindow *fw )
+ : IconViewEditorBase( parent, 0, TRUE ), formwindow( fw )
+{
+ connect( buttonHelp, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+ iconview = (QIconView*)editWidget;
+
+ itemText->setText( "" );
+ itemText->setEnabled( FALSE );
+ itemPixmap->setText( "" );
+ itemChoosePixmap->setEnabled( FALSE );
+ itemDeletePixmap->setEnabled( FALSE );
+
+ QIconViewItem *i = 0;
+ for ( i = iconview->firstItem(); i; i = i->nextItem() ) {
+ (void)new QIconViewItem( preview, i->text(), *i->pixmap() );
+ }
+
+ if ( preview->firstItem() )
+ preview->setCurrentItem( preview->firstItem() );
+}
+
+void IconViewEditor::insertNewItem()
+{
+ QIconViewItem *i = new QIconViewItem( preview, tr( "New Item" ) );
+ preview->setCurrentItem( i );
+ preview->setSelected( i, TRUE );
+ itemText->setFocus();
+ itemText->selectAll();
+}
+
+void IconViewEditor::deleteCurrentItem()
+{
+ delete preview->currentItem();
+ if ( preview->currentItem() )
+ preview->setSelected( preview->currentItem(), TRUE );
+}
+
+void IconViewEditor::currentItemChanged( QIconViewItem *i )
+{
+ itemText->blockSignals( TRUE );
+ itemText->setText( "" );
+ itemPixmap->setText( "" );
+ itemText->blockSignals( FALSE );
+
+ if ( !i ) {
+ itemText->setEnabled( FALSE );
+ itemChoosePixmap->setEnabled( FALSE );
+ return;
+ }
+
+ itemText->blockSignals( TRUE );
+ itemText->setEnabled( TRUE );
+ itemChoosePixmap->setEnabled( TRUE );
+ itemDeletePixmap->setEnabled( i->pixmap() && !i->pixmap()->isNull() );
+
+ itemText->setText( i->text() );
+ if ( i->pixmap() )
+ itemPixmap->setPixmap( *i->pixmap() );
+ itemText->blockSignals( FALSE );
+}
+
+void IconViewEditor::currentTextChanged( const QString &txt )
+{
+ if ( !preview->currentItem() )
+ return;
+
+ preview->currentItem()->setText( txt );
+}
+
+void IconViewEditor::okClicked()
+{
+ applyClicked();
+ accept();
+}
+
+void IconViewEditor::cancelClicked()
+{
+ reject();
+}
+
+void IconViewEditor::applyClicked()
+{
+ QIconViewItem *i = 0;
+ QValueList<PopulateIconViewCommand::Item> items;
+ for ( i = preview->firstItem(); i; i = i->nextItem() ) {
+ PopulateIconViewCommand::Item item;
+ if ( i->pixmap() )
+ item.pix = *i->pixmap();
+ item.text = i->text();
+ items.append( item );
+ }
+
+ PopulateIconViewCommand *cmd = new PopulateIconViewCommand( tr( "Edit the Items of '%1'" ).arg( iconview->name() ),
+ formwindow, iconview, items );
+ cmd->execute();
+ formwindow->commandHistory()->addCommand( cmd );
+}
+
+void IconViewEditor::choosePixmap()
+{
+ if ( !preview->currentItem() )
+ return;
+
+ QPixmap pix;
+ if ( preview->currentItem()->pixmap() )
+ pix = qChoosePixmap( this, formwindow, *preview->currentItem()->pixmap() );
+ else
+ pix = qChoosePixmap( this, formwindow, QPixmap() );
+
+ if ( pix.isNull() )
+ return;
+
+ preview->currentItem()->setPixmap( pix );
+ itemPixmap->setPixmap( pix );
+ itemDeletePixmap->setEnabled( TRUE );
+}
+
+void IconViewEditor::deletePixmap()
+{
+ if ( !preview->currentItem() )
+ return;
+
+ preview->currentItem()->setPixmap( QPixmap() );
+ itemPixmap->setText( "" );
+ itemDeletePixmap->setEnabled( FALSE );
+}
diff --git a/tools/designer/designer/iconvieweditorimpl.h b/tools/designer/designer/iconvieweditorimpl.h
new file mode 100644
index 0000000..21506f9
--- /dev/null
+++ b/tools/designer/designer/iconvieweditorimpl.h
@@ -0,0 +1,65 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef ICONVIEWEDITORIMPL_H
+#define ICONVIEWEDITORIMPL_H
+
+#include "iconvieweditor.h"
+
+class FormWindow;
+
+class IconViewEditor : public IconViewEditorBase
+{
+ Q_OBJECT
+
+public:
+ IconViewEditor( QWidget *parent, QWidget *editWidget, FormWindow *fw );
+
+protected slots:
+ void insertNewItem();
+ void deleteCurrentItem();
+ void currentItemChanged( QIconViewItem * );
+ void currentTextChanged( const QString & );
+ void okClicked();
+ void cancelClicked();
+ void applyClicked();
+ void choosePixmap();
+ void deletePixmap();
+
+private:
+ QIconView *iconview;
+ FormWindow *formwindow;
+
+};
+
+#endif
diff --git a/tools/designer/designer/images/designer_adjustsize.png b/tools/designer/designer/images/designer_adjustsize.png
new file mode 100644
index 0000000..6ade1e2
--- /dev/null
+++ b/tools/designer/designer/images/designer_adjustsize.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_appicon.png b/tools/designer/designer/images/designer_appicon.png
new file mode 100644
index 0000000..7aadcba
--- /dev/null
+++ b/tools/designer/designer/images/designer_appicon.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_arrow.png b/tools/designer/designer/images/designer_arrow.png
new file mode 100644
index 0000000..ec9c061
--- /dev/null
+++ b/tools/designer/designer/images/designer_arrow.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_background.png b/tools/designer/designer/images/designer_background.png
new file mode 100644
index 0000000..27d2e99
--- /dev/null
+++ b/tools/designer/designer/images/designer_background.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_book.png b/tools/designer/designer/images/designer_book.png
new file mode 100644
index 0000000..dd850ab
--- /dev/null
+++ b/tools/designer/designer/images/designer_book.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_buttongroup.png b/tools/designer/designer/images/designer_buttongroup.png
new file mode 100644
index 0000000..d89e28f
--- /dev/null
+++ b/tools/designer/designer/images/designer_buttongroup.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_checkbox.png b/tools/designer/designer/images/designer_checkbox.png
new file mode 100644
index 0000000..ab6f53e
--- /dev/null
+++ b/tools/designer/designer/images/designer_checkbox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_combobox.png b/tools/designer/designer/images/designer_combobox.png
new file mode 100644
index 0000000..7d4890a
--- /dev/null
+++ b/tools/designer/designer/images/designer_combobox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_connecttool.png b/tools/designer/designer/images/designer_connecttool.png
new file mode 100644
index 0000000..fca6748
--- /dev/null
+++ b/tools/designer/designer/images/designer_connecttool.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_cross.png b/tools/designer/designer/images/designer_cross.png
new file mode 100644
index 0000000..d5e9f0c
--- /dev/null
+++ b/tools/designer/designer/images/designer_cross.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_customwidget.png b/tools/designer/designer/images/designer_customwidget.png
new file mode 100644
index 0000000..ab790e1
--- /dev/null
+++ b/tools/designer/designer/images/designer_customwidget.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_adjustsize.png b/tools/designer/designer/images/designer_d_adjustsize.png
new file mode 100644
index 0000000..bbe30ff
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_adjustsize.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_book.png b/tools/designer/designer/images/designer_d_book.png
new file mode 100644
index 0000000..b61d611
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_book.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_buttongroup.png b/tools/designer/designer/images/designer_d_buttongroup.png
new file mode 100644
index 0000000..1e451a8
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_buttongroup.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_checkbox.png b/tools/designer/designer/images/designer_d_checkbox.png
new file mode 100644
index 0000000..1415eab
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_checkbox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_combobox.png b/tools/designer/designer/images/designer_d_combobox.png
new file mode 100644
index 0000000..5fb44ef
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_combobox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_connecttool.png b/tools/designer/designer/images/designer_d_connecttool.png
new file mode 100644
index 0000000..76a3b5f
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_connecttool.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_customwidget.png b/tools/designer/designer/images/designer_d_customwidget.png
new file mode 100644
index 0000000..5ea648f
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_customwidget.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_databrowser.png b/tools/designer/designer/images/designer_d_databrowser.png
new file mode 100644
index 0000000..115826a
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_databrowser.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_datatable.png b/tools/designer/designer/images/designer_d_datatable.png
new file mode 100644
index 0000000..7060dc3
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_datatable.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_dataview.png b/tools/designer/designer/images/designer_d_dataview.png
new file mode 100644
index 0000000..c507d41
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_dataview.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_dateedit.png b/tools/designer/designer/images/designer_d_dateedit.png
new file mode 100644
index 0000000..162e63a
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_dateedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_datetimeedit.png b/tools/designer/designer/images/designer_d_datetimeedit.png
new file mode 100644
index 0000000..82a7e14
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_datetimeedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_dial.png b/tools/designer/designer/images/designer_d_dial.png
new file mode 100644
index 0000000..a84869e
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_dial.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_down.png b/tools/designer/designer/images/designer_d_down.png
new file mode 100644
index 0000000..57b407e
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_down.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editbreaklayout.png b/tools/designer/designer/images/designer_d_editbreaklayout.png
new file mode 100644
index 0000000..2a36d67
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editbreaklayout.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editcopy.png b/tools/designer/designer/images/designer_d_editcopy.png
new file mode 100644
index 0000000..895e3c6
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editcopy.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editcut.png b/tools/designer/designer/images/designer_d_editcut.png
new file mode 100644
index 0000000..8d50ae0
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editcut.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editdelete.png b/tools/designer/designer/images/designer_d_editdelete.png
new file mode 100644
index 0000000..e960c58
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editdelete.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editgrid.png b/tools/designer/designer/images/designer_d_editgrid.png
new file mode 100644
index 0000000..ad2b87b
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editgrid.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_edithlayout.png b/tools/designer/designer/images/designer_d_edithlayout.png
new file mode 100644
index 0000000..dacaf82
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_edithlayout.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_edithlayoutsplit.png b/tools/designer/designer/images/designer_d_edithlayoutsplit.png
new file mode 100644
index 0000000..00a9605
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_edithlayoutsplit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editlower.png b/tools/designer/designer/images/designer_d_editlower.png
new file mode 100644
index 0000000..df7d371
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editlower.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editpaste.png b/tools/designer/designer/images/designer_d_editpaste.png
new file mode 100644
index 0000000..48acd7d
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editpaste.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editraise.png b/tools/designer/designer/images/designer_d_editraise.png
new file mode 100644
index 0000000..5f7f04b
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editraise.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editslots.png b/tools/designer/designer/images/designer_d_editslots.png
new file mode 100644
index 0000000..c2f900a
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editslots.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editvlayout.png b/tools/designer/designer/images/designer_d_editvlayout.png
new file mode 100644
index 0000000..ed202af
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editvlayout.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_editvlayoutsplit.png b/tools/designer/designer/images/designer_d_editvlayoutsplit.png
new file mode 100644
index 0000000..54ee44c
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_editvlayoutsplit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_filenew.png b/tools/designer/designer/images/designer_d_filenew.png
new file mode 100644
index 0000000..d5e7061
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_filenew.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_fileopen.png b/tools/designer/designer/images/designer_d_fileopen.png
new file mode 100644
index 0000000..ddbd33d
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_fileopen.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_filesave.png b/tools/designer/designer/images/designer_d_filesave.png
new file mode 100644
index 0000000..5d1476d
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_filesave.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_folder.png b/tools/designer/designer/images/designer_d_folder.png
new file mode 100644
index 0000000..4bed3ca
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_folder.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_form.png b/tools/designer/designer/images/designer_d_form.png
new file mode 100644
index 0000000..9f89d65
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_form.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_frame.png b/tools/designer/designer/images/designer_d_frame.png
new file mode 100644
index 0000000..09b21b2
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_frame.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_groupbox.png b/tools/designer/designer/images/designer_d_groupbox.png
new file mode 100644
index 0000000..e7e0108
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_groupbox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_help.png b/tools/designer/designer/images/designer_d_help.png
new file mode 100644
index 0000000..8f9d182
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_help.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_home.png b/tools/designer/designer/images/designer_d_home.png
new file mode 100644
index 0000000..b3906a4
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_home.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_iconview.png b/tools/designer/designer/images/designer_d_iconview.png
new file mode 100644
index 0000000..782c362
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_iconview.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_image.png b/tools/designer/designer/images/designer_d_image.png
new file mode 100644
index 0000000..f7cb29c
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_image.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_label.png b/tools/designer/designer/images/designer_d_label.png
new file mode 100644
index 0000000..bfbd5b8
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_label.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_layout.png b/tools/designer/designer/images/designer_d_layout.png
new file mode 100644
index 0000000..1ee6095
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_layout.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_lcdnumber.png b/tools/designer/designer/images/designer_d_lcdnumber.png
new file mode 100644
index 0000000..786747e
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_lcdnumber.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_left.png b/tools/designer/designer/images/designer_d_left.png
new file mode 100644
index 0000000..50d03bb
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_left.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_line.png b/tools/designer/designer/images/designer_d_line.png
new file mode 100644
index 0000000..25b0dae
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_line.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_lineedit.png b/tools/designer/designer/images/designer_d_lineedit.png
new file mode 100644
index 0000000..9d34ce9
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_lineedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_listbox.png b/tools/designer/designer/images/designer_d_listbox.png
new file mode 100644
index 0000000..d80c790
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_listbox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_listview.png b/tools/designer/designer/images/designer_d_listview.png
new file mode 100644
index 0000000..dc1338f
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_listview.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_multilineedit.png b/tools/designer/designer/images/designer_d_multilineedit.png
new file mode 100644
index 0000000..0532aee
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_multilineedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_newform.png b/tools/designer/designer/images/designer_d_newform.png
new file mode 100644
index 0000000..ace6130
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_newform.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_ordertool.png b/tools/designer/designer/images/designer_d_ordertool.png
new file mode 100644
index 0000000..61bdc7e
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_ordertool.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_pixlabel.png b/tools/designer/designer/images/designer_d_pixlabel.png
new file mode 100644
index 0000000..21e1f49
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_pixlabel.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_pointer.png b/tools/designer/designer/images/designer_d_pointer.png
new file mode 100644
index 0000000..e6903eb
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_pointer.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_print.png b/tools/designer/designer/images/designer_d_print.png
new file mode 100644
index 0000000..03ee9b2
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_print.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_progress.png b/tools/designer/designer/images/designer_d_progress.png
new file mode 100644
index 0000000..25d857a
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_progress.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_project.png b/tools/designer/designer/images/designer_d_project.png
new file mode 100644
index 0000000..b265eae
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_project.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_pushbutton.png b/tools/designer/designer/images/designer_d_pushbutton.png
new file mode 100644
index 0000000..635f35c
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_pushbutton.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_radiobutton.png b/tools/designer/designer/images/designer_d_radiobutton.png
new file mode 100644
index 0000000..e86eb8c
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_radiobutton.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_redo.png b/tools/designer/designer/images/designer_d_redo.png
new file mode 100644
index 0000000..6e993cc
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_redo.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_richtextedit.png b/tools/designer/designer/images/designer_d_richtextedit.png
new file mode 100644
index 0000000..ba7ada1
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_richtextedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_right.png b/tools/designer/designer/images/designer_d_right.png
new file mode 100644
index 0000000..9dbf2dd
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_right.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_scrollbar.png b/tools/designer/designer/images/designer_d_scrollbar.png
new file mode 100644
index 0000000..9a81897
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_scrollbar.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_searchfind.png b/tools/designer/designer/images/designer_d_searchfind.png
new file mode 100644
index 0000000..e85e33f
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_searchfind.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_setbuddy.png b/tools/designer/designer/images/designer_d_setbuddy.png
new file mode 100644
index 0000000..fe816aa
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_setbuddy.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_slider.png b/tools/designer/designer/images/designer_d_slider.png
new file mode 100644
index 0000000..a1ad5d5
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_slider.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_spacer.png b/tools/designer/designer/images/designer_d_spacer.png
new file mode 100644
index 0000000..15319d9
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_spacer.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_spinbox.png b/tools/designer/designer/images/designer_d_spinbox.png
new file mode 100644
index 0000000..cafbe01
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_spinbox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_table.png b/tools/designer/designer/images/designer_d_table.png
new file mode 100644
index 0000000..a95bde1
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_table.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_tabwidget.png b/tools/designer/designer/images/designer_d_tabwidget.png
new file mode 100644
index 0000000..0f0bad0
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_tabwidget.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textbold.png b/tools/designer/designer/images/designer_d_textbold.png
new file mode 100644
index 0000000..402a157
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textbold.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textbrowser.png b/tools/designer/designer/images/designer_d_textbrowser.png
new file mode 100644
index 0000000..b4315f9
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textbrowser.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textcenter.png b/tools/designer/designer/images/designer_d_textcenter.png
new file mode 100644
index 0000000..7a66036
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textcenter.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textedit.png b/tools/designer/designer/images/designer_d_textedit.png
new file mode 100644
index 0000000..6931414
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textfont.png b/tools/designer/designer/images/designer_d_textfont.png
new file mode 100644
index 0000000..beb2112
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textfont.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_texth1.png b/tools/designer/designer/images/designer_d_texth1.png
new file mode 100644
index 0000000..bfffe02
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_texth1.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_texth2.png b/tools/designer/designer/images/designer_d_texth2.png
new file mode 100644
index 0000000..e90437b
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_texth2.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_texth3.png b/tools/designer/designer/images/designer_d_texth3.png
new file mode 100644
index 0000000..dd527e3
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_texth3.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textitalic.png b/tools/designer/designer/images/designer_d_textitalic.png
new file mode 100644
index 0000000..253ed9c
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textitalic.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textjustify.png b/tools/designer/designer/images/designer_d_textjustify.png
new file mode 100644
index 0000000..3fb3cc3
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textjustify.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textlarger.png b/tools/designer/designer/images/designer_d_textlarger.png
new file mode 100644
index 0000000..ecc35f5
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textlarger.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textleft.png b/tools/designer/designer/images/designer_d_textleft.png
new file mode 100644
index 0000000..26db80f
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textleft.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textlinebreak.png b/tools/designer/designer/images/designer_d_textlinebreak.png
new file mode 100644
index 0000000..b48e323
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textlinebreak.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textparagraph.png b/tools/designer/designer/images/designer_d_textparagraph.png
new file mode 100644
index 0000000..a7ef75c
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textparagraph.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textright.png b/tools/designer/designer/images/designer_d_textright.png
new file mode 100644
index 0000000..d2954e9
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textright.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textsmaller.png b/tools/designer/designer/images/designer_d_textsmaller.png
new file mode 100644
index 0000000..00734e7
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textsmaller.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textteletext.png b/tools/designer/designer/images/designer_d_textteletext.png
new file mode 100644
index 0000000..6459730
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textteletext.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textunderline.png b/tools/designer/designer/images/designer_d_textunderline.png
new file mode 100644
index 0000000..4793445
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textunderline.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_textview.png b/tools/designer/designer/images/designer_d_textview.png
new file mode 100644
index 0000000..05ce9c6
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_textview.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_timeedit.png b/tools/designer/designer/images/designer_d_timeedit.png
new file mode 100644
index 0000000..955144e
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_timeedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_toolbox.png b/tools/designer/designer/images/designer_d_toolbox.png
new file mode 100644
index 0000000..e1f8447
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_toolbox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_toolbutton.png b/tools/designer/designer/images/designer_d_toolbutton.png
new file mode 100644
index 0000000..08e309a
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_toolbutton.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_undo.png b/tools/designer/designer/images/designer_d_undo.png
new file mode 100644
index 0000000..22ac97f
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_undo.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_up.png b/tools/designer/designer/images/designer_d_up.png
new file mode 100644
index 0000000..4c3ab7c
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_up.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_widgetstack.png b/tools/designer/designer/images/designer_d_widgetstack.png
new file mode 100644
index 0000000..c62f8e1
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_widgetstack.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_wizarddata.png b/tools/designer/designer/images/designer_d_wizarddata.png
new file mode 100644
index 0000000..fb540b8
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_wizarddata.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_wizarddialog.png b/tools/designer/designer/images/designer_d_wizarddialog.png
new file mode 100644
index 0000000..b83ca7e
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_wizarddialog.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_d_wordwrap.png b/tools/designer/designer/images/designer_d_wordwrap.png
new file mode 100644
index 0000000..f3f5d96
--- /dev/null
+++ b/tools/designer/designer/images/designer_d_wordwrap.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_databrowser.png b/tools/designer/designer/images/designer_databrowser.png
new file mode 100644
index 0000000..1dd9578
--- /dev/null
+++ b/tools/designer/designer/images/designer_databrowser.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_datatable.png b/tools/designer/designer/images/designer_datatable.png
new file mode 100644
index 0000000..5b3bfc7
--- /dev/null
+++ b/tools/designer/designer/images/designer_datatable.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_dataview.png b/tools/designer/designer/images/designer_dataview.png
new file mode 100644
index 0000000..5f6aad3
--- /dev/null
+++ b/tools/designer/designer/images/designer_dataview.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_dateedit.png b/tools/designer/designer/images/designer_dateedit.png
new file mode 100644
index 0000000..48286be
--- /dev/null
+++ b/tools/designer/designer/images/designer_dateedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_datetimeedit.png b/tools/designer/designer/images/designer_datetimeedit.png
new file mode 100644
index 0000000..68a5673
--- /dev/null
+++ b/tools/designer/designer/images/designer_datetimeedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_dial.png b/tools/designer/designer/images/designer_dial.png
new file mode 100644
index 0000000..3de30f1
--- /dev/null
+++ b/tools/designer/designer/images/designer_dial.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_down.png b/tools/designer/designer/images/designer_down.png
new file mode 100644
index 0000000..3269dec
--- /dev/null
+++ b/tools/designer/designer/images/designer_down.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editbreaklayout.png b/tools/designer/designer/images/designer_editbreaklayout.png
new file mode 100644
index 0000000..badbb8e
--- /dev/null
+++ b/tools/designer/designer/images/designer_editbreaklayout.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editcopy.png b/tools/designer/designer/images/designer_editcopy.png
new file mode 100644
index 0000000..2f931cb
--- /dev/null
+++ b/tools/designer/designer/images/designer_editcopy.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editcut.png b/tools/designer/designer/images/designer_editcut.png
new file mode 100644
index 0000000..a911482
--- /dev/null
+++ b/tools/designer/designer/images/designer_editcut.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editdelete.png b/tools/designer/designer/images/designer_editdelete.png
new file mode 100644
index 0000000..9f0491d
--- /dev/null
+++ b/tools/designer/designer/images/designer_editdelete.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editgrid.png b/tools/designer/designer/images/designer_editgrid.png
new file mode 100644
index 0000000..e1159bb
--- /dev/null
+++ b/tools/designer/designer/images/designer_editgrid.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_edithlayout.png b/tools/designer/designer/images/designer_edithlayout.png
new file mode 100644
index 0000000..1a2b150
--- /dev/null
+++ b/tools/designer/designer/images/designer_edithlayout.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_edithlayoutsplit.png b/tools/designer/designer/images/designer_edithlayoutsplit.png
new file mode 100644
index 0000000..cba102b
--- /dev/null
+++ b/tools/designer/designer/images/designer_edithlayoutsplit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editlower.png b/tools/designer/designer/images/designer_editlower.png
new file mode 100644
index 0000000..50605f2
--- /dev/null
+++ b/tools/designer/designer/images/designer_editlower.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editpaste.png b/tools/designer/designer/images/designer_editpaste.png
new file mode 100644
index 0000000..b1b7f85
--- /dev/null
+++ b/tools/designer/designer/images/designer_editpaste.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editraise.png b/tools/designer/designer/images/designer_editraise.png
new file mode 100644
index 0000000..f157251
--- /dev/null
+++ b/tools/designer/designer/images/designer_editraise.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editslots.png b/tools/designer/designer/images/designer_editslots.png
new file mode 100644
index 0000000..b86bddb
--- /dev/null
+++ b/tools/designer/designer/images/designer_editslots.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editvlayout.png b/tools/designer/designer/images/designer_editvlayout.png
new file mode 100644
index 0000000..f4cd3f9
--- /dev/null
+++ b/tools/designer/designer/images/designer_editvlayout.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_editvlayoutsplit.png b/tools/designer/designer/images/designer_editvlayoutsplit.png
new file mode 100644
index 0000000..0180cf5
--- /dev/null
+++ b/tools/designer/designer/images/designer_editvlayoutsplit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_filenew.png b/tools/designer/designer/images/designer_filenew.png
new file mode 100644
index 0000000..9520080
--- /dev/null
+++ b/tools/designer/designer/images/designer_filenew.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_fileopen.png b/tools/designer/designer/images/designer_fileopen.png
new file mode 100644
index 0000000..3005290
--- /dev/null
+++ b/tools/designer/designer/images/designer_fileopen.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_filesave.png b/tools/designer/designer/images/designer_filesave.png
new file mode 100644
index 0000000..c137165
--- /dev/null
+++ b/tools/designer/designer/images/designer_filesave.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_folder.png b/tools/designer/designer/images/designer_folder.png
new file mode 100644
index 0000000..7007e37
--- /dev/null
+++ b/tools/designer/designer/images/designer_folder.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_form.png b/tools/designer/designer/images/designer_form.png
new file mode 100644
index 0000000..08268bf
--- /dev/null
+++ b/tools/designer/designer/images/designer_form.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_frame.png b/tools/designer/designer/images/designer_frame.png
new file mode 100644
index 0000000..c070b9c
--- /dev/null
+++ b/tools/designer/designer/images/designer_frame.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_groupbox.png b/tools/designer/designer/images/designer_groupbox.png
new file mode 100644
index 0000000..4025b4d
--- /dev/null
+++ b/tools/designer/designer/images/designer_groupbox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_hand.png b/tools/designer/designer/images/designer_hand.png
new file mode 100644
index 0000000..dd8af74
--- /dev/null
+++ b/tools/designer/designer/images/designer_hand.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_help.png b/tools/designer/designer/images/designer_help.png
new file mode 100644
index 0000000..2ab2c25
--- /dev/null
+++ b/tools/designer/designer/images/designer_help.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_home.png b/tools/designer/designer/images/designer_home.png
new file mode 100644
index 0000000..806d11d
--- /dev/null
+++ b/tools/designer/designer/images/designer_home.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_hsplit.png b/tools/designer/designer/images/designer_hsplit.png
new file mode 100644
index 0000000..232faf1
--- /dev/null
+++ b/tools/designer/designer/images/designer_hsplit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_ibeam.png b/tools/designer/designer/images/designer_ibeam.png
new file mode 100644
index 0000000..6074c89
--- /dev/null
+++ b/tools/designer/designer/images/designer_ibeam.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_iconview.png b/tools/designer/designer/images/designer_iconview.png
new file mode 100644
index 0000000..13b8f15
--- /dev/null
+++ b/tools/designer/designer/images/designer_iconview.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_image.png b/tools/designer/designer/images/designer_image.png
new file mode 100644
index 0000000..29854df
--- /dev/null
+++ b/tools/designer/designer/images/designer_image.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_label.png b/tools/designer/designer/images/designer_label.png
new file mode 100644
index 0000000..5d7d7b4
--- /dev/null
+++ b/tools/designer/designer/images/designer_label.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_layout.png b/tools/designer/designer/images/designer_layout.png
new file mode 100644
index 0000000..168eb1f
--- /dev/null
+++ b/tools/designer/designer/images/designer_layout.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_lcdnumber.png b/tools/designer/designer/images/designer_lcdnumber.png
new file mode 100644
index 0000000..64eda5e
--- /dev/null
+++ b/tools/designer/designer/images/designer_lcdnumber.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_left.png b/tools/designer/designer/images/designer_left.png
new file mode 100644
index 0000000..e58177f
--- /dev/null
+++ b/tools/designer/designer/images/designer_left.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_line.png b/tools/designer/designer/images/designer_line.png
new file mode 100644
index 0000000..5c64dfb
--- /dev/null
+++ b/tools/designer/designer/images/designer_line.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_lineedit.png b/tools/designer/designer/images/designer_lineedit.png
new file mode 100644
index 0000000..75fc890
--- /dev/null
+++ b/tools/designer/designer/images/designer_lineedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_listbox.png b/tools/designer/designer/images/designer_listbox.png
new file mode 100644
index 0000000..1c58cb6
--- /dev/null
+++ b/tools/designer/designer/images/designer_listbox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_listview.png b/tools/designer/designer/images/designer_listview.png
new file mode 100644
index 0000000..d71cc1c
--- /dev/null
+++ b/tools/designer/designer/images/designer_listview.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_multilineedit.png b/tools/designer/designer/images/designer_multilineedit.png
new file mode 100644
index 0000000..26f7ef0
--- /dev/null
+++ b/tools/designer/designer/images/designer_multilineedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_newform.png b/tools/designer/designer/images/designer_newform.png
new file mode 100644
index 0000000..37779c1
--- /dev/null
+++ b/tools/designer/designer/images/designer_newform.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_no.png b/tools/designer/designer/images/designer_no.png
new file mode 100644
index 0000000..8bacc04
--- /dev/null
+++ b/tools/designer/designer/images/designer_no.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_object.png b/tools/designer/designer/images/designer_object.png
new file mode 100644
index 0000000..cc4192e
--- /dev/null
+++ b/tools/designer/designer/images/designer_object.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_ordertool.png b/tools/designer/designer/images/designer_ordertool.png
new file mode 100644
index 0000000..ad12283
--- /dev/null
+++ b/tools/designer/designer/images/designer_ordertool.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_pixlabel.png b/tools/designer/designer/images/designer_pixlabel.png
new file mode 100644
index 0000000..0d54d63
--- /dev/null
+++ b/tools/designer/designer/images/designer_pixlabel.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_pointer.png b/tools/designer/designer/images/designer_pointer.png
new file mode 100644
index 0000000..67e38a3
--- /dev/null
+++ b/tools/designer/designer/images/designer_pointer.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_print.png b/tools/designer/designer/images/designer_print.png
new file mode 100644
index 0000000..57e3e53
--- /dev/null
+++ b/tools/designer/designer/images/designer_print.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_progress.png b/tools/designer/designer/images/designer_progress.png
new file mode 100644
index 0000000..44ae094
--- /dev/null
+++ b/tools/designer/designer/images/designer_progress.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_project.png b/tools/designer/designer/images/designer_project.png
new file mode 100644
index 0000000..6a0fb96
--- /dev/null
+++ b/tools/designer/designer/images/designer_project.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_pushbutton.png b/tools/designer/designer/images/designer_pushbutton.png
new file mode 100644
index 0000000..61f779c
--- /dev/null
+++ b/tools/designer/designer/images/designer_pushbutton.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_qtlogo.png b/tools/designer/designer/images/designer_qtlogo.png
new file mode 100644
index 0000000..4e1a147
--- /dev/null
+++ b/tools/designer/designer/images/designer_qtlogo.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_radiobutton.png b/tools/designer/designer/images/designer_radiobutton.png
new file mode 100644
index 0000000..10c1d8c
--- /dev/null
+++ b/tools/designer/designer/images/designer_radiobutton.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_redo.png b/tools/designer/designer/images/designer_redo.png
new file mode 100644
index 0000000..abdad26
--- /dev/null
+++ b/tools/designer/designer/images/designer_redo.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_resetproperty.png b/tools/designer/designer/images/designer_resetproperty.png
new file mode 100644
index 0000000..cc0d6a2
--- /dev/null
+++ b/tools/designer/designer/images/designer_resetproperty.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_richtextedit.png b/tools/designer/designer/images/designer_richtextedit.png
new file mode 100644
index 0000000..73573a8
--- /dev/null
+++ b/tools/designer/designer/images/designer_richtextedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_right.png b/tools/designer/designer/images/designer_right.png
new file mode 100644
index 0000000..5f2f703
--- /dev/null
+++ b/tools/designer/designer/images/designer_right.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_s_down.png b/tools/designer/designer/images/designer_s_down.png
new file mode 100644
index 0000000..908e55e
--- /dev/null
+++ b/tools/designer/designer/images/designer_s_down.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_s_editcut.png b/tools/designer/designer/images/designer_s_editcut.png
new file mode 100644
index 0000000..7cf5a9e
--- /dev/null
+++ b/tools/designer/designer/images/designer_s_editcut.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_s_left.png b/tools/designer/designer/images/designer_s_left.png
new file mode 100644
index 0000000..e6e19f8
--- /dev/null
+++ b/tools/designer/designer/images/designer_s_left.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_s_right.png b/tools/designer/designer/images/designer_s_right.png
new file mode 100644
index 0000000..bfccda6
--- /dev/null
+++ b/tools/designer/designer/images/designer_s_right.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_s_up.png b/tools/designer/designer/images/designer_s_up.png
new file mode 100644
index 0000000..97705d4
--- /dev/null
+++ b/tools/designer/designer/images/designer_s_up.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_scrollbar.png b/tools/designer/designer/images/designer_scrollbar.png
new file mode 100644
index 0000000..466c58d
--- /dev/null
+++ b/tools/designer/designer/images/designer_scrollbar.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_searchfind.png b/tools/designer/designer/images/designer_searchfind.png
new file mode 100644
index 0000000..3f369fd
--- /dev/null
+++ b/tools/designer/designer/images/designer_searchfind.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_setbuddy.png b/tools/designer/designer/images/designer_setbuddy.png
new file mode 100644
index 0000000..5ae9e1a
--- /dev/null
+++ b/tools/designer/designer/images/designer_setbuddy.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_sizeall.png b/tools/designer/designer/images/designer_sizeall.png
new file mode 100644
index 0000000..fa2a266
--- /dev/null
+++ b/tools/designer/designer/images/designer_sizeall.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_sizeb.png b/tools/designer/designer/images/designer_sizeb.png
new file mode 100644
index 0000000..ac5235b
--- /dev/null
+++ b/tools/designer/designer/images/designer_sizeb.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_sizef.png b/tools/designer/designer/images/designer_sizef.png
new file mode 100644
index 0000000..28a30c2
--- /dev/null
+++ b/tools/designer/designer/images/designer_sizef.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_sizeh.png b/tools/designer/designer/images/designer_sizeh.png
new file mode 100644
index 0000000..7b8abd3
--- /dev/null
+++ b/tools/designer/designer/images/designer_sizeh.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_sizev.png b/tools/designer/designer/images/designer_sizev.png
new file mode 100644
index 0000000..80b3d8b
--- /dev/null
+++ b/tools/designer/designer/images/designer_sizev.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_slider.png b/tools/designer/designer/images/designer_slider.png
new file mode 100644
index 0000000..525bd1c
--- /dev/null
+++ b/tools/designer/designer/images/designer_slider.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_spacer.png b/tools/designer/designer/images/designer_spacer.png
new file mode 100644
index 0000000..926e8af
--- /dev/null
+++ b/tools/designer/designer/images/designer_spacer.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_spinbox.png b/tools/designer/designer/images/designer_spinbox.png
new file mode 100644
index 0000000..7ae2063
--- /dev/null
+++ b/tools/designer/designer/images/designer_spinbox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_splash.png b/tools/designer/designer/images/designer_splash.png
new file mode 100644
index 0000000..d3b62a1
--- /dev/null
+++ b/tools/designer/designer/images/designer_splash.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_table.png b/tools/designer/designer/images/designer_table.png
new file mode 100644
index 0000000..4bbd9c2
--- /dev/null
+++ b/tools/designer/designer/images/designer_table.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_tabwidget.png b/tools/designer/designer/images/designer_tabwidget.png
new file mode 100644
index 0000000..1254bb6
--- /dev/null
+++ b/tools/designer/designer/images/designer_tabwidget.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textbold.png b/tools/designer/designer/images/designer_textbold.png
new file mode 100644
index 0000000..7b5be47
--- /dev/null
+++ b/tools/designer/designer/images/designer_textbold.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textbrowser.png b/tools/designer/designer/images/designer_textbrowser.png
new file mode 100644
index 0000000..090e2f8
--- /dev/null
+++ b/tools/designer/designer/images/designer_textbrowser.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textcenter.png b/tools/designer/designer/images/designer_textcenter.png
new file mode 100644
index 0000000..5c68b09
--- /dev/null
+++ b/tools/designer/designer/images/designer_textcenter.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textedit.png b/tools/designer/designer/images/designer_textedit.png
new file mode 100644
index 0000000..4cdff14
--- /dev/null
+++ b/tools/designer/designer/images/designer_textedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textfont.png b/tools/designer/designer/images/designer_textfont.png
new file mode 100644
index 0000000..a4de87a
--- /dev/null
+++ b/tools/designer/designer/images/designer_textfont.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_texth1.png b/tools/designer/designer/images/designer_texth1.png
new file mode 100644
index 0000000..1c3aa2f
--- /dev/null
+++ b/tools/designer/designer/images/designer_texth1.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_texth2.png b/tools/designer/designer/images/designer_texth2.png
new file mode 100644
index 0000000..b3a02af
--- /dev/null
+++ b/tools/designer/designer/images/designer_texth2.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_texth3.png b/tools/designer/designer/images/designer_texth3.png
new file mode 100644
index 0000000..c02ea26
--- /dev/null
+++ b/tools/designer/designer/images/designer_texth3.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textitalic.png b/tools/designer/designer/images/designer_textitalic.png
new file mode 100644
index 0000000..68e2b44
--- /dev/null
+++ b/tools/designer/designer/images/designer_textitalic.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textjustify.png b/tools/designer/designer/images/designer_textjustify.png
new file mode 100644
index 0000000..1c6e5b9
--- /dev/null
+++ b/tools/designer/designer/images/designer_textjustify.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textlarger.png b/tools/designer/designer/images/designer_textlarger.png
new file mode 100644
index 0000000..20282b6
--- /dev/null
+++ b/tools/designer/designer/images/designer_textlarger.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textleft.png b/tools/designer/designer/images/designer_textleft.png
new file mode 100644
index 0000000..30b0501
--- /dev/null
+++ b/tools/designer/designer/images/designer_textleft.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textlinebreak.png b/tools/designer/designer/images/designer_textlinebreak.png
new file mode 100644
index 0000000..081a49e
--- /dev/null
+++ b/tools/designer/designer/images/designer_textlinebreak.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textparagraph.png b/tools/designer/designer/images/designer_textparagraph.png
new file mode 100644
index 0000000..dcd0b3e
--- /dev/null
+++ b/tools/designer/designer/images/designer_textparagraph.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textright.png b/tools/designer/designer/images/designer_textright.png
new file mode 100644
index 0000000..73f1cad
--- /dev/null
+++ b/tools/designer/designer/images/designer_textright.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textsmaller.png b/tools/designer/designer/images/designer_textsmaller.png
new file mode 100644
index 0000000..acf2577
--- /dev/null
+++ b/tools/designer/designer/images/designer_textsmaller.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textteletext.png b/tools/designer/designer/images/designer_textteletext.png
new file mode 100644
index 0000000..c020463
--- /dev/null
+++ b/tools/designer/designer/images/designer_textteletext.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textunderline.png b/tools/designer/designer/images/designer_textunderline.png
new file mode 100644
index 0000000..3477ccb
--- /dev/null
+++ b/tools/designer/designer/images/designer_textunderline.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_textview.png b/tools/designer/designer/images/designer_textview.png
new file mode 100644
index 0000000..ec2270c
--- /dev/null
+++ b/tools/designer/designer/images/designer_textview.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_timeedit.png b/tools/designer/designer/images/designer_timeedit.png
new file mode 100644
index 0000000..01b3788
--- /dev/null
+++ b/tools/designer/designer/images/designer_timeedit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_toolbox.png b/tools/designer/designer/images/designer_toolbox.png
new file mode 100644
index 0000000..2ab71dc
--- /dev/null
+++ b/tools/designer/designer/images/designer_toolbox.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_toolbutton.png b/tools/designer/designer/images/designer_toolbutton.png
new file mode 100644
index 0000000..49921a1
--- /dev/null
+++ b/tools/designer/designer/images/designer_toolbutton.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_undo.png b/tools/designer/designer/images/designer_undo.png
new file mode 100644
index 0000000..839a823
--- /dev/null
+++ b/tools/designer/designer/images/designer_undo.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_up.png b/tools/designer/designer/images/designer_up.png
new file mode 100644
index 0000000..e437312
--- /dev/null
+++ b/tools/designer/designer/images/designer_up.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_uparrow.png b/tools/designer/designer/images/designer_uparrow.png
new file mode 100644
index 0000000..eefe4a0
--- /dev/null
+++ b/tools/designer/designer/images/designer_uparrow.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_vsplit.png b/tools/designer/designer/images/designer_vsplit.png
new file mode 100644
index 0000000..b820c19
--- /dev/null
+++ b/tools/designer/designer/images/designer_vsplit.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_wait.png b/tools/designer/designer/images/designer_wait.png
new file mode 100644
index 0000000..5d8cfed
--- /dev/null
+++ b/tools/designer/designer/images/designer_wait.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_widgetstack.png b/tools/designer/designer/images/designer_widgetstack.png
new file mode 100644
index 0000000..c326de8
--- /dev/null
+++ b/tools/designer/designer/images/designer_widgetstack.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_wizarddata.png b/tools/designer/designer/images/designer_wizarddata.png
new file mode 100644
index 0000000..9493e3b
--- /dev/null
+++ b/tools/designer/designer/images/designer_wizarddata.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_wizarddialog.png b/tools/designer/designer/images/designer_wizarddialog.png
new file mode 100644
index 0000000..a22dc88
--- /dev/null
+++ b/tools/designer/designer/images/designer_wizarddialog.png
Binary files differ
diff --git a/tools/designer/designer/images/designer_wordwrap.png b/tools/designer/designer/images/designer_wordwrap.png
new file mode 100644
index 0000000..29513c3
--- /dev/null
+++ b/tools/designer/designer/images/designer_wordwrap.png
Binary files differ
diff --git a/tools/designer/designer/layout.cpp b/tools/designer/designer/layout.cpp
new file mode 100644
index 0000000..2701023
--- /dev/null
+++ b/tools/designer/designer/layout.cpp
@@ -0,0 +1,1024 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "formwindow.h"
+#include "layout.h"
+#include <widgetdatabase.h>
+#include "widgetfactory.h"
+
+#include <qlayout.h>
+#include <qevent.h>
+#include <qpainter.h>
+#include <qpen.h>
+#include <qbitmap.h>
+#include <qsplitter.h>
+#include <qvaluevector.h>
+#include <qmainwindow.h>
+
+bool operator<( const QGuardedPtr<QWidget> &p1, const QGuardedPtr<QWidget> &p2 )
+{
+ return p1.operator->() < p2.operator->();
+}
+
+/*!
+ \class Layout layout.h
+ \brief Baseclass for layouting widgets in the Designer
+
+ Classes derived from this abstract base class are used for layouting
+ operations in the Designer.
+
+*/
+
+/*! \a p specifies the parent of the layoutBase \a lb. The parent
+ might be changed in setup(). If the layoutBase is a
+ container, the parent and the layoutBase are the same. Also they
+ always have to be a widget known to the designer (e.g. in the case
+ of the tabwidget parent and layoutBase are the tabwidget and not the
+ page which actually gets laid out. For actual usage the correct
+ widget is found later by Layout.)
+ */
+
+Layout::Layout( const QWidgetList &wl, QWidget *p, FormWindow *fw, QWidget *lb, bool doSetup, bool splitter )
+ : widgets( wl ), parent( p ), formWindow( fw ), isBreak( !doSetup ), useSplitter( splitter )
+{
+ widgets.setAutoDelete( FALSE );
+ layoutBase = lb;
+ if ( !doSetup && layoutBase )
+ oldGeometry = layoutBase->geometry();
+}
+
+/*! The widget list we got in the constructor might contain too much
+ widgets (like widgets with different parents, already laid out
+ widgets, etc.). Here we set up the list and so the only the "best"
+ widgets get laid out.
+*/
+
+void Layout::setup()
+{
+ startPoint = QPoint( 32767, 32767 );
+ QValueList<QWidgetList> lists;
+ QWidget *lastParent = 0;
+ QWidgetList *lastList = 0;
+ QWidget *w = 0;
+
+ // Go through all widgets of the list we got. As we can only
+ // layout widgets which have the same parent, we first do some
+ // sorting which means create a list for each parent containing
+ // its child here. After that we keep working on the list of
+ // childs which has the most entries.
+ // Widgets which are already laid out are thrown away here too
+ for ( w = widgets.first(); w; w = widgets.next() ) {
+ if ( w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout )
+ continue;
+ if ( lastParent != w->parentWidget() ) {
+ lastList = 0;
+ lastParent = w->parentWidget();
+ QValueList<QWidgetList>::Iterator it = lists.begin();
+ for ( ; it != lists.end(); ++it ) {
+ if ( ( *it ).first()->parentWidget() == w->parentWidget() )
+ lastList = &( *it );
+ }
+ if ( !lastList ) {
+ QWidgetList l;
+ l.setAutoDelete( FALSE );
+ lists.append( l );
+ lastList = &lists.last();
+ }
+ }
+ lastList->append( w );
+ }
+
+ // So, now find the list with the most entries
+ lastList = 0;
+ QValueList<QWidgetList>::Iterator it = lists.begin();
+ for ( ; it != lists.end(); ++it ) {
+ if ( !lastList || ( *it ).count() > lastList->count() )
+ lastList = &( *it );
+ }
+
+ // If we found no list (because no widget did fit at all) or the
+ // best list has only one entry and we do not layout a container,
+ // we leave here.
+ if ( !lastList || ( lastList->count() < 2 &&
+ ( !layoutBase ||
+ ( !WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( layoutBase ) ) ) &&
+ layoutBase != formWindow->mainContainer() ) )
+ ) ) {
+ widgets.clear();
+ startPoint = QPoint( 0, 0 );
+ return;
+ }
+
+ // Now we have a new and clean widget list, which makes sense
+ // to layout
+ widgets = *lastList;
+ // Also use the only correct parent later, so store it
+ parent = WidgetFactory::widgetOfContainer( widgets.first()->parentWidget() );
+ // Now calculate the position where the layout-meta-widget should
+ // be placed and connect to widgetDestroyed() signals of the
+ // widgets to get informed if one gets deleted to be able to
+ // handle that and do not crash in this case
+ for ( w = widgets.first(); w; w = widgets.next() ) {
+ connect( w, SIGNAL( destroyed() ),
+ this, SLOT( widgetDestroyed() ) );
+ startPoint = QPoint( QMIN( startPoint.x(), w->x() ),
+ QMIN( startPoint.y(), w->y() ) );
+ geometries.insert( w, QRect( w->pos(), w->size() ) );
+ // Change the Z-order, as saving/loading uses the Z-order for
+ // writing/creating widgets and this has to be the same as in
+ // the layout. Else saving + loading will give different results
+ w->raise();
+ }
+}
+
+void Layout::widgetDestroyed()
+{
+ if ( sender() && sender()->isWidgetType() )
+ widgets.removeRef( (QWidget*)sender() );
+}
+
+bool Layout::prepareLayout( bool &needMove, bool &needReparent )
+{
+ if ( !widgets.count() )
+ return FALSE;
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() )
+ w->raise();
+ needMove = !layoutBase;
+ needReparent = needMove || ::qt_cast<QLayoutWidget*>(layoutBase) || ::qt_cast<QSplitter*>(layoutBase);
+ if ( !layoutBase ) {
+ if ( !useSplitter )
+ layoutBase = WidgetFactory::create( WidgetDatabase::idFromClassName( "QLayoutWidget" ),
+ WidgetFactory::containerOfWidget( parent ) );
+ else
+ layoutBase = WidgetFactory::create( WidgetDatabase::idFromClassName( "QSplitter" ),
+ WidgetFactory::containerOfWidget( parent ) );
+ } else {
+ WidgetFactory::deleteLayout( layoutBase );
+ }
+
+ return TRUE;
+}
+
+void Layout::finishLayout( bool needMove, QLayout *layout )
+{
+ if ( needMove )
+ layoutBase->move( startPoint );
+ QRect g( QRect( layoutBase->pos(), layoutBase->size() ) );
+ if ( WidgetFactory::layoutType( layoutBase->parentWidget() ) == WidgetFactory::NoLayout && !isBreak )
+ layoutBase->adjustSize();
+ else if ( isBreak )
+ layoutBase->setGeometry( oldGeometry );
+ oldGeometry = g;
+ layoutBase->show();
+ layout->activate();
+ formWindow->insertWidget( layoutBase );
+ formWindow->selectWidget( layoutBase );
+ QString n = layoutBase->name();
+ if ( n.find( "qt_dead_widget_" ) != -1 ) {
+ n.remove( 0, QString( "qt_dead_widget_" ).length() );
+ layoutBase->setName( n );
+ }
+}
+
+void Layout::undoLayout()
+{
+ if ( !widgets.count() )
+ return;
+ QMap<QGuardedPtr<QWidget>, QRect>::Iterator it = geometries.begin();
+ for ( ; it != geometries.end(); ++it ) {
+ if ( !it.key() )
+ continue;
+ it.key()->reparent( WidgetFactory::containerOfWidget( parent ), 0, ( *it ).topLeft(), it.key()->isVisibleTo( formWindow ) );
+ it.key()->resize( ( *it ).size() );
+ }
+ formWindow->selectWidget( layoutBase, FALSE );
+ WidgetFactory::deleteLayout( layoutBase );
+ if ( parent != layoutBase && !::qt_cast<QMainWindow*>(layoutBase) ) {
+ layoutBase->hide();
+ QString n = layoutBase->name();
+ n.prepend( "qt_dead_widget_" );
+ layoutBase->setName( n );
+ } else {
+ layoutBase->setGeometry( oldGeometry );
+ }
+ if ( widgets.first() )
+ formWindow->selectWidget( widgets.first() );
+ else
+ formWindow->selectWidget( formWindow );
+}
+
+void Layout::breakLayout()
+{
+ QMap<QWidget*, QRect> rects;
+ if ( !widgets.isEmpty() ) {
+ QWidget *w;
+ for ( w = widgets.first(); w; w = widgets.next() )
+ rects.insert( w, w->geometry() );
+ }
+ WidgetFactory::deleteLayout( layoutBase );
+ bool needReparent = qstrcmp( layoutBase->className(), "QLayoutWidget" ) == 0 ||
+ qstrcmp( layoutBase->className(), "QSplitter" ) == 0 ||
+ ( !WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( layoutBase ) ) ) &&
+ layoutBase != formWindow->mainContainer() );
+ bool needResize = qstrcmp( layoutBase->className(), "QSplitter" ) == 0;
+ bool add = geometries.isEmpty();
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ if ( needReparent )
+ w->reparent( layoutBase->parentWidget(), 0,
+ layoutBase->pos() + w->pos(), TRUE );
+ if ( needResize ) {
+ QMap<QWidget*, QRect>::Iterator it = rects.find( w );
+ if ( it != rects.end() )
+ w->setGeometry( QRect( layoutBase->pos() + (*it).topLeft(), (*it).size() ) );
+ }
+ if ( add )
+ geometries.insert( w, QRect( w->pos(), w->size() ) );
+ }
+ if ( needReparent ) {
+ layoutBase->hide();
+ parent = layoutBase->parentWidget();
+ QString n = layoutBase->name();
+ n.prepend( "qt_dead_widget_" );
+ layoutBase->setName( n );
+ } else {
+ parent = layoutBase;
+ }
+ if ( widgets.first() && widgets.first()->isVisibleTo( formWindow ) )
+ formWindow->selectWidget( widgets.first() );
+ else
+ formWindow->selectWidget( formWindow );
+}
+
+class HorizontalLayoutList : public QWidgetList
+{
+public:
+ HorizontalLayoutList( const QWidgetList &l )
+ : QWidgetList( l ) {}
+
+ int compareItems( QPtrCollection::Item item1, QPtrCollection::Item item2 ) {
+ QWidget *w1 = (QWidget*)item1;
+ QWidget *w2 = (QWidget*)item2;
+ if ( w1->x() == w2->x() )
+ return 0;
+ if ( w1->x() > w2->x() )
+ return 1;
+ return -1;
+ }
+
+};
+
+HorizontalLayout::HorizontalLayout( const QWidgetList &wl, QWidget *p, FormWindow *fw, QWidget *lb, bool doSetup, bool splitter )
+ : Layout( wl, p, fw, lb, doSetup, splitter )
+{
+ if ( doSetup )
+ setup();
+}
+
+void HorizontalLayout::setup()
+{
+ HorizontalLayoutList l( widgets );
+ l.sort();
+ widgets = l;
+ Layout::setup();
+}
+
+void HorizontalLayout::doLayout()
+{
+ bool needMove, needReparent;
+ if ( !prepareLayout( needMove, needReparent ) )
+ return;
+
+ QHBoxLayout *layout = (QHBoxLayout*)WidgetFactory::createLayout( layoutBase, 0, WidgetFactory::HBox );
+
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ if ( needReparent && w->parent() != layoutBase )
+ w->reparent( layoutBase, 0, QPoint( 0, 0 ), FALSE );
+ if ( !useSplitter ) {
+ if ( qstrcmp( w->className(), "Spacer" ) == 0 )
+ layout->addWidget( w, 0, ( (Spacer*)w )->alignment() );
+ else
+ layout->addWidget( w );
+ if ( ::qt_cast<QLayoutWidget*>(w) )
+ ( (QLayoutWidget*)w )->updateSizePolicy();
+ }
+ w->show();
+ }
+
+ if ( ::qt_cast<QSplitter*>(layoutBase) )
+ ( (QSplitter*)layoutBase )->setOrientation( Qt::Horizontal );
+
+ finishLayout( needMove, layout );
+}
+
+
+
+
+class VerticalLayoutList : public QWidgetList
+{
+public:
+ VerticalLayoutList( const QWidgetList &l )
+ : QWidgetList( l ) {}
+
+ int compareItems( QPtrCollection::Item item1, QPtrCollection::Item item2 ) {
+ QWidget *w1 = (QWidget*)item1;
+ QWidget *w2 = (QWidget*)item2;
+ if ( w1->y() == w2->y() )
+ return 0;
+ if ( w1->y() > w2->y() )
+ return 1;
+ return -1;
+ }
+
+};
+
+VerticalLayout::VerticalLayout( const QWidgetList &wl, QWidget *p, FormWindow *fw, QWidget *lb, bool doSetup, bool splitter )
+ : Layout( wl, p, fw, lb, doSetup, splitter )
+{
+ if ( doSetup )
+ setup();
+}
+
+void VerticalLayout::setup()
+{
+ VerticalLayoutList l( widgets );
+ l.sort();
+ widgets = l;
+ Layout::setup();
+}
+
+void VerticalLayout::doLayout()
+{
+ bool needMove, needReparent;
+ if ( !prepareLayout( needMove, needReparent ) )
+ return;
+
+ QVBoxLayout *layout = (QVBoxLayout*)WidgetFactory::createLayout( layoutBase, 0, WidgetFactory::VBox );
+
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ if ( needReparent && w->parent() != layoutBase )
+ w->reparent( layoutBase, 0, QPoint( 0, 0 ), FALSE );
+ if ( !useSplitter ) {
+ if ( qstrcmp( w->className(), "Spacer" ) == 0 )
+ layout->addWidget( w, 0, ( (Spacer*)w )->alignment() );
+ else
+ layout->addWidget( w );
+ if ( ::qt_cast<QLayoutWidget*>(w) )
+ ( (QLayoutWidget*)w )->updateSizePolicy();
+ }
+ w->show();
+ }
+
+ if ( ::qt_cast<QSplitter*>(layoutBase) )
+ ( (QSplitter*)layoutBase )->setOrientation( Qt::Vertical );
+
+ finishLayout( needMove, layout );
+}
+
+
+
+
+
+class Grid
+{
+public:
+ Grid( int rows, int cols );
+ ~Grid();
+
+ QWidget* cell( int row, int col ) const { return cells[ row * ncols + col]; }
+ void setCell( int row, int col, QWidget* w ) { cells[ row*ncols + col] = w; }
+ void setCells( QRect c, QWidget* w ) {
+ for ( int rows = c.bottom()-c.top(); rows >= 0; rows--)
+ for ( int cols = c.right()-c.left(); cols >= 0; cols--) {
+ setCell(c.top()+rows, c.left()+cols, w);
+ }
+ }
+ int numRows() const { return nrows; }
+ int numCols() const { return ncols; }
+
+ void simplify();
+ bool locateWidget( QWidget* w, int& row, int& col, int& rowspan, int& colspan );
+
+private:
+ void merge();
+ int countRow( int r, int c ) const;
+ int countCol( int r, int c ) const;
+ void setRow( int r, int c, QWidget* w, int count );
+ void setCol( int r, int c, QWidget* w, int count );
+ bool isWidgetStartCol( int c ) const;
+ bool isWidgetEndCol( int c ) const;
+ bool isWidgetStartRow( int r ) const;
+ bool isWidgetEndRow( int r ) const;
+ bool isWidgetTopLeft( int r, int c ) const;
+ void extendLeft();
+ void extendRight();
+ void extendUp();
+ void extendDown();
+ QWidget** cells;
+ bool* cols;
+ bool* rows;
+ int nrows, ncols;
+
+};
+
+Grid::Grid( int r, int c )
+ : nrows( r ), ncols( c )
+{
+ cells = new QWidget*[ r * c ];
+ memset( cells, 0, sizeof( cells ) * r * c );
+ rows = new bool[ r ];
+ cols = new bool[ c ];
+
+}
+
+Grid::~Grid()
+{
+ delete [] cells;
+ delete [] cols;
+ delete [] rows;
+}
+
+int Grid::countRow( int r, int c ) const
+{
+ QWidget* w = cell( r, c );
+ int i = c + 1;
+ while ( i < ncols && cell( r, i ) == w )
+ i++;
+ return i - c;
+}
+
+int Grid::countCol( int r, int c ) const
+{
+ QWidget* w = cell( r, c );
+ int i = r + 1;
+ while ( i < nrows && cell( i, c ) == w )
+ i++;
+ return i - r;
+}
+
+void Grid::setCol( int r, int c, QWidget* w, int count )
+{
+ for (int i = 0; i < count; i++ )
+ setCell( r + i, c, w );
+}
+
+void Grid::setRow( int r, int c, QWidget* w, int count )
+{
+ for (int i = 0; i < count; i++ )
+ setCell( r, c + i, w );
+}
+
+bool Grid::isWidgetStartCol( int c ) const
+{
+ int r;
+ for ( r = 0; r < nrows; r++ ) {
+ if ( cell( r, c ) && ( (c==0) || (cell( r, c) != cell( r, c-1) )) ) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+bool Grid::isWidgetEndCol( int c ) const
+{
+ int r;
+ for ( r = 0; r < nrows; r++ ) {
+ if ( cell( r, c ) && ((c == ncols-1) || (cell( r, c) != cell( r, c+1) )) )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool Grid::isWidgetStartRow( int r ) const
+{
+ int c;
+ for ( c = 0; c < ncols; c++ ) {
+ if ( cell( r, c ) && ( (r==0) || (cell( r, c) != cell( r-1, c) )) )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool Grid::isWidgetEndRow( int r ) const
+{
+ int c;
+ for ( c = 0; c < ncols; c++ ) {
+ if ( cell( r, c ) && ((r == nrows-1) || (cell( r, c) != cell( r+1, c) )) )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+bool Grid::isWidgetTopLeft( int r, int c ) const
+{
+ QWidget* w = cell( r, c );
+ if ( !w )
+ return FALSE;
+ return ( !r || cell( r-1, c) != w ) && (!c || cell( r, c-1) != w);
+}
+
+void Grid::extendLeft()
+{
+ int r,c,i;
+ for ( c = 1; c < ncols; c++ ) {
+ for ( r = 0; r < nrows; r++ ) {
+ QWidget* w = cell( r, c );
+ if ( !w )
+ continue;
+ int cc = countCol( r, c);
+ int stretch = 0;
+ for ( i = c-1; i >= 0; i-- ) {
+ if ( cell( r, i ) )
+ break;
+ if ( countCol( r, i ) < cc )
+ break;
+ if ( isWidgetEndCol( i ) )
+ break;
+ if ( isWidgetStartCol( i ) ) {
+ stretch = c - i;
+ break;
+ }
+ }
+ if ( stretch ) {
+ for ( i = 0; i < stretch; i++ )
+ setCol( r, c-i-1, w, cc );
+ }
+ }
+ }
+}
+
+
+void Grid::extendRight()
+{
+ int r,c,i;
+ for ( c = ncols - 2; c >= 0; c-- ) {
+ for ( r = 0; r < nrows; r++ ) {
+ QWidget* w = cell( r, c );
+ if ( !w )
+ continue;
+ int cc = countCol( r, c);
+ int stretch = 0;
+ for ( i = c+1; i < ncols; i++ ) {
+ if ( cell( r, i ) )
+ break;
+ if ( countCol( r, i ) < cc )
+ break;
+ if ( isWidgetStartCol( i ) )
+ break;
+ if ( isWidgetEndCol( i ) ) {
+ stretch = i - c;
+ break;
+ }
+ }
+ if ( stretch ) {
+ for ( i = 0; i < stretch; i++ )
+ setCol( r, c+i+1, w, cc );
+ }
+ }
+ }
+
+}
+
+void Grid::extendUp()
+{
+ int r,c,i;
+ for ( r = 1; r < nrows; r++ ) {
+ for ( c = 0; c < ncols; c++ ) {
+ QWidget* w = cell( r, c );
+ if ( !w )
+ continue;
+ int cr = countRow( r, c);
+ int stretch = 0;
+ for ( i = r-1; i >= 0; i-- ) {
+ if ( cell( i, c ) )
+ break;
+ if ( countRow( i, c ) < cr )
+ break;
+ if ( isWidgetEndRow( i ) )
+ break;
+ if ( isWidgetStartRow( i ) ) {
+ stretch = r - i;
+ break;
+ }
+ }
+ if ( stretch ) {
+ for ( i = 0; i < stretch; i++ )
+ setRow( r-i-1, c, w, cr );
+ }
+ }
+ }
+}
+
+void Grid::extendDown()
+{
+ int r,c,i;
+ for ( r = nrows - 2; r >= 0; r-- ) {
+ for ( c = 0; c < ncols; c++ ) {
+ QWidget* w = cell( r, c );
+ if ( !w )
+ continue;
+ int cr = countRow( r, c);
+ int stretch = 0;
+ for ( i = r+1; i < nrows; i++ ) {
+ if ( cell( i, c ) )
+ break;
+ if ( countRow( i, c ) < cr )
+ break;
+ if ( isWidgetStartRow( i ) )
+ break;
+ if ( isWidgetEndRow( i ) ) {
+ stretch = i - r;
+ break;
+ }
+ }
+ if ( stretch ) {
+ for ( i = 0; i < stretch; i++ )
+ setRow( r+i+1, c, w, cr );
+ }
+ }
+ }
+
+}
+
+void Grid::simplify()
+{
+ extendLeft();
+ extendRight();
+ extendUp();
+ extendDown();
+ merge();
+}
+
+
+void Grid::merge()
+{
+ int r,c;
+ for ( c = 0; c < ncols; c++ )
+ cols[c] = FALSE;
+
+ for ( r = 0; r < nrows; r++ )
+ rows[r] = FALSE;
+
+ for ( c = 0; c < ncols; c++ ) {
+ for ( r = 0; r < nrows; r++ ) {
+ if ( isWidgetTopLeft( r, c ) ) {
+ rows[r] = TRUE;
+ cols[c] = TRUE;
+ }
+ }
+ }
+}
+
+bool Grid::locateWidget( QWidget* w, int& row, int& col, int& rowspan, int & colspan )
+{
+ int r,c, r2, c2;
+ for ( c = 0; c < ncols; c++ ) {
+ for ( r = 0; r < nrows; r++ ) {
+ if ( cell( r, c ) == w ) {
+ row = 0;
+ for ( r2 = 1; r2 <= r; r2++ ) {
+ if ( rows[ r2-1 ] )
+ row++;
+ }
+ col = 0;
+ for ( c2 = 1; c2 <= c; c2++ ) {
+ if ( cols[ c2-1 ] )
+ col++;
+ }
+ rowspan = 0;
+ for ( r2 = r ; r2 < nrows && cell( r2, c) == w; r2++ ) {
+ if ( rows[ r2 ] )
+ rowspan++;
+ }
+ colspan = 0;
+ for ( c2 = c; c2 < ncols && cell( r, c2) == w; c2++ ) {
+ if ( cols[ c2] )
+ colspan++;
+ }
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+
+
+
+GridLayout::GridLayout( const QWidgetList &wl, QWidget *p, FormWindow *fw, QWidget *lb, const QSize &res, bool doSetup )
+ : Layout( wl, p, fw, lb, doSetup ), resolution( res )
+{
+ grid = 0;
+ if ( doSetup )
+ setup();
+}
+
+GridLayout::~GridLayout()
+{
+ delete grid;
+}
+
+void GridLayout::doLayout()
+{
+ bool needMove, needReparent;
+ if ( !prepareLayout( needMove, needReparent ) )
+ return;
+
+ QDesignerGridLayout *layout = (QDesignerGridLayout*)WidgetFactory::createLayout( layoutBase, 0, WidgetFactory::Grid );
+
+ if ( !grid )
+ buildGrid();
+
+ QWidget* w;
+ int r, c, rs, cs;
+ for ( w = widgets.first(); w; w = widgets.next() ) {
+ if ( grid->locateWidget( w, r, c, rs, cs) ) {
+ if ( needReparent && w->parent() != layoutBase )
+ w->reparent( layoutBase, 0, QPoint( 0, 0 ), FALSE );
+ if ( rs * cs == 1 ) {
+ layout->addWidget( w, r, c, ::qt_cast<Spacer*>(w) ? ( (Spacer*)w )->alignment() : 0 );
+ } else {
+ layout->addMultiCellWidget( w, r, r+rs-1, c, c+cs-1, ::qt_cast<Spacer*>(w) ? ( (Spacer*)w )->alignment() : 0 );
+ }
+ if ( ::qt_cast<QLayoutWidget*>(w) )
+ ( (QLayoutWidget*)w )->updateSizePolicy();
+ w->show();
+ } else {
+ qWarning("ooops, widget '%s' does not fit in layout", w->name() );
+ }
+ }
+ finishLayout( needMove, layout );
+}
+
+void GridLayout::setup()
+{
+ Layout::setup();
+ buildGrid();
+}
+
+void GridLayout::buildGrid()
+{
+ if ( !widgets.count() )
+ return;
+
+ // Pixel to cell conversion:
+ // By keeping a list of start'n'stop values (x & y) for each widget,
+ // it is possible to create a very small grid of cells to represent
+ // the widget layout.
+ // -----------------------------------------------------------------
+
+ // We need a list of both start and stop values for x- & y-axis
+ QValueVector<int> x( widgets.count()*2 );
+ QValueVector<int> y( widgets.count()*2 );
+
+ // Using push_back would look nicer, but operator[] is much faster
+ int index = 0;
+ QWidget* w = 0;
+ for ( w = widgets.first(); w; w = widgets.next() ) {
+ QRect widgetPos = w->geometry();
+ x[index] = widgetPos.left();
+ x[index+1] = widgetPos.right();
+ y[index] = widgetPos.top();
+ y[index+1] = widgetPos.bottom();
+ index += 2;
+ }
+
+ qHeapSort(x);
+ qHeapSort(y);
+
+ // Remove duplicate x enteries (Remove next, if equal to current)
+ if ( !x.empty() ) {
+ for (QValueVector<int>::iterator current = x.begin() ;
+ (current != x.end()) && ((current+1) != x.end()) ; )
+ if ( (*current == *(current+1)) )
+ x.erase(current+1);
+ else
+ current++;
+ }
+
+ // Remove duplicate y enteries (Remove next, if equal to current)
+ if ( !y.empty() ) {
+ for (QValueVector<int>::iterator current = y.begin() ;
+ (current != y.end()) && ((current+1) != y.end()) ; )
+ if ( (*current == *(current+1)) )
+ y.erase(current+1);
+ else
+ current++;
+ }
+
+ // Create the smallest grid possible to represent the current layout
+ // Since no widget will be placed in the last row and column, we'll
+ // skip them to increase speed even further
+ delete grid;
+ grid = new Grid( (int)(y.size()-1), (int)(x.size()-1) );
+
+ // Mark the cells in the grid that contains a widget
+ for ( w = widgets.first(); w; w = widgets.next() ) {
+ QRect c(0,0,0,0), widgetPos = w->geometry();
+ // From left til right (not including)
+ for (uint cw=0; cw<x.size(); cw++) {
+ if ( x[cw] == widgetPos.left() )
+ c.setLeft(cw);
+ if ( x[cw] < widgetPos.right())
+ c.setRight(cw);
+ }
+ // From top til bottom (not including)
+ for (uint ch=0; ch<y.size(); ch++) {
+ if ( y[ch] == widgetPos.top() )
+ c.setTop(ch);
+ if ( y[ch] < widgetPos.bottom() )
+ c.setBottom(ch);
+ }
+ grid->setCells(c, w); // Mark cellblock
+ }
+ grid->simplify();
+}
+
+
+
+
+
+
+
+Spacer::Spacer( QWidget *parent, const char *name )
+ : QWidget( parent, name, WMouseNoMask ),
+ orient( Vertical ), interactive(TRUE), sh( QSize(20,20) )
+{
+ setSizeType( Expanding );
+ setAutoMask( TRUE );
+}
+
+void Spacer::paintEvent( QPaintEvent * )
+{
+ QPainter p( this );
+ p.setPen( Qt::blue );
+
+ if ( orient == Horizontal ) {
+ const int dist = 3;
+ const int amplitude = QMIN( 3, height() / 3 );
+ const int base = height() / 2;
+ int i = 0;
+ p.setPen( white );
+ for ( i = 0; i < width() / 3 +2; ++i )
+ p.drawLine( i * dist, base - amplitude, i * dist + dist / 2, base + amplitude );
+ p.setPen( blue );
+ for ( i = 0; i < width() / 3 +2; ++i )
+ p.drawLine( i * dist + dist / 2, base + amplitude, i * dist + dist, base - amplitude );
+ p.drawLine( 0, 0, 0, height() );
+ p.drawLine( width() - 1, 0, width() - 1, height());
+ } else {
+ const int dist = 3;
+ const int amplitude = QMIN( 3, width() / 3 );
+ const int base = width() / 2;
+ int i = 0;
+ p.setPen( white );
+ for ( i = 0; i < height() / 3 +2; ++i )
+ p.drawLine( base - amplitude, i * dist, base + amplitude,i * dist + dist / 2 );
+ p.setPen( blue );
+ for ( i = 0; i < height() / 3 +2; ++i )
+ p.drawLine( base + amplitude, i * dist + dist / 2, base - amplitude, i * dist + dist );
+ p.drawLine( 0, 0, width(), 0 );
+ p.drawLine( 0, height() - 1, width(), height() - 1 );
+ }
+}
+
+void Spacer::resizeEvent( QResizeEvent* e)
+{
+ QWidget::resizeEvent( e );
+ if ( !parentWidget() || WidgetFactory::layoutType( parentWidget() ) == WidgetFactory::NoLayout )
+ sh = size();
+}
+
+void Spacer::updateMask()
+{
+ QRegion r( rect() );
+ if ( orient == Horizontal ) {
+ const int amplitude = QMIN( 3, height() / 3 );
+ const int base = height() / 2;
+ r = r.subtract( QRect(1, 0, width() - 2, base - amplitude ) );
+ r = r.subtract( QRect(1, base + amplitude, width() - 2, height() - base - amplitude ) );
+ } else {
+ const int amplitude = QMIN( 3, width() / 3 );
+ const int base = width() / 2;
+ r = r.subtract( QRect(0, 1, base - amplitude, height() - 2 ) );
+ r = r.subtract( QRect( base + amplitude, 1, width() - base - amplitude, height() - 2 ) );
+ }
+ setMask( r );
+}
+
+void Spacer::setSizeType( SizeType t )
+{
+ QSizePolicy sizeP;
+ if ( orient == Vertical )
+ sizeP = QSizePolicy( QSizePolicy::Minimum, (QSizePolicy::SizeType)t );
+ else
+ sizeP = QSizePolicy( (QSizePolicy::SizeType)t, QSizePolicy::Minimum );
+ setSizePolicy( sizeP );
+}
+
+
+Spacer::SizeType Spacer::sizeType() const
+{
+ if ( orient == Vertical )
+ return (SizeType)sizePolicy().verData();
+ return (SizeType)sizePolicy().horData();
+}
+
+int Spacer::alignment() const
+{
+ if ( orient == Vertical )
+ return AlignHCenter;
+ return AlignVCenter;
+}
+
+QSize Spacer::minimumSize() const
+{
+ QSize s = QSize( 20,20 );
+ if ( sizeType() == Expanding )
+ if ( orient == Vertical )
+ s.rheight() = 0;
+ else
+ s.rwidth() = 0;
+ return s;
+}
+
+QSize Spacer::sizeHint() const
+{
+ return sh;
+}
+
+
+void Spacer::setSizeHint( const QSize &s )
+{
+ sh = s;
+ if ( !parentWidget() || WidgetFactory::layoutType( parentWidget() ) == WidgetFactory::NoLayout )
+ resize( sizeHint() );
+ updateGeometry();
+}
+
+Qt::Orientation Spacer::orientation() const
+{
+ return orient;
+}
+
+void Spacer::setOrientation( Qt::Orientation o )
+{
+ if ( orient == o )
+ return;
+
+ SizeType st = sizeType();
+ orient = o;
+ setSizeType( st );
+ if ( interactive ) {
+ sh = QSize( sh.height(), sh.width() );
+ if (!parentWidget() || WidgetFactory::layoutType( parentWidget() ) == WidgetFactory::NoLayout )
+ resize( height(), width() );
+ }
+ updateMask();
+ update();
+ updateGeometry();
+}
+
+
+void QDesignerGridLayout::addWidget( QWidget *w, int row, int col, int align_ )
+{
+ items.insert( w, Item(row, col, 1, 1) );
+ QGridLayout::addWidget( w, row, col, align_ );
+}
+
+void QDesignerGridLayout::addMultiCellWidget( QWidget *w, int fromRow, int toRow,
+ int fromCol, int toCol, int align_ )
+{
+ items.insert( w, Item(fromRow, fromCol, toRow - fromRow + 1, toCol - fromCol +1) );
+ QGridLayout::addMultiCellWidget( w, fromRow, toRow, fromCol, toCol, align_ );
+}
diff --git a/tools/designer/designer/layout.h b/tools/designer/designer/layout.h
new file mode 100644
index 0000000..4e0aa0f
--- /dev/null
+++ b/tools/designer/designer/layout.h
@@ -0,0 +1,195 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef LAYOUT_H
+#define LAYOUT_H
+
+#include <qwidget.h>
+#include <qmap.h>
+#include <qguardedptr.h>
+#include <qobject.h>
+#include <qlayout.h>
+#include <qmap.h>
+#include <qwidgetlist.h>
+
+class FormWindow;
+class QPaintEvent;
+
+class Layout : public QObject
+{
+ Q_OBJECT
+
+public:
+ Layout( const QWidgetList &wl, QWidget *p, FormWindow *fw, QWidget *lb, bool doSetup = TRUE, bool splitter = FALSE );
+ virtual ~Layout() {}
+
+ virtual void doLayout() = 0;
+ virtual void undoLayout();
+ virtual void breakLayout();
+ virtual bool prepareLayout( bool &needMove, bool &needReparent );
+ virtual void finishLayout( bool needMove, QLayout *layout );
+
+protected:
+ QWidgetList widgets;
+ QWidget *parent;
+ QPoint startPoint;
+ QMap<QGuardedPtr<QWidget>, QRect> geometries;
+ QWidget *layoutBase;
+ FormWindow *formWindow;
+ QRect oldGeometry;
+ bool isBreak;
+ bool useSplitter;
+
+protected:
+ virtual void setup();
+
+protected slots:
+ void widgetDestroyed();
+
+};
+
+class HorizontalLayout : public Layout
+{
+public:
+ HorizontalLayout( const QWidgetList &wl, QWidget *p, FormWindow *fw, QWidget *lb, bool doSetup = TRUE, bool splitter = FALSE );
+
+ void doLayout();
+
+protected:
+ void setup();
+
+};
+
+class VerticalLayout : public Layout
+{
+public:
+ VerticalLayout( const QWidgetList &wl, QWidget *p, FormWindow *fw, QWidget *lb, bool doSetup = TRUE, bool splitter = FALSE );
+
+ void doLayout();
+
+protected:
+ void setup();
+
+};
+
+class Grid;
+
+class GridLayout : public Layout
+{
+public:
+ GridLayout( const QWidgetList &wl, QWidget *p, FormWindow *fw, QWidget *lb, const QSize &res, bool doSetup = TRUE );
+ ~GridLayout();
+
+ void doLayout();
+
+protected:
+ void setup();
+
+protected:
+ void buildGrid();
+ QSize resolution;
+ Grid* grid;
+
+};
+
+class Spacer : public QWidget
+{
+ Q_OBJECT
+
+ Q_OVERRIDE( QCString name )
+ Q_PROPERTY( Orientation orientation READ orientation WRITE setOrientation )
+ Q_ENUMS( SizeType )
+ Q_PROPERTY( SizeType sizeType READ sizeType WRITE setSizeType )
+ Q_PROPERTY( QSize sizeHint READ sizeHint WRITE setSizeHint DESIGNABLE true STORED true )
+ Q_OVERRIDE( QRect geometry DESIGNABLE false )
+
+private:
+ enum { HSize = 6, HMask = 0x3f, VMask = HMask << HSize,
+ MayGrow = 1, ExpMask = 2, MayShrink = 4 };
+
+public:
+ enum SizeType { Fixed = 0,
+ Minimum = MayGrow,
+ Maximum = MayShrink,
+ Preferred = MayGrow|MayShrink ,
+ MinimumExpanding = Minimum|ExpMask,
+ Expanding = MinimumExpanding|MayShrink };
+
+ Spacer( QWidget *parent, const char *name );
+
+ QSize minimumSize() const;
+ QSize sizeHint() const;
+ void setSizeType( SizeType t );
+ SizeType sizeType() const;
+ int alignment() const;
+ Orientation orientation() const;
+ void setOrientation( Orientation o );
+ void setInteraciveMode( bool b ) { interactive = b; };
+ void setSizeHint( const QSize &s );
+
+protected:
+ void paintEvent( QPaintEvent *e );
+ void resizeEvent( QResizeEvent* e );
+ void updateMask();
+ Qt::Orientation orient;
+ bool interactive;
+ QSize sh;
+};
+
+class QDesignerGridLayout : public QGridLayout
+{
+ Q_OBJECT
+public:
+ QDesignerGridLayout( QWidget *parent ) : QGridLayout( parent ){};
+ QDesignerGridLayout( QLayout *parentLayout ) : QGridLayout( parentLayout ){};
+
+ void addWidget( QWidget *, int row, int col, int align = 0 );
+ void addMultiCellWidget( QWidget *, int fromRow, int toRow,
+ int fromCol, int toCol, int align = 0 );
+
+ struct Item
+ {
+ Item(): row(0), column(0),rowspan(1),colspan(1){}
+ Item( int r, int c, int rs, int cs): row(r), column(c), rowspan(rs), colspan(cs){}
+ int row;
+ int column;
+ int rowspan;
+ int colspan;
+ Q_DUMMY_COMPARISON_OPERATOR( Item )
+ };
+
+ QMap<QWidget*, Item> items;
+};
+
+
+#endif
diff --git a/tools/designer/designer/listboxdnd.cpp b/tools/designer/designer/listboxdnd.cpp
new file mode 100644
index 0000000..02e1147
--- /dev/null
+++ b/tools/designer/designer/listboxdnd.cpp
@@ -0,0 +1,312 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "listboxdnd.h"
+#include <qwidget.h>
+#include <qheader.h>
+#include <qpainter.h>
+#include <qdragobject.h>
+#include <qvaluelist.h>
+
+// The Dragobject Declaration ---------------------------------------
+class ListBoxItemDrag : public QStoredDrag
+{
+public:
+ ListBoxItemDrag( ListBoxItemList & items, bool sendPtr = FALSE, QListBox * parent = 0, const char * name = 0 );
+ ~ListBoxItemDrag() {};
+ static bool canDecode( QDragMoveEvent * event );
+ static bool decode( QDropEvent * event, QListBox * parent, QListBoxItem * insertPoint );
+ enum ItemType { ListBoxText = 1, ListBoxPixmap = 2 };
+};
+// ------------------------------------------------------------------
+
+ListBoxDnd::ListBoxDnd( QListBox * eventSource, const char * name )
+ : ListDnd( eventSource, name ) { }
+
+void ListBoxDnd::confirmDrop( QListBoxItem * )
+{
+ dropConfirmed = TRUE;
+}
+
+bool ListBoxDnd::dropEvent( QDropEvent * event )
+{
+ if ( dragInside ) {
+
+ if ( dMode & NullDrop ) { // combined with Move, a NullDrop will delete an item
+ event->accept();
+ emit dropped( 0 ); // a NullDrop
+ return TRUE;
+ }
+
+ QPoint pos = event->pos();
+ QListBoxItem * after = itemAt( pos );
+
+ if ( ListBoxItemDrag::decode( event, (QListBox *) src, after ) ) {
+ event->accept();
+ QListBox * src = (QListBox *) this->src;
+ QListBoxItem * item = ( after ? after->next() : src->firstItem() );
+ src->setCurrentItem( item );
+ emit dropped( item ); // ###FIX: Supports only one item!
+ }
+ }
+
+ line->hide();
+ dragInside = FALSE;
+
+ return TRUE;
+}
+
+bool ListBoxDnd::mouseMoveEvent( QMouseEvent * event )
+{
+ if ( event->state() & LeftButton ) {
+ if ( ( event->pos() - mousePressPos ).manhattanLength() > 3 ) {
+
+ ListBoxItemList list;
+ buildList( list );
+ ListBoxItemDrag * dragobject = new ListBoxItemDrag( list, (dMode & Internal), (QListBox *) src );
+
+ // Emit signal for all dragged items
+ QListBoxItem * i = list.first();
+ while ( i ) {
+ emit dragged( i );
+ i = list.next();
+ }
+
+ if ( dMode & Move ) {
+ removeList( list ); // "hide" items
+ }
+
+ dragobject->dragCopy();
+
+ if ( dMode & Move ) {
+ if ( dropConfirmed ) {
+ // ###FIX: memleak ? in internal mode, only pointers are transfered...
+ //list.setAutoDelete( TRUE );
+ list.clear();
+ dropConfirmed = FALSE;
+ }
+ insertList( list ); // "show" items
+ }
+ }
+ }
+ return FALSE;
+}
+
+int ListBoxDnd::buildList( ListBoxItemList & list )
+{
+ QListBoxItem * i = ((QListBox *)src)->firstItem();
+ while ( i ) {
+ if ( i->isSelected() ) {
+ ((QListBox *)src)->setSelected( i, FALSE );
+ list.append( i );
+ }
+ i = i->next();
+ }
+ return list.count();
+}
+
+void ListBoxDnd::insertList( ListBoxItemList & list )
+{
+ QListBoxItem * i = list.first();
+ while ( i ) {
+ ((QListBox *)src)->insertItem( i, i->prev() );
+ i = list.next();
+ }
+}
+
+void ListBoxDnd::removeList( ListBoxItemList & list )
+{
+ QListBoxItem * i = list.first();
+ while ( i ) {
+ ((QListBox *)src)->takeItem( i ); // remove item from QListBox
+ i = list.next();
+ }
+}
+
+void ListBoxDnd::updateLine( const QPoint & dragPos )
+{
+ QListBox * src = (QListBox *) this->src;
+ QListBoxItem *item = itemAt( dragPos );
+
+ int ypos = item ?
+ ( src->itemRect( item ).bottom() - ( line->height() / 2 ) ) :
+ ( src->itemRect( ((QListBox *)src)->firstItem() ).top() );
+
+ line->resize( src->viewport()->width(), line->height() );
+ line->move( 0, ypos );
+}
+
+QListBoxItem * ListBoxDnd::itemAt( QPoint pos )
+{
+ QListBox * src = (QListBox *) this->src;
+ QListBoxItem * result = src->itemAt( pos );
+ QListBoxItem * last = src->item( src->count() - 1 );
+ int i = src->index( result );
+
+ if ( result && ( pos.y() < (src->itemRect(result).top() + src->itemHeight(i)/2) ) )
+ result = result->prev();
+ else if ( !result && pos.y() > src->itemRect( last ).bottom() )
+ result = last;
+
+ return result;
+}
+
+bool ListBoxDnd::canDecode( QDragEnterEvent * event )
+{
+ return ListBoxItemDrag::canDecode( event );
+}
+
+
+// ------------------------------------------------------------------
+// The Dragobject Implementation ------------------------------------
+// ------------------------------------------------------------------
+
+ListBoxItemDrag::ListBoxItemDrag( ListBoxItemList & items, bool sendPtr, QListBox * parent, const char * name )
+ : QStoredDrag( "qt/listboxitem", parent, name )
+{
+ // ### FIX!
+ QByteArray data( sizeof( Q_INT32 ) + sizeof( QListBoxItem ) * items.count() );
+ QDataStream stream( data, IO_WriteOnly );
+
+ stream << items.count();
+ stream << (Q_UINT8) sendPtr; // just transfer item pointer; omit data
+
+ QListBoxItem * i = items.first();
+
+ if ( sendPtr ) {
+
+ while ( i ) {
+
+ stream << (Q_ULONG) i; //###FIX: demands sizeof(ulong) >= sizeof(void*)
+ i = items.next();
+
+ }
+
+ } else {
+
+ while ( i ) {
+
+ Q_UINT8 b = 0;
+
+ b = (Q_UINT8) ( i->text() != QString::null ); // does item have text ?
+ stream << b;
+ if ( b ) {
+ stream << i->text();
+ }
+
+ b = (Q_UINT8) ( !!i->pixmap() ); // does item have a pixmap ?
+ stream << b;
+ if ( b ) {
+ stream << ( *i->pixmap() );
+ }
+
+ stream << (Q_UINT8) i->isSelectable();
+
+ i = items.next();
+ }
+
+ }
+
+ setEncodedData( data );
+}
+
+bool ListBoxItemDrag::canDecode( QDragMoveEvent * event )
+{
+ return event->provides( "qt/listboxitem" );
+}
+
+bool ListBoxItemDrag::decode( QDropEvent * event, QListBox * parent, QListBoxItem * after )
+{
+ QByteArray data = event->encodedData( "qt/listboxitem" );
+
+ if ( data.size() ) {
+ event->accept();
+ QDataStream stream( data, IO_ReadOnly );
+
+ int count = 0;
+ stream >> count;
+
+ Q_UINT8 recievePtr = 0; // data contains just item pointers; no data
+ stream >> recievePtr;
+
+ QListBoxItem * item = 0;
+
+ if ( recievePtr ) {
+
+ for( int i = 0; i < count; i++ ) {
+
+ Q_ULONG p = 0; //###FIX: demands sizeof(ulong) >= sizeof(void*)
+ stream >> p;
+ item = (QListBoxItem *) p;
+
+ parent->insertItem( item, after );
+
+ }
+
+ } else {
+
+ for ( int i = 0; i < count; i++ ) {
+
+ Q_UINT8 hasText = 0;
+ QString text;
+ stream >> hasText;
+ if ( hasText ) {
+ stream >> text;
+ }
+
+ Q_UINT8 hasPixmap = 0;
+ QPixmap pixmap;
+ stream >> hasPixmap;
+ if ( hasPixmap ) {
+ stream >> pixmap;
+ }
+
+ Q_UINT8 isSelectable = 0;
+ stream >> isSelectable;
+
+ if ( hasPixmap ) {
+ item = new QListBoxPixmap( parent, pixmap, text, after );
+ } else {
+ item = new QListBoxText( parent, text, after );
+ }
+
+ item->setSelectable( isSelectable );
+
+ }
+
+ }
+
+ return TRUE;
+ }
+ return FALSE;
+}
diff --git a/tools/designer/designer/listboxdnd.h b/tools/designer/designer/listboxdnd.h
new file mode 100644
index 0000000..23e28e7
--- /dev/null
+++ b/tools/designer/designer/listboxdnd.h
@@ -0,0 +1,70 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef LISTBOXDND_H
+#define LISTBOXDND_H
+
+#include <qptrlist.h>
+#include <qlistbox.h>
+#include "listdnd.h"
+
+typedef QPtrList<QListBoxItem> ListBoxItemList;
+
+class ListBoxDnd : public ListDnd
+{
+ Q_OBJECT
+public:
+ // dragModes are enumerated in ListDnd
+ ListBoxDnd( QListBox * eventSource, const char * name = 0 );
+
+signals:
+ void dropped( QListBoxItem * );
+ void dragged( QListBoxItem * );
+
+public slots:
+ void confirmDrop( QListBoxItem * );
+
+protected:
+ virtual bool dropEvent( QDropEvent * event );
+ virtual bool mouseMoveEvent( QMouseEvent * event );
+ virtual void updateLine( const QPoint & pos );
+ virtual bool canDecode( QDragEnterEvent * event );
+
+private:
+ QListBoxItem * itemAt( QPoint pos );
+ int buildList( ListBoxItemList & list );
+ void insertList( ListBoxItemList & list );
+ void removeList( ListBoxItemList & list );
+};
+
+#endif //LISTBOXDND_H
diff --git a/tools/designer/designer/listboxeditor.ui b/tools/designer/designer/listboxeditor.ui
new file mode 100644
index 0000000..346e4a0
--- /dev/null
+++ b/tools/designer/designer/listboxeditor.ui
@@ -0,0 +1,461 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ListBoxEditorBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ListBoxEditorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>229</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Listbox</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Edit Listbox&lt;/b&gt;&lt;p&gt;Add, edit or delete items in the listbox.&lt;/p&gt;&lt;p&gt;Click the &lt;b&gt;New Item&lt;/b&gt;-button to create a new listbox entry, then enter text and choose a pixmap.&lt;/p&gt;&lt;p&gt;Select an item from the list and click the &lt;b&gt;Delete Item&lt;/b&gt;-button to remove the item from the list.&lt;/p&gt;</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="5" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>helpButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonApply</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Apply all changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QListBox" row="0" column="0" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>preview</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Item list</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The list of items.</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="0" column="2" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Item Properties</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>Label2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Pixmap:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>itemChoosePixmap</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>itemPixmap</cstring>
+ </property>
+ <property name="text">
+ <string>Label4</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>itemDeletePixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_editcut.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Delete the selected item's pixmap.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>itemChoosePixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select a Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a pixmap file for the selected item.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Label1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Text:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>itemText</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>itemText</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change text</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Change the selected item's text.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>itemNew</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Item</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Add an item</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Add a new item.&lt;/b&gt;&lt;p&gt;New items are appended to the list.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>itemDelete</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Item</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete Item</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Delete the selected item</string>
+ </property>
+ </widget>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>Vertical Spacing1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>itemUp</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_up.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move up</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Moves the selected item up.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>itemDown</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_down.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move down</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Move the selected item down.</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>itemNew</sender>
+ <signal>clicked()</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>insertNewItem()</slot>
+ </connection>
+ <connection>
+ <sender>itemDelete</sender>
+ <signal>clicked()</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>deleteCurrentItem()</slot>
+ </connection>
+ <connection>
+ <sender>itemText</sender>
+ <signal>textChanged( const QString &amp; )</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>currentTextChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonApply</sender>
+ <signal>clicked()</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>applyClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>cancelClicked()</slot>
+ </connection>
+ <connection>
+ <sender>itemChoosePixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>choosePixmap()</slot>
+ </connection>
+ <connection>
+ <sender>itemDeletePixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>deletePixmap()</slot>
+ </connection>
+ <connection>
+ <sender>itemUp</sender>
+ <signal>clicked()</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>moveItemUp()</slot>
+ </connection>
+ <connection>
+ <sender>itemDown</sender>
+ <signal>clicked()</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>moveItemDown()</slot>
+ </connection>
+ <connection>
+ <sender>preview</sender>
+ <signal>selectionChanged(QListBoxItem*)</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>currentItemChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>preview</sender>
+ <signal>currentChanged( QListBoxItem * )</signal>
+ <receiver>ListBoxEditorBase</receiver>
+ <slot>currentItemChanged(QListBoxItem*)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+ <tabstop>preview</tabstop>
+ <tabstop>itemNew</tabstop>
+ <tabstop>itemDelete</tabstop>
+ <tabstop>itemUp</tabstop>
+ <tabstop>itemDown</tabstop>
+ <tabstop>itemText</tabstop>
+ <tabstop>itemDeletePixmap</tabstop>
+ <tabstop>itemChoosePixmap</tabstop>
+ <tabstop>helpButton</tabstop>
+ <tabstop>buttonApply</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot access="protected">insertNewItem()</slot>
+ <slot access="protected">deleteCurrentItem()</slot>
+ <slot access="protected">currentItemChanged( QListBoxItem * )</slot>
+ <slot access="protected">currentTextChanged( const QString &amp; )</slot>
+ <slot access="protected">okClicked()</slot>
+ <slot access="protected">cancelClicked()</slot>
+ <slot access="protected">applyClicked()</slot>
+ <slot access="protected">choosePixmap()</slot>
+ <slot access="protected">deletePixmap()</slot>
+ <slot access="protected">moveItemUp()</slot>
+ <slot access="protected">moveItemDown()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/listboxeditorimpl.cpp b/tools/designer/designer/listboxeditorimpl.cpp
new file mode 100644
index 0000000..511fdab
--- /dev/null
+++ b/tools/designer/designer/listboxeditorimpl.cpp
@@ -0,0 +1,250 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "listboxeditorimpl.h"
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "pixmapchooser.h"
+#include "command.h"
+#include "listboxdnd.h"
+#include "listboxrename.h"
+
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+
+ListBoxEditor::ListBoxEditor( QWidget *parent, QWidget *editWidget, FormWindow *fw )
+ : ListBoxEditorBase( parent, 0, TRUE ), formwindow( fw )
+{
+ connect( helpButton, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+ listbox = (QListBox*)editWidget;
+
+ itemText->setText( "" );
+ itemText->setEnabled( FALSE );
+ itemPixmap->setText( "" );
+ itemChoosePixmap->setEnabled( FALSE );
+ itemDeletePixmap->setEnabled( FALSE );
+
+ QListBoxItem *i = 0;
+ for ( i = listbox->firstItem(); i; i = i->next() ) {
+ if ( i->pixmap() )
+ (void)new QListBoxPixmap( preview, *i->pixmap(), i->text() );
+ else
+ (void)new QListBoxText( preview, i->text() );
+ }
+
+ if ( preview->firstItem() )
+ preview->setCurrentItem( preview->firstItem() );
+
+ ListBoxDnd *editorDnd = new ListBoxDnd( preview );
+ editorDnd->setDragMode( ListBoxDnd::Internal | ListBoxDnd::Move );
+ QObject::connect( editorDnd, SIGNAL( dropped( QListBoxItem * ) ),
+ editorDnd, SLOT( confirmDrop( QListBoxItem * ) ) );
+
+ ListBoxRename *editorRename = new ListBoxRename( preview );
+
+ QObjectList *l = parent->queryList( "QLineEdit", "itemText" );
+ QObjectListIt it( *l );
+ QObject *obj;
+ while ( (obj = it.current()) != 0 ) {
+ ++it;
+ QObject::connect( editorRename,
+ SIGNAL( itemTextChanged( const QString & ) ),
+ obj,
+ SLOT( setText( const QString & ) ) );
+ }
+ delete l;
+
+}
+
+void ListBoxEditor::insertNewItem()
+{
+ QListBoxItem *i = new QListBoxText( preview, tr("New Item") );
+ preview->setCurrentItem( i );
+ preview->setSelected( i, TRUE );
+ itemText->setFocus();
+ itemText->selectAll();
+}
+
+void ListBoxEditor::deleteCurrentItem()
+{
+ delete preview->item( preview->currentItem() );
+ if ( preview->currentItem() != -1 )
+ preview->setSelected( preview->currentItem(), TRUE );
+}
+
+void ListBoxEditor::currentItemChanged( QListBoxItem *i )
+{
+ itemText->blockSignals( TRUE );
+ itemText->setText( "" );
+ itemPixmap->setText( "" );
+ itemText->blockSignals( FALSE );
+
+ if ( !i ) {
+ itemText->setEnabled( FALSE );
+ itemChoosePixmap->setEnabled( FALSE );
+ itemDeletePixmap->setEnabled( FALSE );
+ return;
+ }
+
+ itemText->blockSignals( TRUE );
+ itemText->setEnabled( TRUE );
+ itemChoosePixmap->setEnabled( TRUE );
+ itemDeletePixmap->setEnabled( i->pixmap() && !i->pixmap()->isNull() );
+
+ itemText->setText( i->text() );
+ if ( i->pixmap() )
+ itemPixmap->setPixmap( *i->pixmap() );
+ itemText->blockSignals( FALSE );
+}
+
+void ListBoxEditor::currentTextChanged( const QString &txt )
+{
+ if ( preview->currentItem() == -1 )
+ return;
+
+ preview->blockSignals( TRUE );
+ if ( preview->item( preview->currentItem() )->pixmap() )
+ preview->changeItem( *preview->item( preview->currentItem() )->pixmap(), txt, preview->currentItem() );
+ else
+ preview->changeItem( txt, preview->currentItem() );
+ preview->blockSignals( FALSE );
+}
+
+void ListBoxEditor::okClicked()
+{
+ applyClicked();
+ accept();
+}
+
+void ListBoxEditor::cancelClicked()
+{
+ reject();
+}
+
+void ListBoxEditor::applyClicked()
+{
+ QListBoxItem *i = 0;
+ QValueList<PopulateListBoxCommand::Item> items;
+ for ( i = preview->firstItem(); i; i = i->next() ) {
+ PopulateListBoxCommand::Item item;
+ if ( i->pixmap() )
+ item.pix = *i->pixmap();
+ item.text = i->text();
+ items.append( item );
+ }
+
+ PopulateListBoxCommand *cmd = new PopulateListBoxCommand( tr( "Edit the Items of '%1'" ).arg( listbox->name() ),
+ formwindow, listbox, items );
+ cmd->execute();
+ formwindow->commandHistory()->addCommand( cmd );
+}
+
+void ListBoxEditor::choosePixmap()
+{
+ if ( preview->currentItem() == -1 )
+ return;
+
+ QPixmap pix;
+ if ( preview->item( preview->currentItem() )->pixmap() )
+ pix = qChoosePixmap( this, formwindow, *preview->item( preview->currentItem() )->pixmap() );
+ else
+ pix = qChoosePixmap( this, formwindow, QPixmap() );
+
+ if ( pix.isNull() )
+ return;
+
+ QString txt = preview->item( preview->currentItem() )->text();
+ preview->changeItem( pix, txt, preview->currentItem() );
+ itemDeletePixmap->setEnabled( TRUE );
+}
+
+void ListBoxEditor::moveItemUp()
+{
+ if ( preview->currentItem() < 1 )
+ return;
+
+ QListBoxItem *i = preview->item( preview->currentItem() );
+ bool hasPix = (i->pixmap() != 0);
+ QPixmap pix;
+ if ( hasPix )
+ pix = *i->pixmap();
+ QString txt = i->text();
+
+ QListBoxItem *p = i->prev();
+ if ( p->pixmap() )
+ preview->changeItem( *p->pixmap(), p->text(), preview->currentItem() );
+ else
+ preview->changeItem( p->text(), preview->currentItem() );
+
+ if ( hasPix )
+ preview->changeItem( pix, txt, preview->currentItem() - 1 );
+ else
+ preview->changeItem( txt, preview->currentItem() - 1 );
+}
+
+void ListBoxEditor::moveItemDown()
+{
+ if ( preview->currentItem() == -1 || preview->currentItem() > (int)preview->count() - 2 )
+ return;
+
+ QListBoxItem *i = preview->item( preview->currentItem() );
+ bool hasPix = (i->pixmap() != 0);
+ QPixmap pix;
+ if ( hasPix )
+ pix = *i->pixmap();
+ QString txt = i->text();
+
+ QListBoxItem *n = i->next();
+ if ( n->pixmap() )
+ preview->changeItem( *n->pixmap(), n->text(), preview->currentItem() );
+ else
+ preview->changeItem( n->text(), preview->currentItem() );
+
+ if ( hasPix )
+ preview->changeItem( pix, txt, preview->currentItem() + 1 );
+ else
+ preview->changeItem( txt, preview->currentItem() + 1 );
+}
+
+void ListBoxEditor::deletePixmap()
+{
+ if ( preview->currentItem() == -1 )
+ return;
+
+ QListBoxItem *i = preview->item( preview->currentItem() );
+ preview->changeItem( i->text(), preview->currentItem() );
+ itemDeletePixmap->setEnabled( FALSE );
+}
diff --git a/tools/designer/designer/listboxeditorimpl.h b/tools/designer/designer/listboxeditorimpl.h
new file mode 100644
index 0000000..04f9b33
--- /dev/null
+++ b/tools/designer/designer/listboxeditorimpl.h
@@ -0,0 +1,68 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef LISTBOXEDITORIMPL_H
+#define LISTBOXEDITORIMPL_H
+
+class QListBox;
+class FormWindow;
+
+#include "listboxeditor.h"
+
+class ListBoxEditor : public ListBoxEditorBase
+{
+ Q_OBJECT
+
+public:
+ ListBoxEditor( QWidget *parent, QWidget *editWidget, FormWindow *fw );
+
+protected slots:
+ void insertNewItem();
+ void deleteCurrentItem();
+ void currentItemChanged( QListBoxItem * );
+ void currentTextChanged( const QString & );
+ void okClicked();
+ void cancelClicked();
+ void applyClicked();
+ void choosePixmap();
+ void moveItemUp();
+ void moveItemDown();
+ void deletePixmap();
+
+private:
+ QListBox *listbox;
+ FormWindow *formwindow;
+
+};
+
+#endif
diff --git a/tools/designer/designer/listboxrename.cpp b/tools/designer/designer/listboxrename.cpp
new file mode 100644
index 0000000..983c5db
--- /dev/null
+++ b/tools/designer/designer/listboxrename.cpp
@@ -0,0 +1,164 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qheader.h>
+#include <qlineedit.h>
+#include <qtimer.h>
+#include "listboxrename.h"
+
+class EditableListBoxItem : public QListBoxItem
+{
+public:
+ void setText( const QString & text )
+ {
+ QListBoxItem::setText( text );
+ }
+};
+
+ListBoxRename::ListBoxRename( QListBox * eventSource, const char * name )
+ : QObject( eventSource, name ),
+ clickedItem( 0 ), activity( FALSE )
+{
+ src = eventSource;
+ src->installEventFilter( this );
+ ed = new QLineEdit( src->viewport() );
+ ed->hide();
+ ed->setFrame( FALSE );
+
+ QObject::connect( ed, SIGNAL( returnPressed() ),
+ this, SLOT( renameClickedItem() ) );
+}
+
+bool ListBoxRename::eventFilter( QObject *, QEvent * event )
+{
+ switch ( event->type() ) {
+
+ case QEvent::MouseButtonPress:
+ {
+ QPoint pos = ((QMouseEvent *) event)->pos();
+
+ if ( clickedItem &&
+ clickedItem->isSelected() &&
+ (clickedItem == src->itemAt( pos )) ) {
+ QTimer::singleShot( 500, this, SLOT( showLineEdit() ) );
+ activity = FALSE; // no drags or clicks for 500 ms before we start the renaming
+ } else { // new item clicked
+ activity = TRUE;
+ clickedItem = src->itemAt( pos );
+ ed->hide();
+ }
+ }
+ break;
+
+ case QEvent::MouseMove:
+
+ if ( ((QMouseEvent *) event)->state() & Qt::LeftButton ) {
+ activity = TRUE; // drag
+ }
+ break;
+
+ case QEvent::KeyPress:
+
+ switch ( ((QKeyEvent *) event)->key() ) {
+
+ case Qt::Key_F2:
+
+ activity = FALSE;
+ clickedItem = src->item( src->currentItem() );
+ showLineEdit();
+ break;
+
+ case Qt::Key_Escape:
+ if ( !ed->isHidden() ) {
+ hideLineEdit(); // abort rename
+ return TRUE;
+ }
+ break;
+
+ case Qt::Key_Up:
+ case Qt::Key_Down:
+ case Qt::Key_PageUp:
+ case Qt::Key_PageDown:
+
+ if ( !ed->isHidden() )
+ return TRUE; // Filter out the keystrokes
+ break;
+
+ }
+ break;
+
+ case QEvent::Resize:
+
+ if ( clickedItem && ed && !ed->isHidden() ) {
+ QRect rect = src->itemRect( clickedItem );
+ ed->resize( rect.right() - rect.left() - 1,
+ rect.bottom() - rect.top() - 1 );
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+void ListBoxRename::showLineEdit()
+{
+ if ( !clickedItem || activity )
+ return;
+ QRect rect = src->itemRect( clickedItem );
+ ed->resize( rect.right() - rect.left() - 1,
+ rect.bottom() - rect.top() - 1 );
+ ed->move( rect.left() + 1, rect.top() + 1 );
+ ed->setText( clickedItem->text() );
+ ed->selectAll();
+ ed->show();
+ ed->setFocus();
+}
+
+void ListBoxRename::hideLineEdit()
+{
+ ed->hide();
+ clickedItem = 0;
+ src->setFocus();
+}
+
+void ListBoxRename::renameClickedItem()
+{
+ if ( clickedItem && ed ) {
+ ( (EditableListBoxItem *) clickedItem )->setText( ed->text() );
+ emit itemTextChanged( ed->text() );
+ }
+ hideLineEdit();
+}
diff --git a/tools/designer/designer/listboxrename.h b/tools/designer/designer/listboxrename.h
new file mode 100644
index 0000000..d6d9bc6
--- /dev/null
+++ b/tools/designer/designer/listboxrename.h
@@ -0,0 +1,64 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef LISTBOXRENAME_H
+#define LISTBOXRENAME_H
+
+#include <qobject.h>
+#include <qlistbox.h>
+
+class QLineEdit;
+
+class ListBoxRename : public QObject
+{
+ Q_OBJECT
+public:
+ ListBoxRename( QListBox * eventSource, const char * name = 0 );
+ bool eventFilter( QObject *, QEvent * event );
+
+signals:
+ void itemTextChanged( const QString & );
+
+public slots:
+ void showLineEdit();
+ void hideLineEdit();
+ void renameClickedItem();
+
+private:
+ QListBoxItem * clickedItem;
+ QListBox * src;
+ QLineEdit * ed;
+ bool activity;
+};
+
+#endif //LISTBOXRENAME_H
diff --git a/tools/designer/designer/listdnd.cpp b/tools/designer/designer/listdnd.cpp
new file mode 100644
index 0000000..27adccd
--- /dev/null
+++ b/tools/designer/designer/listdnd.cpp
@@ -0,0 +1,149 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "listdnd.h"
+#include <qwidget.h>
+#include <qpainter.h>
+
+ListDnd::ListDnd( QScrollView * eventSource, const char * name )
+ : QObject( eventSource, name ),
+ dragInside( FALSE ), dragDelete( TRUE ), dropConfirmed( FALSE ), dMode( Both )
+{
+ src = eventSource;
+ src->setAcceptDrops( TRUE );
+ src->installEventFilter( this );
+ src->viewport()->installEventFilter( this );
+
+ line = new QWidget( src->viewport(), 0, Qt::WStyle_NoBorder | WStyle_StaysOnTop );
+ line->setBackgroundColor( Qt::black );
+ line->resize( src->viewport()->width(), 2 );
+ line->hide();
+}
+
+void ListDnd::setDragMode( int mode )
+{
+ dMode = mode;
+}
+
+int ListDnd::dragMode() const
+{
+ return dMode;
+}
+
+bool ListDnd::eventFilter( QObject *, QEvent * event )
+{
+ switch ( event->type() ) {
+ case QEvent::DragEnter:
+ return dragEnterEvent( (QDragEnterEvent *) event );
+ case QEvent::DragLeave:
+ return dragLeaveEvent( (QDragLeaveEvent *) event );
+ case QEvent::DragMove:
+ return dragMoveEvent( (QDragMoveEvent *) event );
+ case QEvent::Drop:
+ return dropEvent( (QDropEvent *) event );
+ case QEvent::MouseButtonPress:
+ return mousePressEvent( (QMouseEvent *) event );
+ case QEvent::MouseMove:
+ return mouseMoveEvent( (QMouseEvent *) event );
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+
+bool ListDnd::dragEnterEvent( QDragEnterEvent * event )
+{
+ if ( dMode == None ) {
+ return TRUE;
+ }
+
+ bool ok = ( ( ( dMode & Both ) == Both ) ||
+ ( ( dMode & Internal ) && ( event->source() == src ) ) ||
+ ( ( dMode & External ) && ( event->source() != src ) ) );
+
+ if ( ok && canDecode( event ) ) {
+ event->accept();
+ dragInside = TRUE;
+ if ( !( dMode & NullDrop ) ) {
+ updateLine( event->pos() );
+ line->show();
+ }
+ }
+ return TRUE;
+}
+
+bool ListDnd::dragLeaveEvent( QDragLeaveEvent * )
+{
+ dragInside = FALSE;
+ line->hide();
+ return TRUE;
+}
+
+bool ListDnd::dragMoveEvent( QDragMoveEvent * event )
+{
+ if ( dragInside && dMode && !( dMode & NullDrop ) ) {
+ updateLine( event->pos() );
+ }
+ return TRUE;
+}
+
+bool ListDnd::dropEvent( QDropEvent * )
+{
+ // do nothing
+ return FALSE;
+}
+
+bool ListDnd::mousePressEvent( QMouseEvent * event )
+{
+ if ( event->button() == LeftButton )
+ mousePressPos = event->pos();
+ return FALSE;
+}
+
+bool ListDnd::mouseMoveEvent( QMouseEvent * )
+{
+ // do nothing
+ return FALSE;
+}
+
+void ListDnd::updateLine( const QPoint & )
+{
+ // do nothing
+}
+
+bool ListDnd::canDecode( QDragEnterEvent * )
+{
+ // do nothing
+ return FALSE;
+}
diff --git a/tools/designer/designer/listdnd.h b/tools/designer/designer/listdnd.h
new file mode 100644
index 0000000..2802642
--- /dev/null
+++ b/tools/designer/designer/listdnd.h
@@ -0,0 +1,70 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef LISTDND_H
+#define LISTDND_H
+
+#include <qobject.h>
+#include <qscrollview.h>
+
+class ListDnd : public QObject
+{
+ Q_OBJECT
+public:
+ enum DragMode { None = 0, External = 1, Internal = 2, Both = 3, Move = 4, NullDrop = 8 };
+ ListDnd( QScrollView * eventSource, const char * name = 0 );
+ void setDragMode( int mode );
+ int dragMode() const;
+ bool eventFilter( QObject *, QEvent * event );
+
+protected:
+ virtual bool dragEnterEvent( QDragEnterEvent * event );
+ virtual bool dragLeaveEvent( QDragLeaveEvent * );
+ virtual bool dragMoveEvent( QDragMoveEvent * event );
+ virtual bool dropEvent( QDropEvent * event );
+ virtual bool mousePressEvent( QMouseEvent * event );
+ virtual bool mouseMoveEvent( QMouseEvent * event );
+ virtual void updateLine( const QPoint & dragPos );
+ virtual bool canDecode( QDragEnterEvent * event );
+
+ QScrollView * src;
+ QWidget * line;
+ QPoint mousePressPos;
+ QPoint dragPos;
+ bool dragInside;
+ bool dragDelete;
+ bool dropConfirmed;
+ int dMode;
+};
+
+#endif // LISTDND_H
diff --git a/tools/designer/designer/listeditor.ui b/tools/designer/designer/listeditor.ui
new file mode 100644
index 0000000..58ed838
--- /dev/null
+++ b/tools/designer/designer/listeditor.ui
@@ -0,0 +1,182 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ListEditor</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ListEditor</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>331</width>
+ <height>301</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit...</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListView" row="0" column="0" rowspan="5" colspan="1">
+ <column>
+ <property name="text">
+ <string>Column 1</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>listview</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>Extended</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>PushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>Re&amp;name</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>PushButton4</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>ListEditor</receiver>
+ <slot>addItem()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>ListEditor</receiver>
+ <slot>removeItems()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton4</sender>
+ <signal>clicked()</signal>
+ <receiver>ListEditor</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>listview</sender>
+ <signal>itemRenamed(QListViewItem*,int)</signal>
+ <receiver>ListEditor</receiver>
+ <slot>renamed(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>PushButton3</sender>
+ <signal>clicked()</signal>
+ <receiver>ListEditor</receiver>
+ <slot>renameItem()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">listeditor.ui.h</include>
+</includes>
+<forwards>
+ <forward>class QStringList;</forward>
+</forwards>
+<slots>
+ <slot>init()</slot>
+ <slot>setList( const QStringList &amp; l )</slot>
+ <slot>addItem()</slot>
+ <slot>renamed( QListViewItem * i )</slot>
+ <slot>removeItems()</slot>
+ <slot returnType="QStringList">items()</slot>
+ <slot>renameItem()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/listeditor.ui.h b/tools/designer/designer/listeditor.ui.h
new file mode 100644
index 0000000..bba0610
--- /dev/null
+++ b/tools/designer/designer/listeditor.ui.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+#include <qheader.h>
+#include <qapplication.h>
+
+void ListEditor::init()
+{
+ listview->header()->hide();
+ listview->setSorting( -1 );
+ listview->setDefaultRenameAction( QListView::Accept );
+}
+
+void ListEditor::setList( const QStringList &l )
+{
+ QListViewItem *i = 0;
+ for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
+ i = new QListViewItem( listview, i );
+ i->setText( 0, *it );
+ i->setRenameEnabled( 0, TRUE );
+ }
+}
+
+void ListEditor::addItem()
+{
+ QListViewItem *i = new QListViewItem( listview, listview->lastItem() );
+ i->setRenameEnabled( 0, TRUE );
+ qApp->processEvents();
+ i->startRename( 0 );
+}
+
+void ListEditor::renamed( QListViewItem *i )
+{
+ if ( i && i->text( 0 ).isEmpty() )
+ i->startRename( 0 );
+}
+
+void ListEditor::removeItems()
+{
+ QListViewItemIterator it( listview );
+ QListViewItem *i = 0;
+ while ( ( i = it.current() ) ) {
+ ++it;
+ if ( i->isSelected() )
+ delete i;
+ }
+}
+
+QStringList ListEditor::items()
+{
+ QStringList l;
+ QListViewItemIterator it( listview );
+ QListViewItem *i = 0;
+ while ( ( i = it.current() ) ) {
+ ++it;
+ if ( !i->text( 0 ).isEmpty() )
+ l << i->text( 0 );
+ }
+ return l;
+}
+
+void ListEditor::renameItem()
+{
+ QListViewItem *i = listview->currentItem();
+ if ( i )
+ i->startRename( 0 );
+}
diff --git a/tools/designer/designer/listviewdnd.cpp b/tools/designer/designer/listviewdnd.cpp
new file mode 100644
index 0000000..ce0afeb
--- /dev/null
+++ b/tools/designer/designer/listviewdnd.cpp
@@ -0,0 +1,439 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "listviewdnd.h"
+#include <qwidget.h>
+#include <qheader.h>
+#include <qpainter.h>
+#include <qdragobject.h>
+#include <qvaluelist.h>
+
+// The Dragobject Declaration ---------------------------------------
+class ListViewItemDrag : public QStoredDrag
+{
+public:
+ enum DropRelation { Sibling, Child };
+ ListViewItemDrag( ListViewItemList & items, QWidget * parent = 0, const char * name = 0 );
+ ~ListViewItemDrag() {};
+ static bool canDecode( QDragMoveEvent * event );
+ static bool decode( QDropEvent * event, QListView * parent, QListViewItem * insertPoint, DropRelation dr );
+};
+// ------------------------------------------------------------------
+
+ListViewDnd::ListViewDnd( QListView * eventSource, const char * name )
+ : ListDnd( eventSource, name ) { }
+
+void ListViewDnd::confirmDrop( QListViewItem * )
+{
+ dropConfirmed = TRUE;
+}
+
+bool ListViewDnd::dropEvent( QDropEvent * event )
+{
+ if ( dragInside ) {
+
+ if ( dMode & NullDrop ) { // combined with Move, a NullDrop will delete an item
+ event->accept();
+ emit dropped( 0 ); // a NullDrop
+ return TRUE;
+ }
+
+ QPoint pos = event->pos();
+
+ ListViewItemDrag::DropRelation dr = ListViewItemDrag::Sibling;
+ QListViewItem *item = itemAt( pos );
+ int dpos = dropDepth( item, pos );
+
+ if ( item ) {
+ if ( dpos > item->depth() && !(dMode & Flat) ) {
+ // Child node
+ dr = ListViewItemDrag::Child;
+ } else if ( dpos < item->depth() ) {
+ // Parent(s) Sibling
+ while ( item && (item->depth() > dpos) )
+ item = item->parent();
+ }
+ }
+
+ if ( ListViewItemDrag::decode( event, (QListView *) src, item, dr ) ) {
+ event->accept();
+ emit dropped( 0 ); // Use ID instead of item?
+ }
+ }
+
+ line->hide();
+ dragInside = FALSE;
+
+ return TRUE;
+}
+
+bool ListViewDnd::mouseMoveEvent( QMouseEvent * event )
+{
+ if ( event->state() & LeftButton ) {
+ if ( ( event->pos() - mousePressPos ).manhattanLength() > 3 ) {
+ ListViewItemList list;
+
+ if ( dMode & Flat )
+ buildFlatList( list );
+ else
+ buildTreeList( list );
+
+ ListViewItemDrag * dragobject = new ListViewItemDrag( list, (QListView *) src );
+
+ if ( dMode & Move ) {
+ disabledItems = list;
+ setVisibleItems( FALSE );
+ }
+
+ dragobject->dragCopy();
+
+ if ( dMode & Move ) {
+ // Did the target accept the drop?
+ if ( dropConfirmed ) {
+ // Shouldn't autoDelete handle this?
+ for( list.first(); list.current(); list.next() )
+ delete list.current();
+ dropConfirmed = FALSE;
+ } else {
+ // Reenable disabled items since
+ // drag'n'drop was aborted
+ setVisibleItems( TRUE );
+ }
+ disabledItems.clear();
+ }
+ }
+ }
+ return FALSE;
+}
+
+int ListViewDnd::buildFlatList( ListViewItemList & list )
+{
+ bool addKids = FALSE;
+ QListViewItem *nextSibling = 0;
+ QListViewItem *nextParent = 0;
+ QListViewItemIterator it = ((QListView *)src)->firstChild();
+ for ( ; *it; it++ ) {
+ // Hit the nextSibling, turn of child processing
+ if ( (*it) == nextSibling )
+ addKids = FALSE;
+
+ if ( (*it)->isSelected() ) {
+ if ( (*it)->childCount() == 0 ) {
+ // Selected, no children
+ list.append( *it );
+ } else if ( !addKids ) {
+ // Children processing not set, so set it
+ // Also find the item were we shall quit
+ // processing children...if any such item
+ addKids = TRUE;
+ nextSibling = (*it)->nextSibling();
+ nextParent = (*it)->parent();
+ while ( nextParent && !nextSibling ) {
+ nextSibling = nextParent->nextSibling();
+ nextParent = nextParent->parent();
+ }
+ }
+ } else if ( ((*it)->childCount() == 0) && addKids ) {
+ // Leaf node, and we _do_ process children
+ list.append( *it );
+ }
+ }
+ return list.count();
+}
+
+int ListViewDnd::buildTreeList( ListViewItemList & list )
+{
+ QListViewItemIterator it = ((QListView *)src)->firstChild();
+ for ( ; *it; it++ ) {
+ if ( (*it)->isSelected() )
+ list.append( *it );
+ }
+ return list.count();
+}
+
+void ListViewDnd::setVisibleItems( bool b )
+{
+ if ( disabledItems.isEmpty() )
+ return;
+
+ disabledItems.first();
+ do {
+ disabledItems.current()->setVisible( b );
+ } while ( disabledItems.next() );
+}
+
+void ListViewDnd::updateLine( const QPoint & dragPos )
+{
+ QListViewItem * item = itemAt(dragPos);
+ QListView * src = (QListView *) this->src;
+
+ int ypos = item ?
+ ( src->itemRect( item ).bottom() - ( line->height() / 2 ) ) :
+ ( src->itemRect( src->firstChild() ).top() );
+
+ int xpos = dropDepth( item, dragPos ) * src->treeStepSize();
+ line->resize( src->viewport()->width() - xpos, line->height() );
+ line->move( xpos, ypos );
+}
+
+QListViewItem * ListViewDnd::itemAt( QPoint pos )
+{
+ QListView * src = (QListView *) this->src;
+ int headerHeight = (int)(src->header()->height());
+ pos.ry() -= headerHeight;
+ QListViewItem * result = src->itemAt( pos );
+
+ if ( result && ( pos.ry() < (src->itemPos(result) + result->height()/2) ) )
+ result = result->itemAbove();
+
+ // Wind back if has parent, and we're in flat mode
+ while ( result && result->parent() && (dMode & Flat) )
+ result = result->parent();
+
+ // Wind back if has parent, and we're in flat mode
+ while ( result && !result->isVisible() && result->parent() )
+ result = result->parent();
+
+ if ( !result && src->firstChild() && (pos.y() > src->itemRect(src->firstChild()).bottom()) ) {
+ result = src->lastItem();
+ if ( !result->isVisible() )
+ // Handle special case where last item is actually hidden
+ result = result->itemAbove();
+ }
+
+ return result;
+}
+
+int ListViewDnd::dropDepth( QListViewItem * item, QPoint pos )
+{
+ if ( !item || (dMode & Flat) )
+ return 0;
+
+ int result = 0;
+ int itemDepth = item->depth();
+ int indentSize = ((QListView *)src)->treeStepSize();
+ int itemLeft = indentSize * itemDepth;
+ int childMargin = indentSize*2;
+ if ( pos.x() > itemLeft + childMargin ) {
+ result = itemDepth + 1;
+ } else if ( pos.x() < itemLeft ) {
+ result = pos.x() / indentSize;
+ } else {
+ result = itemDepth;
+ }
+ return result;
+}
+
+bool ListViewDnd::canDecode( QDragEnterEvent * event )
+{
+ return ListViewItemDrag::canDecode( event );
+}
+
+// ------------------------------------------------------------------
+// The Dragobject Implementation ------------------------------------
+// ------------------------------------------------------------------
+
+QDataStream & operator<< ( QDataStream & stream, const QListViewItem & item );
+QDataStream & operator>> ( QDataStream & stream, QListViewItem & item );
+
+ListViewItemDrag::ListViewItemDrag( ListViewItemList & items, QWidget * parent, const char * name )
+ : QStoredDrag( "qt/listviewitem", parent, name )
+{
+ // ### FIX!
+ QByteArray data( sizeof( Q_INT32 ) + sizeof( QListViewItem ) * items.count() );
+ QDataStream stream( data, IO_WriteOnly );
+
+ stream << items.count();
+
+ QListViewItem *i = items.first();
+ while ( i ) {
+ stream << *i;
+ i = items.next();
+ }
+
+ setEncodedData( data );
+}
+
+bool ListViewItemDrag::canDecode( QDragMoveEvent * event )
+{
+ return event->provides( "qt/listviewitem" );
+}
+
+bool ListViewItemDrag::decode( QDropEvent * event, QListView * parent, QListViewItem * insertPoint, DropRelation dr )
+{
+ QByteArray data = event->encodedData( "qt/listviewitem" );
+ QListViewItem* itemParent = insertPoint ? insertPoint->parent() : 0;
+
+ // Change from sibling (default) to child creation
+ if ( insertPoint && dr == Child ) {
+ itemParent = insertPoint;
+ insertPoint = 0;
+ }
+
+ if ( data.size() ) {
+ event->accept();
+ QDataStream stream( data, IO_ReadOnly );
+
+ int count = 0;
+ stream >> count;
+
+ for( int i = 0; i < count; i++ ) {
+ if ( itemParent ) {
+ insertPoint = new QListViewItem( itemParent, insertPoint );
+ itemParent->setOpen( TRUE );
+ } else { // No parent for insertPoint, use QListView
+ insertPoint = new QListViewItem( parent, insertPoint );
+ }
+ stream >> *insertPoint;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+QDataStream & operator<< ( QDataStream & stream, const QListViewItem & item )
+{
+ int columns = item.listView()->columns();
+ stream << columns;
+
+ Q_UINT8 b = 0;
+
+ int i;
+ for ( i = 0; i < columns; i++ ) {
+ b = (Q_UINT8) ( item.text( i ) != QString::null ); // does column i have a string ?
+ stream << b;
+ if ( b ) {
+ stream << item.text( i );
+ }
+ }
+
+ for ( i = 0; i < columns; i++ ) {
+ b = (Q_UINT8) ( !!item.pixmap( i ) ); // does column i have a pixmap ?
+ stream << b;
+ if ( b ) {
+ stream << ( *item.pixmap( i ) );
+ }
+ }
+
+ stream << (Q_UINT8) item.isOpen();
+ stream << (Q_UINT8) item.isSelectable();
+ stream << (Q_UINT8) item.isExpandable();
+ stream << (Q_UINT8) item.dragEnabled();
+ stream << (Q_UINT8) item.dropEnabled();
+ stream << (Q_UINT8) item.isVisible();
+
+ for ( i = 0; i < columns; i++ ) {
+ stream << (Q_UINT8) item.renameEnabled( i );
+ }
+
+ stream << (Q_UINT8) item.multiLinesEnabled();
+ stream << item.childCount();
+
+ if ( item.childCount() > 0 ) {
+ QListViewItem * child = item.firstChild();
+ while ( child ) {
+ stream << ( *child ); // recursive call
+ child = child->nextSibling();
+ }
+ }
+
+ return stream;
+}
+
+QDataStream & operator>> ( QDataStream & stream, QListViewItem & item )
+{
+ Q_INT32 columns;
+ stream >> columns;
+
+ Q_UINT8 b = 0;
+
+ QString text;
+ int i;
+ for ( i = 0; i < columns; i++ ) {
+ stream >> b;
+ if ( b ) { // column i has string ?
+ stream >> text;
+ item.setText( i, text );
+ }
+ }
+
+ QPixmap pixmap;
+ for ( i = 0; i < columns; i++ ) {
+ stream >> b; // column i has pixmap ?
+ if ( b ) {
+ stream >> pixmap;
+ item.setPixmap( i, pixmap );
+ }
+ }
+
+ stream >> b;
+ item.setOpen( b );
+
+ stream >> b;
+ item.setSelectable( b );
+
+ stream >> b;
+ item.setExpandable( b );
+
+ stream >> b;
+ item.setDragEnabled( b );
+
+ stream >> b;
+ item.setDropEnabled( b );
+
+ stream >> b;
+ item.setVisible( b );
+
+ for ( i = 0; i < columns; i++ ) {
+ stream >> b;
+ item.setRenameEnabled( i, b );
+ }
+
+ stream >> b;
+ item.setMultiLinesEnabled( b );
+
+ int childCount;
+ stream >> childCount;
+
+ QListViewItem *child = 0;
+ QListViewItem *prevchild = 0;
+ for ( i = 0; i < childCount; i++ ) {
+ child = new QListViewItem( &item, prevchild );
+ stream >> ( *child );
+ item.insertItem( child );
+ prevchild = child;
+ }
+
+ return stream;
+}
diff --git a/tools/designer/designer/listviewdnd.h b/tools/designer/designer/listviewdnd.h
new file mode 100644
index 0000000..4978e7e
--- /dev/null
+++ b/tools/designer/designer/listviewdnd.h
@@ -0,0 +1,73 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef LISTVIEWDND_H
+#define LISTVIEWDND_H
+
+#include <qptrlist.h>
+#include <qlistview.h>
+#include "listdnd.h"
+
+class QWidget;
+class QListView;
+typedef QPtrList<QListViewItem> ListViewItemList;
+
+class ListViewDnd : public ListDnd
+{
+ Q_OBJECT
+public:
+ enum DragMode { Flat = 16 }; // see ListDnd::DragMode
+
+ ListViewDnd( QListView * eventSource, const char * name = 0 );
+
+signals:
+ void dropped( QListViewItem * );
+
+public slots:
+ void confirmDrop( QListViewItem * );
+
+protected:
+ virtual bool dropEvent( QDropEvent * event );
+ virtual bool mouseMoveEvent( QMouseEvent * event );
+ virtual void updateLine( const QPoint & pos );
+ virtual bool canDecode( QDragEnterEvent * event );
+private:
+ QListViewItem * itemAt( QPoint pos );
+ int dropDepth( QListViewItem * item, QPoint pos );
+ int buildFlatList( ListViewItemList & list );
+ int buildTreeList( ListViewItemList & list );
+ void setVisibleItems( bool b );
+ ListViewItemList disabledItems;
+};
+
+#endif //LISTVIEWDND_H
diff --git a/tools/designer/designer/listvieweditor.ui b/tools/designer/designer/listvieweditor.ui
new file mode 100644
index 0000000..5357d28
--- /dev/null
+++ b/tools/designer/designer/listvieweditor.ui
@@ -0,0 +1,938 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ListViewEditorBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ListViewEditorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>567</width>
+ <height>398</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Listview</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Edit Listview&lt;/b&gt;&lt;p&gt;Use the controls on the &lt;b&gt;Items&lt;/b&gt;-tab to add, edit or delete items in the listview. Change the column configuration of the listview using the controls on the &lt;b&gt;Columns&lt;/b&gt;-tab.&lt;/p&gt;Click the &lt;b&gt;New Item&lt;/b&gt;-button to create a new item, then enter text and add a pixmap.&lt;/p&gt;&lt;p&gt;Select an item from the list and click the &lt;b&gt;Delete Item&lt;/b&gt;-button to remove the item from the list.&lt;/p&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget10</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Items</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>itemDelete</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Item</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete item</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Deletes the selected item.&lt;/b&gt;&lt;p&gt;Any sub-items are also deleted.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="0" column="2" rowspan="8" colspan="1">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Item Properties</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>Label2</cstring>
+ </property>
+ <property name="text">
+ <string>Pi&amp;xmap:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>itemChoosePixmap</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>Label1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Text:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>itemText</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>itemText</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change text</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Change the text of the item.&lt;/b&gt;&lt;p&gt;The text will be changed in the current column of the selected item.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>itemColumn</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change column</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Select the current column.&lt;/b&gt;&lt;p&gt;The item's text and pixmap will be changed for the current column&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Label4</cstring>
+ </property>
+ <property name="text">
+ <string>Colu&amp;mn:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>itemColumn</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>itemPixmap</cstring>
+ </property>
+ <property name="text">
+ <string>Label4</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>itemDeletePixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_editcut.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Delete the selected item's pixmap.&lt;/b&gt;&lt;p&gt;The pixmap in the current column of the selected item will be deleted.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>itemChoosePixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select a Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Select a pixmap file for the item.&lt;/b&gt;&lt;p&gt;The pixmap will be changed in the current column of the selected item.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>itemNew</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Item</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Add an item</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Adds a new item to the list.&lt;/b&gt;&lt;p&gt;The item will be inserted at the top of the list and can be moved using the up- and down-buttons.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="0" column="0" rowspan="8" colspan="1">
+ <property name="name">
+ <cstring>itemsPreview</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The list of items.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>itemNewSub</cstring>
+ </property>
+ <property name="text">
+ <string>New &amp;Subitem</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Add a subitem</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Create a new sub-item for the selected item.&lt;/b&gt;&lt;p&gt;New sub-items are inserted at the top of the list of sub-items, and new levels are created automatically.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>Vertical Spacing1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>itemUp</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_up.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move up</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Move the selected item up.&lt;/b&gt;&lt;p&gt;The item will be moved within its level in the hierarchy.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="1">
+ <property name="name">
+ <cstring>itemDown</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_down.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move down</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Move the selected item down.&lt;/b&gt;&lt;p&gt;The item will be moved within its level in the hierarchy.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="6" column="1">
+ <property name="name">
+ <cstring>itemLeft</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_left.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move left</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Move the selected item one level up.&lt;/b&gt;&lt;p&gt;This will also change the level of the item's sub-items.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="7" column="1">
+ <property name="name">
+ <cstring>itemRight</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_right.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move right</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Move the selected item one level down.&lt;/b&gt;&lt;p&gt;This will also change the level of the item's sub-items.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget11</cstring>
+ </property>
+ <attribute name="title">
+ <string>Co&amp;lumns</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QGroupBox" row="0" column="2" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Column Properties</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>Label2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Pixmap:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>colChoosePixmap</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>colPixmap</cstring>
+ </property>
+ <property name="text">
+ <string>Label4</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>colDeletePixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_editcut.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Delete the pixmap of the selected column.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>colChoosePixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select a Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Select a pixmap file for the selected column.&lt;/b&gt;&lt;p&gt;The pixmap will be displayed in the header of the listview.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Label1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Text:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>colText</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>colText</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enter column text</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Enter the text for the selected column.&lt;/b&gt;&lt;p&gt;The text will be displayed in the header of the listview.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>colClickable</cstring>
+ </property>
+ <property name="text">
+ <string>Clicka&amp;ble</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is checked, the selected column will react to mouse clicks on the header.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>colResizable</cstring>
+ </property>
+ <property name="text">
+ <string>Re&amp;sizable</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The column's width will be resizable if this option is checked.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>colDelete</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Column</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete column</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Deletes the selected Column.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>colDown</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_down.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move down</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Move the selected item down.&lt;/b&gt;&lt;p&gt;The top-most column will be the first column in the list.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>colNew</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Column</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Add a Column</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Create a new column.&lt;/b&gt;&lt;p&gt;New columns are appended at the end of (right of) the list and may be moved using the up- and down-buttons.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>colUp</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_up.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move up</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Move the selected item up.&lt;/b&gt;&lt;p&gt;The top-most column will be the first column in the list.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QListBox" row="0" column="0" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>colPreview</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The list of columns.</string>
+ </property>
+ </widget>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>Vertical Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>helpButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>applyButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Apply all changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>itemNew</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemNewClicked()</slot>
+ </connection>
+ <connection>
+ <sender>itemDelete</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemDeleteClicked()</slot>
+ </connection>
+ <connection>
+ <sender>itemUp</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemUpClicked()</slot>
+ </connection>
+ <connection>
+ <sender>itemDown</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemDownClicked()</slot>
+ </connection>
+ <connection>
+ <sender>itemColumn</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemColChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>itemText</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemTextChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>itemDeletePixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemPixmapDeleted()</slot>
+ </connection>
+ <connection>
+ <sender>itemChoosePixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemPixmapChoosen()</slot>
+ </connection>
+ <connection>
+ <sender>colNew</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>newColumnClicked()</slot>
+ </connection>
+ <connection>
+ <sender>colDelete</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>deleteColumnClicked()</slot>
+ </connection>
+ <connection>
+ <sender>colUp</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>columnUpClicked()</slot>
+ </connection>
+ <connection>
+ <sender>colDown</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>columnDownClicked()</slot>
+ </connection>
+ <connection>
+ <sender>colText</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>columnTextChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>colDeletePixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>columnPixmapDeleted()</slot>
+ </connection>
+ <connection>
+ <sender>colChoosePixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>columnPixmapChosen()</slot>
+ </connection>
+ <connection>
+ <sender>colResizable</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>columnResizable(bool)</slot>
+ </connection>
+ <connection>
+ <sender>colClickable</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>columnClickable(bool)</slot>
+ </connection>
+ <connection>
+ <sender>tabWidget</sender>
+ <signal>selected(const QString&amp;)</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>initTabPage(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>applyButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>applyClicked()</slot>
+ </connection>
+ <connection>
+ <sender>colPreview</sender>
+ <signal>currentChanged(QListBoxItem*)</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>currentColumnChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>colPreview</sender>
+ <signal>selectionChanged(QListBoxItem*)</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>currentColumnChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>itemsPreview</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>currentItemChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>itemsPreview</sender>
+ <signal>selectionChanged(QListViewItem*)</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>currentItemChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>itemNewSub</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemNewSubClicked()</slot>
+ </connection>
+ <connection>
+ <sender>itemLeft</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemLeftClicked()</slot>
+ </connection>
+ <connection>
+ <sender>itemRight</sender>
+ <signal>clicked()</signal>
+ <receiver>ListViewEditorBase</receiver>
+ <slot>itemRightClicked()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>okButton</tabstop>
+ <tabstop>cancelButton</tabstop>
+ <tabstop>tabWidget</tabstop>
+ <tabstop>itemsPreview</tabstop>
+ <tabstop>itemNew</tabstop>
+ <tabstop>itemNewSub</tabstop>
+ <tabstop>itemDelete</tabstop>
+ <tabstop>itemUp</tabstop>
+ <tabstop>itemDown</tabstop>
+ <tabstop>itemLeft</tabstop>
+ <tabstop>itemRight</tabstop>
+ <tabstop>itemColumn</tabstop>
+ <tabstop>itemText</tabstop>
+ <tabstop>itemDeletePixmap</tabstop>
+ <tabstop>itemChoosePixmap</tabstop>
+ <tabstop>helpButton</tabstop>
+ <tabstop>applyButton</tabstop>
+ <tabstop>colPreview</tabstop>
+ <tabstop>colNew</tabstop>
+ <tabstop>colDelete</tabstop>
+ <tabstop>colUp</tabstop>
+ <tabstop>colDown</tabstop>
+ <tabstop>colText</tabstop>
+ <tabstop>colDeletePixmap</tabstop>
+ <tabstop>colChoosePixmap</tabstop>
+ <tabstop>colClickable</tabstop>
+ <tabstop>colResizable</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot access="protected">applyClicked()</slot>
+ <slot access="protected">columnClickable(bool)</slot>
+ <slot access="protected">columnDownClicked()</slot>
+ <slot access="protected">columnPixmapChosen()</slot>
+ <slot access="protected">columnPixmapDeleted()</slot>
+ <slot access="protected">columnResizable(bool)</slot>
+ <slot access="protected">columnTextChanged(const QString &amp;)</slot>
+ <slot access="protected">columnUpClicked()</slot>
+ <slot access="protected">currentColumnChanged(QListBoxItem*)</slot>
+ <slot access="protected">currentItemChanged(QListViewItem*)</slot>
+ <slot access="protected">deleteColumnClicked()</slot>
+ <slot access="protected">initTabPage(const QString &amp;)</slot>
+ <slot access="protected">itemColChanged(int)</slot>
+ <slot access="protected">itemDeleteClicked()</slot>
+ <slot access="protected">itemDownClicked()</slot>
+ <slot access="protected">itemLeftClicked()</slot>
+ <slot access="protected">itemNewClicked()</slot>
+ <slot access="protected">itemNewSubClicked()</slot>
+ <slot access="protected">itemPixmapChoosen()</slot>
+ <slot access="protected">itemPixmapDeleted()</slot>
+ <slot access="protected">itemTextChanged(const QString &amp;)</slot>
+ <slot access="protected">itemUpClicked()</slot>
+ <slot access="protected">newColumnClicked()</slot>
+ <slot access="protected">itemRightClicked()</slot>
+ <slot access="protected">okClicked()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/listvieweditorimpl.cpp b/tools/designer/designer/listvieweditorimpl.cpp
new file mode 100644
index 0000000..42167d7
--- /dev/null
+++ b/tools/designer/designer/listvieweditorimpl.cpp
@@ -0,0 +1,655 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "listvieweditorimpl.h"
+#include "pixmapchooser.h"
+#include "command.h"
+#include "listviewdnd.h"
+#include "listboxdnd.h"
+#include "listboxrename.h"
+
+#include <qlistview.h>
+#include <qheader.h>
+#include <qlistbox.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qtabwidget.h>
+#include <qspinbox.h>
+#include <qpushbutton.h>
+#include <qptrstack.h>
+
+ListViewEditor::ListViewEditor( QWidget *parent, QListView *lv, FormWindow *fw )
+ : ListViewEditorBase( parent, 0, TRUE ), listview( lv ), formwindow( fw )
+{
+ connect( helpButton, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+ itemText->setEnabled( FALSE );
+ itemChoosePixmap->setEnabled( FALSE );
+ itemDeletePixmap->setEnabled( FALSE );
+ itemColumn->setEnabled( FALSE );
+
+ setupColumns();
+ PopulateListViewCommand::transferItems( listview, itemsPreview );
+ setupItems();
+
+ itemsPreview->setShowSortIndicator( listview->showSortIndicator() );
+ itemsPreview->setAllColumnsShowFocus( listview->allColumnsShowFocus() );
+ itemsPreview->setRootIsDecorated( listview->rootIsDecorated() );
+
+ if ( itemsPreview->firstChild() ) {
+ itemsPreview->setCurrentItem( itemsPreview->firstChild() );
+ itemsPreview->setSelected( itemsPreview->firstChild(), TRUE );
+ }
+
+ // Clamp on drag and drop to QListView
+ ListViewDnd *itemsDnd = new ListViewDnd( itemsPreview );
+ itemsDnd->setDragMode( ListViewDnd::Internal | ListViewDnd::Move );
+ QObject::connect( itemsDnd, SIGNAL( dropped( QListViewItem * ) ),
+ itemsDnd, SLOT( confirmDrop( QListViewItem * ) ) );
+
+ // Enable rename for all QListViewItems
+ QListViewItemIterator it = ((QListView *)itemsPreview)->firstChild();
+ for ( ; *it; it++ )
+ (*it)->setRenameEnabled( 0, TRUE );
+
+ // Connect listview signal to signal-relay
+ QObject::connect( itemsPreview,
+ SIGNAL( itemRenamed( QListViewItem*, int, const QString & ) ),
+ this,
+ SLOT( emitItemRenamed(QListViewItem*, int, const QString&) ) );
+
+ // Connect signal-relay to QLineEdit "itemText"
+ QObjectList *l = parent->queryList( "QLineEdit", "itemText" );
+ QObject *obj;
+ QObjectListIt itemsLineEditIt( *l );
+ while ( (obj = itemsLineEditIt.current()) != 0 ) {
+ ++itemsLineEditIt;
+ QObject::connect( this,
+ SIGNAL( itemRenamed( const QString & ) ),
+ obj,
+ SLOT( setText( const QString & ) ) );
+ }
+ delete l;
+
+ // Clamp on drag and drop to QListBox
+ ListBoxDnd *columnsDnd = new ListBoxDnd( colPreview );
+ columnsDnd->setDragMode( ListBoxDnd::Internal | ListBoxDnd::Move );
+ QObject::connect( columnsDnd, SIGNAL( dropped( QListBoxItem * ) ),
+ columnsDnd, SLOT( confirmDrop( QListBoxItem * ) ) );
+
+ // Clamp on rename to QListBox
+ ListBoxRename *columnsRename = new ListBoxRename( colPreview );
+ QObject::connect( columnsRename,
+ SIGNAL( itemTextChanged( const QString & ) ),
+ this,
+ SLOT( columnTextChanged( const QString & ) ) );
+
+ // Find QLineEdit "colText" and connect
+ l = parent->queryList( "QLineEdit", "colText" );
+ QObjectListIt columnsLineEditIt( *l );
+ while ( (obj = columnsLineEditIt.current()) != 0 ) {
+ ++columnsLineEditIt;
+ QObject::connect( columnsRename,
+ SIGNAL( itemTextChanged( const QString & ) ),
+ obj,
+ SLOT( setText( const QString & ) ) );
+ }
+ delete l;
+}
+
+void ListViewEditor::applyClicked()
+{
+ setupItems();
+ PopulateListViewCommand *cmd = new PopulateListViewCommand( tr( "Edit the Items and Columns of '%1'" ).arg( listview->name() ),
+ formwindow, listview, itemsPreview );
+ cmd->execute();
+ formwindow->commandHistory()->addCommand( cmd );
+}
+
+void ListViewEditor::okClicked()
+{
+ applyClicked();
+ accept();
+}
+
+void ListViewEditor::columnClickable( bool b )
+{
+ Column *c = findColumn( colPreview->item( colPreview->currentItem() ) );
+ if ( !c )
+ return;
+ c->clickable = b;
+}
+
+void ListViewEditor::columnDownClicked()
+{
+ if ( colPreview->currentItem() == -1 ||
+ colPreview->currentItem() > (int)colPreview->count() - 2 )
+ return;
+
+ colPreview->clearSelection();
+ QListBoxItem *i = colPreview->item( colPreview->currentItem() );
+ QListBoxItem *below = i->next();
+
+ colPreview->takeItem( i );
+ colPreview->insertItem( i, below );
+
+ colPreview->setCurrentItem( i );
+ colPreview->setSelected( i, TRUE );
+}
+
+void ListViewEditor::columnPixmapChosen()
+{
+ Column *c = findColumn( colPreview->item( colPreview->currentItem() ) );
+ if ( !c )
+ return;
+
+ QPixmap pix;
+ if ( colPixmap->pixmap() )
+ pix = qChoosePixmap( this, formwindow, *colPixmap->pixmap() );
+ else
+ pix = qChoosePixmap( this, formwindow, QPixmap() );
+
+ if ( pix.isNull() )
+ return;
+
+ c->pixmap = pix;
+ colPreview->blockSignals( TRUE );
+ if ( !c->pixmap.isNull() )
+ colPreview->changeItem( c->pixmap, c->text, colPreview->index( c->item ) );
+ else
+ colPreview->changeItem( c->text, colPreview->index( c->item ) );
+ c->item = colPreview->item( colPreview->currentItem() );
+ colPixmap->setPixmap( c->pixmap );
+ colPreview->blockSignals( FALSE );
+ colDeletePixmap->setEnabled( TRUE );
+}
+
+void ListViewEditor::columnPixmapDeleted()
+{
+ Column *c = findColumn( colPreview->item( colPreview->currentItem() ) );
+ if ( !c )
+ return;
+
+ c->pixmap = QPixmap();
+ colPreview->blockSignals( TRUE );
+ if ( !c->pixmap.isNull() )
+ colPreview->changeItem( c->pixmap, c->text, colPreview->index( c->item ) );
+ else
+ colPreview->changeItem( c->text, colPreview->index( c->item ) );
+ c->item = colPreview->item( colPreview->currentItem() );
+ colPixmap->setText( "" );
+ colPreview->blockSignals( FALSE );
+ colDeletePixmap->setEnabled( FALSE );
+}
+
+void ListViewEditor::columnResizable( bool b )
+{
+ Column *c = findColumn( colPreview->item( colPreview->currentItem() ) );
+ if ( !c )
+ return;
+ c->resizable = b;
+}
+
+void ListViewEditor::columnTextChanged( const QString &txt )
+{
+ Column *c = findColumn( colPreview->item( colPreview->currentItem() ) );
+ if ( !c )
+ return;
+
+ c->text = txt;
+ colPreview->blockSignals( TRUE );
+ if ( !c->pixmap.isNull() )
+ colPreview->changeItem( c->pixmap, c->text, colPreview->index( c->item ) );
+ else
+ colPreview->changeItem( c->text, colPreview->index( c->item ) );
+ c->item = colPreview->item( colPreview->currentItem() );
+ colPreview->blockSignals( FALSE );
+}
+
+void ListViewEditor::columnUpClicked()
+{
+ if ( colPreview->currentItem() <= 0 )
+ return;
+
+ colPreview->clearSelection();
+ QListBoxItem *i = colPreview->item( colPreview->currentItem() );
+ QListBoxItem *above = i->prev();
+
+ colPreview->takeItem( above );
+ colPreview->insertItem( above, i );
+
+ colPreview->setCurrentItem( i );
+ colPreview->setSelected( i, TRUE );
+}
+
+void ListViewEditor::currentColumnChanged( QListBoxItem *i )
+{
+ Column *c = findColumn( i );
+ if ( !i || !c ) {
+ colText->setEnabled( FALSE );
+ colPixmap->setEnabled( FALSE );
+ colDeletePixmap->setEnabled( FALSE );
+ colText->blockSignals( TRUE );
+ colText->setText( "" );
+ colText->blockSignals( FALSE );
+ colClickable->setEnabled( FALSE );
+ colResizable->setEnabled( FALSE );
+ return;
+ }
+
+ colText->setEnabled( TRUE );
+ colPixmap->setEnabled( TRUE );
+ colDeletePixmap->setEnabled( i->pixmap() && !i->pixmap()->isNull() );
+ colClickable->setEnabled( TRUE );
+ colResizable->setEnabled( TRUE );
+
+ colText->blockSignals( TRUE );
+ colText->setText( c->text );
+ colText->blockSignals( FALSE );
+ if ( !c->pixmap.isNull() )
+ colPixmap->setPixmap( c->pixmap );
+ else
+ colPixmap->setText( "" );
+ colClickable->setChecked( c->clickable );
+ colResizable->setChecked( c->resizable );
+}
+
+void ListViewEditor::newColumnClicked()
+{
+ Column col;
+ col.text = tr( "New Column" );
+ col.pixmap = QPixmap();
+ col.clickable = TRUE;
+ col.resizable = TRUE;
+ if ( !col.pixmap.isNull() )
+ col.item = new QListBoxPixmap( colPreview, col.pixmap, col.text );
+ else
+ col.item = new QListBoxText( colPreview, col.text );
+ columns.append( col );
+ colPreview->setCurrentItem( col.item );
+ colPreview->setSelected( col.item, TRUE );
+}
+
+void ListViewEditor::deleteColumnClicked()
+{
+ QListBoxItem *i = colPreview->item( colPreview->currentItem() );
+ if ( !i )
+ return;
+
+ for ( QValueList<Column>::Iterator it = columns.begin(); it != columns.end(); ++it ) {
+ if ( ( *it ).item == i ) {
+ delete (*it).item;
+ columns.remove( it );
+ break;
+ }
+ }
+
+ if ( colPreview->currentItem() != -1 )
+ colPreview->setSelected( colPreview->currentItem(), TRUE );
+}
+
+void ListViewEditor::currentItemChanged( QListViewItem *i )
+{
+ if ( !i ) {
+ itemText->setEnabled( FALSE );
+ itemChoosePixmap->setEnabled( FALSE );
+ itemDeletePixmap->setEnabled( FALSE );
+ itemColumn->setEnabled( FALSE );
+ return;
+ }
+
+ itemText->setEnabled( TRUE );
+ itemChoosePixmap->setEnabled( TRUE );
+ itemDeletePixmap->setEnabled( i->pixmap( itemColumn->value() ) &&
+ !i->pixmap( itemColumn->value() )->isNull() );
+ itemColumn->setEnabled( TRUE );
+
+ displayItem( i, itemColumn->value() );
+}
+
+void ListViewEditor::displayItem( QListViewItem *i, int col )
+{
+ itemText->blockSignals( TRUE );
+ itemText->setText( i->text( col ) );
+ itemText->blockSignals( FALSE );
+
+ itemPixmap->blockSignals( TRUE );
+ if ( i->pixmap( col ) )
+ itemPixmap->setPixmap( *i->pixmap( col ) );
+ else
+ itemPixmap->setText( "" );
+ itemPixmap->blockSignals( FALSE );
+}
+
+void ListViewEditor::itemColChanged( int col )
+{
+ QListViewItem *i = itemsPreview->currentItem();
+ if ( !i )
+ return;
+
+ displayItem( i, col );
+ itemDeletePixmap->setEnabled( i->pixmap( col ) && !i->pixmap( col )->isNull() );
+}
+
+void ListViewEditor::itemDeleteClicked()
+{
+ QListViewItem *i = itemsPreview->currentItem();
+ if ( !i )
+ return;
+
+ delete i;
+ if ( itemsPreview->firstChild() ) {
+ itemsPreview->setCurrentItem( itemsPreview->firstChild() );
+ itemsPreview->setSelected( itemsPreview->firstChild(), TRUE );
+ }
+}
+
+void ListViewEditor::itemDownClicked()
+{
+ QListViewItem *i = itemsPreview->currentItem();
+ if ( !i )
+ return;
+
+ QListViewItemIterator it( i );
+ QListViewItem *parent = i->parent();
+ it++;
+ while ( it.current() ) {
+ if ( it.current()->parent() == parent )
+ break;
+ it++;
+ }
+
+ if ( !it.current() )
+ return;
+ QListViewItem *other = it.current();
+
+ i->moveItem( other );
+}
+
+void ListViewEditor::itemNewClicked()
+{
+ QListViewItem *item = new QListViewItem( itemsPreview );
+ item->setText( 0, "Item" );
+ item->setRenameEnabled( 0, TRUE );
+ itemsPreview->setCurrentItem( item );
+ itemsPreview->setSelected( item, TRUE );
+ itemText->setFocus();
+ itemText->selectAll();
+}
+
+void ListViewEditor::itemNewSubClicked()
+{
+ QListViewItem *parent = itemsPreview->currentItem();
+ QListViewItem *item = 0;
+ if ( parent ) {
+ item = new QListViewItem( parent );
+ parent->setOpen( TRUE );
+ } else {
+ item = new QListViewItem( itemsPreview );
+ }
+ item->setText( 0, "Subitem" );
+ item->setRenameEnabled( 0, TRUE );
+ itemsPreview->setCurrentItem( item );
+ itemsPreview->setSelected( item, TRUE );
+}
+
+void ListViewEditor::itemPixmapChoosen()
+{
+ QListViewItem *i = itemsPreview->currentItem();
+ if ( !i )
+ return;
+
+ QPixmap pix;
+ if ( itemPixmap->pixmap() )
+ pix = qChoosePixmap( this, formwindow, *itemPixmap->pixmap() );
+ else
+ pix = qChoosePixmap( this, formwindow, QPixmap() );
+
+ if ( pix.isNull() )
+ return;
+
+ i->setPixmap( itemColumn->value(), QPixmap( pix ) );
+ itemPixmap->setPixmap( pix );
+ itemDeletePixmap->setEnabled( TRUE );
+}
+
+void ListViewEditor::itemPixmapDeleted()
+{
+ QListViewItem *i = itemsPreview->currentItem();
+ if ( !i )
+ return;
+
+ i->setPixmap( itemColumn->value(), QPixmap() );
+ itemPixmap->setText( "" );
+ itemDeletePixmap->setEnabled( FALSE );
+}
+
+void ListViewEditor::itemTextChanged( const QString &txt )
+{
+ QListViewItem *i = itemsPreview->currentItem();
+ if ( !i )
+ return;
+ i->setText( itemColumn->value(), txt );
+}
+
+void ListViewEditor::itemUpClicked()
+{
+ QListViewItem *i = itemsPreview->currentItem();
+ if ( !i )
+ return;
+
+ QListViewItemIterator it( i );
+ QListViewItem *parent = i->parent();
+ --it;
+ while ( it.current() ) {
+ if ( it.current()->parent() == parent )
+ break;
+ --it;
+ }
+
+ if ( !it.current() )
+ return;
+ QListViewItem *other = it.current();
+
+ other->moveItem( i );
+}
+
+void ListViewEditor::itemRightClicked()
+{
+ QListViewItem *i = itemsPreview->currentItem();
+ if ( !i )
+ return;
+
+ QListViewItemIterator it( i );
+ QListViewItem *parent = i->parent();
+ parent = parent ? parent->firstChild() : itemsPreview->firstChild();
+ if ( !parent )
+ return;
+ it++;
+ while ( it.current() ) {
+ if ( it.current()->parent() == parent )
+ break;
+ it++;
+ }
+
+ if ( !it.current() )
+ return;
+ QListViewItem *other = it.current();
+
+ for ( int c = 0; c < itemsPreview->columns(); ++c ) {
+ QString s = i->text( c );
+ i->setText( c, other->text( c ) );
+ other->setText( c, s );
+ QPixmap pix;
+ if ( i->pixmap( c ) )
+ pix = *i->pixmap( c );
+ if ( other->pixmap( c ) )
+ i->setPixmap( c, *other->pixmap( c ) );
+ else
+ i->setPixmap( c, QPixmap() );
+ other->setPixmap( c, pix );
+ }
+
+ itemsPreview->setCurrentItem( other );
+ itemsPreview->setSelected( other, TRUE );
+}
+
+void ListViewEditor::itemLeftClicked()
+{
+ QListViewItem *i = itemsPreview->currentItem();
+ if ( !i )
+ return;
+
+ QListViewItemIterator it( i );
+ QListViewItem *parent = i->parent();
+ if ( !parent )
+ return;
+ parent = parent->parent();
+ --it;
+ while ( it.current() ) {
+ if ( it.current()->parent() == parent )
+ break;
+ --it;
+ }
+
+ if ( !it.current() )
+ return;
+ QListViewItem *other = it.current();
+
+ for ( int c = 0; c < itemsPreview->columns(); ++c ) {
+ QString s = i->text( c );
+ i->setText( c, other->text( c ) );
+ other->setText( c, s );
+ QPixmap pix;
+ if ( i->pixmap( c ) )
+ pix = *i->pixmap( c );
+ if ( other->pixmap( c ) )
+ i->setPixmap( c, *other->pixmap( c ) );
+ else
+ i->setPixmap( c, QPixmap() );
+ other->setPixmap( c, pix );
+ }
+
+ itemsPreview->setCurrentItem( other );
+ itemsPreview->setSelected( other, TRUE );
+}
+
+void ListViewEditor::setupColumns()
+{
+ QHeader *h = listview->header();
+ for ( int i = 0; i < (int)h->count(); ++i ) {
+ Column col;
+ col.text = h->label( i );
+ col.pixmap = QPixmap();
+ if ( h->iconSet( i ) )
+ col.pixmap = h->iconSet( i )->pixmap();
+ col.clickable = h->isClickEnabled( i );
+ col.resizable = h->isResizeEnabled( i );
+ if ( !col.pixmap.isNull() )
+ col.item = new QListBoxPixmap( colPreview, col.pixmap, col.text );
+ else
+ col.item = new QListBoxText( colPreview, col.text );
+ columns.append( col );
+ }
+
+ colText->setEnabled( FALSE );
+ colPixmap->setEnabled( FALSE );
+ colClickable->setEnabled( FALSE );
+ colResizable->setEnabled( FALSE );
+
+ if ( colPreview->firstItem() )
+ colPreview->setCurrentItem( colPreview->firstItem() );
+ numColumns = colPreview->count();
+}
+
+void ListViewEditor::setupItems()
+{
+ itemColumn->setMinValue( 0 );
+ itemColumn->setMaxValue( QMAX( numColumns - 1, 0 ) );
+ int i = 0;
+ QHeader *header = itemsPreview->header();
+ for ( QListBoxItem *item = colPreview->firstItem(); item; item = item->next() ) {
+ Column *col = findColumn( item );
+ if ( !col )
+ continue;
+ if ( i >= itemsPreview->columns() )
+ itemsPreview->addColumn( col->text );
+ header->setLabel( i, col->pixmap, col->text );
+ header->setResizeEnabled( col->resizable, i );
+ header->setClickEnabled( col->clickable, i );
+ ++i;
+ }
+ while ( itemsPreview->columns() > i )
+ itemsPreview->removeColumn( i );
+
+ itemColumn->setValue( QMIN( numColumns - 1, itemColumn->value() ) );
+}
+
+ListViewEditor::Column *ListViewEditor::findColumn( QListBoxItem *i )
+{
+ if ( !i )
+ return 0;
+
+ for ( QValueList<Column>::Iterator it = columns.begin(); it != columns.end(); ++it ) {
+ if ( ( *it ).item == i )
+ return &( *it );
+ }
+
+ return 0;
+}
+
+void ListViewEditor::initTabPage( const QString &page )
+{
+ numColumns = colPreview->count();
+ if ( page == tr( "&Items" ) ) {
+ setupItems();
+ if ( numColumns == 0 ) {
+ itemNew->setEnabled( FALSE );
+ itemNewSub->setEnabled( FALSE );
+ itemText->setEnabled( FALSE );
+ itemChoosePixmap->setEnabled( FALSE );
+ itemDeletePixmap->setEnabled( FALSE );
+ itemColumn->setEnabled( FALSE );
+ } else {
+ itemNew->setEnabled( TRUE );
+ itemNewSub->setEnabled( TRUE );
+ }
+ }
+}
+
+void ListViewEditor::emitItemRenamed( QListViewItem *, int, const QString & text )
+{
+ emit itemRenamed( text ); // Relay signal ( to QLineEdit )
+}
diff --git a/tools/designer/designer/listvieweditorimpl.h b/tools/designer/designer/listvieweditorimpl.h
new file mode 100644
index 0000000..2b52383
--- /dev/null
+++ b/tools/designer/designer/listvieweditorimpl.h
@@ -0,0 +1,109 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef LISTVIEWEDITORIMPL_H
+#define LISTVIEWEDITORIMPL_H
+
+#include "listvieweditor.h"
+
+#include <qmap.h>
+#include <qpixmap.h>
+#include <qvaluelist.h>
+
+class FormWindow;
+
+class ListViewEditor : public ListViewEditorBase
+{
+ Q_OBJECT
+
+public:
+ ListViewEditor( QWidget *parent, QListView *lv, FormWindow *fw );
+
+signals:
+ void itemRenamed(const QString &);
+
+protected slots:
+ void applyClicked();
+ void columnClickable(bool);
+ void columnDownClicked();
+ void columnPixmapChosen();
+ void columnPixmapDeleted();
+ void columnResizable(bool);
+ void columnTextChanged(const QString &);
+ void columnUpClicked();
+ void currentColumnChanged(QListBoxItem*);
+ void currentItemChanged(QListViewItem*);
+ void deleteColumnClicked();
+ void itemColChanged(int);
+ void itemDeleteClicked();
+ void itemDownClicked();
+ void itemNewClicked();
+ void itemNewSubClicked();
+ void itemPixmapChoosen();
+ void itemPixmapDeleted();
+ void itemTextChanged(const QString &);
+ void itemUpClicked();
+ void itemLeftClicked();
+ void itemRightClicked();
+ void newColumnClicked();
+ void okClicked();
+ void initTabPage(const QString &page);
+ void emitItemRenamed(QListViewItem*, int, const QString&); // signal relay
+
+private:
+ struct Column
+ {
+ QListBoxItem *item;
+ QString text;
+ QPixmap pixmap;
+ bool clickable, resizable;
+ Q_DUMMY_COMPARISON_OPERATOR( Column )
+ };
+
+private:
+ void setupColumns();
+ void setupItems();
+ Column *findColumn( QListBoxItem *i );
+ void transferItems( QListView *from, QListView *to );
+ void displayItem( QListViewItem *i, int col );
+
+private:
+ QListView *listview;
+ QValueList<Column> columns;
+ int numColumns;
+ FormWindow *formwindow;
+
+};
+
+
+#endif
diff --git a/tools/designer/designer/mainwindow.cpp b/tools/designer/designer/mainwindow.cpp
new file mode 100644
index 0000000..0474b2f
--- /dev/null
+++ b/tools/designer/designer/mainwindow.cpp
@@ -0,0 +1,3784 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#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 "qwidgetfactory.h"
+#include "pixmapcollection.h"
+#include "qcompletionedit.h"
+#include "sourcefile.h"
+#include "orderindicator.h"
+#include <qtoolbox.h>
+#include "widgetaction.h"
+#include "propertyobject.h"
+#include "popupmenueditor.h"
+#include "menubareditor.h"
+
+#include "startdialog.h"
+#include "createtemplate.h"
+#include "editfunctions.h"
+//#include "connectionviewer.h"
+#include "formsettings.h"
+#include "preferences.h"
+#include "pixmapcollectioneditor.h"
+#ifndef QT_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 <qinputdialog.h>
+#include <qtoolbar.h>
+#include <qfeatures.h>
+#include <qmetaobject.h>
+#include <qaction.h>
+#include <qpixmap.h>
+#include <qworkspace.h>
+#include <qfiledialog.h>
+#include <qclipboard.h>
+#include <qmessagebox.h>
+#include <qbuffer.h>
+#include <qdir.h>
+#include <qstyle.h>
+#include <qlabel.h>
+#include <qstatusbar.h>
+#include <qfile.h>
+#include <qcheckbox.h>
+#include <qwhatsthis.h>
+#include <qwizard.h>
+#include <qtimer.h>
+#include <qlistbox.h>
+#include <qdockwindow.h>
+#include <qstylefactory.h>
+#include <qvbox.h>
+#include <qprocess.h>
+#include <qsettings.h>
+#include <qaccel.h>
+#include <qtooltip.h>
+#include <qsizegrip.h>
+#include <qtextview.h>
+#include <qassistantclient.h>
+#include <stdlib.h>
+
+static bool mblockNewForms = FALSE;
+extern QMap<QWidget*, QString> *qwf_forms;
+extern QString *qwf_language;
+extern bool qwf_execute_code;
+extern bool qwf_stays_on_top;
+extern void set_splash_status( const QString &txt );
+extern QObject* qwf_form_object;
+extern QString *qwf_plugin_dir;
+
+MainWindow *MainWindow::self = 0;
+
+QString assistantPath()
+{
+ QString path = QDir::cleanDirPath( QString( qInstallPathBins() ) +
+ QDir::separator() );
+ return path;
+}
+
+
+static QString textNoAccel( const QString& text)
+{
+ QString t = text;
+ int i;
+ while ( (i = t.find('&') )>= 0 ) {
+ t.remove(i,1);
+ }
+ return t;
+}
+
+
+MainWindow::MainWindow( bool asClient, bool single, const QString &plgDir )
+ : QMainWindow( 0, "designer_mainwindow", WType_TopLevel | (single ? 0 : WDestructiveClose) | WGroupLeader ),
+ grd( 10, 10 ), sGrid( TRUE ), snGrid( TRUE ), restoreConfig( TRUE ), splashScreen( TRUE ),
+ fileFilter( tr( "Qt User-Interface Files (*.ui)" ) ), client( asClient ),
+ previewing( FALSE ), databaseAutoEdit( FALSE ), autoSaveEnabled( FALSE ), autoSaveInterval( 1800 )
+{
+ extern void qInitImages_designercore();
+ qInitImages_designercore();
+
+ self = this;
+ setPluginDirectory( plgDir );
+ customWidgetToolBar = customWidgetToolBar2 = 0;
+ guiStuffVisible = TRUE;
+ editorsReadOnly = FALSE;
+ sSignalHandlers = TRUE;
+ init_colors();
+ shStartDialog = TRUE;
+
+ desInterface = new DesignerInterfaceImpl( this );
+ desInterface->addRef();
+ inDebugMode = FALSE;
+ savePluginPaths = FALSE;
+
+ updateFunctionsTimer = new QTimer( this );
+ connect( updateFunctionsTimer, SIGNAL( timeout() ),
+ this, SLOT( doFunctionsChanged() ) );
+
+ autoSaveTimer = new QTimer( this );
+ connect( autoSaveTimer, SIGNAL( timeout() ),
+ this, SLOT( fileSaveAll() ) );
+
+ set_splash_status( "Loading Plugins..." );
+ setupPluginManagers();
+
+ if ( !single )
+ qApp->setMainWidget( this );
+ QWidgetFactory::addWidgetFactory( new CustomWidgetFactory );
+#ifndef Q_WS_MACX
+ setIcon( QPixmap::fromMimeSource( "designer_appicon.png" ) );
+#endif
+
+ actionGroupTools = 0;
+ prefDia = 0;
+ windowMenu = 0;
+ hierarchyView = 0;
+ actionEditor = 0;
+ currentProject = 0;
+ wspace = 0;
+ oWindow = 0;
+ singleProject = single;
+
+ statusBar()->clear();
+#if defined(QT_NON_COMMERCIAL)
+ statusBar()->addWidget( new QLabel(tr("Ready - This is the non-commercial version of Qt - "
+ "For commercial evaluations, use the help menu to register with Trolltech."), statusBar()), 1 );
+#else
+ statusBar()->addWidget( new QLabel("Ready", statusBar()), 1 );
+#endif
+
+
+ set_splash_status( "Setting up GUI..." );
+ setupMDI();
+ setupMenuBar();
+
+ setupToolbox();
+
+ setupFileActions();
+ setupEditActions();
+ setupProjectActions();
+ setupSearchActions();
+ layoutToolBar = new QToolBar( this, "Layout" );
+ layoutToolBar->setCloseMode( QDockWindow::Undocked );
+ addToolBar( layoutToolBar, tr( "Layout" ) );
+ interpreterPluginManager = 0;
+ setupToolActions();
+ setupLayoutActions();
+ setupPreviewActions();
+ setupOutputWindow();
+ setupActionManager();
+ setupWindowActions();
+
+ setupWorkspace();
+ setupHierarchyView();
+ setupPropertyEditor();
+ setupActionEditor();
+
+ setupHelpActions();
+
+ setupRMBMenus();
+
+ connect( this, SIGNAL( projectChanged() ), this, SLOT( emitProjectSignals() ) );
+ connect( this, SIGNAL( hasActiveWindow(bool) ), this, SLOT( emitProjectSignals() ) );
+
+ emit hasActiveForm( FALSE );
+ emit hasActiveWindow( FALSE );
+
+ lastPressWidget = 0;
+ qApp->installEventFilter( this );
+
+ QSize as( qApp->desktop()->size() );
+ as -= QSize( 30, 30 );
+ resize( QSize( 1200, 1000 ).boundedTo( as ) );
+
+ connect( qApp->clipboard(), SIGNAL( dataChanged() ),
+ this, 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 QWidget and QDialog for resetting properties)
+ QWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QWidget" ), this, 0, FALSE );
+ delete w;
+ w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QDialog" ), this, 0, FALSE );
+ delete w;
+ w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QLabel" ), this, 0, FALSE );
+ delete w;
+ w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QTabWidget" ), this, 0, FALSE );
+ delete w;
+ w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QFrame" ), this, 0, FALSE );
+ delete w;
+ setAppropriate( (QDockWindow*)actionEditor->parentWidget(), FALSE );
+ actionEditor->parentWidget()->hide();
+
+ assistant = new QAssistantClient( assistantPath(), this );
+
+ statusBar()->setSizeGripEnabled( TRUE );
+ set_splash_status( "Initialization Done." );
+ if ( shStartDialog )
+ QTimer::singleShot( 0, this, SLOT( showStartDialog() ));
+
+ if ( autoSaveEnabled )
+ autoSaveTimer->start( autoSaveInterval * 1000 );
+}
+
+MainWindow::~MainWindow()
+{
+ QValueList<Tab>::Iterator tit;
+ for ( tit = preferenceTabs.begin(); tit != preferenceTabs.end(); ++tit ) {
+ Tab t = *tit;
+ delete t.w;
+ }
+ for ( tit = projectTabs.begin(); tit != projectTabs.end(); ++tit ) {
+ Tab t = *tit;
+ delete t.w;
+ }
+
+ QMap< QAction*, 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()
+{
+ QVBox *vbox = new QVBox( this );
+ setCentralWidget( vbox );
+ vbox->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ vbox->setMargin( 1 );
+ vbox->setLineWidth( 1 );
+ qworkspace = new QWorkspace( vbox );
+ qworkspace->setPaletteBackgroundPixmap( QPixmap::fromMimeSource( "designer_background.png" ) );
+ qworkspace->setScrollBarsEnabled( TRUE );
+ connect( qworkspace, SIGNAL( windowActivated( QWidget * ) ),
+ this, SLOT( activeWindowChanged( QWidget * ) ) );
+ lastActiveFormWindow = 0;
+ qworkspace->setAcceptDrops( TRUE );
+}
+
+void MainWindow::setupMenuBar()
+{
+ menubar = menuBar();
+}
+
+void MainWindow::setupPropertyEditor()
+{
+ QDockWindow *dw = new QDockWindow( QDockWindow::InDock, this );
+ dw->setResizeEnabled( TRUE );
+ dw->setCloseMode( QDockWindow::Always );
+ propertyEditor = new PropertyEditor( dw );
+ addToolBar( dw, Qt::DockRight );
+ dw->setWidget( propertyEditor );
+ dw->setFixedExtentWidth( 250 );
+ dw->setCaption( tr( "Property Editor/Signal Handlers" ) );
+ QWhatsThis::add( propertyEditor,
+ tr("<b>The Property Editor</b>"
+ "<p>You can change the appearance and behavior of the selected widget in the "
+ "property editor.</p>"
+ "<p>You can set properties for components and forms at design time and see the "
+ "immediately see the effects of the changes. "
+ "Each property has its own editor which (depending on the property) can be used "
+ "to enter "
+ "new values, open a special dialog, or to select values from a predefined list. "
+ "Click <b>F1</b> to get detailed help for the selected property.</p>"
+ "<p>You can resize the columns of the editor by dragging the separators in the "
+ "list's header.</p>"
+ "<p><b>Signal Handlers</b></p>"
+ "<p>In the Signal Handlers tab you can define connections between "
+ "the signals emitted by widgets and the slots in the form. "
+ "(These connections can also be made using the connection tool.)" ) );
+ dw->show();
+}
+
+void MainWindow::setupOutputWindow()
+{
+ QDockWindow *dw = new QDockWindow( QDockWindow::InDock, this );
+ dw->setResizeEnabled( TRUE );
+ dw->setCloseMode( QDockWindow::Always );
+ addToolBar( dw, Qt::DockBottom );
+ oWindow = new OutputWindow( dw );
+ dw->setWidget( oWindow );
+ dw->setFixedExtentHeight( 150 );
+ dw->setCaption( tr( "Output Window" ) );
+}
+
+void MainWindow::setupHierarchyView()
+{
+ if ( hierarchyView )
+ return;
+ QDockWindow *dw = new QDockWindow( QDockWindow::InDock, this );
+ dw->setResizeEnabled( TRUE );
+ dw->setCloseMode( QDockWindow::Always );
+ hierarchyView = new HierarchyView( dw );
+ addToolBar( dw, Qt::DockRight );
+ dw->setWidget( hierarchyView );
+
+ dw->setCaption( tr( "Object Explorer" ) );
+ dw->setFixedExtentWidth( 250 );
+ QWhatsThis::add( hierarchyView,
+ tr("<b>The Object Explorer</b>"
+ "<p>The Object Explorer provides an overview of the relationships "
+ "between the widgets in a form. You can use the clipboard functions using "
+ "a context menu for each item in the view. It is also useful for selecting widgets "
+ "in forms that have complex layouts.</p>"
+ "<p>The columns can be resized by dragging the separator in the list's header.</p>"
+ "<p>The second tab shows all the form's slots, class variables, includes, etc.</p>") );
+ dw->show();
+}
+
+void MainWindow::setupWorkspace()
+{
+ QDockWindow *dw = new QDockWindow( QDockWindow::InDock, this );
+ dw->setResizeEnabled( TRUE );
+ dw->setCloseMode( QDockWindow::Always );
+ QVBox *vbox = new QVBox( dw );
+ QCompletionEdit *edit = new QCompletionEdit( vbox );
+ QToolTip::add( edit, tr( "Start typing the buffer you want to switch to here (ALT+B)" ) );
+ QAccel *a = new QAccel( this );
+ a->connectItem( a->insertItem( ALT + Key_B ), edit, SLOT( setFocus() ) );
+ wspace = new Workspace( vbox, this );
+ wspace->setBufferEdit( edit );
+ wspace->setCurrentProject( currentProject );
+ addToolBar( dw, Qt::DockRight );
+ dw->setWidget( vbox );
+
+ dw->setCaption( tr( "Project Overview" ) );
+ QWhatsThis::add( wspace, tr("<b>The Project Overview Window</b>"
+ "<p>The Project Overview Window displays all the current "
+ "project, including forms and source files.</p>"
+ "<p>Use the search field to rapidly switch between files.</p>"));
+ dw->setFixedExtentHeight( 100 );
+ dw->show();
+}
+
+void MainWindow::setupActionEditor()
+{
+ QDockWindow *dw = new QDockWindow( QDockWindow::OutsideDock, this, 0 );
+ addDockWindow( dw, Qt::DockTornOff );
+ dw->setResizeEnabled( TRUE );
+ dw->setCloseMode( QDockWindow::Always );
+ actionEditor = new ActionEditor( dw );
+ dw->setWidget( actionEditor );
+ actionEditor->show();
+ dw->setCaption( tr( "Action Editor" ) );
+ QWhatsThis::add( actionEditor, tr("<b>The Action Editor</b>"
+ "<p>The Action Editor is used to add actions and action groups to "
+ "a form, and to connect actions to slots. Actions and action "
+ "groups can be dragged into menus and into toolbars, and may "
+ "feature keyboard shortcuts and tooltips. If actions have pixmaps "
+ "these are displayed on toolbar buttons and besides their names in "
+ "menus.</p>" ) );
+ dw->hide();
+ setAppropriate( dw, FALSE );
+}
+
+void MainWindow::setupToolbox()
+{
+ QDockWindow *dw = new QDockWindow( QDockWindow::InDock, this );
+ dw->setResizeEnabled( TRUE );
+ dw->setCloseMode( QDockWindow::Always );
+ addToolBar( dw, Qt::DockLeft );
+ toolBox = new QToolBox( dw );
+ dw->setWidget( toolBox );
+ dw->setFixedExtentWidth( 160 );
+ dw->setCaption( tr( "Toolbox" ) );
+ dw->show();
+ setDockEnabled( dw, Qt::DockTop, FALSE );
+ setDockEnabled( dw, Qt::DockBottom, FALSE );
+ commonWidgetsToolBar = new QToolBar( "Common Widgets", 0, toolBox, FALSE, "Common Widgets" );
+ commonWidgetsToolBar->setFrameStyle( QFrame::NoFrame );
+ commonWidgetsToolBar->setOrientation( Qt::Vertical );
+ commonWidgetsToolBar->setBackgroundMode(PaletteBase);
+ toolBox->addItem( commonWidgetsToolBar, "Common Widgets" );
+}
+
+void MainWindow::setupRMBMenus()
+{
+ rmbWidgets = new QPopupMenu( 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 QPopupMenu( 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( QAction* action )
+{
+ actionCurrentTool = action;
+ emit currentToolChanged();
+ if ( formWindow() )
+ formWindow()->commandHistory()->emitUndoRedo();
+}
+
+int MainWindow::currentTool() const
+{
+ if ( !actionCurrentTool )
+ return POINTER_TOOL;
+ return QString::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( QObjectList *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 );
+ }
+}
+
+QWidget* MainWindow::previewFormInternal( QStyle* style, QPalette* 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;
+
+ QStringList databases;
+ QPtrDictIterator<QWidget> wit( *fw->widgets() );
+ while ( wit.current() ) {
+ QStringList lst = MetaDataBase::fakeProperty( wit.current(), "database" ).toStringList();
+ if ( !lst.isEmpty() )
+ databases << lst [ 0 ];
+ ++wit;
+ }
+
+ if ( fw->project() ) {
+ QStringList::ConstIterator it;
+ for ( it = databases.begin(); it != databases.end(); ++it )
+ fw->project()->openDatabase( *it, FALSE );
+ }
+ QApplication::setOverrideCursor( WaitCursor );
+
+ QCString s;
+ QBuffer buffer( s );
+ buffer.open( IO_WriteOnly );
+ Resource resource( this );
+ resource.setWidget( fw );
+ QValueList<Resource::Image> images;
+ resource.save( &buffer );
+
+ buffer.close();
+ buffer.open( IO_ReadOnly );
+
+ QWidget *w = QWidgetFactory::create( &buffer );
+ if ( w ) {
+ previewedForm = w;
+ if ( palet ) {
+ if ( style )
+ style->polish( *palet );
+ w->setPalette( *palet );
+ }
+
+ if ( style )
+ w->setStyle( style );
+
+ QObjectList *l = w->queryList( "QWidget" );
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( style )
+ ( (QWidget*)o )->setStyle( style );
+ }
+ delete l;
+
+ w->move( fw->mapToGlobal( QPoint(0,0) ) );
+ ((MainWindow*)w )->setWFlags( WDestructiveClose );
+ previewing = TRUE;
+ w->show();
+ previewing = FALSE;
+ QApplication::restoreOverrideCursor();
+ return w;
+ }
+ QApplication::restoreOverrideCursor();
+ return 0;
+}
+
+void MainWindow::previewForm()
+{
+ QWidget* w = previewFormInternal();
+ if ( w )
+ w->show();
+}
+
+void MainWindow::previewForm( const QString & style )
+{
+ QStyle* st = QStyleFactory::create( style );
+ QWidget* w = 0;
+ if ( style == "Motif" ) {
+ QPalette p( QColor( 192, 192, 192 ) );
+ w = previewFormInternal( st, &p );
+ } else if ( style == "Windows" ) {
+ QPalette p( QColor( 212, 208, 200 ) );
+ w = previewFormInternal( st, &p );
+ } else if ( style == "Platinum" ) {
+ QPalette p( QColor( 220, 220, 220 ) );
+ w = previewFormInternal( st, &p );
+ } else if ( style == "CDE" ) {
+ QPalette p( QColor( 75, 123, 130 ) );
+ p.setColor( QPalette::Active, QColorGroup::Base, QColor( 55, 77, 78 ) );
+ p.setColor( QPalette::Inactive, QColorGroup::Base, QColor( 55, 77, 78 ) );
+ p.setColor( QPalette::Disabled, QColorGroup::Base, QColor( 55, 77, 78 ) );
+ p.setColor( QPalette::Active, QColorGroup::Highlight, Qt::white );
+ p.setColor( QPalette::Active, QColorGroup::HighlightedText, QColor( 55, 77, 78 ) );
+ p.setColor( QPalette::Inactive, QColorGroup::Highlight, Qt::white );
+ p.setColor( QPalette::Inactive, QColorGroup::HighlightedText, QColor( 55, 77, 78 ) );
+ p.setColor( QPalette::Disabled, QColorGroup::Highlight, Qt::white );
+ p.setColor( QPalette::Disabled, QColorGroup::HighlightedText, QColor( 55, 77, 78 ) );
+ p.setColor( QPalette::Active, QColorGroup::Foreground, Qt::white );
+ p.setColor( QPalette::Active, QColorGroup::Text, Qt::white );
+ p.setColor( QPalette::Active, QColorGroup::ButtonText, Qt::white );
+ p.setColor( QPalette::Inactive, QColorGroup::Foreground, Qt::white );
+ p.setColor( QPalette::Inactive, QColorGroup::Text, Qt::white );
+ p.setColor( QPalette::Inactive, QColorGroup::ButtonText, Qt::white );
+ p.setColor( QPalette::Disabled, QColorGroup::Foreground, Qt::lightGray );
+ p.setColor( QPalette::Disabled, QColorGroup::Text, Qt::lightGray );
+ p.setColor( QPalette::Disabled, QColorGroup::ButtonText, Qt::lightGray );
+
+ w = previewFormInternal( st, &p );
+ } else if ( style == "SGI" ) {
+ QPalette p( QColor( 220, 220, 220 ) );
+ w = previewFormInternal( st, &p );
+ } else if ( style == "MotifPlus" ) {
+ QColor gtkfg(0x00, 0x00, 0x00);
+ QColor gtkdf(0x75, 0x75, 0x75);
+ QColor gtksf(0xff, 0xff, 0xff);
+ QColor gtkbs(0xff, 0xff, 0xff);
+ QColor gtkbg(0xd6, 0xd6, 0xd6);
+ QColor gtksl(0x00, 0x00, 0x9c);
+ QColorGroup 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
+
+ QPalette pal(active, disabled, active);
+
+ pal.setColor(QPalette::Active, QColorGroup::Highlight,
+ gtksl);
+ pal.setColor(QPalette::Active, QColorGroup::HighlightedText,
+ gtksf);
+ pal.setColor(QPalette::Inactive, QColorGroup::Highlight,
+ gtksl);
+ pal.setColor(QPalette::Inactive, QColorGroup::HighlightedText,
+ gtksf);
+ pal.setColor(QPalette::Disabled, QColorGroup::Highlight,
+ gtksl);
+ pal.setColor(QPalette::Disabled, QColorGroup::HighlightedText,
+ gtkdf);
+ w = previewFormInternal( st, &pal );
+ } else {
+ w = previewFormInternal( st );
+ }
+
+ if ( !w )
+ return;
+ w->insertChild( st );
+ w->show();
+}
+
+void MainWindow::helpContents()
+{
+ QWidget *focusWidget = qApp->focusWidget();
+ bool showClassDocu = TRUE;
+ while ( focusWidget ) {
+ if ( focusWidget->isA( "PropertyList" ) ) {
+ showClassDocu = FALSE;
+ break;
+ }
+ focusWidget = focusWidget->parentWidget();
+ }
+
+ QString source = "designer-manual.html";
+ if ( propertyDocumentation.isEmpty() ) {
+ QString indexFile = documentationPath() + "/propertyindex";
+ QFile f( indexFile );
+ if ( f.open( IO_ReadOnly ) ) {
+ QTextStream ts( &f );
+ while ( !ts.eof() ) {
+ QString 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() ) {
+ QMetaObject* mo = propertyEditor->metaObjectOfCurrentProperty();
+ QString s;
+ QString cp = propertyEditor->currentProperty();
+ if ( cp == "layoutMargin" ) {
+ source = propertyDocumentation[ "QLayout/margin" ];
+ } else if ( cp == "layoutSpacing" ) {
+ source = propertyDocumentation[ "QLayout/spacing" ];
+ } else if ( cp == "toolTip" ) {
+ source = "qtooltip.html#details";
+ } else if ( mo && qstrcmp( mo->className(), "Spacer" ) == 0 ) {
+ if ( cp != "name" )
+ source = "qsizepolicy.html#SizeType";
+ else
+ source = propertyDocumentation[ "QObject/name" ];
+ } else {
+ while ( mo && !propertyDocumentation.contains( ( s = QString( mo->className() ) + "/" + cp ) ) )
+ mo = mo->superClass();
+ if ( mo )
+ source = "p:" + propertyDocumentation[s];
+ }
+ }
+
+ QString classname = WidgetFactory::classNameOf( propertyEditor->widget() );
+ if ( source.isEmpty() || source == "designer-manual.html" ) {
+ if ( classname.lower() == "spacer" )
+ source = "qspaceritem.html#details";
+ else if ( classname == "QLayoutWidget" )
+ source = "layout.html";
+ else
+ source = QString( WidgetFactory::classNameOf( propertyEditor->widget() ) ).lower() + ".html#details";
+ }
+ } else if ( propertyEditor->widget() ) {
+ source = QString( 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(QString("Version ") + QString(QT_VERSION_STR));
+ dlg.resize( dlg.width(), dlg.layout()->heightForWidth(dlg.width()) );
+ dlg.exec();
+}
+
+void MainWindow::helpAboutQt()
+{
+ QMessageBox::aboutQt( this, "Qt Designer" );
+}
+
+#if defined(_WS_WIN_)
+#include <qt_windows.h>
+#include <qprocess.h>
+#endif
+
+void MainWindow::helpRegister()
+{
+#if defined(_WS_WIN_)
+ HKEY key;
+ HKEY subkey;
+ long res;
+ DWORD type;
+ DWORD size = 255;
+ QString command;
+ QString sub( "htmlfile\\shell" );
+#if defined(UNICODE)
+ if ( QApplication::winVersion() & Qt::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_winQString( data ) + "\\command";
+ size = 255;
+ res = RegOpenKeyExW( subkey, (TCHAR*)command.ucs2(), 0, KEY_READ, &subkey );
+ res = RegQueryValueExW( subkey, NULL, NULL, &type, data, &size );
+ command = qt_winQString( 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 = QString::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 = QString::fromLocal8Bit( (const char*) data );
+ }
+
+ res = RegCloseKey( subkey );
+ res = RegCloseKey( key );
+
+ QProcess process( command + " www.trolltech.com/products/download/eval/evaluation.html" );
+ if ( !process.start() )
+ QMessageBox::information( this, "Register Qt", "Launching your web browser failed.\n"
+ "To register Qt, point your browser to www.trolltech.com/products/download/eval/evaluation.html" );
+#endif
+}
+
+void MainWindow::showProperties( QObject *o )
+{
+ if ( !o->isWidgetType() ) {
+ propertyEditor->setWidget( o, lastActiveFormWindow );
+ if ( lastActiveFormWindow )
+ hierarchyView->setFormWindow( lastActiveFormWindow, lastActiveFormWindow->mainContainer() );
+ else
+ hierarchyView->setFormWindow( 0, 0 );
+ return;
+ }
+ QWidget *w = (QWidget*)o;
+ setupHierarchyView();
+ FormWindow *fw = (FormWindow*)isAFormWindowChild( w );
+ if ( fw ) {
+ if ( fw->numSelectedWidgets() > 1 ) {
+ QWidgetList wl = fw->selectedWidgets();
+ if ( wl.first() != w ) {
+ wl.removeRef( w );
+ wl.insert( 0, w );
+ }
+ propertyEditor->setWidget( new PropertyObject( wl ), fw );
+ } else {
+ propertyEditor->setWidget( w, fw );
+ }
+ hierarchyView->setFormWindow( fw, w );
+ } else {
+ propertyEditor->setWidget( 0, 0 );
+ hierarchyView->setFormWindow( 0, 0 );
+ }
+
+ if ( currentTool() == POINTER_TOOL && fw &&
+ ( !qworkspace->activeWindow() || !::qt_cast<SourceEditor*>(qworkspace->activeWindow()) ) )
+ fw->setFocus();
+}
+
+void MainWindow::resetTool()
+{
+ actionPointerTool->setOn( TRUE );
+}
+
+void MainWindow::updateProperties( QObject * )
+{
+ if ( propertyEditor )
+ propertyEditor->refetchData();
+}
+
+bool MainWindow::eventFilter( QObject *o, QEvent *e )
+{
+ if ( ::qt_cast<MenuBarEditor*>(o) || ::qt_cast<PopupMenuEditor*>(o) ||
+ ( o &&
+ ( ::qt_cast<MenuBarEditor*>(o->parent()) ||
+ ::qt_cast<PopupMenuEditor*>(o->parent()) ) ) ) {
+
+ if ( e->type() == QEvent::Accel && ::qt_cast<PopupMenuEditor*>(o) ) {
+ return TRUE; // consume accel events
+ } else if ( e->type() == QEvent::MouseButtonPress && ::qt_cast<MenuBarEditor*>(o) ) {
+ QPoint pos = ((QMouseEvent*)e)->pos();
+ MenuBarEditor *m = ::qt_cast<MenuBarEditor*>(o);
+ showProperties( o );
+ if ( m->findItem( pos ) >= m->count() )
+ m->setFocus();
+ } else if ( e->type() == QEvent::MouseButtonPress && ::qt_cast<PopupMenuEditor*>(o) ) {
+ PopupMenuEditor *m = ::qt_cast<PopupMenuEditor*>(o);
+ PopupMenuEditorItem *i = m->at( ((QMouseEvent*)e)->pos() );
+ if ( m->find( i->action() ) != -1 && !i->isSeparator() )
+ showProperties( i->action() );
+ }
+ return QMainWindow::eventFilter( o, e );
+ }
+
+ if ( !o || !e || !o->isWidgetType() )
+ return QMainWindow::eventFilter( o, e );
+
+ QWidget *w = 0;
+ bool passiveInteractor;
+ switch ( e->type() ) {
+ case QEvent::AccelOverride:
+ if ( ( (QKeyEvent*)e )->key() == Key_F1 &&
+ ( ( (QKeyEvent*)e )->state() & ShiftButton ) != ShiftButton ) {
+ w = (QWidget*)o;
+ while ( w ) {
+ if ( ::qt_cast<PropertyList*>(w) )
+ break;
+ w = w->parentWidget( TRUE );
+ }
+ if ( w ) {
+ propertyEditor->propertyList()->showCurrentWhatsThis();
+ ( (QKeyEvent*)e )->accept();
+ return TRUE;
+ }
+ }
+ break;
+ case QEvent::Accel:
+ if ( ( ( (QKeyEvent*)e )->key() == Key_A ||
+ ( (QKeyEvent*)e )->key() == Key_E ) &&
+ ( (QKeyEvent*)e )->state() & ControlButton ) {
+ if ( qWorkspace()->activeWindow() &&
+ ::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) {
+ ( (QKeyEvent*)e )->ignore();
+ return TRUE;
+ }
+ }
+ break;
+ case QEvent::ContextMenu:
+ case QEvent::MouseButtonPress:
+ if ( o && currentTool() == POINTER_TOOL &&
+ ( ::qt_cast<MenuBarEditor*>(o) ||
+ ::qt_cast<PopupMenuEditor*>(o) ||
+ ::qt_cast<QDesignerToolBar*>(o) ||
+ ( ::qt_cast<QComboBox*>(o) ||
+ ::qt_cast<QToolButton*>(o) ||
+ ::qt_cast<QDesignerToolBarSeparator*>(o) ) &&
+ o->parent()
+ && ( ::qt_cast<QDesignerToolBar*>(o->parent())
+ || ::qt_cast<QDesignerWidgetStack*>(o->parent())) ) ) {
+ QWidget *w = (QWidget*)o;
+ if ( ::qt_cast<QToolButton*>(w) ||
+ ::qt_cast<QComboBox*>(w) ||
+ ::qt_cast<PopupMenuEditor*>(w) ||
+ ::qt_cast<QDesignerToolBarSeparator*>(w) )
+ w = w->parentWidget();
+ QWidget *pw = w->parentWidget();
+ while ( pw ) {
+ if ( ::qt_cast<FormWindow*>(pw) ) {
+ ( (FormWindow*)pw )->emitShowProperties( w );
+ if ( !::qt_cast<QDesignerToolBar*>(o) )
+ return ( !::qt_cast<QToolButton*>(o) &&
+ !::qt_cast<MenuBarEditor*>(o) &&
+ !::qt_cast<QComboBox*>(o) &&
+ !::qt_cast<QDesignerToolBarSeparator*>(o) );
+ }
+ pw = pw->parentWidget();
+ }
+ }
+ if ( o && ( ::qt_cast<QDesignerToolBar*>(o) || o->inherits("QDockWindowHandle") )
+ && e->type() == QEvent::ContextMenu )
+ break;
+ if ( isAToolBarChild( o ) && currentTool() != CONNECT_TOOL && currentTool() != BUDDY_TOOL )
+ break;
+ if ( ::qt_cast<QSizeGrip*>(o) )
+ break;
+ if ( !( w = isAFormWindowChild( o ) ) ||
+ ::qt_cast<SizeHandle*>(o) ||
+ ::qt_cast<OrderIndicator*>(o) )
+ break;
+ if ( !w->hasFocus() )
+ w->setFocus();
+ passiveInteractor = WidgetFactory::isPassiveInteractor( o );
+ if ( !passiveInteractor || currentTool() != ORDER_TOOL ) {
+ if( e->type() == QEvent::ContextMenu ) {
+ ( (FormWindow*)w )->handleContextMenu( (QContextMenuEvent*)e,
+ ( (FormWindow*)w )->designerWidget( o ) );
+ return TRUE;
+ } else {
+ ( (FormWindow*)w )->handleMousePress( (QMouseEvent*)e,
+ ( (FormWindow*)w )->designerWidget( o ) );
+ }
+ }
+ lastPressWidget = (QWidget*)o;
+ if ( passiveInteractor )
+ QTimer::singleShot( 0, formWindow(), SLOT( visibilityChanged() ) );
+ if ( currentTool() == CONNECT_TOOL || currentTool() == BUDDY_TOOL )
+ return TRUE;
+ return !passiveInteractor;
+ case QEvent::MouseButtonRelease:
+ lastPressWidget = 0;
+ if ( isAToolBarChild( o ) && currentTool() != CONNECT_TOOL && currentTool() != BUDDY_TOOL )
+ break;
+ if ( ::qt_cast<QSizeGrip*>(o) )
+ break;
+ if ( !( w = isAFormWindowChild( o ) ) ||
+ ::qt_cast<SizeHandle*>(o) ||
+ ::qt_cast<OrderIndicator*>(o) )
+ break;
+ passiveInteractor = WidgetFactory::isPassiveInteractor( o );
+ if ( !passiveInteractor )
+ ( (FormWindow*)w )->handleMouseRelease( (QMouseEvent*)e,
+ ( (FormWindow*)w )->designerWidget( o ) );
+ if ( passiveInteractor ) {
+ QTimer::singleShot( 0, this, SLOT( selectionChanged() ) );
+ QTimer::singleShot( 0, formWindow(), SLOT( visibilityChanged() ) );
+ }
+ return !passiveInteractor;
+ case QEvent::MouseMove:
+ if ( isAToolBarChild( o ) && currentTool() != CONNECT_TOOL && currentTool() != BUDDY_TOOL )
+ break;
+ w = isAFormWindowChild( o );
+ if ( lastPressWidget != (QWidget*)o && w &&
+ !::qt_cast<SizeHandle*>(o) && !::qt_cast<OrderIndicator*>(o) &&
+ !::qt_cast<PopupMenuEditor*>(o) && !::qt_cast<QMenuBar*>(o) &&
+ !::qt_cast<QSizeGrip*>(o) )
+ return TRUE;
+ if ( o && ::qt_cast<QSizeGrip*>(o) )
+ break;
+ if ( lastPressWidget != (QWidget*)o ||
+ ( !w || ::qt_cast<SizeHandle*>(o) ) ||
+ ::qt_cast<OrderIndicator*>(o) )
+ break;
+ passiveInteractor = WidgetFactory::isPassiveInteractor( o );
+ if ( !passiveInteractor )
+ ( (FormWindow*)w )->handleMouseMove( (QMouseEvent*)e,
+ ( (FormWindow*)w )->designerWidget( o ) );
+ return !passiveInteractor;
+ case QEvent::KeyPress:
+ if ( ( (QKeyEvent*)e )->key() == Key_Escape && currentTool() != POINTER_TOOL ) {
+ resetTool();
+ return FALSE;
+ }
+ if ( ( (QKeyEvent*)e )->key() == Key_Escape && incrementalSearch->hasFocus() ) {
+ if ( ::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) {
+ qWorkspace()->activeWindow()->setFocus();
+ return TRUE;
+ }
+ }
+ if ( !( w = isAFormWindowChild( o ) ) ||
+ ::qt_cast<SizeHandle*>(o) ||
+ ::qt_cast<OrderIndicator*>(o) )
+ break;
+ ( (FormWindow*)w )->handleKeyPress( (QKeyEvent*)e, ( (FormWindow*)w )->designerWidget( o ) );
+ if ( ((QKeyEvent*)e)->isAccepted() )
+ return TRUE;
+ break;
+ case QEvent::MouseButtonDblClick:
+ if ( !( w = isAFormWindowChild( o ) ) ||
+ ::qt_cast<SizeHandle*>(o) ||
+ ::qt_cast<OrderIndicator*>(o) ) {
+ if ( ::qt_cast<QToolButton*>(o) && ((QToolButton*)o)->isOn() &&
+ o->parent() && ::qt_cast<QToolBar*>(o->parent()) && formWindow() )
+ formWindow()->setToolFixed();
+ break;
+ }
+ if ( currentTool() == ORDER_TOOL ) {
+ ( (FormWindow*)w )->handleMouseDblClick( (QMouseEvent*)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 QEvent::KeyRelease:
+ if ( !( w = isAFormWindowChild( o ) ) ||
+ ::qt_cast<SizeHandle*>(o) ||
+ ::qt_cast<OrderIndicator*>(o) )
+ break;
+ ( (FormWindow*)w )->handleKeyRelease( (QKeyEvent*)e, ( (FormWindow*)w )->designerWidget( o ) );
+ if ( ((QKeyEvent*)e)->isAccepted() )
+ return TRUE;
+ break;
+ case QEvent::Hide:
+ if ( !( w = isAFormWindowChild( o ) ) ||
+ ::qt_cast<SizeHandle*>(o) ||
+ ::qt_cast<OrderIndicator*>(o) )
+ break;
+ if ( ( (FormWindow*)w )->isWidgetSelected( (QWidget*)o ) )
+ ( (FormWindow*)w )->selectWidget( (QWidget*)o, FALSE );
+ break;
+ case QEvent::Enter:
+ case QEvent::Leave:
+ if ( !( w = isAFormWindowChild( o ) ) ||
+ ::qt_cast<SizeHandle*>(o) ||
+ ::qt_cast<OrderIndicator*>(o) ||
+ ::qt_cast<MenuBarEditor*>(o) )
+ break;
+ return TRUE;
+ case QEvent::Resize:
+ case QEvent::Move:
+ if ( !( w = isAFormWindowChild( o ) ) ||
+ ::qt_cast<SizeHandle*>(o) ||
+ ::qt_cast<OrderIndicator*>(o) )
+ break;
+ if ( WidgetFactory::layoutType( (QWidget*)o->parent() ) != WidgetFactory::NoLayout ) {
+ ( (FormWindow*)w )->updateSelection( (QWidget*)o );
+ if ( e->type() != QEvent::Resize )
+ ( (FormWindow*)w )->updateChildSelections( (QWidget*)o );
+ }
+ break;
+ case QEvent::Close:
+ if ( o->isWidgetType() && (QWidget*)o == (QWidget*)previewedForm ) {
+ if ( lastActiveFormWindow && lastActiveFormWindow->project() ) {
+ QStringList lst =
+ MetaDataBase::fakeProperty( lastActiveFormWindow, "database" ).toStringList();
+ lastActiveFormWindow->project()->closeDatabase( lst[ 0 ] );
+ }
+ }
+ break;
+ case QEvent::DragEnter:
+ if ( o == qWorkspace() || o == workspace() || o == workspace()->viewport() ) {
+ workspace()->contentsDragEnterEvent( (QDragEnterEvent*)e );
+ return TRUE;
+ }
+ break;
+ case QEvent::DragMove:
+ if ( o == qWorkspace() || o == workspace() || o == workspace()->viewport() ) {
+ workspace()->contentsDragMoveEvent( (QDragMoveEvent*)e );
+ return TRUE;
+ }
+ break;
+ case QEvent::Drop:
+ if ( o == qWorkspace() || o == workspace() || o == workspace()->viewport() ) {
+ workspace()->contentsDropEvent( (QDropEvent*)e );
+ return TRUE;
+ }
+ break;
+ case QEvent::Show:
+ if ( o != this )
+ break;
+ if ( ((QShowEvent*)e)->spontaneous() )
+ break;
+ QApplication::sendPostedEvents( qworkspace, QEvent::ChildInserted );
+ showEvent( (QShowEvent*)e );
+ checkTempFiles();
+ return TRUE;
+ case QEvent::Wheel:
+ if ( !( w = isAFormWindowChild( o ) ) ||
+ ::qt_cast<SizeHandle*>(o) ||
+ ::qt_cast<OrderIndicator*>(o) )
+ break;
+ return TRUE;
+ case QEvent::FocusIn:
+ if ( !::qt_cast<FormWindow*>(o) && isAFormWindowChild( o ) )
+ return TRUE; //FIXME
+ if ( hierarchyView->formDefinitionView()->isRenaming()
+ && ( o->inherits( "Editor" ) || ::qt_cast<FormWindow*>(o) ) )
+ QApplication::sendPostedEvents();
+ if ( o->inherits( "Editor" ) ) {
+ QWidget *w = (QWidget*)o;
+ while ( w ) {
+ if ( ::qt_cast<SourceEditor*>(w) )
+ break;
+ w = w->parentWidget( TRUE );
+ }
+ if ( ::qt_cast<SourceEditor*>(w) )
+ ( (SourceEditor*)w )->checkTimeStamp();
+ } else if ( ::qt_cast<FormWindow*>(o) ) {
+ FormWindow *fw = (FormWindow*)o;
+ if ( fw->formFile() && fw->formFile()->editor() )
+ fw->formFile()->editor()->checkTimeStamp();
+ }
+ break;
+ case QEvent::FocusOut:
+ if ( !::qt_cast<FormWindow*>(o) && isAFormWindowChild( o ) )
+ return TRUE;
+ break;
+ default:
+ return QMainWindow::eventFilter( o, e );
+ }
+
+ return QMainWindow::eventFilter( o, e );
+}
+
+QWidget *MainWindow::isAFormWindowChild( QObject *o ) const
+{
+ if ( ::qt_cast<QWizard*>(o->parent()) && !::qt_cast<QPushButton*>(o) )
+ return 0;
+ while ( o ) {
+ if ( ::qt_cast<FormWindow*>(o) )
+ return (QWidget*)o;
+ o = o->parent();
+ }
+ return 0;
+}
+
+QWidget *MainWindow::isAToolBarChild( QObject *o ) const
+{
+ while ( o ) {
+ if ( ::qt_cast<QDesignerToolBar*>(o) )
+ return (QWidget*)o;
+ if ( ::qt_cast<FormWindow*>(o) )
+ return 0;
+ o = o->parent();
+ }
+ return 0;
+}
+
+FormWindow *MainWindow::formWindow()
+{
+ if ( qworkspace->activeWindow() ) {
+ FormWindow *fw = 0;
+ if ( ::qt_cast<FormWindow*>(qworkspace->activeWindow()) )
+ fw = (FormWindow*)qworkspace->activeWindow();
+ else if ( lastActiveFormWindow &&
+ qworkspace->windowList().find( lastActiveFormWindow ) != -1)
+ fw = lastActiveFormWindow;
+ return fw;
+ }
+ return 0;
+}
+
+void MainWindow::emitProjectSignals()
+{
+ emit hasNonDummyProject( !currentProject->isDummy() );
+ emit hasActiveWindowOrProject( !!qworkspace->activeWindow() || !currentProject->isDummy() );
+}
+
+void MainWindow::insertFormWindow( FormWindow *fw )
+{
+ if ( fw )
+ QWhatsThis::add( fw, tr( "<b>The Form Window</b>"
+ "<p>Use the various tools to add widgets or to change the layout "
+ "and behavior of the components in the form. Select one or multiple "
+ "widgets to move them or lay them out. If a single widget is chosen it can "
+ "be resized using the resize handles.</p>"
+ "<p>Changes in the <b>Property Editor</b> are visible at design time, "
+ "and you can preview the form in different styles.</p>"
+ "<p>You can change the grid resolution, or turn the grid off in the "
+ "<b>Preferences</b> dialog in the <b>Edit</b> menu."
+ "<p>You can have several forms open, and all open forms are listed "
+ "in the <b>Form List</b>.") );
+
+ connect( fw, SIGNAL( showProperties( QObject * ) ),
+ this, SLOT( showProperties( QObject * ) ) );
+ connect( fw, SIGNAL( updateProperties( QObject * ) ),
+ this, SLOT( updateProperties( QObject * ) ) );
+ connect( this, SIGNAL( currentToolChanged() ),
+ fw, SLOT( currentToolChanged() ) );
+ connect( fw, SIGNAL( selectionChanged() ),
+ this, SLOT( selectionChanged() ) );
+ connect( fw, SIGNAL( undoRedoChanged( bool, bool, const QString &, const QString & ) ),
+ this, SLOT( updateUndoRedo( bool, bool, const QString &, const QString & ) ) );
+
+ if ( !mblockNewForms ) {
+ } else {
+ fw->setProject( currentProject );
+ }
+ fw->show();
+ fw->currentToolChanged();
+ if ( fw->caption().isEmpty() && qstrlen( fw->name() ) )
+ fw->setCaption( fw->name() );
+ fw->mainContainer()->setCaption( fw->caption() );
+ WidgetFactory::saveDefaultProperties( fw->mainContainer(),
+ WidgetDatabase::
+ idFromClassName( WidgetFactory::classNameOf( 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 QString &lang )
+{
+ Project *pro = new Project( "", "", projectSettingsPluginManager );
+ pro->setLanguage( lang );
+
+
+ if ( !openProjectSettings( pro ) ) {
+ delete pro;
+ return;
+ }
+
+ if ( !pro->isValid() ) {
+ QMessageBox::information( this, tr("New Project"), tr( "Cannot create an invalid project." ) );
+ delete pro;
+ return;
+ }
+
+ QAction *a = new QAction( 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;
+
+ QPtrList<SourceEditor> waitingForDelete;
+ waitingForDelete.setAutoDelete( TRUE );
+ for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) {
+ if ( e->object() == w )
+ waitingForDelete.append( e );
+ }
+
+ if ( actionEditor->form() == w ) {
+ actionEditor->setFormWindow( 0 );
+ actionEditor->parentWidget()->hide();
+ }
+
+ return TRUE;
+}
+
+void MainWindow::activeWindowChanged( QWidget *w )
+{
+ QWidget *old = formWindow();
+ if ( ::qt_cast<FormWindow*>(w) ) {
+ FormWindow *fw = (FormWindow*)w;
+ FormWindow *ofw = lastActiveFormWindow;
+ lastActiveFormWindow = fw;
+ lastActiveFormWindow->updateUndoInfo();
+ emit hasActiveForm( TRUE );
+ if ( formWindow() ) {
+ formWindow()->emitShowProperties();
+ emit formModified( formWindow()->commandHistory()->isModified() );
+ if ( currentTool() != POINTER_TOOL )
+ formWindow()->clearSelection();
+ }
+ workspace()->activeFormChanged( fw );
+ setAppropriate( (QDockWindow*)actionEditor->parentWidget(),
+ ::qt_cast<QMainWindow*>(lastActiveFormWindow->mainContainer()) );
+ if ( appropriate( (QDockWindow*)actionEditor->parentWidget() ) ) {
+ if ( actionEditor->wantToBeShown() )
+ actionEditor->parentWidget()->show();
+ } else {
+ QWidget *mc = 0;
+ if ( ofw && (mc = ofw->mainContainer()) && ::qt_cast<QMainWindow*>(mc) )
+ actionEditor->setWantToBeShown( !actionEditor->parentWidget()->isHidden() );
+ actionEditor->parentWidget()->hide();
+ }
+
+ actionEditor->setFormWindow( lastActiveFormWindow );
+ if ( wspace && fw->project() && fw->project() != currentProject ) {
+ for ( QMap<QAction*, Project *>::ConstIterator it = projects.begin(); it != projects.end(); ++it ) {
+ if ( *it == fw->project() ) {
+ projectSelected( it.key() );
+ break;
+ }
+ }
+ }
+ emit formWindowChanged();
+
+ } else if ( w == propertyEditor ) {
+ propertyEditor->resetFocus();
+ } else if ( !lastActiveFormWindow ) {
+ emit formWindowChanged();
+ emit hasActiveForm( FALSE );
+ actionEditUndo->setEnabled( FALSE );
+ actionEditRedo->setEnabled( FALSE );
+ }
+
+ if ( !w ) {
+ emit formWindowChanged();
+ emit hasActiveForm( FALSE );
+ propertyEditor->clear();
+ hierarchyView->clear();
+ updateUndoRedo( FALSE, FALSE, QString::null, QString::null );
+ }
+
+ selectionChanged();
+
+ if ( ::qt_cast<SourceEditor*>(w) ) {
+ SourceEditor *se = (SourceEditor*)w;
+ QGuardedPtr<FormWindow> fw = se->formWindow();
+ if ( se->formWindow() &&
+ lastActiveFormWindow != fw ) {
+ activeWindowChanged( se->formWindow() );
+ }
+ actionSearchFind->setEnabled( TRUE );
+ actionSearchIncremetal->setEnabled( TRUE );
+ actionSearchReplace->setEnabled( TRUE );
+ actionSearchGotoLine->setEnabled( TRUE );
+ incrementalSearch->setEnabled( TRUE );
+
+ actionEditUndo->setEnabled( FALSE );
+ actionEditRedo->setEnabled( FALSE );
+ actionEditCut->setEnabled( TRUE );
+ actionEditCopy->setEnabled( TRUE );
+ // actionEditPaste will be updated by calling clipboardChanged()
+ actionEditSelectAll->setEnabled( TRUE );
+ actionEditUndo->setMenuText( tr( "&Undo" ) );
+ actionEditUndo->setToolTip( textNoAccel( actionEditUndo->menuText()) );
+ actionEditRedo->setMenuText( tr( "&Redo" ) );
+ actionEditRedo->setToolTip( textNoAccel( actionEditRedo->menuText()) );
+ if ( hierarchyView->sourceEditor() != w )
+ hierarchyView->showClasses( se );
+ actionEditor->setFormWindow( 0 );
+ if ( wspace && se->project() && se->project() != currentProject ) {
+ for ( QMap<QAction*, Project *>::ConstIterator it = projects.begin(); it != projects.end(); ++it ) {
+ if ( *it == se->project() ) {
+ projectSelected( it.key() );
+ break;
+ }
+ }
+ }
+ workspace()->activeEditorChanged( se );
+ } else {
+ actionSearchFind->setEnabled( FALSE );
+ actionSearchIncremetal->setEnabled( FALSE );
+ actionSearchReplace->setEnabled( FALSE );
+ actionSearchGotoLine->setEnabled( FALSE );
+ incrementalSearch->setEnabled( FALSE );
+ }
+
+ clipboardChanged(); // update actionEditPaste
+
+ if ( currentTool() == ORDER_TOOL && w != old )
+ emit currentToolChanged();
+
+ emit hasActiveWindow( !!qworkspace->activeWindow() );
+}
+
+void MainWindow::updateUndoRedo( bool undoAvailable, bool redoAvailable,
+ const QString &undoCmd, const QString &redoCmd )
+{
+ if ( qWorkspace()->activeWindow() &&
+ ::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) )
+ return; // do not set a formWindow related command
+ actionEditUndo->setEnabled( undoAvailable );
+ actionEditRedo->setEnabled( redoAvailable );
+ if ( !undoCmd.isEmpty() )
+ actionEditUndo->setMenuText( tr( "&Undo: %1" ).arg( undoCmd ) );
+ else
+ actionEditUndo->setMenuText( tr( "&Undo: Not Available" ) );
+ if ( !redoCmd.isEmpty() )
+ actionEditRedo->setMenuText( tr( "&Redo: %1" ).arg( redoCmd ) );
+ else
+ actionEditRedo->setMenuText( tr( "&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() ||
+ !::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) )
+ return;
+ SourceEditor *editor = (SourceEditor*)qWorkspace()->activeWindow();
+ actionEditUndo->setEnabled( editor->editIsUndoAvailable() );
+ actionEditRedo->setEnabled( editor->editIsRedoAvailable() );
+}
+
+QWorkspace *MainWindow::qWorkspace() const
+{
+ return qworkspace;
+}
+
+void MainWindow::popupFormWindowMenu( const QPoint & gp, FormWindow *fw )
+{
+ QValueList<uint> ids;
+ QMap<QString, int> commands;
+
+ setupRMBSpecialCommands( ids, commands, fw );
+ setupRMBProperties( ids, commands, fw );
+
+ qApp->processEvents();
+ int r = rmbFormWindow->exec( gp );
+
+ handleRMBProperties( r, commands, fw );
+ handleRMBSpecialCommands( r, commands, fw );
+
+ for ( QValueList<uint>::ConstIterator i = ids.begin(); i != ids.end(); ++i )
+ rmbFormWindow->removeItem( *i );
+}
+
+void MainWindow::popupWidgetMenu( const QPoint &gp, FormWindow * /*fw*/, QWidget * w)
+{
+ QValueList<uint> ids;
+ QMap<QString, int> commands;
+
+ setupRMBSpecialCommands( ids, commands, w );
+ setupRMBProperties( ids, commands, w );
+
+ qApp->processEvents();
+ int r = rmbWidgets->exec( gp );
+
+ handleRMBProperties( r, commands, w );
+ handleRMBSpecialCommands( r, commands, w );
+
+ for ( QValueList<uint>::ConstIterator i = ids.begin(); i != ids.end(); ++i )
+ rmbWidgets->removeItem( *i );
+}
+
+void MainWindow::setupRMBProperties( QValueList<uint> &ids, QMap<QString, int> &props, QWidget *w )
+{
+ const QMetaProperty* text = w->metaObject()->property( w->metaObject()->findProperty( "text", TRUE ), TRUE );
+ if ( text && qstrcmp( text->type(), "QString") != 0 )
+ text = 0;
+ const QMetaProperty* title = w->metaObject()->property( w->metaObject()->findProperty( "title", TRUE ), TRUE );
+ if ( title && qstrcmp( title->type(), "QString") != 0 )
+ title = 0;
+ const QMetaProperty* pagetitle =
+ w->metaObject()->property( w->metaObject()->findProperty( "pageTitle", TRUE ), TRUE );
+ if ( pagetitle && qstrcmp( pagetitle->type(), "QString") != 0 )
+ pagetitle = 0;
+ const QMetaProperty* pixmap =
+ w->metaObject()->property( w->metaObject()->findProperty( "pixmap", TRUE ), TRUE );
+ if ( pixmap && qstrcmp( pixmap->type(), "QPixmap") != 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( tr("Choose Pixmap..."), -1, 0) );
+ props.insert( "pixmap", id );
+ }
+ if ( text && text->designable(w) && !::qt_cast<QTextEdit*>(w) ) {
+ ids << ( id = rmbWidgets->insertItem( tr("Edit Text..."), -1, 0) );
+ props.insert( "text", id );
+ }
+ if ( title && title->designable(w) ) {
+ ids << ( id = rmbWidgets->insertItem( tr("Edit Title..."), -1, 0) );
+ props.insert( "title", id );
+ }
+ if ( pagetitle && pagetitle->designable(w) ) {
+ ids << ( id = rmbWidgets->insertItem( tr("Edit Page Title..."), -1, 0) );
+ props.insert( "pagetitle", id );
+ }
+ }
+}
+
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+static QWidgetContainerInterfacePrivate *containerWidgetInterface( QWidget *w )
+{
+ WidgetInterface *iface = 0;
+ widgetManager()->queryInterface( WidgetFactory::classNameOf( w ), &iface );
+ if ( !iface )
+ return 0;
+ QWidgetContainerInterfacePrivate *iface2 = 0;
+ iface->queryInterface( IID_QWidgetContainer, (QUnknownInterface**)&iface2 );
+ if ( !iface2 )
+ return 0;
+ iface->release();
+ return iface2;
+}
+#endif
+
+void MainWindow::setupRMBSpecialCommands( QValueList<uint> &ids,
+ QMap<QString, int> &commands, QWidget *w )
+{
+ int id;
+
+ if ( ::qt_cast<QTabWidget*>(w) ) {
+ if ( ids.isEmpty() )
+ ids << rmbWidgets->insertSeparator( 0 );
+ if ( ( (QDesignerTabWidget*)w )->count() > 1) {
+ ids << ( id = rmbWidgets->insertItem( tr("Delete Page"), -1, 0 ) );
+ commands.insert( "remove", id );
+ }
+ ids << ( id = rmbWidgets->insertItem( tr("Add Page"), -1, 0 ) );
+ commands.insert( "add", id );
+ } else if ( ::qt_cast<QDesignerWidgetStack*>(w) ) {
+ if ( ids.isEmpty() )
+ ids << rmbWidgets->insertSeparator( 0 );
+ if ( ( (QDesignerWidgetStack*)w )->count() > 1) {
+ ids << ( id = rmbWidgets->insertItem( tr("Previous Page"), -1, 0 ) );
+ commands.insert( "prevpage", id );
+ ids << ( id = rmbWidgets->insertItem( tr("Next Page"), -1, 0 ) );
+ ids << rmbWidgets->insertSeparator( 0 );
+ commands.insert( "nextpage", id );
+ ids << ( id = rmbWidgets->insertItem( tr("Delete Page"), -1, 0 ) );
+ commands.insert( "remove", id );
+ }
+ ids << ( id = rmbWidgets->insertItem( tr("Add Page"), -1, 0 ) );
+ commands.insert( "add", id );
+ } else if ( ::qt_cast<QToolBox*>(w) ) {
+ if ( ids.isEmpty() )
+ ids << rmbWidgets->insertSeparator( 0 );
+ if ( ( (QToolBox*)w )->count() > 1 ) {
+ ids << ( id = rmbWidgets->insertItem( tr("Delete Page"), -1, 0 ) );
+ commands.insert( "remove", id );
+ }
+ ids << ( id = rmbWidgets->insertItem( tr("Add Page"), -1, 0 ) );
+ commands.insert( "add", id );
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ } else if ( WidgetDatabase::
+ isCustomPluginWidget( WidgetDatabase::
+ idFromClassName( WidgetFactory::classNameOf( w ) ) ) ) {
+ QWidgetContainerInterfacePrivate *iface = containerWidgetInterface( w );
+ if ( iface && iface->supportsPages( WidgetFactory::classNameOf( w ) ) ) {
+ if ( ids.isEmpty() )
+ ids << rmbWidgets->insertSeparator( 0 );
+
+ if ( iface->count( WidgetFactory::classNameOf( w ), w ) > 1 ) {
+ ids << ( id = rmbWidgets->insertItem( tr( "Delete Page" ), -1, 0 ) );
+ commands.insert( "remove", id );
+ }
+ ids << ( id = rmbWidgets->insertItem( tr("Add Page"), -1, 0 ) );
+ commands.insert( "add", id );
+ if ( iface->currentIndex( WidgetFactory::classNameOf( w ), w ) != -1 ) {
+ ids << ( id = rmbWidgets->insertItem( tr("Rename Current Page..."), -1, 0 ) );
+ commands.insert( "rename", id );
+ }
+ }
+ if ( iface )
+ iface->release();
+#endif // QT_CONTAINER_CUSTOM_WIDGETS
+ }
+
+ if ( WidgetFactory::hasSpecialEditor( WidgetDatabase::
+ idFromClassName( WidgetFactory::classNameOf( w ) ), w ) ) {
+ if ( ids.isEmpty() )
+ ids << rmbWidgets->insertSeparator( 0 );
+ ids << ( id = rmbWidgets->insertItem( tr("Edit..."), -1, 0 ) );
+ commands.insert( "edit", id );
+ }
+}
+
+void MainWindow::setupRMBSpecialCommands( QValueList<uint> &ids,
+ QMap<QString, int> &commands, FormWindow *fw )
+{
+ int id;
+
+ if ( ::qt_cast<QWizard*>(fw->mainContainer()) ) {
+ if ( ids.isEmpty() )
+ ids << rmbFormWindow->insertSeparator( 0 );
+
+ if ( ( (QWizard*)fw->mainContainer() )->pageCount() > 1) {
+ ids << ( id = rmbFormWindow->insertItem( tr("Delete Page"), -1, 0 ) );
+ commands.insert( "remove", id );
+ }
+
+ ids << ( id = rmbFormWindow->insertItem( tr("Add Page"), -1, 0 ) );
+ commands.insert( "add", id );
+
+ ids << ( id = rmbFormWindow->insertItem( tr("Edit Page Title..."), -1, 0 ) );
+ commands.insert( "rename", id );
+
+ ids << ( id = rmbFormWindow->insertItem( tr("Edit Pages..."), -1, 0 ) );
+ commands.insert( "edit", id );
+
+ } else if ( ::qt_cast<QMainWindow*>(fw->mainContainer()) ) {
+ if ( ids.isEmpty() )
+ ids << rmbFormWindow->insertSeparator( 0 );
+ ids << ( id = rmbFormWindow->insertItem( tr( "Add Menu Item" ), -1, 0 ) );
+ commands.insert( "add_menu_item", id );
+ ids << ( id = rmbFormWindow->insertItem( tr( "Add Toolbar" ), -1, 0 ) );
+ commands.insert( "add_toolbar", id );
+ }
+}
+
+void MainWindow::handleRMBProperties( int id, QMap<QString, int> &props, QWidget *w )
+{
+ if ( id == props[ "text" ] ) {
+ bool ok = FALSE;
+ bool oldDoWrap = FALSE;
+ if ( ::qt_cast<QLabel*>(w) ) {
+ int align = w->property( "alignment" ).toInt();
+ if ( align & WordBreak )
+ oldDoWrap = TRUE;
+ }
+ bool doWrap = oldDoWrap;
+
+ QString text;
+ if ( ::qt_cast<QTextView*>(w) || ::qt_cast<QLabel*>(w) || ::qt_cast<QButton*>(w) ) {
+ text = MultiLineEditor::getText( this, w->property( "text" ).toString(), !::qt_cast<QButton*>(w), &doWrap );
+ ok = !text.isNull();
+ } else {
+ text = QInputDialog::getText( tr("Text"), tr( "New text" ),
+ QLineEdit::Normal, w->property("text").toString(), &ok, this );
+ }
+ if ( ok ) {
+ if ( oldDoWrap != doWrap ) {
+ QString pn( tr( "Set 'wordwrap' of '%1'" ).arg( w->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), w, propertyEditor,
+ "wordwrap", QVariant( oldDoWrap, 0 ),
+ QVariant( doWrap, 0 ), QString::null, QString::null );
+ cmd->execute();
+ formWindow()->commandHistory()->addCommand( cmd );
+ MetaDataBase::setPropertyChanged( w, "wordwrap", TRUE );
+ }
+
+ QString pn( tr( "Set the 'text' of '%1'" ).arg( w->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), w, propertyEditor,
+ "text", w->property( "text" ),
+ text, QString::null, QString::null );
+ cmd->execute();
+ formWindow()->commandHistory()->addCommand( cmd );
+ MetaDataBase::setPropertyChanged( w, "text", TRUE );
+ }
+ } else if ( id == props[ "title" ] ) {
+ bool ok = FALSE;
+ QString title = QInputDialog::getText( tr("Title"), tr( "New title" ),
+ QLineEdit::Normal, w->property("title").toString(), &ok, this );
+ if ( ok ) {
+ QString pn( tr( "Set the 'title' of '%2'" ).arg( w->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), w, propertyEditor,
+ "title", w->property( "title" ),
+ title, QString::null, QString::null );
+ cmd->execute();
+ formWindow()->commandHistory()->addCommand( cmd );
+ MetaDataBase::setPropertyChanged( w, "title", TRUE );
+ }
+ } else if ( id == props[ "pagetitle" ] ) {
+ bool ok = FALSE;
+ QString text = QInputDialog::getText( tr("Page Title"), tr( "New page title" ),
+ QLineEdit::Normal, w->property("pageTitle").toString(), &ok, this );
+ if ( ok ) {
+ QString pn( tr( "Set the 'pageTitle' of '%2'" ).arg( w->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), w, propertyEditor,
+ "pageTitle",
+ w->property( "pageTitle" ),
+ text, QString::null, QString::null );
+ cmd->execute();
+ formWindow()->commandHistory()->addCommand( cmd );
+ MetaDataBase::setPropertyChanged( w, "pageTitle", TRUE );
+ }
+ } else if ( id == props[ "pixmap" ] ) {
+ QPixmap oldPix = w->property( "pixmap" ).toPixmap();
+ QPixmap pix = qChoosePixmap( this, formWindow(), oldPix );
+ if ( !pix.isNull() ) {
+ QString pn( tr( "Set the 'pixmap' of '%2'" ).arg( w->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), w, propertyEditor,
+ "pixmap", w->property( "pixmap" ),
+ pix, QString::null, QString::null );
+ cmd->execute();
+ formWindow()->commandHistory()->addCommand( cmd );
+ MetaDataBase::setPropertyChanged( w, "pixmap", TRUE );
+ }
+ }
+}
+
+void MainWindow::handleRMBSpecialCommands( int id, QMap<QString, int> &commands, QWidget *w )
+{
+ if ( ::qt_cast<QTabWidget*>(w) ) {
+ QTabWidget *tw = (QTabWidget*)w;
+ if ( id == commands[ "add" ] ) {
+ AddTabPageCommand *cmd =
+ new AddTabPageCommand( tr( "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( tr( "Delete Page %1 of %2" ).
+ arg( dtw->pageTitle() ).arg( tw->name() ),
+ formWindow(), tw, tw->currentPage() );
+ formWindow()->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+ }
+ } else if ( ::qt_cast<QToolBox*>(w) ) {
+ QToolBox *tb = (QToolBox*)w;
+ if ( id == commands[ "add" ] ) {
+ AddToolBoxPageCommand *cmd =
+ new AddToolBoxPageCommand( tr( "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( tr( "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 ( ::qt_cast<QWidgetStack*>(w) ) {
+ QDesignerWidgetStack *ws = (QDesignerWidgetStack*)w;
+ if ( id == commands[ "add" ] ) {
+ AddWidgetStackPageCommand *cmd =
+ new AddWidgetStackPageCommand( tr( "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( tr( "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();
+ QString pn( tr( "Raise next page of '%2'" ).arg( w->name() ) );
+ SetPropertyCommand *cmd =
+ new SetPropertyCommand( pn, formWindow(), w, propertyEditor,
+ "currentPage", currentPage,
+ currentPage + 1, QString::null, QString::null );
+ cmd->execute();
+ formWindow()->commandHistory()->addCommand( cmd );
+ MetaDataBase::setPropertyChanged( w, "currentPage", TRUE );
+ } else if ( id == commands[ "prevpage" ] ) {
+ int currentPage = w->property( "currentPage" ).toInt();
+ QString pn( tr( "Raise previous page of '%2'" ).arg( w->name() ) );
+ SetPropertyCommand *cmd =
+ new SetPropertyCommand( pn, formWindow(), w, propertyEditor,
+ "currentPage", currentPage,
+ currentPage -1, QString::null, QString::null );
+ cmd->execute();
+ formWindow()->commandHistory()->addCommand( cmd );
+ MetaDataBase::setPropertyChanged( w, "currentPage", TRUE );
+ }
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ } else if ( WidgetDatabase::
+ isCustomPluginWidget( WidgetDatabase::
+ idFromClassName( WidgetFactory::classNameOf( w ) ) ) ) {
+ if ( id == commands[ "add" ] ) {
+ AddContainerPageCommand *cmd =
+ new AddContainerPageCommand( tr( "Add Page to %1" ).arg( w->name() ),
+ formWindow(), w, "Page" );
+ formWindow()->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ } else if ( id == commands[ "remove" ] ) {
+ QWidgetContainerInterfacePrivate *iface = containerWidgetInterface( w );
+ if ( iface ) {
+ QString wClassName = WidgetFactory::classNameOf( w );
+ int index = iface->currentIndex( wClassName, w );
+ DeleteContainerPageCommand *cmd =
+ new DeleteContainerPageCommand( tr( "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" ] ) {
+ QWidgetContainerInterfacePrivate *iface = containerWidgetInterface( w );
+ if ( iface ) {
+ bool ok = FALSE;
+ QString wClassName = WidgetFactory::classNameOf( w );
+ int index = iface->currentIndex( wClassName, w );
+ QString text = QInputDialog::getText( tr("Page Title"), tr( "New page title" ),
+ QLineEdit::Normal,
+ iface->pageLabel( wClassName, w,
+ index ),
+ &ok, this );
+ if ( ok ) {
+ RenameContainerPageCommand *cmd =
+ new RenameContainerPageCommand( tr( "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 // QT_CONTAINER_CUSTOM_WIDGETS
+ }
+
+ if ( WidgetFactory::hasSpecialEditor( WidgetDatabase::
+ idFromClassName( WidgetFactory::classNameOf( w ) ), w ) ) {
+ if ( id == commands[ "edit" ] )
+ WidgetFactory::editWidget( WidgetDatabase::
+ idFromClassName( WidgetFactory::classNameOf( w ) ), this, w, formWindow() );
+ }
+}
+
+void MainWindow::handleRMBSpecialCommands( int id, QMap<QString, int> &commands, FormWindow *fw )
+{
+ if ( ::qt_cast<QWizard*>(fw->mainContainer()) ) {
+ QWizard *wiz = (QWizard*)fw->mainContainer();
+ if ( id == commands[ "add" ] ) {
+ AddWizardPageCommand *cmd =
+ new AddWizardPageCommand( tr( "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( tr( "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;
+ QString text = QInputDialog::getText( tr("Page Title"), tr( "New page title" ),
+ QLineEdit::Normal, dw->pageTitle(), &ok, this );
+ if ( ok ) {
+ QString pn( tr( "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 ( ::qt_cast<QMainWindow*>(fw->mainContainer()) ) {
+ QMainWindow *mw = (QMainWindow*)fw->mainContainer();
+ if ( id == commands[ "add_toolbar" ] ) {
+ AddToolBarCommand *cmd =
+ new AddToolBarCommand( tr( "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( tr( "Add Menu to '%1'" ).arg( formWindow()->name() ),
+ formWindow(), mw );
+ formWindow()->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+ }
+}
+
+void MainWindow::clipboardChanged()
+{
+ QString text( qApp->clipboard()->text() );
+ if (qWorkspace()->activeWindow() && ::qt_cast<SourceEditor*>(qWorkspace()->activeWindow())) {
+ actionEditPaste->setEnabled(!text.isEmpty());
+ } else {
+ QString start( "<!DOCTYPE UI-SELECTION>" );
+ actionEditPaste->setEnabled( text.left( start.length() ) == start );
+ }
+}
+
+void MainWindow::selectionChanged()
+{
+ layoutChilds = FALSE;
+ layoutSelected = FALSE;
+ breakLayout = FALSE;
+ if ( !formWindow() ) {
+ actionEditCut->setEnabled( FALSE );
+ actionEditCopy->setEnabled( FALSE );
+ actionEditDelete->setEnabled( FALSE );
+ actionEditAdjustSize->setEnabled( FALSE );
+ actionEditHLayout->setEnabled( FALSE );
+ actionEditVLayout->setEnabled( FALSE );
+ actionEditSplitHorizontal->setEnabled( FALSE );
+ actionEditSplitVertical->setEnabled( FALSE );
+ actionEditGridLayout->setEnabled( FALSE );
+ actionEditBreakLayout->setEnabled( FALSE );
+ actionEditLower->setEnabled( FALSE );
+ actionEditRaise->setEnabled( FALSE );
+ actionEditAdjustSize->setEnabled( FALSE );
+ return;
+ }
+
+ int selectedWidgets = formWindow()->numSelectedWidgets();
+ bool enable = selectedWidgets > 0;
+ actionEditCut->setEnabled( enable );
+ actionEditCopy->setEnabled( enable );
+ actionEditDelete->setEnabled( enable );
+ actionEditLower->setEnabled( enable );
+ actionEditRaise->setEnabled( enable );
+
+ actionEditAdjustSize->setEnabled( FALSE );
+ actionEditSplitHorizontal->setEnabled( FALSE );
+ actionEditSplitVertical->setEnabled( FALSE );
+
+ enable = FALSE;
+ QWidgetList widgets = formWindow()->selectedWidgets();
+ if ( selectedWidgets > 1 ) {
+ int unlaidout = 0;
+ int laidout = 0;
+ for ( QWidget *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 ) {
+ QWidget *w = widgets.first();
+ bool isContainer = WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( 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( 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( w ) );
+ breakLayout = TRUE;
+ }
+ } else {
+ actionEditHLayout->setEnabled( FALSE );
+ actionEditVLayout->setEnabled( FALSE );
+ actionEditGridLayout->setEnabled( FALSE );
+ actionEditBreakLayout->setEnabled( !isAToolBarChild( w ) );
+ breakLayout = TRUE;
+ }
+ }
+ } else if ( selectedWidgets == 0 ) {
+ actionEditAdjustSize->setEnabled( TRUE );
+ QWidget *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 QString fixArgs( const QString &s2 )
+{
+ QString s = s2;
+ return s.replace( ',', ';' );
+}
+
+void MainWindow::writeConfig()
+{
+ QSettings config;
+
+ // No search path for unix, only needs application name
+ config.insertSearchPath( QSettings::Windows, "/Trolltech" );
+
+ QString keybase = DesignerApplication::settingsKey();
+
+ if (savePluginPaths) {
+ QStringList pluginPaths = QApplication::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( QDir::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() );
+
+ QString mwlKey = "MainwindowLayout";
+ if ( singleProjectMode() )
+ mwlKey += "S";
+ QString mainWindowLayout;
+ QTextStream ts( &mainWindowLayout, IO_WriteOnly );
+ ts << *this;
+ config.writeEntry( keybase + mwlKey, mainWindowLayout );
+
+
+ QPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets();
+ config.writeEntry( keybase + "CustomWidgets/num", (int)lst->count() );
+ int j = 0;
+ QDir::home().mkdir( ".designer" );
+ for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) {
+ QStringList l;
+ l << w->className;
+ l << w->includeFile;
+ l << QString::number( (int)w->includePolicy );
+ l << QString::number( w->sizeHint.width() );
+ l << QString::number( w->sizeHint.height() );
+ l << QString::number( w->lstSignals.count() );
+ for ( QValueList<QCString>::ConstIterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it )
+ l << QString( fixArgs( *it ) );
+ l << QString::number( w->lstSlots.count() );
+ for ( QValueList<MetaDataBase::Function>::ConstIterator it2 = w->lstSlots.begin(); it2 != w->lstSlots.end(); ++it2 ) {
+ l << fixArgs( (*it2).function );
+ l << (*it2).access;
+ }
+ l << QString::number( w->lstProperties.count() );
+ for ( QValueList<MetaDataBase::Property>::ConstIterator it3 = w->lstProperties.begin(); it3 != w->lstProperties.end(); ++it3 ) {
+ l << (*it3).property;
+ l << (*it3).type;
+ }
+ l << QString::number( size_type_to_int( w->sizePolicy.horData() ) );
+ l << QString::number( size_type_to_int( w->sizePolicy.verData() ) );
+ l << QString::number( (int)w->isContainer );
+ config.writeEntry( keybase + "CustomWidgets/Widget" + QString::number( j++ ), l, ',' );
+ w->pixmap->save( QDir::home().absPath() + "/.designer/" + w->className, "XPM" );
+ }
+
+ QStringList l;
+ for ( QAction *a = commonWidgetsPage.first(); a; a = commonWidgetsPage.next() )
+ l << a->text();
+ config.writeEntry( keybase + "ToolBox/CommonWidgets", l );
+}
+
+static QString fixArgs2( const QString &s2 )
+{
+ QString s = s2;
+ return s.replace( ';', ',' );
+}
+
+void MainWindow::readConfig()
+{
+ QString keybase = DesignerApplication::settingsKey();
+ QSettings config;
+ config.insertSearchPath( QSettings::Windows, "/Trolltech" );
+
+ bool ok;
+ bool readPreviousConfig = FALSE;
+ QString backPixName( QDir::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();
+ ( (QDockWindow*)oWindow->parent() )->hide();
+ }
+ QPixmap 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", QString::null );
+ 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 ) {
+ QString 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 ) {
+ QPixmap pix;
+ pix.load( backPixName );
+ if ( !pix.isNull() )
+ qworkspace->setBackgroundPixmap( pix );
+ } else {
+ qworkspace->setBackgroundColor( QColor( (QRgb)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 ) ) {
+ QRect 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() ) );
+
+ QRect desk = QApplication::desktop()->geometry();
+ QRect 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;
+ QStringList l = config.readListEntry( keybase + "CustomWidgets/Widget" + QString::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 ) {
+ QSizePolicy::SizeType h, v;
+ h = int_to_size_type( l[ c++ ].toInt() );
+ v = int_to_size_type( l[ c++ ].toInt() );
+ w->sizePolicy = QSizePolicy( h, v );
+ }
+ if ( l.count() > c ) {
+ w->isContainer = (bool)l[ c++ ].toInt();
+ }
+ w->pixmap = new QPixmap( QPixmap::fromMimeSource( QDir::home().absPath() + "/.designer/" + w->className ) );
+ MetaDataBase::addCustomWidget( w );
+ }
+ if ( num > 0 )
+ rebuildCustomWidgetGUI();
+
+ if ( !restoreConfig )
+ return;
+
+#ifndef Q_WS_MAC
+ /* I'm sorry to make this not happen on the Mac, but it seems to hang somewhere deep
+ in QLayout, it gets into a very large loop - and seems it has to do with clever
+ things the designer does ###Sam */
+ QApplication::sendPostedEvents();
+#endif
+
+ if ( !readPreviousConfig ) {
+ QString mwlKey = "MainwindowLayout";
+ if ( singleProjectMode() )
+ mwlKey += "S";
+ QString mainWindowLayout = config.readEntry( keybase + mwlKey );
+ QTextStream ts( &mainWindowLayout, IO_ReadOnly );
+ ts >> *this;
+ }
+ if ( readPreviousConfig && oWindow ) {
+ oWindow->shuttingDown();
+ ( (QDockWindow*)oWindow->parent() )->hide();
+ }
+
+ rebuildCustomWidgetGUI();
+
+ QStringList l = config.readListEntry( keybase + "ToolBox/CommonWidgets" );
+ if ( !l.isEmpty() ) {
+ QPtrList<QAction> lst;
+ commonWidgetsPage.clear();
+ for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
+ for ( QAction *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;
+}
+
+QPopupMenu *MainWindow::setupNormalHierarchyMenu( QWidget *parent )
+{
+ QPopupMenu *menu = new QPopupMenu( parent );
+
+ actionEditCut->addTo( menu );
+ actionEditCopy->addTo( menu );
+ actionEditPaste->addTo( menu );
+ actionEditDelete->addTo( menu );
+
+ return menu;
+}
+
+QPopupMenu *MainWindow::setupTabWidgetHierarchyMenu( QWidget *parent, const char *addSlot, const char *removeSlot )
+{
+ QPopupMenu *menu = new QPopupMenu( parent );
+
+ menu->insertItem( tr( "Add Page" ), parent, addSlot );
+ menu->insertItem( tr( "Delete Page" ), parent, removeSlot );
+ menu->insertSeparator();
+ actionEditCut->addTo( menu );
+ actionEditCopy->addTo( menu );
+ actionEditPaste->addTo( menu );
+ actionEditDelete->addTo( menu );
+
+ return menu;
+}
+
+void MainWindow::closeEvent( QCloseEvent *e )
+{
+ if ( singleProject ) {
+ hide();
+ e->ignore();
+ return;
+ }
+
+ QWidgetList windows = qWorkspace()->windowList();
+ QWidgetListIt wit( windows );
+ while ( wit.current() ) {
+ QWidget *w = wit.current();
+ ++wit;
+ if ( ::qt_cast<FormWindow*>(w) ) {
+ if ( ( (FormWindow*)w )->formFile()->editor() )
+ windows.removeRef( ( (FormWindow*)w )->formFile()->editor() );
+ if ( ( (FormWindow*)w )->formFile()->formWindow() )
+ windows.removeRef( ( (FormWindow*)w )->formFile()->formWindow() );
+ if ( !( (FormWindow*)w )->formFile()->close() ) {
+ e->ignore();
+ return;
+ }
+ } else if ( ::qt_cast<SourceEditor*>(w) ) {
+ if ( !( (SourceEditor*)w )->close() ) {
+ e->ignore();
+ return;
+ }
+ }
+ w->close();
+ }
+
+ QMapConstIterator<QAction*, Project*> it = projects.begin();
+ while( it != projects.end() ) {
+ Project *pro = it.data();
+ ++it;
+ if ( pro->isModified() ) {
+ switch ( QMessageBox::warning( this, tr( "Save Project Settings" ),
+ tr( "Save changes to '%1'?" ).arg( pro->fileName() ),
+ tr( "&Yes" ), tr( "&No" ), tr( "&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 ) {
+ QDir home( QDir::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( QWidget *w, FormWindow *f )
+{
+ if ( f && !f->project()->isCpp() && !WidgetFactory::isPassiveInteractor( w ) ) {
+ QString defSignal = WidgetFactory::defaultSignal( w );
+ if ( defSignal.isEmpty() ) {
+ editSource();
+ } else {
+ QString s = QString( w->name() ) + "_" + defSignal;
+ LanguageInterface *iface = MetaDataBase::languageInterface( f->project()->language() );
+ if ( iface ) {
+ QStrList sigs = iface->signalNames( w );
+ QString fullSignal;
+ for ( int i = 0; i < (int)sigs.count(); ++i ) {
+ QString sig = sigs.at( i );
+ if ( sig.left( sig.find( '(' ) ) == defSignal ) {
+ fullSignal = sig;
+ break;
+ }
+ }
+
+ if ( !fullSignal.isEmpty() ) {
+ QString 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( f, s.latin1() ) )
+ MetaDataBase::addFunction( f, s.latin1(), "", "public", "slot",
+ f->project()->language(), "void" );
+ s = s.left( s.find( '(' ) ).latin1();
+ if ( !MetaDataBase::hasConnection( f, w, defSignal.latin1(), f->mainContainer(), s.latin1() ) ) {
+ MetaDataBase::Connection conn;
+ conn.sender = w;
+ conn.receiver = f->mainContainer();
+ conn.signal = signl;
+ conn.slot = s;
+ AddConnectionCommand *cmd =
+ new AddConnectionCommand( tr( "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( w ) ), w ) ) {
+ statusBar()->message( tr( "Edit %1..." ).arg( w->className() ) );
+ WidgetFactory::editWidget( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( w ) ),
+ this, w, formWindow() );
+ statusBar()->clear();
+ return TRUE;
+ }
+
+ const QMetaProperty* text = w->metaObject()->property( w->metaObject()->findProperty( "text", TRUE ), TRUE );
+ const QMetaProperty* title = w->metaObject()->property( w->metaObject()->findProperty( "title", TRUE ), TRUE );
+ if ( text && text->designable(w) ) {
+ bool ok = FALSE;
+ bool oldDoWrap = FALSE;
+ if ( ::qt_cast<QLabel*>(w) ) {
+ int align = w->property( "alignment" ).toInt();
+ if ( align & WordBreak )
+ oldDoWrap = TRUE;
+ }
+ bool doWrap = oldDoWrap;
+
+ QString text;
+ if ( ::qt_cast<QTextEdit*>(w) || ::qt_cast<QLabel*>(w) || ::qt_cast<QButton*>(w) ) {
+ text = MultiLineEditor::getText( this, w->property( "text" ).toString(),
+ !::qt_cast<QButton*>(w), &doWrap );
+ ok = !text.isNull();
+ } else {
+ text = QInputDialog::getText( tr("Text"), tr( "New text" ),
+ QLineEdit::Normal, w->property("text").toString(), &ok, this );
+ }
+ if ( ok ) {
+ if ( oldDoWrap != doWrap ) {
+ QString pn( tr( "Set 'wordwrap' of '%1'" ).arg( w->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), w, propertyEditor,
+ "wordwrap", QVariant( oldDoWrap, 0 ),
+ QVariant( doWrap, 0 ), QString::null, QString::null );
+ cmd->execute();
+ formWindow()->commandHistory()->addCommand( cmd );
+ MetaDataBase::setPropertyChanged( w, "wordwrap", TRUE );
+ }
+
+ QString pn( tr( "Set the 'text' of '%1'" ).arg( w->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), w, propertyEditor,
+ "text", w->property( "text" ),
+ text, QString::null, QString::null );
+ cmd->execute();
+ formWindow()->commandHistory()->addCommand( cmd );
+ MetaDataBase::setPropertyChanged( w, "text", TRUE );
+ }
+ return TRUE;
+ }
+ if ( title && title->designable(w) ) {
+ bool ok = FALSE;
+ QString text;
+ text = QInputDialog::getText( tr("Title"), tr( "New title" ), QLineEdit::Normal, w->property("title").toString(), &ok, this );
+ if ( ok ) {
+ QString pn( tr( "Set the 'title' of '%2'" ).arg( w->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, formWindow(), w, propertyEditor,
+ "title", w->property( "title" ),
+ text, QString::null, QString::null );
+ cmd->execute();
+ formWindow()->commandHistory()->addCommand( cmd );
+ MetaDataBase::setPropertyChanged( w, "title", TRUE );
+ }
+ return TRUE;
+ }
+
+ if ( !WidgetFactory::isPassiveInteractor( w ) )
+ editSource();
+
+ return TRUE;
+}
+
+void MainWindow::rebuildCustomWidgetGUI()
+{
+ customWidgetToolBar->clear();
+ customWidgetMenu->clear();
+ customWidgetToolBar2->clear();
+ int count = 0;
+
+ QPtrListIterator<QAction> it( toolActions );
+ QAction *action;
+ while ( ( action = it.current() ) ) {
+ ++it;
+ if ( ( (WidgetAction*)action )->group() == "Custom Widgets" )
+ delete action;
+ }
+
+ QPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets();
+
+ actionToolsCustomWidget->addTo( customWidgetMenu );
+ customWidgetMenu->insertSeparator();
+
+ for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) {
+ WidgetAction* a = new WidgetAction( "Custom Widgets", actionGroupTools, QString::number( w->id ).latin1() );
+ a->setToggleAction( TRUE );
+ a->setText( w->className );
+ a->setIconSet( *w->pixmap );
+ a->setStatusTip( tr( "Insert a " +w->className + " (custom widget)" ) );
+ a->setWhatsThis( tr("<b>" + w->className + " (custom widget)</b>"
+ "<p>Click <b>Edit Custom Widgets...</b> in the <b>Tools|Custom</b> menu to "
+ "add and change custom widgets. You can add properties as well as "
+ "signals and slots to integrate them into Qt Designer, "
+ "and provide a pixmap which will be used to represent the widget on the form.</p>") );
+
+ a->addTo( customWidgetToolBar );
+ a->addTo( customWidgetToolBar2 );
+ a->addTo( customWidgetMenu );
+ count++;
+ }
+ QWidget *wid;
+ customWidgetToolBar2->setStretchableWidget( ( wid = new QWidget( 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 ( QAction *a = commonWidgetsPage.first(); a; a = commonWidgetsPage.next() )
+ a->addTo( commonWidgetsToolBar );
+ QWidget *w;
+ commonWidgetsToolBar->setStretchableWidget( ( w = new QWidget( commonWidgetsToolBar ) ) );
+ w->setBackgroundMode( commonWidgetsToolBar->backgroundMode() );
+ toolBox->setUpdatesEnabled( TRUE );
+ commonWidgetsToolBar->setUpdatesEnabled( TRUE );
+}
+
+bool MainWindow::isCustomWidgetUsed( MetaDataBase::CustomWidget *wid )
+{
+ QWidgetList windows = qWorkspace()->windowList();
+ for ( QWidget *w = windows.first(); w; w = windows.next() ) {
+ if ( ::qt_cast<FormWindow*>(w) ) {
+ if ( ( (FormWindow*)w )->isCustomWidgetUsed( wid ) )
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void MainWindow::setGrid( const QPoint &p )
+{
+ if ( p == grd )
+ return;
+ grd = p;
+ QWidgetList windows = qWorkspace()->windowList();
+ for ( QWidget *w = windows.first(); w; w = windows.next() ) {
+ if ( !::qt_cast<FormWindow*>(w) )
+ continue;
+ ( (FormWindow*)w )->mainContainer()->update();
+ }
+}
+
+void MainWindow::setShowGrid( bool b )
+{
+ if ( b == sGrid )
+ return;
+ sGrid = b;
+ QWidgetList windows = qWorkspace()->windowList();
+ for ( QWidget *w = windows.first(); w; w = windows.next() ) {
+ if ( !::qt_cast<FormWindow*>(w) )
+ continue;
+ ( (FormWindow*)w )->mainContainer()->update();
+ }
+}
+
+void MainWindow::setSnapGrid( bool b )
+{
+ if ( b == snGrid )
+ return;
+ snGrid = b;
+}
+
+QString MainWindow::documentationPath() const
+{
+ return QString( qInstallPathDocs() ) + "/html/";
+}
+
+void MainWindow::windowsMenuActivated( int id )
+{
+ QWidget* w = qworkspace->windowList().at( id );
+ if ( w )
+ w->setFocus();
+}
+
+void MainWindow::projectSelected( QAction *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 QString &fn )
+{
+ for ( QMap<QAction*, Project*>::ConstIterator it = projects.begin(); it != projects.end(); ++it ) {
+ if ( (*it)->fileName() == fn ) {
+ projectSelected( it.key() );
+ return;
+ }
+ }
+ QApplication::setOverrideCursor( waitCursor );
+ Project *pro = new Project( fn, "", projectSettingsPluginManager );
+ pro->setModified( FALSE );
+ QAction *a = new QAction( pro->projectName(), pro->projectName(), 0, actionGroupProjects, 0, TRUE );
+ projects.insert( a, pro );
+ projectSelected( a );
+ QApplication::restoreOverrideCursor();
+}
+
+void MainWindow::checkTempFiles()
+{
+ QString s = QDir::homeDirPath() + "/.designer";
+ QString baseName = s+ "/saved-form-";
+ if ( !QFile::exists( baseName + "1.ui" ) )
+ return;
+ DesignerApplication::closeSplash();
+ QDir d( s );
+ d.setNameFilter( "*.ui" );
+ QStringList lst = d.entryList();
+ QApplication::restoreOverrideCursor();
+ bool load = QMessageBox::information( this, tr( "Restoring the Last Session" ),
+ tr( "Qt Designer found some temporary saved files, which were\n"
+ "written when Qt Designer crashed last time. Do you want to\n"
+ "load these files?" ), tr( "&Yes" ), tr( "&No" ) ) == 0;
+ QApplication::setOverrideCursor( waitCursor );
+ for ( QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it ) {
+ if ( load )
+ openFormWindow( s + "/" + *it, FALSE );
+ d.remove( *it );
+ }
+}
+
+void MainWindow::showDialogHelp()
+{
+ QWidget *w = (QWidget*)sender();
+ w = w->topLevelWidget();
+
+ QString link = documentationPath() + "/designer-manual-13.html#";
+
+ if ( ::qt_cast<NewFormBase*>(w) || ::qt_cast<StartDialogBase*>(w) ) // own doc for startdialog?
+ link += "dialog-file-new";
+ else if ( ::qt_cast<CreateTemplate*>(w) )
+ link += "dialog-file-create-template";
+ else if ( ::qt_cast<EditFunctionsBase*>(w) )
+ link += "dialog-edit-functions";
+// else if ( ::qt_cast<ConnectionViewerBase*>(w) )
+ else if ( w->inherits("ConnectionViewerBase") )
+ link += "dialog-view-connections";
+ else if ( ::qt_cast<FormSettingsBase*>(w) )
+ link += "dialog-edit-form-settings";
+ else if ( ::qt_cast<Preferences*>(w) )
+ link += "dialog-edit-preferences";
+ else if ( ::qt_cast<PixmapCollectionEditor*>(w) )
+ link += "dialog-image-collection";
+// else if ( ::qt_cast<DatabaseConnectionBase*>(w) )
+ else if ( w->inherits( "DatabaseConnectionBase" ) )
+ link += "dialog-edit-database-connections";
+ else if ( ::qt_cast<ProjectSettingsBase*>(w) )
+ link += "dialog-project-settings";
+ else if ( ::qt_cast<FindDialog*>(w) )
+ link += "dialog-find-text";
+ else if ( ::qt_cast<ReplaceDialog*>(w) )
+ link += "dialog-replace-text";
+ else if ( ::qt_cast<GotoLineDialog*>(w) )
+ link += "dialog-go-to-line";
+// else if ( ::qt_cast<ConnectionEditorBase*>(w) )
+ else if ( w->inherits("ConnectionEditorBase") )
+ link += "dialog-edit-connections";
+ else if ( ::qt_cast<CustomWidgetEditorBase*>(w) )
+ link += "dialog-edit-custom-widgets";
+ else if ( ::qt_cast<PaletteEditorBase*>(w) )
+ link += "dialog-edit-palette";
+ else if ( ::qt_cast<ListBoxEditorBase*>(w) )
+ link += "dialog-edit-listbox";
+ else if ( ::qt_cast<ListViewEditorBase*>(w) )
+ link += "dialog-edit-listview";
+ else if ( ::qt_cast<IconViewEditorBase*>(w) )
+ link += "dialog-edit-iconview";
+ else if ( ::qt_cast<TableEditorBase*>(w) )
+ link += "dialog-edit-table";
+ else if ( ::qt_cast<MultiLineEditor*>(w) )
+ link += "dialog-text";
+
+ else {
+ QMessageBox::information( this, tr( "Help" ),
+ tr( "There is no help available for this dialog at the moment." ) );
+ return;
+ }
+
+ assistant->showPage( link );
+}
+
+void MainWindow::setupActionManager()
+{
+ actionPluginManager = new QPluginManager<ActionInterface>( IID_Action, QApplication::libraryPaths(), pluginDirectory() );
+
+ QStringList lst = actionPluginManager->featureList();
+ for ( QStringList::ConstIterator ait = lst.begin(); ait != lst.end(); ++ait ) {
+ ActionInterface *iface = 0;
+ actionPluginManager->queryInterface( *ait, &iface );
+ if ( !iface )
+ continue;
+
+ iface->connectTo( desInterface );
+ QAction *a = iface->create( *ait, this );
+ if ( !a )
+ continue;
+
+ QString grp = iface->group( *ait );
+ if ( grp.isEmpty() )
+ grp = "3rd party actions";
+ QPopupMenu *menu = 0;
+ QToolBar *tb = 0;
+
+ if ( !( menu = (QPopupMenu*)child( grp.latin1(), "QPopupMenu" ) ) ) {
+ menu = new QPopupMenu( this, grp.latin1() );
+ menuBar()->insertItem( tr( grp ), menu );
+ }
+ if ( !( tb = (QToolBar*)child( grp.latin1(), "QToolBar" ) ) ) {
+ tb = new QToolBar( this, grp.latin1() );
+ tb->setCloseMode( QDockWindow::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 QString &func, bool rereadSource )
+{
+ if ( !formWindow() )
+ return;
+
+ if ( formWindow()->formFile()->codeFileState() != FormFile::Ok )
+ if ( !formWindow()->formFile()->setupUihFile(FALSE) )
+ return;
+
+ QString lang = currentProject->language();
+ if ( !MetaDataBase::hasEditor( lang ) ) {
+ QMessageBox::information( this, tr( "Edit Source" ),
+ tr( "There is no plugin for editing " + lang + " code installed!\n"
+ "Note: Plugins are not available in static Qt configurations." ) );
+ return;
+ }
+
+ for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) {
+ if ( e->language() == lang && e->formWindow() == formWindow() ) {
+ e->show();
+ e->setFunction( func );
+ return;
+ }
+ }
+
+ createSourceEditor( formWindow(), formWindow()->project(), lang, func, rereadSource );
+}
+
+void MainWindow::setupRecentlyFilesMenu()
+{
+ recentlyFilesMenu->clear();
+ int id = 0;
+ for ( QStringList::ConstIterator it = recentlyFiles.begin(); it != recentlyFiles.end(); ++it ) {
+ recentlyFilesMenu->insertItem( *it, id );
+ id++;
+ }
+}
+
+void MainWindow::setupRecentlyProjectsMenu()
+{
+ recentlyProjectsMenu->clear();
+ int id = 0;
+ for ( QStringList::ConstIterator it = recentlyProjects.begin(); it != recentlyProjects.end(); ++it ) {
+ recentlyProjectsMenu->insertItem( *it, id );
+ id++;
+ }
+}
+
+QPtrList<DesignerProject> MainWindow::projectList() const
+{
+ QPtrList<DesignerProject> list;
+ QMapConstIterator<QAction*, Project*> it = projects.begin();
+
+ while( it != projects.end() ) {
+ Project *p = it.data();
+ ++it;
+ list.append( p->iFace() );
+ }
+
+ return list;
+}
+
+QStringList MainWindow::projectNames() const
+{
+ QStringList res;
+ for ( QMap<QAction*, Project* >::ConstIterator it = projects.begin(); it != projects.end(); ++it )
+ res << (*it)->projectName();
+ return res;
+}
+
+QStringList MainWindow::projectFileNames() const
+{
+ QStringList res;
+ for ( QMap<QAction*, Project* >::ConstIterator it = projects.begin(); it != projects.end(); ++it )
+ res << (*it)->makeRelative( (*it)->fileName() );
+ return res;
+}
+
+Project *MainWindow::findProject( const QString &projectName ) const
+{
+ for ( QMap<QAction*, Project* >::ConstIterator it = projects.begin(); it != projects.end(); ++it ) {
+ if ( (*it)->projectName() == projectName )
+ return *it;
+ }
+ return 0;
+}
+
+void MainWindow::setCurrentProject( Project *pro )
+{
+ for ( QMap<QAction*, Project* >::ConstIterator it = projects.begin(); it != projects.end(); ++it ) {
+ if ( *it == pro ) {
+ projectSelected( it.key() );
+ return;
+ }
+ }
+}
+
+void MainWindow::setCurrentProjectByFilename( const QString& proFilename )
+{
+ for ( QMap<QAction*, Project* >::ConstIterator it = projects.begin(); it != projects.end(); ++it ) {
+ if ( (*it)->makeRelative( (*it)->fileName() ) == proFilename ) {
+ projectSelected( it.key() );
+ return;
+ }
+ }
+}
+
+
+void MainWindow::recentlyFilesMenuActivated( int id )
+{
+ if ( id != -1 ) {
+ if ( !QFile::exists( *recentlyFiles.at( id ) ) ) {
+ QMessageBox::warning( this, tr( "Open File" ),
+ tr( "Could not open '%1'. File does not exist." ).
+ arg( *recentlyFiles.at( id ) ) );
+ recentlyFiles.remove( recentlyFiles.at( id ) );
+ return;
+ }
+ fileOpen( "", "", *recentlyFiles.at( id ) );
+ QString fn( *recentlyFiles.at( id ) );
+ addRecentlyOpened( fn, recentlyFiles );
+ }
+}
+
+void MainWindow::recentlyProjectsMenuActivated( int id )
+{
+ if ( id != -1 ) {
+ if ( !QFile::exists( *recentlyProjects.at( id ) ) ) {
+ QMessageBox::warning( this, tr( "Open Project" ),
+ tr( "Could not open '%1'. File does not exist." ).
+ arg( *recentlyProjects.at( id ) ) );
+ recentlyProjects.remove( recentlyProjects.at( id ) );
+ return;
+ }
+ openProject( *recentlyProjects.at( id ) );
+ QString fn( *recentlyProjects.at( id ) );
+ addRecentlyOpened( fn, recentlyProjects );
+ }
+}
+
+void MainWindow::addRecentlyOpened( const QString &fn, QStringList &lst )
+{
+ QFileInfo fi( fn );
+ fi.convertToAbs();
+ QString 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 QString& className )
+{
+ TemplateWizardInterface* iface = 0;
+ templateWizardPluginManager->queryInterface( className, & iface );
+ return iface;
+}
+
+void MainWindow::setupPluginManagers()
+{
+ editorPluginManager = new QPluginManager<EditorInterface>( IID_Editor, QApplication::libraryPaths(), pluginDirectory() );
+ MetaDataBase::setEditor( editorPluginManager->featureList() );
+
+ templateWizardPluginManager =
+ new QPluginManager<TemplateWizardInterface>( IID_TemplateWizard, QApplication::libraryPaths(), pluginDirectory() );
+
+ MetaDataBase::setupInterfaceManagers( pluginDirectory() );
+ preferencePluginManager =
+ new QPluginManager<PreferenceInterface>( IID_Preference, QApplication::libraryPaths(), pluginDirectory() );
+ projectSettingsPluginManager =
+ new QPluginManager<ProjectSettingsInterface>( IID_ProjectSettings, QApplication::libraryPaths(), pluginDirectory() );
+ sourceTemplatePluginManager =
+ new QPluginManager<SourceTemplateInterface>( IID_SourceTemplate, QApplication::libraryPaths(), pluginDirectory() );
+
+ if ( preferencePluginManager ) {
+ QStringList lst = preferencePluginManager->featureList();
+ for ( QStringList::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 ) {
+ QStringList lst = projectSettingsPluginManager->featureList();
+ for ( QStringList::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( QWidget *tab, const QString &title, QObject *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( QWidget *tab, const QString &title, QObject *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, QWidget *window )
+{
+ QWidget *w = window;
+ while ( w ) {
+ if ( ::qt_cast<FormWindow*>(w) ) {
+ ( (FormWindow*)w )->modificationChanged( b );
+ return;
+ } else if ( ::qt_cast<SourceEditor*>(w) ) {
+ FormWindow *fw = ( (SourceEditor*)w )->formWindow();
+ if ( fw && !fw->isFake() ) {
+ //fw->commandHistory()->setModified( b );
+ //fw->modificationChanged( b );
+ fw->formFile()->setModified( b, FormFile::WFormCode );
+ wspace->update( fw->formFile() );
+ } else {
+ wspace->update();
+ }
+ return;
+ }
+ w = w->parentWidget( TRUE );
+ }
+}
+
+void MainWindow::editorClosed( SourceEditor *e )
+{
+ sourceEditors.take( sourceEditors.findRef( e ) );
+}
+
+void MainWindow::functionsChanged()
+{
+ updateFunctionsTimer->start( 0, TRUE );
+}
+
+void MainWindow::doFunctionsChanged()
+{
+ for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() )
+ e->refresh( FALSE );
+ hierarchyView->formDefinitionView()->refresh();
+}
+
+void MainWindow::updateFunctionList()
+{
+ if ( !qWorkspace()->activeWindow() || !::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) )
+ return;
+ SourceEditor *se = (SourceEditor*)qWorkspace()->activeWindow();
+ se->save();
+ hierarchyView->formDefinitionView()->refresh();
+ if ( !currentProject->isCpp() && se->formWindow() ) {
+ LanguageInterface *iface = MetaDataBase::languageInterface( currentProject->language() );
+ if ( !iface )
+ return;
+ QValueList<LanguageInterface::Connection> conns;
+ iface->connections( se->text(), &conns );
+ MetaDataBase::setupConnections( se->formWindow(), conns );
+ propertyEditor->eventList()->setup();
+ }
+}
+
+void MainWindow::updateWorkspace()
+{
+ wspace->setCurrentProject( currentProject );
+}
+
+void MainWindow::showDebugStep( QObject *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( QObject *o, int line )
+{
+ if ( !o || line == -1 )
+ return;
+ showSourceLine( o, line, StackFrame );
+}
+
+void MainWindow::showErrorMessage( QObject *o, int errorLine, const QString &errorMessage )
+{
+ if ( o ) {
+ errorLine--; // ######
+ QValueList<uint> l;
+ l << ( errorLine + 1 );
+ QStringList l2;
+ l2 << errorMessage;
+ QObjectList ol;
+ ol.append( o );
+ QStringList 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 );
+ QObjectList *l = queryList( "QDockWindow" );
+ for ( QObject *o = l->first(); o; o = l->next() ) {
+ if ( o == wspace->parentWidget() ||
+ o == oWindow->parentWidget() ||
+ o == hierarchyView->parentWidget() )
+ continue;
+ ( (QWidget*)o )->setEnabled( enable );
+ }
+ delete l;
+}
+
+void MainWindow::showSourceLine( QObject *o, int line, LineMode lm )
+{
+ QWidgetList windows = qworkspace->windowList();
+ for ( QWidget *w = windows.first(); w; w = windows.next() ) {
+ FormWindow *fw = 0;
+ SourceEditor *se = 0;
+ SourceFile *sf = 0;
+ if ( ::qt_cast<FormWindow*>(w) ) {
+ fw = (FormWindow*)w;
+ } else if ( ::qt_cast<SourceEditor*>(w) ) {
+ se = (SourceEditor*)w;
+ if ( !se->object() )
+ continue;
+ if ( se->formWindow() )
+ fw = se->formWindow();
+ else
+ sf = se->sourceFile();
+ }
+
+ if ( fw ) {
+ if ( fw->project() != currentProject )
+ continue;
+ if ( qstrcmp( fw->name(), o->name() ) == 0 ||
+ fw->isFake() && currentProject->objectForFakeForm( fw ) == o ) {
+ if ( se ) {
+ switch ( lm ) {
+ case Error:
+ se->editorInterface()->setError( line );
+ break;
+ case Step:
+ se->editorInterface()->setStep( line );
+ break;
+ case StackFrame:
+ se->editorInterface()->setStackFrame( line );
+ break;
+ }
+ return;
+ } else {
+ fw->showNormal();
+ fw->setFocus();
+ lastActiveFormWindow = fw;
+ qApp->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 ( ::qt_cast<SourceFile*>(o) ) {
+ for ( QPtrListIterator<SourceFile> sources = currentProject->sourceFiles();
+ sources.current(); ++sources ) {
+ SourceFile* f = sources.current();
+ if ( f == o ) {
+ SourceEditor *se = editSource( f );
+ if ( se ) {
+ switch ( lm ) {
+ case Error:
+ se->editorInterface()->setError( line );
+ break;
+ case Step:
+ se->editorInterface()->setStep( line );
+ break;
+ case StackFrame:
+ se->editorInterface()->setStackFrame( line );
+ break;
+ }
+ }
+ return;
+ }
+ }
+ }
+
+ FormFile *ff = currentProject->fakeFormFileFor( o );
+ FormWindow *fw = 0;
+ if ( ff )
+ fw = ff->formWindow();
+
+ if ( !fw && !qwf_forms ) {
+ qWarning( "MainWindow::showSourceLine: qwf_forms is NULL!" );
+ return;
+ }
+
+ mblockNewForms = TRUE;
+ if ( !fw )
+ openFormWindow( currentProject->makeAbsolute( *qwf_forms->find( (QWidget*)o ) ) );
+ else
+ fw->formFile()->showEditor( FALSE );
+ qApp->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;
+}
+
+
+QObject *MainWindow::findRealObject( QObject *o )
+{
+ QWidgetList windows = qWorkspace()->windowList();
+ for ( QWidget *w = windows.first(); w; w = windows.next() ) {
+ if ( ::qt_cast<FormWindow*>(w) && QString( w->name() ) == QString( o->name() ) )
+ return w;
+ else if ( ::qt_cast<SourceEditor*>(w) && ( (SourceEditor*)w )->formWindow() &&
+ QString( ( (SourceEditor*)w )->formWindow()->name() ) == QString( o->name() ) )
+ return w;
+ else if ( ::qt_cast<SourceFile*>(w) && ( (SourceEditor*)w )->sourceFile() &&
+ ( (SourceEditor*)w )->sourceFile() == o )
+ return o;
+ }
+ return 0;
+}
+
+void MainWindow::formNameChanged( FormWindow *fw )
+{
+ for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) {
+ if ( e->object() == fw )
+ e->refresh( TRUE );
+ if ( e->project() == fw->project() )
+ e->resetContext();
+ }
+}
+
+void MainWindow::breakPointsChanged()
+{
+ if ( !inDebugMode )
+ return;
+ if ( !qWorkspace()->activeWindow() || !::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) )
+ return;
+ SourceEditor *e = (SourceEditor*)qWorkspace()->activeWindow();
+ if ( !e->object() || !e->project() )
+ return;
+ if ( e->project() != currentProject )
+ return;
+
+ if ( !interpreterPluginManager ) {
+ interpreterPluginManager =
+ new QPluginManager<InterpreterInterface>( IID_Interpreter,
+ QApplication::libraryPaths(),
+ "/qsa" );
+ }
+
+ InterpreterInterface *iiface = 0;
+ if ( interpreterPluginManager ) {
+ QString lang = currentProject->language();
+ iiface = 0;
+ interpreterPluginManager->queryInterface( lang, &iiface );
+ if ( !iiface )
+ return;
+ }
+
+ e->saveBreakPoints();
+
+ for ( QObject *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() ) {
+ QValueList<uint> bps = MetaDataBase::breakPoints( e->sourceFile() );
+ iiface->setBreakPoints( e->object(), bps );
+ }
+ }
+
+ iiface->release();
+}
+
+int MainWindow::currentLayoutDefaultSpacing() const
+{
+ if ( ( (MainWindow*)this )->formWindow() )
+ return ( (MainWindow*)this )->formWindow()->layoutDefaultSpacing();
+ return BOXLAYOUT_DEFAULT_SPACING;
+}
+
+int MainWindow::currentLayoutDefaultMargin() const
+{
+ if ( ( (MainWindow*)this )->formWindow() )
+ return ( (MainWindow*)this )->formWindow()->layoutDefaultMargin();
+ return BOXLAYOUT_DEFAULT_MARGIN;
+}
+
+void MainWindow::saveAllBreakPoints()
+{
+ for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) {
+ e->save();
+ e->saveBreakPoints();
+ }
+}
+
+void MainWindow::resetBreakPoints()
+{
+ for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() )
+ e->resetBreakPoints();
+}
+
+SourceFile *MainWindow::sourceFile()
+{
+ for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) {
+ if ( qworkspace->activeWindow() == e ) {
+ if ( e->sourceFile() )
+ return e->sourceFile();
+ }
+ }
+ return 0;
+}
+
+bool MainWindow::openProjectSettings( Project *pro )
+{
+ ProjectSettings dia( pro, this, 0, TRUE );
+ SenderObject *senderObject = new SenderObject( designerInterface() );
+ QValueList<Tab>::ConstIterator it;
+ for ( it = projectTabs.begin(); it != projectTabs.end(); ++it ) {
+ Tab t = *it;
+ if ( t.title != pro->language() )
+ continue;
+ dia.tabWidget->addTab( t.w, t.title );
+ if ( t.receiver ) {
+ connect( dia.buttonOk, SIGNAL( clicked() ), senderObject, SLOT( emitAcceptSignal() ) );
+ connect( senderObject, SIGNAL( acceptSignal( QUnknownInterface * ) ), t.receiver, t.accept_slot );
+ connect( senderObject, SIGNAL( initSignal( QUnknownInterface * ) ), t.receiver, t.init_slot );
+ senderObject->emitInitSignal();
+ disconnect( senderObject, SIGNAL( initSignal( QUnknownInterface * ) ), 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, QPoint(0,0), FALSE );
+ }
+
+ return res == QDialog::Accepted;
+}
+
+void MainWindow::popupProjectMenu( const QPoint &pos )
+{
+ projectMenu->exec( pos );
+}
+
+QStringList MainWindow::sourceTemplates() const
+{
+ return sourceTemplatePluginManager->featureList();
+}
+
+SourceTemplateInterface* MainWindow::sourceTemplateInterface( const QString& templ )
+{
+ SourceTemplateInterface *iface = 0;
+ sourceTemplatePluginManager->queryInterface( templ, &iface);
+ return iface;
+}
+
+QString MainWindow::whatsThisFrom( const QString &key )
+{
+ if ( menuHelpFile.isEmpty() ) {
+ QString fn( documentationPath() );
+ fn += "/designer-manual-11.html";
+ QFile f( fn );
+ if ( f.open( IO_ReadOnly ) ) {
+ QTextStream ts( &f );
+ menuHelpFile = ts.read();
+ }
+ }
+
+ int i = menuHelpFile.find( key );
+ if ( i == -1 )
+ return QString::null;
+ int start = i;
+ int end = i;
+ start = menuHelpFile.findRev( "<li>", i ) + 4;
+ end = menuHelpFile.find( '\n', i ) - 1;
+ return menuHelpFile.mid( start, end - start + 1 );
+}
+
+void MainWindow::setSingleProject( Project *pro )
+{
+ if ( eProject ) {
+ Project *pro = eProject;
+ pro->save();
+ QWidgetList windows = qWorkspace()->windowList();
+ qWorkspace()->blockSignals( TRUE );
+ QWidgetListIt wit( windows );
+ while ( wit.current() ) {
+ QWidget *w = wit.current();
+ ++wit;
+ if ( ::qt_cast<FormWindow*>(w) ) {
+ if ( ( (FormWindow*)w )->project() == pro ) {
+ if ( ( (FormWindow*)w )->formFile()->editor() )
+ windows.removeRef( ( (FormWindow*)w )->formFile()->editor() );
+ ( (FormWindow*)w )->formFile()->close();
+ }
+ } else if ( ::qt_cast<SourceEditor*>(w) ) {
+ ( (SourceEditor*)w )->close();
+ }
+ }
+ hierarchyView->clear();
+ windows = qWorkspace()->windowList();
+ qWorkspace()->blockSignals( FALSE );
+ currentProject = 0;
+ updateUndoRedo( FALSE, FALSE, QString::null, QString::null );
+ }
+
+ singleProject = TRUE;
+ projects.clear();
+ QAction *a = new QAction( tr( pro->name() ), tr( 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( (QDockWindow*)toolBox->parentWidget(), FALSE );
+ toolBox->parentWidget()->hide();
+ for ( QToolBar *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, SIGNAL( hasActiveForm(bool) ), actionEditAccels, SLOT( setEnabled(bool) ) );
+ disconnect( this, SIGNAL( hasActiveForm(bool) ), actionEditFunctions, SLOT( setEnabled(bool) ) );
+ disconnect( this, SIGNAL( hasActiveForm(bool) ), actionEditConnections, SLOT( setEnabled(bool) ) );
+ disconnect( this, SIGNAL( hasActiveForm(bool) ), actionEditSource, SLOT( setEnabled(bool) ) );
+ disconnect( this, SIGNAL( hasActiveForm(bool) ), actionEditFormSettings, SLOT( setEnabled(bool) ) );
+ actionEditFormSettings->setEnabled( FALSE );
+ actionEditSource->setEnabled( FALSE );
+ actionEditConnections->setEnabled( FALSE );
+ actionEditFunctions->setEnabled( FALSE );
+ actionEditAccels->setEnabled( FALSE );
+ ( (QDockWindow*)propertyEditor->parentWidget() )->
+ setCaption( tr( "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( (QDockWindow*)toolBox->parentWidget(), TRUE );
+ toolBox->parentWidget()->show();
+ for ( QToolBar *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( tr( "&Tools" ), toolsMenu, toolsMenuId, toolsMenuIndex );
+ menubar->insertItem( tr( "&Layout" ), layoutMenu, toolsMenuId + 1, toolsMenuIndex + 1 );
+ menubar->insertItem( tr( "&Preview" ), previewMenu, toolsMenuId + 2, toolsMenuIndex + 2 );
+ connect( this, SIGNAL( hasActiveForm(bool) ), actionEditAccels, SLOT( setEnabled(bool) ) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), actionEditFunctions, SLOT( setEnabled(bool) ) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), actionEditConnections, SLOT( setEnabled(bool) ) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), actionEditSource, SLOT( setEnabled(bool) ) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), actionEditFormSettings, SLOT( setEnabled(bool) ) );
+ actionEditFormSettings->setEnabled( TRUE );
+ actionEditSource->setEnabled( TRUE );
+ actionEditConnections->setEnabled( TRUE );
+ actionEditFunctions->setEnabled( TRUE );
+ actionEditAccels->setEnabled( TRUE );
+ ( (QDockWindow*)propertyEditor->parentWidget() )->
+ setCaption( tr( "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 QString &pd )
+{
+ pluginDir = pd;
+ if ( !qwf_plugin_dir )
+ qwf_plugin_dir = new QString( pd );
+ else
+ *qwf_plugin_dir = pd;
+}
+
+void MainWindow::toggleSignalHandlers( bool show )
+{
+ if ( sSignalHandlers == show )
+ return;
+ sSignalHandlers = show;
+ propertyEditor->setSignalHandlersEnabled( show );
+}
diff --git a/tools/designer/designer/mainwindow.h b/tools/designer/designer/mainwindow.h
new file mode 100644
index 0000000..cffae68
--- /dev/null
+++ b/tools/designer/designer/mainwindow.h
@@ -0,0 +1,503 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include "metadatabase.h"
+#include "../interfaces/actioninterface.h" // for GCC 2.7.* compatibility
+#include "../interfaces/editorinterface.h"
+#include "../interfaces/templatewizardiface.h"
+#include "../interfaces/languageinterface.h"
+#include "../interfaces/filterinterface.h"
+#include "../interfaces/interpreterinterface.h"
+#include "../interfaces/preferenceinterface.h"
+#include "../interfaces/projectsettingsiface.h"
+#include "../interfaces/sourcetemplateiface.h"
+#include "sourceeditor.h"
+
+#include <qaction.h>
+#include <qmainwindow.h>
+#include <qmap.h>
+#include <qguardedptr.h>
+#include <private/qpluginmanager_p.h>
+#include <qobjectlist.h>
+
+class QToolBox;
+class PropertyEditor;
+class QWorkspace;
+class QMenuBar;
+class FormWindow;
+class QPopupMenu;
+class HierarchyView;
+class QCloseEvent;
+class Workspace;
+class ActionEditor;
+class Project;
+class OutputWindow;
+class QTimer;
+class FindDialog;
+struct DesignerProject;
+class ReplaceDialog;
+class GotoLineDialog;
+class SourceFile;
+class FormFile;
+class QAssistantClient;
+
+#if defined(Q_FULL_TEMPLATE_INSTANTIATION)
+#include <qtoolbar.h>
+#else
+class QToolBar;
+#endif
+class Preferences;
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ enum LineMode { Error, Step, StackFrame };
+
+ MainWindow( bool asClient, bool single = FALSE, const QString &plgDir = "/designer" );
+ ~MainWindow();
+
+ HierarchyView *objectHierarchy() const;
+ Workspace *workspace() const;
+ PropertyEditor *propertyeditor() const;
+ ActionEditor *actioneditor() const;
+
+ void resetTool();
+ int currentTool() const;
+
+ FormWindow *formWindow();
+
+ bool unregisterClient( FormWindow *w );
+ void editorClosed( SourceEditor *e );
+ QWidget *isAFormWindowChild( QObject *o ) const;
+ QWidget *isAToolBarChild( QObject *o ) const;
+
+ void insertFormWindow( FormWindow *fw );
+ QWorkspace *qWorkspace() const;
+
+ void popupFormWindowMenu( const QPoint &gp, FormWindow *fw );
+ void popupWidgetMenu( const QPoint &gp, FormWindow *fw, QWidget *w );
+
+ QPopupMenu *setupNormalHierarchyMenu( QWidget *parent );
+ QPopupMenu *setupTabWidgetHierarchyMenu( QWidget *parent, const char *addSlot, const char *removeSlot );
+
+ FormWindow *openFormWindow( const QString &fn, bool validFileName = TRUE, FormFile *ff = 0 );
+ bool isCustomWidgetUsed( MetaDataBase::CustomWidget *w );
+
+ void setGrid( const QPoint &p );
+ void setShowGrid( bool b );
+ void setSnapGrid( bool b );
+ QPoint grid() const { return grd; }
+ bool showGrid() const { return sGrid; }
+ bool snapGrid() const { return snGrid && sGrid; }
+
+ QString documentationPath() const;
+
+ static MainWindow *self;
+
+ QString templatePath() const { return templPath; }
+
+ void editFunction( const QString &func, bool rereadSource = FALSE );
+
+ bool isPreviewing() const { return previewing; }
+
+ Project *currProject() const { return currentProject; }
+
+ FormWindow *activeForm() const { return lastActiveFormWindow; }
+
+ TemplateWizardInterface* templateWizardInterface( const QString& className );
+ QStringList sourceTemplates() const;
+ SourceTemplateInterface* sourceTemplateInterface( const QString& templ );
+ QUnknownInterface* designerInterface() const { return desInterface; }
+ QPtrList<DesignerProject> projectList() const;
+ QStringList projectNames() const;
+ QStringList projectFileNames() const;
+ Project *findProject( const QString &projectName ) const;
+ void setCurrentProject( Project *pro );
+ void setCurrentProjectByFilename( const QString& proFilename );
+ OutputWindow *outputWindow() const { return oWindow; }
+ void addPreferencesTab( QWidget *tab, const QString &title, QObject *receiver, const char *init_slot, const char *accept_slot );
+ void addProjectTab( QWidget *tab, const QString &title, QObject *receiver, const char *init_slot, const char *accept_slot );
+ void setModified( bool b, QWidget *window );
+ void functionsChanged();
+ void updateFunctionList();
+ void updateWorkspace();
+ void runProjectPrecondition();
+ void runProjectPostcondition( QObjectList *l );
+
+ void formNameChanged( FormWindow *fw );
+
+ int currentLayoutDefaultSpacing() const;
+ int currentLayoutDefaultMargin() const;
+
+ void saveAllBreakPoints();
+ void resetBreakPoints();
+
+ SourceFile *sourceFile();
+ void createNewProject( const QString &lang );
+
+ void popupProjectMenu( const QPoint &pos );
+ QObject *findRealObject( QObject *o );
+
+ void setSingleProject( Project *pro );
+ bool singleProjectMode() const { return singleProject; }
+
+ void showSourceLine( QObject *o, int line, LineMode lm );
+
+ void shuttingDown();
+ void showGUIStuff( bool b );
+ void setEditorsReadOnly( bool b );
+ bool areEditorsReadOnly() const { return editorsReadOnly; }
+ void toggleSignalHandlers( bool show );
+ bool showSignalHandlers() const { return sSignalHandlers; }
+ void writeConfig();
+
+ void openProject( const QString &fn );
+ void setPluginDirectory( const QString &pd );
+ QString pluginDirectory() const { return pluginDir; }
+
+ QAssistantClient* assistantClient() const { return assistant; }
+
+ void addRecentlyOpenedFile( const QString &fn ) { addRecentlyOpened( fn, recentlyFiles ); }
+
+public slots:
+ void showProperties( QObject *w );
+ void updateProperties( QObject *w );
+ void showDialogHelp();
+ void showDebugStep( QObject *o, int line );
+ void showStackFrame( QObject *o, int line );
+ void showErrorMessage( QObject *o, int line, const QString &errorMessage );
+ void finishedRun();
+ void breakPointsChanged();
+
+signals:
+ void currentToolChanged();
+ void hasActiveForm( bool );
+ void hasActiveWindow( bool );
+ void hasActiveWindowOrProject( bool );
+ void hasNonDummyProject( bool );
+ void formModified( bool );
+ void formWindowsChanged();
+ void formWindowChanged();
+ void projectChanged();
+ void editorChanged();
+
+protected:
+ bool eventFilter( QObject *o, QEvent *e );
+ void closeEvent( QCloseEvent *e );
+
+public slots:
+ void fileNew();
+ void fileNewDialog();
+ void fileNewFile();
+ void fileClose();
+ void fileQuit();
+ void fileCloseProject(); // not visible in menu, called from fileClose
+ void fileOpen();
+ void fileOpen( const QString &filter, const QString &extension, const QString &filename = "" , bool inProject = TRUE );
+ bool fileSave();
+ bool fileSaveForm(); // not visible in menu, called from fileSave
+ bool fileSaveProject(); // not visible in menu, called from fileSaveProject
+ bool fileSaveAs();
+ void fileSaveAll();
+ void fileCreateTemplate();
+
+public slots:
+ void editUndo();
+ void editRedo();
+ void editCut();
+ void editCopy();
+ void editPaste();
+ void editDelete();
+ void editSelectAll();
+ void editLower();
+ void editRaise();
+ void editAdjustSize();
+ void editLayoutHorizontal();
+ void editLayoutVertical();
+ void editLayoutHorizontalSplit();
+ void editLayoutVerticalSplit();
+ void editLayoutGrid();
+ void editLayoutContainerHorizontal();
+ void editLayoutContainerVertical();
+ void editLayoutContainerGrid();
+ void editBreakLayout();
+ void editAccels();
+ void editFunctions();
+ void editConnections();
+ SourceEditor *editSource();
+ SourceEditor *editSource( SourceFile *f );
+ SourceEditor *openSourceEditor();
+ SourceEditor *createSourceEditor( QObject *object, Project *project,
+ const QString &lang = QString::null,
+ const QString &func = QString::null,
+ bool rereadSource = FALSE );
+ void editFormSettings();
+ void editProjectSettings();
+ void editPixmapCollection();
+ void editDatabaseConnections();
+ void editPreferences();
+
+ void projectInsertFile();
+
+ void searchFind();
+ void searchIncremetalFindMenu();
+ void searchIncremetalFind();
+ void searchIncremetalFindNext();
+ void searchReplace();
+ void searchGotoLine();
+
+ void previewForm();
+ void previewForm( const QString& );
+
+ void toolsCustomWidget();
+ void toolsConfigure();
+
+ void helpContents();
+ void helpManual();
+ void helpAbout();
+ void helpAboutQt();
+ void helpRegister();
+
+private slots:
+ void activeWindowChanged( QWidget *w );
+ void updateUndoRedo( bool, bool, const QString &, const QString & );
+ void updateEditorUndoRedo();
+
+ void toolSelected( QAction* );
+
+ void clipboardChanged();
+ void selectionChanged();
+
+ void windowsMenuActivated( int id );
+ void setupWindowActions();
+
+ void createNewTemplate();
+ void projectSelected( QAction *a );
+
+ void setupRecentlyFilesMenu();
+ void setupRecentlyProjectsMenu();
+ void recentlyFilesMenuActivated( int id );
+ void recentlyProjectsMenuActivated( int id );
+
+ void emitProjectSignals();
+
+ void showStartDialog();
+
+private:
+ void setupMDI();
+ void setupMenuBar();
+ void setupEditActions();
+ void setupProjectActions();
+ void setupSearchActions();
+ void setupToolActions();
+ void setupLayoutActions();
+ void setupFileActions();
+ void setupPreviewActions();
+ void setupHelpActions();
+ void setupRMBMenus();
+
+ void setupPropertyEditor();
+ void setupHierarchyView();
+ void setupWorkspace();
+ void setupActionEditor();
+ void setupOutputWindow();
+ void setupToolbox();
+
+ void setupActionManager();
+ void setupPluginManagers();
+
+ void enableAll( bool enable );
+
+ QWidget* previewFormInternal( QStyle* style = 0, QPalette* pal = 0 );
+
+ void readConfig();
+
+ void setupRMBProperties( QValueList<uint> &ids, QMap<QString, int> &props, QWidget *w );
+ void handleRMBProperties( int id, QMap<QString, int> &props, QWidget *w );
+ void setupRMBSpecialCommands( QValueList<uint> &ids, QMap<QString, int> &commands, QWidget *w );
+ void handleRMBSpecialCommands( int id, QMap<QString, int> &commands, QWidget *w );
+ void setupRMBSpecialCommands( QValueList<uint> &ids, QMap<QString, int> &commands, FormWindow *w );
+ void handleRMBSpecialCommands( int id, QMap<QString, int> &commands, FormWindow *w );
+ bool openEditor( QWidget *w, FormWindow *fw );
+ void rebuildCustomWidgetGUI();
+ void rebuildCommonWidgetsToolBoxPage();
+ void checkTempFiles();
+
+ void addRecentlyOpened( const QString &fn, QStringList &lst );
+
+ QString whatsThisFrom( const QString &key );
+
+private slots:
+ void doFunctionsChanged();
+ bool openProjectSettings( Project *pro );
+
+private:
+ struct Tab
+ {
+ QWidget *w;
+ QString title;
+ QObject *receiver;
+ const char *init_slot, *accept_slot;
+ Q_DUMMY_COMPARISON_OPERATOR( Tab )
+ };
+
+private:
+ PropertyEditor *propertyEditor;
+ HierarchyView *hierarchyView;
+ Workspace *wspace;
+ QWidget *lastPressWidget;
+ QWorkspace *qworkspace;
+ QMenuBar *menubar;
+ QGuardedPtr<FormWindow> lastActiveFormWindow;
+ bool breakLayout, layoutChilds, layoutSelected;
+ QPoint grd;
+ bool sGrid, snGrid;
+ bool restoreConfig;
+ bool backPix;
+ bool splashScreen;
+ QString fileFilter;
+
+ QMap<QAction*, Project*> projects;
+ QAction *actionEditUndo, *actionEditRedo, *actionEditCut, *actionEditCopy,
+ *actionEditPaste, *actionEditDelete,
+ *actionEditAdjustSize,
+ *actionEditHLayout, *actionEditVLayout, *actionEditGridLayout,
+ *actionEditSplitHorizontal, *actionEditSplitVertical,
+ *actionEditSelectAll, *actionEditBreakLayout, *actionEditFunctions, *actionEditConnections,
+ *actionEditLower, *actionEditRaise, *actionInsertSpacer;
+ QActionGroup *actionGroupTools, *actionGroupProjects;
+ QAction* actionPointerTool, *actionConnectTool, *actionOrderTool, *actionBuddyTool;
+ QAction* actionCurrentTool;
+ QAction *actionHelpContents, *actionHelpAbout, *actionHelpAboutQt, *actionHelpWhatsThis;
+ QAction *actionHelpManual;
+#if defined(QT_NON_COMMERCIAL)
+ QAction *actionHelpRegister;
+#endif
+ QAction *actionToolsCustomWidget, *actionEditPreferences;
+ QAction *actionWindowTile, *actionWindowCascade, *actionWindowClose, *actionWindowCloseAll;
+ QAction *actionWindowNext, *actionWindowPrevious;
+ QAction *actionEditFormSettings, *actionEditAccels;
+ QAction *actionEditSource, *actionNewFile, *actionFileSave, *actionFileExit;
+ QAction *actionSearchFind, *actionSearchIncremetal, *actionSearchReplace, *actionSearchGotoLine;
+ QActionGroup *actionGroupNew;
+
+ QPopupMenu *rmbWidgets;
+ QPopupMenu *rmbFormWindow;
+ QPopupMenu *customWidgetMenu, *windowMenu, *fileMenu, *recentlyFilesMenu, *recentlyProjectsMenu;
+ QPopupMenu *toolsMenu, *layoutMenu, *previewMenu;
+ QToolBar *customWidgetToolBar, *layoutToolBar, *projectToolBar, *customWidgetToolBar2, *toolsToolBar;
+ QToolBar *commonWidgetsToolBar;
+ QPtrList<QToolBar> widgetToolBars;
+
+ Preferences *prefDia;
+ QMap<QString,QString> propertyDocumentation;
+ bool client;
+ QString templPath;
+ ActionEditor *actionEditor;
+ Project *currentProject;
+ QPluginManager<ActionInterface> *actionPluginManager;
+ QPluginManager<EditorInterface> *editorPluginManager;
+ QPluginManager<TemplateWizardInterface> *templateWizardPluginManager;
+ QPluginManager<InterpreterInterface> *interpreterPluginManager;
+ QPluginManager<PreferenceInterface> *preferencePluginManager;
+ QPluginManager<ProjectSettingsInterface> *projectSettingsPluginManager;
+ QPluginManager<SourceTemplateInterface> *sourceTemplatePluginManager;
+ QPtrList<SourceEditor> sourceEditors;
+ bool previewing;
+ QUnknownInterface *desInterface;
+ QStringList recentlyFiles;
+ QStringList recentlyProjects;
+ OutputWindow *oWindow;
+ QValueList<Tab> preferenceTabs;
+ QValueList<Tab> projectTabs;
+ bool databaseAutoEdit;
+ QTimer *updateFunctionsTimer;
+ QTimer *autoSaveTimer;
+ bool autoSaveEnabled;
+ int autoSaveInterval;
+ QLineEdit *incrementalSearch;
+ QGuardedPtr<FindDialog> findDialog;
+ QGuardedPtr<ReplaceDialog> replaceDialog;
+ QGuardedPtr<GotoLineDialog> gotoLineDialog;
+ Project *eProject;
+ bool inDebugMode;
+ QObjectList debuggingForms;
+ QString lastOpenFilter;
+ QGuardedPtr<QWidget> previewedForm;
+ QPopupMenu *projectMenu;
+ QString menuHelpFile;
+ bool singleProject;
+ QToolBox *toolBox;
+ int toolsMenuId, toolsMenuIndex;
+ uint guiStuffVisible : 1;
+ uint editorsReadOnly : 1;
+ uint savePluginPaths : 1;
+ QAssistantClient *assistant;
+ bool shStartDialog;
+ QString pluginDir;
+ bool sSignalHandlers;
+
+public:
+ QString lastSaveFilter;
+ QPtrList<QAction> toolActions;
+ QPtrList<QAction> commonWidgetsPage;
+
+};
+
+class SenderObject : public QObject
+{
+ Q_OBJECT
+
+public:
+ SenderObject( QUnknownInterface *i ) : iface( i ) { iface->addRef(); }
+ ~SenderObject() { iface->release(); }
+
+public slots:
+ void emitInitSignal() { emit initSignal( iface ); }
+ void emitAcceptSignal() { emit acceptSignal( iface ); }
+
+signals:
+ void initSignal( QUnknownInterface * );
+ void acceptSignal( QUnknownInterface * );
+
+private:
+ QUnknownInterface *iface;
+
+};
+
+#endif
diff --git a/tools/designer/designer/mainwindowactions.cpp b/tools/designer/designer/mainwindowactions.cpp
new file mode 100644
index 0000000..d8d99aa
--- /dev/null
+++ b/tools/designer/designer/mainwindowactions.cpp
@@ -0,0 +1,2061 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "mainwindow.h"
+
+#include <stdlib.h>
+#include <qaction.h>
+#include <qwhatsthis.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qlineedit.h>
+#include <qtooltip.h>
+#include <qapplication.h>
+#include <qsignalmapper.h>
+#include <qstylefactory.h>
+#include <qworkspace.h>
+#include <qmessagebox.h>
+#include <qstatusbar.h>
+#include <qlistbox.h>
+#include <qclipboard.h>
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qinputdialog.h>
+#include <qdatetimeedit.h>
+#include <qtextedit.h>
+
+#include "defs.h"
+#include "project.h"
+#include "widgetdatabase.h"
+#include "widgetfactory.h"
+#include "preferences.h"
+#include "formwindow.h"
+#include "newformimpl.h"
+#include "resource.h"
+#include "projectsettingsimpl.h"
+#include "workspace.h"
+#include "createtemplate.h"
+#include "hierarchyview.h"
+#include "editfunctionsimpl.h"
+#include "finddialog.h"
+#include "replacedialog.h"
+#include "gotolinedialog.h"
+#include "formsettingsimpl.h"
+#include "pixmapcollectioneditor.h"
+#include "styledbutton.h"
+#include "customwidgeteditorimpl.h"
+#ifndef QT_NO_SQL
+#include "dbconnectionsimpl.h"
+#include "dbconnectionimpl.h"
+#endif
+#include "widgetaction.h"
+#include <qtoolbox.h>
+#include "startdialogimpl.h"
+#include "designerappiface.h"
+#include "connectiondialog.h"
+#include "configtoolboxdialog.h"
+
+static const char * whatsthis_image[] = {
+ "16 16 3 1",
+ " c None",
+ "o c #000000",
+ "a c #000080",
+ "o aaaaa ",
+ "oo aaa aaa ",
+ "ooo aaa aaa",
+ "oooo aa aa",
+ "ooooo aa aa",
+ "oooooo a aaa",
+ "ooooooo aaa ",
+ "oooooooo aaa ",
+ "ooooooooo aaa ",
+ "ooooo aaa ",
+ "oo ooo ",
+ "o ooo aaa ",
+ " ooo aaa ",
+ " ooo ",
+ " ooo ",
+ " ooo "};
+
+const QString toolbarHelp = "<p>Toolbars contain a number of buttons to "
+"provide quick access to often used functions.%1"
+"<br>Click on the toolbar handle to hide the toolbar, "
+"or drag and place the toolbar to a different location.</p>";
+
+static QIconSet createIconSet( const QString &name )
+{
+ QIconSet ic( QPixmap::fromMimeSource( "" + name ) );
+ QString prefix = "designer_";
+ int right = name.length() - prefix.length();
+ ic.setPixmap( QPixmap::fromMimeSource( prefix + "d_" + name.right( right ) ),
+ QIconSet::Small, QIconSet::Disabled );
+ return ic;
+}
+
+void MainWindow::setupEditActions()
+{
+ actionEditUndo = new QAction( tr("Undo"), createIconSet( "designer_undo.png" ),tr("&Undo: Not Available"), CTRL + Key_Z, this, 0 );
+ actionEditUndo->setStatusTip( tr( "Undoes the last action" ) );
+ actionEditUndo->setWhatsThis( whatsThisFrom( "Edit|Undo" ) );
+ connect( actionEditUndo, SIGNAL( activated() ), this, SLOT( editUndo() ) );
+ actionEditUndo->setEnabled( FALSE );
+
+ actionEditRedo = new QAction( tr( "Redo" ), createIconSet("designer_redo.png"), tr( "&Redo: Not Available" ), CTRL + Key_Y, this, 0 );
+ actionEditRedo->setStatusTip( tr( "Redoes the last undone operation") );
+ actionEditRedo->setWhatsThis( whatsThisFrom( "Edit|Redo" ) );
+ connect( actionEditRedo, SIGNAL( activated() ), this, SLOT( editRedo() ) );
+ actionEditRedo->setEnabled( FALSE );
+
+ actionEditCut = new QAction( tr( "Cut" ), createIconSet("designer_editcut.png"), tr( "Cu&t" ), CTRL + Key_X, this, 0 );
+ actionEditCut->setStatusTip( tr( "Cuts the selected widgets and puts them on the clipboard" ) );
+ actionEditCut->setWhatsThis( whatsThisFrom( "Edit|Cut" ) );
+ connect( actionEditCut, SIGNAL( activated() ), this, SLOT( editCut() ) );
+ actionEditCut->setEnabled( FALSE );
+
+ actionEditCopy = new QAction( tr( "Copy" ), createIconSet("designer_editcopy.png"), tr( "&Copy" ), CTRL + Key_C, this, 0 );
+ actionEditCopy->setStatusTip( tr( "Copies the selected widgets to the clipboard" ) );
+ actionEditCopy->setWhatsThis( whatsThisFrom( "Edit|Copy" ) );
+ connect( actionEditCopy, SIGNAL( activated() ), this, SLOT( editCopy() ) );
+ actionEditCopy->setEnabled( FALSE );
+
+ actionEditPaste = new QAction( tr( "Paste" ), createIconSet("designer_editpaste.png"), tr( "&Paste" ), CTRL + Key_V, this, 0 );
+ actionEditPaste->setStatusTip( tr( "Pastes the clipboard's contents" ) );
+ actionEditPaste->setWhatsThis( whatsThisFrom( "Edit|Paste" ) );
+ connect( actionEditPaste, SIGNAL( activated() ), this, SLOT( editPaste() ) );
+ actionEditPaste->setEnabled( FALSE );
+
+ actionEditDelete = new QAction( tr( "Delete" ), QPixmap(), tr( "&Delete" ), Key_Delete, this, 0 );
+ actionEditDelete->setStatusTip( tr( "Deletes the selected widgets" ) );
+ actionEditDelete->setWhatsThis( whatsThisFrom( "Edit|Delete" ) );
+ connect( actionEditDelete, SIGNAL( activated() ), this, SLOT( editDelete() ) );
+ actionEditDelete->setEnabled( FALSE );
+#ifdef Q_WS_MAC
+ QAction *macDelete = new QAction( tr( "Delete" ), QPixmap(), tr( "&Delete" ), Key_Backspace, this, 0 );
+ connect( macDelete, SIGNAL( activated() ), this, SLOT( editDelete() ) );
+#endif
+
+ actionEditSelectAll = new QAction( tr( "Select All" ), QPixmap(), tr( "Select &All" ), CTRL + Key_A, this, 0 );
+ actionEditSelectAll->setStatusTip( tr( "Selects all widgets" ) );
+ actionEditSelectAll->setWhatsThis( whatsThisFrom( "Edit|Select All" ) );
+ connect( actionEditSelectAll, SIGNAL( activated() ), this, SLOT( editSelectAll() ) );
+ actionEditSelectAll->setEnabled( TRUE );
+
+ actionEditRaise = new QAction( tr( "Bring to Front" ), createIconSet("designer_editraise.png"), tr( "Bring to &Front" ), 0, this, 0 );
+ actionEditRaise->setStatusTip( tr( "Raises the selected widgets" ) );
+ actionEditRaise->setWhatsThis( tr( "Raises the selected widgets" ) );
+ connect( actionEditRaise, SIGNAL( activated() ), this, SLOT( editRaise() ) );
+ actionEditRaise->setEnabled( FALSE );
+
+ actionEditLower = new QAction( tr( "Send to Back" ), createIconSet("designer_editlower.png"), tr( "Send to &Back" ), 0, this, 0 );
+ actionEditLower->setStatusTip( tr( "Lowers the selected widgets" ) );
+ actionEditLower->setWhatsThis( tr( "Lowers the selected widgets" ) );
+ connect( actionEditLower, SIGNAL( activated() ), this, SLOT( editLower() ) );
+ actionEditLower->setEnabled( FALSE );
+
+ actionEditAccels = new QAction( tr( "Check Accelerators" ), QPixmap(),
+ tr( "Chec&k Accelerators" ), ALT + Key_R, this, 0 );
+ actionEditAccels->setStatusTip( tr("Checks if the accelerators used in the form are unique") );
+ actionEditAccels->setWhatsThis( whatsThisFrom( "Edit|Check Accelerator" ) );
+ connect( actionEditAccels, SIGNAL( activated() ), this, SLOT( editAccels() ) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), actionEditAccels, SLOT( setEnabled(bool) ) );
+
+ actionEditFunctions = new QAction( tr( "Slots" ), createIconSet("designer_editslots.png"),
+ tr( "S&lots..." ), 0, this, 0 );
+ actionEditFunctions->setStatusTip( tr("Opens a dialog for editing slots") );
+ actionEditFunctions->setWhatsThis( whatsThisFrom( "Edit|Slots" ) );
+ connect( actionEditFunctions, SIGNAL( activated() ), this, SLOT( editFunctions() ) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), actionEditFunctions, SLOT( setEnabled(bool) ) );
+
+ actionEditConnections = new QAction( tr( "Connections" ), createIconSet("designer_connecttool.png"),
+ tr( "Co&nnections..." ), 0, this, 0 );
+ actionEditConnections->setStatusTip( tr("Opens a dialog for editing connections") );
+ actionEditConnections->setWhatsThis( whatsThisFrom( "Edit|Connections" ) );
+ connect( actionEditConnections, SIGNAL( activated() ), this, SLOT( editConnections() ) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), actionEditConnections, SLOT( setEnabled(bool) ) );
+
+ actionEditSource = new QAction( tr( "Source" ), QIconSet(),
+ tr( "&Source..." ), CTRL + Key_E, this, 0 );
+ actionEditSource->setStatusTip( tr("Opens an editor to edit the form's source code") );
+ actionEditSource->setWhatsThis( whatsThisFrom( "Edit|Source" ) );
+ connect( actionEditSource, SIGNAL( activated() ), this, SLOT( editSource() ) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), actionEditSource, SLOT( setEnabled(bool) ) );
+
+ actionEditFormSettings = new QAction( tr( "Form Settings" ), QPixmap(),
+ tr( "&Form Settings..." ), 0, this, 0 );
+ actionEditFormSettings->setStatusTip( tr("Opens a dialog to change the form's settings") );
+ actionEditFormSettings->setWhatsThis( whatsThisFrom( "Edit|Form Settings" ) );
+ connect( actionEditFormSettings, SIGNAL( activated() ), this, SLOT( editFormSettings() ) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), actionEditFormSettings, SLOT( setEnabled(bool) ) );
+
+ actionEditPreferences = new QAction( tr( "Preferences" ), QPixmap(),
+ tr( "Preferences..." ), 0, this, 0 );
+ actionEditPreferences->setStatusTip( tr("Opens a dialog to change preferences") );
+ actionEditPreferences->setWhatsThis( whatsThisFrom( "Edit|Preferences" ) );
+ connect( actionEditPreferences, SIGNAL( activated() ), this, SLOT( editPreferences() ) );
+
+ QToolBar *tb = new QToolBar( this, "Edit" );
+ tb->setCloseMode( QDockWindow::Undocked );
+ QWhatsThis::add( tb, tr( "<b>The Edit toolbar</b>%1").arg(tr(toolbarHelp).arg("")) );
+ addToolBar( tb, tr( "Edit" ) );
+ actionEditUndo->addTo( tb );
+ actionEditRedo->addTo( tb );
+ tb->addSeparator();
+ actionEditCut->addTo( tb );
+ actionEditCopy->addTo( tb );
+ actionEditPaste->addTo( tb );
+#if 0
+ tb->addSeparator();
+ actionEditLower->addTo( tb );
+ actionEditRaise->addTo( tb );
+#endif
+
+ QPopupMenu *menu = new QPopupMenu( this, "Edit" );
+ connect( menu, SIGNAL( aboutToShow() ), this, SLOT( updateEditorUndoRedo() ) );
+ menubar->insertItem( tr( "&Edit" ), menu );
+ actionEditUndo->addTo( menu );
+ actionEditRedo->addTo( menu );
+ menu->insertSeparator();
+ actionEditCut->addTo( menu );
+ actionEditCopy->addTo( menu );
+ actionEditPaste->addTo( menu );
+ actionEditDelete->addTo( menu );
+ actionEditSelectAll->addTo( menu );
+ actionEditAccels->addTo( menu );
+#if 0
+ menu->insertSeparator();
+ actionEditLower->addTo( menu );
+ actionEditRaise->addTo( menu );
+#endif
+ menu->insertSeparator();
+ if ( !singleProjectMode() ) {
+ actionEditFunctions->addTo( menu );
+ actionEditConnections->addTo( menu );
+ }
+ actionEditFormSettings->addTo( menu );
+ menu->insertSeparator();
+ actionEditPreferences->addTo( menu );
+}
+
+void MainWindow::setupSearchActions()
+{
+ actionSearchFind = new QAction( tr( "Find" ), createIconSet( "designer_searchfind.png" ),
+ tr( "&Find..." ), CTRL + Key_F, this, 0 );
+ connect( actionSearchFind, SIGNAL( activated() ), this, SLOT( searchFind() ) );
+ actionSearchFind->setEnabled( FALSE );
+ actionSearchFind->setWhatsThis( whatsThisFrom( "Search|Find" ) );
+
+ actionSearchIncremetal = new QAction( tr( "Find Incremental" ), QIconSet(),
+ tr( "Find &Incremental" ), ALT + Key_I, this, 0 );
+ connect( actionSearchIncremetal, SIGNAL( activated() ), this, SLOT( searchIncremetalFindMenu() ) );
+ actionSearchIncremetal->setEnabled( FALSE );
+ actionSearchIncremetal->setWhatsThis( whatsThisFrom( "Search|Find Incremental" ) );
+
+ actionSearchReplace = new QAction( tr( "Replace" ), QIconSet(),
+ tr( "&Replace..." ), CTRL + Key_R, this, 0 );
+ connect( actionSearchReplace, SIGNAL( activated() ), this, SLOT( searchReplace() ) );
+ actionSearchReplace->setEnabled( FALSE );
+ actionSearchReplace->setWhatsThis( whatsThisFrom( "Search|Replace" ) );
+
+ actionSearchGotoLine = new QAction( tr( "Goto Line" ), QIconSet(),
+ tr( "&Goto Line..." ), ALT + Key_G, this, 0 );
+ connect( actionSearchGotoLine, SIGNAL( activated() ), this, SLOT( searchGotoLine() ) );
+ actionSearchGotoLine->setEnabled( FALSE );
+ actionSearchGotoLine->setWhatsThis( whatsThisFrom( "Search|Goto line" ) );
+
+ QToolBar *tb = new QToolBar( this, "Search" );
+ tb->setCloseMode( QDockWindow::Undocked );
+ addToolBar( tb, tr( "Search" ) );
+
+ actionSearchFind->addTo( tb );
+ incrementalSearch = new QLineEdit( tb );
+ QToolTip::add( incrementalSearch, tr( "Incremetal Search (Alt+I)" ) );
+ connect( incrementalSearch, SIGNAL( textChanged( const QString & ) ),
+ this, SLOT( searchIncremetalFind() ) );
+ connect( incrementalSearch, SIGNAL( returnPressed() ),
+ this, SLOT( searchIncremetalFindNext() ) );
+ incrementalSearch->setEnabled( FALSE );
+
+ QPopupMenu *menu = new QPopupMenu( this, "Search" );
+ menubar->insertItem( tr( "&Search" ), menu );
+ actionSearchFind->addTo( menu );
+ actionSearchIncremetal->addTo( menu );
+ actionSearchReplace->addTo( menu );
+ menu->insertSeparator();
+ actionSearchGotoLine->addTo( menu );
+}
+
+void MainWindow::setupLayoutActions()
+{
+ if ( !actionGroupTools ) {
+ actionGroupTools = new QActionGroup( this );
+ actionGroupTools->setExclusive( TRUE );
+ connect( actionGroupTools, SIGNAL( selected(QAction*) ), this, SLOT( toolSelected(QAction*) ) );
+ }
+
+ actionEditAdjustSize = new QAction( tr( "Adjust Size" ), createIconSet("designer_adjustsize.png"),
+ tr( "Adjust &Size" ), CTRL + Key_J, this, 0 );
+ actionEditAdjustSize->setStatusTip(tr("Adjusts the size of the selected widget") );
+ actionEditAdjustSize->setWhatsThis( whatsThisFrom( "Layout|Adjust Size" ) );
+ connect( actionEditAdjustSize, SIGNAL( activated() ), this, SLOT( editAdjustSize() ) );
+ actionEditAdjustSize->setEnabled( FALSE );
+
+ actionEditHLayout = new QAction( tr( "Lay Out Horizontally" ), createIconSet("designer_edithlayout.png"),
+ tr( "Lay Out &Horizontally" ), CTRL + Key_H, this, 0 );
+ actionEditHLayout->setStatusTip(tr("Lays out the selected widgets horizontally") );
+ actionEditHLayout->setWhatsThis( whatsThisFrom( "Layout|Lay Out Horizontally" ) );
+ connect( actionEditHLayout, SIGNAL( activated() ), this, SLOT( editLayoutHorizontal() ) );
+ actionEditHLayout->setEnabled( FALSE );
+
+ actionEditVLayout = new QAction( tr( "Lay Out Vertically" ), createIconSet("designer_editvlayout.png"),
+ tr( "Lay Out &Vertically" ), CTRL + Key_L, this, 0 );
+ actionEditVLayout->setStatusTip(tr("Lays out the selected widgets vertically") );
+ actionEditVLayout->setWhatsThis( whatsThisFrom( "Layout|Lay Out Vertically" ) );
+ connect( actionEditVLayout, SIGNAL( activated() ), this, SLOT( editLayoutVertical() ) );
+ actionEditVLayout->setEnabled( FALSE );
+
+ actionEditGridLayout = new QAction( tr( "Lay Out in a Grid" ), createIconSet("designer_editgrid.png"),
+ tr( "Lay Out in a &Grid" ), CTRL + Key_G, this, 0 );
+ actionEditGridLayout->setStatusTip(tr("Lays out the selected widgets in a grid") );
+ actionEditGridLayout->setWhatsThis( whatsThisFrom( "Layout|Lay Out in a Grid" ) );
+ connect( actionEditGridLayout, SIGNAL( activated() ), this, SLOT( editLayoutGrid() ) );
+ actionEditGridLayout->setEnabled( FALSE );
+
+ actionEditSplitHorizontal = new QAction( tr( "Lay Out Horizontally (in Splitter)" ), createIconSet("designer_editvlayoutsplit.png"),
+ tr( "Lay Out Horizontally (in S&plitter)" ), 0, this, 0 );
+ actionEditSplitHorizontal->setStatusTip(tr("Lays out the selected widgets horizontally in a splitter") );
+ actionEditSplitHorizontal->setWhatsThis( whatsThisFrom( "Layout|Lay Out Horizontally (in Splitter)" ) );
+ connect( actionEditSplitHorizontal, SIGNAL( activated() ), this, SLOT( editLayoutHorizontalSplit() ) );
+ actionEditSplitHorizontal->setEnabled( FALSE );
+
+ actionEditSplitVertical = new QAction( tr( "Lay Out Vertically (in Splitter)" ), createIconSet("designer_edithlayoutsplit.png"),
+ tr( "Lay Out Vertically (in Sp&litter)" ), 0, this, 0 );
+ actionEditSplitVertical->setStatusTip(tr("Lays out the selected widgets vertically in a splitter") );
+ actionEditSplitVertical->setWhatsThis( whatsThisFrom( "Layout|Lay Out Vertically (in Splitter)" ) );
+ connect( actionEditSplitVertical, SIGNAL( activated() ), this, SLOT( editLayoutVerticalSplit() ) );
+ actionEditSplitVertical->setEnabled( FALSE );
+
+ actionEditBreakLayout = new QAction( tr( "Break Layout" ), createIconSet("designer_editbreaklayout.png"),
+ tr( "&Break Layout" ), CTRL + Key_B, this, 0 );
+ actionEditBreakLayout->setStatusTip(tr("Breaks the selected layout") );
+ actionEditBreakLayout->setWhatsThis( whatsThisFrom( "Layout|Break Layout" ) );
+ connect( actionEditBreakLayout, SIGNAL( activated() ), this, SLOT( editBreakLayout() ) );
+ actionEditBreakLayout->setEnabled( FALSE );
+
+ int id = WidgetDatabase::idFromClassName( "Spacer" );
+ actionInsertSpacer = new WidgetAction( "Layout", actionGroupTools, QString::number( id ).latin1() );
+ actionInsertSpacer->setToggleAction( TRUE );
+ actionInsertSpacer->setText( WidgetDatabase::className( id ) );
+ actionInsertSpacer->setMenuText( tr( "Add ") + WidgetDatabase::className( id ) );
+ actionInsertSpacer->setIconSet( WidgetDatabase::iconSet( id ) );
+ actionInsertSpacer->setToolTip( WidgetDatabase::toolTip( id ) );
+ actionInsertSpacer->setStatusTip( tr( "Insert a %1").arg(WidgetDatabase::toolTip( id )) );
+ actionInsertSpacer->setWhatsThis( QString("<b>A %1</b><p>%2</p>"
+ "<p>Click to insert a single %3,"
+ "or double click to keep the tool selected.")
+ .arg(WidgetDatabase::toolTip( id ))
+ .arg(WidgetDatabase::whatsThis( id ))
+ .arg(WidgetDatabase::toolTip( id ) ));
+
+ actionInsertSpacer->addTo( commonWidgetsToolBar );
+ commonWidgetsPage.append( actionInsertSpacer );
+ QWidget *w;
+ commonWidgetsToolBar->setStretchableWidget( ( w = new QWidget( commonWidgetsToolBar ) ) );
+ w->setBackgroundMode( commonWidgetsToolBar->backgroundMode() );
+ QWhatsThis::add( layoutToolBar, tr( "<b>The Layout toolbar</b>%1" ).arg(tr(toolbarHelp).arg("")) );
+ actionEditAdjustSize->addTo( layoutToolBar );
+ layoutToolBar->addSeparator();
+ actionEditHLayout->addTo( layoutToolBar );
+ actionEditVLayout->addTo( layoutToolBar );
+ actionEditGridLayout->addTo( layoutToolBar );
+ actionEditSplitHorizontal->addTo( layoutToolBar );
+ actionEditSplitVertical->addTo( layoutToolBar );
+ actionEditBreakLayout->addTo( layoutToolBar );
+ layoutToolBar->addSeparator();
+ actionInsertSpacer->addTo( layoutToolBar );
+
+ QPopupMenu *menu = new QPopupMenu( this, "Layout" );
+ layoutMenu = menu;
+ menubar->insertItem( tr( "&Layout" ), menu, toolsMenuId + 1 );
+ actionEditAdjustSize->addTo( menu );
+ menu->insertSeparator();
+ actionEditHLayout->addTo( menu );
+ actionEditVLayout->addTo( menu );
+ actionEditGridLayout->addTo( menu );
+ actionEditSplitHorizontal->addTo( menu );
+ actionEditSplitVertical->addTo( menu );
+ actionEditBreakLayout->addTo( menu );
+ menu->insertSeparator();
+ actionInsertSpacer->addTo( menu );
+}
+
+void MainWindow::setupToolActions()
+{
+ if ( !actionGroupTools ) {
+ actionGroupTools = new QActionGroup( this );
+ actionGroupTools->setExclusive( TRUE );
+ connect( actionGroupTools, SIGNAL( selected(QAction*) ),
+ this, SLOT( toolSelected(QAction*) ) );
+ }
+
+ actionPointerTool = new QAction( tr("Pointer"), createIconSet("designer_pointer.png"),
+ tr("&Pointer"), Key_F2,
+ actionGroupTools,
+ QString::number(POINTER_TOOL).latin1(), TRUE );
+ actionPointerTool->setStatusTip( tr("Selects the pointer tool") );
+ actionPointerTool->setWhatsThis( whatsThisFrom( "Tools|Pointer" ) );
+
+ actionConnectTool = new QAction( tr("Connect Signal/Slots"),
+ createIconSet("designer_connecttool.png"),
+ tr("&Connect Signal/Slots"),
+ singleProjectMode() ? 0 : Key_F3,
+ actionGroupTools,
+ QString::number(CONNECT_TOOL).latin1(), TRUE );
+ actionConnectTool->setStatusTip( tr("Selects the connection tool") );
+ actionConnectTool->setWhatsThis( whatsThisFrom( "Tools|Connect Signals and Slots" ) );
+
+ actionOrderTool = new QAction( tr("Tab Order"), createIconSet("designer_ordertool.png"),
+ tr("Tab &Order"), Key_F4,
+ actionGroupTools,
+ QString::number(ORDER_TOOL).latin1(), TRUE );
+ actionOrderTool->setStatusTip( tr("Selects the tab order tool") );
+ actionOrderTool->setWhatsThis( whatsThisFrom( "Tools|Tab Order" ) );
+
+ actionBuddyTool = new QAction( tr( "Set Buddy" ), createIconSet( "designer_setbuddy.png" ),
+ tr( "Set &Buddy" ), Key_F12,
+ actionGroupTools, QString::number( BUDDY_TOOL ).latin1(),
+ TRUE );
+ actionBuddyTool->setStatusTip( tr( "Sets a buddy to a label" ) );
+ actionBuddyTool->setWhatsThis( whatsThisFrom( "Tools|Set Buddy" ) );
+
+ QToolBar *tb = new QToolBar( this, "Tools" );
+ tb->setCloseMode( QDockWindow::Undocked );
+ toolsToolBar = tb;
+ QWhatsThis::add( tb, tr( "<b>The Tools toolbar</b>%1" ).arg(tr(toolbarHelp).arg("")) );
+
+ addToolBar( tb, tr( "Tools" ), QMainWindow::DockTop, FALSE );
+ actionPointerTool->addTo( tb );
+ if ( !singleProjectMode() )
+ actionConnectTool->addTo( tb );
+ actionOrderTool->addTo( tb );
+ actionBuddyTool->addTo( tb );
+
+ QPopupMenu *mmenu = new QPopupMenu( this, "Tools" );
+ toolsMenu = mmenu;
+ toolsMenuId = 100;
+ menubar->insertItem( tr( "&Tools" ), mmenu, toolsMenuId );
+ toolsMenuIndex = menubar->indexOf( toolsMenuId );
+ actionPointerTool->addTo( mmenu );
+ if ( !singleProjectMode() )
+ actionConnectTool->addTo( mmenu );
+ actionOrderTool->addTo( mmenu );
+ actionBuddyTool->addTo( mmenu );
+ mmenu->insertSeparator();
+
+ customWidgetToolBar = 0;
+ customWidgetMenu = 0;
+
+ actionToolsCustomWidget = new QAction( tr("Custom Widgets"),
+ createIconSet( "designer_customwidget.png" ),
+ tr("Edit &Custom Widgets..."), 0, this, 0 );
+ actionToolsCustomWidget->setStatusTip( tr("Opens a dialog to add and change "
+ "custom widgets") );
+ actionToolsCustomWidget->setWhatsThis( whatsThisFrom( "Tools|Custom|Edit Custom"
+ "Widgets" ) );
+ connect( actionToolsCustomWidget, SIGNAL( activated() ),
+ this, SLOT( toolsCustomWidget() ) );
+
+ for ( int j = 0; j < WidgetDatabase::numWidgetGroups(); ++j ) {
+ QString grp = WidgetDatabase::widgetGroup( j );
+ if ( !WidgetDatabase::isGroupVisible( grp ) ||
+ WidgetDatabase::isGroupEmpty( grp ) )
+ continue;
+ QToolBar *tb = new QToolBar( this, grp.latin1() );
+ tb->setCloseMode( QDockWindow::Undocked );
+ widgetToolBars.append( tb );
+ bool plural = grp[(int)grp.length()-1] == 's';
+ if ( plural ) {
+ QWhatsThis::add( tb, tr( "<b>The %1</b>%2" ).arg(grp).arg(tr(toolbarHelp).
+ arg( tr(" Click on a button to insert a single widget, "
+ "or double click to insert multiple %1.") ).arg(grp)) );
+ } else {
+ QWhatsThis::add( tb, tr( "<b>The %1 Widgets</b>%2" ).arg(grp).arg(tr(toolbarHelp).
+ arg( tr(" Click on a button to insert a single %1 widget, "
+ "or double click to insert multiple widgets.") ).arg(grp)) );
+ }
+ addToolBar( tb, grp );
+ tb->hide();
+ QPopupMenu *menu = new QPopupMenu( this, grp.latin1() );
+ mmenu->insertItem( grp, menu );
+
+ QToolBar *tb2 = new QToolBar( grp, 0, toolBox, FALSE, grp.latin1() );
+ tb2->setFrameStyle( QFrame::NoFrame );
+ tb2->setOrientation( Qt::Vertical );
+ tb2->setBackgroundMode( PaletteBase );
+ toolBox->addItem( tb2, grp );
+
+ if ( grp == "Custom" ) {
+ if ( !customWidgetMenu )
+ actionToolsCustomWidget->addTo( menu );
+ else
+ menu->insertSeparator();
+ customWidgetMenu = menu;
+ customWidgetToolBar = tb;
+ }
+
+ for ( int i = 0; i < WidgetDatabase::count(); ++i ) {
+ if ( WidgetDatabase::group( i ) != grp )
+ continue; // only widgets, i.e. not forms and temp stuff
+ WidgetAction* a =
+ new WidgetAction( grp, actionGroupTools, QString::number( i ).latin1() );
+ a->setToggleAction( TRUE );
+ QString atext = WidgetDatabase::className( i );
+ if ( atext[0] == 'Q' )
+ atext = atext.mid(1);
+ while ( atext.length() && atext[0] >= 'a' && atext[0] <= 'z' )
+ atext = atext.mid(1);
+ if ( atext.isEmpty() )
+ atext = WidgetDatabase::className( i );
+ a->setText( atext );
+ QString ttip = WidgetDatabase::toolTip( i );
+ a->setIconSet( WidgetDatabase::iconSet( i ) );
+ a->setToolTip( ttip );
+ if ( !WidgetDatabase::isWhatsThisLoaded() )
+ WidgetDatabase::loadWhatsThis( documentationPath() );
+ a->setStatusTip( tr( "Insert a %1").arg(WidgetDatabase::className( i )) );
+
+ QString whats = QString("<b>A %1</b>").arg( WidgetDatabase::className( i ) );
+ if ( !WidgetDatabase::whatsThis( i ).isEmpty() )
+ whats += QString("<p>%1</p>").arg(WidgetDatabase::whatsThis( i ));
+ a->setWhatsThis( whats+ tr("<p>Double click on this tool to keep it selected.</p>") );
+
+ if ( grp != "KDE" )
+ a->addTo( tb );
+ a->addTo( menu );
+ a->addTo( tb2 );
+ if ( WidgetDatabase::isCommon( i ) ) {
+ a->addTo( commonWidgetsToolBar );
+ commonWidgetsPage.append( a );
+ }
+ }
+ QWidget *w;
+ tb2->setStretchableWidget( ( w = new QWidget( tb2 ) ) );
+ w->setBackgroundMode( tb2->backgroundMode() );
+ }
+
+ if ( !customWidgetToolBar ) {
+ QToolBar *tb = new QToolBar( this, "Custom Widgets" );
+ tb->setCloseMode( QDockWindow::Undocked );
+ QWhatsThis::add( tb, tr( "<b>The Custom Widgets toolbar</b>%1"
+ "<p>Click <b>Edit Custom Widgets...</b>"
+ "in the <b>Tools|Custom</b> menu to "
+ "add and change custom widgets</p>" ).
+ arg(tr(toolbarHelp).
+ arg( tr(" Click on the buttons to insert a single widget, "
+ "or double click to insert multiple widgets.") )) );
+ addToolBar( tb, "Custom" );
+ tb->hide();
+ widgetToolBars.append( tb );
+ customWidgetToolBar = tb;
+ QPopupMenu *menu = new QPopupMenu( this, "Custom Widgets" );
+ mmenu->insertItem( "Custom", menu );
+ customWidgetMenu = menu;
+ customWidgetToolBar->hide();
+ actionToolsCustomWidget->addTo( customWidgetMenu );
+ customWidgetMenu->insertSeparator();
+ QToolBar *tb2 = new QToolBar( "Custom Widgets", 0,
+ toolBox, FALSE, "Custom Widgets" );
+ tb2->setBackgroundMode(PaletteBase);
+ tb2->setOrientation( Qt::Vertical );
+ tb2->setFrameStyle( QFrame::NoFrame );
+ toolBox->addItem( tb2, "Custom Widgets" );
+ customWidgetToolBar2 = tb2;
+ }
+
+ QAction *a = new QAction( tr( "Configure Toolbox" ), tr( "Configure Toolbox..." ), 0, this );
+ a->setStatusTip( tr( "Opens a dialog to configure the common "
+ "widgets page of the toolbox") );
+ connect( a, SIGNAL( activated() ), this, SLOT( toolsConfigure() ) );
+ mmenu->insertSeparator();
+ a->addTo( mmenu );
+ resetTool();
+}
+
+void MainWindow::setupFileActions()
+{
+ QToolBar* tb = new QToolBar( this, "File" );
+ tb->setCloseMode( QDockWindow::Undocked );
+ projectToolBar = tb;
+
+ QWhatsThis::add( tb, tr( "<b>The File toolbar</b>%1" ).arg(tr(toolbarHelp).arg("")) );
+ addToolBar( tb, tr( "File" ) );
+ fileMenu = new QPopupMenu( this, "File" );
+ menubar->insertItem( tr( "&File" ), fileMenu );
+
+ QAction *a = 0;
+
+ if ( !singleProject ) {
+ a = new QAction( this, 0 );
+ a->setText( tr( "New" ) );
+ a->setToolTip( tr( "New Dialog or File" ) );
+ a->setMenuText( tr( "&New..." ) );
+ a->setIconSet( createIconSet("designer_filenew.png") );
+ a->setAccel( CTRL + Key_N );
+ a->setStatusTip( tr( "Creates a new project, form or source file." ) );
+ a->setWhatsThis( whatsThisFrom( "File|New" ) );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) );
+ a->addTo( tb );
+ a->addTo( fileMenu );
+ } else {
+ actionGroupNew = new QActionGroup( this, 0, FALSE );
+ a = actionGroupNew;
+ ( (QActionGroup*)a )->setUsesDropDown( TRUE );
+ a->setText( tr( "New" ) );
+ a->setMenuText( tr( "&New..." ) );
+ a->setIconSet( createIconSet("designer_form.png") );
+ a->setStatusTip( tr( "Creates a new dialog or file" ) );
+ a->setWhatsThis( whatsThisFrom( "File|New" ) );
+
+ QAction *newForm = new QAction( a, 0 );
+ newForm->setText( tr( "New Dialog" ) );
+ newForm->setMenuText( tr( "&Dialog..." ) );
+ newForm->setIconSet( createIconSet("designer_form.png") );
+ newForm->setAccel( CTRL + Key_N );
+ newForm->setStatusTip( tr( "Creates a new dialog." ) );
+ connect( newForm, SIGNAL( activated() ), this, SLOT( fileNewDialog() ) );
+
+ QAction *newFile = new QAction( a, 0 );
+ newFile->setText( tr( "New File" ) );
+ newFile->setMenuText( tr( "&File..." ) );
+ newFile->setIconSet( createIconSet("designer_filenew.png") );
+ newFile->setAccel( ALT + Key_N );
+ newFile->setStatusTip( tr( "Creates a new file." ) );
+ connect( newFile, SIGNAL( activated() ), this, SLOT( fileNewFile() ) );
+ actionNewFile = newFile;
+
+ a->addTo( tb );
+ a->addTo( fileMenu );
+
+ fileMenu->insertSeparator();
+ }
+
+ a = new QAction( this, 0 );
+ a->setText( tr( "Open" ) );
+ a->setMenuText( tr( "&Open..." ) );
+ a->setIconSet( createIconSet("designer_fileopen.png") );
+ a->setAccel( CTRL + Key_O );
+ a->setStatusTip( tr( "Opens an existing project, form or source file ") );
+ a->setWhatsThis( whatsThisFrom( "File|Open" ) );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileOpen() ) );
+ if ( !singleProject ) {
+ a->addTo( tb );
+ a->addTo( fileMenu );
+ fileMenu->insertSeparator();
+ }
+
+
+ a = new QAction( this, 0 );
+ a->setText( tr( "Close" ) );
+ a->setMenuText( tr( "&Close" ) );
+ a->setStatusTip( tr( "Closes the current project or document" ) );
+ a->setWhatsThis(whatsThisFrom( "File|Close" ) );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileClose() ) );
+ connect( this, SIGNAL( hasActiveWindowOrProject(bool) ), a, SLOT( setEnabled(bool) ) );
+ if ( !singleProject ) {
+ a->addTo( fileMenu );
+ fileMenu->insertSeparator();
+ }
+
+ a = new QAction( this, 0 );
+ actionFileSave = a;
+ a->setText( tr( "Save" ) );
+ a->setMenuText( tr( "&Save" ) );
+ a->setIconSet( createIconSet("designer_filesave.png") );
+ a->setAccel( CTRL + Key_S );
+ a->setStatusTip( tr( "Saves the current project or document" ) );
+ a->setWhatsThis(whatsThisFrom( "File|Save" ) );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileSave() ) );
+ connect( this, SIGNAL( hasActiveWindowOrProject(bool) ), a, SLOT( setEnabled(bool) ) );
+ a->addTo( tb );
+ a->addTo( fileMenu );
+
+ a = new QAction( this, 0 );
+ a->setText( tr( "Save As" ) );
+ a->setMenuText( tr( "Save &As..." ) );
+ a->setStatusTip( tr( "Saves the current form with a new filename" ) );
+ a->setWhatsThis( whatsThisFrom( "File|Save As" ) );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAs() ) );
+ connect( this, SIGNAL( hasActiveWindow(bool) ), a, SLOT( setEnabled(bool) ) );
+ if ( !singleProject )
+ a->addTo( fileMenu );
+
+ a = new QAction( this, 0 );
+ a->setText( tr( "Save All" ) );
+ a->setMenuText( tr( "Sa&ve All" ) );
+ a->setStatusTip( tr( "Saves all open documents" ) );
+ a->setWhatsThis( whatsThisFrom( "File|Save All" ) );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAll() ) );
+ connect( this, SIGNAL( hasActiveWindowOrProject(bool) ), a, SLOT( setEnabled(bool) ) );
+ if ( !singleProject ) {
+ a->addTo( fileMenu );
+ fileMenu->insertSeparator();
+ }
+
+ a = new QAction( this, 0 );
+ a->setText( tr( "Create Template" ) );
+ a->setMenuText( tr( "Create &Template..." ) );
+ a->setStatusTip( tr( "Creates a new template" ) );
+ a->setWhatsThis( whatsThisFrom( "File|Create Template" ) );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileCreateTemplate() ) );
+ if ( !singleProject )
+ a->addTo( fileMenu );
+
+ if ( !singleProject )
+ fileMenu->insertSeparator();
+
+ recentlyFilesMenu = new QPopupMenu( this );
+ recentlyProjectsMenu = new QPopupMenu( this );
+
+ if ( !singleProject ) {
+ fileMenu->insertItem( tr( "Recently opened files " ), recentlyFilesMenu );
+ fileMenu->insertItem( tr( "Recently opened projects" ), recentlyProjectsMenu );
+ }
+
+ connect( recentlyFilesMenu, SIGNAL( aboutToShow() ),
+ this, SLOT( setupRecentlyFilesMenu() ) );
+ connect( recentlyProjectsMenu, SIGNAL( aboutToShow() ),
+ this, SLOT( setupRecentlyProjectsMenu() ) );
+ connect( recentlyFilesMenu, SIGNAL( activated( int ) ),
+ this, SLOT( recentlyFilesMenuActivated( int ) ) );
+ connect( recentlyProjectsMenu, SIGNAL( activated( int ) ),
+ this, SLOT( recentlyProjectsMenuActivated( int ) ) );
+
+ if ( !singleProject )
+ fileMenu->insertSeparator();
+
+ a = new QAction( this, 0 );
+ actionFileExit = a;
+ a->setAccel(CTRL + Key_Q);
+ if ( !singleProjectMode() ) {
+ a->setText( tr( "Exit" ) );
+ a->setMenuText( tr( "E&xit" ) );
+ a->setStatusTip( tr( "Quits the application and prompts to save any changed forms, source files or project settings" ) );
+ a->setWhatsThis( whatsThisFrom( "File|Exit" ) );
+ } else {
+ a->setText( tr( "Close" ) );
+ a->setMenuText( tr( "&Close" ) );
+ }
+ connect( a, SIGNAL( activated() ), this, SLOT( fileQuit() ) );
+ a->addTo( fileMenu );
+}
+
+void MainWindow::setupProjectActions()
+{
+ projectMenu = new QPopupMenu( this, "Project" );
+ menubar->insertItem( tr( "Pr&oject" ), projectMenu );
+
+ QActionGroup *ag = new QActionGroup( this, 0 );
+ ag->setText( tr( "Active Project" ) );
+ ag->setMenuText( tr( "Active Project" ) );
+ ag->setExclusive( TRUE );
+ ag->setUsesDropDown( TRUE );
+ connect( ag, SIGNAL( selected( QAction * ) ), this, SLOT( projectSelected( QAction * ) ) );
+ connect( ag, SIGNAL( selected( QAction * ) ), this, SIGNAL( projectChanged() ) );
+ QAction *a = new QAction( tr( "<No Project>" ), tr( "<No Project>" ), 0, ag, 0, TRUE );
+ eProject = new Project( "", tr( "<No Project>" ), projectSettingsPluginManager, TRUE );
+ projects.insert( a, eProject );
+ a->setOn( TRUE );
+ ag->addTo( projectMenu );
+ ag->addTo( projectToolBar );
+ actionGroupProjects = ag;
+
+ if ( !singleProject )
+ projectMenu->insertSeparator();
+
+ a = new QAction( tr( "Add File" ), QPixmap(), tr( "&Add File..." ), 0, this, 0 );
+ a->setStatusTip( tr("Adds a file to the current project") );
+ a->setWhatsThis( whatsThisFrom( "Project|Add File" ) );
+ connect( a, SIGNAL( activated() ), this, SLOT( projectInsertFile() ) );
+ a->setEnabled( FALSE );
+ connect( this, SIGNAL( hasNonDummyProject(bool) ), a, SLOT( setEnabled(bool) ) );
+ if ( !singleProject )
+ a->addTo( projectMenu );
+
+ QAction* actionEditPixmapCollection = new QAction( tr( "Image Collection..." ), QPixmap(),
+ tr( "&Image Collection..." ), 0, this, 0 );
+ actionEditPixmapCollection->setStatusTip( tr("Opens a dialog for editing the current project's image collection") );
+ actionEditPixmapCollection->setWhatsThis( whatsThisFrom( "Project|Image Collection" ) );
+ connect( actionEditPixmapCollection, SIGNAL( activated() ), this, SLOT( editPixmapCollection() ) );
+ actionEditPixmapCollection->setEnabled( FALSE );
+ connect( this, SIGNAL( hasNonDummyProject(bool) ), actionEditPixmapCollection, SLOT( setEnabled(bool) ) );
+ actionEditPixmapCollection->addTo( projectMenu );
+
+#ifndef QT_NO_SQL
+ QAction* actionEditDatabaseConnections = new QAction( tr( "Database Connections..." ), QPixmap(),
+ tr( "&Database Connections..." ), 0, this, 0 );
+ actionEditDatabaseConnections->setStatusTip( tr("Opens a dialog for editing the current project's database connections") );
+ actionEditDatabaseConnections->setWhatsThis( whatsThisFrom( "Project|Database Connections" ) );
+ connect( actionEditDatabaseConnections, SIGNAL( activated() ), this, SLOT( editDatabaseConnections() ) );
+ //actionEditDatabaseConnections->setEnabled( FALSE );
+ //connect( this, SIGNAL( hasNonDummyProject(bool) ), actionEditDatabaseConnections, SLOT( setEnabled(bool) ) );
+ if ( !singleProject )
+ actionEditDatabaseConnections->addTo( projectMenu );
+#endif
+
+ QAction* actionEditProjectSettings = new QAction( tr( "Project Settings..." ), QPixmap(),
+ tr( "&Project Settings..." ), 0, this, 0 );
+ actionEditProjectSettings->setStatusTip( tr("Opens a dialog to change the project's settings") );
+ actionEditProjectSettings->setWhatsThis( whatsThisFrom( "Project|Project Settings" ) );
+ connect( actionEditProjectSettings, SIGNAL( activated() ), this, SLOT( editProjectSettings() ) );
+ actionEditProjectSettings->setEnabled( FALSE );
+ connect( this, SIGNAL( hasNonDummyProject(bool) ), actionEditProjectSettings, SLOT( setEnabled(bool) ) );
+ actionEditProjectSettings->addTo( projectMenu );
+
+}
+
+void MainWindow::setupPreviewActions()
+{
+ QAction* a = 0;
+ QPopupMenu *menu = new QPopupMenu( this, "Preview" );
+ layoutMenu = menu;
+ menubar->insertItem( tr( "&Preview" ), menu, toolsMenuId + 2 );
+
+ a = new QAction( tr( "Preview Form" ), QPixmap(), tr( "Preview &Form" ), 0, this, 0 );
+ a->setAccel( CTRL + Key_T );
+ a->setStatusTip( tr("Opens a preview") );
+ a->setWhatsThis( whatsThisFrom( "Preview|Preview Form" ) );
+ connect( a, SIGNAL( activated() ), this, SLOT( previewForm() ) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), a, SLOT( setEnabled(bool) ) );
+ a->addTo( menu );
+
+ menu->insertSeparator();
+
+ QSignalMapper *mapper = new QSignalMapper( this );
+ connect( mapper, SIGNAL(mapped(const QString&)), this, SLOT(previewForm(const QString&)) );
+ QStringList styles = QStyleFactory::keys();
+ for ( QStringList::Iterator it = styles.begin(); it != styles.end(); ++it ) {
+ QString info;
+ if ( *it == "Motif" )
+ info = tr( "The preview will use the Motif look and feel which is used as the default style on most UNIX systems." );
+ else if ( *it == "Windows" )
+ info = tr( "The preview will use the Windows look and feel." );
+ else if ( *it == "Platinum" )
+ info = tr( "The preview will use the Platinum look and feel which is similar to the Macinosh GUI style." );
+ else if ( *it == "CDE" )
+ info = tr( "The preview will use the CDE look and feel which is similar to some versions of the Common Desktop Environment." );
+ else if ( *it == "SGI" )
+ info = tr( "The preview will use the Motif look and feel which is used as the default style on SGI systems." );
+ else if ( *it == "MotifPlus" )
+ info = tr( "The preview will use the advanced Motif look and feel used by the GIMP toolkit (GTK) on Linux." );
+
+ a = new QAction( tr( "Preview Form in %1 Style" ).arg( *it ), QPixmap(),
+ tr( "... in %1 Style" ).arg( *it ), 0, this, 0 );
+ a->setStatusTip( tr("Opens a preview in %1 style").arg( *it ) );
+ a->setWhatsThis( tr("<b>Open a preview in %1 style.</b>"
+ "<p>Use the preview to test the design and "
+ "signal-slot connections of the current form. %2</p>").arg( *it ).arg( info ) );
+ mapper->setMapping( a, *it );
+ connect( a, SIGNAL(activated()), mapper, SLOT(map()) );
+ connect( this, SIGNAL( hasActiveForm(bool) ), a, SLOT( setEnabled(bool) ) );
+ a->addTo( menu );
+ }
+}
+
+void MainWindow::setupWindowActions()
+{
+ static bool windowActionsSetup = FALSE;
+ if ( !windowActionsSetup ) {
+ windowActionsSetup = TRUE;
+
+ actionWindowTile = new QAction( tr( "Tile" ), tr( "&Tile" ), 0, this );
+ actionWindowTile->setStatusTip( tr("Tiles the windows so that they are all visible") );
+ actionWindowTile->setWhatsThis( whatsThisFrom( "Window|Tile" ) );
+ connect( actionWindowTile, SIGNAL( activated() ), qworkspace, SLOT( tile() ) );
+ actionWindowCascade = new QAction( tr( "Cascade" ), tr( "&Cascade" ), 0, this );
+ actionWindowCascade->setStatusTip( tr("Cascades the windows so that all their title bars are visible") );
+ actionWindowCascade->setWhatsThis( whatsThisFrom( "Window|Cascade" ) );
+ connect( actionWindowCascade, SIGNAL( activated() ), qworkspace, SLOT( cascade() ) );
+
+ actionWindowClose = new QAction( tr( "Close" ), tr( "Cl&ose" ), CTRL + Key_F4, this );
+ actionWindowClose->setStatusTip( tr( "Closes the active window") );
+ actionWindowClose->setWhatsThis( whatsThisFrom( "Window|Close" ) );
+ connect( actionWindowClose, SIGNAL( activated() ), qworkspace, SLOT( closeActiveWindow() ) );
+
+ actionWindowCloseAll = new QAction( tr( "Close All" ), tr( "Close Al&l" ), 0, this );
+ actionWindowCloseAll->setStatusTip( tr( "Closes all form windows") );
+ actionWindowCloseAll->setWhatsThis( whatsThisFrom( "Window|Close All" ) );
+ connect( actionWindowCloseAll, SIGNAL( activated() ), qworkspace, SLOT( closeAllWindows() ) );
+
+ actionWindowNext = new QAction( tr( "Next" ), tr( "Ne&xt" ), CTRL + Key_F6, this );
+ actionWindowNext->setStatusTip( tr( "Activates the next window" ) );
+ actionWindowNext->setWhatsThis( whatsThisFrom( "Window|Next" ) );
+ connect( actionWindowNext, SIGNAL( activated() ), qworkspace, SLOT( activateNextWindow() ) );
+
+ actionWindowPrevious = new QAction( tr( "Previous" ), tr( "Pre&vious" ), CTRL + SHIFT + Key_F6, this );
+ actionWindowPrevious->setStatusTip( tr( "Activates the previous window" ) );
+ actionWindowPrevious->setWhatsThis( whatsThisFrom( "Window|Previous" ) );
+ connect( actionWindowPrevious, SIGNAL( activated() ), qworkspace, SLOT( activatePreviousWindow() ) );
+ }
+
+ if ( !windowMenu ) {
+ windowMenu = new QPopupMenu( this, "Window" );
+ menubar->insertItem( tr( "&Window" ), windowMenu );
+ connect( windowMenu, SIGNAL( aboutToShow() ),
+ this, SLOT( setupWindowActions() ) );
+ } else {
+ windowMenu->clear();
+ }
+
+ actionWindowClose->addTo( windowMenu );
+ actionWindowCloseAll->addTo( windowMenu );
+ windowMenu->insertSeparator();
+ actionWindowNext->addTo( windowMenu );
+ actionWindowPrevious->addTo( windowMenu );
+ windowMenu->insertSeparator();
+ actionWindowTile->addTo( windowMenu );
+ actionWindowCascade->addTo( windowMenu );
+ windowMenu->insertSeparator();
+ windowMenu->insertItem( tr( "Vie&ws" ), createDockWindowMenu( NoToolBars ) );
+ windowMenu->insertItem( tr( "Tool&bars" ), createDockWindowMenu( OnlyToolBars ) );
+ QWidgetList windows = qworkspace->windowList();
+ if ( windows.count() && formWindow() )
+ windowMenu->insertSeparator();
+ int j = 0;
+ for ( int i = 0; i < int( windows.count() ); ++i ) {
+ QWidget *w = windows.at( i );
+ if ( !::qt_cast<FormWindow*>(w) && !::qt_cast<SourceEditor*>(w) )
+ continue;
+ if ( ::qt_cast<FormWindow*>(w) && ( ( (FormWindow*)w )->isFake() ) )
+ continue;
+ j++;
+ QString itemText;
+ if ( j < 10 )
+ itemText = QString("&%1 ").arg( j );
+ if ( ::qt_cast<FormWindow*>(w) )
+ itemText += w->name();
+ else
+ itemText += w->caption();
+
+ int id = windowMenu->insertItem( itemText, this, SLOT( windowsMenuActivated( int ) ) );
+ windowMenu->setItemParameter( id, i );
+ windowMenu->setItemChecked( id, qworkspace->activeWindow() == windows.at( i ) );
+ }
+}
+
+void MainWindow::setupHelpActions()
+{
+ actionHelpContents = new QAction( tr( "Contents" ), tr( "&Contents" ), Key_F1, this, 0 );
+ actionHelpContents->setStatusTip( tr("Opens the online help") );
+ actionHelpContents->setWhatsThis( whatsThisFrom( "Help|Contents" ) );
+ connect( actionHelpContents, SIGNAL( activated() ), this, SLOT( helpContents() ) );
+
+ actionHelpManual = new QAction( tr( "Manual" ), tr( "&Manual" ), CTRL + Key_M, this, 0 );
+ actionHelpManual->setStatusTip( tr("Opens the Qt Designer manual") );
+ actionHelpManual->setWhatsThis( whatsThisFrom( "Help|Manual" ) );
+ connect( actionHelpManual, SIGNAL( activated() ), this, SLOT( helpManual() ) );
+
+ actionHelpAbout = new QAction( tr("About"), QPixmap(), tr("&About"), 0, this, 0 );
+ actionHelpAbout->setStatusTip( tr("Displays information about Qt Designer") );
+ actionHelpAbout->setWhatsThis( whatsThisFrom( "Help|About" ) );
+ connect( actionHelpAbout, SIGNAL( activated() ), this, SLOT( helpAbout() ) );
+
+ actionHelpAboutQt = new QAction( tr("About Qt"), QPixmap(), tr("About &Qt"), 0, this, 0 );
+ actionHelpAboutQt->setStatusTip( tr("Displays information about the Qt Toolkit") );
+ actionHelpAboutQt->setWhatsThis( whatsThisFrom( "Help|About Qt" ) );
+ connect( actionHelpAboutQt, SIGNAL( activated() ), this, SLOT( helpAboutQt() ) );
+
+#if 0 //defined(QT_NON_COMMERCIAL)
+ // ### not used anymore -- should be deleted?
+ actionHelpRegister = new QAction( tr("Register Qt"), QPixmap(), tr("&Register Qt..."), 0, this, 0 );
+ actionHelpRegister->setStatusTip( tr("Opens a web browser at the evaluation form on www.trolltech.com") );
+ actionHelpRegister->setWhatsThis( tr("Register with Trolltech") );
+ connect( actionHelpRegister, SIGNAL( activated() ), this, SLOT( helpRegister() ) );
+#endif
+
+ actionHelpWhatsThis = new QAction( tr("What's This?"), QIconSet( whatsthis_image, whatsthis_image ),
+ tr("What's This?"), SHIFT + Key_F1, this, 0 );
+ actionHelpWhatsThis->setStatusTip( tr("\"What's This?\" context sensitive help") );
+ actionHelpWhatsThis->setWhatsThis( whatsThisFrom( "Help|What's This?" ) );
+ connect( actionHelpWhatsThis, SIGNAL( activated() ), this, SLOT( whatsThis() ) );
+
+ QToolBar *tb = new QToolBar( this, "Help" );
+ tb->setCloseMode( QDockWindow::Undocked );
+ QWhatsThis::add( tb, tr( "<b>The Help toolbar</b>%1" ).arg(tr(toolbarHelp).arg("") ));
+ addToolBar( tb, tr( "Help" ) );
+ actionHelpWhatsThis->addTo( tb );
+
+ QPopupMenu *menu = new QPopupMenu( this, "Help" );
+ menubar->insertSeparator();
+ menubar->insertItem( tr( "&Help" ), menu );
+ actionHelpContents->addTo( menu );
+ actionHelpManual->addTo( menu );
+ menu->insertSeparator();
+ actionHelpAbout->addTo( menu );
+ actionHelpAboutQt->addTo( menu );
+#if 0 //defined(QT_NON_COMMERCIAL)
+ // ### not used anymore -- should be deleted?
+ actionHelpRegister->addTo( menu );
+#endif
+
+ menu->insertSeparator();
+ actionHelpWhatsThis->addTo( menu );
+}
+
+void MainWindow::fileNew()
+{
+ statusBar()->message( tr( "Create a new project, form or source file...") );
+ NewForm dlg( this, projectNames(), currentProject->projectName(), templatePath() );
+ dlg.exec();
+ statusBar()->clear();
+}
+
+void MainWindow::fileNewDialog()
+{
+ static int forms = 0;
+ QString n = "Dialog" + QString::number( ++forms );
+ while ( currentProject->findFormFile( n + ".ui" ) )
+ n = "Dialog" + QString::number( ++forms );
+ FormWindow *fw = 0;
+ FormFile *ff = new FormFile( n + ".ui", FALSE, currentProject );
+ fw = new FormWindow( ff, MainWindow::self, MainWindow::self->qWorkspace(), n );
+ ff->setModified( TRUE );
+ currentProject->setModified( TRUE );
+ workspace()->update();
+ fw->setProject( currentProject );
+ MetaDataBase::addEntry( fw );
+ QWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QDialog" ), fw, n.latin1() );
+ fw->setMainContainer( w );
+ fw->setCaption( n );
+ fw->resize( 600, 480 );
+ insertFormWindow( fw );
+ fw->killAccels( fw );
+ fw->project()->setModified( TRUE );
+ fw->setFocus();
+ fw->setSavePixmapInProject( TRUE );
+ fw->setSavePixmapInline( FALSE );
+}
+
+void MainWindow::fileNewFile()
+{
+ QString name = QInputDialog::getText( tr( "Name of File" ), tr( "Enter the name of the new source file:" ) );
+ if ( name.isEmpty() )
+ return;
+ if ( name.right( 3 ) != ".qs" )
+ name += ".qs";
+ SourceFile *f = new SourceFile( name, FALSE, currentProject );
+ MainWindow::self->editSource( f );
+ f->setModified( TRUE );
+ currentProject->setModified( TRUE );
+ workspace()->update();
+}
+
+void MainWindow::fileQuit()
+{
+ close();
+ if ( !singleProjectMode() )
+ qApp->closeAllWindows();
+}
+
+void MainWindow::fileClose()
+{
+ if ( !currentProject->isDummy() ) {
+ fileCloseProject();
+ } else {
+ QWidget *w = qworkspace->activeWindow();
+ if ( w ) {
+ if ( ::qt_cast<FormWindow*>(w) )
+ ( (FormWindow*)w )->formFile()->close();
+ else if ( ::qt_cast<SourceEditor*>(w) )
+ ( (SourceEditor*)w )->close();
+ }
+ }
+}
+
+
+void MainWindow::fileCloseProject()
+{
+ if ( currentProject->isDummy() )
+ return;
+ Project *pro = currentProject;
+ QAction* a = 0;
+ QAction* lastValid = 0;
+ for ( QMap<QAction*, Project* >::Iterator it = projects.begin(); it != projects.end(); ++it ) {
+ if ( it.data() == pro ) {
+ a = it.key();
+ if ( lastValid )
+ break;
+ }
+ lastValid = it.key();
+ }
+ if ( a ) {
+ if ( pro->isModified() ) {
+ switch ( QMessageBox::warning( this, tr( "Save Project Settings" ),
+ tr( "Save changes to '%1'?" ).arg( pro->fileName() ),
+ tr( "&Yes" ), tr( "&No" ), tr( "&Cancel" ), 0, 2 ) ) {
+ case 0: // save
+ pro->save();
+ break;
+ case 1: // don't save
+ break;
+ case 2: // cancel
+ return;
+ default:
+ break;
+ }
+ }
+
+ QWidgetList windows = qWorkspace()->windowList();
+ qWorkspace()->blockSignals( TRUE );
+ QWidgetListIt wit( windows );
+ while ( wit.current() ) {
+ QWidget *w = wit.current();
+ ++wit;
+ if ( ::qt_cast<FormWindow*>(w) ) {
+ if ( ( (FormWindow*)w )->project() == pro ) {
+ if ( ( (FormWindow*)w )->formFile()->editor() )
+ windows.removeRef( ( (FormWindow*)w )->formFile()->editor() );
+ if ( !( (FormWindow*)w )->formFile()->close() )
+ return;
+ }
+ } else if ( ::qt_cast<SourceEditor*>(w) ) {
+ if ( !( (SourceEditor*)w )->close() )
+ return;
+ }
+ }
+ hierarchyView->clear();
+ windows = qWorkspace()->windowList();
+ qWorkspace()->blockSignals( FALSE );
+ actionGroupProjects->removeChild( a );
+ projects.remove( a );
+ delete a;
+ currentProject = 0;
+ if ( lastValid ) {
+ projectSelected( lastValid );
+ statusBar()->message( "Selected project '" + tr( currentProject->projectName() + "'") );
+ }
+ if ( !windows.isEmpty() ) {
+ for ( QWidget *w = windows.first(); w; w = windows.next() ) {
+ if (!::qt_cast<FormWindow*>(w) || w->isHidden())
+ continue;
+ w->setFocus();
+ activeWindowChanged( w );
+ break;
+ }
+ } else {
+ emit hasActiveWindow( FALSE );
+ emit hasActiveForm( FALSE );
+ updateUndoRedo( FALSE, FALSE, QString::null, QString::null );
+ }
+ }
+}
+
+void MainWindow::fileOpen() // as called by the menu
+{
+ fileOpen( "", "", "", FALSE );
+}
+
+void MainWindow::projectInsertFile()
+{
+ fileOpen( "", "" );
+}
+
+void MainWindow::fileOpen( const QString &filter, const QString &extension, const QString &fn, bool inProject )
+{
+ statusBar()->message( tr( "Open a file...") );
+
+ QPluginManager<ImportFilterInterface> manager( IID_ImportFilter, QApplication::libraryPaths(), pluginDirectory() );
+
+ Project* project = inProject ? currentProject : eProject;
+
+ QStringList additionalSources;
+
+ {
+ QStringList filterlist;
+ if ( filter.isEmpty() ) {
+ if ( !inProject )
+ filterlist << tr( "Designer Files (*.ui *.pro)" );
+ filterlist << tr( "Qt User-Interface Files (*.ui)" );
+ if ( !inProject )
+ filterlist << tr( "QMAKE Project Files (*.pro)" );
+ QStringList list = manager.featureList();
+ for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
+ filterlist << *it;
+ LanguageInterface *iface = MetaDataBase::languageInterface( project->language() );
+ if ( iface ) {
+ filterlist += iface->fileFilterList();
+ additionalSources += iface->fileExtensionList();
+ }
+ filterlist << tr( "All Files (*)" );
+ } else {
+ filterlist << filter;
+ }
+
+ QString filters = filterlist.join( ";;" );
+
+ QStringList filenames;
+ if ( fn.isEmpty() ) {
+ if ( !inProject ) {
+ QString f = QFileDialog::getOpenFileName( QString::null, filters, this, 0,
+ tr("Open" ), &lastOpenFilter );
+ filenames << f;
+ } else {
+ filenames = QFileDialog::getOpenFileNames( filters, QString::null, this, 0,
+ tr("Add"), &lastOpenFilter );
+ }
+ } else {
+ filenames << fn;
+ }
+
+ for ( QStringList::Iterator fit = filenames.begin(); fit != filenames.end(); ++fit ) {
+ QString filename = *fit;
+ if ( !filename.isEmpty() ) {
+ QFileInfo fi( filename );
+
+ if ( fi.extension( FALSE ) == "pro" && ( extension.isEmpty() || extension.find( ";pro" ) != -1 ) ) {
+ addRecentlyOpened( filename, recentlyProjects );
+ openProject( filename );
+ } else if ( fi.extension( FALSE ) == "ui" && ( extension.isEmpty() || extension.find( ";ui" ) != -1 ) ) {
+ if ( !inProject )
+ setCurrentProject( eProject );
+ openFormWindow( filename );
+ addRecentlyOpened( filename, recentlyFiles );
+ } else if ( !extension.isEmpty() && extension.find( ";" + fi.extension( FALSE ) ) != -1 ||
+ additionalSources.find( fi.extension( FALSE ) ) != additionalSources.end() ) {
+ SourceFile *sf = project->findSourceFile( project->makeRelative( filename ) );
+ if ( !sf )
+ sf = new SourceFile( project->makeRelative( filename ), FALSE, project );
+ editSource( sf );
+ } else if ( extension.isEmpty() ) {
+ QString filter;
+ for ( QStringList::Iterator it2 = filterlist.begin(); it2 != filterlist.end(); ++it2 ) {
+ if ( (*it2).contains( "." + fi.extension( FALSE ), FALSE ) ) {
+ filter = *it2;
+ break;
+ }
+ }
+
+ ImportFilterInterface* iface = 0;
+ manager.queryInterface( filter, &iface );
+ if ( !iface ) {
+ statusBar()->message( tr( "No import filter is available to import '%1'").
+ arg( filename ), 3000 );
+ return;
+ }
+ statusBar()->message( tr( "Importing '%1' using import filter ...").arg( filename ) );
+ QStringList list = iface->import( filter, filename );
+ iface->release();
+ if ( list.isEmpty() ) {
+ statusBar()->message( tr( "Nothing to load in '%1'").arg( filename ), 3000 );
+ return;
+ }
+ if ( !inProject )
+ setCurrentProject( eProject );
+ addRecentlyOpened( filename, recentlyFiles );
+ for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
+ openFormWindow( *it, FALSE );
+ QFile::remove( *it );
+ }
+ statusBar()->clear();
+ }
+ }
+ }
+ }
+}
+
+FormWindow *MainWindow::openFormWindow( const QString &filename, bool validFileName, FormFile *ff )
+{
+ if ( filename.isEmpty() )
+ return 0;
+
+ bool makeNew = FALSE;
+
+ if ( !QFile::exists( filename ) ) {
+ makeNew = TRUE;
+ } else {
+ QFile f( filename );
+ f.open( IO_ReadOnly );
+ QTextStream ts( &f );
+ makeNew = ts.read().length() < 2;
+ }
+ if ( makeNew ) {
+ fileNew();
+ if ( formWindow() )
+ formWindow()->setFileName( filename );
+ return formWindow();
+ }
+
+ statusBar()->message( tr( "Reading file '%1'...").arg( filename ) );
+ FormFile *ff2 = currentProject->findFormFile( currentProject->makeRelative(filename) );
+ if ( ff2 && ff2->formWindow() ) {
+ ff2->formWindow()->setFocus();
+ return ff2->formWindow();
+ }
+
+ if ( ff2 )
+ ff = ff2;
+ QApplication::setOverrideCursor( WaitCursor );
+ Resource resource( this );
+ if ( !ff )
+ ff = new FormFile( currentProject->makeRelative( filename ), FALSE, currentProject );
+ bool b = resource.load( ff ) && (FormWindow*)resource.widget();
+ if ( !validFileName && resource.widget() )
+ ( (FormWindow*)resource.widget() )->setFileName( QString::null );
+ QApplication::restoreOverrideCursor();
+ if ( b ) {
+ rebuildCustomWidgetGUI();
+ statusBar()->message( tr( "Loaded file '%1'").arg( filename ), 3000 );
+ } else {
+ statusBar()->message( tr( "Failed to load file '%1'").arg( filename ), 5000 );
+ QMessageBox::information( this, tr("Load File"), tr("Couldn't load file '%1'").arg( filename ) );
+ delete ff;
+ }
+ return (FormWindow*)resource.widget();
+}
+
+bool MainWindow::fileSave()
+{
+
+ if ( !currentProject->isDummy() )
+ return fileSaveProject();
+ return fileSaveForm();
+}
+
+bool MainWindow::fileSaveForm()
+{
+ for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) {
+ if ( e->object() == formWindow() || e == qWorkspace()->activeWindow() ) {
+ e->save();
+ }
+ }
+
+ FormWindow *fw = 0;
+
+ QWidget *w = qWorkspace()->activeWindow();
+ if ( w ) {
+ if ( ::qt_cast<SourceEditor*>(w) ) {
+ SourceEditor *se = (SourceEditor*)w;
+ if ( se->formWindow() )
+ fw = se->formWindow();
+ else if ( se->sourceFile() ) {
+ se->sourceFile()->save();
+ return TRUE;
+ }
+ }
+ }
+
+ if ( !fw )
+ fw = formWindow();
+ if ( !fw || !fw->formFile()->save() )
+ return FALSE;
+ QApplication::restoreOverrideCursor();
+ return TRUE;
+}
+
+bool MainWindow::fileSaveProject()
+{
+ currentProject->save();
+ statusBar()->message( tr( "Project '%1' saved.").arg( currentProject->projectName() ), 3000 );
+ return TRUE;
+}
+
+bool MainWindow::fileSaveAs()
+{
+ statusBar()->message( tr( "Enter a filename..." ) );
+
+ QWidget *w = qworkspace->activeWindow();
+ if ( !w )
+ return TRUE;
+ if ( ::qt_cast<FormWindow*>(w) )
+ return ( (FormWindow*)w )->formFile()->saveAs();
+ else if ( ::qt_cast<SourceEditor*>(w) )
+ return ( (SourceEditor*)w )->saveAs();
+ return FALSE;
+}
+
+void MainWindow::fileSaveAll()
+{
+ for ( QMap<QAction*, Project* >::Iterator it = projects.begin(); it != projects.end(); ++it )
+ (*it)->save();
+}
+
+void MainWindow::fileCreateTemplate()
+{
+ CreateTemplate dia( this, 0, TRUE );
+
+ int i = 0;
+ for ( i = 0; i < WidgetDatabase::count(); ++i ) {
+ if ( WidgetDatabase::isForm( i ) && WidgetDatabase::group( i ) != "Temp") {
+ dia.listClass->insertItem( WidgetDatabase::className( i ) );
+ }
+ }
+ for ( i = 0; i < WidgetDatabase::count(); ++i ) {
+ if ( WidgetDatabase::isContainer( i ) && !WidgetDatabase::isForm(i) &&
+ WidgetDatabase::className( i ) != "QTabWidget" && WidgetDatabase::group( i ) != "Temp" ) {
+ dia.listClass->insertItem( WidgetDatabase::className( i ) );
+ }
+ }
+
+ QPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets();
+ for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) {
+ if ( w->isContainer )
+ dia.listClass->insertItem( w->className );
+ }
+
+ dia.editName->setText( tr( "NewTemplate" ) );
+ connect( dia.buttonCreate, SIGNAL( clicked() ),
+ this, SLOT( createNewTemplate() ) );
+ dia.exec();
+}
+
+void MainWindow::createNewTemplate()
+{
+ CreateTemplate *dia = (CreateTemplate*)sender()->parent();
+ QString fn = dia->editName->text();
+ QString cn = dia->listClass->currentText();
+ if ( fn.isEmpty() || cn.isEmpty() ) {
+ QMessageBox::information( this, tr( "Create Template" ), tr( "Couldn't create the template" ) );
+ return;
+ }
+
+ QStringList templRoots;
+ const char *qtdir = getenv( "QTDIR" );
+ if(qtdir)
+ templRoots << qtdir;
+ templRoots << qInstallPathData();
+ if(qtdir) //try the tools/designer directory last!
+ templRoots << (QString(qtdir) + "/tools/designer");
+ QFile f;
+ for ( QStringList::Iterator it = templRoots.begin(); it != templRoots.end(); ++it ) {
+ if ( QFile::exists( (*it) + "/templates/" )) {
+ QString tmpfn = (*it) + "/templates/" + fn + ".ui";
+ f.setName(tmpfn);
+ if(f.open(IO_WriteOnly))
+ break;
+ }
+ }
+ if ( !f.isOpen() ) {
+ QMessageBox::information( this, tr( "Create Template" ), tr( "Couldn't create the template" ) );
+ return;
+ }
+ QTextStream ts( &f );
+
+ ts << "<!DOCTYPE UI><UI>" << endl;
+ ts << "<widget>" << endl;
+ ts << "<class>" << cn << "</class>" << endl;
+ ts << "<property stdset=\"1\">" << endl;
+ ts << " <name>name</name>" << endl;
+ ts << " <cstring>" << cn << "Form</cstring>" << endl;
+ ts << "</property>" << endl;
+ ts << "<property stdset=\"1\">" << endl;
+ ts << " <name>geometry</name>" << endl;
+ ts << " <rect>" << endl;
+ ts << " <width>300</width>" << endl;
+ ts << " <height>400</height>" << endl;
+ ts << " </rect>" << endl;
+ ts << "</property>" << endl;
+ ts << "</widget>" << endl;
+ ts << "</UI>" << endl;
+
+ dia->editName->setText( tr( "NewTemplate" ) );
+
+ f.close();
+}
+
+void MainWindow::editUndo()
+{
+ if ( qWorkspace()->activeWindow() &&
+ ::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) {
+ ( (SourceEditor*)qWorkspace()->activeWindow() )->editUndo();
+ return;
+ }
+ if ( formWindow() )
+ formWindow()->undo();
+}
+
+void MainWindow::editRedo()
+{
+ if ( qWorkspace()->activeWindow() &&
+ ::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) {
+ ( (SourceEditor*)qWorkspace()->activeWindow() )->editRedo();
+ return;
+ }
+ if ( formWindow() )
+ formWindow()->redo();
+}
+
+void MainWindow::editCut()
+{
+ if ( qWorkspace()->activeWindow() &&
+ ::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) {
+ ( (SourceEditor*)qWorkspace()->activeWindow() )->editCut();
+ return;
+ }
+ editCopy();
+ editDelete();
+}
+
+void MainWindow::editCopy()
+{
+ if ( qWorkspace()->activeWindow() &&
+ ::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) {
+ ( (SourceEditor*)qWorkspace()->activeWindow() )->editCopy();
+ return;
+ }
+ if ( formWindow() )
+ qApp->clipboard()->setText( formWindow()->copy() );
+}
+
+void MainWindow::editPaste()
+{
+ if ( qWorkspace()->activeWindow() &&
+ ::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) {
+ ( (SourceEditor*)qWorkspace()->activeWindow() )->editPaste();
+ return;
+ }
+ if ( !formWindow() )
+ return;
+
+ QWidget *w = formWindow()->mainContainer();
+ QWidgetList l( formWindow()->selectedWidgets() );
+ if ( l.count() == 1 ) {
+ w = l.first();
+ if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout ||
+ ( !WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( w ) ) ) &&
+ w != formWindow()->mainContainer() ) )
+ w = formWindow()->mainContainer();
+ }
+
+ if ( w && WidgetFactory::layoutType( w ) == WidgetFactory::NoLayout ) {
+ formWindow()->paste( qApp->clipboard()->text(), WidgetFactory::containerOfWidget( w ) );
+ hierarchyView->widgetInserted( 0 );
+ formWindow()->commandHistory()->setModified( TRUE );
+ } else {
+ QMessageBox::information( this, tr( "Paste error" ),
+ tr( "Can't paste widgets. Designer couldn't find a container\n"
+ "to paste into which does not contain a layout. Break the layout\n"
+ "of the container you want to paste into and select this container\n"
+ "and then paste again." ) );
+ }
+}
+
+void MainWindow::editDelete()
+{
+ if ( formWindow() )
+ formWindow()->deleteWidgets();
+}
+
+void MainWindow::editSelectAll()
+{
+ if ( qWorkspace()->activeWindow() &&
+ ::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) ) {
+ ( (SourceEditor*)qWorkspace()->activeWindow() )->editSelectAll();
+ return;
+ }
+ if ( formWindow() )
+ formWindow()->selectAll();
+}
+
+
+void MainWindow::editLower()
+{
+ if ( formWindow() )
+ formWindow()->lowerWidgets();
+}
+
+void MainWindow::editRaise()
+{
+ if ( formWindow() )
+ formWindow()->raiseWidgets();
+}
+
+void MainWindow::editAdjustSize()
+{
+ if ( formWindow() )
+ formWindow()->editAdjustSize();
+}
+
+void MainWindow::editLayoutHorizontal()
+{
+ if ( layoutChilds )
+ editLayoutContainerHorizontal();
+ else if ( layoutSelected && formWindow() )
+ formWindow()->layoutHorizontal();
+}
+
+void MainWindow::editLayoutVertical()
+{
+ if ( layoutChilds )
+ editLayoutContainerVertical();
+ else if ( layoutSelected && formWindow() )
+ formWindow()->layoutVertical();
+}
+
+void MainWindow::editLayoutHorizontalSplit()
+{
+ if ( layoutChilds )
+ ; // no way to do that
+ else if ( layoutSelected && formWindow() )
+ formWindow()->layoutHorizontalSplit();
+}
+
+void MainWindow::editLayoutVerticalSplit()
+{
+ if ( layoutChilds )
+ ; // no way to do that
+ else if ( layoutSelected && formWindow() )
+ formWindow()->layoutVerticalSplit();
+}
+
+void MainWindow::editLayoutGrid()
+{
+ if ( layoutChilds )
+ editLayoutContainerGrid();
+ else if ( layoutSelected && formWindow() )
+ formWindow()->layoutGrid();
+}
+
+void MainWindow::editLayoutContainerVertical()
+{
+ if ( !formWindow() )
+ return;
+ QWidget *w = formWindow()->mainContainer();
+ QWidgetList l( formWindow()->selectedWidgets() );
+ if ( l.count() == 1 )
+ w = l.first();
+ if ( w )
+ formWindow()->layoutVerticalContainer( w );
+}
+
+void MainWindow::editLayoutContainerHorizontal()
+{
+ if ( !formWindow() )
+ return;
+ QWidget *w = formWindow()->mainContainer();
+ QWidgetList l( formWindow()->selectedWidgets() );
+ if ( l.count() == 1 )
+ w = l.first();
+ if ( w )
+ formWindow()->layoutHorizontalContainer( w );
+}
+
+void MainWindow::editLayoutContainerGrid()
+{
+ if ( !formWindow() )
+ return;
+ QWidget *w = formWindow()->mainContainer();
+ QWidgetList l( formWindow()->selectedWidgets() );
+ if ( l.count() == 1 )
+ w = l.first();
+ if ( w )
+ formWindow()->layoutGridContainer( w );
+}
+
+void MainWindow::editBreakLayout()
+{
+ if ( !formWindow() || !breakLayout )
+ return;
+ QWidget *w = formWindow()->mainContainer();
+ if ( formWindow()->currentWidget() )
+ w = formWindow()->currentWidget();
+ if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout ||
+ w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout ) {
+ formWindow()->breakLayout( w );
+ return;
+ } else {
+ QWidgetList widgets = formWindow()->selectedWidgets();
+ for ( w = widgets.first(); w; w = widgets.next() ) {
+ if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout ||
+ w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout )
+ break;
+ }
+ if ( w ) {
+ formWindow()->breakLayout( w );
+ return;
+ }
+ }
+
+ w = formWindow()->mainContainer();
+ if ( WidgetFactory::layoutType( w ) != WidgetFactory::NoLayout ||
+ w->parentWidget() && WidgetFactory::layoutType( w->parentWidget() ) != WidgetFactory::NoLayout )
+ formWindow()->breakLayout( w );
+}
+
+void MainWindow::editAccels()
+{
+ if ( !formWindow() )
+ return;
+ formWindow()->checkAccels();
+}
+
+void MainWindow::editFunctions()
+{
+ if ( !formWindow() )
+ return;
+
+ statusBar()->message( tr( "Edit the current form's slots..." ) );
+ EditFunctions dlg( this, formWindow(), TRUE );
+ dlg.exec();
+ statusBar()->clear();
+}
+
+void MainWindow::editConnections()
+{
+ if ( !formWindow() )
+ return;
+
+ statusBar()->message( tr( "Edit the current form's connections..." ) );
+ ConnectionDialog dlg( this );
+ dlg.exec();
+
+ statusBar()->clear();
+}
+
+SourceEditor *MainWindow::editSource()
+{
+ if ( !formWindow() )
+ return 0;
+ return formWindow()->formFile()->showEditor();
+}
+
+SourceEditor *MainWindow::openSourceEditor()
+{
+ if ( !formWindow() )
+ return 0;
+
+ QString lang = currentProject->language();
+ if ( !MetaDataBase::hasEditor( lang ) ) {
+ QMessageBox::information( this, tr( "Edit Source" ),
+ tr( "There is no plugin for editing " + lang + " code installed!\n"
+ "Note: Plugins are not available in static Qt configurations." ) );
+ return 0;
+ }
+
+ SourceEditor *editor = 0;
+ for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() ) {
+ if ( e->language() == lang && e->formWindow() == formWindow() ) {
+ editor = e;
+ break;
+ }
+ }
+
+ if ( !editor )
+ editor = createSourceEditor( formWindow(), formWindow()->project(), lang );
+ return editor;
+}
+
+SourceEditor *MainWindow::editSource( SourceFile *f )
+{
+ QString lang = currentProject->language();
+ if ( !MetaDataBase::hasEditor( lang ) ) {
+ QMessageBox::information( this, tr( "Edit Source" ),
+ tr( "There is no plugin for editing " + lang + " code installed!\n"
+ "Note: Plugins are not available in static Qt configurations." ) );
+ return 0;
+ }
+
+ SourceEditor *editor = 0;
+ if ( f )
+ editor = f->editor();
+ if ( !editor )
+ editor = createSourceEditor( f, currentProject, lang );
+ editor->setActiveWindow();
+ editor->setFocus();
+ return editor;
+}
+
+SourceEditor *MainWindow::createSourceEditor( QObject *object, Project *project,
+ const QString &lang, const QString &func,
+ bool rereadSource )
+{
+ SourceEditor *editor = 0;
+ EditorInterface *eIface = 0;
+ editorPluginManager->queryInterface( lang, &eIface );
+ if ( !eIface )
+ return 0;
+ LanguageInterface *lIface = MetaDataBase::languageInterface( lang );
+ if ( !lIface )
+ return 0;
+ QApplication::setOverrideCursor( WaitCursor );
+ editor = new SourceEditor( qWorkspace(), eIface, lIface );
+ eIface->release();
+ lIface->release();
+
+ editor->setLanguage( lang );
+ sourceEditors.append( editor );
+ QApplication::restoreOverrideCursor();
+
+ if ( editor->object() != object )
+ editor->setObject( object, project );
+ else if ( rereadSource )
+ editor->refresh( FALSE );
+
+ editor->show();
+ editor->setFocus();
+ if ( !func.isEmpty() )
+ editor->setFunction( func );
+ emit editorChanged();
+
+ return editor;
+}
+
+void MainWindow::editFormSettings()
+{
+ if ( !formWindow() )
+ return;
+
+ statusBar()->message( tr( "Edit the current form's settings..." ) );
+ FormSettings dlg( this, formWindow() );
+ dlg.exec();
+ statusBar()->clear();
+}
+
+void MainWindow::editProjectSettings()
+{
+ openProjectSettings( currentProject );
+ wspace->setCurrentProject( currentProject );
+}
+
+void MainWindow::editPixmapCollection()
+{
+ PixmapCollectionEditor dia( this, 0, TRUE );
+ dia.setProject( currentProject );
+ dia.exec();
+}
+
+void MainWindow::editDatabaseConnections()
+{
+#ifndef QT_NO_SQL
+ DatabaseConnectionsEditor dia( currentProject, this, 0, TRUE );
+ dia.exec();
+#endif
+}
+
+void MainWindow::editPreferences()
+{
+ statusBar()->message( tr( "Edit preferences..." ) );
+ Preferences *dia = new Preferences( this, 0, TRUE );
+ prefDia = dia;
+ connect( dia->helpButton, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+ dia->buttonColor->setEditor( StyledButton::ColorEditor );
+ dia->buttonPixmap->setEditor( StyledButton::PixmapEditor );
+ dia->groupBoxGrid->setChecked( sGrid );
+ dia->checkBoxSnapGrid->setChecked( snGrid );
+ dia->spinGridX->setValue( grid().x() );
+ dia->spinGridY->setValue( grid().y() );
+ dia->checkBoxWorkspace->setChecked( restoreConfig );
+ dia->checkBoxTextLabels->setChecked( usesTextLabel() );
+ dia->buttonColor->setColor( qworkspace->backgroundColor() );
+ QString pluginPaths = QApplication::libraryPaths().join("\n");
+ dia->textEditPluginPaths->setText(pluginPaths);
+ if ( qworkspace->backgroundPixmap() )
+ dia->buttonPixmap->setPixmap( *qworkspace->backgroundPixmap() );
+ if ( backPix )
+ dia->radioPixmap->setChecked( TRUE );
+ else
+ dia->radioColor->setChecked( TRUE );
+ dia->checkBoxSplash->setChecked( splashScreen );
+ dia->checkAutoEdit->setChecked( !databaseAutoEdit );
+ dia->checkBoxStartDialog->setChecked( shStartDialog );
+ dia->checkBoxAutoSave->setChecked( autoSaveEnabled );
+ int h = autoSaveInterval / 3600;
+ int m = ( autoSaveInterval - h * 3600 ) / 60;
+ int s = autoSaveInterval - ( h * 3600 + m * 60 );
+ QTime t( h, m, s );
+ dia->timeEditAutoSave->setTime( t );
+
+ SenderObject *senderObject = new SenderObject( designerInterface() );
+ QValueList<Tab>::Iterator it;
+ for ( it = preferenceTabs.begin(); it != preferenceTabs.end(); ++it ) {
+ Tab t = *it;
+ dia->tabWidget->addTab( t.w, t.title );
+ if ( t.receiver ) {
+ connect( dia->buttonOk, SIGNAL( clicked() ), senderObject, SLOT( emitAcceptSignal() ) );
+ connect( senderObject, SIGNAL( acceptSignal( QUnknownInterface * ) ), t.receiver, t.accept_slot );
+ connect( senderObject, SIGNAL( initSignal( QUnknownInterface * ) ), t.receiver, t.init_slot );
+ senderObject->emitInitSignal();
+ disconnect( senderObject, SIGNAL( initSignal( QUnknownInterface * ) ), t.receiver, t.init_slot );
+ }
+ }
+
+ if ( dia->exec() == QDialog::Accepted ) {
+ setSnapGrid( dia->checkBoxSnapGrid->isChecked() );
+ setShowGrid( dia->groupBoxGrid->isChecked() );
+ setGrid( QPoint( dia->spinGridX->value(),
+ dia->spinGridY->value() ) );
+ restoreConfig = dia->checkBoxWorkspace->isChecked();
+ setUsesTextLabel( dia->checkBoxTextLabels->isChecked() );
+ if (dia->textEditPluginPaths->isModified()) {
+ pluginPaths = dia->textEditPluginPaths->text();
+ QApplication::setLibraryPaths(QStringList::split("\n", pluginPaths));
+ savePluginPaths = TRUE;
+ }
+
+ if ( dia->radioPixmap->isChecked() && dia->buttonPixmap->pixmap() ) {
+ qworkspace->setBackgroundPixmap( *dia->buttonPixmap->pixmap() );
+ backPix = TRUE;
+ } else {
+ qworkspace->setBackgroundColor( dia->buttonColor->color() );
+ backPix = FALSE;
+ }
+ splashScreen = dia->checkBoxSplash->isChecked();
+ databaseAutoEdit = !dia->checkAutoEdit->isChecked();
+ shStartDialog = dia->checkBoxStartDialog->isChecked();
+ autoSaveEnabled = dia->checkBoxAutoSave->isChecked();
+ QTime time = dia->timeEditAutoSave->time();
+ autoSaveInterval = time.hour() * 3600 + time.minute() * 60 + time.second();
+ if ( autoSaveEnabled )
+ autoSaveTimer->start( autoSaveInterval * 1000 );
+ else
+ autoSaveTimer->stop();
+ }
+ delete senderObject;
+ for ( it = preferenceTabs.begin(); it != preferenceTabs.end(); ++it ) {
+ Tab t = *it;
+ dia->tabWidget->removePage( t.w );
+ t.w->reparent( 0, QPoint(0,0), FALSE );
+ }
+
+ for ( SourceEditor *e = sourceEditors.first(); e; e = sourceEditors.next() )
+ e->configChanged();
+
+ delete dia;
+ prefDia = 0;
+ statusBar()->clear();
+}
+
+void MainWindow::searchFind()
+{
+ if ( !qWorkspace()->activeWindow() ||
+ !::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) )
+ return;
+
+ if ( !findDialog )
+ findDialog = new FindDialog( this, 0, FALSE );
+ findDialog->show();
+ findDialog->raise();
+ findDialog->setEditor( ( (SourceEditor*)qWorkspace()->activeWindow() )->editorInterface(),
+ ( (SourceEditor*)qWorkspace()->activeWindow() )->object() );
+ findDialog->comboFind->setFocus();
+ findDialog->comboFind->lineEdit()->selectAll();
+}
+
+void MainWindow::searchIncremetalFindMenu()
+{
+ incrementalSearch->selectAll();
+ incrementalSearch->setFocus();
+}
+
+void MainWindow::searchIncremetalFind()
+{
+ if ( !qWorkspace()->activeWindow() ||
+ !::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) )
+ return;
+
+ ( (SourceEditor*)qWorkspace()->activeWindow() )->editorInterface()->find( incrementalSearch->text(),
+ FALSE, FALSE, TRUE, FALSE );
+}
+
+void MainWindow::searchIncremetalFindNext()
+{
+ if ( !qWorkspace()->activeWindow() ||
+ !::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) )
+ return;
+
+ ( (SourceEditor*)qWorkspace()->activeWindow() )->editorInterface()->find( incrementalSearch->text(),
+ FALSE, FALSE, TRUE, TRUE );
+}
+
+void MainWindow::searchReplace()
+{
+ if ( !qWorkspace()->activeWindow() ||
+ !::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) )
+ return;
+
+ if ( !replaceDialog )
+ replaceDialog = new ReplaceDialog( this, 0, FALSE );
+ replaceDialog->show();
+ replaceDialog->raise();
+ replaceDialog->setEditor( ( (SourceEditor*)qWorkspace()->activeWindow() )->editorInterface(),
+ ( (SourceEditor*)qWorkspace()->activeWindow() )->object() );
+ replaceDialog->comboFind->setFocus();
+ replaceDialog->comboFind->lineEdit()->selectAll();
+}
+
+void MainWindow::searchGotoLine()
+{
+ if ( !qWorkspace()->activeWindow() ||
+ !::qt_cast<SourceEditor*>(qWorkspace()->activeWindow()) )
+ return;
+
+ if ( !gotoLineDialog )
+ gotoLineDialog = new GotoLineDialog( this, 0, FALSE );
+ gotoLineDialog->show();
+ gotoLineDialog->raise();
+ gotoLineDialog->setEditor( ( (SourceEditor*)qWorkspace()->activeWindow() )->editorInterface() );
+ gotoLineDialog->spinLine->setFocus();
+ gotoLineDialog->spinLine->setMinValue( 1 );
+ gotoLineDialog->spinLine->setMaxValue( ( (SourceEditor*)qWorkspace()->activeWindow() )->numLines() );
+ gotoLineDialog->spinLine->selectAll();
+}
+
+void MainWindow::toolsCustomWidget()
+{
+ statusBar()->message( tr( "Edit custom widgets..." ) );
+ CustomWidgetEditor edit( this, this );
+ edit.exec();
+ rebuildCustomWidgetGUI();
+ statusBar()->clear();
+}
+
+void MainWindow::toolsConfigure()
+{
+ ConfigToolboxDialog dlg( this );
+ if ( dlg.exec() != QDialog::Accepted )
+ return;
+ rebuildCommonWidgetsToolBoxPage();
+}
+
+void MainWindow::showStartDialog()
+{
+ if ( singleProjectMode() )
+ return;
+ for ( int i = 1; i < qApp->argc(); ++i ) {
+ QString arg = qApp->argv()[i];
+ if ( arg[0] != '-' )
+ return;
+ }
+ StartDialog *sd = new StartDialog( this, templatePath() );
+ sd->setRecentlyFiles( recentlyFiles );
+ sd->setRecentlyProjects( recentlyProjects );
+ sd->exec();
+ shStartDialog = sd->showDialogInFuture();
+}
diff --git a/tools/designer/designer/menubareditor.cpp b/tools/designer/designer/menubareditor.cpp
new file mode 100644
index 0000000..d26d5d3
--- /dev/null
+++ b/tools/designer/designer/menubareditor.cpp
@@ -0,0 +1,1134 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qaction.h>
+#include <qapplication.h>
+#include <qbitmap.h>
+#include <qdragobject.h>
+#include <qlineedit.h>
+#include <qmainwindow.h>
+#include <qpainter.h>
+#include <qstyle.h>
+#include "command.h"
+#include "formwindow.h"
+#include "menubareditor.h"
+#include "popupmenueditor.h"
+
+extern void find_accel( const QString &txt, QMap<QChar, QWidgetList > &accels, QWidget *w );
+
+// Drag Object Declaration -------------------------------------------
+
+class MenuBarEditorItemPtrDrag : public QStoredDrag
+{
+public:
+ MenuBarEditorItemPtrDrag( MenuBarEditorItem * item,
+ QWidget * parent = 0,
+ const char * name = 0 );
+ ~MenuBarEditorItemPtrDrag() {};
+ static bool canDecode( QDragMoveEvent * e );
+ static bool decode( QDropEvent * e, MenuBarEditorItem ** i );
+};
+
+// Drag Object Implementation ---------------------------------------
+
+MenuBarEditorItemPtrDrag::MenuBarEditorItemPtrDrag( MenuBarEditorItem * item,
+ QWidget * parent,
+ const char * name )
+ : QStoredDrag( "qt/menubareditoritemptr", parent, name )
+{
+ QByteArray data( sizeof( Q_LONG ) );
+ QDataStream stream( data, IO_WriteOnly );
+ stream << ( Q_LONG ) item;
+ setEncodedData( data );
+}
+
+bool MenuBarEditorItemPtrDrag::canDecode( QDragMoveEvent * e )
+{
+ return e->provides( "qt/menubareditoritemptr" );
+}
+
+bool MenuBarEditorItemPtrDrag::decode( QDropEvent * e, MenuBarEditorItem ** i )
+{
+ QByteArray data = e->encodedData( "qt/menubareditoritemptr" );
+ QDataStream stream( data, IO_ReadOnly );
+
+ if ( !data.size() )
+ return FALSE;
+
+ Q_LONG p = 0;
+ stream >> p;
+ *i = ( MenuBarEditorItem *) p;
+
+ return TRUE;
+}
+
+// MenuBarEditorItem ---------------------------------------------------
+
+MenuBarEditorItem::MenuBarEditorItem( MenuBarEditor * bar, QObject * parent, const char * name )
+ : QObject( parent, name ),
+ menuBar( bar ),
+ popupMenu( 0 ),
+ visible( TRUE ),
+ separator( FALSE ),
+ removable( FALSE )
+{ }
+
+MenuBarEditorItem::MenuBarEditorItem( PopupMenuEditor * menu, MenuBarEditor * bar,
+ QObject * parent, const char * name )
+ : QObject( parent, name ),
+ menuBar( bar ),
+ popupMenu( menu ),
+ visible( TRUE ),
+ separator( FALSE ),
+ removable( TRUE )
+{
+ text = menu->name();
+}
+
+MenuBarEditorItem::MenuBarEditorItem( QActionGroup * actionGroup, MenuBarEditor * bar,
+ QObject * parent, const char * name )
+ : QObject( parent, name ),
+ menuBar( bar ),
+ popupMenu( 0 ),
+ visible( TRUE ),
+ separator( FALSE ),
+ removable( TRUE )
+{
+ text = actionGroup->menuText();
+ popupMenu = new PopupMenuEditor( menuBar->formWindow(), menuBar );
+ popupMenu->insert( actionGroup );
+}
+
+MenuBarEditorItem::MenuBarEditorItem( MenuBarEditorItem * item, QObject * parent, const char * name )
+ : QObject( parent, name ),
+ menuBar( item->menuBar ),
+ popupMenu( 0 ),
+ text( item->text ),
+ visible( item->visible ),
+ separator( item->separator ),
+ removable( item->removable )
+{
+ popupMenu = new PopupMenuEditor( menuBar->formWindow(), item->popupMenu, menuBar );
+}
+
+// MenuBarEditor --------------------------------------------------------
+
+int MenuBarEditor::clipboardOperation = 0;
+MenuBarEditorItem * MenuBarEditor::clipboardItem = 0;
+
+MenuBarEditor::MenuBarEditor( FormWindow * fw, QWidget * parent, const char * name )
+ : QMenuBar( parent, name ),
+ formWnd( fw ),
+ draggedItem( 0 ),
+ currentIndex( 0 ),
+ itemHeight( 0 ),
+ separatorWidth( 32 ),
+ hideWhenEmpty( TRUE ),
+ hasSeparator( FALSE )
+{
+ setAcceptDrops( TRUE );
+ setFocusPolicy( StrongFocus );
+
+ addItem.setMenuText( tr("new menu") );
+ addSeparator.setMenuText( tr("new separator") );
+
+ lineEdit = new QLineEdit( this, "menubar lineedit" );
+ lineEdit->hide();
+ lineEdit->setFrameStyle(QFrame::Plain | QFrame::NoFrame);
+ lineEdit->polish();
+ lineEdit->setBackgroundMode(PaletteButton);
+ lineEdit->setBackgroundOrigin(ParentOrigin);
+ lineEdit->installEventFilter( this );
+
+ dropLine = new QWidget( this, "menubar dropline", Qt::WStyle_NoBorder | WStyle_StaysOnTop );
+ dropLine->setBackgroundColor( Qt::red );
+ dropLine->hide();
+
+ setMinimumHeight( fontMetrics().height() + 2 * borderSize() );
+}
+
+MenuBarEditor::~MenuBarEditor()
+{
+ itemList.setAutoDelete( TRUE );
+}
+
+FormWindow * MenuBarEditor::formWindow()
+{
+ return formWnd;
+}
+
+MenuBarEditorItem * MenuBarEditor::createItem( int index, bool addToCmdStack )
+{
+ MenuBarEditorItem * i =
+ new MenuBarEditorItem( new PopupMenuEditor( formWnd, ( QWidget * ) parent() ), this );
+ if ( addToCmdStack ) {
+ AddMenuCommand * cmd = new AddMenuCommand( "Add Menu", formWnd, this, i, index );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ } else {
+ AddMenuCommand cmd( "Add Menu", formWnd, this, i, index );
+ cmd.execute();
+ }
+ return i;
+}
+
+void MenuBarEditor::insertItem( MenuBarEditorItem * item, int index )
+{
+ item->menu()->parentMenu = this;
+
+ if ( index != -1 )
+ itemList.insert( index, item );
+ else
+ itemList.append( item );
+
+ if ( hideWhenEmpty && itemList.count() == 1 )
+ show(); // calls resizeInternals();
+ else
+ resizeInternals();
+
+ if ( isVisible() )
+ update();
+}
+
+void MenuBarEditor::insertItem( QString text, PopupMenuEditor * menu, int index )
+{
+ MenuBarEditorItem * item = new MenuBarEditorItem( menu, this );
+ if ( !text.isNull() )
+ item->setMenuText( text );
+ insertItem( item, index );
+}
+
+void MenuBarEditor::insertItem( QString text, QActionGroup * group, int index )
+{
+ MenuBarEditorItem * item = new MenuBarEditorItem( group, this );
+ if ( !text.isNull() )
+ item->setMenuText( text );
+ insertItem( item, index );
+}
+
+
+void MenuBarEditor::insertSeparator( int index )
+{
+ if ( hasSeparator )
+ return;
+
+ MenuBarEditorItem * i = createItem( index );
+ i->setSeparator( TRUE );
+ i->setMenuText( "separator" );
+ hasSeparator = TRUE;
+}
+
+void MenuBarEditor::removeItemAt( int index )
+{
+ removeItem( item( index ) );
+}
+
+void MenuBarEditor::removeItem( MenuBarEditorItem * item )
+{
+ if ( item &&
+ item->isRemovable() &&
+ itemList.removeRef( item ) ) {
+
+ if ( item->isSeparator() )
+ hasSeparator = FALSE;
+
+ if ( hideWhenEmpty && itemList.count() == 0 )
+ hide();
+ else
+ resizeInternals();
+
+ int n = count() + 1;
+ if ( currentIndex >= n )
+ currentIndex = n;
+
+ if ( isVisible() )
+ update();
+ }
+}
+
+int MenuBarEditor::findItem( MenuBarEditorItem * item )
+{
+ return itemList.findRef( item );
+}
+
+int MenuBarEditor::findItem( PopupMenuEditor * menu )
+{
+ MenuBarEditorItem * i = itemList.first();
+
+ while ( i ) {
+ if ( i->menu() == menu )
+ return itemList.at();
+ i = itemList.next();
+ }
+
+ return -1;
+}
+
+int MenuBarEditor::findItem( QPoint & pos )
+{
+ int x = borderSize();
+ int dx = 0;
+ int y = 0;
+ int w = width();
+ QSize s;
+ QRect r;
+
+ MenuBarEditorItem * i = itemList.first();
+
+ while ( i ) {
+
+ if ( i->isVisible() ) {
+
+ s = itemSize( i );
+ dx = s.width();
+
+ if ( x + dx > w && x > borderSize() ) {
+ y += itemHeight;
+ x = borderSize();
+ }
+
+ r = QRect( x, y, s.width(), s.height() );
+
+ if ( r.contains( pos ) )
+ return itemList.at();
+
+ addItemSizeToCoords( i, x, y, w );
+ }
+
+ i = itemList.next();
+ }
+
+ // check add item
+ s = itemSize( &addItem );
+ dx = s.width();
+
+ if ( x + dx > w && x > borderSize() ) {
+ y += itemHeight;
+ x = borderSize();
+ }
+
+ r = QRect( x, y, s.width(), s.height() );
+
+ if ( r.contains( pos ) )
+ return itemList.count();
+
+ return itemList.count() + 1;
+}
+
+MenuBarEditorItem * MenuBarEditor::item( int index )
+{
+ if ( index == -1 )
+ return itemList.at( currentIndex );
+
+ int c = itemList.count();
+ if ( index == c )
+ return &addItem;
+ else if ( index > c )
+ return &addSeparator;
+
+ return itemList.at( index );
+}
+
+int MenuBarEditor::count()
+{
+ return itemList.count();
+}
+
+int MenuBarEditor::current()
+{
+ return currentIndex;
+}
+
+void MenuBarEditor::cut( int index )
+{
+ if ( clipboardItem && clipboardOperation == Cut )
+ delete clipboardItem;
+
+ clipboardOperation = Cut;
+ clipboardItem = itemList.at( index );
+
+ if ( clipboardItem == &addItem || clipboardItem == &addSeparator ) {
+ clipboardOperation = None;
+ clipboardItem = 0;
+ return; // do nothing
+ }
+
+ RemoveMenuCommand * cmd = new RemoveMenuCommand( "Cut Menu", formWnd, this, index );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void MenuBarEditor::copy( int index )
+{
+ if ( clipboardItem && clipboardOperation == Cut )
+ delete clipboardItem;
+
+ clipboardOperation = Copy;
+ clipboardItem = itemList.at( index );
+
+ if ( clipboardItem == &addItem || clipboardItem == &addSeparator ) {
+ clipboardOperation = None;
+ clipboardItem = 0;
+ }
+}
+
+void MenuBarEditor::paste( int index )
+{
+ if ( clipboardItem && clipboardOperation ) {
+ MenuBarEditorItem * i = new MenuBarEditorItem( clipboardItem );
+ AddMenuCommand * cmd = new AddMenuCommand( "Paste Menu", formWnd, this, i, index );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+}
+
+void MenuBarEditor::exchange( int a, int b )
+{
+ MenuBarEditorItem * ia = itemList.at( a );
+ MenuBarEditorItem * ib = itemList.at( b );
+ if ( !ia || !ib ||
+ ia == &addItem || ia == &addSeparator ||
+ ib == &addItem || ib == &addSeparator )
+ return; // do nothing
+ itemList.replace( b, ia );
+ itemList.replace( a, ib );
+}
+
+void MenuBarEditor::showLineEdit( int index )
+{
+ if ( index == -1 )
+ index = currentIndex;
+
+ MenuBarEditorItem * i = 0;
+
+ if ( (uint) index >= itemList.count() )
+ i = &addItem;
+ else
+ i = itemList.at( index );
+
+ if ( i && i->isSeparator() )
+ return;
+
+ // open edit field for item name
+ lineEdit->setText( i->menuText() );
+ lineEdit->selectAll();
+ QPoint pos = itemPos( index );
+ lineEdit->move( pos.x() + borderSize(), pos.y() - ( borderSize() / 2 ) );
+ lineEdit->resize( itemSize( i ) );
+ lineEdit->show();
+ lineEdit->setFocus();
+}
+
+void MenuBarEditor::showItem( int index )
+{
+ if ( index == -1 )
+ index = currentIndex;
+
+ if ( (uint)index < itemList.count() ) {
+ MenuBarEditorItem * i = itemList.at( index );
+ if ( i->isSeparator() || draggedItem )
+ return;
+ PopupMenuEditor * m = i->menu();
+ QPoint pos = itemPos( index );
+ m->move( pos.x(), pos.y() + itemHeight - 1 );
+ m->raise();
+ m->show();
+ setFocus();
+ }
+}
+
+void MenuBarEditor::hideItem( int index )
+{
+ if ( index == -1 )
+ index = currentIndex;
+
+ if ( (uint)index < itemList.count() ) {
+ PopupMenuEditor * m = itemList.at( index )->menu();
+ m->hideSubMenu();
+ m->hide();
+ }
+}
+
+void MenuBarEditor::focusItem( int index )
+{
+ if ( index == -1 )
+ index = currentIndex;
+
+ if ( (uint)index < itemList.count() ) {
+ PopupMenuEditor * m = itemList.at( index )->menu();
+ m->setFocus();
+ m->update();
+ update();
+ }
+}
+
+void MenuBarEditor::deleteItem( int index )
+{
+ if ( index == -1 )
+ index = currentIndex;
+
+ if ( (uint)index < itemList.count() ) {
+ RemoveMenuCommand * cmd = new RemoveMenuCommand( "Delete Menu",
+ formWnd,
+ this,
+ currentIndex );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+}
+
+QSize MenuBarEditor::sizeHint() const
+{
+ return QSize( parentWidget()->width(), heightForWidth( parentWidget()->width() ) );
+}
+
+int MenuBarEditor::heightForWidth( int max_width ) const
+{
+ MenuBarEditor * that = ( MenuBarEditor * ) this;
+ int x = borderSize();
+ int y = 0;
+
+ QPainter p( this );
+ that->itemHeight = that->itemSize( &(that->addItem) ).height();
+
+ MenuBarEditorItem * i = that->itemList.first();
+ while ( i ) {
+ if ( i->isVisible() )
+ that->addItemSizeToCoords( i, x, y, max_width );
+ i = that->itemList.next();
+ }
+
+ that->addItemSizeToCoords( &(that->addItem), x, y, max_width );
+ that->addItemSizeToCoords( &(that->addSeparator), x, y, max_width );
+
+ return y + itemHeight;
+}
+
+void MenuBarEditor::show()
+{
+ QWidget::show();
+ resizeInternals();
+
+ QResizeEvent e( parentWidget()->size(), parentWidget()->size() );
+ QApplication::sendEvent( parentWidget(), &e );
+}
+
+void MenuBarEditor::checkAccels( QMap<QChar, QWidgetList > &accels )
+{
+ QString t;
+ MenuBarEditorItem * i = itemList.first();
+ while ( i ) {
+ t = i->menuText();
+ find_accel( t, accels, this );
+ // do not check the accelerators in the popup menus
+ i = itemList.next();
+ }
+}
+
+// public slots
+
+void MenuBarEditor::cut()
+{
+ cut( currentIndex );
+}
+
+void MenuBarEditor::copy()
+{
+ copy( currentIndex );
+}
+
+void MenuBarEditor::paste()
+{
+ paste( currentIndex );
+}
+
+// protected
+
+bool MenuBarEditor::eventFilter( QObject * o, QEvent * e )
+{
+ if ( o == lineEdit && e->type() == QEvent::FocusOut ) {
+ leaveEditMode();
+ lineEdit->hide();
+ update();
+ } else if ( e->type() == QEvent::LayoutHint ) {
+ resize( sizeHint() );
+ }
+ return QMenuBar::eventFilter( o, e );
+}
+
+void MenuBarEditor::paintEvent( QPaintEvent * )
+{
+ QPainter p( this );
+ QRect r = rect();
+ style().drawPrimitive( QStyle::PE_PanelMenuBar, &p,
+ r, colorGroup() );
+ drawItems( p );
+}
+
+void MenuBarEditor::mousePressEvent( QMouseEvent * e )
+{
+ mousePressPos = e->pos();
+ hideItem();
+ lineEdit->hide();
+ currentIndex = findItem( mousePressPos );
+ showItem();
+ update();
+ e->accept();
+}
+
+void MenuBarEditor::mouseDoubleClickEvent( QMouseEvent * e )
+{
+ mousePressPos = e->pos();
+ currentIndex = findItem( mousePressPos );
+ lineEdit->hide();
+ if ( currentIndex > (int)itemList.count() ) {
+ insertSeparator();
+ update();
+ } else {
+ showLineEdit();
+ }
+}
+
+void MenuBarEditor::mouseMoveEvent( QMouseEvent * e )
+{
+ if ( e->state() & Qt::LeftButton ) {
+ if ( ( e->pos() - mousePressPos ).manhattanLength() > 3 ) {
+ bool itemCreated = FALSE;
+ bool isSeparator = FALSE;
+ draggedItem = item( findItem( mousePressPos ) );
+ if ( draggedItem == &addItem ) {
+ draggedItem = createItem();
+ itemCreated = TRUE;
+ } else if ( draggedItem == &addSeparator ) {
+ if (hasSeparator) // we can only have one separator
+ return;
+ draggedItem = createItem();
+ draggedItem->setSeparator( TRUE );
+ draggedItem->setMenuText( "separator" );
+ isSeparator = TRUE;
+ itemCreated = TRUE;
+ } else {
+ isSeparator = draggedItem->isSeparator();
+ }
+
+ MenuBarEditorItemPtrDrag * d =
+ new MenuBarEditorItemPtrDrag( draggedItem, this );
+ d->setPixmap( createTextPixmap( draggedItem->menuText() ) );
+ hideItem();
+ draggedItem->setVisible( FALSE );
+ update();
+
+ // If the item is dropped in the same list,
+ // we will have two instances of the same pointer
+ // in the list.
+ itemList.find( draggedItem );
+ QLNode * node = itemList.currentNode();
+ dropConfirmed = FALSE;
+ d->dragCopy(); // dragevents and stuff happens
+ if ( draggedItem ) { // item was not dropped
+ if ( itemCreated ) {
+ removeItem( draggedItem );
+ } else {
+ hideItem();
+ draggedItem->setVisible( TRUE );
+ draggedItem = 0;
+ showItem();
+ }
+ } else if ( dropConfirmed ) { // item was dropped
+ dropConfirmed = FALSE;
+ hideItem();
+ itemList.takeNode( node )->setVisible( TRUE );
+ hasSeparator = isSeparator || hasSeparator;
+ showItem();
+ } else {
+ hasSeparator = isSeparator || hasSeparator;
+ }
+ update();
+ }
+ }
+}
+
+void MenuBarEditor::dragEnterEvent( QDragEnterEvent * e )
+{
+ if ( MenuBarEditorItemPtrDrag::canDecode( e ) ) {
+ e->accept();
+ dropLine->show();
+ }
+}
+
+void MenuBarEditor::dragLeaveEvent( QDragLeaveEvent * )
+{
+ dropLine->hide();
+}
+
+void MenuBarEditor::dragMoveEvent( QDragMoveEvent * e )
+{
+
+ QPoint pos = e->pos();
+ dropLine->move( snapToItem( pos ) );
+
+ int idx = findItem( pos );
+ if ( currentIndex != idx ) {
+ hideItem();
+ currentIndex = idx;
+ showItem();
+ }
+}
+
+void MenuBarEditor::dropEvent( QDropEvent * e )
+{
+ MenuBarEditorItem * i = 0;
+
+ if ( MenuBarEditorItemPtrDrag::decode( e, &i ) ) {
+ draggedItem = 0;
+ hideItem();
+ dropInPlace( i, e->pos() );
+ e->accept();
+ }
+
+ dropLine->hide();
+}
+
+void MenuBarEditor::keyPressEvent( QKeyEvent * e )
+{
+ if ( lineEdit->isHidden() ) { // In navigation mode
+ switch ( e->key() ) {
+
+ case Qt::Key_Delete:
+ hideItem();
+ deleteItem();
+ showItem();
+ break;
+
+ case Qt::Key_Left:
+ e->accept();
+ navigateLeft( e->state() & Qt::ControlButton );
+ return;
+
+ case Qt::Key_Right:
+ e->accept();
+ navigateRight( e->state() & Qt::ControlButton );
+ return; // no update
+
+ case Qt::Key_Down:
+ e->accept();
+ focusItem();
+ return; // no update
+
+ case Qt::Key_PageUp:
+ currentIndex = 0;
+ break;
+
+ case Qt::Key_PageDown:
+ currentIndex = itemList.count();
+ break;
+
+ case Qt::Key_Enter:
+ case Qt::Key_Return:
+ case Qt::Key_F2:
+ e->accept();
+ enterEditMode();
+ return; // no update
+
+ case Qt::Key_Up:
+ case Qt::Key_Alt:
+ case Qt::Key_Shift:
+ case Qt::Key_Control:
+ case Qt::Key_Escape:
+ e->ignore();
+ setFocus(); // FIXME: this is because some other widget get the focus when CTRL is pressed
+ return; // no update
+
+ case Qt::Key_C:
+ if ( e->state() & Qt::ControlButton && currentIndex < (int)itemList.count() ) {
+ copy( currentIndex );
+ break;
+ }
+
+ case Qt::Key_X:
+ if ( e->state() & Qt::ControlButton && currentIndex < (int)itemList.count() ) {
+ hideItem();
+ cut( currentIndex );
+ showItem();
+ break;
+ }
+
+ case Qt::Key_V:
+ if ( e->state() & Qt::ControlButton ) {
+ hideItem();
+ paste( currentIndex < (int)itemList.count() ? currentIndex + 1: itemList.count() );
+ showItem();
+ break;
+ }
+
+ default:
+ if ( e->ascii() >= 32 || e->ascii() == 0 ) {
+ showLineEdit();
+ QApplication::sendEvent( lineEdit, e );
+ e->accept();
+ } else {
+ e->ignore();
+ }
+ return;
+ }
+ } else { // In edit mode
+
+ switch ( e->key() ) {
+ case Qt::Key_Control:
+ e->ignore();
+ return;
+ case Qt::Key_Enter:
+ case Qt::Key_Return:
+ leaveEditMode();
+ case Qt::Key_Escape:
+ lineEdit->hide();
+ setFocus();
+ break;
+ }
+ }
+ e->accept();
+ update();
+}
+
+void MenuBarEditor::focusOutEvent( QFocusEvent * e )
+{
+ QWidget * fw = qApp->focusWidget();
+ if ( e->lostFocus() && !::qt_cast<PopupMenuEditor*>(fw) )
+ hideItem();
+ update();
+}
+
+void MenuBarEditor::resizeInternals()
+{
+ dropLine->resize( 2, itemHeight );
+ updateGeometry();
+}
+
+void MenuBarEditor::drawItems( QPainter & p )
+{
+ QPoint pos( borderSize(), 0 );
+ uint c = 0;
+
+ p.setPen( colorGroup().buttonText() );
+
+ MenuBarEditorItem * i = itemList.first();
+ while ( i ) {
+ if ( i->isVisible() )
+ drawItem( p, i, c++, pos ); // updates x y
+ i = itemList.next();
+ }
+
+ p.setPen( darkBlue );
+ drawItem( p, &addItem, c++, pos );
+ if ( !hasSeparator )
+ drawItem( p, &addSeparator, c, pos );
+}
+
+void MenuBarEditor::drawItem( QPainter & p,
+ MenuBarEditorItem * i,
+ int idx,
+ QPoint & pos )
+{
+ int w = itemSize( i ).width();
+
+ // If the item passes the right border, and it is not the first item on the line
+ if ( pos.x() + w > width() && pos.x() > borderSize() ) { // wrap
+ pos.ry() += itemHeight;
+ pos.setX( borderSize() );
+ }
+
+ if ( i->isSeparator() ) {
+ drawSeparator( p, pos );
+ } else {
+ int flags = QPainter::AlignLeft | QPainter::AlignVCenter |
+ Qt::ShowPrefix | Qt::SingleLine;
+ p.drawText( pos.x() + borderSize(), pos.y(), w - borderSize(), itemHeight,
+ flags, i->menuText() );
+ }
+
+ if ( hasFocus() && idx == currentIndex && !draggedItem )
+ p.drawWinFocusRect( pos.x(), pos.y() + 1, w, itemHeight - 2 );
+
+ pos.rx() += w;
+}
+
+void MenuBarEditor::drawSeparator( QPainter & p, QPoint & pos )
+{
+ p.save();
+ p.setPen( darkBlue );
+
+ int left = pos.x();
+ int top = pos.y() + 2;
+ int right = left + separatorWidth - 1;
+ int bottom = pos.y() + itemHeight - 4;
+
+ p.drawLine( left, top, left, bottom );
+ p.drawLine( right, top, right, bottom );
+
+ p.fillRect( left, pos.y() + borderSize() * 2,
+ separatorWidth - 1, itemHeight - borderSize() * 4,
+ QBrush( darkBlue, Qt::Dense5Pattern ) );
+
+ p.restore();
+}
+
+QSize MenuBarEditor::itemSize( MenuBarEditorItem * i )
+{
+ if ( i->isSeparator() )
+ return QSize( separatorWidth, itemHeight );
+ QRect r = fontMetrics().boundingRect( i->menuText().remove( "&") );
+ return QSize( r.width() + borderSize() * 2, r.height() + borderSize() * 4 );
+}
+
+void MenuBarEditor::addItemSizeToCoords( MenuBarEditorItem * i, int & x, int & y, int w )
+{
+ int dx = itemSize( i ).width();
+ if ( x + dx > w && x > borderSize() ) {
+ y += itemHeight;
+ x = borderSize();
+ }
+ x += dx;
+}
+
+QPoint MenuBarEditor::itemPos( int index )
+{
+ int x = borderSize();
+ int y = 0;
+ int w = width();
+ int dx = 0;
+ int c = 0;
+
+ MenuBarEditorItem * i = itemList.first();
+
+ while ( i ) {
+ if ( i->isVisible() ) {
+ dx = itemSize( i ).width();
+ if ( x + dx > w && x > borderSize() ) {
+ y += itemHeight;
+ x = borderSize();
+ }
+ if ( c == index )
+ return QPoint( x, y );
+ x += dx;
+ c++;
+ }
+ i = itemList.next();
+ }
+ dx = itemSize( &addItem ).width();
+ if ( x + dx > width() && x > borderSize() ) {
+ y += itemHeight;
+ x = borderSize();
+ }
+
+ return QPoint( x, y );
+}
+
+QPoint MenuBarEditor::snapToItem( const QPoint & pos )
+{
+ int x = borderSize();
+ int y = 0;
+ int dx = 0;
+
+ MenuBarEditorItem * n = itemList.first();
+
+ while ( n ) {
+ if ( n->isVisible() ) {
+ dx = itemSize( n ).width();
+ if ( x + dx > width() && x > borderSize() ) {
+ y += itemHeight;
+ x = borderSize();
+ }
+ if ( pos.y() > y &&
+ pos.y() < y + itemHeight &&
+ pos.x() < x + dx / 2 ) {
+ return QPoint( x, y );
+ }
+ x += dx;
+ }
+ n = itemList.next();
+ }
+
+ return QPoint( x, y );
+}
+
+void MenuBarEditor::dropInPlace( MenuBarEditorItem * i, const QPoint & pos )
+{
+ int x = borderSize();
+ int y = 0;
+ int dx = 0;
+ int idx = 0;
+
+ MenuBarEditorItem * n = itemList.first();
+
+ while ( n ) {
+ if ( n->isVisible() ) {
+ dx = itemSize( n ).width();
+ if ( x + dx > width() && x > borderSize() ) {
+ y += itemHeight;
+ x = borderSize();
+ }
+ if ( pos.y() > y &&
+ pos.y() < y + itemHeight &&
+ pos.x() < x + dx / 2 )
+ break;
+ x += dx;
+ }
+ n = itemList.next();
+ idx++;
+ }
+
+ hideItem();
+ Command * cmd = 0;
+ int iidx = itemList.findRef( i );
+ if ( iidx != -1 ) { // internal dnd
+ cmd = new MoveMenuCommand( "Item Dragged", formWnd, this, iidx, idx );
+ item( iidx )->setVisible( TRUE );
+ } else {
+ cmd = new AddMenuCommand( "Add Menu", formWnd, this, i, idx );
+ dropConfirmed = TRUE; // let mouseMoveEvent set the item visible
+ }
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ currentIndex = ( iidx >= 0 && iidx < idx ) ? idx - 1 : idx;
+ showItem();
+}
+
+
+void MenuBarEditor::safeDec()
+{
+ do {
+ currentIndex--;
+ } while ( currentIndex > 0 && !( item( currentIndex )->isVisible() ) );
+}
+
+void MenuBarEditor::safeInc()
+{
+ int max = (int)itemList.count();
+ if ( !hasSeparator )
+ max += 1;
+ if ( currentIndex < max ) {
+ do {
+ currentIndex++;
+ // skip invisible items
+ } while ( currentIndex < max && !( item( currentIndex )->isVisible() ) );
+ }
+}
+
+void MenuBarEditor::navigateLeft( bool ctrl )
+{
+ // FIXME: handle invisible items
+ if ( currentIndex > 0 ) {
+ hideItem();
+ if ( ctrl ) {
+ ExchangeMenuCommand * cmd = new ExchangeMenuCommand( "Move Menu Left",
+ formWnd,
+ this,
+ currentIndex,
+ currentIndex - 1 );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ safeDec();
+ } else {
+ safeDec();
+ }
+ showItem();
+ }
+ update();
+}
+
+void MenuBarEditor::navigateRight( bool ctrl )
+{
+// FIXME: handle invisible items
+ hideItem();
+ if ( ctrl ) {
+ if ( currentIndex < ( (int)itemList.count() - 1 ) ) {
+ ExchangeMenuCommand * cmd = new ExchangeMenuCommand( "Move Menu Right",
+ formWnd,
+ this,
+ currentIndex,
+ currentIndex + 1 );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ safeInc();
+ }
+ } else {
+ safeInc();
+ }
+ showItem();
+ update();
+}
+
+void MenuBarEditor::enterEditMode()
+{
+ if ( currentIndex > (int)itemList.count() ) {
+ insertSeparator();
+ } else {
+ showLineEdit();
+ }
+}
+
+void MenuBarEditor::leaveEditMode()
+{
+ MenuBarEditorItem * i = 0;
+ if ( currentIndex >= (int)itemList.count() ) {
+ i = createItem();
+ // do not put rename on cmd stack
+ RenameMenuCommand rename( "Rename Menu", formWnd, this, lineEdit->text(), i );
+ rename.execute();
+ } else {
+ i = itemList.at( currentIndex );
+ RenameMenuCommand * cmd =
+ new RenameMenuCommand( "Rename Menu", formWnd, this, lineEdit->text(), i );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+ showItem();
+}
+
+QPixmap MenuBarEditor::createTextPixmap( const QString &text )
+{
+ QSize sz( fontMetrics().boundingRect( text ).size() );
+ QPixmap pix( sz.width() + 20, sz.height() * 2 );
+ pix.fill( white );
+ QPainter p( &pix, this );
+ p.drawText( 2, 0, pix.width(), pix.height(), 0, text );
+ p.end();
+ QBitmap bm( pix.size() );
+ bm.fill( color0 );
+ p.begin( &bm );
+ p.setPen( color1 );
+ p.drawText( 2, 0, pix.width(), pix.height(), 0, text );
+ p.end();
+ pix.setMask( bm );
+ return pix;
+}
diff --git a/tools/designer/designer/menubareditor.h b/tools/designer/designer/menubareditor.h
new file mode 100644
index 0000000..59af1b4
--- /dev/null
+++ b/tools/designer/designer/menubareditor.h
@@ -0,0 +1,205 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef MENUBAREDITOR_H
+#define MENUBAREDITOR_H
+
+#include <qmenubar.h>
+#include <qptrlist.h>
+
+class PopupMenuEditor;
+class MenuBarEditor;
+class QActionGroup;
+
+class MenuBarEditorItem : public QObject
+{
+ Q_OBJECT
+
+ friend class MenuBarEditor;
+
+ MenuBarEditorItem( MenuBarEditor * bar = 0, QObject * parent = 0, const char * name = 0 );
+
+public:
+ MenuBarEditorItem( PopupMenuEditor * menu, MenuBarEditor * bar,
+ QObject * parent = 0, const char * name = 0);
+ MenuBarEditorItem( QActionGroup * actionGroup, MenuBarEditor * bar,
+ QObject * parent = 0, const char * name = 0);
+ MenuBarEditorItem( MenuBarEditorItem * item,
+ QObject * parent = 0, const char * name = 0);
+ ~MenuBarEditorItem() { };
+
+ PopupMenuEditor * menu() { return popupMenu; }
+
+ void setMenuText( const QString t ) { text = t; };
+ QString menuText() { return text; }
+
+ void setVisible( bool enable ) { visible = enable; }
+ bool isVisible() { return visible; }
+
+ void setRemovable( bool enable ) { removable = enable; }
+ bool isRemovable() { return removable; }
+
+ bool isSeparator() { return separator; }
+protected:
+ void setSeparator( bool enable ) { separator = enable; }
+
+private:
+ MenuBarEditor * menuBar;
+ PopupMenuEditor * popupMenu;
+ QString text;
+ uint visible : 1;
+ uint separator : 1;
+ uint removable : 1;
+};
+
+class QLineEdit;
+class FormWindow;
+
+class MenuBarEditor : public QMenuBar
+{
+ Q_OBJECT
+
+public:
+ MenuBarEditor( FormWindow * fw, QWidget * parent = 0, const char * name = 0 );
+ ~MenuBarEditor();
+
+ FormWindow * formWindow();
+
+ MenuBarEditorItem * createItem( int index = -1, bool addToCmdStack = TRUE );
+ void insertItem( MenuBarEditorItem * item, int index = -1 );
+ void insertItem( QString text, PopupMenuEditor * menu, int index = -1 );
+ void insertItem( QString text, QActionGroup * group, int index = -1 );
+
+ void insertSeparator( int index = -1 );
+
+ void removeItemAt( int index );
+ void removeItem( MenuBarEditorItem * item );
+
+ int findItem( MenuBarEditorItem * item );
+ int findItem( PopupMenuEditor * menu );
+ int findItem( QPoint & pos );
+
+ MenuBarEditorItem * item( int index = -1 );
+
+ int count();
+ int current();
+
+ void cut( int index );
+ void copy( int index );
+ void paste( int index );
+ void exchange( int a, int b );
+
+ void showLineEdit( int index = -1);
+ void showItem( int index = -1 );
+ void hideItem( int index = -1 );
+ void focusItem( int index = -1 );
+ void deleteItem( int index = -1 );
+
+ QSize sizeHint() const;
+ QSize minimumSize() const { return sizeHint(); }
+ QSize minimumSizeHint() const { return sizeHint(); }
+ int heightForWidth( int max_width ) const;
+
+ void show();
+
+ void checkAccels( QMap<QChar, QWidgetList > &accels );
+
+public slots:
+ void cut();
+ void copy();
+ void paste();
+
+protected:
+ bool eventFilter( QObject * o, QEvent * e );
+ void paintEvent( QPaintEvent * e );
+ void mousePressEvent( QMouseEvent * e );
+ void mouseDoubleClickEvent( QMouseEvent * e );
+ void mouseMoveEvent( QMouseEvent * e );
+ void dragEnterEvent( QDragEnterEvent * e );
+ void dragLeaveEvent( QDragLeaveEvent * e );
+ void dragMoveEvent( QDragMoveEvent * e );
+ void dropEvent( QDropEvent * e );
+ void keyPressEvent( QKeyEvent * e );
+ void focusOutEvent( QFocusEvent * e );
+ void resizeEvent( QResizeEvent * e ) { QFrame::resizeEvent( e ); }
+
+ void resizeInternals();
+
+ void drawItems( QPainter & p );
+ void drawItem( QPainter & p, MenuBarEditorItem * i, int idx, QPoint & pos );
+ void drawSeparator( QPainter & p, QPoint & pos );
+
+ QSize itemSize( MenuBarEditorItem * i );
+ void addItemSizeToCoords( MenuBarEditorItem * i, int & x, int & y, int w );
+
+ QPoint itemPos( int index );
+ QPoint snapToItem( const QPoint & pos );
+ void dropInPlace( MenuBarEditorItem * i, const QPoint & pos );
+
+ void safeDec();
+ void safeInc();
+
+ void navigateLeft( bool ctrl );
+ void navigateRight( bool ctrl );
+ void enterEditMode();
+ void leaveEditMode();
+
+ QPixmap createTextPixmap( const QString &text );
+ int borderSize() const { return margin() + 4; } // add 4 pixels to the margin
+
+private:
+ FormWindow * formWnd;
+ QLineEdit * lineEdit;
+ QWidget * dropLine;
+ QPtrList<MenuBarEditorItem> itemList;
+ MenuBarEditorItem addItem;
+ MenuBarEditorItem addSeparator;
+ MenuBarEditorItem * draggedItem;
+ QPoint mousePressPos;
+ int currentIndex;
+ int itemHeight;
+ int separatorWidth;
+ bool hideWhenEmpty;
+ bool hasSeparator;
+ bool dropConfirmed;
+
+ enum ClipboardOperation {
+ None = 0,
+ Cut = 1,
+ Copy = 2
+ };
+ static int clipboardOperation;
+ static MenuBarEditorItem * clipboardItem;
+};
+
+#endif //MENUBAREDITOR_H
diff --git a/tools/designer/designer/metadatabase.cpp b/tools/designer/designer/metadatabase.cpp
new file mode 100644
index 0000000..cd36cc0
--- /dev/null
+++ b/tools/designer/designer/metadatabase.cpp
@@ -0,0 +1,1693 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "metadatabase.h"
+#include "widgetfactory.h"
+#include "formwindow.h"
+#include "parser.h"
+#include "widgetdatabase.h"
+#include "formfile.h"
+#include "propertyobject.h"
+#include "project.h"
+#include "mainwindow.h"
+
+#include <qapplication.h>
+#include <qobject.h>
+#include <qlayout.h>
+#include <qptrdict.h>
+#include <qobjectlist.h>
+#include <qstrlist.h>
+#include <qmetaobject.h>
+#include <qwidgetlist.h>
+#include <qmainwindow.h>
+#include <qregexp.h>
+#include <private/qpluginmanager_p.h>
+#include <qdatetime.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+
+#include <stdlib.h>
+
+class MetaDataBaseRecord
+{
+public:
+ QObject *object;
+ QStringList changedProperties;
+ QMap<QString,QVariant> fakeProperties;
+ QMap<QString, QString> propertyComments;
+ int spacing, margin;
+ QString resizeMode;
+ QValueList<MetaDataBase::Connection> connections;
+ QValueList<MetaDataBase::Function> functionList;
+ QValueList<MetaDataBase::Include> includes;
+ QValueList<MetaDataBase::Variable> variables;
+ QStringList forwards, sigs;
+ QWidgetList tabOrder;
+ MetaDataBase::MetaInfo metaInfo;
+ QCursor cursor;
+ QMap<int, QString> pixmapArguments;
+ QMap<int, QString> pixmapKeys;
+ QMap<QString, QString> columnFields;
+ QValueList<uint> breakPoints;
+ QMap<int, QString> breakPointConditions;
+ QString exportMacro;
+};
+
+static QPtrDict<MetaDataBaseRecord> *db = 0;
+static QPtrList<MetaDataBase::CustomWidget> *cWidgets = 0;
+static bool doUpdate = TRUE;
+static QStringList langList;
+static QStringList editorLangList;
+static QPluginManager<LanguageInterface> *languageInterfaceManager = 0;
+
+/*!
+ \class MetaDataBase metadatabase.h
+ \brief Database which stores meta data of widgets
+
+ The MetaDataBase stores meta information of widgets, which are not
+ stored directly in widgets (properties). This is e.g. the
+ information which properties have been modified.
+*/
+
+MetaDataBase::MetaDataBase()
+{
+}
+
+inline void setupDataBase()
+{
+ if ( !db || !cWidgets ) {
+ db = new QPtrDict<MetaDataBaseRecord>( 1481 );
+ db->setAutoDelete( TRUE );
+ cWidgets = new QPtrList<MetaDataBase::CustomWidget>;
+ cWidgets->setAutoDelete( TRUE );
+ }
+}
+
+void MetaDataBase::clearDataBase()
+{
+ delete db;
+ db = 0;
+ delete cWidgets;
+ cWidgets = 0;
+}
+
+void MetaDataBase::addEntry( QObject *o )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ if ( db->find( o ) )
+ return;
+ MetaDataBaseRecord *r = new MetaDataBaseRecord;
+ r->object = o;
+ r->spacing = r->margin = -1;
+ db->insert( (void*)o, r );
+
+ WidgetFactory::initChangedProperties( o );
+}
+
+void MetaDataBase::removeEntry( QObject *o )
+{
+ setupDataBase();
+ db->remove( o );
+}
+
+void MetaDataBase::setPropertyChanged( QObject *o, const QString &property, bool changed )
+{
+ setupDataBase();
+ if ( o->isA( "PropertyObject" ) ) {
+ ( (PropertyObject*)o )->mdPropertyChanged( property, changed );
+ return;
+ }
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ if ( changed ) {
+ if ( r->changedProperties.findIndex( property ) == -1 )
+ r->changedProperties.append( property );
+ } else {
+ if ( r->changedProperties.findIndex( property ) != -1 )
+ r->changedProperties.remove( property );
+ }
+
+ if ( doUpdate &&
+ ( property == "hAlign" || property == "vAlign" || property == "wordwrap" ) ) {
+ doUpdate = FALSE;
+ setPropertyChanged( o, "alignment", changed ||
+ isPropertyChanged( o, "hAlign" ) ||
+ isPropertyChanged( o, "vAlign" ) ||
+ isPropertyChanged( o, "wordwrap" ) );
+ doUpdate = TRUE;
+ }
+
+ if ( doUpdate && property == "alignment" ) {
+ doUpdate = FALSE;
+ setPropertyChanged( o, "hAlign", changed );
+ setPropertyChanged( o, "vAlign", changed );
+ setPropertyChanged( o, "wordwrap", changed );
+ doUpdate = TRUE;
+ }
+}
+
+bool MetaDataBase::isPropertyChanged( QObject *o, const QString &property )
+{
+ setupDataBase();
+ if ( o->isA( "PropertyObject" ) )
+ return ( (PropertyObject*)o )->mdIsPropertyChanged( property );
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return FALSE;
+ }
+
+ return r->changedProperties.findIndex( property ) != -1;
+}
+
+QStringList MetaDataBase::changedProperties( QObject *o )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QStringList();
+ }
+
+ QStringList lst( r->changedProperties );
+ return lst;
+}
+
+void MetaDataBase::setPropertyComment( QObject *o, const QString &property, const QString &comment )
+{
+ setupDataBase();
+ if ( o->isA( "PropertyObject" ) ) {
+ ( (PropertyObject*)o )->mdSetPropertyComment( property, comment );
+ return;
+ }
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->propertyComments.insert( property, comment );
+}
+
+QString MetaDataBase::propertyComment( QObject *o, const QString &property )
+{
+ setupDataBase();
+ if ( o->isA( "PropertyObject" ) )
+ return ( (PropertyObject*)o )->mdPropertyComment( property );
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QString::null;
+ }
+
+ return *r->propertyComments.find( property );
+}
+
+void MetaDataBase::setFakeProperty( QObject *o, const QString &property, const QVariant& value )
+{
+ setupDataBase();
+ if ( o->isA( "PropertyObject" ) ) {
+ ( (PropertyObject*)o )->mdSetFakeProperty( property, value );
+ return;
+ }
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+ r->fakeProperties[property] = value;
+}
+
+QVariant MetaDataBase::fakeProperty( QObject * o, const QString &property)
+{
+ setupDataBase();
+ if ( o->isA( "PropertyObject" ) )
+ return ( (PropertyObject*)o )->mdFakeProperty( property );
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QVariant();
+ }
+ QMap<QString, QVariant>::Iterator it = r->fakeProperties.find( property );
+ if ( it != r->fakeProperties.end() )
+ return r->fakeProperties[property];
+ return WidgetFactory::defaultValue( o, property );
+
+}
+
+QMap<QString,QVariant>* MetaDataBase::fakeProperties( QObject* o )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return 0;
+ }
+ return &r->fakeProperties;
+}
+
+void MetaDataBase::setSpacing( QObject *o, int spacing )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r || !o->isWidgetType() ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->spacing = spacing;
+ QLayout * layout = 0;
+ WidgetFactory::layoutType( (QWidget*)o, layout );
+ if ( layout ) {
+ int spadef = 6;
+ if ( MainWindow::self->formWindow() )
+ spadef = MainWindow::self->formWindow()->layoutDefaultSpacing();
+ if ( spacing == -1 )
+ layout->setSpacing( spadef );
+ else
+ layout->setSpacing( spacing );
+ }
+}
+
+int MetaDataBase::spacing( QObject *o )
+{
+ if ( !o )
+ return -1;
+ setupDataBase();
+ if ( ::qt_cast<QMainWindow*>(o) )
+ o = ( (QMainWindow*)o )->centralWidget();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r || !o->isWidgetType() ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return -1;
+ }
+
+ return r->spacing;
+}
+
+void MetaDataBase::setMargin( QObject *o, int margin )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r || !o->isWidgetType() ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->margin = margin;
+ QLayout * layout = 0;
+ WidgetFactory::layoutType( (QWidget*)o, layout );
+
+ bool isInnerLayout = TRUE;
+
+ QWidget *widget = (QWidget*)o;
+ if ( widget && !::qt_cast<QLayoutWidget*>(widget) &&
+ ( WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( widget ) ) ) ||
+ widget && widget->parentWidget() && ::qt_cast<FormWindow*>(widget->parentWidget()) ) )
+ isInnerLayout = FALSE;
+
+
+ if ( layout ) {
+ int mardef = 11;
+ if ( MainWindow::self->formWindow() )
+ mardef = MainWindow::self->formWindow()->layoutDefaultMargin();
+ if ( margin == -1 ) {
+ if ( isInnerLayout )
+ layout->setMargin( 1 );
+ else
+ layout->setMargin( QMAX( 1, mardef ) );
+ }
+ else
+ layout->setMargin( QMAX( 1, margin ) );
+ }
+}
+
+int MetaDataBase::margin( QObject *o )
+{
+ if ( !o )
+ return -1;
+ setupDataBase();
+ if ( ::qt_cast<QMainWindow*>(o) )
+ o = ( (QMainWindow*)o )->centralWidget();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r || !o->isWidgetType() ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return -1;
+ }
+ return r->margin;
+}
+
+void MetaDataBase::setResizeMode( QObject *o, const QString &mode )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r || !o->isWidgetType() ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->resizeMode = mode;
+}
+
+QString MetaDataBase::resizeMode( QObject *o )
+{
+ if ( !o )
+ return QString::null;
+ setupDataBase();
+ if ( ::qt_cast<QMainWindow*>(o) )
+ o = ( (QMainWindow*)o )->centralWidget();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r || !o->isWidgetType() ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QString::null;
+ }
+ return r->resizeMode;
+}
+
+void MetaDataBase::addConnection( QObject *o, QObject *sender, const QCString &signal,
+ QObject *receiver, const QCString &slot, bool addCode )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+ if ( !(sender && receiver) )
+ return;
+ Connection conn;
+ conn.sender = sender;
+ conn.signal = signal;
+ conn.receiver = receiver;
+ conn.slot = slot;
+ r->connections.append( conn );
+ if ( addCode ) {
+ QString rec = receiver->name();
+ if ( ::qt_cast<FormWindow*>(o) && receiver == ( (FormWindow*)o )->mainContainer() )
+ rec = "this";
+ QString sen = sender->name();
+ if ( ::qt_cast<FormWindow*>(o) && sender == ( (FormWindow*)o )->mainContainer() )
+ sen = "this";
+ FormFile *ff = 0;
+ if ( ::qt_cast<FormFile*>(o) )
+ ff = (FormFile*)o;
+ else if ( ::qt_cast<FormWindow*>(o) )
+ ff = ( (FormWindow*)o )->formFile();
+ ff->addConnection( sen, signal, rec, slot );
+ }
+}
+
+void MetaDataBase::removeConnection( QObject *o, QObject *sender, const QCString &signal,
+ QObject *receiver, const QCString &slot )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+ if ( !(sender && receiver) )
+ return;
+ for ( QValueList<Connection>::Iterator it = r->connections.begin(); it != r->connections.end(); ++it ) {
+ Connection conn = *it;
+ if ( conn.sender == sender &&
+ conn.signal == signal &&
+ conn.receiver == receiver &&
+ conn.slot == slot ) {
+ r->connections.remove( it );
+ break;
+ }
+ }
+ if ( ::qt_cast<FormWindow*>(o) ) {
+ QString rec = receiver->name();
+ if ( receiver == ( (FormWindow*)o )->mainContainer() )
+ rec = "this";
+ ( (FormWindow*)o )->formFile()->removeConnection( sender->name(), signal, rec, slot );
+ }
+}
+
+void MetaDataBase::setupConnections( QObject *o, const QValueList<LanguageInterface::Connection> &conns )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ if ( !::qt_cast<FormFile*>(o) )
+ return;
+
+ FormFile *formfile = (FormFile*)o;
+
+ r->connections.clear();
+
+ for ( QValueList<LanguageInterface::Connection>::ConstIterator cit = conns.begin();
+ cit != conns.end(); ++cit ) {
+ // #### get the correct sender object out of Bla.Blub.sender
+ QString senderName = (*cit).sender;
+ if ( senderName.find( '.' ) != -1 )
+ senderName = senderName.mid( senderName.findRev( '.' ) + 1 );
+ QObject *sender = 0;
+ if ( formfile->formWindow() )
+ sender = formfile->formWindow()->child( senderName );
+ if ( !sender && formfile->isFake() )
+ sender = formfile->project()->objectForFakeFormFile( formfile );
+ if ( !sender && senderName == "this" )
+ sender = formfile->formWindow() ?
+ formfile->formWindow()->mainContainer() :
+ formfile->project()->objectForFakeFormFile( formfile );
+ if ( !sender )
+ continue;
+ MetaDataBase::addConnection( formfile->formWindow() ?
+ (QObject*)formfile->formWindow() :
+ (QObject*)formfile,
+ sender,
+ (*cit).signal.latin1(),
+ formfile->formWindow() ?
+ formfile->formWindow()->mainContainer() :
+ formfile->project()->objectForFakeFormFile( formfile ),
+ (*cit).slot.latin1(),
+ FALSE );
+ }
+}
+
+bool MetaDataBase::hasConnection( QObject *o, QObject *sender, const QCString &signal,
+ QObject *receiver, const QCString &slot )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return FALSE;
+ }
+
+ for ( QValueList<Connection>::Iterator it = r->connections.begin(); it != r->connections.end(); ++it ) {
+ Connection conn = *it;
+ if ( conn.sender == sender &&
+ conn.signal == signal &&
+ conn.receiver == receiver &&
+ conn.slot == slot )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+QValueList<MetaDataBase::Connection> MetaDataBase::connections( QObject *o )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QValueList<Connection>();
+ }
+ return r->connections;
+}
+
+QValueList<MetaDataBase::Connection> MetaDataBase::connections( QObject *o, QObject *sender,
+ QObject *receiver )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QValueList<Connection>();
+ }
+ QValueList<Connection>::Iterator it = r->connections.begin();
+ QValueList<Connection> ret;
+ QValueList<Connection>::Iterator conn;
+ while ( ( conn = it ) != r->connections.end() ) {
+ ++it;
+ if ( (*conn).sender == sender &&
+ (*conn).receiver == receiver )
+ ret << *conn;
+ }
+
+ return ret;
+}
+
+QValueList<MetaDataBase::Connection> MetaDataBase::connections( QObject *o, QObject *object )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QValueList<Connection>();
+ }
+ QValueList<Connection>::Iterator it = r->connections.begin();
+ QValueList<Connection> ret;
+ QValueList<Connection>::Iterator conn;
+ while ( ( conn = it ) != r->connections.end() ) {
+ ++it;
+ if ( (*conn).sender == object ||
+ (*conn).receiver == object )
+ ret << *conn;
+ }
+ return ret;
+}
+
+void MetaDataBase::doConnections( QObject *o )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ QObject *sender = 0, *receiver = 0;
+ QObjectList *l = 0;
+ QValueList<Connection>::Iterator it = r->connections.begin();
+ for ( ; it != r->connections.end(); ++it ) {
+ Connection conn = *it;
+ if ( qstrcmp( conn.sender->name(), o->name() ) == 0 ) {
+ sender = o;
+ } else {
+ l = o->queryList( 0, conn.sender->name(), FALSE );
+ if ( !l || !l->first() ) {
+ delete l;
+ continue;
+ }
+ sender = l->first();
+ delete l;
+ }
+ if ( qstrcmp( conn.receiver->name(), o->name() ) == 0 ) {
+ receiver = o;
+ } else {
+ l = o->queryList( 0, conn.receiver->name(), FALSE );
+ if ( !l || !l->first() ) {
+ delete l;
+ continue;
+ }
+ receiver = l->first();
+ delete l;
+ }
+ QString s = "2""%1";
+ s = s.arg( conn.signal );
+ QString s2 = "1""%1";
+ s2 = s2.arg( conn.slot );
+
+ QStrList signalList = sender->metaObject()->signalNames( TRUE );
+ QStrList slotList = receiver->metaObject()->slotNames( TRUE );
+
+ // avoid warnings
+ if ( signalList.find( conn.signal ) == -1 ||
+ slotList.find( conn.slot ) == -1 )
+ continue;
+
+ QObject::connect( sender, s, receiver, s2 );
+ }
+}
+
+bool MetaDataBase::hasSlot( QObject *o, const QCString &slot, bool onlyCustom )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return FALSE;
+ }
+
+ if ( !onlyCustom ) {
+ QStrList slotList = o->metaObject()->slotNames( TRUE );
+ if ( slotList.find( slot ) != -1 )
+ return TRUE;
+
+ if ( ::qt_cast<FormWindow*>(o) ) {
+ o = ( (FormWindow*)o )->mainContainer();
+ slotList = o->metaObject()->slotNames( TRUE );
+ if ( slotList.find( slot ) != -1 )
+ return TRUE;
+ }
+
+ //if ( ::qt_cast<CustomWidget*>(o) ) {
+ if ( o->inherits( "CustomWidget" ) ) {
+ MetaDataBase::CustomWidget *w = ( (::CustomWidget*)o )->customWidget();
+ for ( QValueList<Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) {
+ QCString s = (*it).function;
+ if ( !s.data() )
+ continue;
+ if ( s == slot )
+ return TRUE;
+ }
+ }
+ }
+
+ for ( QValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) {
+ Function f = *it;
+ if ( normalizeFunction( f.function ) == normalizeFunction( slot ) && f.type == "slot" )
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool MetaDataBase::isSlotUsed( QObject *o, const QCString &slot )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return FALSE;
+ }
+
+ QValueList<Connection> conns = connections( o );
+ for ( QValueList<Connection>::Iterator it = conns.begin(); it != conns.end(); ++it ) {
+ if ( (*it).slot == slot )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+void MetaDataBase::addFunction( QObject *o, const QCString &function, const QString &specifier,
+ const QString &access, const QString &type, const QString &language,
+ const QString &returnType )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ Function f;
+ f.function = function;
+ f.specifier = specifier;
+ f.access = access;
+ f.type = type;
+ f.language = language;
+ f.returnType = returnType;
+ QValueList<MetaDataBase::Function>::Iterator it = r->functionList.find( f );
+ if ( it != r->functionList.end() )
+ r->functionList.remove( it );
+ r->functionList.append( f );
+ ( (FormWindow*)o )->formFile()->addFunctionCode( f );
+}
+
+void MetaDataBase::setFunctionList( QObject *o, const QValueList<Function> &functionList )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+ r->functionList = functionList;
+}
+
+void MetaDataBase::removeFunction( QObject *o, const QCString &function, const QString &specifier,
+ const QString &access, const QString &type, const QString &language,
+ const QString &returnType )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+ for ( QValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) {
+ if ( MetaDataBase::normalizeFunction( (*it).function ) ==
+ MetaDataBase::normalizeFunction( function ) &&
+ (*it).specifier == specifier &&
+ (*it).access == access &&
+ (*it).type == type &&
+ ( language.isEmpty() || (*it).language == language ) &&
+ ( returnType.isEmpty() || (*it).returnType == returnType ) ) {
+ ( (FormWindow*)o )->formFile()->removeFunctionCode( *it );
+ r->functionList.remove( it );
+ break;
+ }
+ }
+}
+
+void MetaDataBase::removeFunction( QObject *o, const QString &function )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+ for ( QValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) {
+ if ( normalizeFunction( (*it).function ) == normalizeFunction( function ) ) {
+ ( (FormWindow*)o )->formFile()->removeFunctionCode( *it );
+ r->functionList.remove( it );
+ break;
+ }
+ }
+}
+
+QValueList<MetaDataBase::Function> MetaDataBase::functionList( QObject *o, bool onlyFunctions )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QValueList<Function>();
+ }
+ if ( !onlyFunctions )
+ return r->functionList;
+ QValueList<Function> fList;
+ for ( QValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) {
+ if ( (*it).type == "function" )
+ fList.append( *it );
+ }
+ return fList;
+}
+
+QValueList<MetaDataBase::Function> MetaDataBase::slotList( QObject *o )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QValueList<Function>();
+ }
+ QValueList<Function> slotList;
+ for ( QValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) {
+ if ( (*it).type == "slot" )
+ slotList.append( *it );
+ }
+ return slotList;
+}
+
+void MetaDataBase::changeFunction( QObject *o, const QString &function, const QString &newName,
+ const QString &returnType )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ for ( QValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) {
+ Function f = *it;
+ if ( normalizeFunction( f.function ) == normalizeFunction( function ) ) {
+ (*it).function = newName;
+ if ( !returnType.isNull() )
+ (*it).returnType = returnType;
+ return;
+ }
+ }
+}
+
+void MetaDataBase::changeFunctionAttributes( QObject *o, const QString &oldName, const QString &newName,
+ const QString &specifier, const QString &access,
+ const QString &type, const QString &language,
+ const QString &returnType )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ for ( QValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) {
+ Function f = *it;
+ if ( normalizeFunction( f.function ) == normalizeFunction( oldName ) ) {
+ (*it).function = newName;
+ (*it).specifier = specifier;
+ (*it).access = access;
+ (*it).type = type;
+ (*it).language = language;
+ (*it).returnType = returnType;
+ return;
+ }
+ }
+}
+
+bool MetaDataBase::hasFunction( QObject *o, const QCString &function, bool onlyCustom )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return FALSE;
+ }
+
+ if ( !onlyCustom ) {
+ QStrList functionList = o->metaObject()->slotNames( TRUE );
+ if ( functionList.find( function ) != -1 )
+ return TRUE;
+
+ if ( ::qt_cast<FormWindow*>(o) ) {
+ o = ( (FormWindow*)o )->mainContainer();
+ functionList = o->metaObject()->slotNames( TRUE );
+ if ( functionList.find( function ) != -1 )
+ return TRUE;
+ }
+
+ //if ( ::qt_cast<CustomWidget*>(o) ) {
+ if ( o->inherits( "CustomWidget" ) ) {
+ MetaDataBase::CustomWidget *w = ( (::CustomWidget*)o )->customWidget();
+ for ( QValueList<Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) {
+ QCString s = (*it).function;
+ if ( !s.data() )
+ continue;
+ if ( s == function )
+ return TRUE;
+ }
+ }
+ }
+
+ for ( QValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) {
+ Function f = *it;
+ if ( normalizeFunction( f.function ) == normalizeFunction( function ) )
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+QString MetaDataBase::languageOfFunction( QObject *o, const QCString &function )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QString::null;
+ }
+
+ QString fu = normalizeFunction( function );
+ for ( QValueList<Function>::Iterator it = r->functionList.begin(); it != r->functionList.end(); ++it ) {
+ if ( fu == normalizeFunction( (*it).function ) )
+ return (*it).language;
+ }
+ return QString::null;
+}
+
+bool MetaDataBase::addCustomWidget( CustomWidget *wid )
+{
+ setupDataBase();
+
+ for ( CustomWidget *w = cWidgets->first(); w; w = cWidgets->next() ) {
+ if ( *wid == *w ) {
+ for ( QValueList<QCString>::ConstIterator it = wid->lstSignals.begin(); it != wid->lstSignals.end(); ++it ) {
+ if ( !w->hasSignal( *it ) )
+ w->lstSignals.append( *it );
+ }
+ for ( QValueList<Function>::ConstIterator it2 = wid->lstSlots.begin(); it2 != wid->lstSlots.end(); ++it2 ) {
+ if ( !w->hasSlot( MetaDataBase::normalizeFunction( (*it2).function ).latin1() ) )
+ w->lstSlots.append( *it2 );
+ }
+ for ( QValueList<Property>::ConstIterator it3 = wid->lstProperties.begin(); it3 != wid->lstProperties.end(); ++it3 ) {
+ if ( !w->hasProperty( (*it3).property ) )
+ w->lstProperties.append( *it3 );
+ }
+ delete wid;
+ return FALSE;
+ }
+ }
+
+
+ WidgetDatabaseRecord *r = new WidgetDatabaseRecord;
+ r->name = wid->className;
+ r->includeFile = wid->includeFile;
+ r->group = WidgetDatabase::widgetGroup( "Custom" );
+ r->toolTip = wid->className;
+ r->icon = new QIconSet( *wid->pixmap, *wid->pixmap );
+ r->isContainer = wid->isContainer;
+ wid->id = WidgetDatabase::addCustomWidget( r );
+ cWidgets->append( wid );
+ return TRUE;
+}
+
+void MetaDataBase::removeCustomWidget( CustomWidget *w )
+{
+ cWidgets->removeRef( w );
+}
+
+QPtrList<MetaDataBase::CustomWidget> *MetaDataBase::customWidgets()
+{
+ setupDataBase();
+ return cWidgets;
+}
+
+MetaDataBase::CustomWidget *MetaDataBase::customWidget( int id )
+{
+ for ( CustomWidget *w = cWidgets->first(); w; w = cWidgets->next() ) {
+ if ( id == w->id )
+ return w;
+ }
+ return 0;
+}
+
+bool MetaDataBase::isWidgetNameUsed( CustomWidget *wid )
+{
+ for ( CustomWidget *w = cWidgets->first(); w; w = cWidgets->next() ) {
+ if ( w == wid )
+ continue;
+ if ( wid->className == w->className )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool MetaDataBase::hasCustomWidget( const QString &className )
+{
+ for ( CustomWidget *w = cWidgets->first(); w; w = cWidgets->next() ) {
+ if ( w->className == className )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void MetaDataBase::setTabOrder( QWidget *w, const QWidgetList &order )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*) w );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ w, w->name(), w->className() );
+ return;
+ }
+
+ r->tabOrder = order;
+}
+
+QWidgetList MetaDataBase::tabOrder( QWidget *w )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*) w );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ w, w->name(), w->className() );
+ return QWidgetList();
+ }
+
+ return r->tabOrder;
+}
+
+void MetaDataBase::setIncludes( QObject *o, const QValueList<Include> &incs )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->includes = incs;
+}
+
+QValueList<MetaDataBase::Include> MetaDataBase::includes( QObject *o )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QValueList<Include>();
+ }
+
+ return r->includes;
+}
+
+void MetaDataBase::setForwards( QObject *o, const QStringList &fwds )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->forwards = fwds;
+}
+
+QStringList MetaDataBase::forwards( QObject *o )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QStringList();
+ }
+
+ return r->forwards;
+}
+
+void MetaDataBase::setVariables( QObject *o, const QValueList<Variable> &vars )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->variables = vars;
+}
+
+void MetaDataBase::addVariable( QObject *o, const QString &name, const QString &access )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+ Variable v;
+ v.varName = name;
+ v.varAccess = access;
+ r->variables << v;
+}
+
+void MetaDataBase::removeVariable( QObject *o, const QString &name )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+ QValueList<Variable>::Iterator it = r->variables.begin();
+ for ( ; it != r->variables.end(); ++it ) {
+ if ( (*it).varName == name ) {
+ r->variables.remove( it );
+ break;
+ }
+ }
+}
+
+QValueList<MetaDataBase::Variable> MetaDataBase::variables( QObject *o )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QValueList<MetaDataBase::Variable>();
+ }
+
+ return r->variables;
+}
+
+bool MetaDataBase::hasVariable( QObject *o, const QString &name )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return FALSE;
+ }
+
+ QValueList<Variable>::Iterator it = r->variables.begin();
+ for ( ; it != r->variables.end(); ++it ) {
+ if ( extractVariableName( name ) == extractVariableName( (*it).varName ) )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+QString MetaDataBase::extractVariableName( const QString &name )
+{
+ QString n = name.right( name.length() - name.findRev( ' ' ) - 1 );
+ if ( n[ 0 ] == '*' || n[ 0 ] == '&' )
+ n[ 0 ] = ' ';
+ if ( n[ (int)n.length() - 1 ] == ';' )
+ n[ (int)n.length() - 1 ] = ' ';
+ return n.simplifyWhiteSpace();
+}
+
+void MetaDataBase::setSignalList( QObject *o, const QStringList &sigs )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->sigs.clear();
+
+ for ( QStringList::ConstIterator it = sigs.begin(); it != sigs.end(); ++it ) {
+ QString s = (*it).simplifyWhiteSpace();
+ bool hasSemicolon = s.endsWith( ";" );
+ if ( hasSemicolon )
+ s = s.left( s.length() - 1 );
+ int p = s.find( '(' );
+ if ( p < 0 )
+ p = s.length();
+ int sp = s.find( ' ' );
+ if ( sp >= 0 && sp < p ) {
+ s = s.mid( sp+1 );
+ p -= sp + 1;
+ }
+ if ( p == (int) s.length() )
+ s += "()";
+ if ( hasSemicolon )
+ s += ";";
+ r->sigs << s;
+ }
+}
+
+QStringList MetaDataBase::signalList( QObject *o )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QStringList();
+ }
+
+ return r->sigs;
+}
+
+void MetaDataBase::setMetaInfo( QObject *o, MetaInfo mi )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->metaInfo = mi;
+}
+
+MetaDataBase::MetaInfo MetaDataBase::metaInfo( QObject *o )
+{
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return MetaInfo();
+ }
+
+ return r->metaInfo;
+}
+
+
+
+
+MetaDataBase::CustomWidget::CustomWidget()
+{
+ className = "MyCustomWidget";
+ includeFile = "mywidget.h";
+ includePolicy = Local;
+ sizeHint = QSize( -1, -1 );
+ pixmap = new QPixmap( QPixmap::fromMimeSource( "designer_customwidget.png" ) );
+ id = -1;
+ sizePolicy = QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
+ isContainer = FALSE;
+}
+
+MetaDataBase::CustomWidget::CustomWidget( const CustomWidget &w )
+{
+ className = w.className;
+ includeFile = w.includeFile;
+ includePolicy = w.includePolicy;
+ sizeHint = w.sizeHint;
+ if ( w.pixmap )
+ pixmap = new QPixmap( *w.pixmap );
+ else
+ pixmap = 0;
+ id = w.id;
+ isContainer = w.isContainer;
+}
+
+void MetaDataBase::setCursor( QWidget *w, const QCursor &c )
+{
+ setupDataBase();
+ if ( w->isA( "PropertyObject" ) ) {
+ ( (PropertyObject*)w )->mdSetCursor( c );
+ return;
+ }
+ MetaDataBaseRecord *r = db->find( (void*)w );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ w, w->name(), w->className() );
+ return;
+ }
+
+ r->cursor = c;
+}
+
+QCursor MetaDataBase::cursor( QWidget *w )
+{
+ setupDataBase();
+ if ( w->isA( "PropertyObject" ) )
+ return ( (PropertyObject*)w )->mdCursor();
+ MetaDataBaseRecord *r = db->find( (void*)w );
+ if ( !r ) {
+ w->unsetCursor();
+ return w->cursor();
+ }
+
+ return r->cursor;
+}
+
+bool MetaDataBase::CustomWidget::operator==( const CustomWidget &w ) const
+{
+ return className == w.className;
+}
+
+MetaDataBase::CustomWidget &MetaDataBase::CustomWidget::operator=( const CustomWidget &w )
+{
+ delete pixmap;
+ className = w.className;
+ includeFile = w.includeFile;
+ includePolicy = w.includePolicy;
+ sizeHint = w.sizeHint;
+ if ( w.pixmap )
+ pixmap = new QPixmap( *w.pixmap );
+ else
+ pixmap = 0;
+ lstSignals = w.lstSignals;
+ lstSlots = w.lstSlots;
+ lstProperties = w.lstProperties;
+ id = w.id;
+ isContainer = w.isContainer;
+ return *this;
+}
+
+bool MetaDataBase::CustomWidget::hasSignal( const QCString &signal ) const
+{
+ QStrList sigList = QWidget::staticMetaObject()->signalNames( TRUE );
+ if ( sigList.find( signal ) != -1 )
+ return TRUE;
+ for ( QValueList<QCString>::ConstIterator it = lstSignals.begin(); it != lstSignals.end(); ++it ) {
+ if ( normalizeFunction( *it ) == normalizeFunction( signal ) )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool MetaDataBase::CustomWidget::hasSlot( const QCString &slot ) const
+{
+ QStrList slotList = QWidget::staticMetaObject()->slotNames( TRUE );
+ if ( slotList.find( normalizeFunction( slot ) ) != -1 )
+ return TRUE;
+
+ for ( QValueList<MetaDataBase::Function>::ConstIterator it = lstSlots.begin(); it != lstSlots.end(); ++it ) {
+ if ( normalizeFunction( (*it).function ) == normalizeFunction( slot ) )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool MetaDataBase::CustomWidget::hasProperty( const QCString &prop ) const
+{
+ QStrList propList = QWidget::staticMetaObject()->propertyNames( TRUE );
+ if ( propList.find( prop ) != -1 )
+ return TRUE;
+
+ for ( QValueList<MetaDataBase::Property>::ConstIterator it = lstProperties.begin(); it != lstProperties.end(); ++it ) {
+ if ( (*it).property == prop )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void MetaDataBase::setPixmapArgument( QObject *o, int pixmap, const QString &arg )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->pixmapArguments.remove( pixmap );
+ r->pixmapArguments.insert( pixmap, arg );
+}
+
+QString MetaDataBase::pixmapArgument( QObject *o, int pixmap )
+{
+ if ( !o )
+ return QString::null;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QString::null;
+ }
+
+ return *r->pixmapArguments.find( pixmap );
+}
+
+void MetaDataBase::clearPixmapArguments( QObject *o )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->pixmapArguments.clear();
+}
+
+
+void MetaDataBase::setPixmapKey( QObject *o, int pixmap, const QString &arg )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ if ( o->isA( "PropertyObject" ) ) {
+ ( (PropertyObject*)o )->mdSetPixmapKey( pixmap, arg );
+ return;
+ }
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->pixmapKeys.remove( pixmap );
+ r->pixmapKeys.insert( pixmap, arg );
+}
+
+QString MetaDataBase::pixmapKey( QObject *o, int pixmap )
+{
+ if ( !o )
+ return QString::null;
+ setupDataBase();
+ if ( o->isA( "PropertyObject" ) )
+ return ( (PropertyObject*)o )->mdPixmapKey( pixmap );
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QString::null;
+ }
+
+ QString s = *r->pixmapKeys.find( pixmap );
+ if ( !s.isNull() )
+ return s;
+ if ( !o->isWidgetType() )
+ return s;
+ QWidget *w = (QWidget*)o;
+ if ( w->icon() )
+ return *r->pixmapKeys.find( w->icon()->serialNumber() );
+ return s;
+}
+
+void MetaDataBase::clearPixmapKeys( QObject *o )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->pixmapKeys.clear();
+}
+
+
+
+void MetaDataBase::setColumnFields( QObject *o, const QMap<QString, QString> &columnFields )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->columnFields = columnFields;
+}
+
+QMap<QString, QString> MetaDataBase::columnFields( QObject *o )
+{
+ if ( !o )
+ return QMap<QString, QString>();
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QMap<QString, QString>();
+ }
+
+ return r->columnFields;
+}
+
+void MetaDataBase::setEditor( const QStringList &langs )
+{
+ editorLangList = langs;
+}
+
+bool MetaDataBase::hasEditor( const QString &lang )
+{
+ return editorLangList.find( lang ) != editorLangList.end();
+}
+
+void MetaDataBase::setupInterfaceManagers( const QString &plugDir )
+{
+ if ( !languageInterfaceManager ) {
+ languageInterfaceManager =
+ new QPluginManager<LanguageInterface>( IID_Language,
+ QApplication::libraryPaths(),
+ plugDir );
+
+ langList = languageInterfaceManager->featureList();
+ langList.remove( "C++" );
+ langList << "C++";
+ }
+}
+
+QStringList MetaDataBase::languages()
+{
+ return langList;
+}
+
+QString MetaDataBase::normalizeFunction( const QString &f )
+{
+ return Parser::cleanArgs( f );
+}
+
+LanguageInterface *MetaDataBase::languageInterface( const QString &lang )
+{
+ LanguageInterface* iface = 0;
+ languageInterfaceManager->queryInterface( lang, &iface );
+ return iface;
+}
+
+void MetaDataBase::clear( QObject *o )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ db->remove( (void*)o );
+ for ( QPtrDictIterator<QWidget> it( *( (FormWindow*)o )->widgets() ); it.current(); ++it )
+ db->remove( (void*)it.current() );
+}
+
+void MetaDataBase::setBreakPoints( QObject *o, const QValueList<uint> &l )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->breakPoints = l;
+
+ QMap<int, QString>::Iterator it = r->breakPointConditions.begin();
+ while ( it != r->breakPointConditions.end() ) {
+ int line = it.key();
+ ++it;
+ if ( r->breakPoints.find( line ) == r->breakPoints.end() )
+ r->breakPointConditions.remove( r->breakPointConditions.find( line ) );
+ }
+}
+
+QValueList<uint> MetaDataBase::breakPoints( QObject *o )
+{
+ if ( !o )
+ return QValueList<uint>();
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QValueList<uint>();
+ }
+
+ return r->breakPoints;
+}
+
+void MetaDataBase::setBreakPointCondition( QObject *o, int line, const QString &condition )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+ r->breakPointConditions.replace( line, condition );
+}
+
+QString MetaDataBase::breakPointCondition( QObject *o, int line )
+{
+ if ( !o )
+ return QString::null;
+ setupDataBase();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return QString::null;
+ }
+ QMap<int, QString>::Iterator it = r->breakPointConditions.find( line );
+ if ( it == r->breakPointConditions.end() )
+ return QString::null;
+ return *it;
+}
+
+void MetaDataBase::setExportMacro( QObject *o, const QString &macro )
+{
+ if ( !o )
+ return;
+ setupDataBase();
+ if ( o->isA( "PropertyObject" ) ) {
+ ( (PropertyObject*)o )->mdSetExportMacro( macro );
+ return;
+ }
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return;
+ }
+
+ r->exportMacro = macro;
+}
+
+QString MetaDataBase::exportMacro( QObject *o )
+{
+ if ( !o )
+ return "";
+ setupDataBase();
+ if ( o->isA( "PropertyObject" ) )
+ return ( (PropertyObject*)o )->mdExportMacro();
+ MetaDataBaseRecord *r = db->find( (void*)o );
+ if ( !r ) {
+ qWarning( "No entry for %p (%s, %s) found in MetaDataBase",
+ o, o->name(), o->className() );
+ return "";
+ }
+
+ return r->exportMacro;
+}
+
+bool MetaDataBase::hasObject( QObject *o )
+{
+ return !!db->find( o );
+}
diff --git a/tools/designer/designer/metadatabase.h b/tools/designer/designer/metadatabase.h
new file mode 100644
index 0000000..707cc69
--- /dev/null
+++ b/tools/designer/designer/metadatabase.h
@@ -0,0 +1,276 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef METADATABASE_H
+#define METADATABASE_H
+
+#include <qvariant.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qmap.h>
+#include <qptrlist.h>
+#include <qsizepolicy.h>
+#include <qsize.h>
+#include <qwidgetlist.h>
+#include <qcursor.h>
+
+#include "pixmapchooser.h"
+#include "../interfaces/languageinterface.h"
+
+class QObject;
+class QPixmap;
+struct LanguageInterface;
+
+class MetaDataBase
+{
+public:
+ struct Connection
+ {
+ QObject *sender, *receiver;
+ QCString signal, slot;
+ bool operator==( const Connection &c ) const {
+ return sender == c.sender && receiver == c.receiver &&
+ signal == c.signal && slot == c.slot ;
+ }
+ };
+
+ struct Function
+ {
+ QString returnType;
+ QCString function;
+ QString specifier;
+ QString access;
+ QString type;
+ QString language;
+ bool operator==( const Function &f ) const {
+ return ( returnType == f.returnType &&
+ function == f.function &&
+ specifier == f.specifier &&
+ access == f.access &&
+ type == f.type &&
+ language == f.language
+ );
+ }
+ };
+
+ struct Property
+ {
+ QCString property;
+ QString type;
+ bool operator==( const Property &p ) const {
+ return property == p.property &&
+ type == p.type;
+ }
+ };
+
+ struct CustomWidget
+ {
+ CustomWidget();
+ CustomWidget( const CustomWidget &w );
+ ~CustomWidget() { delete pixmap; } // inlined to work around 2.7.2.3 bug
+ bool operator==( const CustomWidget &w ) const;
+ CustomWidget &operator=( const CustomWidget &w );
+
+ bool hasSignal( const QCString &signal ) const;
+ bool hasSlot( const QCString &slot ) const;
+ bool hasProperty( const QCString &prop ) const;
+
+ enum IncludePolicy { Global, Local };
+ QString className;
+ QString includeFile;
+ IncludePolicy includePolicy;
+ QSize sizeHint;
+ QSizePolicy sizePolicy;
+ QPixmap *pixmap;
+ QValueList<QCString> lstSignals;
+ QValueList<Function> lstSlots;
+ QValueList<Property> lstProperties;
+ int id;
+ bool isContainer;
+ };
+
+ struct Include
+ {
+ Include() : header(), location(), implDecl( "in implementation" ) {}
+ QString header;
+ QString location;
+ bool operator==( const Include &i ) const {
+ return header == i.header && location == i.location;
+ }
+ QString implDecl;
+ };
+
+ struct Variable
+ {
+ QString varName;
+ QString varAccess;
+ bool operator==( const Variable &v ) const {
+ return varName == v.varName &&
+ varAccess == v.varAccess;
+ }
+ };
+
+ struct MetaInfo
+ {
+ MetaInfo() : classNameChanged( FALSE ) { }
+ QString className;
+ bool classNameChanged;
+ QString comment;
+ QString author;
+ };
+
+ MetaDataBase();
+ static void clearDataBase();
+
+ static void addEntry( QObject *o );
+ static void removeEntry( QObject *o );
+ static void setPropertyChanged( QObject *o, const QString &property, bool changed );
+ static bool isPropertyChanged( QObject *o, const QString &property );
+ static void setPropertyComment( QObject *o, const QString &property, const QString &comment );
+ static QString propertyComment( QObject *o, const QString &property );
+ static QStringList changedProperties( QObject *o );
+
+ static void setFakeProperty( QObject *o, const QString &property, const QVariant& value );
+ static QVariant fakeProperty( QObject * o, const QString &property );
+ static QMap<QString,QVariant>* fakeProperties( QObject* o );
+
+ static void setSpacing( QObject *o, int spacing );
+ static int spacing( QObject *o );
+ static void setMargin( QObject *o, int margin );
+ static int margin( QObject *o );
+
+ static void setResizeMode( QObject *o, const QString &mode );
+ static QString resizeMode( QObject *o );
+
+ static void addConnection( QObject *o, QObject *sender, const QCString &signal,
+ QObject *receiver, const QCString &slot, bool addCode = TRUE );
+ static void removeConnection( QObject *o, QObject *sender, const QCString &signal,
+ QObject *receiver, const QCString &slot );
+ static bool hasConnection( QObject *o, QObject *sender, const QCString &signal,
+ QObject *receiver, const QCString &slot );
+ static void setupConnections( QObject *o, const QValueList<LanguageInterface::Connection> &conns );
+ static QValueList<Connection> connections( QObject *o );
+ static QValueList<Connection> connections( QObject *o, QObject *sender, QObject *receiver );
+ static QValueList<Connection> connections( QObject *o, QObject *object );
+ static void doConnections( QObject *o );
+
+ static void addFunction( QObject *o, const QCString &function, const QString &specifier,
+ const QString &access, const QString &type, const QString &language,
+ const QString &returnType );
+ static void removeFunction( QObject *o, const QCString &function, const QString &specifier,
+ const QString &access, const QString &type, const QString &language,
+ const QString &returnType );
+ static void removeFunction( QObject *o, const QString &function );
+ static QValueList<Function> functionList( QObject *o, bool onlyFunctions = FALSE );
+ static QValueList<Function> slotList( QObject *o );
+ static bool isSlotUsed( QObject *o, const QCString &slot );
+ static bool hasFunction( QObject *o, const QCString &function, bool onlyCustom = FALSE );
+ static bool hasSlot( QObject *o, const QCString &slot, bool onlyCustom = FALSE );
+ static void changeFunction( QObject *o, const QString &function, const QString &newName,
+ const QString &returnType );
+ static void changeFunctionAttributes( QObject *o, const QString &oldName, const QString &newName,
+ const QString &specifier, const QString &access,
+ const QString &type, const QString &language,
+ const QString &returnType );
+ static QString languageOfFunction( QObject *o, const QCString &function );
+ static void setFunctionList( QObject *o, const QValueList<Function> &functionList );
+
+
+ static bool addCustomWidget( CustomWidget *w );
+ static void removeCustomWidget( CustomWidget *w );
+ static QPtrList<CustomWidget> *customWidgets();
+ static CustomWidget *customWidget( int id );
+ static bool isWidgetNameUsed( CustomWidget *w );
+ static bool hasCustomWidget( const QString &className );
+
+ static void setTabOrder( QWidget *w, const QWidgetList &order );
+ static QWidgetList tabOrder( QWidget *w );
+
+ static void setIncludes( QObject *o, const QValueList<Include> &incs );
+ static QValueList<Include> includes( QObject *o );
+
+ static void setForwards( QObject *o, const QStringList &fwds );
+ static QStringList forwards( QObject *o );
+
+ static void setVariables( QObject *o, const QValueList<Variable> &vars );
+ static void addVariable( QObject *o, const QString &name, const QString &access );
+ static void removeVariable( QObject *o, const QString &name );
+ static QValueList<Variable> variables( QObject *o );
+ static bool hasVariable( QObject *o, const QString &name );
+ static QString extractVariableName( const QString &name );
+
+ static void setSignalList( QObject *o, const QStringList &sigs );
+ static QStringList signalList( QObject *o );
+
+ static void setMetaInfo( QObject *o, MetaInfo mi );
+ static MetaInfo metaInfo( QObject *o );
+
+ static void setCursor( QWidget *w, const QCursor &c );
+ static QCursor cursor( QWidget *w );
+
+ static void setPixmapArgument( QObject *o, int pixmap, const QString &arg );
+ static QString pixmapArgument( QObject *o, int pixmap );
+ static void clearPixmapArguments( QObject *o );
+
+ static void setPixmapKey( QObject *o, int pixmap, const QString &arg );
+ static QString pixmapKey( QObject *o, int pixmap );
+ static void clearPixmapKeys( QObject *o );
+
+ static void setColumnFields( QObject *o, const QMap<QString, QString> &columnFields );
+ static QMap<QString, QString> columnFields( QObject *o );
+
+ static void setEditor( const QStringList &langs );
+ static bool hasEditor( const QString &lang );
+
+ static void setupInterfaceManagers( const QString &plugDir );
+ static QStringList languages();
+
+ static LanguageInterface *languageInterface( const QString &lang );
+
+ static QString normalizeFunction( const QString &f );
+
+ static void clear( QObject *o );
+
+ static void setBreakPoints( QObject *o, const QValueList<uint> &l );
+ static void setBreakPointCondition( QObject *o, int line, const QString &condition );
+ static QValueList<uint> breakPoints( QObject *o );
+ static QString breakPointCondition( QObject *o, int line );
+
+ static void setExportMacro( QObject *o, const QString &macro );
+ static QString exportMacro( QObject *o );
+
+ static bool hasObject( QObject *o );
+
+};
+
+#endif
diff --git a/tools/designer/designer/multilineeditor.ui b/tools/designer/designer/multilineeditor.ui
new file mode 100644
index 0000000..85923e2
--- /dev/null
+++ b/tools/designer/designer/multilineeditor.ui
@@ -0,0 +1,188 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MultiLineEditorBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2002-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QMainWindow">
+ <property name="name">
+ <cstring>MultiLineEditorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>598</width>
+ <height>307</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Text</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Multiline Edit&lt;/b&gt;&lt;p&gt;This is a simple richtext editor. For an easier working, it provides the most common html tags in form of toolbar items respectively shortcuts. By clicking on such an icon, the regarding tag will be written to the editor and you can insert your text. If you have already written a text and want to format it, just mark it and click on the wished tag button. For a better visualization this editor supports also a simple html syntax highlighting.</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>OkButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="on">
+ <bool>false</bool>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>applyButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>helpButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </hbox>
+</widget>
+<menubar>
+ <property name="name">
+ <cstring>menuBar</cstring>
+ </property>
+</menubar>
+<toolbars>
+</toolbars>
+<connections>
+ <connection>
+ <sender>OkButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MultiLineEditorBase</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>applyButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MultiLineEditorBase</receiver>
+ <slot>applyClicked()</slot>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MultiLineEditorBase</receiver>
+ <slot>cancelClicked()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>applyClicked()</slot>
+ <slot>okClicked()</slot>
+ <slot>cancelClicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/multilineeditorimpl.cpp b/tools/designer/designer/multilineeditorimpl.cpp
new file mode 100644
index 0000000..a1dd51b
--- /dev/null
+++ b/tools/designer/designer/multilineeditorimpl.cpp
@@ -0,0 +1,417 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "multilineeditorimpl.h"
+#include "formwindow.h"
+#include "command.h"
+#include "mainwindow.h"
+#include "richtextfontdialog.h"
+#include "syntaxhighlighter_html.h"
+#include "widgetfactory.h"
+
+#include <qtextedit.h>
+#include <./private/qrichtext_p.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qtoolbutton.h>
+#include <qapplication.h>
+#include <qaction.h>
+#include <qmetaobject.h>
+
+ToolBarItem::ToolBarItem( QWidget *parent, QWidget *toolBar,
+ const QString &label, const QString &tagstr,
+ const QIconSet &icon, const QKeySequence &key )
+ : QAction( parent )
+{
+ setIconSet( icon );
+ setText( label );
+ setAccel( key );
+ addTo( toolBar );
+ tag = tagstr;
+ connect( this, SIGNAL( activated() ), this, SLOT( wasActivated() ) );
+}
+
+ToolBarItem::~ToolBarItem()
+{
+
+}
+
+void ToolBarItem::wasActivated()
+{
+ emit clicked( tag );
+}
+
+TextEdit::TextEdit( QWidget *parent, const char *name )
+ : QTextEdit( parent, name )
+{
+ setTextFormat( Qt::PlainText );
+}
+
+QTextParagraph* TextEdit::paragraph()
+{
+ QTextCursor *tc = new QTextCursor( QTextEdit::document() );
+ return tc->paragraph();
+}
+
+
+MultiLineEditor::MultiLineEditor( bool call_static, bool richtextMode, QWidget *parent, QWidget *editWidget,
+ FormWindow *fw, const QString &text )
+ : MultiLineEditorBase( parent, 0, WType_Dialog | WShowModal ), formwindow( fw ), doWrap( FALSE )
+{
+ callStatic = call_static;
+
+ if ( callStatic )
+ applyButton->hide();
+
+ textEdit = new TextEdit( centralWidget(), "textedit" );
+ Layout4->insertWidget( 0, textEdit );
+
+ if ( richtextMode ) {
+ QPopupMenu *stylesMenu = new QPopupMenu( this );
+ menuBar->insertItem( tr( "&Styles" ), stylesMenu );
+
+ basicToolBar = new QToolBar( tr( "Basics" ), this, DockTop );
+
+ ToolBarItem *it = new ToolBarItem( this, basicToolBar, tr( "Italic" ),
+ "i", QPixmap::fromMimeSource( "designer_textitalic.png" ), CTRL+Key_I );
+ it->addTo( stylesMenu );
+ connect( it, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ ToolBarItem *b = new ToolBarItem( this, basicToolBar, tr( "Bold" ),
+ "b", QPixmap::fromMimeSource( "designer_textbold.png" ), CTRL+Key_B );
+ b->addTo( stylesMenu );
+ connect( b, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ ToolBarItem *ul = new ToolBarItem( this, basicToolBar, tr( "Underline" ),
+ "u", QPixmap::fromMimeSource( "designer_textunderline.png" ), CTRL+Key_U );
+ ul->addTo( stylesMenu );
+ connect( ul, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ ToolBarItem *tt = new ToolBarItem( this, basicToolBar, tr( "Typewriter" ),
+ "tt", QPixmap::fromMimeSource( "designer_textteletext.png" ) );
+ tt->addTo( stylesMenu );
+ connect( tt, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ basicToolBar->addSeparator();
+
+ QPopupMenu *layoutMenu = new QPopupMenu( this );
+ menuBar->insertItem( tr( "&Layout" ), layoutMenu );
+
+ QAction *brAction = new QAction( this );
+ brAction->setIconSet( QPixmap::fromMimeSource( "designer_textlinebreak.png" ) );
+ brAction->setText( tr("Break" ) );
+ brAction->addTo( basicToolBar );
+ brAction->addTo( layoutMenu );
+ connect( brAction, SIGNAL( activated() ) , this, SLOT( insertBR() ) );
+
+ ToolBarItem *p = new ToolBarItem( this, basicToolBar, tr( "Paragraph" ),
+ "p", QPixmap::fromMimeSource( "designer_textparagraph.png" ) );
+ p->addTo( layoutMenu );
+ connect( p, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+ layoutMenu->insertSeparator();
+ basicToolBar->addSeparator();
+
+ ToolBarItem *al = new ToolBarItem( this, basicToolBar, tr( "Align left" ),
+ "p align=\"left\"", QPixmap::fromMimeSource( "designer_textleft.png" ) );
+ al->addTo( layoutMenu );
+ connect( al, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ ToolBarItem *ac = new ToolBarItem( this, basicToolBar, tr( "Align center" ),
+ "p align=\"center\"", QPixmap::fromMimeSource( "designer_textcenter.png" ) );
+ ac->addTo( layoutMenu );
+ connect( ac, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ ToolBarItem *ar = new ToolBarItem( this, basicToolBar, tr( "Align right" ),
+ "p align=\"right\"", QPixmap::fromMimeSource( "designer_textright.png" ) );
+ ar->addTo( layoutMenu );
+ connect( ar, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ ToolBarItem *block = new ToolBarItem( this, basicToolBar, tr( "Blockquote" ),
+ "blockquote", QPixmap::fromMimeSource( "designer_textjustify.png" ) );
+ block->addTo( layoutMenu );
+ connect( block, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+
+ QPopupMenu *fontMenu = new QPopupMenu( this );
+ menuBar->insertItem( tr( "&Font" ), fontMenu );
+
+ fontToolBar = new QToolBar( "Fonts", this, DockTop );
+
+ QAction *fontAction = new QAction( this );
+ fontAction->setIconSet( QPixmap::fromMimeSource( "designer_textfont.png" ) );
+ fontAction->setText( tr("Font" ) );
+ fontAction->addTo( fontToolBar );
+ fontAction->addTo( fontMenu );
+ connect( fontAction, SIGNAL( activated() ) , this, SLOT( showFontDialog() ) );
+
+
+ ToolBarItem *fp1 = new ToolBarItem( this, fontToolBar, tr( "Fontsize +1" ),
+ "font size=\"+1\"", QPixmap::fromMimeSource( "designer_textlarger.png" ) );
+ connect( fp1, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ ToolBarItem *fm1 = new ToolBarItem( this, fontToolBar, tr( "Fontsize -1" ),
+ "font size=\"-1\"", QPixmap::fromMimeSource( "designer_textsmaller.png" ) );
+ connect( fm1, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ ToolBarItem *h1 = new ToolBarItem( this, fontToolBar, tr( "Headline 1" ),
+ "h1", QPixmap::fromMimeSource( "designer_texth1.png" ) );
+ connect( h1, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ ToolBarItem *h2 = new ToolBarItem( this, fontToolBar, tr( "Headline 2" ),
+ "h2", QPixmap::fromMimeSource( "designer_texth2.png" ) );
+ connect( h2, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ ToolBarItem *h3 = new ToolBarItem( this, fontToolBar, tr( "Headline 3" ),
+ "h3", QPixmap::fromMimeSource( "designer_texth3.png" ) );
+ connect( h3, SIGNAL( clicked( const QString& ) ),
+ this, SLOT( insertTags( const QString& )));
+
+ QPopupMenu *optionsMenu = new QPopupMenu( this );
+ menuBar->insertItem( tr( "O&ptions" ), optionsMenu );
+
+ optionsToolBar = new QToolBar( "Options", this, DockTop );
+ wrapAction = new QAction( this );
+ wrapAction->setToggleAction( TRUE );
+ wrapAction->setIconSet( QPixmap::fromMimeSource( "designer_wordwrap.png" ) );
+ wrapAction->setText( tr( "Word Wrapping" ) );
+ wrapAction->addTo( optionsToolBar );
+ wrapAction->addTo( optionsMenu );
+ connect( wrapAction, SIGNAL( toggled( bool ) ), this, SLOT( changeWrapMode( bool ) ) );
+
+ oldDoWrap = doWrap;
+ wrapAction->setOn( doWrap );
+
+ connect( helpButton, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+ textEdit->document()->setFormatter( new QTextFormatterBreakInWords );
+ textEdit->document()->setUseFormatCollection( FALSE );
+ textEdit->document()->setPreProcessor( new SyntaxHighlighter_HTML );
+
+ if ( !callStatic && ::qt_cast<QTextEdit*>(editWidget) ) {
+ mlined = (QTextEdit*)editWidget;
+ mlined->setReadOnly( TRUE );
+
+ const QMetaProperty *wordWrap = mlined->metaObject()->property(
+ mlined->metaObject()->findProperty( "wordWrap", TRUE ), TRUE );
+ oldWrapMode = 0;
+ oldWrapString = "NoWrap";
+ if ( wordWrap ) {
+ oldWrapMode = mlined->property( "wordWrap" );
+ oldWrapString = QString( wordWrap->valueToKey( oldWrapMode.toInt() ) );
+ if ( oldWrapString != "NoWrap" )
+ doWrap = TRUE;
+ }
+ textEdit->setAlignment( mlined->alignment() );
+ textEdit->setWordWrap( mlined->wordWrap() );
+ textEdit->setWrapColumnOrWidth( mlined->wrapColumnOrWidth() );
+ textEdit->setWrapPolicy( mlined->wrapPolicy() );
+ textEdit->setText( mlined->text() );
+ if ( !mlined->text().isEmpty() )
+ textEdit->selectAll();
+ } else {
+ textEdit->setText( text );
+ textEdit->selectAll();
+ }
+ } else {
+ textEdit->setText( text );
+ textEdit->selectAll();
+ }
+ textEdit->setFocus();
+}
+
+int MultiLineEditor::exec()
+{
+ res = 1;
+ show();
+ qApp->enter_loop();
+ return res;
+}
+
+void MultiLineEditor::okClicked()
+{
+ applyClicked();
+ close();
+}
+
+void MultiLineEditor::applyClicked()
+{
+ if ( !callStatic ) {
+ PopulateMultiLineEditCommand *cmd = new PopulateMultiLineEditCommand( tr( "Set the text of '%1'" ).arg( mlined->name() ),
+ formwindow, mlined, textEdit->text() );
+ cmd->execute();
+ formwindow->commandHistory()->addCommand( cmd );
+
+ if ( oldDoWrap != doWrap ) {
+ QString pn( tr( "Set 'wordWrap' of '%2'" ).arg( mlined->name() ) );
+ SetPropertyCommand *propcmd;
+ if ( doWrap )
+ propcmd = new SetPropertyCommand( pn, formwindow,
+ mlined, MainWindow::self->propertyeditor(),
+ "wordWrap", WidgetFactory::property( mlined, "wordWrap" ),
+ QVariant( 1 ), "WidgetWidth", oldWrapString );
+ else
+ propcmd = new SetPropertyCommand( pn, formwindow,
+ mlined, MainWindow::self->propertyeditor(),
+ "wordWrap", WidgetFactory::property( mlined, "wordWrap" ),
+ QVariant( 0 ), "NoWrap", oldWrapString );
+
+ propcmd->execute();
+ formwindow->commandHistory()->addCommand( propcmd, TRUE );
+ }
+ textEdit->setFocus();
+ }
+ else {
+ staticText = textEdit->text();
+ }
+}
+
+void MultiLineEditor::cancelClicked()
+{
+ res = 0;
+ close();
+}
+
+void MultiLineEditor::closeEvent( QCloseEvent *e )
+{
+ qApp->exit_loop();
+ MultiLineEditorBase::closeEvent( e );
+}
+
+void MultiLineEditor::insertTags( const QString &tag )
+{
+ int pfrom, pto, ifrom, ito;
+ QString tagend( tag.simplifyWhiteSpace() );
+ tagend.remove( tagend.find( ' ', 0 ), tagend.length() );
+ if ( textEdit->hasSelectedText() ) {
+ textEdit->getSelection( &pfrom, &ifrom, &pto, &ito );
+ QString buf = textEdit->selectedText();
+ buf = QString( "<%1>%3</%2>" ).arg( tag ).arg( tagend ).arg( buf );
+ textEdit->removeSelectedText();
+ textEdit->insertAt( buf, pfrom, ifrom );
+ textEdit->setCursorPosition( pto, ito + 2 + tag.length() );
+ }
+ else {
+ int para, index;
+ textEdit->getCursorPosition( &para, &index );
+ textEdit->insert( QString( "<%1></%2>" ).arg( tag ).arg( tagend ) );
+ index += 2 + tag.length();
+ textEdit->setCursorPosition( para, index );
+ }
+}
+
+void MultiLineEditor::insertBR()
+{
+ textEdit->insert( "<br>" );
+}
+
+void MultiLineEditor::showFontDialog()
+{
+ bool selText = FALSE;
+ int pfrom, pto, ifrom, ito;
+ if ( textEdit->hasSelectedText() ) {
+ textEdit->getSelection( &pfrom, &ifrom, &pto, &ito );
+ selText = TRUE;
+ }
+ RichTextFontDialog *fd = new RichTextFontDialog( this );
+ if ( fd->exec() == QDialog::Accepted ) {
+ QString size, font;
+ if ( fd->getSize() != "0" )
+ size = "size=\"" + fd->getSize() + "\"";
+ QString color;
+ if ( !fd->getColor().isEmpty() && fd->getColor() != "#000000" )
+ color = "color=\"" + fd->getColor() + "\"";
+ if ( fd->getFont() != "default" )
+ font = "face=\"" + fd->getFont() + "\"";
+ QString tag( QString( "font %1 %2 %3" )
+ .arg( color ).arg( size ).arg( font ) );
+
+ if ( selText )
+ textEdit->setSelection( pfrom, ifrom, pto, ito );
+ insertTags( tag.simplifyWhiteSpace() );
+ }
+ else if ( selText )
+ textEdit->setSelection( pfrom, ifrom, pto, ito );
+}
+
+QString MultiLineEditor::getStaticText()
+{
+ return staticText.stripWhiteSpace();
+}
+
+QString MultiLineEditor::getText( QWidget *parent, const QString &text, bool richtextMode, bool *useWrap )
+{
+ MultiLineEditor medit( TRUE, richtextMode, parent, 0, 0, text );
+ if ( richtextMode )
+ medit.setUseWrapping( *useWrap );
+ if ( medit.exec() == QDialog::Accepted ) {
+ *useWrap = medit.useWrapping();
+ return medit.getStaticText();
+ }
+ return QString::null;
+}
+
+void MultiLineEditor::changeWrapMode( bool b )
+{
+ doWrap = b;
+ if ( doWrap && !callStatic ) {
+ if ( oldDoWrap )
+ textEdit->setProperty( "wordWrap", oldWrapMode );
+ else
+ textEdit->setWordWrap( QTextEdit::WidgetWidth );
+ } else {
+ textEdit->setWordWrap( QTextEdit::NoWrap );
+ }
+}
+
+bool MultiLineEditor::useWrapping() const
+{
+ return doWrap;
+}
+
+void MultiLineEditor::setUseWrapping( bool b )
+{
+ doWrap = b;
+ wrapAction->setOn( doWrap );
+}
diff --git a/tools/designer/designer/multilineeditorimpl.h b/tools/designer/designer/multilineeditorimpl.h
new file mode 100644
index 0000000..e147d53
--- /dev/null
+++ b/tools/designer/designer/multilineeditorimpl.h
@@ -0,0 +1,116 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef MULTILINEEDITORIMPL_H
+#define MULTILINEEDITORIMPL_H
+
+#include <qaction.h>
+#include <qtextedit.h>
+#include <private/qrichtext_p.h>
+#include "multilineeditor.h"
+
+class FormWindow;
+class QToolBar;
+class QTextDocument;
+
+class TextEdit : public QTextEdit
+{
+ Q_OBJECT
+
+public:
+ TextEdit( QWidget *parent = 0, const char *name = 0 );
+ QTextDocument *document() const { return QTextEdit::document(); }
+ QTextParagraph *paragraph();
+
+};
+
+class ToolBarItem : public QAction
+{
+ Q_OBJECT
+
+public:
+ ToolBarItem( QWidget *parent, QWidget *toolBar,
+ const QString &label, const QString &tagstr,
+ const QIconSet &icon, const QKeySequence &key = 0 );
+ ~ToolBarItem();
+signals:
+ void clicked( const QString &t );
+
+protected slots:
+ void wasActivated();
+private:
+ QString tag;
+};
+
+
+class MultiLineEditor : public MultiLineEditorBase
+{
+ Q_OBJECT
+
+public:
+ MultiLineEditor( bool call_static, bool richtextMode, QWidget *parent, QWidget *editWidget,
+ FormWindow *fw, const QString &text = QString::null );
+ bool useWrapping() const;
+ void setUseWrapping( bool );
+ static QString getText( QWidget *parent, const QString &text, bool richtextMode, bool *useWrap );
+ int exec();
+
+protected slots:
+ void okClicked();
+ void applyClicked();
+ void cancelClicked();
+ void insertTags( const QString& );
+ void insertBR();
+ void showFontDialog();
+ void changeWrapMode( bool );
+
+ void closeEvent( QCloseEvent *e );
+
+private:
+ QString getStaticText();
+ TextEdit *textEdit;
+ QTextEdit *mlined;
+ FormWindow *formwindow;
+ QToolBar *basicToolBar;
+ QToolBar *fontToolBar;
+ QToolBar *optionsToolBar;
+ QAction *wrapAction;
+ int res;
+ QString staticText;
+ bool callStatic;
+ bool oldDoWrap, doWrap;
+ QVariant oldWrapMode;
+ QString oldWrapString;
+};
+
+#endif
diff --git a/tools/designer/designer/newform.ui b/tools/designer/designer/newform.ui
new file mode 100644
index 0000000..ecf2eb1
--- /dev/null
+++ b/tools/designer/designer/newform.ui
@@ -0,0 +1,245 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>NewFormBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>NewFormBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>557</width>
+ <height>436</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>New File</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;New Form&lt;/b&gt;&lt;p&gt;Select a template for the new form and click the &lt;b&gt;OK&lt;/b&gt;-button to create it.&lt;/p&gt;</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>helpButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Create a new form using the selected template.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog without creating a new form.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QIconView" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>templateView</cstring>
+ </property>
+ <property name="gridX">
+ <number>120</number>
+ </property>
+ <property name="resizeMode">
+ <enum>Adjust</enum>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ <property name="wordWrapIconText">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Displays a list of the available templates.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>labelProject</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Insert into:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>projectCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>projectCombo</cstring>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>NewFormBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>NewFormBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>projectCombo</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>NewFormBase</receiver>
+ <slot>projectChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>templateView</sender>
+ <signal>currentChanged(QIconViewItem*)</signal>
+ <receiver>NewFormBase</receiver>
+ <slot>itemChanged(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>templateView</sender>
+ <signal>doubleClicked(QIconViewItem*)</signal>
+ <receiver>NewFormBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>templateView</sender>
+ <signal>returnPressed(QIconViewItem*)</signal>
+ <receiver>NewFormBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>templateView</tabstop>
+ <tabstop>helpButton</tabstop>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">itemChanged( QIconViewItem * )</slot>
+ <slot access="protected">projectChanged( const QString &amp; )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/newformimpl.cpp b/tools/designer/designer/newformimpl.cpp
new file mode 100644
index 0000000..a4a6ce0
--- /dev/null
+++ b/tools/designer/designer/newformimpl.cpp
@@ -0,0 +1,418 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "newformimpl.h"
+#include "mainwindow.h"
+#include "metadatabase.h"
+#include "project.h"
+#include "formwindow.h"
+#include "widgetfactory.h"
+#include "widgetdatabase.h"
+#include "actioneditorimpl.h"
+#include "hierarchyview.h"
+#include "resource.h"
+#include "projectsettingsimpl.h"
+#include "sourcefile.h"
+
+#include <qiconview.h>
+#include <qlabel.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+#include <qpushbutton.h>
+#include <stdlib.h>
+#include <qcombobox.h>
+#include <qworkspace.h>
+#include <qmessagebox.h>
+
+static int forms = 0;
+
+ProjectItem::ProjectItem( QIconView *view, const QString &text )
+ : NewItem( view, text )
+{
+}
+
+void ProjectItem::insert( Project * )
+{
+ MainWindow::self->createNewProject( lang );
+}
+
+
+
+FormItem::FormItem( QIconView *view, const QString &text )
+ : NewItem( view, text )
+{
+}
+
+void FormItem::insert( Project *pro )
+{
+ QString n = "Form" + QString::number( ++forms );
+ FormWindow *fw = 0;
+ FormFile *ff = new FormFile( FormFile::createUnnamedFileName(), TRUE, pro );
+ fw = new FormWindow( ff, MainWindow::self, MainWindow::self->qWorkspace(), n );
+ fw->setProject( pro );
+ MetaDataBase::addEntry( fw );
+ if ( fType == Widget ) {
+ QWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QWidget" ),
+ fw, n.latin1() );
+ fw->setMainContainer( w );
+ } else if ( fType == Dialog ) {
+ QWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QDialog" ), fw, n.latin1() );
+ fw->setMainContainer( w );
+ } else if ( fType == Wizard ) {
+ QWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QWizard" ),
+ fw, n.latin1() );
+ fw->setMainContainer( w );
+ } else if ( fType == MainWindow ) {
+ QWidget *w = WidgetFactory::create( WidgetDatabase::idFromClassName( "QMainWindow" ),
+ fw, n.latin1() );
+ fw->setMainContainer( w );
+ }
+
+ fw->setCaption( n );
+ fw->resize( 600, 480 );
+ MainWindow::self->insertFormWindow( fw );
+
+ TemplateWizardInterface *iface =
+ MainWindow::self->templateWizardInterface( fw->mainContainer()->className() );
+ if ( iface ) {
+ iface->setup( fw->mainContainer()->className(), fw->mainContainer(),
+ fw->iFace(), MainWindow::self->designerInterface() );
+ iface->release();
+ }
+
+ // the wizard might have changed a lot, lets update everything
+ MainWindow::self->actioneditor()->setFormWindow( fw );
+ MainWindow::self->objectHierarchy()->setFormWindow( fw, fw );
+ MainWindow::self->objectHierarchy()->formDefinitionView()->refresh();
+ MainWindow::self->objectHierarchy()->rebuild();
+ fw->killAccels( fw );
+ fw->project()->setModified( TRUE );
+ fw->setFocus();
+ if ( !pro->isDummy() ) {
+ fw->setSavePixmapInProject( TRUE );
+ fw->setSavePixmapInline( FALSE );
+ }
+}
+
+
+
+CustomFormItem::CustomFormItem( QIconView *view, const QString &text )
+ : NewItem( view, text )
+{
+}
+
+static void unifyFormName( FormWindow *fw, QWorkspace *qworkspace )
+{
+ QStringList lst;
+ QWidgetList windows = qworkspace->windowList();
+ for ( QWidget *w =windows.first(); w; w = windows.next() ) {
+ if ( w == fw )
+ continue;
+ lst << w->name();
+ }
+
+ if ( lst.findIndex( fw->name() ) == -1 )
+ return;
+ QString origName = fw->name();
+ QString n = origName;
+ int i = 1;
+ while ( lst.findIndex( n ) != -1 ) {
+ n = origName + QString::number( i++ );
+ }
+ fw->setName( n );
+ fw->setCaption( n );
+}
+
+void CustomFormItem::insert( Project *pro )
+{
+ QString filename = templateFileName();
+ if ( !filename.isEmpty() && QFile::exists( filename ) ) {
+ Resource resource( MainWindow::self );
+ FormFile *ff = new FormFile( filename, TRUE, pro );
+ if ( !resource.load( ff ) ) {
+ QMessageBox::information( MainWindow::self, MainWindow::tr("Load Template"),
+ MainWindow::tr("Couldn't load form description from template '" +
+ filename + "'" ) );
+ delete ff;
+ return;
+ }
+ ff->setFileName( QString::null );
+ if ( MainWindow::self->formWindow() ) {
+ MainWindow::self->formWindow()->setFileName( QString::null );
+ unifyFormName( MainWindow::self->formWindow(), MainWindow::self->qWorkspace() );
+ if ( !pro->isDummy() ) {
+ MainWindow::self->formWindow()->setSavePixmapInProject( TRUE );
+ MainWindow::self->formWindow()->setSavePixmapInline( FALSE );
+ }
+ }
+ }
+}
+
+
+
+SourceFileItem::SourceFileItem( QIconView *view, const QString &text )
+ : NewItem( view, text ), visible( TRUE )
+{
+}
+
+void SourceFileItem::insert( Project *pro )
+{
+ SourceFile *f = new SourceFile( SourceFile::createUnnamedFileName( ext ), TRUE, pro );
+ MainWindow::self->editSource( f );
+}
+
+void SourceFileItem::setProject( Project *pro )
+{
+ QIconView *iv = iconView();
+ bool v = lang == pro->language();
+ if ( !iv || v == visible )
+ return;
+ visible = v;
+ if ( !visible )
+ iv->takeItem( this );
+ else
+ iv->insertItem( this );
+}
+
+
+
+SourceTemplateItem::SourceTemplateItem( QIconView *view, const QString &text )
+ : NewItem( view, text ), visible( TRUE )
+{
+}
+
+void SourceTemplateItem::insert( Project *pro )
+{
+ SourceTemplateInterface *siface = MainWindow::self->sourceTemplateInterface( text() );
+ if ( !siface )
+ return;
+ SourceTemplateInterface::Source src = siface->create( text(), MainWindow::self->designerInterface() );
+ SourceFile *f = 0;
+ if ( src.type == SourceTemplateInterface::Source::Invalid )
+ return;
+ if ( src.type == SourceTemplateInterface::Source::FileName )
+ f = new SourceFile( src.filename, FALSE, pro );
+ else
+ f = new SourceFile( SourceFile::createUnnamedFileName( src.extension ), TRUE, pro );
+ if ( f->isAccepted()) {
+ f->setText( src.code );
+ MainWindow::self->editSource( f );
+ f->setModified( TRUE );
+ } else {
+ delete f;
+ }
+}
+
+void SourceTemplateItem::setProject( Project *pro )
+{
+ QIconView *iv = iconView();
+ bool v = !pro->isDummy() && lang == pro->language();
+ if ( !iv || v == visible )
+ return;
+ visible = v;
+ if ( !visible )
+ iv->takeItem( this );
+ else
+ iv->insertItem( this );
+}
+
+void NewForm::insertTemplates( QIconView *tView,
+ const QString &templatePath )
+{
+ QStringList::Iterator it;
+ QStringList languages = MetaDataBase::languages();
+ if ( !MainWindow::self->singleProjectMode() ) {
+ for ( it = languages.begin(); it != languages.end(); ++it ) {
+ ProjectItem *pi = new ProjectItem( tView, *it + " " + tr( "Project" ) );
+ allItems.append( pi );
+ pi->setLanguage( *it );
+ pi->setPixmap( QPixmap::fromMimeSource( "designer_project.png" ) );
+ pi->setDragEnabled( FALSE );
+ }
+ }
+ QIconViewItem *cur = 0;
+ FormItem *fi = new FormItem( tView,tr( "Dialog" ) );
+ allItems.append( fi );
+ fi->setFormType( FormItem::Dialog );
+ fi->setPixmap( QPixmap::fromMimeSource( "designer_newform.png" ) );
+ fi->setDragEnabled( FALSE );
+ cur = fi;
+ if ( !MainWindow::self->singleProjectMode() ) {
+ fi = new FormItem( tView,tr( "Wizard" ) );
+ allItems.append( fi );
+ fi->setFormType( FormItem::Wizard );
+ fi->setPixmap( QPixmap::fromMimeSource( "designer_newform.png" ) );
+ fi->setDragEnabled( FALSE );
+ fi = new FormItem( tView, tr( "Widget" ) );
+ allItems.append( fi );
+ fi->setFormType( FormItem::Widget );
+ fi->setPixmap( QPixmap::fromMimeSource( "designer_newform.png" ) );
+ fi->setDragEnabled( FALSE );
+ fi = new FormItem( tView, tr( "Main Window" ) );
+ allItems.append( fi );
+ fi->setFormType( FormItem::MainWindow );
+ fi->setPixmap( QPixmap::fromMimeSource( "designer_newform.png" ) );
+ fi->setDragEnabled( FALSE );
+
+ QString templPath = templatePath;
+ QStringList templRoots;
+ const char *qtdir = getenv( "QTDIR" );
+ if(qtdir)
+ templRoots << qtdir;
+ templRoots << qInstallPathData();
+ if(qtdir) //try the tools/designer directory last!
+ templRoots << (QString(qtdir) + "/tools/designer");
+ for ( QStringList::Iterator it = templRoots.begin(); it != templRoots.end(); ++it ) {
+ QString path = (*it) + "/templates";
+ if ( QFile::exists( path )) {
+ templPath = path;
+ break;
+ }
+ }
+ if ( !templPath.isEmpty() ) {
+ QDir dir( templPath );
+ const QFileInfoList *filist = dir.entryInfoList( QDir::DefaultFilter, QDir::DirsFirst | QDir::Name );
+ if ( filist ) {
+ QFileInfoListIterator it( *filist );
+ QFileInfo *fi;
+ while ( ( fi = it.current() ) != 0 ) {
+ ++it;
+ if ( !fi->isFile() || fi->extension() != "ui" )
+ continue;
+ QString name = fi->baseName();
+ name = name.replace( '_', ' ' );
+ CustomFormItem *ci = new CustomFormItem( tView, name );
+ allItems.append( ci );
+ ci->setDragEnabled( FALSE );
+ ci->setPixmap( QPixmap::fromMimeSource( "designer_newform.png" ) );
+ ci->setTemplateFile( fi->absFilePath() );
+ }
+ }
+ }
+ }
+
+ for ( it = languages.begin(); it != languages.end(); ++it ) {
+ LanguageInterface *iface = MetaDataBase::languageInterface( *it );
+ if ( iface ) {
+ QMap<QString, QString> extensionMap;
+ iface->preferedExtensions( extensionMap );
+ for ( QMap<QString, QString>::Iterator eit = extensionMap.begin();
+ eit != extensionMap.end(); ++eit ) {
+ SourceFileItem * si = new SourceFileItem( tView, *eit );
+ allItems.append( si );
+ si->setExtension( eit.key() );
+ si->setLanguage( *it );
+ si->setPixmap( QPixmap::fromMimeSource( "designer_filenew.png" ) );
+ si->setDragEnabled( FALSE );
+ }
+ iface->release();
+ }
+ }
+
+ if ( !MainWindow::self->singleProjectMode() ) {
+ QStringList sourceTemplates = MainWindow::self->sourceTemplates();
+ for ( QStringList::Iterator sit = sourceTemplates.begin(); sit != sourceTemplates.end(); ++sit ) {
+ SourceTemplateInterface *siface = MainWindow::self->sourceTemplateInterface( *sit );
+ if ( !siface )
+ continue;
+ SourceTemplateItem * si = new SourceTemplateItem( tView, *sit );
+ allItems.append( si );
+ si->setTemplate( *sit );
+ si->setLanguage( siface->language( *sit ) );
+ si->setPixmap( QPixmap::fromMimeSource( "designer_filenew.png" ) );
+ si->setDragEnabled( FALSE );
+ siface->release();
+ }
+ }
+
+ tView->viewport()->setFocus();
+ tView->setCurrentItem( cur );
+
+ if ( MainWindow::self->singleProjectMode() )
+ adjustSize();
+}
+
+NewForm::NewForm( QIconView *templateView, const QString &templatePath )
+{
+ insertTemplates( templateView, templatePath );
+ projectChanged( tr( "<No Project>" ) );
+}
+
+NewForm::NewForm( QWidget *parent, const QStringList& projects,
+ const QString& currentProject, const QString &templatePath )
+ : NewFormBase( parent, 0, TRUE )
+{
+ connect( helpButton, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+
+ projectCombo->insertStringList( projects );
+ projectCombo->setCurrentText( currentProject );
+
+ insertTemplates( templateView, templatePath );
+
+ projectChanged( projectCombo->currentText() );
+}
+
+void NewForm::accept()
+{
+ if ( !templateView->currentItem() )
+ return;
+ Project *pro = MainWindow::self->findProject( projectCombo->currentText() );
+ if ( !pro )
+ return;
+ MainWindow::self->setCurrentProject( pro );
+ NewFormBase::accept();
+ ( (NewItem*)templateView->currentItem() )->insert( pro );
+}
+
+void NewForm::projectChanged( const QString &project )
+{
+ Project *pro = MainWindow::self->findProject( project );
+ if ( !pro )
+ return;
+ QIconViewItem *i;
+ for ( i = allItems.first(); i; i = allItems.next() )
+ ( (NewItem*)i )->setProject( pro );
+ templateView->setCurrentItem( templateView->firstItem() );
+ templateView->arrangeItemsInGrid( TRUE );
+}
+
+void NewForm::itemChanged( QIconViewItem *item )
+{
+ labelProject->setEnabled( item->rtti() != NewItem::ProjectType );
+ projectCombo->setEnabled( item->rtti() != NewItem::ProjectType );
+}
+
+QPtrList<QIconViewItem> NewForm::allViewItems()
+{
+ return allItems;
+}
diff --git a/tools/designer/designer/newformimpl.h b/tools/designer/designer/newformimpl.h
new file mode 100644
index 0000000..b97a4f0
--- /dev/null
+++ b/tools/designer/designer/newformimpl.h
@@ -0,0 +1,171 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef NEWFORMIMPL_H
+#define NEWFORMIMPL_H
+
+#include "newform.h"
+#include <qiconview.h>
+
+class Project;
+
+class NewItem : public QIconViewItem
+{
+public:
+ enum Type {
+ ProjectType,
+ Form,
+ CustomForm,
+ SourceFileType,
+ SourceTemplateType
+ };
+
+ NewItem( QIconView *view, const QString &text )
+ : QIconViewItem( view, text ) {}
+ virtual void insert( Project *pro ) = 0;
+ virtual void setProject( Project * ) {}
+
+};
+
+class ProjectItem : public NewItem
+{
+public:
+ ProjectItem( QIconView *view, const QString &text );
+ void insert( Project *pro );
+ int rtti() const { return (int)ProjectType; }
+
+ void setLanguage( const QString &l ) { lang = l; }
+ QString language() const { return lang; }
+
+private:
+ QString lang;
+
+};
+
+class FormItem : public NewItem
+{
+public:
+ enum FormType {
+ Widget,
+ Dialog,
+ Wizard,
+ MainWindow
+ };
+
+ FormItem( QIconView *view, const QString &text );
+ void insert( Project *pro );
+ int rtti() const { return (int)Form; }
+
+ void setFormType( FormType ft ) { fType = ft; }
+ FormType formType() const { return fType; }
+
+private:
+ FormType fType;
+
+};
+
+class CustomFormItem : public NewItem
+{
+public:
+ CustomFormItem( QIconView *view, const QString &text );
+ void insert( Project *pro );
+ int rtti() const { return (int)CustomForm; }
+
+ void setTemplateFile( const QString &tf ) { templFile = tf; }
+ QString templateFileName() const { return templFile; }
+
+private:
+ QString templFile;
+
+};
+
+class SourceFileItem : public NewItem
+{
+public:
+ SourceFileItem( QIconView *view, const QString &text );
+ void insert( Project *pro );
+ int rtti() const { return (int)SourceFileType; }
+
+ void setExtension( const QString &e ) { ext = e; }
+ QString extension() const { return ext; }
+ void setLanguage( const QString &l ) { lang = l; }
+ void setProject( Project *pro );
+
+private:
+ QString ext;
+ QString lang;
+ bool visible;
+
+};
+
+class SourceTemplateItem : public NewItem
+{
+public:
+ SourceTemplateItem( QIconView *view, const QString &text );
+ void insert( Project *pro );
+ int rtti() const { return (int)SourceTemplateType; }
+
+ void setTemplate( const QString &t ) { templ = t; }
+ QString tenplate() const { return templ; }
+ void setLanguage( const QString &l ) { lang = l; }
+ void setProject( Project *pro );
+
+private:
+ QString templ;
+ QString lang;
+ bool visible;
+
+};
+
+class NewForm : public NewFormBase
+{
+ Q_OBJECT
+
+public:
+ NewForm( QIconView *templateView, const QString &templatePath );
+ NewForm( QWidget *parent, const QStringList& projects,
+ const QString& currentProject, const QString &templatePath );
+ void insertTemplates( QIconView*, const QString& );
+ void accept();
+ QPtrList<QIconViewItem> allViewItems();
+
+protected slots:
+ void projectChanged( const QString &project );
+ void itemChanged( QIconViewItem *item );
+
+private:
+ QPtrList<QIconViewItem> allItems;
+
+};
+
+#endif
diff --git a/tools/designer/designer/orderindicator.cpp b/tools/designer/designer/orderindicator.cpp
new file mode 100644
index 0000000..bfc5ff1
--- /dev/null
+++ b/tools/designer/designer/orderindicator.cpp
@@ -0,0 +1,119 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qvariant.h> // HP-UX compiler need this here
+
+#include "orderindicator.h"
+#include "formwindow.h"
+
+#include <qpainter.h>
+#include <qbitmap.h>
+#include <qapplication.h>
+
+OrderIndicator::OrderIndicator( int i, QWidget* w, FormWindow *fw )
+ : QWidget( fw, "order_indicator", WMouseNoMask ), formWindow( fw )
+{
+ order = -1;
+ widget = w;
+ setBackgroundMode( NoBackground );
+ setAutoMask( TRUE );
+ setOrder( i, w );
+}
+
+
+OrderIndicator::~OrderIndicator()
+{
+}
+
+
+void OrderIndicator::setOrder( int i, QWidget* wid )
+{
+ if ( widget != wid )
+ return;
+ if ( !wid->isVisibleTo( formWindow ) ) {
+ hide();
+ return;
+ }
+
+ if ( order == i ) {
+ show();
+ raise();
+ return;
+ }
+ order = i;
+ int w = fontMetrics().width( QString::number( i ) ) + 10;
+ int h = fontMetrics().lineSpacing() * 3 / 2;
+ QFont f( font() );
+ f.setBold( TRUE );
+ setFont( f );
+ resize( QMAX( w, h ), h );
+ update(); // in case the size didn't change
+ reposition();
+ show();
+ raise();
+}
+
+void OrderIndicator::reposition()
+{
+ QPoint p =parentWidget()->mapFromGlobal( widget->mapToGlobal( widget->rect().topLeft() ) );
+ move( p - QPoint( width()/3, height()/3 ) );
+}
+
+
+void OrderIndicator::paintEvent( QPaintEvent * )
+{
+ QPainter p( this );
+ p.setPen( white );
+ p.setBrush( blue );
+ p.drawEllipse( rect() );
+ p.drawText( rect(), AlignCenter, QString::number( order ) );
+}
+
+
+void OrderIndicator::updateMask()
+{
+ QBitmap bm( size() );
+ bm.fill( color0 );
+ {
+ QPainter p( &bm, this );
+ p.setPen( color1 );
+ p.setBrush( color1 );
+ p.drawEllipse( rect() );
+ }
+ setMask( bm );
+}
+
+void OrderIndicator::mousePressEvent( QMouseEvent *e )
+{
+ QApplication::sendEvent( widget, e );
+}
diff --git a/tools/designer/designer/orderindicator.h b/tools/designer/designer/orderindicator.h
new file mode 100644
index 0000000..ea2fbc3
--- /dev/null
+++ b/tools/designer/designer/orderindicator.h
@@ -0,0 +1,64 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef ORDERINDICATOR_H
+#define ORDERINDICATOR_H
+
+#include <qwidget.h>
+
+class FormWindow;
+
+class OrderIndicator : public QWidget
+{
+ Q_OBJECT
+
+public:
+ OrderIndicator( int i, QWidget* w, FormWindow* fw );
+ ~OrderIndicator();
+
+ void setOrder( int i, QWidget* w );
+ void reposition();
+
+protected:
+ void paintEvent( QPaintEvent * );
+ void mousePressEvent( QMouseEvent *e );
+ void updateMask();
+
+private:
+ int order;
+ QWidget* widget;
+ FormWindow *formWindow;
+
+};
+
+#endif
diff --git a/tools/designer/designer/outputwindow.cpp b/tools/designer/designer/outputwindow.cpp
new file mode 100644
index 0000000..bd236a7
--- /dev/null
+++ b/tools/designer/designer/outputwindow.cpp
@@ -0,0 +1,214 @@
+/**********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "outputwindow.h"
+#include "designerappiface.h"
+#include "metadatabase.h"
+#include "mainwindow.h"
+
+#include <qlistview.h>
+#include <qtextedit.h>
+#include <qapplication.h>
+#include <qheader.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <qpainter.h>
+
+static QTextEdit *debugoutput = 0;
+bool debugToStderr = FALSE;
+
+QtMsgHandler OutputWindow::oldMsgHandler = 0;
+
+OutputWindow::OutputWindow( QWidget *parent )
+ : QTabWidget( parent, "output_window" ), debugView( 0 ), errorView( 0 )
+{
+ setupDebug();
+ setupError();
+ iface = new DesignerOutputDockImpl( this );
+}
+
+OutputWindow::~OutputWindow()
+{
+ debugoutput = debugView = 0;
+ errorView = 0;
+ if ( !debugToStderr )
+ qInstallMsgHandler( oldMsgHandler );
+ delete iface;
+}
+
+void OutputWindow::shuttingDown()
+{
+ if ( !debugToStderr )
+ qInstallMsgHandler( oldMsgHandler );
+}
+
+void OutputWindow::setupError()
+{
+ errorView = new QListView( this, "OutputWindow::errorView" );
+ errorView->setSorting( -1 );
+ connect( errorView, SIGNAL( currentChanged( QListViewItem* ) ),
+ this, SLOT( currentErrorChanged( QListViewItem* ) ) );
+ connect( errorView, SIGNAL( clicked( QListViewItem* ) ),
+ this, SLOT( currentErrorChanged( QListViewItem* ) ) );
+
+ if ( MetaDataBase::languages().count() > 1 )
+ addTab( errorView, tr( "Warnings/Errors" ) );
+ else
+ errorView->hide();
+ errorView->addColumn( tr( "Type" ) );
+ errorView->addColumn( tr( "Message" ) );
+ errorView->addColumn( tr( "Line" ) );
+ errorView->addColumn( tr( "Location" ) );
+ errorView->setResizeMode( QListView::LastColumn );
+ errorView->setColumnWidth( 0, errorView->fontMetrics().width( "WARNING1234" ) );
+ errorView->setColumnWidth( 1, errorView->fontMetrics().width( "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP" ) );
+ errorView->setColumnWidth( 2, errorView->fontMetrics().width( "9999999" ) );
+ errorView->setColumnAlignment( 2, Qt::AlignRight );
+ errorView->setAllColumnsShowFocus( TRUE );
+}
+
+static void debugMessageOutput( QtMsgType type, const char *msg )
+{
+ QString s( msg );
+ s += "\n";
+
+ if ( type != QtFatalMsg ) {
+ if ( debugoutput && debugoutput->isVisible() )
+ debugoutput->append( s );
+ else if ( OutputWindow::oldMsgHandler )
+ (*OutputWindow::oldMsgHandler)( type, msg );
+ else
+ fputs( s.latin1(), stderr );
+ } else {
+ fputs( s.latin1(), stderr );
+ abort();
+ }
+
+ qApp->flush();
+}
+
+void OutputWindow::setupDebug()
+{
+ debugoutput = debugView = new QTextEdit( this, "OutputWindow::debugView" );
+ //debugView->setReadOnly( TRUE );
+ addTab( debugView, "Debug Output" );
+
+ if ( !debugToStderr )
+ oldMsgHandler = qInstallMsgHandler( debugMessageOutput );
+}
+
+void OutputWindow::setErrorMessages( const QStringList &errors, const QValueList<uint> &lines,
+ bool clear, const QStringList &locations,
+ const QObjectList &locationObjects )
+{
+ if ( clear )
+ errorView->clear();
+ QStringList::ConstIterator mit = errors.begin();
+ QValueList<uint>::ConstIterator lit = lines.begin();
+ QStringList::ConstIterator it = locations.begin();
+ QObjectList objects = (QObjectList)locationObjects;
+ QObject *o = objects.first();
+ QListViewItem *after = 0;
+ for ( ; lit != lines.end() && mit != errors.end(); ++lit, ++mit, ++it, o = objects.next() )
+ after = new ErrorItem( errorView, after, *mit, *lit, *it, o );
+ setCurrentPage( 1 );
+}
+
+DesignerOutputDock *OutputWindow::iFace()
+{
+ return iface;
+}
+
+void OutputWindow::appendDebug( const QString &text )
+{
+ debugView->append( text + "\n" );
+}
+
+void OutputWindow::clearErrorMessages()
+{
+ errorView->clear();
+}
+
+void OutputWindow::clearDebug()
+{
+ debugView->clear();
+}
+
+void OutputWindow::showDebugTab()
+{
+ showPage( debugView );
+}
+
+void OutputWindow::currentErrorChanged( QListViewItem *i )
+{
+ if ( !i )
+ return;
+ ErrorItem *ei = (ErrorItem*)i;
+ ei->setRead( TRUE );
+ MainWindow::self->showSourceLine( ei->location(), ei->line() - 1, MainWindow::Error );
+}
+
+
+
+ErrorItem::ErrorItem( QListView *parent, QListViewItem *after, const QString &message, int line,
+ const QString &locationString, QObject *locationObject )
+ : QListViewItem( parent, after )
+{
+ setMultiLinesEnabled( TRUE );
+ QString m( message );
+ type = m.startsWith( "Warning: " ) ? Warning : Error;
+ m = m.mid( m.find( ':' ) + 1 );
+ setText( 0, type == Error ? "Error" : "Warning" );
+ setText( 1, m );
+ setText( 2, QString::number( line ) );
+ setText( 3, locationString );
+ object = locationObject;
+ read = !after;
+ if ( !after ) {
+ parent->setSelected( this, TRUE );
+ parent->setCurrentItem( this );
+ }
+}
+
+void ErrorItem::paintCell( QPainter *p, const QColorGroup & cg,
+ int column, int width, int alignment )
+{
+ QColorGroup g( cg );
+ g.setColor( QColorGroup::Text, type == Error ? Qt::red : Qt::darkYellow );
+ if ( !read ) {
+ QFont f( p->font() );
+ f.setBold( TRUE );
+ p->setFont( f );
+ }
+ QListViewItem::paintCell( p, g, column, width, alignment );
+}
diff --git a/tools/designer/designer/outputwindow.h b/tools/designer/designer/outputwindow.h
new file mode 100644
index 0000000..7dc754a
--- /dev/null
+++ b/tools/designer/designer/outputwindow.h
@@ -0,0 +1,105 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef OUTPUTWINDOW_H
+#define OUTPUTWINDOW_H
+
+#include <qtabwidget.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+#include <qlistview.h>
+
+struct DesignerOutputDock;
+class QTextEdit;
+class QListView;
+
+class ErrorItem : public QListViewItem
+{
+public:
+ enum Type { Error, Warning };
+
+ ErrorItem( QListView *parent, QListViewItem *after, const QString &message, int line,
+ const QString &locationString, QObject *locationObject );
+
+ void paintCell( QPainter *, const QColorGroup & cg,
+ int column, int width, int alignment );
+
+ void setRead( bool b ) { read = b; repaint(); }
+
+ QObject *location() const { return object; }
+ int line() const { return text( 2 ).toInt(); }
+
+private:
+ QObject *object;
+ Type type;
+ bool read;
+
+};
+
+class OutputWindow : public QTabWidget
+{
+ Q_OBJECT
+
+public:
+ OutputWindow( QWidget *parent );
+ ~OutputWindow();
+
+ void setErrorMessages( const QStringList &errors, const QValueList<uint> &lines,
+ bool clear, const QStringList &locations,
+ const QObjectList &locationObjects );
+ void appendDebug( const QString& );
+ void clearErrorMessages();
+ void clearDebug();
+ void showDebugTab();
+
+ DesignerOutputDock *iFace();
+
+ void shuttingDown();
+
+ static QtMsgHandler oldMsgHandler;
+
+private slots:
+ void currentErrorChanged( QListViewItem *i );
+
+private:
+ void setupError();
+ void setupDebug();
+
+ QTextEdit *debugView;
+ QListView *errorView;
+
+ DesignerOutputDock *iface;
+
+};
+
+#endif
diff --git a/tools/designer/designer/paletteeditor.ui b/tools/designer/designer/paletteeditor.ui
new file mode 100644
index 0000000..cbb7b92
--- /dev/null
+++ b/tools/designer/designer/paletteeditor.ui
@@ -0,0 +1,503 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>PaletteEditorBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PaletteEditorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>449</width>
+ <height>443</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Edit Palette</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupAutoPalette</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>4</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Build Palette</string>
+ </property>
+ <property name="alignment">
+ <set>AlignAuto</set>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>labelMainColor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>50</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="midLineWidth">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>&amp;3-D Effects:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignAuto|AlignVCenter</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>buttonMainColor</cstring>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonMainColor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>StrongFocus</enum>
+ </property>
+ <property name="scale" stdset="0">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Choose a color</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose the effect-color for the generated palette.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>labelMainColor2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>50</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="midLineWidth">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>Back&amp;ground:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignAuto|AlignVCenter</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>buttonMainColor2</cstring>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonMainColor2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>StrongFocus</enum>
+ </property>
+ <property name="scale" stdset="0">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Choose a color</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose the background color for the generated palette.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnAdvanced</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Tune Palette...</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox126</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Preview</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Select &amp;Palette:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>paletteCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Active Palette</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Inactive Palette</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Disabled Palette</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>paletteCombo</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="PreviewFrame">
+ <property name="name">
+ <cstring>previewFrame</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ </sizepolicy>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>StyledButton</class>
+ <header location="local">styledbutton.h</header>
+ <sizehint>
+ <width>40</width>
+ <height>25</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>clicked()</signal>
+ <signal>changed()</signal>
+ <property type="Color">color</property>
+ <property type="Pixmap">pixmap</property>
+ <property type="Bool">scale</property>
+ </customwidget>
+ <customwidget>
+ <class>PreviewFrame</class>
+ <header location="local">previewframe.h</header>
+ <sizehint>
+ <width>200</width>
+ <height>200</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ </sizepolicy>
+ <pixmap>image1</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="1112">789c9dd2cb8e9b301406e07d9e0225bba89a09601350d505302c5b7559a9eac23e6672b363620c0ca9faeef53949da2e2a55eab123f9e38f2f217e5e475f3e7f8cd6cf8bde0b7f8008f6c2456b3518337ffdf6e1fb62992451e8691ac5cb778be55304d1277b6e71fc12c6ab0d157222e61bd8e4c812196f6216535a13f318624a6764b2495842e99558249014c81e99c6294b69d3376291424ae9806431638cd28628183081f4489e70ce13e4852878c129ad905992f18cd291283295517a466ed32ddfa64847945bb595c80e99a739cf29d54499ab9c528b2c58c10b86344428540148400a26b8a0541241b482d215523299494a0551c9562ae409091c32e0c82351410b942aa4e22a53941e882d36e41ed966d8903b2215f215f99a6143b6442afaafff5aff485658622584a091941256948443d1cabbdd6ebf3f28753c09a9e9cdc1fe703c9e4ea19f689a0430fa4c8908082be093d08d016bbb0bbd5e7ceafade5b30de19d083b3fa9e008cd39b9fafd69495b473af7fcfb15325c1d61eea0afaf005ddf97b5295c658a866338f97591babef7340fa396c6c5ca9e7fe650807d0bf566b4262299986ba335a3b4a2cc84b69ac85b1b673037d8fabf95b023a9c09cc7530e104dd5419ed6e27083fb09a7c752db5a9bd31cde4ec634ed8a39aebbe337618c3f6fdc5dee6d8b0bb0d6b5b8b1fad43d78fe4e14e3f6aace8e29d9d736777fea3c686eee0138c9726d4d00c548df7a315ff750f7ebc5ffc04a0e5308d</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>buttonMainColor2</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorBase</receiver>
+ <slot>onChoose2ndMainColor()</slot>
+ </connection>
+ <connection>
+ <sender>paletteCombo</sender>
+ <signal>activated(int)</signal>
+ <receiver>PaletteEditorBase</receiver>
+ <slot>paletteSelected(int)</slot>
+ </connection>
+ <connection>
+ <sender>btnAdvanced</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorBase</receiver>
+ <slot>onTune()</slot>
+ </connection>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>buttonMainColor</sender>
+ <signal>changed()</signal>
+ <receiver>PaletteEditorBase</receiver>
+ <slot>onChooseMainColor()</slot>
+ </connection>
+ <connection>
+ <sender>buttonMainColor</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorBase</receiver>
+ <slot>onChooseMainColor()</slot>
+ </connection>
+ <connection>
+ <sender>buttonMainColor2</sender>
+ <signal>changed()</signal>
+ <receiver>PaletteEditorBase</receiver>
+ <slot>onChoose2ndMainColor()</slot>
+ </connection>
+ <slot access="protected" language="C++" returnType="void">init()</slot>
+ <slot access="protected" language="C++" returnType="void">destroy()</slot>
+ <slot access="protected" language="C++" returnType="void">onTune()</slot>
+ <slot access="protected" language="C++" returnType="void">onChoose2ndMainColor()</slot>
+ <slot access="protected" language="C++" returnType="void">onChooseMainColor()</slot>
+ <slot access="protected" language="C++" returnType="void">paletteSelected(int)</slot>
+</connections>
+<tabstops>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+ <tabstop>buttonMainColor</tabstop>
+ <tabstop>buttonMainColor2</tabstop>
+ <tabstop>btnAdvanced</tabstop>
+ <tabstop>paletteCombo</tabstop>
+ <tabstop>buttonHelp</tabstop>
+</tabstops>
+</UI>
diff --git a/tools/designer/designer/paletteeditoradvanced.ui b/tools/designer/designer/paletteeditoradvanced.ui
new file mode 100644
index 0000000..4c5a6a0
--- /dev/null
+++ b/tools/designer/designer/paletteeditoradvanced.ui
@@ -0,0 +1,755 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>PaletteEditorAdvancedBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PaletteEditorAdvancedBase</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>327</width>
+ <height>341</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Tune Palette</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Edit Palette&lt;/b&gt;&lt;p&gt;Change the current widget or form's palette.&lt;/p&gt;&lt;p&gt;Use a generated palette or select colors for each color group and each color role.&lt;/p&gt;&lt;p&gt;The palette can be tested with different widget layouts in the preview section.&lt;/p&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout14</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>MShape</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>MShadow</enum>
+ </property>
+ <property name="text">
+ <string>Select &amp;Palette:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>paletteCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Active Palette</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Inactive Palette</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Disabled Palette</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>paletteCombo</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>4</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Auto</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBuildInactive</cstring>
+ </property>
+ <property name="text">
+ <string>Build the &amp;inactive palette from the active palette.</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBuildDisabled</cstring>
+ </property>
+ <property name="text">
+ <string>Build the &amp;disabled palette from the active palette.</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupCentral</cstring>
+ </property>
+ <property name="title">
+ <string>Central color roles</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Background</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Foreground</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Button</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Base</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Text</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>BrightText</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>ButtonText</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Highlight</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>HighlightText</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Link</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>LinkVisited</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>comboCentral</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Choose the central color role</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Select a color role.&lt;/b&gt;&lt;p&gt;Available central color roles are: &lt;ul&gt; &lt;li&gt;Background - general background color.&lt;/li&gt; &lt;li&gt;Foreground - general foreground color. &lt;/li&gt; &lt;li&gt;Base - used as the background color for example, for text entry widgets; it is usually white or another light color. &lt;/li&gt; &lt;li&gt;Text - the forground color used with Base. Usually this is the same as the Foreground, in which case it must provide good contrast both with the Background and with the Base. &lt;/li&gt; &lt;li&gt;Button - general button background color; useful where buttons need a background different from Background, as in the Macintosh style. &lt;/li&gt; &lt;li&gt;ButtonText - a foreground color used with the Button color. &lt;/li&gt; &lt;li&gt;Highlight - a color used to indicate a selected or highlighted item. &lt;/li&gt; &lt;li&gt;HighlightedText - a text color that contrasts to Highlight. &lt;/li&gt; &lt;li&gt;BrightText - a text color that is very different from Foreground and contrasts well with, for example, black. &lt;/li&gt; &lt;/ul&gt; &lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout32_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal_Spacing1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>labelPixmap</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Choose Pi&amp;xmap:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>buttonPixmap</cstring>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonPixmap</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="scale" stdset="0">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select a pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a pixmap file for the selected central color role.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>labelCentral</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&amp;Select Color:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>buttonCentral</cstring>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonCentral</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="scale" stdset="0">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Choose a color</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a color for the selected central color role.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupEffect</cstring>
+ </property>
+ <property name="title">
+ <string>3-D shadow effects</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout32_3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBuildEffect</cstring>
+ </property>
+ <property name="text">
+ <string>Build &amp;from button color</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Generate shadings</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check to let 3D-effect colors be calculated from the button-color.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Light</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Midlight</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Mid</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Dark</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Shadow</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>comboEffect</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Choose 3D-effect color role</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Select a color effect role.&lt;/b&gt;&lt;p&gt;Available effect roles are: &lt;ul&gt; &lt;li&gt;Light - lighter than Button color. &lt;/li&gt; &lt;li&gt;Midlight - between Button and Light. &lt;/li&gt; &lt;li&gt;Mid - between Button and Dark. &lt;/li&gt; &lt;li&gt;Dark - darker than Button. &lt;/li&gt; &lt;li&gt;Shadow - a very dark color. &lt;/li&gt; &lt;/ul&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout31_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal_Spacing3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>labelEffect</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Select Co&amp;lor:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>buttonEffect</cstring>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonEffect</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="scale" stdset="0">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Choose a color</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a color for the selected effect color role.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal_Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>StyledButton</class>
+ <header location="local">styledbutton.h</header>
+ <sizehint>
+ <width>40</width>
+ <height>25</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>clicked()</signal>
+ <signal>changed()</signal>
+ <property type="Color">color</property>
+ <property type="Pixmap">pixmap</property>
+ <property type="Bool">scale</property>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="1112">789c9dd2cb8e9b301406e07d9e0225bba89a09601350d505302c5b7559a9eac23e6672b363620c0ca9faeef53949da2e2a55eab123f9e38f2f217e5e475f3e7f8cd6cf8bde0b7f8008f6c2456b3518337ffdf6e1fb62992451e8691ac5cb778be55304d1277b6e71fc12c6ab0d157222e61bd8e4c812196f6216535a13f318624a6764b2495842e99558249014c81e99c6294b69d3376291424ae9806431638cd28628183081f4489e70ce13e4852878c129ad905992f18cd291283295517a466ed32ddfa64847945bb595c80e99a739cf29d54499ab9c528b2c58c10b86344428540148400a26b8a0541241b482d215523299494a0551c9562ae409091c32e0c82351410b942aa4e22a53941e882d36e41ed966d8903b2215f215f99a6143b6442afaafff5aff485658622584a091941256948443d1cabbdd6ebf3f28753c09a9e9cdc1fe703c9e4ea19f689a0430fa4c8908082be093d08d016bbb0bbd5e7ceafade5b30de19d083b3fa9e008cd39b9fafd69495b473af7fcfb15325c1d61eea0afaf005ddf97b5295c658a866338f97591babef7340fa396c6c5ca9e7fe650807d0bf566b4262299986ba335a3b4a2cc84b69ac85b1b673037d8fabf95b023a9c09cc7530e104dd5419ed6e27083fb09a7c752db5a9bd31cde4ec634ed8a39aebbe337618c3f6fdc5dee6d8b0bb0d6b5b8b1fad43d78fe4e14e3f6aace8e29d9d736777fea3c686eee0138c9726d4d00c548df7a315ff750f7ebc5ffc04a0e5308d</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>paletteCombo</sender>
+ <signal>activated(int)</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>paletteSelected(int)</slot>
+ </connection>
+ <connection>
+ <sender>comboCentral</sender>
+ <signal>activated(int)</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>onCentral(int)</slot>
+ </connection>
+ <connection>
+ <sender>buttonPixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>onChoosePixmap()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCentral</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>onChooseCentralColor()</slot>
+ </connection>
+ <connection>
+ <sender>buttonEffect</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>onChooseEffectColor()</slot>
+ </connection>
+ <connection>
+ <sender>comboEffect</sender>
+ <signal>activated(int)</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>onEffect(int)</slot>
+ </connection>
+ <connection>
+ <sender>checkBuildEffect</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>onToggleBuildEffects(bool)</slot>
+ </connection>
+ <connection>
+ <sender>buttonHelp</sender>
+ <signal>clicked()</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>showHelp()</slot>
+ </connection>
+ <connection>
+ <sender>checkBuildEffect</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>comboEffect</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkBuildEffect</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>buttonEffect</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkBuildInactive</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>onToggleBuildInactive(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkBuildDisabled</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PaletteEditorAdvancedBase</receiver>
+ <slot>onToggleBuildDisabled(bool)</slot>
+ </connection>
+ <slot access="protected" language="C++" returnType="void">init()</slot>
+ <slot access="protected" language="C++" returnType="void">destroy()</slot>
+ <slot access="protected" language="C++" returnType="void">onToggleBuildDisabled(bool)</slot>
+ <slot access="protected" language="C++" returnType="void">onCentral(int)</slot>
+ <slot access="protected" language="C++" returnType="void">onChooseCentralColor()</slot>
+ <slot access="protected" language="C++" returnType="void">onChooseEffectColor()</slot>
+ <slot access="protected" language="C++" returnType="void">onChoosePixmap()</slot>
+ <slot access="protected" language="C++" returnType="void">onEffect(int)</slot>
+ <slot access="protected" language="C++" returnType="void">onToggleBuildEffects(bool)</slot>
+ <slot access="protected" language="C++" returnType="void">onToggleBuildInactive(bool)</slot>
+ <slot access="protected" language="C++" returnType="void">paletteSelected(int)</slot>
+ <slot access="public" language="C++" returnType="void">showHelp()</slot>
+</connections>
+<tabstops>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+ <tabstop>paletteCombo</tabstop>
+ <tabstop>checkBuildInactive</tabstop>
+ <tabstop>checkBuildDisabled</tabstop>
+ <tabstop>comboCentral</tabstop>
+ <tabstop>buttonPixmap</tabstop>
+ <tabstop>buttonCentral</tabstop>
+ <tabstop>checkBuildEffect</tabstop>
+ <tabstop>comboEffect</tabstop>
+ <tabstop>buttonEffect</tabstop>
+ <tabstop>buttonHelp</tabstop>
+</tabstops>
+</UI>
diff --git a/tools/designer/designer/paletteeditoradvancedimpl.cpp b/tools/designer/designer/paletteeditoradvancedimpl.cpp
new file mode 100644
index 0000000..43d63de
--- /dev/null
+++ b/tools/designer/designer/paletteeditoradvancedimpl.cpp
@@ -0,0 +1,650 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "paletteeditoradvancedimpl.h"
+#include "styledbutton.h"
+#include "mainwindow.h"
+#include "formwindow.h"
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qapplication.h>
+#include <qpushbutton.h>
+#include <qlistbox.h>
+#include <qpainter.h>
+#include <qgroupbox.h>
+
+/*!
+ Class used by PaletteEditor for bold combobox items
+*/
+
+class BoldListBoxText : public QListBoxText
+{
+public:
+ BoldListBoxText( QString text, QListBox* lb = 0 );
+
+protected:
+ virtual void paint( QPainter* );
+};
+
+BoldListBoxText::BoldListBoxText( QString text, QListBox* lb )
+ : QListBoxText( lb )
+{
+ setText( text );
+}
+
+void BoldListBoxText::paint( QPainter* painter )
+{
+ QFont f = painter->font();
+ f.setBold( TRUE );
+ painter->setFont( f );
+
+ QListBoxText::paint( painter );
+}
+
+PaletteEditorAdvanced::PaletteEditorAdvanced( FormWindow *fw, QWidget * parent,
+ const char * name, bool modal, WFlags f )
+ : PaletteEditorAdvancedBase( parent, name, modal, f ), formWindow( fw ), selectedPalette(0)
+{
+ connect( buttonHelp, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+
+ buttonPixmap->setEditor( StyledButton::PixmapEditor );
+
+ editPalette = QApplication::palette();
+ setPreviewPalette( editPalette );
+
+ buttonPixmap->setFormWindow( formWindow );
+
+ // force toggle event
+ checkBuildEffect->setChecked(FALSE);
+ checkBuildEffect->setChecked(TRUE);
+}
+
+PaletteEditorAdvanced::~PaletteEditorAdvanced()
+{
+}
+
+void PaletteEditorAdvanced::onToggleBuildInactive( bool v )
+{
+ if (selectedPalette == 1) {
+ groupCentral->setDisabled(v);
+ groupEffect->setDisabled(v);
+ }
+
+ if (v) {
+ buildInactive();
+ updateStyledButtons();
+ }
+}
+
+void PaletteEditorAdvanced::onToggleBuildDisabled( bool v )
+{
+ if (selectedPalette == 2) {
+ groupCentral->setDisabled(v);
+ groupEffect->setDisabled(v);
+ }
+
+ if (v) {
+ buildDisabled();
+ updateStyledButtons();
+ }
+}
+
+void PaletteEditorAdvanced::paletteSelected(int p)
+{
+ selectedPalette = p;
+
+ if(p == 1) { // inactive
+ groupCentral->setDisabled(checkBuildInactive->isChecked());
+ groupEffect->setDisabled(checkBuildInactive->isChecked());
+ }
+ else if (p == 2) { // disabled
+ groupCentral->setDisabled(checkBuildDisabled->isChecked());
+ groupEffect->setDisabled(checkBuildDisabled->isChecked());
+ }
+ else {
+ groupCentral->setEnabled(TRUE);
+ groupEffect->setEnabled(TRUE);
+ }
+ updateStyledButtons();
+}
+
+void PaletteEditorAdvanced::onChooseCentralColor()
+{
+ switch(selectedPalette) {
+ case 0:
+ default:
+ mapToActiveCentralRole( buttonCentral->color() );
+ break;
+ case 1:
+ mapToInactiveCentralRole( buttonCentral->color() );
+ break;
+ case 2:
+ mapToDisabledCentralRole( buttonCentral->color() );
+ break;
+ }
+ updateStyledButtons();
+}
+
+void PaletteEditorAdvanced::onChooseEffectColor()
+{
+ switch(selectedPalette) {
+ case 0:
+ default:
+ mapToActiveEffectRole( buttonEffect->color() );
+ break;
+ case 1:
+ mapToInactiveEffectRole( buttonEffect->color() );
+ break;
+ case 2:
+ mapToDisabledEffectRole( buttonEffect->color() );
+ break;
+ }
+ updateStyledButtons();
+}
+
+void PaletteEditorAdvanced::onChoosePixmap()
+{
+ if (buttonPixmap->pixmap()) {
+ switch(selectedPalette) {
+ case 0:
+ default:
+ mapToActivePixmapRole( *buttonPixmap->pixmap() );
+ break;
+ case 1:
+ mapToInactivePixmapRole( *buttonPixmap->pixmap() );
+ break;
+ case 2:
+ mapToDisabledPixmapRole( *buttonPixmap->pixmap() );
+ break;
+ }
+ }
+ updateStyledButtons();
+}
+
+void PaletteEditorAdvanced::onToggleBuildEffects( bool on )
+{
+ if (!on) return;
+ buildActiveEffect();
+ buildInactiveEffect();
+ buildDisabledEffect();
+}
+
+QColorGroup::ColorRole PaletteEditorAdvanced::centralFromItem( int item )
+{
+ switch( item ) {
+ case 0:
+ return QColorGroup::Background;
+ case 1:
+ return QColorGroup::Foreground;
+ case 2:
+ return QColorGroup::Button;
+ case 3:
+ return QColorGroup::Base;
+ case 4:
+ return QColorGroup::Text;
+ case 5:
+ return QColorGroup::BrightText;
+ case 6:
+ return QColorGroup::ButtonText;
+ case 7:
+ return QColorGroup::Highlight;
+ case 8:
+ return QColorGroup::HighlightedText;
+ case 9:
+ return QColorGroup::Link;
+ case 10:
+ return QColorGroup::LinkVisited;
+ default:
+ return QColorGroup::NColorRoles;
+ }
+}
+
+QColorGroup::ColorRole PaletteEditorAdvanced::effectFromItem( int item )
+{
+ switch( item ) {
+ case 0:
+ return QColorGroup::Light;
+ case 1:
+ return QColorGroup::Midlight;
+ case 2:
+ return QColorGroup::Mid;
+ case 3:
+ return QColorGroup::Dark;
+ case 4:
+ return QColorGroup::Shadow;
+ default:
+ return QColorGroup::NColorRoles;
+ }
+}
+
+void PaletteEditorAdvanced::onCentral( int item )
+{
+ QPixmap* p = 0;
+ QColor c;
+
+ switch(selectedPalette) {
+ case 0:
+ default:
+ c = editPalette.active().color( centralFromItem(item) );
+ p = editPalette.active().brush( centralFromItem(item) ).pixmap();
+ break;
+ case 1:
+ c = editPalette.inactive().color( centralFromItem(item) );
+ p = editPalette.inactive().brush( centralFromItem(item) ).pixmap();
+ break;
+ case 2:
+ c = editPalette.disabled().color( centralFromItem(item) );
+ p = editPalette.disabled().brush( centralFromItem(item) ).pixmap();
+ break;
+ }
+
+ buttonCentral->setColor(c);
+
+ if (p)
+ buttonPixmap->setPixmap( *p );
+ else
+ buttonPixmap->setPixmap( QPixmap() );
+}
+
+void PaletteEditorAdvanced::onEffect( int item )
+{
+ QColor c;
+ switch(selectedPalette) {
+ case 0:
+ default:
+ c = editPalette.active().color( effectFromItem(item) );
+ break;
+ case 1:
+ editPalette.inactive().color( effectFromItem(item) );
+ break;
+ case 2:
+ editPalette.disabled().color( effectFromItem(item) );
+ break;
+ }
+ buttonEffect->setColor(c);
+}
+
+void PaletteEditorAdvanced::mapToActiveCentralRole( const QColor& c )
+{
+ QColorGroup cg = editPalette.active();
+ cg.setColor( centralFromItem(comboCentral->currentItem()), c );
+ editPalette.setActive( cg );
+
+ buildActiveEffect();
+ if(checkBuildInactive->isChecked())
+ buildInactive();
+ if(checkBuildDisabled->isChecked())
+ buildDisabled();
+
+ setPreviewPalette( editPalette );
+}
+
+void PaletteEditorAdvanced::mapToActiveEffectRole( const QColor& c )
+{
+ QColorGroup cg = editPalette.active();
+ cg.setColor( effectFromItem(comboEffect->currentItem()), c );
+ editPalette.setActive( cg );
+
+ if(checkBuildInactive->isChecked())
+ buildInactive();
+ if(checkBuildDisabled->isChecked())
+ buildDisabled();
+
+ setPreviewPalette( editPalette );
+}
+
+void PaletteEditorAdvanced::mapToActivePixmapRole( const QPixmap& pm )
+{
+ QColorGroup::ColorRole role = centralFromItem(comboCentral->currentItem());
+ QColorGroup cg = editPalette.active();
+ if ( !pm.isNull() )
+ cg.setBrush( role, QBrush( cg.color( role ), pm ) );
+ else
+ cg.setBrush( role, QBrush( cg.color( role ) ) );
+ editPalette.setActive( cg );
+
+
+ buildActiveEffect();
+ if(checkBuildInactive->isChecked())
+ buildInactive();
+ if(checkBuildDisabled->isChecked())
+ buildDisabled();
+
+ setPreviewPalette( editPalette );
+}
+
+void PaletteEditorAdvanced::mapToInactiveCentralRole( const QColor& c )
+{
+ QColorGroup cg = editPalette.inactive();
+ cg.setColor( centralFromItem(comboCentral->currentItem()), c );
+ editPalette.setInactive( cg );
+
+ buildInactiveEffect();
+
+ setPreviewPalette( editPalette );
+}
+
+void PaletteEditorAdvanced::mapToInactiveEffectRole( const QColor& c )
+{
+ QColorGroup cg = editPalette.inactive();
+ cg.setColor( effectFromItem(comboEffect->currentItem()), c );
+ editPalette.setInactive( cg );
+
+ setPreviewPalette( editPalette );
+}
+
+void PaletteEditorAdvanced::mapToInactivePixmapRole( const QPixmap& pm )
+{
+ QColorGroup::ColorRole role = centralFromItem(comboCentral->currentItem());
+ QColorGroup cg = editPalette.inactive();
+ if ( !pm.isNull() )
+ cg.setBrush( role, QBrush( cg.color( role ), pm ) );
+ else
+ cg.setBrush( role, QBrush( cg.color( role ) ) );
+ editPalette.setInactive( cg );
+
+ setPreviewPalette( editPalette );
+}
+
+void PaletteEditorAdvanced::mapToDisabledCentralRole( const QColor& c )
+{
+ QColorGroup cg = editPalette.disabled();
+ cg.setColor( centralFromItem(comboCentral->currentItem()), c );
+ editPalette.setDisabled( cg );
+
+ buildDisabledEffect();
+
+ setPreviewPalette( editPalette );
+}
+
+void PaletteEditorAdvanced::mapToDisabledEffectRole( const QColor& c )
+{
+ QColorGroup cg = editPalette.disabled();
+ cg.setColor( effectFromItem(comboEffect->currentItem()), c );
+ editPalette.setDisabled( cg );
+
+ setPreviewPalette( editPalette );
+}
+
+void PaletteEditorAdvanced::mapToDisabledPixmapRole( const QPixmap& pm )
+{
+ QColorGroup::ColorRole role = centralFromItem(comboCentral->currentItem());
+ QColorGroup cg = editPalette.disabled();
+ if ( !pm.isNull() )
+ cg.setBrush( role, QBrush( cg.color( role ), pm ) );
+ else
+ cg.setBrush( role, QBrush( cg.color( role ) ) );
+
+ editPalette.setDisabled( cg );
+
+ setPreviewPalette( editPalette );
+}
+
+void PaletteEditorAdvanced::buildActiveEffect()
+{
+ QColorGroup cg = editPalette.active();
+ QColor btn = cg.color( QColorGroup::Button );
+
+ QPalette temp( btn, btn );
+
+ for (int i = 0; i<5; i++)
+ cg.setColor( effectFromItem(i), temp.active().color( effectFromItem(i) ) );
+
+ editPalette.setActive( cg );
+ setPreviewPalette( editPalette );
+
+ updateStyledButtons();
+}
+
+void PaletteEditorAdvanced::buildInactive()
+{
+ editPalette.setInactive( editPalette.active() );
+ buildInactiveEffect();
+}
+
+void PaletteEditorAdvanced::buildInactiveEffect()
+{
+ QColorGroup cg = editPalette.inactive();
+
+ QColor light, midlight, mid, dark, shadow;
+ QColor btn = cg.color( QColorGroup::Button );
+
+ light = btn.light(150);
+ midlight = btn.light(115);
+ mid = btn.dark(150);
+ dark = btn.dark();
+ shadow = black;
+
+ cg.setColor( QColorGroup::Light, light );
+ cg.setColor( QColorGroup::Midlight, midlight );
+ cg.setColor( QColorGroup::Mid, mid );
+ cg.setColor( QColorGroup::Dark, dark );
+ cg.setColor( QColorGroup::Shadow, shadow );
+
+ editPalette.setInactive( cg );
+ setPreviewPalette( editPalette );
+ updateStyledButtons();
+}
+
+void PaletteEditorAdvanced::buildDisabled()
+{
+ QColorGroup cg = editPalette.active();
+ cg.setColor( QColorGroup::ButtonText, darkGray );
+ cg.setColor( QColorGroup::Foreground, darkGray );
+ editPalette.setDisabled( cg );
+
+ buildDisabledEffect();
+}
+
+void PaletteEditorAdvanced::buildDisabledEffect()
+{
+ QColorGroup cg = editPalette.disabled();
+
+ QColor light, midlight, mid, dark, shadow;
+ QColor btn = cg.color( QColorGroup::Button );
+
+ light = btn.light(150);
+ midlight = btn.light(115);
+ mid = btn.dark(150);
+ dark = btn.dark();
+ shadow = black;
+
+ cg.setColor( QColorGroup::Light, light );
+ cg.setColor( QColorGroup::Midlight, midlight );
+ cg.setColor( QColorGroup::Mid, mid );
+ cg.setColor( QColorGroup::Dark, dark );
+ cg.setColor( QColorGroup::Shadow, shadow );
+
+ editPalette.setDisabled( cg );
+ setPreviewPalette( editPalette );
+ updateStyledButtons();
+}
+
+void PaletteEditorAdvanced::setPreviewPalette( const QPalette& pal )
+{
+ QColorGroup cg;
+
+ switch (selectedPalette) {
+ case 0:
+ default:
+ cg = pal.active();
+ break;
+ case 1:
+ cg = pal.inactive();
+ break;
+ case 2:
+ cg = pal.disabled();
+ break;
+ }
+ previewPalette.setActive( cg );
+ previewPalette.setInactive( cg );
+ previewPalette.setDisabled( cg );
+}
+
+void PaletteEditorAdvanced::updateStyledButtons()
+{
+ QColor central, effect;
+ QPixmap *pm = 0;
+ switch (selectedPalette) {
+ case 0:
+ default:
+ central = editPalette.active().color( centralFromItem( comboCentral->currentItem() ) );
+ effect = editPalette.active().color( effectFromItem( comboEffect->currentItem() ) );
+ pm = editPalette.active().brush( centralFromItem( comboCentral->currentItem() ) ).pixmap();
+ break;
+ case 1:
+ central = editPalette.inactive().color( centralFromItem( comboCentral->currentItem() ) );
+ effect = editPalette.inactive().color( effectFromItem( comboEffect->currentItem() ) );
+ pm = editPalette.inactive().brush( centralFromItem( comboCentral->currentItem() ) ).pixmap();
+ break;
+ case 2:
+ central = editPalette.disabled().color( centralFromItem( comboCentral->currentItem() ) );
+ effect = editPalette.disabled().color( effectFromItem( comboEffect->currentItem() ) );
+ pm = editPalette.disabled().brush( centralFromItem( comboCentral->currentItem() ) ).pixmap();
+ break;
+ }
+
+ buttonCentral->setColor(central);
+ buttonEffect->setColor(effect);
+ if ( pm && !pm->isNull() )
+ buttonPixmap->setPixmap( *pm );
+ else
+ buttonPixmap->setPixmap(QPixmap());
+}
+
+void PaletteEditorAdvanced::setPal( const QPalette& pal )
+{
+ editPalette = pal;
+ setPreviewPalette( pal );
+ updateStyledButtons();
+}
+
+QPalette PaletteEditorAdvanced::pal() const
+{
+ return editPalette;
+}
+
+void PaletteEditorAdvanced::setupBackgroundMode( BackgroundMode mode )
+{
+ int initRole = 0;
+
+ switch( mode ) {
+ case PaletteBackground:
+ initRole = 0;
+ break;
+ case PaletteForeground:
+ initRole = 1;
+ break;
+ case PaletteButton:
+ initRole = 2;
+ break;
+ case PaletteBase:
+ initRole = 3;
+ break;
+ case PaletteText:
+ initRole = 4;
+ break;
+ case PaletteBrightText:
+ initRole = 5;
+ break;
+ case PaletteButtonText:
+ initRole = 6;
+ break;
+ case PaletteHighlight:
+ initRole = 7;
+ break;
+ case PaletteHighlightedText:
+ initRole = 8;
+ break;
+ case PaletteLight:
+ initRole = 9;
+ break;
+ case PaletteMidlight:
+ initRole = 10;
+ break;
+ case PaletteDark:
+ initRole = 11;
+ break;
+ case PaletteMid:
+ initRole = 12;
+ break;
+ case PaletteShadow:
+ initRole = 13;
+ break;
+ default:
+ initRole = -1;
+ break;
+ }
+
+ if ( initRole <= -1 ) return;
+
+ if (initRole > 8 ) {
+ comboEffect->setCurrentItem( initRole - 9 );
+ if ( comboEffect->listBox() ) {
+ QString text = comboEffect->currentText();
+ comboEffect->listBox()->changeItem( new BoldListBoxText( text ), initRole - 9 );
+ }
+ }
+ else {
+ comboCentral->setCurrentItem( initRole );
+ if ( comboCentral->listBox() ) {
+ QString text = comboCentral->currentText();
+ comboCentral->listBox()->changeItem( new BoldListBoxText( text ), initRole );
+ }
+ }
+}
+
+QPalette PaletteEditorAdvanced::getPalette( bool *ok, const QPalette &init,
+ BackgroundMode mode, QWidget* parent,
+ const char* name, FormWindow *fw )
+{
+ PaletteEditorAdvanced* dlg = new PaletteEditorAdvanced( fw, parent, name, TRUE );
+ dlg->setupBackgroundMode( mode );
+
+ if ( init != QPalette() )
+ dlg->setPal( init );
+ int resultCode = dlg->exec();
+
+ QPalette result = init;
+ if ( resultCode == QDialog::Accepted ) {
+ if ( ok )
+ *ok = TRUE;
+ result = dlg->pal();
+ } else {
+ if ( ok )
+ *ok = FALSE;
+ }
+ delete dlg;
+ return result;
+}
diff --git a/tools/designer/designer/paletteeditoradvancedimpl.h b/tools/designer/designer/paletteeditoradvancedimpl.h
new file mode 100644
index 0000000..e16e600
--- /dev/null
+++ b/tools/designer/designer/paletteeditoradvancedimpl.h
@@ -0,0 +1,103 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PALETTEEDITORADVANCEDIMPL_H
+#define PALETTEEDITORADVANCEDIMPL_H
+
+#include "paletteeditoradvanced.h"
+
+class FormWindow;
+
+class PaletteEditorAdvanced : public PaletteEditorAdvancedBase
+{
+ Q_OBJECT
+public:
+ PaletteEditorAdvanced( FormWindow *fw, QWidget * parent=0, const char * name=0,
+ bool modal=FALSE, WFlags f=0 );
+ ~PaletteEditorAdvanced();
+
+ static QPalette getPalette( bool *ok, const QPalette &pal, BackgroundMode mode = PaletteBackground,
+ QWidget* parent = 0, const char* name = 0, FormWindow *fw = 0 );
+
+protected slots:
+ void paletteSelected(int);
+
+ void onCentral( int );
+ void onEffect( int );
+
+ void onChooseCentralColor();
+ void onChooseEffectColor();
+ void onChoosePixmap();
+
+ void onToggleBuildEffects( bool );
+ void onToggleBuildInactive( bool );
+ void onToggleBuildDisabled( bool );
+
+protected:
+ void mapToActiveCentralRole( const QColor& );
+ void mapToActiveEffectRole( const QColor& );
+ void mapToActivePixmapRole( const QPixmap& );
+ void mapToInactiveCentralRole( const QColor& );
+ void mapToInactiveEffectRole( const QColor& );
+ void mapToInactivePixmapRole( const QPixmap& );
+ void mapToDisabledCentralRole( const QColor& );
+ void mapToDisabledEffectRole( const QColor& );
+ void mapToDisabledPixmapRole( const QPixmap& );
+
+
+ void buildPalette();
+ void buildActiveEffect();
+ void buildInactive();
+ void buildInactiveEffect();
+ void buildDisabled();
+ void buildDisabledEffect();
+
+private:
+ void setPreviewPalette( const QPalette& );
+ void updateStyledButtons();
+ void setupBackgroundMode( BackgroundMode );
+
+ QPalette pal() const;
+ void setPal( const QPalette& );
+
+ QColorGroup::ColorRole centralFromItem( int );
+ QColorGroup::ColorRole effectFromItem( int );
+ QPalette editPalette;
+ QPalette previewPalette;
+
+ FormWindow *formWindow;
+
+ int selectedPalette;
+};
+
+#endif
diff --git a/tools/designer/designer/paletteeditorimpl.cpp b/tools/designer/designer/paletteeditorimpl.cpp
new file mode 100644
index 0000000..1a790dd
--- /dev/null
+++ b/tools/designer/designer/paletteeditorimpl.cpp
@@ -0,0 +1,311 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "paletteeditorimpl.h"
+#include "paletteeditoradvancedimpl.h"
+#include "previewframe.h"
+#include "styledbutton.h"
+#include "mainwindow.h"
+#include "formwindow.h"
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qapplication.h>
+#include <qpushbutton.h>
+
+PaletteEditor::PaletteEditor( FormWindow *fw, QWidget * parent, const char * name, bool modal, WFlags f )
+ : PaletteEditorBase( parent, name, modal, f ), formWindow( fw )
+{
+ connect( buttonHelp, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+
+ editPalette = QApplication::palette();
+ setPreviewPalette( editPalette );
+
+ buttonMainColor->setColor( editPalette.active().color( QColorGroup::Button ) );
+ buttonMainColor2->setColor( editPalette.active().color( QColorGroup::Background ) );
+}
+
+PaletteEditor::~PaletteEditor()
+{
+}
+
+void PaletteEditor::onTune()
+{
+ bool ok;
+ QPalette pal = PaletteEditorAdvanced::getPalette( &ok, editPalette, backgroundMode, this, "tune_palette", formWindow);
+ if (!ok) return;
+
+ editPalette = pal;
+ setPreviewPalette( editPalette );
+}
+
+void PaletteEditor::onChooseMainColor()
+{
+ buildPalette();
+}
+
+void PaletteEditor::onChoose2ndMainColor()
+{
+ buildPalette();
+}
+
+void PaletteEditor::paletteSelected(int)
+{
+ setPreviewPalette(editPalette);
+}
+
+QColorGroup::ColorRole PaletteEditor::centralFromItem( int item )
+{
+ switch( item )
+ {
+ case 0:
+ return QColorGroup::Background;
+ case 1:
+ return QColorGroup::Foreground;
+ case 2:
+ return QColorGroup::Button;
+ case 3:
+ return QColorGroup::Base;
+ case 4:
+ return QColorGroup::Text;
+ case 5:
+ return QColorGroup::BrightText;
+ case 6:
+ return QColorGroup::ButtonText;
+ case 7:
+ return QColorGroup::Highlight;
+ case 8:
+ return QColorGroup::HighlightedText;
+ default:
+ return QColorGroup::NColorRoles;
+ }
+}
+
+QColorGroup::ColorRole PaletteEditor::effectFromItem( int item )
+{
+ switch( item )
+ {
+ case 0:
+ return QColorGroup::Light;
+ case 1:
+ return QColorGroup::Midlight;
+ case 2:
+ return QColorGroup::Mid;
+ case 3:
+ return QColorGroup::Dark;
+ case 4:
+ return QColorGroup::Shadow;
+ default:
+ return QColorGroup::NColorRoles;
+ }
+}
+
+void PaletteEditor::buildPalette()
+{
+ int i;
+ QColorGroup cg;
+ QColor btn = buttonMainColor->color();
+ QColor back = buttonMainColor2->color();
+ QPalette automake( btn, back );
+
+ for (i = 0; i<9; i++)
+ cg.setColor( centralFromItem(i), automake.active().color( centralFromItem(i) ) );
+
+ editPalette.setActive( cg );
+ buildActiveEffect();
+
+ cg = editPalette.inactive();
+
+ QPalette temp( editPalette.active().color( QColorGroup::Button ),
+ editPalette.active().color( QColorGroup::Background ) );
+
+ for (i = 0; i<9; i++)
+ cg.setColor( centralFromItem(i), temp.inactive().color( centralFromItem(i) ) );
+
+ editPalette.setInactive( cg );
+ buildInactiveEffect();
+
+ cg = editPalette.disabled();
+
+ for (i = 0; i<9; i++)
+ cg.setColor( centralFromItem(i), temp.disabled().color( centralFromItem(i) ) );
+
+ editPalette.setDisabled( cg );
+ buildDisabledEffect();
+
+ updateStyledButtons();
+}
+
+void PaletteEditor::buildActiveEffect()
+{
+ QColorGroup cg = editPalette.active();
+ QColor btn = cg.color( QColorGroup::Button );
+
+ QPalette temp( btn, btn );
+
+ for (int i = 0; i<5; i++)
+ cg.setColor( effectFromItem(i), temp.active().color( effectFromItem(i) ) );
+
+ editPalette.setActive( cg );
+ setPreviewPalette( editPalette );
+
+ updateStyledButtons();
+}
+
+void PaletteEditor::buildInactive()
+{
+ editPalette.setInactive( editPalette.active() );
+ buildInactiveEffect();
+}
+
+void PaletteEditor::buildInactiveEffect()
+{
+ QColorGroup cg = editPalette.inactive();
+
+ QColor light, midlight, mid, dark, shadow;
+ QColor btn = cg.color( QColorGroup::Button );
+
+ light = btn.light(150);
+ midlight = btn.light(115);
+ mid = btn.dark(150);
+ dark = btn.dark();
+ shadow = black;
+
+ cg.setColor( QColorGroup::Light, light );
+ cg.setColor( QColorGroup::Midlight, midlight );
+ cg.setColor( QColorGroup::Mid, mid );
+ cg.setColor( QColorGroup::Dark, dark );
+ cg.setColor( QColorGroup::Shadow, shadow );
+
+ editPalette.setInactive( cg );
+ setPreviewPalette( editPalette );
+ updateStyledButtons();
+}
+
+void PaletteEditor::buildDisabled()
+{
+ QColorGroup cg = editPalette.active();
+ cg.setColor( QColorGroup::ButtonText, darkGray );
+ cg.setColor( QColorGroup::Foreground, darkGray );
+ editPalette.setDisabled( cg );
+
+ buildDisabledEffect();
+}
+
+void PaletteEditor::buildDisabledEffect()
+{
+ QColorGroup cg = editPalette.disabled();
+
+ QColor light, midlight, mid, dark, shadow;
+ QColor btn = cg.color( QColorGroup::Button );
+
+ light = btn.light(150);
+ midlight = btn.light(115);
+ mid = btn.dark(150);
+ dark = btn.dark();
+ shadow = black;
+
+ cg.setColor( QColorGroup::Light, light );
+ cg.setColor( QColorGroup::Midlight, midlight );
+ cg.setColor( QColorGroup::Mid, mid );
+ cg.setColor( QColorGroup::Dark, dark );
+ cg.setColor( QColorGroup::Shadow, shadow );
+
+ editPalette.setDisabled( cg );
+ setPreviewPalette( editPalette );
+ updateStyledButtons();
+}
+
+void PaletteEditor::setPreviewPalette( const QPalette& pal )
+{
+ QColorGroup cg;
+
+ switch (paletteCombo->currentItem()) {
+ case 0:
+ default:
+ cg = pal.active();
+ break;
+ case 1:
+ cg = pal.inactive();
+ break;
+ case 2:
+ cg = pal.disabled();
+ break;
+ }
+ previewPalette.setActive( cg );
+ previewPalette.setInactive( cg );
+ previewPalette.setDisabled( cg );
+
+ previewFrame->setPreviewPalette(previewPalette);
+}
+
+void PaletteEditor::updateStyledButtons()
+{
+ buttonMainColor->setColor( editPalette.active().color( QColorGroup::Button ));
+ buttonMainColor2->setColor( editPalette.active().color( QColorGroup::Background ));
+}
+
+void PaletteEditor::setPal( const QPalette& pal )
+{
+ editPalette = pal;
+ setPreviewPalette( pal );
+ updateStyledButtons();
+}
+
+QPalette PaletteEditor::pal() const
+{
+ return editPalette;
+}
+
+QPalette PaletteEditor::getPalette( bool *ok, const QPalette &init, BackgroundMode mode,
+ QWidget* parent, const char* name, FormWindow *fw )
+{
+ PaletteEditor* dlg = new PaletteEditor( fw, parent, name, TRUE );
+ dlg->setupBackgroundMode( mode );
+
+ if ( init != QPalette() )
+ dlg->setPal( init );
+ int resultCode = dlg->exec();
+
+ QPalette result = init;
+ if ( resultCode == QDialog::Accepted ) {
+ if ( ok )
+ *ok = TRUE;
+ result = dlg->pal();
+ } else {
+ if ( ok )
+ *ok = FALSE;
+ }
+ delete dlg;
+ return result;
+}
diff --git a/tools/designer/designer/paletteeditorimpl.h b/tools/designer/designer/paletteeditorimpl.h
new file mode 100644
index 0000000..806651e
--- /dev/null
+++ b/tools/designer/designer/paletteeditorimpl.h
@@ -0,0 +1,83 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PALETTEEDITORIMPL_H
+#define PALETTEEDITORIMPL_H
+
+#include "paletteeditor.h"
+
+class FormWindow;
+
+class PaletteEditor : public PaletteEditorBase
+{
+ Q_OBJECT
+
+public:
+ PaletteEditor( FormWindow *fw, QWidget * parent=0, const char * name=0, bool modal=FALSE, WFlags f=0 );
+ ~PaletteEditor();
+
+ static QPalette getPalette( bool *ok, const QPalette &pal, BackgroundMode mode = PaletteBackground,
+ QWidget* parent = 0, const char* name = 0, FormWindow *fw = 0 );
+
+protected slots:
+ void onChooseMainColor();
+ void onChoose2ndMainColor();
+ void onTune();
+ void paletteSelected(int);
+
+protected:
+ void buildPalette();
+ void buildActiveEffect();
+ void buildInactive();
+ void buildInactiveEffect();
+ void buildDisabled();
+ void buildDisabledEffect();
+
+private:
+ void setPreviewPalette( const QPalette& );
+ void updateStyledButtons();
+ void setupBackgroundMode( BackgroundMode mode ) { backgroundMode = mode; }
+
+ QPalette pal() const;
+ void setPal( const QPalette& );
+
+ QColorGroup::ColorRole centralFromItem( int );
+ QColorGroup::ColorRole effectFromItem( int );
+ QPalette editPalette;
+ QPalette previewPalette;
+
+ FormWindow *formWindow;
+ BackgroundMode backgroundMode;
+};
+
+#endif
diff --git a/tools/designer/designer/pixmapchooser.cpp b/tools/designer/designer/pixmapchooser.cpp
new file mode 100644
index 0000000..8c8b0a7
--- /dev/null
+++ b/tools/designer/designer/pixmapchooser.cpp
@@ -0,0 +1,206 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qvariant.h> // HP-UX compiler needs this here
+
+#include "pixmapchooser.h"
+#include "formwindow.h"
+#if defined(DESIGNER) && !defined(RESOURCE)
+#include "pixmapfunction.h"
+#endif
+#include "metadatabase.h"
+#include "mainwindow.h"
+#include "pixmapcollectioneditor.h"
+#include "pixmapcollection.h"
+#include "project.h"
+
+#include <qapplication.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qiconview.h>
+
+#if defined(DESIGNER)
+static ImageIconProvider *imageIconProvider = 0;
+#endif
+
+PixmapView::PixmapView( QWidget *parent )
+ : QScrollView( parent )
+{
+ viewport()->setBackgroundMode( PaletteBase );
+}
+
+void PixmapView::setPixmap( const QPixmap &pix )
+{
+ pixmap = pix;
+ resizeContents( pixmap.size().width(), pixmap.size().height() );
+ viewport()->repaint( FALSE );
+}
+
+void PixmapView::drawContents( QPainter *p, int cx, int cy, int cw, int ch )
+{
+ p->fillRect( cx, cy, cw, ch, colorGroup().brush( QColorGroup::Base ) );
+ p->drawPixmap( 0, 0, pixmap );
+}
+
+void PixmapView::previewUrl( const QUrl &u )
+{
+ if ( u.isLocalFile() ) {
+ QString path = u.path();
+ QPixmap pix( path );
+ if ( !pix.isNull() )
+ setPixmap( pix );
+ } else {
+ qWarning( "Previewing remote files not supported." );
+ }
+}
+
+static void buildImageFormatList( QString &filter, QString &all )
+{
+ all = qApp->translate( "qChoosePixmap", "All Pixmaps (" );
+ for ( uint i = 0; i < QImageIO::outputFormats().count(); i++ ) {
+ QString outputFormat = QImageIO::outputFormats().at( i );
+ QString outputExtension;
+ if ( outputFormat != "JPEG" )
+ outputExtension = outputFormat.lower();
+ else
+ outputExtension = "jpg;*.jpeg";
+ filter += qApp->translate( "qChoosePixmap", "%1-Pixmaps (%2)\n" ).
+ arg( outputFormat ).arg( "*." + outputExtension);
+ all += "*." + outputExtension + ";";
+ }
+ filter.prepend( all + qApp->translate( "qChoosePixmap", ")\n" ) );
+ filter += qApp->translate( "qChoosePixmap", "All Files (*)" );
+
+}
+QStringList qChoosePixmaps( QWidget *parent )
+{
+ if ( !imageIconProvider && !QFileDialog::iconProvider() )
+ QFileDialog::setIconProvider( ( imageIconProvider = new ImageIconProvider ) );
+
+ QString filter;
+ QString all;
+ buildImageFormatList( filter, all );
+
+ QFileDialog fd( QString::null, filter, parent, 0, TRUE );
+ fd.setMode( QFileDialog::ExistingFiles );
+ fd.setContentsPreviewEnabled( TRUE );
+ PixmapView *pw = new PixmapView( &fd );
+ fd.setContentsPreview( pw, pw );
+ fd.setViewMode( QFileDialog::List );
+ fd.setPreviewMode( QFileDialog::Contents );
+ fd.setCaption( qApp->translate( "qChoosePixmap", "Choose Images..." ) );
+ if ( fd.exec() == QDialog::Accepted )
+ return fd.selectedFiles();
+ return QStringList();
+}
+
+QPixmap qChoosePixmap( QWidget *parent, FormWindow *fw, const QPixmap &old, QString *fn )
+{
+#if defined(DESIGNER)
+ if ( !fw || fw->savePixmapInline() ) {
+ if ( !imageIconProvider && !QFileDialog::iconProvider() )
+ QFileDialog::setIconProvider( ( imageIconProvider = new ImageIconProvider ) );
+
+ QString filter;
+ QString all;
+ buildImageFormatList( filter, all );
+
+ QFileDialog fd( QString::null, filter, parent, 0, TRUE );
+ fd.setContentsPreviewEnabled( TRUE );
+ PixmapView *pw = new PixmapView( &fd );
+ fd.setContentsPreview( pw, pw );
+ fd.setViewMode( QFileDialog::List );
+ fd.setPreviewMode( QFileDialog::Contents );
+ fd.setCaption( qApp->translate( "qChoosePixmap", "Choose a Pixmap..." ) );
+ if ( fd.exec() == QDialog::Accepted ) {
+ QPixmap pix( fd.selectedFile() );
+ if ( fn )
+ *fn = fd.selectedFile();
+ MetaDataBase::setPixmapArgument( fw, pix.serialNumber(), fd.selectedFile() );
+ return pix;
+ }
+ } else if ( fw && fw->savePixmapInProject() ) {
+ PixmapCollectionEditor dia( parent, 0, TRUE );
+ dia.setProject( fw->project() );
+ dia.setChooserMode( TRUE );
+ dia.setCurrentItem( MetaDataBase::pixmapKey( fw, old.serialNumber() ) );
+ if ( dia.exec() == QDialog::Accepted ) {
+ QPixmap pix( fw->project()->pixmapCollection()->pixmap( dia.viewPixmaps->currentItem()->text() ) );
+ MetaDataBase::setPixmapKey( fw, pix.serialNumber(), dia.viewPixmaps->currentItem()->text() );
+ return pix;
+ }
+ } else {
+ PixmapFunction dia( parent, 0, TRUE );
+ QObject::connect( dia.helpButton, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+ dia.labelFunction->setText( fw->pixmapLoaderFunction() + "(" );
+ dia.editArguments->setText( MetaDataBase::pixmapArgument( fw, old.serialNumber() ) );
+ dia.editArguments->setFocus();
+ if ( dia.exec() == QDialog::Accepted ) {
+ QPixmap pix;
+ // we have to force the pixmap to get a new and unique serial number. Unfortunately detatch() doesn't do that
+ pix.convertFromImage( QPixmap::fromMimeSource( "designer_image.png" ).convertToImage() );
+
+ MetaDataBase::setPixmapArgument( fw, pix.serialNumber(), dia.editArguments->text() );
+ return pix;
+ }
+ }
+#else
+ Q_UNUSED( parent );
+ Q_UNUSED( fw );
+ Q_UNUSED( old );
+#endif
+ return QPixmap();
+}
+
+ImageIconProvider::ImageIconProvider( QWidget *parent, const char *name )
+ : QFileIconProvider( parent, name ), imagepm( QPixmap::fromMimeSource( "designer_image.png" ) )
+{
+ fmts = QImage::inputFormats();
+}
+
+ImageIconProvider::~ImageIconProvider()
+{
+}
+
+const QPixmap * ImageIconProvider::pixmap( const QFileInfo &fi )
+{
+ QString ext = fi.extension().upper();
+ if ( fmts.contains( ext ) ) {
+ return &imagepm;
+ } else {
+ return QFileIconProvider::pixmap( fi );
+ }
+}
diff --git a/tools/designer/designer/pixmapchooser.h b/tools/designer/designer/pixmapchooser.h
new file mode 100644
index 0000000..3ed4ae4
--- /dev/null
+++ b/tools/designer/designer/pixmapchooser.h
@@ -0,0 +1,79 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PIXMAPCHOOSER_H
+#define PIXMAPCHOOSER_H
+
+#include <qfiledialog.h>
+#include <qscrollview.h>
+#include <qpixmap.h>
+#include <qurl.h>
+
+class FormWindow;
+
+class PixmapView : public QScrollView,
+ public QFilePreview
+{
+ Q_OBJECT
+
+public:
+ PixmapView( QWidget *parent );
+ void setPixmap( const QPixmap &pix );
+ void drawContents( QPainter *p, int, int, int, int );
+ void previewUrl( const QUrl &u );
+
+private:
+ QPixmap pixmap;
+
+};
+
+class ImageIconProvider : public QFileIconProvider
+{
+ Q_OBJECT
+
+public:
+ ImageIconProvider( QWidget *parent = 0, const char *name = 0 );
+ ~ImageIconProvider();
+
+ const QPixmap *pixmap( const QFileInfo &fi );
+
+private:
+ QStrList fmts;
+ QPixmap imagepm;
+
+};
+
+QPixmap qChoosePixmap( QWidget *parent, FormWindow *fw = 0, const QPixmap &old = QPixmap(), QString *fn = 0 );
+QStringList qChoosePixmaps( QWidget *parent );
+
+#endif
diff --git a/tools/designer/designer/pixmapcollection.cpp b/tools/designer/designer/pixmapcollection.cpp
new file mode 100644
index 0000000..e70ae00
--- /dev/null
+++ b/tools/designer/designer/pixmapcollection.cpp
@@ -0,0 +1,187 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "pixmapcollection.h"
+#include "project.h"
+#include "mainwindow.h"
+#include <qmime.h>
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+#include <qimage.h>
+
+PixmapCollection::PixmapCollection( Project *pro )
+ : project( pro )
+{
+ iface = new DesignerPixmapCollectionImpl( this );
+ mimeSourceFactory = new QMimeSourceFactory();
+}
+
+PixmapCollection::~PixmapCollection()
+{
+ delete mimeSourceFactory;
+ delete iface;
+}
+
+bool PixmapCollection::addPixmap( const Pixmap &pix, bool force )
+{
+ Pixmap pixmap = pix;
+ savePixmap( pixmap );
+
+ if ( !force ) {
+ for ( QValueList<Pixmap>::Iterator it = pixList.begin(); it != pixList.end(); ++it ) {
+ if ( (*it).name == pixmap.name )
+ return FALSE;
+ }
+ }
+
+ pixList.append( pixmap );
+ mimeSourceFactory->setPixmap( pixmap.name, pixmap.pix );
+ project->setModified( TRUE );
+ return TRUE;
+}
+
+void PixmapCollection::removePixmap( const QString &name )
+{
+ for ( QValueList<Pixmap>::Iterator it = pixList.begin(); it != pixList.end(); ++it ) {
+ if ( (*it).name == name ) {
+ pixList.remove( it );
+ break;
+ }
+ }
+ project->setModified( TRUE );
+}
+
+QValueList<PixmapCollection::Pixmap> PixmapCollection::pixmaps() const
+{
+ return pixList;
+}
+
+QString PixmapCollection::unifyName( const QString &n )
+{
+ QString name = n;
+ bool restart = FALSE;
+ int added = 1;
+
+ for ( QValueList<Pixmap>::Iterator it = pixList.begin(); it != pixList.end(); ++it ) {
+ if ( restart )
+ it = pixList.begin();
+ restart = FALSE;
+ if ( name == (*it).name ) {
+ name = n;
+ name += "_" + QString::number( added );
+ ++added;
+ restart = TRUE;
+ }
+ }
+
+ return name;
+}
+
+void PixmapCollection::setActive( bool b )
+{
+ if ( b )
+ QMimeSourceFactory::defaultFactory()->addFactory( mimeSourceFactory );
+ else
+ QMimeSourceFactory::defaultFactory()->removeFactory( mimeSourceFactory );
+}
+
+QPixmap PixmapCollection::pixmap( const QString &name )
+{
+ for ( QValueList<Pixmap>::Iterator it = pixList.begin(); it != pixList.end(); ++it ) {
+ if ( (*it).name == name )
+ return (*it).pix;
+ }
+ return QPixmap();
+}
+
+void PixmapCollection::savePixmap( Pixmap &pix )
+{
+ if ( pix.absname == imageDir() + "/" + pix.name )
+ return; // no need to save, it is already there
+ QString rel = project->makeRelative( pix.absname );
+ if ( rel[0] == '/' || ( rel[1] == ':' && rel[2] == '/' ) ) { // only save if file is outside the project
+ mkdir();
+ pix.name = unifyName( QFileInfo( pix.absname ).baseName() ) + ".png";
+ pix.absname = imageDir() + "/" + pix.name;
+ pix.pix.save( pix.absname, "PNG" );
+ } else if ( rel.isEmpty() ) {
+ mkdir();
+ pix.name = unifyName( pix.name );
+ pix.absname = imageDir() + "/" + pix.name;
+ pix.pix.save( pix.absname, "PNG" );
+ }
+}
+
+QString PixmapCollection::imageDir() const
+{
+ return QFileInfo( project->fileName() ).dirPath( TRUE ) + "/images";
+}
+
+void PixmapCollection::mkdir()
+{
+ QString f = project->fileName();
+ QDir d( QFileInfo( f ).dirPath( TRUE ) );
+ d.mkdir( "images" );
+}
+
+void PixmapCollection::load( const QString& filename )
+{
+ if ( filename.isEmpty() )
+ return;
+ QString absfile;
+ if ( filename[0] == '/' )
+ absfile = filename;
+ else
+ absfile = QFileInfo( project->fileName() ).dirPath( TRUE ) + "/" + filename;
+
+ QPixmap pm( absfile );
+ if ( pm.isNull() )
+ return;
+
+ Pixmap pix;
+ pix.name = QFileInfo( absfile ).fileName();
+ pix.absname = absfile;
+ pix.pix = pm;
+ addPixmap( pix, TRUE );
+}
+
+DesignerPixmapCollection *PixmapCollection::iFace()
+{
+ return iface;
+}
+
+bool PixmapCollection::isEmpty() const
+{
+ return pixList.isEmpty();
+}
diff --git a/tools/designer/designer/pixmapcollection.h b/tools/designer/designer/pixmapcollection.h
new file mode 100644
index 0000000..0900209
--- /dev/null
+++ b/tools/designer/designer/pixmapcollection.h
@@ -0,0 +1,87 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PIXMAPCOLLECTION_H
+#define PIXMAPCOLLECTION_H
+
+#include <qstring.h>
+#include <qpixmap.h>
+#include <qvaluelist.h>
+#include "designerappiface.h"
+
+class QMimeSourceFactory;
+class Project;
+
+class PixmapCollection
+{
+public:
+ struct Pixmap
+ {
+ QPixmap pix;
+ QString name;
+ QString absname;
+ Q_DUMMY_COMPARISON_OPERATOR( Pixmap )
+ };
+
+ PixmapCollection( Project *pro );
+ ~PixmapCollection();
+
+ bool addPixmap( const Pixmap &pix, bool force = TRUE );
+ void removePixmap( const QString &name );
+ QPixmap pixmap( const QString &name );
+
+ QValueList<Pixmap> pixmaps() const;
+ bool isEmpty() const;
+
+ void setActive( bool b );
+
+ void load( const QString& filename );
+
+ DesignerPixmapCollection *iFace();
+
+private:
+ QString unifyName( const QString &n );
+ void savePixmap( Pixmap &pix );
+
+ QString imageDir() const;
+ void mkdir();
+
+private:
+ QValueList<Pixmap> pixList;
+ QMimeSourceFactory *mimeSourceFactory;
+ Project *project;
+ DesignerPixmapCollectionImpl *iface;
+
+};
+
+#endif
diff --git a/tools/designer/designer/pixmapcollectioneditor.ui b/tools/designer/designer/pixmapcollectioneditor.ui
new file mode 100644
index 0000000..6ea4282
--- /dev/null
+++ b/tools/designer/designer/pixmapcollectioneditor.ui
@@ -0,0 +1,225 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>PixmapCollectionEditor</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PixmapCollectionEditor</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>455</width>
+ <height>260</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Manage Image Collection</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QIconView">
+ <property name="name">
+ <cstring>viewPixmaps</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>Adjust</enum>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonClose</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;lose</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>PixmapCollectionEditor</receiver>
+ <slot>addPixmap()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton3</sender>
+ <signal>clicked()</signal>
+ <receiver>PixmapCollectionEditor</receiver>
+ <slot>removePixmap()</slot>
+ </connection>
+ <connection>
+ <sender>viewPixmaps</sender>
+ <signal>currentChanged(QIconViewItem*)</signal>
+ <receiver>PixmapCollectionEditor</receiver>
+ <slot>currentChanged(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>PixmapCollectionEditor</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>PixmapCollectionEditor</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>buttonClose</sender>
+ <signal>clicked()</signal>
+ <receiver>PixmapCollectionEditor</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>PushButton2</tabstop>
+ <tabstop>PushButton3</tabstop>
+ <tabstop>viewPixmaps</tabstop>
+ <tabstop>buttonClose</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">pixmapcollection.h</include>
+ <include location="local" impldecl="in implementation">pixmapchooser.h</include>
+ <include location="local" impldecl="in implementation">project.h</include>
+ <include location="global" impldecl="in implementation">qfileinfo.h</include>
+ <include location="global" impldecl="in implementation">qimage.h</include>
+ <include location="global" impldecl="in declaration">qpixmap.h</include>
+ <include location="local" impldecl="in implementation">pixmapcollectioneditor.ui.h</include>
+</includes>
+<forwards>
+ <forward>class Project;</forward>
+</forwards>
+<variables>
+ <variable>Project *project;</variable>
+ <variable>bool chooser;</variable>
+</variables>
+<slots>
+ <slot>init()</slot>
+ <slot>destroy()</slot>
+ <slot>addPixmap()</slot>
+ <slot>removePixmap()</slot>
+ <slot>updateView()</slot>
+ <slot>currentChanged(QIconViewItem * i)</slot>
+ <slot>setChooserMode(bool c)</slot>
+ <slot>setCurrentItem(const QString &amp; name)</slot>
+ <slot>setProject(Project * pro)</slot>
+ <slot returnType="QPixmap">scaledPixmap(const QPixmap &amp; p)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/pixmapcollectioneditor.ui.h b/tools/designer/designer/pixmapcollectioneditor.ui.h
new file mode 100644
index 0000000..f68e2a6
--- /dev/null
+++ b/tools/designer/designer/pixmapcollectioneditor.ui.h
@@ -0,0 +1,156 @@
+/**********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+void PixmapCollectionEditor::init()
+{
+ project = 0;
+ setChooserMode( FALSE );
+}
+
+void PixmapCollectionEditor::destroy()
+{
+}
+
+void PixmapCollectionEditor::addPixmap()
+{
+ if ( !project )
+ return;
+
+ QString f;
+ QStringList pixmaps = qChoosePixmaps( this );
+ if ( pixmaps.isEmpty() )
+ return;
+
+ QString lastName;
+ for ( QStringList::ConstIterator it = pixmaps.begin(); it != pixmaps.end(); ++it ) {
+ QPixmap pm( *it );
+ if ( pm.isNull() )
+ continue;
+ PixmapCollection::Pixmap pixmap;
+ pixmap.pix = pm;
+ QFileInfo fi ( *it );
+ pixmap.name = fi.fileName();
+ pixmap.absname = fi.filePath();
+ if ( !project->pixmapCollection()->addPixmap( pixmap, FALSE ) )
+ continue;
+ lastName = pixmap.name;
+ }
+
+ updateView();
+ QIconViewItem *item = viewPixmaps->findItem( lastName );
+ if ( item ) {
+ viewPixmaps->setCurrentItem( item );
+ viewPixmaps->ensureItemVisible( item );
+ }
+
+}
+
+void PixmapCollectionEditor::removePixmap()
+{
+ if ( !project || !viewPixmaps->currentItem() )
+ return;
+ project->pixmapCollection()->removePixmap( viewPixmaps->currentItem()->text() );
+ updateView();
+}
+
+void PixmapCollectionEditor::updateView()
+{
+ if ( !project )
+ return;
+
+ viewPixmaps->clear();
+
+ QValueList<PixmapCollection::Pixmap> pixmaps = project->pixmapCollection()->pixmaps();
+ for ( QValueList<PixmapCollection::Pixmap>::Iterator it = pixmaps.begin(); it != pixmaps.end(); ++it ) {
+ // #### might need to scale down the pixmap
+ QIconViewItem *item = new QIconViewItem( viewPixmaps, (*it).name, scaledPixmap( (*it).pix ) );
+ //item->setRenameEnabled( TRUE ); // this will be a bit harder to implement
+ item->setDragEnabled( FALSE );
+ item->setDropEnabled( FALSE );
+ }
+ viewPixmaps->setCurrentItem( viewPixmaps->firstItem() );
+ currentChanged( viewPixmaps->firstItem() );
+}
+
+void PixmapCollectionEditor::currentChanged( QIconViewItem * i )
+{
+ buttonOk->setEnabled( !!i );
+}
+
+void PixmapCollectionEditor::setChooserMode( bool c )
+{
+ chooser = c;
+ if ( chooser ) {
+ buttonClose->hide();
+ buttonOk->show();
+ buttonCancel->show();
+ buttonOk->setEnabled( FALSE );
+ buttonOk->setDefault( TRUE );
+ connect( viewPixmaps, SIGNAL( doubleClicked( QIconViewItem * ) ), buttonOk, SIGNAL( clicked() ) );
+ connect( viewPixmaps, SIGNAL( returnPressed( QIconViewItem * ) ), buttonOk, SIGNAL( clicked() ) );
+ setCaption( tr( "Choose an Image" ) );
+ } else {
+ buttonClose->show();
+ buttonOk->hide();
+ buttonCancel->hide();
+ buttonClose->setDefault( TRUE );
+ }
+ updateView();
+}
+
+void PixmapCollectionEditor::setCurrentItem( const QString & name )
+{
+ QIconViewItem *i = viewPixmaps->findItem( name );
+ if ( i ) {
+ viewPixmaps->setCurrentItem( i );
+ currentChanged( i );
+ }
+}
+
+void PixmapCollectionEditor::setProject( Project * pro )
+{
+ project = pro;
+ updateView();
+}
+
+QPixmap PixmapCollectionEditor::scaledPixmap( const QPixmap & p )
+{
+ QPixmap pix( p );
+ if ( pix.width() < 50 && pix.height() < 50 )
+ return pix;
+ QImage img;
+ img = pix;
+ img = img.smoothScale( 50, 50 );
+ pix.convertFromImage( img );
+ return pix;
+}
diff --git a/tools/designer/designer/pixmapfunction.ui b/tools/designer/designer/pixmapfunction.ui
new file mode 100644
index 0000000..a6cec9f
--- /dev/null
+++ b/tools/designer/designer/pixmapfunction.ui
@@ -0,0 +1,937 @@
+<!DOCTYPE UI><UI>
+<class>PixmapFunction</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget>
+ <class>QDialog</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>PixmapFunction</cstring>
+ </property>
+ <property stdset="1">
+ <name>geometry</name>
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>300</width>
+ <height>108</height>
+ </rect>
+ </property>
+ <property stdset="1">
+ <name>caption</name>
+ <string>Choose Pixmap</string>
+ </property>
+ <property stdset="1">
+ <name>sizeGripEnabled</name>
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>11</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget>
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>&amp;Enter arguments for loading the pixmap</string>
+ </property>
+ <property>
+ <name>buddy</name>
+ <cstring>editArguments</cstring>
+ </property>
+ </widget>
+ <widget>
+ <class>QFrame</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>Frame9</cstring>
+ </property>
+ <property stdset="1">
+ <name>frameShadow</name>
+ <enum>Sunken</enum>
+ </property>
+ <property stdset="1">
+ <name>frameShape</name>
+ <enum>StyledPanel</enum>
+ </property>
+ <property stdset="1">
+ <name>lineWidth</name>
+ <number>2</number>
+ </property>
+ <property>
+ <name>layoutMargin</name>
+ </property>
+ <property>
+ <name>layoutSpacing</name>
+ </property>
+ <hbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>2</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>0</number>
+ </property>
+ <widget>
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>labelFunction</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>QPixmap(</string>
+ </property>
+ <property stdset="1">
+ <name>palette</name>
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>233</red>
+ <green>233</green>
+ <blue>233</blue>
+ </color>
+ <color>
+ <red>105</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ <color>
+ <red>140</red>
+ <green>140</green>
+ <blue>140</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>242</red>
+ <green>242</green>
+ <blue>242</blue>
+ </color>
+ <color>
+ <red>105</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ <color>
+ <red>140</red>
+ <green>140</green>
+ <blue>140</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>242</red>
+ <green>242</green>
+ <blue>242</blue>
+ </color>
+ <color>
+ <red>105</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ <color>
+ <red>140</red>
+ <green>140</green>
+ <blue>140</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ </widget>
+ <widget>
+ <class>QLineEdit</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>editArguments</cstring>
+ </property>
+ <property stdset="1">
+ <name>frame</name>
+ <bool>false</bool>
+ </property>
+ <property stdset="1">
+ <name>palette</name>
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>233</red>
+ <green>233</green>
+ <blue>233</blue>
+ </color>
+ <color>
+ <red>105</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ <color>
+ <red>140</red>
+ <green>140</green>
+ <blue>140</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>170</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>242</red>
+ <green>242</green>
+ <blue>242</blue>
+ </color>
+ <color>
+ <red>105</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ <color>
+ <red>140</red>
+ <green>140</green>
+ <blue>140</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>170</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>242</red>
+ <green>242</green>
+ <blue>242</blue>
+ </color>
+ <color>
+ <red>105</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ <color>
+ <red>140</red>
+ <green>140</green>
+ <blue>140</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>170</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ </widget>
+ <widget>
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>)</string>
+ </property>
+ <property stdset="1">
+ <name>palette</name>
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>233</red>
+ <green>233</green>
+ <blue>233</blue>
+ </color>
+ <color>
+ <red>105</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ <color>
+ <red>140</red>
+ <green>140</green>
+ <blue>140</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>242</red>
+ <green>242</green>
+ <blue>242</blue>
+ </color>
+ <color>
+ <red>105</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ <color>
+ <red>140</red>
+ <green>140</green>
+ <blue>140</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>211</red>
+ <green>211</green>
+ <blue>211</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>242</red>
+ <green>242</green>
+ <blue>242</blue>
+ </color>
+ <color>
+ <red>105</red>
+ <green>105</green>
+ <blue>105</blue>
+ </color>
+ <color>
+ <red>140</red>
+ <green>140</green>
+ <blue>140</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property>
+ <name>name</name>
+ <cstring>Spacer1</cstring>
+ </property>
+ <property stdset="1">
+ <name>orientation</name>
+ <enum>Vertical</enum>
+ </property>
+ <property stdset="1">
+ <name>sizeType</name>
+ <enum>Expanding</enum>
+ </property>
+ <property>
+ <name>sizeHint</name>
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget>
+ <class>QLayoutWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>helpButton</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>&amp;Help</string>
+ </property>
+ <property stdset="1">
+ <name>autoDefault</name>
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property>
+ <name>name</name>
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property stdset="1">
+ <name>orientation</name>
+ <enum>Horizontal</enum>
+ </property>
+ <property stdset="1">
+ <name>sizeType</name>
+ <enum>Expanding</enum>
+ </property>
+ <property>
+ <name>sizeHint</name>
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>buttonOk</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>&amp;OK</string>
+ </property>
+ <property stdset="1">
+ <name>autoDefault</name>
+ <bool>true</bool>
+ </property>
+ <property stdset="1">
+ <name>default</name>
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>&amp;Cancel</string>
+ </property>
+ <property stdset="1">
+ <name>autoDefault</name>
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>PixmapFunction</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>PixmapFunction</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+</UI>
diff --git a/tools/designer/designer/popupmenueditor.cpp b/tools/designer/designer/popupmenueditor.cpp
new file mode 100644
index 0000000..49eca6b
--- /dev/null
+++ b/tools/designer/designer/popupmenueditor.cpp
@@ -0,0 +1,1469 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qapplication.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qdragobject.h>
+#include <qlineedit.h>
+#include <qobjectlist.h>
+#include <qpainter.h>
+#include <qpopupmenu.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qstyle.h>
+#include <qtimer.h>
+#include "actiondnd.h"
+#include "actioneditorimpl.h"
+#include "command.h"
+#include "formfile.h"
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "metadatabase.h"
+#include "pixmapchooser.h"
+#include "popupmenueditor.h"
+#include "menubareditor.h"
+
+// Drag Object Declaration -------------------------------------------
+
+class PopupMenuEditorItemPtrDrag : public QStoredDrag
+{
+public:
+ PopupMenuEditorItemPtrDrag( PopupMenuEditorItem * item, QWidget * parent = 0,
+ const char * name = 0 );
+ ~PopupMenuEditorItemPtrDrag() {};
+ static bool canDecode( QDragMoveEvent * e );
+ static bool decode( QDropEvent * e, PopupMenuEditorItem ** i );
+};
+
+// Drag Object Implementation ---------------------------------------
+
+PopupMenuEditorItemPtrDrag::PopupMenuEditorItemPtrDrag( PopupMenuEditorItem * item,
+ QWidget * parent, const char * name )
+ : QStoredDrag( "qt/popupmenueditoritemptr", parent, name )
+{
+ QByteArray data( sizeof( Q_LONG ) );
+ QDataStream stream( data, IO_WriteOnly );
+ stream << ( Q_LONG ) item;
+ setEncodedData( data );
+}
+
+bool PopupMenuEditorItemPtrDrag::canDecode( QDragMoveEvent * e )
+{
+ return e->provides( "qt/popupmenueditoritemptr" );
+}
+
+bool PopupMenuEditorItemPtrDrag::decode( QDropEvent * e, PopupMenuEditorItem ** i )
+{
+ QByteArray data = e->encodedData( "qt/popupmenueditoritemptr" );
+ QDataStream stream( data, IO_ReadOnly );
+
+ if ( !data.size() )
+ return FALSE;
+
+ Q_LONG p = 0;
+ stream >> p;
+ *i = ( PopupMenuEditorItem *) p;
+
+ return TRUE;
+}
+
+// PopupMenuEditorItem Implementation -----------------------------------
+
+PopupMenuEditorItem::PopupMenuEditorItem( PopupMenuEditor * menu, QObject * parent, const char * name )
+ : QObject( parent, name ),
+ a( 0 ),
+ s( 0 ),
+ m( menu ),
+ separator( FALSE ),
+ removable( FALSE )
+{
+ init();
+ a = new QAction( this );
+ QObject::connect( a, SIGNAL( destroyed() ), this, SLOT( selfDestruct() ) );
+}
+
+
+PopupMenuEditorItem::PopupMenuEditorItem( QAction * action, PopupMenuEditor * menu,
+ QObject * parent, const char * name )
+ : QObject( parent, name ),
+ a( action ),
+ s( 0 ),
+ m( menu ),
+ separator( FALSE ),
+ removable( TRUE )
+{
+ init();
+ if ( /*a->name() == "qt_separator_action" ||*/ ::qt_cast<QSeparatorAction*>(a) )
+ separator = TRUE;
+ if ( a && a->children() )
+ a->installEventFilter( this );
+}
+
+PopupMenuEditorItem::PopupMenuEditorItem( PopupMenuEditorItem * item, PopupMenuEditor * menu,
+ QObject * parent, const char * name )
+ : QObject( parent, name ),
+ a( item->a ),
+ s( 0 ),
+ m( menu ),
+ separator( item->separator ),
+ removable( item->removable )
+{
+ init();
+ if ( ::qt_cast<QActionGroup*>(a) )
+ a->installEventFilter( this );
+}
+
+PopupMenuEditorItem::~PopupMenuEditorItem()
+{
+
+}
+
+void PopupMenuEditorItem::init()
+{
+ if ( a ) {
+ QObject::connect( a, SIGNAL( destroyed() ), this, SLOT( selfDestruct() ) );
+ if ( m && !isSeparator() ) {
+ s = new PopupMenuEditor( m->formWindow(), m );
+ QString n = "popupMenu";
+ m->formWindow()->unify( s, n, TRUE );
+ s->setName( n );
+ MetaDataBase::addEntry( s );
+ }
+ }
+}
+
+PopupMenuEditorItem::ItemType PopupMenuEditorItem::type() const
+{
+ if ( separator )
+ return Separator;
+ else if ( a )
+ return Action;
+ return Unknown;
+}
+
+void PopupMenuEditorItem::setVisible( bool enable )
+{
+ if ( a )
+ a->setVisible( enable );
+}
+
+bool PopupMenuEditorItem::isVisible() const
+{
+ QActionGroup *g = ::qt_cast<QActionGroup*>(a);
+ if ( g )
+ return ( g->isVisible() && g->usesDropDown() );
+ else if ( a )
+ return a->isVisible();
+ return FALSE;
+}
+
+void PopupMenuEditorItem::showMenu( int x, int y )
+{
+ if ( ( !separator ) && s ) {
+ s->move( x, y );
+ s->show();
+ s->raise();
+ }
+}
+
+void PopupMenuEditorItem::hideMenu()
+{
+ if ( s ) {
+ s->hideSubMenu();
+ s->hide();
+ }
+}
+
+void PopupMenuEditorItem::focusOnMenu()
+{
+ if ( s ) {
+ s->showSubMenu();
+ s->setFocus();
+ }
+}
+
+int PopupMenuEditorItem::count() const
+{
+ if ( s ) {
+ return s->count();
+ } else if ( ::qt_cast<QActionGroup*>(a) ) {
+ const QObjectList * l = a->children();
+ if ( l )
+ return l->count();
+ }
+ return 0;
+}
+
+bool PopupMenuEditorItem::eventFilter( QObject * o, QEvent * event )
+{
+ if ( ! ::qt_cast<QActionGroup*>( o ) )
+ return FALSE;
+ if ( event->type() == QEvent::ChildInserted ) {
+ QChildEvent * ce = ( QChildEvent * ) event;
+ QObject * c = ce->child();
+ QAction * action = ::qt_cast<QAction*>( c );
+ if ( s->find( action ) != -1 ) // avoid duplicates
+ return FALSE;
+ QActionGroup * actionGroup = ::qt_cast<QActionGroup*>( c );
+ if ( actionGroup )
+ s->insert( actionGroup );
+ else if ( action )
+ s->insert( action );
+ }
+ return FALSE;
+}
+
+void PopupMenuEditorItem::selfDestruct()
+{
+ hideMenu();
+ int i = m->find( s );
+ if ( i != -1 && i < m->count() )
+ m->remove( i ); // remove this item
+ a = 0; // the selfDestruct call was caused by the deletion of the action
+ delete this;
+}
+
+// PopupMenuEditor Implementation -----------------------------------
+
+PopupMenuEditorItem * PopupMenuEditor::draggedItem = 0;
+int PopupMenuEditor::clipboardOperation = 0;
+PopupMenuEditorItem * PopupMenuEditor::clipboardItem = 0;
+
+PopupMenuEditor::PopupMenuEditor( FormWindow * fw, QWidget * parent, const char * name )
+ : QWidget( 0, name, WStyle_Customize | WStyle_NoBorder | WRepaintNoErase | WResizeNoErase ),
+ formWnd( fw ),
+ parentMenu( parent ),
+ iconWidth( 0 ),
+ textWidth( 0 ),
+ accelWidth( 0 ),
+ arrowWidth( 30 ),
+ borderSize( 2 ),
+ currentField( 1 ),
+ currentIndex( 0 )
+{
+ init();
+}
+
+PopupMenuEditor::PopupMenuEditor( FormWindow * fw, PopupMenuEditor * menu,
+ QWidget * parent, const char * name )
+ : QWidget( 0, name, WStyle_Customize | WStyle_NoBorder | WRepaintNoErase ),
+ formWnd( fw ),
+ parentMenu( parent ),
+ iconWidth( menu->iconWidth ),
+ textWidth( menu->textWidth ),
+ accelWidth( menu->accelWidth ),
+ arrowWidth( menu->arrowWidth ),
+ borderSize( menu->borderSize ),
+ currentField( menu->currentField ),
+ currentIndex( menu->currentIndex )
+{
+ init();
+ PopupMenuEditorItem * i;
+ for ( i = menu->itemList.first(); i; i = menu->itemList.next() ) {
+ PopupMenuEditorItem * n = new PopupMenuEditorItem( i, this );
+ itemList.append( n );
+ }
+}
+
+PopupMenuEditor::~PopupMenuEditor()
+{
+ itemList.setAutoDelete( TRUE );
+}
+
+void PopupMenuEditor::init()
+{
+ reparent( ( QMainWindow * ) formWnd->mainContainer(), pos() );
+
+ addItem.action()->setMenuText( tr("new item") );
+ addSeparator.action()->setMenuText( tr("new separator") );
+
+ setAcceptDrops( TRUE );
+ setFocusPolicy( StrongFocus );
+
+ lineEdit = new QLineEdit( this );
+ lineEdit->hide();
+ lineEdit->setFrameStyle(QFrame::Plain | QFrame::NoFrame);
+ lineEdit->polish();
+ lineEdit->setBackgroundOrigin(ParentOrigin);
+ lineEdit->setBackgroundMode(PaletteButton);
+ lineEdit->installEventFilter( this );
+
+ dropLine = new QWidget( this, 0, Qt::WStyle_NoBorder | WStyle_StaysOnTop );
+ dropLine->setBackgroundColor( Qt::red );
+ dropLine->hide();
+
+ hide();
+}
+
+void PopupMenuEditor::insert( PopupMenuEditorItem * item, int index )
+{
+ if ( !item )
+ return;
+ if ( index == -1 ) {
+ itemList.append( item );
+ if ( isVisible() )
+ currentIndex = itemList.count() - 1;
+ } else {
+ itemList.insert( index, item );
+ if ( isVisible() )
+ currentIndex = index;
+ }
+ item->m = this;
+ if (item->s)
+ item->s->parentMenu = this;
+ resizeToContents();
+ if ( isVisible() && parentMenu )
+ parentMenu->update(); // draw arrow in parent menu
+ emit inserted( item->action() );
+}
+
+void PopupMenuEditor::insert( QAction * action, int index )
+{
+ if ( !action )
+ return;
+ insert( new PopupMenuEditorItem( action, this, 0, action->name() ), index );
+}
+
+void PopupMenuEditor::insert( QActionGroup * actionGroup, int index )
+{
+ if ( !actionGroup )
+ return;
+ bool dropdown = actionGroup->usesDropDown();
+ PopupMenuEditorItem *i = new PopupMenuEditorItem( (QAction *)actionGroup, this, 0,
+ QString( actionGroup->name() ) + "Menu" );
+ QActionGroup *g = 0;
+ QObjectList *l = actionGroup->queryList( "QAction", 0, FALSE, FALSE );
+ QObjectListIterator it( *l );
+ insert( i, index );
+ for ( ; it.current(); ++it ) {
+ g = ::qt_cast<QActionGroup*>(it.current());
+ if ( g ) {
+ if ( dropdown )
+ i->s->insert( g );
+ else
+ insert( g );
+ } else {
+ i->s->insert( (QAction*)it.current() );
+ }
+ }
+ delete l;
+}
+
+int PopupMenuEditor::find( const QAction * action )
+{
+ PopupMenuEditorItem * i = itemList.first();
+ while ( i ) {
+ if ( i->action() == action )
+ return itemList.at();
+ i = itemList.next();
+ }
+ return -1;
+}
+
+int PopupMenuEditor::find( PopupMenuEditor * menu )
+{
+ PopupMenuEditorItem * i = itemList.first();
+ while ( i ) {
+ if ( i->subMenu() == menu )
+ return itemList.at();
+ i = itemList.next();
+ }
+ return -1;
+}
+
+int PopupMenuEditor::count()
+{
+ return itemList.count();
+}
+
+PopupMenuEditorItem * PopupMenuEditor::at( int index )
+{
+ return itemList.at( index );
+}
+
+void PopupMenuEditor::exchange( int a, int b )
+{
+ PopupMenuEditorItem * ia = itemList.at( a );
+ PopupMenuEditorItem * ib = itemList.at( b );
+ if ( !ia || !ib ||
+ ia == &addItem || ia == &addSeparator ||
+ ib == &addItem || ib == &addSeparator )
+ return; // do nothing
+ itemList.replace( b, ia );
+ itemList.replace( a, ib );
+}
+
+void PopupMenuEditor::cut( int index )
+{
+ int idx = ( index == -1 ? currentIndex : index );
+
+ clipboardOperation = Cut;
+ clipboardItem = itemList.at( idx );
+
+ if ( clipboardItem == &addItem || clipboardItem == &addSeparator ) {
+ clipboardOperation = None;
+ clipboardItem = 0;
+ return; // do nothing
+ }
+
+ RemoveActionFromPopupCommand * cmd =
+ new RemoveActionFromPopupCommand( "Cut Item", formWnd, this, idx );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+}
+
+void PopupMenuEditor::copy( int index )
+{
+ int idx = ( index == -1 ? currentIndex : index );
+
+ clipboardOperation = Copy;
+ clipboardItem = itemList.at( idx );
+
+ if ( clipboardItem == &addItem || clipboardItem == &addSeparator ) {
+ clipboardOperation = None;
+ clipboardItem = 0;
+ }
+}
+
+void PopupMenuEditor::paste( int index )
+{
+ int idx = ( index == -1 ? currentIndex : index );
+
+ if ( clipboardItem && clipboardOperation ) {
+ PopupMenuEditorItem * n = new PopupMenuEditorItem( clipboardItem, this );
+ AddActionToPopupCommand * cmd =
+ new AddActionToPopupCommand( "Paste Item", formWnd, this, n, idx );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+}
+
+void PopupMenuEditor::insertedActions( QPtrList<QAction> & list )
+{
+ QAction * a = 0;
+ PopupMenuEditorItem * i = itemList.first();
+
+ while ( i ) {
+ a = i->action();
+ if ( a )
+ list.append( a );
+ i = itemList.next();
+ }
+}
+
+void PopupMenuEditor::show()
+{
+ resizeToContents();
+ QWidget::show();
+}
+
+void PopupMenuEditor::choosePixmap( int index )
+{
+ int idx = ( index == -1 ? currentIndex : index );
+
+ PopupMenuEditorItem * i = 0;
+ QAction * a = 0;
+
+ if ( idx < (int)itemList.count() ) {
+ i = itemList.at( idx );
+ a = i->action();
+ } else {
+ createItem();
+ }
+
+ hide(); // qChoosePixmap hides the menu
+ QIconSet icons( qChoosePixmap( 0, formWnd, 0, 0 ) );
+ SetActionIconsCommand * cmd =
+ new SetActionIconsCommand( "Set icon", formWnd, a, this, icons );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ show();
+ setFocus();
+}
+
+void PopupMenuEditor::showLineEdit( int index )
+{
+ int idx = ( index == -1 ? currentIndex : index );
+
+ PopupMenuEditorItem * i = 0;
+
+ if ( idx >= (int)itemList.count() )
+ i = &addItem;
+ else
+ i = itemList.at( idx );
+
+ // open edit currentField for item name
+ lineEdit->setText( i->action()->menuText() );
+ lineEdit->selectAll();
+ lineEdit->setGeometry( borderSize + iconWidth, borderSize + itemPos( i ),
+ textWidth, itemHeight( i ) );
+ lineEdit->show();
+ lineEdit->setFocus();
+}
+
+void PopupMenuEditor::setAccelerator( int key, Qt::ButtonState state, int index )
+{
+ // FIXME: make this a command
+
+ int idx = ( index == -1 ? currentIndex : index );
+
+ if ( key == Qt::Key_Shift ||
+ key == Qt::Key_Control ||
+ key == Qt::Key_Alt ||
+ key == Qt::Key_Meta ||
+ key == Qt::Key_unknown )
+ return; // ignore these keys when they are pressed
+
+ PopupMenuEditorItem * i = 0;
+
+ if ( idx >= (int)itemList.count() )
+ i = createItem();
+ else
+ i = itemList.at( idx );
+
+ int shift = ( state & Qt::ShiftButton ? Qt::SHIFT : 0 );
+ int ctrl = ( state & Qt::ControlButton ? Qt::CTRL : 0 );
+ int alt = ( state & Qt::AltButton ? Qt::ALT : 0 );
+ int meta = ( state & Qt::MetaButton ? Qt::META : 0 );
+
+ QAction * a = i->action();
+ QKeySequence ks = a->accel();
+ int keys[4] = { ks[0], ks[1], ks[2], ks[3] };
+ int n = 0;
+ while ( n < 4 && ks[n++] );
+ n--;
+ if ( n < 4 )
+ keys[n] = key | shift | ctrl | alt | meta;
+ a->setAccel( QKeySequence( keys[0], keys[1], keys[2], keys[3] ) );
+ MetaDataBase::setPropertyChanged( a, "accel", TRUE );
+ resizeToContents();
+}
+
+void PopupMenuEditor::resizeToContents()
+{
+ QSize s = contentsSize();
+ dropLine->resize( s.width(), 2 );
+ s.rwidth() += borderSize * 2;
+ s.rheight() += borderSize * 2;
+ resize( s );
+}
+
+void PopupMenuEditor::showSubMenu()
+{
+ if ( currentIndex < (int)itemList.count() ) {
+ itemList.at( currentIndex )->showMenu( pos().x() + width() - borderSize * 3,
+ pos().y() + itemPos( at( currentIndex ) ) +
+ borderSize * 2 );
+ setFocus(); // Keep focus in this widget
+ }
+}
+
+void PopupMenuEditor::hideSubMenu()
+{
+ if ( currentIndex < (int)itemList.count() )
+ itemList.at( currentIndex )->hideMenu();
+}
+
+void PopupMenuEditor::focusOnSubMenu()
+{
+ if ( currentIndex < (int)itemList.count() )
+ itemList.at( currentIndex )->focusOnMenu();
+}
+
+// This function has no undo. It is only here to remove an item when its action was
+// removed from the action editor.
+// Use removeItem to put the command on the command stack.
+void PopupMenuEditor::remove( int index )
+{
+ int idx = ( index == -1 ? currentIndex : index );
+ PopupMenuEditorItem * i = itemList.at( idx );
+ if ( i && i->isRemovable() ) {
+ itemList.remove( idx );
+ int n = itemList.count() + 1;
+ if ( currentIndex >= n )
+ currentIndex = itemList.count() + 1;
+ emit removed( i->action() );
+ resizeToContents();
+ }
+}
+
+PopupMenuEditorItem * PopupMenuEditor::createItem( QAction * a )
+{
+ ActionEditor * ae = (ActionEditor *) formWindow()->mainWindow()->child( 0, "ActionEditor" );
+ if ( !a )
+ a = ae->newActionEx();
+ PopupMenuEditorItem * i = new PopupMenuEditorItem( a, this );
+ QString n = QString( a->name() ) + "Item";
+ formWindow()->unify( i, n, FALSE );
+ i->setName( n );
+ AddActionToPopupCommand * cmd =
+ new AddActionToPopupCommand( "Add Item", formWnd, this, i );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ return i;
+}
+
+void PopupMenuEditor::removeItem( int index )
+{
+ int idx = ( index == -1 ? currentIndex : index );
+ if ( idx < (int)itemList.count() ) {
+ RemoveActionFromPopupCommand * cmd = new RemoveActionFromPopupCommand( "Remove Item",
+ formWnd,
+ this,
+ idx );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ if ( itemList.count() == 0 && parentMenu )
+ parentMenu->update();
+ resizeToContents();
+ }
+}
+
+PopupMenuEditorItem * PopupMenuEditor::currentItem()
+{
+ int count = itemList.count();
+ if ( currentIndex < count )
+ return itemList.at( currentIndex );
+ else if ( currentIndex == count )
+ return &addItem;
+ return &addSeparator;
+}
+
+PopupMenuEditorItem * PopupMenuEditor::itemAt( int y )
+{
+ PopupMenuEditorItem * i = itemList.first();
+ int iy = 0;
+
+ while ( i ) {
+ iy += itemHeight( i );
+ if ( iy > y )
+ return i;
+ i = itemList.next();
+ }
+ iy += itemHeight( &addItem );
+ if ( iy > y )
+ return &addItem;
+ return &addSeparator;
+}
+
+void PopupMenuEditor::setFocusAt( const QPoint & pos )
+{
+ hideSubMenu();
+ lineEdit->hide();
+
+ currentIndex = 0;
+ int iy = 0;
+ PopupMenuEditorItem * i = itemList.first();
+
+ while ( i ) {
+ iy += itemHeight( i );
+ if ( iy > pos.y() )
+ break;
+ i = itemList.next();
+ currentIndex++;
+ }
+
+ iy += itemHeight( &addItem );
+ if ( iy <= pos.y() )
+ currentIndex++;
+
+ if ( currentIndex < (int)itemList.count() ) {
+ if ( pos.x() < iconWidth )
+ currentField = 0;
+ else if ( pos.x() < iconWidth + textWidth )
+ currentField = 1;
+ else
+ currentField = 2;
+ } else {
+ currentField = 1;
+ }
+
+ showSubMenu();
+}
+
+bool PopupMenuEditor::eventFilter( QObject * o, QEvent * e )
+{
+ if ( o == lineEdit && e->type() == QEvent::FocusOut ) {
+ leaveEditMode( 0 );
+ update();
+ }
+ return QWidget::eventFilter( o, e );
+}
+
+void PopupMenuEditor::paintEvent( QPaintEvent * )
+{
+ QPainter p( this );
+ p.save();
+ QRegion reg( rect() );
+ QRegion mid( borderSize, borderSize,
+ rect().width() - borderSize * 2, rect().height() - borderSize * 2 );
+ reg -= mid;
+ p.setClipRegion( reg );
+ style().drawPrimitive( QStyle::PE_PanelPopup, &p, rect(), colorGroup() );
+ p.restore();
+ drawItems( &p );
+}
+
+void PopupMenuEditor::mousePressEvent( QMouseEvent * e )
+{
+ mousePressPos = e->pos();
+ setFocusAt( mousePressPos );
+ e->accept();
+ update();
+}
+
+void PopupMenuEditor::mouseDoubleClickEvent( QMouseEvent * )
+{
+ setFocusAt( mousePressPos );
+ if ( currentItem() == &addSeparator ) {
+ PopupMenuEditorItem * i = createItem( new QSeparatorAction( 0 ) );
+ i->setSeparator( TRUE );
+ return;
+ }
+ if ( currentField == 0 ) {
+ choosePixmap();
+ resizeToContents();
+ } else if ( currentField == 1 ) {
+ showLineEdit();
+ }
+}
+
+void PopupMenuEditor::mouseMoveEvent( QMouseEvent * e )
+{
+ if ( e->state() & Qt::LeftButton ) {
+ if ( ( e->pos() - mousePressPos ).manhattanLength() > 3 ) {
+ draggedItem = itemAt( mousePressPos.y() );
+ if ( draggedItem == &addItem ) {
+ draggedItem = createItem();
+ RenameActionCommand cmd( "Rename Item", formWnd, draggedItem->action(),
+ this, "Unnamed" );
+ cmd.execute();
+ // FIXME: start rename after drop
+ } else if ( draggedItem == &addSeparator ) {
+ draggedItem = createItem( new QSeparatorAction( 0 ) );
+ draggedItem->setSeparator( TRUE );
+ }
+
+ PopupMenuEditorItemPtrDrag * d =
+ new PopupMenuEditorItemPtrDrag( draggedItem, this );
+
+ hideSubMenu();
+
+ draggedItem->setVisible( FALSE );
+ resizeToContents();
+
+ // If the item is dropped in the same list,
+ // we will have two instances of the same pointer
+ // in the list. We use node instead.
+ int idx = itemList.find( draggedItem );
+ QLNode * node = itemList.currentNode();
+
+ d->dragCopy(); // dragevents and stuff happens
+
+ if ( draggedItem ) { // item was not dropped
+ draggedItem->setVisible( TRUE );
+ draggedItem = 0;
+ if ( hasFocus() ) {
+ hideSubMenu();
+ resizeToContents();
+ showSubMenu();
+ }
+ } else { // item was dropped
+ itemList.takeNode( node )->setVisible( TRUE );
+ if ( currentIndex > 0 && currentIndex > idx )
+ --currentIndex;
+ // the drop might happen in another menu, so we'll resize
+ // and show the submenu there
+ }
+ }
+ }
+}
+
+void PopupMenuEditor::dragEnterEvent( QDragEnterEvent * e )
+{
+ if ( e->provides( "qt/popupmenueditoritemptr" ) ||
+ e->provides( "application/x-designer-actions" ) ||
+ e->provides( "application/x-designer-actiongroup" ) ) {
+ e->accept();
+ dropLine->show();
+ }
+}
+
+void PopupMenuEditor::dragLeaveEvent( QDragLeaveEvent * )
+{
+ dropLine->hide();
+}
+
+void PopupMenuEditor::dragMoveEvent( QDragMoveEvent * e )
+{
+ QPoint pos = e->pos();
+ dropLine->move( borderSize, snapToItem( pos.y() ) );
+
+ if ( currentItem() != itemAt( pos.y() ) ) {
+ hideSubMenu();
+ setFocusAt( pos );
+ showSubMenu();
+ }
+}
+
+void PopupMenuEditor::dropEvent( QDropEvent * e )
+{
+ if ( !( e->provides( "qt/popupmenueditoritemptr" ) ||
+ e->provides( "application/x-designer-actions" ) ||
+ e->provides( "application/x-designer-actiongroup" ) ) )
+ return;
+
+ // Hide the sub menu of the current item, but do it later
+ if ( currentIndex < (int)itemList.count() ) {
+ PopupMenuEditor *s = itemList.at( currentIndex )->s;
+ QTimer::singleShot( 0, s, SLOT( hide() ) );
+ }
+
+ draggedItem = 0;
+ PopupMenuEditorItem * i = 0;
+
+ if ( e->provides( "qt/popupmenueditoritemptr" ) ) {
+ PopupMenuEditorItemPtrDrag::decode( e, &i );
+ } else {
+ if ( e->provides( "application/x-designer-actiongroup" ) ) {
+ QActionGroup * g = ::qt_cast<QDesignerActionGroup*>(ActionDrag::action());
+ if ( g->usesDropDown() ) {
+ i = new PopupMenuEditorItem( g, this );
+ QString n = QString( g->name() ) + "Item";
+ formWindow()->unify( i, n, FALSE );
+ i->setName( n );
+ QObjectList *l = g->queryList( "QAction", 0, FALSE, FALSE );
+ QObjectListIterator it( *l );
+ for ( ; it.current(); ++it ) {
+ g = ::qt_cast<QActionGroup*>(it.current());
+ if ( g )
+ i->s->insert( g );
+ else
+ i->s->insert( (QAction*)it.current() );
+ }
+ delete l;
+ } else {
+ dropInPlace( g, e->pos().y() );
+ }
+ } else if ( e->provides( "application/x-designer-actions" ) ) {
+ QAction *a = ::qt_cast<QDesignerAction*>(ActionDrag::action());
+ i = new PopupMenuEditorItem( a, this );
+ }
+ }
+
+ if ( i ) {
+ dropInPlace( i, e->pos().y() );
+ QTimer::singleShot( 0, this, SLOT( resizeToContents() ) );
+ }
+
+ QTimer::singleShot( 0, this, SLOT( showSubMenu() ) );
+ QTimer::singleShot( 0, this, SLOT( setFocus() ) );
+ dropLine->hide();
+ e->accept();
+}
+
+void PopupMenuEditor::keyPressEvent( QKeyEvent * e )
+{
+ if ( lineEdit->isHidden() ) { // In navigation mode
+
+ switch ( e->key() ) {
+
+ case Qt::Key_Delete:
+ hideSubMenu();
+ removeItem();
+ showSubMenu();
+ break;
+
+ case Qt::Key_Backspace:
+ clearCurrentField();
+ break;
+
+ case Qt::Key_Up:
+ navigateUp( e->state() & Qt::ControlButton );
+ break;
+
+ case Qt::Key_Down:
+ navigateDown( e->state() & Qt::ControlButton );
+ break;
+
+ case Qt::Key_Left:
+ navigateLeft();
+ break;
+
+ case Qt::Key_Right:
+ navigateRight();
+ break;
+
+ case Qt::Key_PageUp:
+ currentIndex = 0;
+ break;
+
+ case Qt::Key_PageDown:
+ currentIndex = itemList.count();
+ break;
+
+ case Qt::Key_Enter:
+ case Qt::Key_Return:
+ case Qt::Key_F2:
+ enterEditMode( e );
+ // move on
+ case Qt::Key_Alt:
+ case Qt::Key_Shift:
+ case Qt::Key_Control:
+ // do nothing
+ return;
+
+ case Qt::Key_Escape:
+ currentField = 0;
+ navigateLeft();
+ break;
+
+ case Qt::Key_C:
+ if ( e->state() & Qt::ControlButton &&
+ currentIndex < (int)itemList.count() ) {
+ copy( currentIndex );
+ break;
+ }
+
+ case Qt::Key_X:
+ if ( e->state() & Qt::ControlButton &&
+ currentIndex < (int)itemList.count() ) {
+ hideSubMenu();
+ cut( currentIndex );
+ showSubMenu();
+ break;
+ }
+
+ case Qt::Key_V:
+ if ( e->state() & Qt::ControlButton ) {
+ hideSubMenu();
+ paste( currentIndex < (int)itemList.count() ? currentIndex + 1: itemList.count() );
+ showSubMenu();
+ break;
+ }
+
+ default:
+ if ( currentItem()->isSeparator() )
+ return;
+ if ( currentField == 1 ) {
+ showLineEdit();
+ QApplication::sendEvent( lineEdit, e );
+ e->accept();
+ return;
+ } else if ( currentField == 2 ) {
+ setAccelerator( e->key(), e->state() );
+ showSubMenu();
+ }
+ break;
+
+ }
+
+ } else { // In edit mode
+ switch ( e->key() ) {
+ case Qt::Key_Enter:
+ case Qt::Key_Return:
+ case Qt::Key_Escape:
+ leaveEditMode( e );
+ e->accept();
+ return;
+ }
+ }
+ update();
+}
+
+void PopupMenuEditor::focusInEvent( QFocusEvent * )
+{
+ showSubMenu();
+ update();
+ parentMenu->update();
+}
+
+void PopupMenuEditor::focusOutEvent( QFocusEvent * )
+{
+ QWidget * fw = qApp->focusWidget();
+ if ( !fw || ( !::qt_cast<PopupMenuEditor*>(fw) && fw != lineEdit ) ) {
+ hideSubMenu();
+ if ( fw && ::qt_cast<MenuBarEditor*>(fw) )
+ return;
+ QWidget * w = this;
+ while ( w && w != fw && ::qt_cast<PopupMenuEditor*>(w) ) { // hide all popups
+ w->hide();
+ w = ((PopupMenuEditor *)w)->parentEditor();
+ }
+ }
+}
+
+void PopupMenuEditor::drawItem( QPainter * p, PopupMenuEditorItem * i,
+ const QRect & r, int f ) const
+{
+ int x = r.x();
+ int y = r.y();
+ int h = r.height();
+
+ p->fillRect( r, colorGroup().brush( QColorGroup::Background ) );
+
+ if ( i->isSeparator() ) {
+ style().drawPrimitive( QStyle::PE_Separator, p,
+ QRect( r.x(), r.y() + 2, r.width(), 1 ),
+ colorGroup(), QStyle::Style_Sunken | f );
+ return;
+ }
+
+ const QAction * a = i->action();
+ if ( a->isToggleAction() && a->isOn() ) {
+ style().drawPrimitive( QStyle::PE_CheckMark, p,
+ QRect( x , y, iconWidth, h ),
+ colorGroup(), f );
+ } else {
+ QPixmap icon = a->iconSet().pixmap( QIconSet::Automatic, QIconSet::Normal );
+ p->drawPixmap( x + ( iconWidth - icon.width() ) / 2,
+ y + ( h - icon.height() ) / 2,
+ icon );
+ }
+ x += iconWidth;
+ p->drawText( x, y, textWidth, h,
+ QPainter::AlignLeft |
+ QPainter::AlignVCenter |
+ Qt::ShowPrefix |
+ Qt::SingleLine,
+ a->menuText() );
+
+ x += textWidth + borderSize * 3;
+ p->drawText( x, y, accelWidth, h,
+ QPainter::AlignLeft | QPainter::AlignVCenter,
+ a->accel() );
+ if ( i->count() ) // Item has submenu
+ style().drawPrimitive( QStyle::PE_ArrowRight, p,
+ QRect( r.width() - arrowWidth, r.y(), arrowWidth, r.height() ),
+ colorGroup(), f );
+}
+
+void PopupMenuEditor::drawWinFocusRect( QPainter * p, const QRect & r ) const
+{
+ if ( currentIndex < (int)itemList.count() &&
+ ((PopupMenuEditor*)this)->itemList.at( currentIndex )->isSeparator() ) {
+ p->drawWinFocusRect( borderSize, r.y(), width() - borderSize * 2, r.height() );
+ return;
+ }
+ int y = r.y();
+ int h = r.height();
+ if ( currentField == 0 )
+ p->drawWinFocusRect( borderSize + 1, y, iconWidth - 2, h );
+ else if ( currentField == 1 )
+ p->drawWinFocusRect( borderSize + iconWidth, y, textWidth, h );
+ else if ( currentField == 2 )
+ p->drawWinFocusRect( borderSize + iconWidth + textWidth +
+ borderSize * 3, y, accelWidth, h );
+}
+
+void PopupMenuEditor::drawItems( QPainter * p )
+{
+ int flags = 0;
+ int idx = 0;
+
+ QColorGroup enabled = colorGroup();
+ QColorGroup disabled = palette().disabled();
+ QRect focus;
+ QRect rect( borderSize, borderSize, width() - borderSize * 2, 0 );
+
+ PopupMenuEditorItem * i = itemList.first();
+ while ( i ) {
+ if ( i->isVisible() ) {
+ rect.setHeight( itemHeight( i ) );
+ if ( idx == currentIndex )
+ focus = rect;
+ if ( i->action()->isEnabled() ) {
+ flags = QStyle::Style_Enabled;
+ p->setPen( enabled.buttonText() );
+ } else {
+ flags = QStyle::Style_Default;
+ p->setPen( disabled.buttonText() );
+ }
+ drawItem( p, i, rect, flags );
+ rect.moveBy( 0, rect.height() );
+ }
+ i = itemList.next();
+ idx++;
+ }
+
+ // Draw the "add item" and "add separator" items
+ p->setPen( darkBlue );
+ rect.setHeight( itemHeight( &addItem ) );
+ if ( idx == currentIndex )
+ focus = rect;
+ drawItem( p, &addItem, rect, QStyle::Style_Default );
+ rect.moveBy( 0, rect.height() );
+ idx++;
+ rect.setHeight( itemHeight( &addSeparator ) );
+ if ( idx == currentIndex )
+ focus = rect;
+ drawItem( p, &addSeparator, rect, QStyle::Style_Default );
+ idx++;
+
+ if ( hasFocus() && !draggedItem )
+ drawWinFocusRect( p, focus );
+}
+
+QSize PopupMenuEditor::contentsSize()
+{
+ QRect textRect = fontMetrics().boundingRect( addSeparator.action()->menuText() );
+ textWidth = textRect.width();
+ accelWidth = textRect.height(); // default size
+ iconWidth = textRect.height();
+
+ int w = 0;
+ int h = itemHeight( &addItem ) + itemHeight( &addSeparator );
+ PopupMenuEditorItem * i = itemList.first();
+ QAction * a = 0;
+ while ( i ) {
+ if ( i->isVisible() ) {
+ if ( !i->isSeparator() ) {
+ a = i->action();
+ w = a->iconSet().pixmap( QIconSet::Automatic, QIconSet::Normal ).rect().width() +
+ borderSize; // padding
+ iconWidth = QMAX( iconWidth, w );
+ w = fontMetrics().boundingRect( a->menuText() ).width();
+ textWidth = QMAX( textWidth, w );
+ w = fontMetrics().boundingRect( a->accel() ).width() + 2; // added padding?
+ accelWidth = QMAX( accelWidth, w );
+ }
+ h += itemHeight( i );
+ }
+ i = itemList.next();
+ }
+
+ int width = iconWidth + textWidth + borderSize * 3 + accelWidth + arrowWidth;
+ return QSize( width, h );
+}
+
+int PopupMenuEditor::itemHeight( const PopupMenuEditorItem * item ) const
+{
+ if ( !item || ( item && !item->isVisible() ) )
+ return 0;
+ if ( item->isSeparator() )
+ return 4; // FIXME: hardcoded ( get from styles )r
+ int padding = + borderSize * 6;
+ QAction * a = item->action();
+ int h = a->iconSet().pixmap( QIconSet::Automatic, QIconSet::Normal ).rect().height();
+ h = QMAX( h, fontMetrics().boundingRect( a->menuText() ).height() + padding );
+ h = QMAX( h, fontMetrics().boundingRect( a->accel() ).height() + padding );
+ return h;
+}
+
+int PopupMenuEditor::itemPos( const PopupMenuEditorItem * item ) const
+{
+ PopupMenuEditor * that = ( PopupMenuEditor * ) this;
+ int y = 0;
+ PopupMenuEditorItem * i = that->itemList.first();
+ while ( i ) {
+ if ( i == item )
+ return y;
+ y += itemHeight( i );
+ i = that->itemList.next();
+ }
+ return y;
+}
+
+int PopupMenuEditor::snapToItem( int y )
+{
+ int iy = 0;
+ int dy = 0;
+
+ PopupMenuEditorItem * i = itemList.first();
+
+ while ( i ) {
+ dy = itemHeight( i );
+ if ( iy + dy / 2 > y )
+ return iy;
+ iy += dy;
+ i = itemList.next();
+ }
+
+ return iy;
+}
+
+void PopupMenuEditor::dropInPlace( PopupMenuEditorItem * i, int y )
+{
+ int iy = 0;
+ int dy = 0;
+ int idx = 0;
+
+ PopupMenuEditorItem * n = itemList.first();
+
+ while ( n ) {
+ dy = itemHeight( n );
+ if ( iy + dy / 2 > y )
+ break;
+ iy += dy;
+ idx++;
+ n = itemList.next();
+ }
+ int same = itemList.findRef( i );
+ AddActionToPopupCommand * cmd = new AddActionToPopupCommand( "Drop Item", formWnd, this, i, idx );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ currentIndex = ( same >= 0 && same < idx ) ? idx - 1 : idx;
+ currentField = 1;
+}
+
+void PopupMenuEditor::dropInPlace( QActionGroup * g, int y )
+{
+ if (!g->children())
+ return;
+ QObjectList l = *g->children();
+ for ( int i = 0; i < (int)l.count(); ++i ) {
+ QAction *a = ::qt_cast<QAction*>(l.at(i));
+ QActionGroup *g = ::qt_cast<QActionGroup*>(l.at(i));
+ if ( g )
+ dropInPlace( g, y );
+ else if ( a )
+ dropInPlace( new PopupMenuEditorItem( a, this ), y );
+ }
+}
+
+void PopupMenuEditor::safeDec()
+{
+ do {
+ currentIndex--;
+ } while ( currentIndex > 0 && !currentItem()->isVisible() );
+ if ( currentIndex == 0 &&
+ !currentItem()->isVisible() &&
+ parentMenu ) {
+ parentMenu->setFocus();
+ }
+}
+
+void PopupMenuEditor::safeInc()
+{
+ int max = itemList.count() + 1;
+ if ( currentIndex < max ) {
+ do {
+ currentIndex++;
+ } while ( currentIndex < max && !currentItem()->isVisible() ); // skip invisible items
+ }
+}
+
+void PopupMenuEditor::clearCurrentField()
+{
+ if ( currentIndex >= (int)itemList.count() )
+ return; // currentIndex is addItem or addSeparator
+ PopupMenuEditorItem * i = currentItem();
+ hideSubMenu();
+ if ( i->isSeparator() )
+ return;
+ if ( currentField == 0 ) {
+ QIconSet icons( 0 );
+ SetActionIconsCommand * cmd = new SetActionIconsCommand( "Remove icon",
+ formWnd,
+ i->action(),
+ this,
+ icons );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ } else if ( currentField == 2 ) {
+ i->action()->setAccel( 0 );
+ }
+ resizeToContents();
+ showSubMenu();
+ return;
+}
+
+void PopupMenuEditor::navigateUp( bool ctrl )
+{
+ if ( currentIndex > 0 ) {
+ hideSubMenu();
+ if ( ctrl ) {
+ ExchangeActionInPopupCommand * cmd =
+ new ExchangeActionInPopupCommand( "Move Item Up",
+ formWnd,
+ this,
+ currentIndex,
+ currentIndex - 1 );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ safeDec();
+ } else {
+ safeDec();
+ }
+ showSubMenu();
+ } else if ( parentMenu ) {
+ parentMenu->setFocus();
+ parentMenu->update();
+ }
+}
+
+void PopupMenuEditor::navigateDown( bool ctrl )
+{
+ hideSubMenu();
+ if ( ctrl ) {
+ if ( currentIndex < ( (int)itemList.count() - 1 ) ) { // safe index
+ ExchangeActionInPopupCommand * cmd =
+ new ExchangeActionInPopupCommand( "Move Item Down",
+ formWnd,
+ this,
+ currentIndex,
+ currentIndex + 1 );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ safeInc();
+ }
+ } else { // ! Ctrl
+ safeInc();
+ }
+ if ( currentIndex >= (int)itemList.count() )
+ currentField = 1;
+ showSubMenu();
+}
+
+void PopupMenuEditor::navigateLeft()
+{
+ if ( currentItem()->isSeparator() ||
+ currentIndex >= (int)itemList.count() ||
+ currentField == 0 ) {
+ if ( parentMenu ) {
+ hideSubMenu();
+ parentMenu->setFocus();
+ } else if ( !currentItem()->isSeparator() ) {
+ currentField = 2;
+ }
+ } else {
+ currentField--;
+ }
+}
+
+void PopupMenuEditor::navigateRight()
+{
+ if ( !currentItem()->isSeparator() &&
+ currentIndex < (int)itemList.count() ) {
+ if ( currentField == 2 ) {
+ focusOnSubMenu();
+ } else {
+ currentField++;
+ currentField %= 3;
+ }
+ }
+}
+
+void PopupMenuEditor::enterEditMode( QKeyEvent * e )
+{
+ PopupMenuEditorItem * i = currentItem();
+
+ if ( i == &addSeparator ) {
+ i = createItem( new QSeparatorAction( 0 ) );
+ } else if ( i->isSeparator() ) {
+ return;
+ } else if ( currentField == 0 ) {
+ choosePixmap();
+ } else if ( currentField == 1 ) {
+ showLineEdit();
+ return;
+ } else {// currentField == 2
+ setAccelerator( e->key(), e->state() );
+ }
+ showSubMenu();
+ return;
+}
+
+void PopupMenuEditor::leaveEditMode( QKeyEvent * e )
+{
+ setFocus();
+ lineEdit->hide();
+
+ PopupMenuEditorItem * i = 0;
+ if ( e && e->key() == Qt::Key_Escape ) {
+ update();
+ return;
+ }
+
+ if ( currentIndex >= (int)itemList.count() ) {
+ // new item was created
+ QAction * a = formWnd->mainWindow()->actioneditor()->newActionEx();
+ QString actionText = lineEdit->text();
+ actionText.replace("&&", "&");
+ QString menuText = lineEdit->text();
+ a->setText( actionText );
+ a->setMenuText( menuText );
+ i = createItem( a );
+ QString n = constructName( i );
+ formWindow()->unify( a, n, TRUE );
+ a->setName( n );
+ MetaDataBase::addEntry( a );
+ MetaDataBase::setPropertyChanged( a, "menuText", TRUE );
+ ActionEditor *ae = (ActionEditor*)formWindow()->mainWindow()->child( 0, "ActionEditor" );
+ if ( ae )
+ ae->updateActionName( a );
+ } else {
+ i = itemList.at( currentIndex );
+ RenameActionCommand * cmd = new RenameActionCommand( "Rename Item",
+ formWnd,
+ i->action(),
+ this,
+ lineEdit->text() );
+ formWnd->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ }
+ resizeToContents();
+
+ if ( !i )
+ return;
+
+ if ( i->isSeparator() )
+ hideSubMenu();
+ else
+ showSubMenu();
+}
+
+QString PopupMenuEditor::constructName( PopupMenuEditorItem *item )
+{
+ QString s;
+ QString name = item->action()->menuText();
+ QWidget *e = parentEditor();
+ PopupMenuEditor *p = ::qt_cast<PopupMenuEditor*>(e);
+ if ( p ) {
+ int idx = p->find( item->m );
+ PopupMenuEditorItem * i = ( idx > -1 ? p->at( idx ) : 0 );
+ s = ( i ? QString( i->action()->name() ).remove( "Action" ) : QString( "" ) );
+ } else {
+ MenuBarEditor *b = ::qt_cast<MenuBarEditor*>(e);
+ if ( b ) {
+ int idx = b->findItem( item->m );
+ MenuBarEditorItem * i = ( idx > -1 ? b->item( idx ) : 0 );
+ s = ( i ? i->menuText().lower() : QString( "" ) );
+ }
+ }
+ // replace illegal characters
+
+ return ( RenameMenuCommand::makeLegal( s ) +
+ RenameMenuCommand::makeLegal( name ) + "Action" );
+}
diff --git a/tools/designer/designer/popupmenueditor.h b/tools/designer/designer/popupmenueditor.h
new file mode 100644
index 0000000..1bfda4b
--- /dev/null
+++ b/tools/designer/designer/popupmenueditor.h
@@ -0,0 +1,242 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef POPUPMENUEDITOR_H
+#define POPUPMENUEDITOR_H
+
+#include <qwidget.h>
+#include <qptrlist.h>
+#include <qaction.h>
+
+class PopupMenuEditor;
+class QMenuItem;
+
+class PopupMenuEditorItem : public QObject
+{
+ Q_OBJECT
+
+ friend class PopupMenuEditor;
+
+ PopupMenuEditorItem( PopupMenuEditor * menu = 0, QObject * parent = 0, const char * name = 0 );
+
+public:
+ enum ItemType {
+ Unknown = -1,
+ Separator = 0,
+ Action = 1
+ };
+
+ PopupMenuEditorItem( QAction * action, PopupMenuEditor * menu,
+ QObject * parent = 0, const char * name = 0 );
+ PopupMenuEditorItem( PopupMenuEditorItem * item, PopupMenuEditor * menu,
+ QObject * parent = 0, const char * name = 0 );
+ ~PopupMenuEditorItem();
+
+ void init();
+
+ ItemType type() const;
+ QAction * action() const { return a; }
+
+ void setVisible( bool enable );
+ bool isVisible() const;
+
+ void setSeparator( bool enable ) { separator = enable; }
+ bool isSeparator() const { return separator; }
+
+ void setRemovable( bool enable ) { removable = enable; }
+ bool isRemovable() const { return removable; }
+
+ void showMenu( int x, int y );
+ void hideMenu();
+ void focusOnMenu();
+ PopupMenuEditor * subMenu() const { return s; }
+
+ int count() const;
+
+ bool eventFilter( QObject *, QEvent * event );
+
+public slots:
+ void selfDestruct();
+
+protected:
+
+private:
+ QAction * a;
+ PopupMenuEditor * s;
+ PopupMenuEditor * m;
+ uint separator : 1;
+ uint removable : 1;
+};
+
+class FormWindow;
+class MainWindow;
+class QLineEdit;
+
+#include <qpopupmenu.h>
+
+class PopupMenuEditor : public QWidget
+{
+ Q_OBJECT
+
+ friend class PopupMenuEditorItem;
+ friend class MenuBarEditor;
+ friend class Resource;
+
+public:
+ PopupMenuEditor( FormWindow * fw, QWidget * parent = 0, const char * name = 0 );
+ PopupMenuEditor( FormWindow * fw, PopupMenuEditor * menu, QWidget * parent, const char * name = 0 );
+ ~PopupMenuEditor();
+
+ void init();
+
+ void insert( PopupMenuEditorItem * item, int index = -1 );
+ void insert( QAction * action, int index = -1 );
+ void insert( QActionGroup * actionGroup, int index = -1 );
+ int find( const QAction * action );
+ int find( PopupMenuEditor * menu );
+ int count();
+ PopupMenuEditorItem * at( int index );
+ PopupMenuEditorItem * at( QPoint pos ) { return itemAt( pos.y() ); }
+ void exchange( int a, int b );
+
+ void cut( int index );
+ void copy( int index );
+ void paste( int index );
+
+ void insertedActions( QPtrList<QAction> & list );
+
+ void show();
+ void choosePixmap( int index = -1 );
+ void showLineEdit( int index = -1);
+ void setAccelerator( int key, Qt::ButtonState state, int index = -1 );
+
+ FormWindow * formWindow() { return formWnd; }
+ bool isCreatingAccelerator() { return ( currentField == 2 ); }
+
+ QPtrList<PopupMenuEditorItem> * items() { return &itemList; }
+
+ QWidget * parentEditor() { return parentMenu; }
+
+signals:
+ void inserted( QAction * );
+ void removed( QAction * );
+
+public slots:
+
+ void cut() { cut( currentIndex ); }
+ void copy() { copy( currentIndex ); }
+ void paste() { paste( currentIndex ); }
+
+ void remove( int index );
+ void remove( QAction * a ) { remove( find( a ) ); }
+
+ void resizeToContents();
+ void showSubMenu();
+ void hideSubMenu();
+ void focusOnSubMenu();
+
+protected:
+ PopupMenuEditorItem * createItem( QAction * a = 0 );
+ void removeItem( int index = -1 );
+ PopupMenuEditorItem * currentItem();
+ PopupMenuEditorItem * itemAt( int y );
+ void setFocusAt( const QPoint & pos );
+
+ bool eventFilter( QObject * o, QEvent * e );
+ void paintEvent( QPaintEvent * e );
+ void mousePressEvent( QMouseEvent * e );
+ void mouseDoubleClickEvent( QMouseEvent * e );
+ void mouseMoveEvent( QMouseEvent * e );
+ void dragEnterEvent( QDragEnterEvent * e );
+ void dragLeaveEvent( QDragLeaveEvent * e );
+ void dragMoveEvent( QDragMoveEvent * e );
+ void dropEvent( QDropEvent * e );
+ void keyPressEvent( QKeyEvent * e );
+ void focusInEvent( QFocusEvent * e );
+ void focusOutEvent( QFocusEvent * e );
+
+ void drawItems( QPainter * p );
+ void drawItem( QPainter * p, PopupMenuEditorItem * i, const QRect & r, int f ) const;
+ void drawWinFocusRect( QPainter * p, const QRect & r ) const;
+
+ QSize contentsSize();
+ int itemHeight( const PopupMenuEditorItem * item ) const;
+ int itemPos( const PopupMenuEditorItem * item ) const;
+
+ int snapToItem( int y );
+ void dropInPlace( PopupMenuEditorItem * i, int y );
+ void dropInPlace( QActionGroup * g, int y );
+
+ void safeDec();
+ void safeInc();
+
+ void clearCurrentField();
+ void navigateUp( bool ctrl );
+ void navigateDown( bool ctrl );
+ void navigateLeft();
+ void navigateRight();
+ void enterEditMode( QKeyEvent * e );
+ void leaveEditMode( QKeyEvent * e );
+
+ QString constructName( PopupMenuEditorItem *item );
+
+private:
+ FormWindow * formWnd;
+ QLineEdit * lineEdit;
+ QWidget * dropLine;
+ QPtrList<PopupMenuEditorItem> itemList;
+ PopupMenuEditorItem addItem;
+ PopupMenuEditorItem addSeparator;
+ QWidget * parentMenu;
+
+ int iconWidth;
+ int textWidth;
+ int accelWidth;
+ int arrowWidth;
+ int borderSize;
+
+ int currentField;
+ int currentIndex;
+ QPoint mousePressPos;
+ static PopupMenuEditorItem * draggedItem;
+
+ enum ClipboardOperation {
+ None = 0,
+ Cut = 1,
+ Copy = 2
+ };
+ static int clipboardOperation;
+ static PopupMenuEditorItem * clipboardItem;
+};
+
+#endif //POPUPMENUEDITOR_H
diff --git a/tools/designer/designer/preferences.ui b/tools/designer/designer/preferences.ui
new file mode 100644
index 0000000..c2990ac
--- /dev/null
+++ b/tools/designer/designer/preferences.ui
@@ -0,0 +1,670 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>Preferences</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>Preferences</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Preferences</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Preferences&lt;/b&gt;&lt;p&gt;Change the preferences of Qt Designer. There is always one tab with general preferences. There may be additional tabs, depending on which plugins are installed.&lt;/p&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageGeneral</cstring>
+ </property>
+ <attribute name="title">
+ <string>General</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="1" column="1">
+ <property name="name">
+ <cstring>groupBox4</cstring>
+ </property>
+ <property name="title">
+ <string>File Saving</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBoxAutoSave</cstring>
+ </property>
+ <property name="text">
+ <string>Enable Auto Sa&amp;ve</string>
+ </property>
+ <property name="accel">
+ <string>Alt+V</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabelAutoSave</cstring>
+ </property>
+ <property name="text">
+ <string>Auto Save &amp;Interval:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>timeEditAutoSave</cstring>
+ </property>
+ </widget>
+ <widget class="QTimeEdit">
+ <property name="name">
+ <cstring>timeEditAutoSave</cstring>
+ </property>
+ <property name="time">
+ <time>
+ <hour>0</hour>
+ <minute>30</minute>
+ <second>0</second>
+ </time>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>buttonGroup2</cstring>
+ </property>
+ <property name="title">
+ <string>Plu&amp;gin Paths</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>textEditPluginPaths</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>A splash screen is displayed when starting Qt Designer if this option is checked.</string>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>GroupBox5</cstring>
+ </property>
+ <property name="title">
+ <string>Ge&amp;neral</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBoxWorkspace</cstring>
+ </property>
+ <property name="text">
+ <string>Restore Last &amp;Workspace on Startup</string>
+ </property>
+ <property name="accel">
+ <string>Alt+W</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Restore last workspace</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The current workspace settings will be restored the next time you start Qt Designer if this option is checked.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBoxSplash</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;Splash Screen on Startup</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Show Splashscreen</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>A splash screen is displayed when starting Qt Designer if this option is checked.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBoxStartDialog</cstring>
+ </property>
+ <property name="text">
+ <string>Show Start &amp;Dialog</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkAutoEdit</cstring>
+ </property>
+ <property name="text">
+ <string>Disable Data&amp;base Auto-Edit in Preview</string>
+ </property>
+ <property name="accel">
+ <string>Alt+B</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBoxTextLabels</cstring>
+ </property>
+ <property name="text">
+ <string>Show Toolbutton Lab&amp;els</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Text Labels</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Text labels will be usin in the toolbars if this is checked.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="0" column="1">
+ <property name="name">
+ <cstring>groupBoxGrid</cstring>
+ </property>
+ <property name="title">
+ <string>G&amp;rid</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string></string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBoxSnapGrid</cstring>
+ </property>
+ <property name="text">
+ <string>Sn&amp;ap to Grid</string>
+ </property>
+ <property name="accel">
+ <string>Alt+A</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Snap to the grid</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Customize the grid-settings for all forms.&lt;/b&gt;&lt;p&gt;When &lt;b&gt;Snap to Grid&lt;/b&gt; is checked, the widgets snap to the grid using the the X/Y resolution.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>spinGridX</cstring>
+ </property>
+ <property name="maxValue">
+ <number>50</number>
+ </property>
+ <property name="minValue">
+ <number>5</number>
+ </property>
+ <property name="value">
+ <number>10</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Grid resolution</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Customize the grid-settings for all forms.&lt;/b&gt;&lt;p&gt;When &lt;b&gt;Show Grid&lt;/b&gt; is checked, a grid is shown on all forms using the X/Y resolution.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>spinGridY</cstring>
+ </property>
+ <property name="maxValue">
+ <number>50</number>
+ </property>
+ <property name="minValue">
+ <number>5</number>
+ </property>
+ <property name="value">
+ <number>10</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Grid resolution</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Customize the grid-settings for all forms.&lt;/b&gt;&lt;p&gt;When &lt;b&gt;Show Grid&lt;/b&gt; is checked, a grid is shown on all forms using the X/Y resolution.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>Label1</cstring>
+ </property>
+ <property name="text">
+ <string>Grid-&amp;X:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spinGridX</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>Label1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Grid-&amp;Y:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spinGridY</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup" row="0" column="0">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Backgro&amp;und</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="StyledButton" row="0" column="1">
+ <property name="name">
+ <cstring>buttonColor</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="scale" stdset="0">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Choose a color</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select a color in the color dialog.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>radioColor</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Co&amp;lor</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Use a background color</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Use a background color.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>radioPixmap</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Pixmap</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Use a background pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Use a background pixmap.</string>
+ </property>
+ </widget>
+ <widget class="StyledButton" row="1" column="1">
+ <property name="name">
+ <cstring>buttonPixmap</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="scale" stdset="0">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select a pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a pixmap file.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>helpButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>false</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>StyledButton</class>
+ <header location="local">styledbutton.h</header>
+ <sizehint>
+ <width>40</width>
+ <height>25</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>clicked()</signal>
+ <signal>changed()</signal>
+ <property type="Color">color</property>
+ <property type="Pixmap">pixmap</property>
+ <property type="Bool">scale</property>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="1112">789c9dd2cb8e9b301406e07d9e0225bba89a09601350d505302c5b7559a9eac23e6672b363620c0ca9faeef53949da2e2a55eab123f9e38f2f217e5e475f3e7f8cd6cf8bde0b7f8008f6c2456b3518337ffdf6e1fb62992451e8691ac5cb778be55304d1277b6e71fc12c6ab0d157222e61bd8e4c812196f6216535a13f318624a6764b2495842e99558249014c81e99c6294b69d3376291424ae9806431638cd28628183081f4489e70ce13e4852878c129ad905992f18cd291283295517a466ed32ddfa64847945bb595c80e99a739cf29d54499ab9c528b2c58c10b86344428540148400a26b8a0541241b482d215523299494a0551c9562ae409091c32e0c82351410b942aa4e22a53941e882d36e41ed966d8903b2215f215f99a6143b6442afaafff5aff485658622584a091941256948443d1cabbdd6ebf3f28753c09a9e9cdc1fe703c9e4ea19f689a0430fa4c8908082be093d08d016bbb0bbd5e7ceafade5b30de19d083b3fa9e008cd39b9fafd69495b473af7fcfb15325c1d61eea0afaf005ddf97b5295c658a866338f97591babef7340fa396c6c5ca9e7fe650807d0bf566b4262299986ba335a3b4a2cc84b69ac85b1b673037d8fabf95b023a9c09cc7530e104dd5419ed6e27083fb09a7c752db5a9bd31cde4ec634ed8a39aebbe337618c3f6fdc5dee6d8b0bb0d6b5b8b1fad43d78fe4e14e3f6aace8e29d9d736777fea3c686eee0138c9726d4d00c548df7a315ff750f7ebc5ffc04a0e5308d</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>Preferences</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>Preferences</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>radioColor</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>buttonColor</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>radioPixmap</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>buttonPixmap</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+ <tabstop>tabWidget</tabstop>
+ <tabstop>radioColor</tabstop>
+ <tabstop>radioPixmap</tabstop>
+ <tabstop>buttonColor</tabstop>
+ <tabstop>buttonPixmap</tabstop>
+ <tabstop>checkBoxSnapGrid</tabstop>
+ <tabstop>spinGridX</tabstop>
+ <tabstop>spinGridY</tabstop>
+ <tabstop>checkBoxWorkspace</tabstop>
+ <tabstop>checkBoxSplash</tabstop>
+ <tabstop>checkBoxStartDialog</tabstop>
+ <tabstop>checkAutoEdit</tabstop>
+ <tabstop>checkBoxTextLabels</tabstop>
+ <tabstop>helpButton</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>styledbutton.h</includehint>
+ <includehint>styledbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/tools/designer/designer/previewframe.cpp b/tools/designer/designer/previewframe.cpp
new file mode 100644
index 0000000..4cecc8d
--- /dev/null
+++ b/tools/designer/designer/previewframe.cpp
@@ -0,0 +1,64 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qvbox.h>
+#include <qpainter.h>
+
+#include "previewframe.h"
+
+PreviewFrame::PreviewFrame( QWidget *parent, const char *name )
+ : QVBox( parent, name )
+{
+ setMinimumSize(200, 200);
+ setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
+ setLineWidth(1);
+
+ PreviewWorkspace * w = new PreviewWorkspace( this );
+ w->setEraseColor(colorGroup().dark());
+ previewWidget = new PreviewWidget( w );
+ previewWidget->move( 10, 10 );
+}
+
+void PreviewFrame::setPreviewPalette(QPalette pal)
+{
+ previewWidget->setPalette(pal);
+}
+
+void PreviewWorkspace::paintEvent( QPaintEvent* )
+{
+ QPainter p ( this );
+ p.setPen( QPen( white ) );
+ p.drawText ( 0, height() / 2, width(), height(), AlignHCenter,
+ "The moose in the noose\nate the goose who was loose." );
+}
+
diff --git a/tools/designer/designer/previewframe.h b/tools/designer/designer/previewframe.h
new file mode 100644
index 0000000..a01fdcf
--- /dev/null
+++ b/tools/designer/designer/previewframe.h
@@ -0,0 +1,66 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PREVIEWFRAME_H
+#define PREVIEWFRAME_H
+
+#include <qvbox.h>
+#include <qworkspace.h>
+
+#include "previewwidgetimpl.h"
+
+class PreviewWorkspace : public QWorkspace
+{
+ Q_OBJECT
+public:
+ PreviewWorkspace( QWidget* parent = 0, const char* name = 0 )
+ : QWorkspace( parent, name ) {}
+ ~PreviewWorkspace() {}
+
+protected:
+ void paintEvent( QPaintEvent* );
+};
+
+class PreviewFrame : public QVBox
+{
+ Q_OBJECT
+
+public:
+ PreviewFrame( QWidget *parent = 0, const char *name = 0 );
+ void setPreviewPalette(QPalette);
+
+private:
+ PreviewWidget *previewWidget;
+};
+
+#endif
diff --git a/tools/designer/designer/previewwidget.ui b/tools/designer/designer/previewwidget.ui
new file mode 100644
index 0000000..11a549a
--- /dev/null
+++ b/tools/designer/designer/previewwidget.ui
@@ -0,0 +1,311 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>PreviewWidgetBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>PreviewWidgetBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>378</width>
+ <height>236</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Preview Window</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout17</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>ButtonGroup</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton1</cstring>
+ </property>
+ <property name="text">
+ <string>RadioButton1</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton2</cstring>
+ </property>
+ <property name="text">
+ <string>RadioButton2</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton3</cstring>
+ </property>
+ <property name="text">
+ <string>RadioButton3</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup2</cstring>
+ </property>
+ <property name="title">
+ <string>ButtonGroup2</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="text">
+ <string>CheckBox1</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>CheckBox2</cstring>
+ </property>
+ <property name="text">
+ <string>CheckBox2</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QProgressBar">
+ <property name="name">
+ <cstring>ProgressBar1</cstring>
+ </property>
+ <property name="progress">
+ <number>50</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LineEdit1</cstring>
+ </property>
+ <property name="text">
+ <string>LineEdit</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>ComboBox</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>ComboBox1</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>SpinBox1</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>PushButton</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QScrollBar">
+ <property name="name">
+ <cstring>ScrollBar1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>Slider1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QTextView">
+ <property name="name">
+ <cstring>textView</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;
+&lt;a href="http://www.trolltech.com/"&gt;http://www.trolltech.com&lt;/a&gt;
+&lt;/p&gt;
+&lt;p&gt;
+&lt;a href="http://www.kde.org/"&gt;http://www.kde.org&lt;/a&gt;
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <slot access="protected" language="C++" returnType="void">init()</slot>
+ <slot access="protected" language="C++" returnType="void">destroy()</slot>
+</connections>
+</UI>
diff --git a/tools/designer/designer/previewwidgetimpl.cpp b/tools/designer/designer/previewwidgetimpl.cpp
new file mode 100644
index 0000000..8e60336
--- /dev/null
+++ b/tools/designer/designer/previewwidgetimpl.cpp
@@ -0,0 +1,72 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "qobjectlist.h"
+#include "previewwidgetimpl.h"
+
+PreviewWidget::PreviewWidget( QWidget *parent, const char *name )
+ : PreviewWidgetBase( parent, name )
+{
+ // install event filter on child widgets
+ QObjectList *l = queryList("QWidget");
+ QObjectListIt it(*l);
+ QObject * obj;
+ while ((obj = it.current()) != 0) {
+ ++it;
+ obj->installEventFilter(this);
+ ((QWidget*)obj)->setFocusPolicy(NoFocus);
+ }
+}
+
+void PreviewWidget::closeEvent(QCloseEvent *e)
+{
+ e->ignore();
+}
+
+bool PreviewWidget::eventFilter(QObject *, QEvent *e)
+{
+ switch ( e->type() ) {
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::MouseButtonDblClick:
+ case QEvent::MouseMove:
+ case QEvent::KeyPress:
+ case QEvent::KeyRelease:
+ case QEvent::Enter:
+ case QEvent::Leave:
+ return TRUE; // ignore;
+ default:
+ break;
+ }
+ return FALSE;
+}
diff --git a/tools/designer/designer/previewwidgetimpl.h b/tools/designer/designer/previewwidgetimpl.h
new file mode 100644
index 0000000..d4e44b4
--- /dev/null
+++ b/tools/designer/designer/previewwidgetimpl.h
@@ -0,0 +1,50 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PREVIEWWIDGETIMPL_H
+#define PREVIEWWIDGETIMPL_H
+
+#include "previewwidget.h"
+
+class PreviewWidget : public PreviewWidgetBase
+{
+ Q_OBJECT
+
+public:
+ PreviewWidget( QWidget *parent = 0, const char *name = 0 );
+
+ void closeEvent(QCloseEvent *);
+ bool eventFilter(QObject *, QEvent *);
+};
+
+#endif
diff --git a/tools/designer/designer/project.cpp b/tools/designer/designer/project.cpp
new file mode 100644
index 0000000..3eae1c4
--- /dev/null
+++ b/tools/designer/designer/project.cpp
@@ -0,0 +1,1598 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+**1 This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "project.h"
+#include "formwindow.h"
+#include "designerappiface.h"
+#include "../interfaces/languageinterface.h"
+#include "pixmapcollection.h"
+#ifndef QT_NO_SQL
+#include "dbconnectionimpl.h"
+#endif
+#include "resource.h"
+#include <qwidgetfactory.h>
+#include "outputwindow.h"
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qurl.h>
+#include <qobjectlist.h>
+#include <qfeatures.h>
+#include <qtextcodec.h>
+#include <qdom.h>
+#include <qmessagebox.h>
+#include <qapplication.h>
+#include "mainwindow.h"
+#include <qworkspace.h>
+
+#ifndef QT_NO_SQL
+#include <qsqldatabase.h>
+#include <qsqlrecord.h>
+#include <qdatatable.h>
+#endif
+
+#include <stdlib.h>
+#ifdef Q_OS_UNIX
+# include <unistd.h>
+#endif
+
+#ifndef QT_NO_SQL
+DatabaseConnection::~DatabaseConnection()
+{
+ delete iface;
+}
+
+bool DatabaseConnection::refreshCatalog()
+{
+#ifndef QT_NO_SQL
+ if ( loaded )
+ return TRUE;
+ if ( !open() )
+ return FALSE;
+ tbls = conn->tables( QSql::TableType( QSql::Tables | QSql::Views ) );
+ flds.clear();
+ for ( QStringList::Iterator it = tbls.begin(); it != tbls.end(); ++it ) {
+ QSqlRecord fil = conn->record( *it );
+ QStringList lst;
+ for ( uint j = 0; j < fil.count(); ++j )
+ lst << fil.field( j )->name();
+ flds.insert( *it, lst );
+ }
+ loaded = TRUE;
+ conn->close();
+ return loaded;
+#else
+ return FALSE;
+#endif
+}
+
+#ifndef QT_NO_SQL
+void DatabaseConnection::remove()
+{
+ if ( nm == "(default)" )
+ QSqlDatabase::removeDatabase( QSqlDatabase::defaultConnection );
+ else
+ QSqlDatabase::removeDatabase( nm );
+ // the above will effectively delete the current connection
+ conn = 0;
+}
+#endif
+
+bool DatabaseConnection::open( bool suppressDialog )
+{
+#ifndef QT_NO_SQL
+ // register our name, if nec
+ if ( nm == "(default)" ) {
+ if ( !QSqlDatabase::contains() ) // default doesn't exists?
+ conn = QSqlDatabase::addDatabase( drv );
+ else
+ conn = QSqlDatabase::database();
+ } else {
+ if ( !QSqlDatabase::contains( nm ) )
+ conn = QSqlDatabase::addDatabase( drv, nm );
+ else
+ conn = QSqlDatabase::database( nm );
+ }
+ conn->setDatabaseName( dbName );
+ conn->setUserName( uname );
+ conn->setPassword( pword );
+ conn->setHostName( hname );
+ conn->setPort( prt );
+ bool success = conn->open();
+ for( ; suppressDialog == FALSE ; ) {
+ bool done = FALSE;
+ if ( !success ) {
+ DatabaseConnectionEditor dia( this, 0 , 0 , TRUE );
+ switch( dia.exec() ) {
+ case QDialog::Accepted:
+ done = FALSE;
+ break;
+ case QDialog::Rejected:
+ done = TRUE;
+ break;
+ }
+ }
+ if ( done )
+ break;
+ conn->setUserName( uname );
+ conn->setPassword( pword );
+ conn->setHostName( hname );
+ conn->setPort( prt );
+ success = conn->open();
+ if ( !success ) {
+ switch( QMessageBox::warning( project->messageBoxParent(), QApplication::tr( "Connection" ),
+ QApplication::tr( "Could not connect to the database.\n"
+ "Press 'OK' to continue or 'Cancel' to "
+ "specify different\nconnection information.\n" )
+ + QString( "[" + conn->lastError().driverText() + "\n" +
+ conn->lastError().databaseText() + "]\n" ),
+ QApplication::tr( "&OK" ),
+ QApplication::tr( "&Cancel" ), QString::null, 0, 1 ) ) {
+ case 0: // OK or Enter
+ continue;
+ case 1: // Cancel or Escape
+ done = TRUE;
+ break;
+ }
+ } else
+ break;
+ if ( done )
+ break;
+ }
+ if ( !success ) {
+ dbErr = conn->lastError().driverText() + "\n" + conn->lastError().databaseText();
+ remove();
+ }
+ return success;
+#else
+ return FALSE;
+#endif
+}
+
+void DatabaseConnection::close()
+{
+ if ( !loaded )
+ return;
+#ifndef QT_NO_SQL
+ if ( conn ) {
+ conn->close();
+ }
+#endif
+}
+
+DesignerDatabase *DatabaseConnection::iFace()
+{
+ if ( !iface )
+ iface = new DesignerDatabaseImpl( this );
+ return iface;
+}
+
+#endif
+
+////////
+
+bool Project::isDummy() const
+{
+ return isDummyProject;
+}
+
+Project::Project( const QString &fn, const QString &pName,
+ QPluginManager<ProjectSettingsInterface> *pm, bool isDummy,
+ const QString &l )
+ : proName( pName ), projectSettingsPluginManager( pm ), isDummyProject( isDummy )
+{
+ modified = TRUE;
+ pixCollection = new PixmapCollection( this );
+ iface = 0;
+ lang = l;
+ is_cpp = lang == "C++";
+ cfg.insert( "(all)", "qt warn_on release" );
+ templ = "app";
+ setFileName( fn );
+ if ( !pName.isEmpty() )
+ proName = pName;
+ sourcefiles.setAutoDelete( TRUE );
+ modified = FALSE;
+ objs.setAutoDelete( FALSE );
+ fakeFormFiles.setAutoDelete( FALSE );
+}
+
+Project::~Project()
+{
+ if ( singleProjectMode() )
+ removeTempProject();
+ delete iface;
+ delete pixCollection;
+}
+
+void Project::setModified( bool b )
+{
+ modified = b;
+ emit projectModified();
+}
+
+#ifndef QT_NO_SQL
+DatabaseConnection *Project::databaseConnection( const QString &name )
+{
+ for ( DatabaseConnection *conn = dbConnections.first();
+ conn;
+ conn = dbConnections.next() ) {
+ if ( conn->name() == name )
+ return conn;
+ }
+ return 0;
+}
+#endif
+
+void Project::setFileName( const QString &fn, bool doClear )
+{
+ if ( fn == filename )
+ return;
+
+ if ( singleProjectMode() ) {
+ QString qsa = QString( getenv( "HOME" ) ) + QString( "/.qsa" );
+ if ( !QFile::exists( qsa ) ) {
+ QDir d;
+ d.mkdir( qsa );
+ }
+ if ( fn == singleProFileName )
+ return;
+ singleProFileName = fn;
+ static int counter = 0;
+ QString str_counter = QString::number( counter++ );
+ str_counter = "/.qsa/" + str_counter;
+ LanguageInterface *iface = MetaDataBase::languageInterface( language() );
+ filename = QString( getenv( "HOME" ) + str_counter + QString( "tmp_" ) +
+ QFileInfo( fn ).baseName() + "/" + QFileInfo( fn ).baseName() + ".pro" );
+ removeTempProject();
+ if ( iface && iface->supports( LanguageInterface::CompressProject ) ) {
+ filename = iface->uncompressProject( makeAbsolute( singleProFileName ),
+ QString( getenv( "HOME" ) +
+ str_counter + QString( "tmp_" ) +
+ QFileInfo( fn ).baseName() ) );
+ proName = makeAbsolute( singleProFileName );
+ }
+ } else {
+ filename = fn;
+ if ( !filename.endsWith( ".pro" ) )
+ filename += ".pro";
+ proName = filename;
+ }
+
+
+ if ( proName.contains( '.' ) )
+ proName = proName.left( proName.find( '.' ) );
+
+ if ( !doClear )
+ return;
+ clear();
+ if ( QFile::exists( filename ) )
+ parse();
+}
+
+QString Project::fileName( bool singlePro ) const
+{
+ if ( singlePro )
+ return singleProFileName;
+ return filename;
+}
+
+QString Project::databaseDescription() const
+{
+ return dbFile;
+}
+
+QString Project::projectName() const
+{
+ return proName;
+}
+
+static QString parse_part( const QString &part )
+{
+ QString res;
+ bool inName = FALSE;
+ QString currName;
+ for ( int i = 0; i < (int)part.length(); ++i ) {
+ QChar c = part[ i ];
+ if ( !inName ) {
+ if ( c != ' ' && c != '\t' && c != '\n' && c != '=' && c != '\\' && c != '+' )
+ inName = TRUE;
+ else
+ continue;
+ }
+ if ( inName ) {
+ if ( c == '\n' )
+ break;
+ res += c;
+ }
+ }
+ return res;
+}
+
+QStringList parse_multiline_part( const QString &contents, const QString &key, int *start = 0 )
+{
+ if ( start )
+ *start = -1;
+ QString lastWord;
+ // Account for things like win32: SOURCES
+ int extraWhiteSpaceCount = 0;
+ int braceCount = 0;
+ for ( int i = 0; i < (int)contents.length(); ++i ) {
+ QChar c( contents[ i ] );
+ switch ( c ) {
+ case '{':
+ braceCount++;
+ lastWord = "";
+ break;
+ case '}':
+ braceCount--;
+ lastWord = "";
+ break;
+ case ' ': case '\t':
+ if (!key.startsWith(lastWord)) {
+ lastWord = "";
+ extraWhiteSpaceCount = 0;
+ } else {
+ extraWhiteSpaceCount++;
+ }
+ break;
+ case '\\': case '\n':
+ lastWord = "";
+ break;
+ case '#':
+ while ( contents[ i ] != '\n' && i < (int)contents.length() )
+ ++i;
+ break;
+ default:
+ lastWord += c;
+ }
+
+ // ### we should read the 'bla { SOURCES= ... }' stuff as well (braceCount > 0)
+ if ( lastWord == key && braceCount == 0 ) {
+ if ( start )
+ *start = i - lastWord.length() - extraWhiteSpaceCount + 1;
+ QStringList lst;
+ bool inName = FALSE;
+ QString currName;
+ bool hadEqual = FALSE;
+ for ( ; i < (int)contents.length(); ++i ) {
+ c = contents[ i ];
+ if ( !hadEqual && c != '=' )
+ continue;
+ if ( !hadEqual ) {
+ hadEqual = TRUE;
+ continue;
+ }
+ if ( ( c.isLetter() ||
+ c.isDigit() ||
+ c == '.' ||
+ c == '/' ||
+ c == '_' ||
+ c == '\\' ||
+ c == '\"' ||
+ c == '\'' ||
+ c == '=' ||
+ c == '$' ||
+ c == '-' ||
+ c == '(' ||
+ c == ')' ||
+ c == ':' ||
+ c == '+' ||
+ c == ',' ||
+ c == '~' ||
+ c == '{' ||
+ c == '}' ||
+ c == '@' ) &&
+ c != ' ' && c != '\t' && c != '\n' ) {
+ if ( !inName )
+ currName = QString::null;
+ if ( c != '\\' || contents[i+1] != '\n' ) {
+ currName += c;
+ inName = TRUE;
+ }
+ } else {
+ if ( inName ) {
+ inName = FALSE;
+ if ( currName.simplifyWhiteSpace() != "\\" )
+ lst.append( currName );
+ }
+ if ( c == '\n' && i > 0 && contents[ (int)i - 1 ] != '\\' )
+ break;
+ }
+ }
+ return lst;
+ }
+ }
+
+ return QStringList();
+}
+
+void Project::parse()
+{
+ QFile f( filename );
+ if ( !f.exists() || !f.open( IO_ReadOnly ) )
+ return;
+ QTextStream ts( &f );
+ QString contents = ts.read();
+ f.close();
+
+ proName = QFileInfo( filename ).baseName();
+
+ QStringList::ConstIterator it;
+
+ int i = contents.find( "LANGUAGE" );
+ if ( i != -1 ) {
+ lang = "";
+ is_cpp = FALSE;
+ QString part = contents.mid( i + QString( "LANGUAGE" ).length() );
+ lang = parse_part( part );
+ is_cpp = lang == "C++";
+ }
+
+ i = contents.find( "DBFILE" );
+ if ( i != -1 ) {
+ dbFile = "";
+ QString part = contents.mid( i + QString( "DBFILE" ).length() );
+ dbFile = parse_part( part );
+ }
+
+ QStringList uifiles = parse_multiline_part( contents, "FORMS" );
+ uifiles += parse_multiline_part( contents, "INTERFACES" ); // compatibility
+ for ( it = uifiles.begin(); it != uifiles.end(); ++it ) {
+ if ( (*it).startsWith( "__APPOBJ" ) )
+ continue;
+ (void) new FormFile( *it, FALSE, this );
+ }
+
+
+ i = contents.find( "TEMPLATE" );
+ if ( i != -1 ) {
+ templ = "";
+ QString part = contents.mid( i + QString( "TEMPLATE" ).length() );
+ templ = parse_part( part );
+ }
+
+ readPlatformSettings( contents, "CONFIG", cfg );
+ readPlatformSettings( contents, "LIBS", lbs );
+ readPlatformSettings( contents, "INCLUDEPATH", inclPath );
+ readPlatformSettings( contents, "DEFINES", defs );
+ readPlatformSettings( contents, "SOURCES", sources );
+ readPlatformSettings( contents, "HEADERS", headers );
+
+ LanguageInterface *iface = MetaDataBase::languageInterface( lang );
+ if ( iface ) {
+ QStringList sourceKeys;
+ iface->sourceProjectKeys( sourceKeys );
+ for ( QStringList::Iterator it = sourceKeys.begin(); it != sourceKeys.end(); ++it ) {
+ QStringList lst = parse_multiline_part( contents, *it );
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it )
+ (void) new SourceFile( *it, FALSE, this );
+ }
+ }
+
+ updateCustomSettings();
+
+ for ( it = csList.begin(); it != csList.end(); ++it ) {
+ i = contents.find( *it );
+ if ( i != -1 ) {
+ QString val = "";
+ QString part = contents.mid( i + QString( *it ).length() );
+ val = parse_part( part );
+ customSettings.replace( *it, val );
+ }
+ }
+
+ loadConnections();
+
+ QStringList images = parse_multiline_part( contents, "IMAGES" );
+
+ // ### remove that for the final - this is beta-compatibility
+ if ( images.isEmpty() && QDir( QFileInfo( filename ).dirPath( TRUE ) + "/images" ).exists() ) {
+ images = QDir( QFileInfo( filename ).dirPath( TRUE ) + "/images" ).entryList();
+ for ( int i = 0; i < (int)images.count(); ++i )
+ images[ i ].prepend( "images/" );
+ modified = TRUE;
+ }
+
+ for ( QStringList::ConstIterator pit = images.begin(); pit != images.end(); ++pit )
+ pixCollection->load( *pit );
+}
+
+void Project::clear()
+{
+ dbFile = "";
+ proName = "unnamed";
+ desc = "";
+}
+
+bool Project::removeSourceFile( SourceFile *sf )
+{
+ if ( !sourcefiles.containsRef( sf ) )
+ return FALSE;
+ if ( !sf->close() )
+ return FALSE;
+ sourcefiles.removeRef( sf );
+ modified = TRUE;
+ emit sourceFileRemoved( sf );
+ return TRUE;
+}
+
+void Project::setDatabaseDescription( const QString &db )
+{
+ dbFile = db;
+}
+
+void Project::setDescription( const QString &s )
+{
+ desc = s;
+}
+
+QString Project::description() const
+{
+ return desc;
+}
+
+
+bool Project::isValid() const
+{
+ // #### do more checking here?
+ if ( filename.isEmpty() || proName.isEmpty() )
+ return FALSE;
+
+ return TRUE;
+}
+
+QString Project::makeAbsolute( const QString &f )
+{
+ if ( isDummy() )
+ return f;
+ QString encodedUrl = QFileInfo( filename ).dirPath( TRUE );
+ QUrl::encode( encodedUrl );
+ QUrl u( encodedUrl, f );
+ return u.path();
+}
+
+QString Project::makeRelative( const QString &f )
+{
+ if ( isDummy() )
+ return f;
+ QString p = QFileInfo( filename ).dirPath( TRUE );
+ QString f2 = f;
+#if defined(Q_WS_WIN32)
+ if ( p.endsWith("/") )
+ p = p.left( p.length() - 1 );
+ if ( f2.left( p.length() ).lower() == p.lower() )
+#else
+ if ( f2.left( p.length() ) == p )
+#endif
+ f2.remove( 0, p.length() + 1 );
+ return f2;
+}
+
+static void remove_contents( QString &contents, const QString &s )
+{
+ int i = contents.find( s );
+ if ( i != -1 ) {
+ int start = i;
+ int end = contents.find( '\n', i );
+ if ( end == -1 )
+ end = contents.length() - 1;
+ contents.remove( start, end - start + 1 );
+ }
+}
+
+static void remove_multiline_contents( QString &contents, const QString &s, int *strt = 0 )
+{
+ int i = contents.find( s );
+ int startBrace = contents.findRev("{", i);
+ int endBrace = contents.findRev("}", i);
+ // We found a startBrace before i, but no endBrace after the startBrace before i
+ if (startBrace != -1 && endBrace < startBrace)
+ return;
+ if ( strt )
+ *strt = i;
+ int start = i;
+ bool lastWasBackspash = TRUE;
+ if ( i != -1 && ( i == 0 || contents[ i - 1 ] != '{' || contents[ i - 1 ] != ':' ) && !(i > 0 && contents[i-1] != '\n')) {
+ for ( ; i < (int)contents.length(); ++i ) {
+ if ( contents[ i ] == '\n' && !lastWasBackspash )
+ break;
+ lastWasBackspash = ( contents[ i ] == '\\' ||
+ lastWasBackspash && ( contents[ i ] == ' ' || contents[ i ] == '\t' ) );
+ }
+ contents.remove( start, i - start + 1 );
+ }
+}
+
+void Project::save( bool onlyProjectFile )
+{
+ bool anythingModified = FALSE;
+
+ // save sources and forms
+ if ( !onlyProjectFile ) {
+
+ saveConnections();
+
+ for ( SourceFile *sf = sourcefiles.first(); sf; sf = sourcefiles.next() ) {
+ anythingModified = anythingModified || sf->isModified();
+ if ( !sf->save() )
+ return;
+ }
+
+ for ( FormFile *ff = formfiles.first(); ff; ff = formfiles.next() ) {
+ anythingModified = anythingModified || ff->isModified();
+ if ( !ff->save() )
+ return;
+ }
+ }
+
+ if ( isDummy() || filename.isEmpty() )
+ return;
+
+ if ( !modified ) {
+ if ( singleProjectMode() ) {
+ LanguageInterface *iface = MetaDataBase::languageInterface( language() );
+ if ( iface && iface->supports( LanguageInterface::CompressProject ) )
+ iface->compressProject( makeAbsolute( filename ), singleProFileName, anythingModified );
+ }
+ return;
+ }
+
+ QFile f( filename );
+ QString original = "";
+
+ // read the existing file
+ bool hasPreviousContents = FALSE;
+ if ( f.open( IO_ReadOnly ) ) {
+ QTextStream ts( &f );
+ original = ts.read();
+ f.close();
+ hasPreviousContents = TRUE;
+ remove_contents( original, "{SOURCES+=" ); // ### compatibility with early 3.0 betas
+ remove_contents( original, "DBFILE" );
+ remove_contents( original, "LANGUAGE" );
+ remove_contents( original, "TEMPLATE" );
+ removePlatformSettings( original, "CONFIG" );
+ removePlatformSettings( original, "DEFINES" );
+ removePlatformSettings( original, "LIBS" );
+ removePlatformSettings( original, "INCLUDEPATH" );
+ removePlatformSettings( original, "SOURCES" );
+ removePlatformSettings( original, "HEADERS" );
+ remove_multiline_contents( original, "FORMS" );
+ remove_multiline_contents( original, "INTERFACES" ); // compatibility
+ remove_multiline_contents( original, "IMAGES" );
+ for ( QStringList::Iterator it = csList.begin(); it != csList.end(); ++it )
+ remove_contents( original, *it );
+ }
+
+ if (!original.isEmpty()) {
+ // Removes any new lines at the beginning of the file
+ while (original.startsWith("\n"))
+ original.remove(0, 1);
+ }
+
+ // the contents of the saved file
+ QString contents;
+
+ // template
+ contents += "TEMPLATE\t= " + templ + "\n";
+
+ // language
+ contents += "LANGUAGE\t= " + lang + "\n";
+ contents += "\n";
+
+ // config
+ writePlatformSettings( contents, "CONFIG", cfg );
+ LanguageInterface *iface = MetaDataBase::languageInterface( lang );
+ if ( iface ) {
+ QStringList sourceKeys;
+ iface->sourceProjectKeys( sourceKeys );
+ for ( QStringList::Iterator spit = sourceKeys.begin(); spit != sourceKeys.end(); ++spit )
+ remove_multiline_contents( contents, *spit );
+ }
+
+ // libs, defines, includes
+ writePlatformSettings( contents, "LIBS", lbs );
+ writePlatformSettings( contents, "DEFINES", defs );
+ writePlatformSettings( contents, "INCLUDEPATH", inclPath );
+ writePlatformSettings( contents, "SOURCES", sources );
+ writePlatformSettings( contents, "HEADERS", headers );
+
+ // unix
+ if ( !hasPreviousContents ) {
+ contents +=
+ "unix {\n"
+ " UI_DIR = .ui\n"
+ " MOC_DIR = .moc\n"
+ " OBJECTS_DIR = .obj\n"
+ "}\n\n";
+ }
+
+ // sources
+ if ( !sourcefiles.isEmpty() && iface ) {
+ QMap<QString, QStringList> sourceToKey;
+ for ( SourceFile *f = sourcefiles.first(); f; f = sourcefiles.next() ) {
+ QString key = iface->projectKeyForExtension( QFileInfo( f->fileName() ).extension() );
+ QStringList lst = sourceToKey[ key ];
+ lst << makeRelative( f->fileName() );
+ sourceToKey.replace( key, lst );
+ }
+
+ for ( QMap<QString, QStringList>::Iterator skit = sourceToKey.begin();
+ skit != sourceToKey.end(); ++skit ) {
+ QString part = skit.key() + "\t+= ";
+ QStringList lst = *skit;
+ for ( QStringList::Iterator sit = lst.begin(); sit != lst.end(); ++sit ) {
+ part += *sit;
+ part += ++sit != lst.end() ? " \\\n\t" : "";
+ --sit;
+ }
+ part += "\n\n";
+ contents += part;
+ }
+ }
+
+ // forms and interfaces
+ if ( !formfiles.isEmpty() ) {
+ contents += "FORMS\t= ";
+ for ( QPtrListIterator<FormFile> fit = formfiles; fit.current(); ++fit ) {
+ contents += fit.current()->fileName() +
+ (fit != formfiles.last() ? " \\\n\t" : "");
+ }
+ contents += "\n\n";
+ }
+
+ // images
+ if ( !pixCollection->isEmpty() ) {
+ contents += "IMAGES\t= ";
+ QValueList<PixmapCollection::Pixmap> pixmaps = pixCollection->pixmaps();
+ for ( QValueList<PixmapCollection::Pixmap>::Iterator it = pixmaps.begin();
+ it != pixmaps.end(); ++it ) {
+ contents += makeRelative( (*it).absname );
+ contents += ++it != pixmaps.end() ? " \\\n\t" : "";
+ --it;
+ }
+ contents += "\n\n";
+ }
+
+ // database
+ if ( !dbFile.isEmpty() )
+ contents += "DBFILE\t= " + dbFile + "\n";
+
+ // custom settings
+ for ( QStringList::Iterator it = csList.begin(); it != csList.end(); ++it ) {
+ QString val = *customSettings.find( *it );
+ if ( !val.isEmpty() )
+ contents += *it + "\t= " + val + "\n";
+ }
+
+ if ( !f.open( IO_WriteOnly | IO_Translate ) ) {
+ QMessageBox::warning( messageBoxParent(),
+ "Save Project Failed", "Couldn't write project file " + filename );
+ return;
+ }
+
+ QTextStream os( &f );
+ os << contents;
+ if (hasPreviousContents)
+ os << original;
+
+ f.close();
+
+ setModified( FALSE );
+
+ if ( singleProjectMode() ) {
+ LanguageInterface *iface = MetaDataBase::languageInterface( language() );
+ if ( iface && iface->supports( LanguageInterface::CompressProject ) )
+ iface->compressProject( makeAbsolute( filename ), singleProFileName, TRUE );
+ }
+}
+
+#ifndef QT_NO_SQL
+QPtrList<DatabaseConnection> Project::databaseConnections() const
+{
+ return dbConnections;
+}
+#endif
+
+#ifndef QT_NO_SQL
+void Project::setDatabaseConnections( const QPtrList<DatabaseConnection> &lst )
+{
+ dbConnections = lst;
+}
+#endif
+
+#ifndef QT_NO_SQL
+void Project::addDatabaseConnection( DatabaseConnection *conn )
+{
+ dbConnections.append( conn );
+ modified = TRUE;
+}
+#endif
+
+#ifndef QT_NO_SQL
+void Project::removeDatabaseConnection( const QString &c )
+{
+ for ( DatabaseConnection *conn = dbConnections.first(); conn; conn = dbConnections.next() ) {
+ if ( conn->name() == c ) {
+ conn->remove();
+ dbConnections.removeRef( conn );
+ delete conn;
+ return;
+ }
+ }
+}
+#endif
+
+#ifndef QT_NO_SQL
+QStringList Project::databaseConnectionList()
+{
+ QStringList lst;
+ for ( DatabaseConnection *conn = dbConnections.first(); conn; conn = dbConnections.next() )
+ lst << conn->name();
+ return lst;
+}
+#endif
+
+#ifndef QT_NO_SQL
+QStringList Project::databaseTableList( const QString &connection )
+{
+ DatabaseConnection *conn = databaseConnection( connection );
+ if ( !conn ) {
+ return QStringList();
+ }
+ return conn->tables();
+}
+#endif
+
+#ifndef QT_NO_SQL
+QStringList Project::databaseFieldList( const QString &connection, const QString &table )
+{
+ DatabaseConnection *conn = databaseConnection( connection );
+ if ( !conn )
+ return QStringList();
+ return conn->fields( table );
+}
+#endif
+
+#ifndef QT_NO_SQL
+static QString makeIndent( int indent )
+{
+ QString s;
+ s.fill( ' ', indent * 4 );
+ return s;
+}
+#endif
+
+#ifndef QT_NO_SQL
+static void saveSingleProperty( QTextStream &ts, const QString& name, const QString& value, int indent )
+{
+ ts << makeIndent( indent ) << "<property name=\"" << name << "\">" << endl;
+ ++indent;
+ ts << makeIndent( indent ) << "<string>" << value << "</string>" << endl;
+ --indent;
+ ts << makeIndent( indent ) << "</property>" << endl;
+}
+#endif
+
+void Project::saveConnections()
+{
+#ifndef QT_NO_SQL
+ if ( dbFile.isEmpty() ) {
+ QFileInfo fi( fileName() );
+ setDatabaseDescription( fi.baseName() + ".db" );
+ }
+
+ QFile f( makeAbsolute( dbFile ) );
+
+ if ( dbConnections.isEmpty() ) {
+ if ( f.exists() )
+ f.remove();
+ setDatabaseDescription( "" );
+ modified = TRUE;
+ return;
+ }
+
+ /* .db xml */
+ if ( f.open( IO_WriteOnly | IO_Translate ) ) {
+ QTextStream ts( &f );
+ ts.setCodec( QTextCodec::codecForName( "UTF-8" ) );
+ ts << "<!DOCTYPE DB><DB version=\"1.0\">" << endl;
+
+ /* db connections */
+ int indent = 0;
+ for ( DatabaseConnection *conn = dbConnections.first(); conn; conn = dbConnections.next() ) {
+ ts << makeIndent( indent ) << "<connection>" << endl;
+ ++indent;
+ saveSingleProperty( ts, "name", conn->name(), indent );
+ saveSingleProperty( ts, "driver", conn->driver(), indent );
+ saveSingleProperty( ts, "database", conn->database(), indent );
+ saveSingleProperty( ts, "username", conn->username(), indent );
+ saveSingleProperty( ts, "hostname", conn->hostname(), indent );
+ saveSingleProperty( ts, "port", QString::number( conn->port() ), indent );
+
+ /* connection tables */
+ QStringList tables = conn->tables();
+ for ( QStringList::Iterator it = tables.begin();
+ it != tables.end(); ++it ) {
+ ts << makeIndent( indent ) << "<table>" << endl;
+ ++indent;
+ saveSingleProperty( ts, "name", (*it), indent );
+
+ /* tables fields */
+ QStringList fields = conn->fields( *it );
+ for ( QStringList::Iterator it2 = fields.begin();
+ it2 != fields.end(); ++it2 ) {
+ ts << makeIndent( indent ) << "<field>" << endl;
+ ++indent;
+ saveSingleProperty( ts, "name", (*it2), indent );
+ --indent;
+ ts << makeIndent( indent ) << "</field>" << endl;
+ }
+
+ --indent;
+ ts << makeIndent( indent ) << "</table>" << endl;
+ }
+
+ --indent;
+ ts << makeIndent( indent ) << "</connection>" << endl;
+ }
+
+ ts << "</DB>" << endl;
+ f.close();
+ }
+#endif
+}
+
+#ifndef QT_NO_SQL
+static QDomElement loadSingleProperty( QDomElement e, const QString& name )
+{
+ QDomElement n;
+ for ( n = e.firstChild().toElement();
+ !n.isNull();
+ n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "property" && n.toElement().attribute("name") == name )
+ return n;
+ }
+ return n;
+}
+#endif
+
+void Project::loadConnections()
+{
+#ifndef QT_NO_SQL
+ if ( dbFile.isEmpty() || !QFile::exists( makeAbsolute( dbFile ) ) )
+ return;
+
+ QFile f( makeAbsolute( dbFile ) );
+ if ( f.open( IO_ReadOnly ) ) {
+ QDomDocument doc;
+ QString errMsg;
+ int errLine;
+ if ( doc.setContent( &f, &errMsg, &errLine ) ) {
+ QDomElement e;
+ e = doc.firstChild().toElement();
+
+ /* connections */
+ QDomNodeList connections = e.toElement().elementsByTagName( "connection" );
+ for ( uint i = 0; i < connections.length(); i++ ) {
+ QDomElement connection = connections.item(i).toElement();
+ QDomElement connectionName = loadSingleProperty( connection, "name" );
+ QDomElement connectionDriver = loadSingleProperty( connection, "driver" );
+ QDomElement connectionDatabase = loadSingleProperty( connection,
+ "database" );
+ QDomElement connectionUsername = loadSingleProperty( connection,
+ "username" );
+ QDomElement connectionHostname = loadSingleProperty( connection,
+ "hostname" );
+ QDomElement connectionPort = loadSingleProperty( connection,
+ "port" );
+
+ DatabaseConnection *conn = new DatabaseConnection( this );
+ conn->setName( connectionName.firstChild().firstChild().toText().data() );
+ conn->setDriver( connectionDriver.firstChild().firstChild().toText().data() );
+ conn->setDatabase( connectionDatabase.firstChild().firstChild().toText().data() );
+ conn->setUsername( connectionUsername.firstChild().firstChild().toText().data() );
+ conn->setHostname( connectionHostname.firstChild().firstChild().toText().data() );
+ conn->setPort( QString( connectionPort.firstChild().firstChild().toText().data() ).toInt() );
+
+ /* connection tables */
+ QDomNodeList tables = connection.toElement().elementsByTagName( "table" );
+ for ( uint j = 0; j < tables.length(); j++ ) {
+ QDomElement table = tables.item(j).toElement();
+ QDomElement tableName = loadSingleProperty( table, "name" );
+ conn->addTable( tableName.firstChild().firstChild().toText().data() );
+
+ /* table fields */
+ QStringList fieldList;
+ QDomNodeList fields = table.toElement().elementsByTagName( "field" );
+ for ( uint k = 0; k < fields.length(); k++ ) {
+ QDomElement field = fields.item(k).toElement();
+ QDomElement fieldName = loadSingleProperty( field, "name" );
+ fieldList.append( fieldName.firstChild().firstChild().toText().data() );
+ }
+ conn->setFields( tableName.firstChild().firstChild().toText().data(),
+ fieldList );
+ }
+
+ dbConnections.append( conn );
+ }
+ } else {
+ qDebug( QString("Parse error: ") + errMsg + QString(" in line %d"), errLine );
+ }
+ f.close();
+ }
+#endif
+}
+
+/*! Opens the database \a connection. The connection remains open and
+can be closed again with closeDatabase().
+*/
+
+bool Project::openDatabase( const QString &connection, bool suppressDialog )
+{
+#ifndef QT_NO_SQL
+ DatabaseConnection *conn = databaseConnection( connection );
+ if ( connection.isEmpty() && !conn )
+ conn = databaseConnection( "(default)" );
+ if ( !conn )
+ return FALSE;
+ bool b = conn->open( suppressDialog );
+ return b;
+#else
+ Q_UNUSED( connection );
+ Q_UNUSED( suppressDialog );
+ return FALSE;
+#endif
+}
+
+/*! Closes the database \a connection.
+*/
+void Project::closeDatabase( const QString &connection )
+{
+#ifndef QT_NO_SQL
+ DatabaseConnection *conn = databaseConnection( connection );
+ if ( connection.isEmpty() && !conn )
+ conn = databaseConnection( "(default)" );
+ if ( !conn )
+ return;
+ conn->close();
+#else
+ Q_UNUSED( connection );
+#endif
+}
+
+// void Project::formClosed( FormWindow *fw )
+// {
+// formWindows.remove( fw );
+// }
+
+QObjectList *Project::formList( bool resolveFakeObjects ) const
+{
+ QObjectList *l = new QObjectList;
+ for ( QPtrListIterator<FormFile> forms(formfiles); forms.current(); ++forms ) {
+ FormFile* f = forms.current();
+ if ( f->formWindow() ) {
+ if ( resolveFakeObjects && f->formWindow()->isFake() )
+ l->append( objectForFakeForm( f->formWindow() ) );
+ else
+ l->append( f->formWindow()->child( 0, "QWidget" ) );
+ } else if ( f->isFake() ) {
+ l->append( objectForFakeFormFile( f ) );
+ }
+ }
+ return l;
+}
+
+DesignerProject *Project::iFace()
+{
+ if ( !iface )
+ iface = new DesignerProjectImpl( this );
+ return iface;
+}
+
+void Project::setLanguage( const QString &l )
+{
+ if ( l == lang )
+ return;
+ lang = l;
+ is_cpp = lang == "C++";
+ updateCustomSettings();
+ modified = TRUE;
+}
+
+QString Project::language() const
+{
+ return lang;
+}
+
+void Project::setCustomSetting( const QString &key, const QString &value )
+{
+ customSettings.remove( key );
+ customSettings.insert( key, value );
+ modified = TRUE;
+}
+
+QString Project::customSetting( const QString &key ) const
+{
+ return *customSettings.find( key );
+}
+
+void Project::updateCustomSettings()
+{
+ if ( !projectSettingsPluginManager )
+ return;
+
+/*
+ ProjectSettingsInterface *iface = 0;
+ projectSettingsPluginManager->queryInterface( lang, (QUnknownInterface**)&iface );
+ if ( !iface )
+ return;
+ csList = iface->projectSettings();
+ iface->release();
+*/
+
+ QInterfacePtr<ProjectSettingsInterface> iface;
+ projectSettingsPluginManager->queryInterface( lang, &iface );
+ if ( !iface )
+ return;
+ csList = iface->projectSettings();
+ customSettings.clear();
+
+}
+
+void Project::setActive( bool b )
+{
+ pixCollection->setActive( b );
+}
+
+void Project::addSourceFile( SourceFile *sf )
+{
+ sourcefiles.append( sf );
+ modified = TRUE;
+ emit sourceFileAdded( sf );
+}
+
+
+SourceFile* Project::findSourceFile( const QString& filename, SourceFile *ignore ) const
+{
+ QPtrListIterator<SourceFile> it(sourcefiles);
+ while ( it.current() ) {
+ if ( it.current() != ignore && it.current()->fileName() == filename )
+ return it.current();
+ ++it;
+ }
+ return 0;
+}
+
+FormFile* Project::findFormFile( const QString& filename, FormFile *ignore ) const
+{
+ QPtrListIterator<FormFile> it(formfiles);
+ while ( it.current() ) {
+ if ( it.current() != ignore && it.current()->fileName() == filename )
+ return it.current();
+ ++it;
+ }
+ return 0;
+}
+
+void Project::setIncludePath( const QString &platform, const QString &path )
+{
+ if ( inclPath[platform] == path )
+ return;
+ inclPath.replace( platform, path );
+ modified = TRUE;
+}
+
+void Project::setLibs( const QString &platform, const QString &path )
+{
+ lbs.replace( platform, path );
+}
+
+void Project::setDefines( const QString &platform, const QString &path )
+{
+ defs.replace( platform, path );
+}
+
+void Project::setConfig( const QString &platform, const QString &config )
+{
+ cfg.replace( platform, config );
+}
+
+QString Project::config( const QString &platform ) const
+{
+ return cfg[ platform ];
+}
+
+QString Project::libs( const QString &platform ) const
+{
+ return lbs[ platform ];
+}
+
+QString Project::defines( const QString &platform ) const
+{
+ return defs[ platform ];
+}
+
+QString Project::includePath( const QString &platform ) const
+{
+ return inclPath[ platform ];
+}
+
+QString Project::templte() const
+{
+ return templ;
+}
+
+void Project::setTemplate( const QString &t )
+{
+ templ = t;
+}
+
+void Project::readPlatformSettings( const QString &contents,
+ const QString &setting,
+ QMap<QString, QString> &res )
+{
+ const QString platforms[] = { "", "win32", "unix", "mac", QString::null };
+ for ( int i = 0; platforms[ i ] != QString::null; ++i ) {
+ QString p = platforms[ i ];
+ if ( !p.isEmpty() )
+ p += ":";
+ QStringList lst = parse_multiline_part( contents, p + setting );
+ QString s = lst.join( " " );
+ QString key = platforms[ i ];
+ if ( key.isEmpty() )
+ key = "(all)";
+ res.replace( key, s );
+ }
+}
+
+void Project::removePlatformSettings( QString &contents, const QString &setting )
+{
+ const QString platforms[] = { "win32", "unix", "mac", "", QString::null };
+ for ( int i = 0; platforms[ i ] != QString::null; ++i ) {
+ QString p = platforms[ i ];
+ if ( !p.isEmpty() )
+ p += ":";
+ remove_multiline_contents( contents, p + setting );
+ }
+}
+
+void Project::writePlatformSettings( QString &contents, const QString &setting,
+ const QMap<QString, QString> &input )
+{
+ const QString platforms[] = { "", "win32", "unix", "mac", QString::null };
+ int i;
+ LanguageInterface *iface = MetaDataBase::languageInterface( lang );
+ if (iface && (setting == "SOURCES" || setting == "HEADERS")) // The (all) part will be saved later on
+ i = 1;
+ else
+ i = 0;
+ for (; platforms[ i ] != QString::null; ++i ) {
+ QString p = platforms[ i ];
+ if ( !p.isEmpty() )
+ p += ":";
+ QString key = platforms[ i ];
+ if ( key.isEmpty() )
+ key = "(all)";
+ QMap<QString, QString>::ConstIterator it = input.find( key );
+ if ( it == input.end() || (*it).isEmpty() )
+ continue;
+ contents += p + setting + "\t+= " + *it + "\n\n";
+ }
+}
+
+void Project::addFormFile( FormFile *ff )
+{
+ formfiles.append( ff );
+ modified = TRUE;
+ emit formFileAdded( ff );
+}
+
+bool Project::removeFormFile( FormFile *ff )
+{
+ if ( !formfiles.containsRef( ff ) )
+ return FALSE;
+ if ( !ff->close() )
+ return FALSE;
+ formfiles.removeRef( ff );
+ modified = TRUE;
+ emit formFileRemoved( ff );
+ return TRUE;
+}
+
+void Project::addObject( QObject *o )
+{
+ bool wasModified = modified;
+ objs.append( o );
+ FormFile *ff = new FormFile( "", FALSE, this, "qt_fakewindow" );
+ ff->setFileName( "__APPOBJ" + QString( o->name() ) + ".ui" );
+ fakeFormFiles.insert( (void*)o, ff );
+ MetaDataBase::addEntry( o );
+ if ( hasGUI() ) {
+ QWidget *parent = MainWindow::self ? MainWindow::self->qWorkspace() : 0;
+ FormWindow *fw = new FormWindow( ff, MainWindow::self, parent, "qt_fakewindow" );
+ fw->setProject( this );
+ if ( QFile::exists( ff->absFileName() ) )
+ Resource::loadExtraSource( ff, ff->absFileName(),
+ MetaDataBase::languageInterface( language() ), FALSE );
+ if ( MainWindow::self )
+ fw->setMainWindow( MainWindow::self );
+ if ( MainWindow::self ) {
+ QApplication::sendPostedEvents( MainWindow::self->qWorkspace(), QEvent::ChildInserted );
+ connect( fw,
+ SIGNAL( undoRedoChanged( bool, bool, const QString &, const QString & ) ),
+ MainWindow::self,
+ SLOT( updateUndoRedo( bool, bool, const QString &, const QString & ) )
+ );
+ }
+ if ( fw->parentWidget() ) {
+ fw->parentWidget()->setFixedSize( 1, 1 );
+ fw->show();
+ }
+ } else {
+ if ( QFile::exists( ff->absFileName() ) )
+ Resource::loadExtraSource( ff, ff->absFileName(),
+ MetaDataBase::languageInterface( language() ), FALSE );
+ }
+ emit objectAdded( o );
+ modified = wasModified;
+}
+
+void Project::setObjects( const QObjectList &ol )
+{
+ for ( QObjectListIt it( ol ); it.current(); ++it )
+ addObject( it.current() );
+}
+
+void Project::removeObject( QObject *o )
+{
+ bool wasModified = modified;
+ objs.removeRef( o );
+ MetaDataBase::removeEntry( o );
+ fakeFormFiles.remove( (void*)o );
+ emit objectRemoved( o );
+ modified = wasModified;
+}
+
+QObjectList Project::objects() const
+{
+ return objs;
+}
+
+FormFile *Project::fakeFormFileFor( QObject *o ) const
+{
+ return fakeFormFiles.find( (void*)o );
+}
+
+QObject *Project::objectForFakeForm( FormWindow *fw ) const
+{
+ for ( QPtrDictIterator<FormFile> it( fakeFormFiles ); it.current(); ++it ) {
+ if ( it.current()->formWindow() == fw ||
+ it.current() == fw->formFile() )
+ return (QObject*)it.currentKey();
+ }
+ return 0;
+}
+
+QObject *Project::objectForFakeFormFile( FormFile *ff ) const
+{
+ for ( QPtrDictIterator<FormFile> it( fakeFormFiles ); it.current(); ++it ) {
+ if ( it.current() == ff )
+ return (QObject*)it.currentKey();
+ }
+ return 0;
+}
+
+void Project::removeTempProject()
+{
+ if ( !singleProjectMode() )
+ return;
+ QDir d( QFileInfo( filename ).dirPath() );
+ if ( !d.exists( QFileInfo( filename ).dirPath() ) )
+ return;
+ QStringList files = d.entryList( QDir::Files );
+ QStringList::Iterator it;
+ for ( it = files.begin(); it != files.end(); ++it ) {
+ d.remove( *it );
+ }
+ if ( d.exists( QFileInfo( filename ).dirPath() + "/images" ) ) {
+ d = QDir( QFileInfo( filename ).dirPath() + "/images" );
+ files = d.entryList( QDir::Files );
+ for ( it = files.begin(); it != files.end(); ++it )
+ d.remove( *it );
+ d = QDir( QFileInfo( filename ).dirPath() );
+ d.remove( "images" );
+ }
+ d.remove( QFileInfo( filename ).dirPath() );
+#if defined(Q_OS_UNIX)
+ // ##### implement for all platforms, ideally should be in Qt
+ ::rmdir( d.absPath().latin1() );
+#endif
+}
+
+void Project::addAndEditFunction( const QString &function, const QString &functionBody, bool openDeveloper )
+{
+ for ( SourceFile *f = sourcefiles.first(); f; f = sourcefiles.next() ) {
+ if ( QFileInfo( f->fileName() ).baseName() == "main" ) {
+ QValueList<LanguageInterface::Function> funcs;
+ LanguageInterface *iface = MetaDataBase::languageInterface( language() );
+ if ( !iface )
+ return;
+ iface->functions( f->text(), &funcs );
+ QString func = function;
+ int i = func.find( '(' );
+ if ( i != -1 )
+ func = func.left( i );
+
+ bool found = FALSE;
+ for ( QValueList<LanguageInterface::Function>::Iterator it = funcs.begin();
+ it != funcs.end(); ++it ) {
+ if ( (*it).name.left( (*it).name.find( '(' ) ) == func ) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if ( !found ) {
+ QString code = f->text();
+ if ( functionBody.isEmpty() )
+ code += "\n\n" + iface->createFunctionStart( "", func, "", "" ) + "()\n{\n\n}\n";
+ else
+ code += "\n\n" + iface->createFunctionStart( "", func, "", "" ) +
+ "()\n" + functionBody + "\n";
+ f->setText( code );
+ if ( f->editor() )
+ f->editor()->refresh( FALSE );
+ }
+
+ if ( openDeveloper ) {
+ if ( MainWindow::self )
+ MainWindow::self->editSource( f );
+ f->editor()->setFunction( func, "" );
+ }
+
+ break;
+ }
+ }
+}
+
+bool Project::hasParentObject( QObject *o )
+{
+ for ( QObject *p = objs.first(); p; p = objs.next() ) {
+ QObject *c = p->child( o->name(), o->className() );
+ if ( c )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+QString Project::qualifiedName( QObject *o )
+{
+ QString name = o->name();
+ QObject *p = o->parent();
+ while ( p ) {
+ name.prepend( QString( p->name() ) + "." );
+ if ( objs.findRef( p ) != -1 )
+ break;
+ p = p->parent();
+ }
+ return name;
+}
+
+bool Project::singleProjectMode() const
+{
+ return !MainWindow::self || MainWindow::self->singleProjectMode();
+}
+
+QWidget *Project::messageBoxParent() const
+{
+ return MainWindow::self;
+}
+
+void Project::designerCreated()
+{
+ for ( FormFile *ff = formfiles.first(); ff; ff = formfiles.next() ) {
+ FormWindow *fw = ff->formWindow();
+ if ( !fw || fw->mainWindow() )
+ continue;
+ fw->setMainWindow( MainWindow::self );
+ connect( fw, SIGNAL( undoRedoChanged( bool, bool, const QString &,
+ const QString & ) ),
+ MainWindow::self, SLOT( updateUndoRedo( bool, bool,
+ const QString &, const QString & ) ) );
+ fw->reparent( MainWindow::self->qWorkspace(), QPoint( 0, 0 ), FALSE );
+ QApplication::sendPostedEvents( MainWindow::self->qWorkspace(),
+ QEvent::ChildInserted );
+ fw->parentWidget()->setFixedSize( 1, 1 );
+ fw->show();
+ }
+}
+
+void Project::formOpened( FormWindow *fw )
+{
+ if ( fw->isFake() )
+ return;
+ emit newFormOpened( fw );
+}
+
+QString Project::locationOfObject( QObject *o )
+{
+ if ( !o )
+ return QString::null;
+
+ if ( MainWindow::self ) {
+ QWidgetList windows = MainWindow::self->qWorkspace()->windowList();
+ for ( QWidget *w = windows.first(); w; w = windows.next() ) {
+ FormWindow *fw = ::qt_cast<FormWindow*>(w);
+ SourceEditor *se = ::qt_cast<SourceEditor*>(w);
+ if ( fw ) {
+ if ( fw->isFake() )
+ return objectForFakeForm( fw )->name() + QString( " [Source]" );
+ else
+ return fw->name() + QString( " [Source]" );
+ } else if ( se ) {
+ if ( !se->object() )
+ continue;
+ if ( se->formWindow() )
+ return se->formWindow()->name() + QString( " [Source]" );
+ else
+ return makeRelative( se->sourceFile()->fileName() );
+ }
+ }
+ }
+
+ if ( ::qt_cast<SourceFile*>(o) ) {
+ for ( QPtrListIterator<SourceFile> sources = sourceFiles();
+ sources.current(); ++sources ) {
+ SourceFile* f = sources.current();
+ if ( f == o )
+ return makeRelative( f->fileName() );
+ }
+ }
+
+ extern QMap<QWidget*, QString> *qwf_forms;
+ if ( !qwf_forms ) {
+ qWarning( "Project::locationOfObject: qwf_forms is NULL!" );
+ return QString::null;
+ }
+
+ QString s = makeRelative( *qwf_forms->find( (QWidget*)o ) );
+ s += " [Source]";
+ return s;
+}
+
+bool Project::hasGUI() const
+{
+ return qApp->type() != QApplication::Tty;
+}
diff --git a/tools/designer/designer/project.h b/tools/designer/designer/project.h
new file mode 100644
index 0000000..4bd3f6c
--- /dev/null
+++ b/tools/designer/designer/project.h
@@ -0,0 +1,280 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PROJECT_H
+#define PROJECT_H
+
+#include <qfeatures.h>
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qptrlist.h>
+#include <qmap.h>
+#include <private/qpluginmanager_p.h>
+#include "../interfaces/projectsettingsiface.h"
+#include "sourcefile.h"
+#include "formfile.h"
+#include <qobjectlist.h>
+#include <qptrdict.h>
+#include "formfile.h"
+
+class QObjectList;
+struct DesignerProject;
+struct DesignerDatabase;
+class PixmapCollection;
+class Project;
+
+#ifndef QT_NO_SQL
+class QSqlDatabase;
+
+class DatabaseConnection
+{
+public:
+ DatabaseConnection( Project *p ) :
+#ifndef QT_NO_SQL
+ conn( 0 ),
+#endif
+ project( p ), loaded( FALSE ), iface( 0 ) {}
+ ~DatabaseConnection();
+
+ bool refreshCatalog();
+ bool open( bool suppressDialog = TRUE );
+ void close();
+ DesignerDatabase *iFace();
+
+ bool isLoaded() const { return loaded; }
+ void setName( const QString& n ) { nm = n; }
+ QString name() const { return nm; }
+ void setDriver( const QString& d ) { drv = d; }
+ QString driver() const { return drv; }
+ void setDatabase( const QString& db ) { dbName = db; }
+ QString database() const { return dbName; }
+ void setUsername( const QString& u ) { uname = u; }
+ QString username() const { return uname; }
+ void setPassword( const QString& p ) { pword = p; }
+ QString password() const { return pword; }
+ void setHostname( const QString& h ) { hname = h; }
+ QString hostname() const { return hname; }
+ void setPort( int p ) { prt = p; }
+ int port() const { return prt; }
+ QString lastError() const { return dbErr; }
+ void addTable( const QString& t ) { tbls.append(t); }
+ void setFields( const QString& t, const QStringList& f ) { flds[t] = f; }
+ QStringList tables() const { return tbls; }
+ QStringList fields( const QString& t ) { return flds[t]; }
+ QMap<QString, QStringList> fields() { return flds; }
+#ifndef QT_NO_SQL
+ QSqlDatabase* connection() const { return conn; }
+ void remove();
+#endif
+
+private:
+ QString nm;
+ QString drv, dbName, uname, pword, hname;
+ QString dbErr;
+ int prt;
+ QStringList tbls;
+ QMap<QString, QStringList> flds;
+#ifndef QT_NO_SQL
+ QSqlDatabase *conn;
+#endif
+ Project *project;
+ bool loaded;
+ DesignerDatabase *iface;
+};
+
+#endif
+
+class Project : public QObject
+{
+ Q_OBJECT
+ friend class DatabaseConnection;
+
+public:
+ Project( const QString &fn, const QString &pName = QString::null,
+ QPluginManager<ProjectSettingsInterface> *pm = 0, bool isDummy = FALSE,
+ const QString &l = "C++" );
+ ~Project();
+
+ void setFileName( const QString &fn, bool doClear = TRUE );
+ QString fileName( bool singlePro = FALSE ) const;
+ QString projectName() const;
+
+ void setDatabaseDescription( const QString &db );
+ QString databaseDescription() const;
+
+ void setDescription( const QString &s );
+ QString description() const;
+
+ void setLanguage( const QString &l );
+ QString language() const;
+
+
+ bool isValid() const;
+
+ // returns TRUE if this project is the <No Project> project
+ bool isDummy() const;
+
+ QString makeAbsolute( const QString &f );
+ QString makeRelative( const QString &f );
+
+ void save( bool onlyProjectFile = FALSE );
+
+#ifndef QT_NO_SQL
+ QPtrList<DatabaseConnection> databaseConnections() const;
+ void setDatabaseConnections( const QPtrList<DatabaseConnection> &lst );
+ void addDatabaseConnection( DatabaseConnection *conn );
+ void removeDatabaseConnection( const QString &conn );
+ DatabaseConnection *databaseConnection( const QString &name );
+ QStringList databaseConnectionList();
+ QStringList databaseTableList( const QString &connection );
+ QStringList databaseFieldList( const QString &connection, const QString &table );
+#endif
+ void saveConnections();
+ void loadConnections();
+
+ bool openDatabase( const QString &connection, bool suppressDialog = TRUE );
+ void closeDatabase( const QString &connection );
+
+ QObjectList *formList( bool resolveFakeObjects = FALSE ) const;
+
+ DesignerProject *iFace();
+
+ void setCustomSetting( const QString &key, const QString &value );
+ QString customSetting( const QString &key ) const;
+
+ PixmapCollection *pixmapCollection() const { return pixCollection; }
+
+ void setActive( bool b );
+
+ QPtrListIterator<SourceFile> sourceFiles() const { return QPtrListIterator<SourceFile>(sourcefiles); }
+ void addSourceFile( SourceFile *sf );
+ bool removeSourceFile( SourceFile *sf );
+ SourceFile* findSourceFile( const QString& filename, SourceFile *ignore = 0 ) const;
+
+ QPtrListIterator<FormFile> formFiles() const { return QPtrListIterator<FormFile>(formfiles); }
+ void addFormFile( FormFile *ff );
+ bool removeFormFile( FormFile *ff );
+ FormFile* findFormFile( const QString& filename, FormFile *ignore = 0 ) const;
+
+ void setIncludePath( const QString &platform, const QString &path );
+ void setLibs( const QString &platform, const QString &path );
+ void setDefines( const QString &platform, const QString &path );
+ void setConfig( const QString &platform, const QString &config );
+ void setTemplate( const QString &t );
+
+ QString config( const QString &platform ) const;
+ QString libs( const QString &platform ) const;
+ QString defines( const QString &platform ) const;
+ QString includePath( const QString &platform ) const;
+ QString templte() const;
+
+ bool isModified() const { return !isDummy() && modified; }
+ void setModified( bool b );
+
+ void addObject( QObject *o );
+ void setObjects( const QObjectList &ol );
+ void removeObject( QObject *o );
+ QObjectList objects() const;
+ FormFile *fakeFormFileFor( QObject *o ) const;
+ QObject *objectForFakeForm( FormWindow *fw ) const;
+ QObject *objectForFakeFormFile( FormFile *ff ) const;
+
+ void addAndEditFunction( const QString &functionName, const QString &functionBody,
+ bool openDeveloper );
+
+ void removeTempProject();
+ bool hasParentObject( QObject *o );
+ QString qualifiedName( QObject *o );
+
+ bool isCpp() const { return is_cpp; }
+
+ void designerCreated();
+
+ void formOpened( FormWindow *fw );
+
+ QString locationOfObject( QObject *o );
+
+ bool hasGUI() const;
+
+signals:
+ void projectModified();
+ void sourceFileAdded( SourceFile* );
+ void sourceFileRemoved( SourceFile* );
+ void formFileAdded( FormFile* );
+ void formFileRemoved( FormFile* );
+ void objectAdded( QObject * );
+ void objectRemoved( QObject * );
+ void newFormOpened( FormWindow *fw );
+
+private:
+ void parse();
+ void clear();
+ void updateCustomSettings();
+ void readPlatformSettings( const QString &contents,
+ const QString &setting,
+ QMap<QString, QString> &res );
+ void removePlatformSettings( QString &contents, const QString &setting );
+ void writePlatformSettings( QString &contents, const QString &setting,
+ const QMap<QString, QString> &input );
+ bool singleProjectMode() const;
+ QWidget *messageBoxParent() const;
+
+private:
+ QString filename;
+ QString proName;
+ QString desc;
+ QString dbFile;
+#ifndef QT_NO_SQL
+ QPtrList<DatabaseConnection> dbConnections;
+#endif
+ QString lang;
+ DesignerProject *iface;
+ QMap<QString, QString> customSettings;
+ QStringList csList;
+ QPluginManager<ProjectSettingsInterface> *projectSettingsPluginManager;
+ PixmapCollection *pixCollection;
+ QPtrList<SourceFile> sourcefiles;
+ QPtrList<FormFile> formfiles;
+ QMap<QString, QString> inclPath, defs, lbs, cfg, sources, headers;
+ QString templ;
+ bool isDummyProject;
+ bool modified;
+ QObjectList objs;
+ QPtrDict<FormFile> fakeFormFiles;
+ QString singleProFileName;
+ bool is_cpp;
+
+};
+
+#endif
diff --git a/tools/designer/designer/projectsettings.ui b/tools/designer/designer/projectsettings.ui
new file mode 100644
index 0000000..9e3f4bd
--- /dev/null
+++ b/tools/designer/designer/projectsettings.ui
@@ -0,0 +1,308 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ProjectSettingsBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ProjectSettingsBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>375</width>
+ <height>224</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Project Settings</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tabSettings</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Settings</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Project File:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editProjectFile</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Language</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboLanguage</cstring>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="2" column="2">
+ <property name="name">
+ <cstring>buttonDatabaseFile_2</cstring>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>editDatabaseFile</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Database File:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editDatabaseFile</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>comboLanguage</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>editProjectFile</cstring>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>buttonProject</cstring>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>71</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonProject</sender>
+ <signal>clicked()</signal>
+ <receiver>ProjectSettingsBase</receiver>
+ <slot>chooseProjectFile()</slot>
+ </connection>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>ProjectSettingsBase</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>ProjectSettingsBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>buttonHelp</sender>
+ <signal>clicked()</signal>
+ <receiver>ProjectSettingsBase</receiver>
+ <slot>helpClicked()</slot>
+ </connection>
+ <connection>
+ <sender>comboLanguage</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>ProjectSettingsBase</receiver>
+ <slot>languageChanged(const QString&amp;)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>tabWidget</tabstop>
+ <tabstop>editProjectFile</tabstop>
+ <tabstop>comboLanguage</tabstop>
+ <tabstop>buttonHelp</tabstop>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">chooseDatabaseFile()</slot>
+ <slot access="protected">chooseProjectFile()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot access="protected">helpClicked()</slot>
+ <slot access="protected">init()</slot>
+ <slot access="protected">languageChanged( const QString &amp; )</slot>
+ <slot access="protected">okClicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/projectsettingsimpl.cpp b/tools/designer/designer/projectsettingsimpl.cpp
new file mode 100644
index 0000000..65d8a4b
--- /dev/null
+++ b/tools/designer/designer/projectsettingsimpl.cpp
@@ -0,0 +1,132 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "projectsettingsimpl.h"
+#include "project.h"
+#include "formwindow.h"
+#include "metadatabase.h"
+#include "mainwindow.h"
+#include "asciivalidator.h"
+#include "mainwindow.h"
+#include "sourcefile.h"
+#include "workspace.h"
+
+#include <qlineedit.h>
+#include <qtextedit.h>
+#include <qcheckbox.h>
+#include <qfiledialog.h>
+#include <qcombobox.h>
+#include <qobjectlist.h>
+#include <qheader.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+
+/*
+ * Constructs a ProjectSettings which is a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'
+ *
+ * The dialog will by default be modeless, unless you set 'modal' to
+ * TRUE to construct a modal dialog.
+ */
+ProjectSettings::ProjectSettings( Project *pro, QWidget* parent, const char* name, bool modal, WFlags fl )
+ : ProjectSettingsBase( parent, name, modal, fl ), project( pro )
+{
+ connect( buttonHelp, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+
+ editProjectFile->setFocus();
+
+ if ( project->isDummy() ) {
+ editProjectFile->setEnabled( FALSE );
+ editProjectFile->setText( project->projectName() );
+ } else {
+ if ( project->fileName().isEmpty() || project->fileName() == ".pro" ) {
+ editProjectFile->setText( tr( "unnamed.pro" ) );
+ editProjectFile->selectAll();
+ } else {
+ editProjectFile->setText( project->fileName() );
+ }
+ }
+
+ editDatabaseFile->setText( project->databaseDescription() );
+
+ comboLanguage->insertStringList( MetaDataBase::languages() );
+ for ( int j = 0; j < (int)comboLanguage->count(); ++j ) {
+ if ( project->language() == comboLanguage->text( j ) ) {
+ comboLanguage->setCurrentItem( j );
+ break;
+ }
+ }
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+ProjectSettings::~ProjectSettings()
+{
+}
+
+void ProjectSettings::chooseDatabaseFile()
+{
+ QString fn = QFileDialog::getSaveFileName(editDatabaseFile->text(), tr("Database Files (*.db);;All Files (*)"),
+ this);
+ if ( fn.isEmpty() )
+ return;
+ editDatabaseFile->setText( fn );
+}
+
+void ProjectSettings::chooseProjectFile()
+{
+ QString fn = QFileDialog::getSaveFileName(editProjectFile->text(), tr("Project Files (*.pro);;All Files (*)"),
+ this);
+ if ( fn.isEmpty() )
+ return;
+ editProjectFile->setText( fn );
+}
+
+void ProjectSettings::helpClicked()
+{
+}
+
+void ProjectSettings::okClicked()
+{
+ // ### check for validity
+ project->setFileName( editProjectFile->text(), FALSE );
+ project->setDatabaseDescription( editDatabaseFile->text() );
+ project->setLanguage( comboLanguage->text( comboLanguage->currentItem() ) );
+ project->setModified( TRUE );
+ accept();
+}
+
+void ProjectSettings::languageChanged( const QString & )
+{
+}
diff --git a/tools/designer/designer/projectsettingsimpl.h b/tools/designer/designer/projectsettingsimpl.h
new file mode 100644
index 0000000..1d1462e
--- /dev/null
+++ b/tools/designer/designer/projectsettingsimpl.h
@@ -0,0 +1,63 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PROJECTSETTINGSIMPL_H
+#define PROJECTSETTINGSIMPL_H
+
+#include "projectsettings.h"
+
+class Project;
+class QListViewItem;
+class FormWindow;
+class SourceFile;
+
+class ProjectSettings : public ProjectSettingsBase
+{
+ Q_OBJECT
+
+public:
+ ProjectSettings( Project *pro, QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~ProjectSettings();
+
+protected slots:
+ void chooseDatabaseFile();
+ void chooseProjectFile();
+ void helpClicked();
+ void okClicked();
+ void languageChanged( const QString &lang );
+
+private:
+ Project *project;
+};
+
+#endif
diff --git a/tools/designer/designer/propertyeditor.cpp b/tools/designer/designer/propertyeditor.cpp
new file mode 100644
index 0000000..708f779
--- /dev/null
+++ b/tools/designer/designer/propertyeditor.cpp
@@ -0,0 +1,4308 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qvariant.h> // HP-UX compiler needs this here
+
+#include "propertyeditor.h"
+#include "formwindow.h"
+#include "command.h"
+#include "metadatabase.h"
+#include "propertyobject.h"
+#include <widgetdatabase.h>
+#include "widgetfactory.h"
+#include "globaldefs.h"
+#include "defs.h"
+#include "asciivalidator.h"
+#include "paletteeditorimpl.h"
+#include "multilineeditorimpl.h"
+#include "mainwindow.h"
+#include "project.h"
+#include "hierarchyview.h"
+#include "database.h"
+#include "menubareditor.h"
+
+#include <qpainter.h>
+#include <qpalette.h>
+#include <qapplication.h>
+#include <qheader.h>
+#include <qlineedit.h>
+#include <qstrlist.h>
+#include <qmetaobject.h>
+#include <qcombobox.h>
+#include <qpushbutton.h>
+#include <qhbox.h>
+#include <qfontdialog.h>
+#include <qspinbox.h>
+#include <qevent.h>
+#include <qobjectlist.h>
+#include <qlistbox.h>
+#include <qfontdatabase.h>
+#include <qcolor.h>
+#include <qcolordialog.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qsizepolicy.h>
+#include <qbitmap.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qaccel.h>
+#include <qworkspace.h>
+#include <qtimer.h>
+#include <qdragobject.h>
+#include <qdom.h>
+#include <qprocess.h>
+#include <qstyle.h>
+#include <qdatetimeedit.h>
+#include <qassistantclient.h>
+#include <qdrawutil.h>
+#include <qmultilineedit.h> // FIXME: obsolete
+#include <qsplitter.h>
+#include <qdatatable.h>
+#include <qtextview.h>
+
+#include <limits.h>
+
+static QFontDatabase *fontDataBase = 0;
+QString assistantPath();
+
+#ifdef Q_WS_MAC
+#include <qwindowsstyle.h>
+static void setupStyle(QWidget *w)
+{
+ static QStyle *windowsStyle = 0;
+ if(!windowsStyle)
+ windowsStyle = new QWindowsStyle;
+ w->setStyle(windowsStyle);
+}
+#else
+#define setupStyle(x)
+#endif
+
+static void cleanupFontDatabase()
+{
+ delete fontDataBase;
+ fontDataBase = 0;
+}
+
+static QStringList getFontList()
+{
+ if ( !fontDataBase ) {
+ fontDataBase = new QFontDatabase;
+ qAddPostRoutine( cleanupFontDatabase );
+ }
+ return fontDataBase->families();
+}
+
+
+class PropertyWhatsThis : public QWhatsThis
+{
+public:
+ PropertyWhatsThis( PropertyList *l );
+ QString text( const QPoint &pos );
+ bool clicked( const QString& href );
+
+private:
+ PropertyList *propertyList;
+
+};
+
+PropertyWhatsThis::PropertyWhatsThis( PropertyList *l )
+ : QWhatsThis( l->viewport() ), propertyList( l )
+{
+}
+
+QString PropertyWhatsThis::text( const QPoint &pos )
+{
+ return propertyList->whatsThisAt( pos );
+}
+
+bool PropertyWhatsThis::clicked( const QString& href )
+{
+ if ( !href.isEmpty() ) {
+ QAssistantClient *ac = MainWindow::self->assistantClient();
+ ac->showPage( QString( qInstallPathDocs() ) + "/html/" + href );
+ }
+ return FALSE; // do not hide window
+}
+
+
+/*!
+ \class PropertyItem propertyeditor.h
+ \brief Base class for all property items
+
+ This is the base class for each property item for the
+ PropertyList. A simple property item has just a name and a value to
+ provide an editor for a datatype. But more complex datatypes might
+ provide an expandable item for editing single parts of the
+ datatype. See hasSubItems(), initChildren() for that.
+*/
+
+/*! If this item should be a child of another property item, specify
+ \a prop as the parent item.
+*/
+
+PropertyItem::PropertyItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName )
+ : QListViewItem( l, after ), listview( l ), property( prop ), propertyName( propName )
+{
+ setSelectable( FALSE );
+ open = FALSE;
+ setText( 0, propertyName );
+ changed = FALSE;
+ setText( 1, "" );
+ resetButton = 0;
+}
+
+PropertyItem::~PropertyItem()
+{
+ if ( resetButton )
+ delete resetButton->parentWidget();
+ resetButton = 0;
+}
+
+void PropertyItem::toggle()
+{
+}
+
+void PropertyItem::updateBackColor()
+{
+ if ( itemAbove() && this != listview->firstChild() ) {
+ if ( ( ( PropertyItem*)itemAbove() )->backColor == *backColor1 )
+ backColor = *backColor2;
+ else
+ backColor = *backColor1;
+ } else {
+ backColor = *backColor1;
+ }
+ if ( listview->firstChild() == this )
+ backColor = *backColor1;
+}
+
+QColor PropertyItem::backgroundColor()
+{
+ updateBackColor();
+ if ( (QListViewItem*)this == listview->currentItem() )
+ return *selectedBack;
+ return backColor;
+}
+
+/*! If a subclass is a expandable item, this is called when the child
+items should be created.
+*/
+
+void PropertyItem::createChildren()
+{
+}
+
+/*! If a subclass is a expandable item, this is called when the child
+items should be initialized.
+*/
+
+void PropertyItem::initChildren()
+{
+}
+
+void PropertyItem::paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int align )
+{
+ QColorGroup g( cg );
+ g.setColor( QColorGroup::Base, backgroundColor() );
+ g.setColor( QColorGroup::Foreground, Qt::black );
+ g.setColor( QColorGroup::Text, Qt::black );
+ int indent = 0;
+ if ( column == 0 ) {
+ indent = 20 + ( property ? 20 : 0 );
+ p->fillRect( 0, 0, width, height(), backgroundColor() );
+ p->save();
+ p->translate( indent, 0 );
+ }
+
+ if ( isChanged() && column == 0 ) {
+ p->save();
+ QFont f = p->font();
+ f.setBold( TRUE );
+ p->setFont( f );
+ }
+
+ if ( !hasCustomContents() || column != 1 ) {
+ QListViewItem::paintCell( p, g, column, width - indent, align );
+ } else {
+ p->fillRect( 0, 0, width, height(), backgroundColor() );
+ drawCustomContents( p, QRect( 0, 0, width, height() ) );
+ }
+
+ if ( isChanged() && column == 0 )
+ p->restore();
+ if ( column == 0 )
+ p->restore();
+ if ( hasSubItems() && column == 0 ) {
+ p->save();
+ p->setPen( cg.foreground() );
+ p->setBrush( cg.base() );
+ p->drawRect( 5, height() / 2 - 4, 9, 9 );
+ p->drawLine( 7, height() / 2, 11, height() / 2 );
+ if ( !isOpen() )
+ p->drawLine( 9, height() / 2 - 2, 9, height() / 2 + 2 );
+ p->restore();
+ }
+ p->save();
+ p->setPen( QPen( cg.dark(), 1 ) );
+ p->drawLine( 0, height() - 1, width, height() - 1 );
+ p->drawLine( width - 1, 0, width - 1, height() );
+ p->restore();
+
+ if ( listview->currentItem() == this && column == 0 &&
+ !listview->hasFocus() && !listview->viewport()->hasFocus() )
+ paintFocus( p, cg, QRect( 0, 0, width, height() ) );
+}
+
+void PropertyItem::paintBranches( QPainter * p, const QColorGroup & cg,
+ int w, int y, int h )
+{
+ QColorGroup g( cg );
+ g.setColor( QColorGroup::Base, backgroundColor() );
+ QListViewItem::paintBranches( p, g, w, y, h );
+}
+
+void PropertyItem::paintFocus( QPainter *p, const QColorGroup &cg, const QRect &r )
+{
+ p->save();
+ QApplication::style().drawPrimitive(QStyle::PE_Panel, p, r, cg,
+ QStyle::Style_Sunken, QStyleOption(1,1) );
+ p->restore();
+}
+
+/*! Subclasses which are expandable items have to return TRUE
+ here. Default is FALSE.
+*/
+
+bool PropertyItem::hasSubItems() const
+{
+ return FALSE;
+}
+
+/*! Returns the parent property item here if this is a child or 0
+ otherwise.
+ */
+
+PropertyItem *PropertyItem::propertyParent() const
+{
+ return property;
+}
+
+bool PropertyItem::isOpen() const
+{
+ return open;
+}
+
+void PropertyItem::setOpen( bool b )
+{
+ if ( b == open )
+ return;
+ open = b;
+
+ if ( !open ) {
+ children.setAutoDelete( TRUE );
+ children.clear();
+ children.setAutoDelete( FALSE );
+ qApp->processEvents();
+ listview->updateEditorSize();
+ return;
+ }
+
+ createChildren();
+ initChildren();
+ qApp->processEvents();
+ listview->updateEditorSize();
+}
+
+/*! Subclasses have to show the editor of the item here
+*/
+
+void PropertyItem::showEditor()
+{
+ createResetButton();
+ resetButton->parentWidget()->show();
+}
+
+/*! Subclasses have to hide the editor of the item here
+*/
+
+void PropertyItem::hideEditor()
+{
+ createResetButton();
+ resetButton->parentWidget()->hide();
+}
+
+/*! This is called to init the value of the item. Reimplement in
+ subclasses to init the editor
+*/
+
+void PropertyItem::setValue( const QVariant &v )
+{
+ val = v;
+}
+
+QVariant PropertyItem::value() const
+{
+ return val;
+}
+
+bool PropertyItem::isChanged() const
+{
+ return changed;
+}
+
+void PropertyItem::setChanged( bool b, bool updateDb )
+{
+ if ( propertyParent() )
+ return;
+ if ( changed == b )
+ return;
+ changed = b;
+ repaint();
+ if ( updateDb ) {
+ MetaDataBase::setPropertyChanged( listview->propertyEditor()->widget(), name(), changed );
+ }
+ updateResetButtonState();
+}
+
+QString PropertyItem::name() const
+{
+ return propertyName;
+}
+
+void PropertyItem::createResetButton()
+{
+ if ( resetButton ) {
+ resetButton->parentWidget()->lower();
+ return;
+ }
+ QHBox *hbox = new QHBox( listview->viewport() );
+ hbox->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ hbox->setLineWidth( 1 );
+ resetButton = new QPushButton( hbox );
+ setupStyle( resetButton );
+ resetButton->setPixmap( QPixmap::fromMimeSource( "designer_resetproperty.png" ) );
+ resetButton->setFixedWidth( resetButton->sizeHint().width() );
+ hbox->layout()->setAlignment( Qt::AlignRight );
+ listview->addChild( hbox );
+ hbox->hide();
+ QObject::connect( resetButton, SIGNAL( clicked() ),
+ listview, SLOT( resetProperty() ) );
+ QToolTip::add( resetButton, PropertyEditor::tr( "Reset the property to its default value" ) );
+ QWhatsThis::add( resetButton, PropertyEditor::tr( "Click this button to reset the property to its default value" ) );
+ updateResetButtonState();
+}
+
+void PropertyItem::updateResetButtonState()
+{
+ if ( !resetButton )
+ return;
+ if ( propertyParent() || !WidgetFactory::canResetProperty( listview->propertyEditor()->widget(), name() ) )
+ resetButton->setEnabled( FALSE );
+ else
+ resetButton->setEnabled( isChanged() );
+}
+
+/*! Call this to place/resize the item editor correctly (normally
+ call it from showEditor())
+*/
+
+void PropertyItem::placeEditor( QWidget *w )
+{
+ createResetButton();
+ QRect r = listview->itemRect( this );
+ if ( !r.size().isValid() ) {
+ listview->ensureItemVisible( this );
+#if defined(Q_WS_WIN)
+ listview->repaintContents( FALSE );
+#endif
+ r = listview->itemRect( this );
+ }
+ r.setX( listview->header()->sectionPos( 1 ) );
+ r.setWidth( listview->header()->sectionSize( 1 ) - 1 );
+ r.setWidth( r.width() - resetButton->width() - 2 );
+ r = QRect( listview->viewportToContents( r.topLeft() ), r.size() );
+ w->resize( r.size() );
+ listview->moveChild( w, r.x(), r.y() );
+ resetButton->parentWidget()->resize( resetButton->sizeHint().width() + 10, r.height() );
+ listview->moveChild( resetButton->parentWidget(), r.x() + r.width() - 8, r.y() );
+ resetButton->setFixedHeight( QMAX( 0, r.height() - 3 ) );
+}
+
+/*! This should be called by subclasses if the user changed the value
+ of the property and this value should be applied to the widget property
+*/
+
+void PropertyItem::notifyValueChange()
+{
+ if ( !propertyParent() ) {
+ listview->valueChanged( this );
+ setChanged( TRUE );
+ if ( hasSubItems() )
+ initChildren();
+ } else {
+ propertyParent()->childValueChanged( this );
+ setChanged( TRUE );
+ }
+}
+
+/*! If a subclass is a expandable item reimplement this as this is
+ always called if a child item changed its value. So update the
+ display of the item here then.
+*/
+
+void PropertyItem::childValueChanged( PropertyItem * )
+{
+}
+
+/*! When adding a child item, call this (normally from addChildren()
+*/
+
+void PropertyItem::addChild( PropertyItem *i )
+{
+ children.append( i );
+}
+
+int PropertyItem::childCount() const
+{
+ return children.count();
+}
+
+PropertyItem *PropertyItem::child( int i ) const
+{
+ // ARRRRRRRRG
+ return ( (PropertyItem*)this )->children.at( i );
+}
+
+/*! If the contents of the item is not displayable with a text, but
+ you want to draw it yourself (using drawCustomContents()), return
+ TRUE here.
+*/
+
+bool PropertyItem::hasCustomContents() const
+{
+ return FALSE;
+}
+
+/*!
+ \sa hasCustomContents()
+*/
+
+void PropertyItem::drawCustomContents( QPainter *, const QRect & )
+{
+}
+
+QString PropertyItem::currentItem() const
+{
+ return QString::null;
+}
+
+int PropertyItem::currentIntItem() const
+{
+ return -1;
+}
+
+void PropertyItem::setCurrentItem( const QString & )
+{
+}
+
+void PropertyItem::setCurrentItem( int )
+{
+}
+
+int PropertyItem::currentIntItemFromObject() const
+{
+ return -1;
+}
+
+QString PropertyItem::currentItemFromObject() const
+{
+ return QString::null;
+}
+
+void PropertyItem::setFocus( QWidget *w )
+{
+ if ( !qApp->focusWidget() ||
+ listview->propertyEditor()->formWindow() &&
+ ( !MainWindow::self->isAFormWindowChild( qApp->focusWidget() ) &&
+ !qApp->focusWidget()->inherits( "Editor" ) ) )
+ w->setFocus();
+}
+
+void PropertyItem::setText( int col, const QString &t )
+{
+ QString txt( t );
+ if ( col == 1 )
+ txt = txt.replace( "\n", " " );
+ QListViewItem::setText( col, txt );
+}
+
+// --------------------------------------------------------------
+
+PropertyTextItem::PropertyTextItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, bool comment, bool multiLine, bool ascii, bool a )
+ : PropertyItem( l, after, prop, propName ), withComment( comment ),
+ hasMultiLines( multiLine ), asciiOnly( ascii ), accel( a )
+{
+ lin = 0;
+ box = 0;
+}
+
+QLineEdit *PropertyTextItem::lined()
+{
+ if ( lin )
+ return lin;
+ if ( hasMultiLines ) {
+ box = new QHBox( listview->viewport() );
+ box->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ box->setLineWidth( 2 );
+ box->hide();
+ }
+
+ lin = 0;
+ if ( hasMultiLines )
+ lin = new QLineEdit( box );
+ else
+ lin = new QLineEdit( listview->viewport() );
+
+ if ( asciiOnly ) {
+ if ( PropertyItem::name() == "name" ) {
+ lin->setValidator( new AsciiValidator( QString(":"), lin, "ascii_validator" ) );
+ if ( listview->propertyEditor()->formWindow()->isFake() )
+ lin->setEnabled( FALSE );
+ } else {
+ lin->setValidator( new AsciiValidator( QString("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
+ "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9"
+ "\xaa\xab\xac\xad\xae\xaf\xb1\xb2\xb3"
+ "\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc"
+ "\xbd\xbe\xbf"), lin, "ascii_validator" ) );
+ }
+ } if ( !hasMultiLines ) {
+ lin->hide();
+ } else {
+ button = new QPushButton( tr("..."), box );
+ setupStyle( button );
+ button->setFixedWidth( 20 );
+ connect( button, SIGNAL( clicked() ),
+ this, SLOT( getText() ) );
+ lin->setFrame( FALSE );
+ }
+ connect( lin, SIGNAL( returnPressed() ),
+ this, SLOT( setValue() ) );
+ connect( lin, SIGNAL( textChanged( const QString & ) ),
+ this, SLOT( setValue() ) );
+ if ( PropertyItem::name() == "name" || PropertyItem::name() == "itemName" )
+ connect( lin, SIGNAL( returnPressed() ),
+ listview->propertyEditor()->formWindow()->commandHistory(),
+ SLOT( checkCompressedCommand() ) );
+ lin->installEventFilter( listview );
+ return lin;
+}
+
+PropertyTextItem::~PropertyTextItem()
+{
+ delete (QLineEdit*)lin;
+ lin = 0;
+ delete (QHBox*)box;
+ box = 0;
+}
+
+void PropertyTextItem::setChanged( bool b, bool updateDb )
+{
+ PropertyItem::setChanged( b, updateDb );
+ if ( withComment && childCount() > 0 )
+ ( (PropertyTextItem*)PropertyItem::child( 0 ) )->lined()->setEnabled( b );
+}
+
+bool PropertyTextItem::hasSubItems() const
+{
+ return withComment;
+}
+
+void PropertyTextItem::childValueChanged( PropertyItem *child )
+{
+ if ( PropertyItem::name() != "name" )
+ MetaDataBase::setPropertyComment( listview->propertyEditor()->widget(),
+ PropertyItem::name(), child->value().toString() );
+ else
+ MetaDataBase::setExportMacro( listview->propertyEditor()->widget(), child->value().toString() );
+ listview->propertyEditor()->formWindow()->commandHistory()->setModified( TRUE );
+}
+
+void PropertyTextItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !lin || lin->text().length() == 0 ) {
+ lined()->blockSignals( TRUE );
+ lined()->setText( value().toString() );
+ lined()->blockSignals( FALSE );
+ }
+
+ QWidget* w;
+ if ( hasMultiLines )
+ w = box;
+ else
+ w= lined();
+
+ placeEditor( w );
+ if ( !w->isVisible() || !lined()->hasFocus() ) {
+ w->show();
+ setFocus( lined() );
+ }
+}
+
+void PropertyTextItem::createChildren()
+{
+ PropertyTextItem *i = new PropertyTextItem( listview, this, this,
+ PropertyItem::name() == "name" ?
+ "export macro" : "comment", FALSE, FALSE,
+ PropertyItem::name() == "name" );
+ i->lined()->setEnabled( isChanged() );
+ addChild( i );
+}
+
+void PropertyTextItem::initChildren()
+{
+ if ( !childCount() )
+ return;
+ PropertyItem *item = PropertyItem::child( 0 );
+ if ( item ) {
+ if ( PropertyItem::name() != "name" )
+ item->setValue( MetaDataBase::propertyComment( listview->propertyEditor()->widget(),
+ PropertyItem::name() ) );
+ else
+ item->setValue( MetaDataBase::exportMacro( listview->propertyEditor()->widget() ) );
+ }
+}
+
+void PropertyTextItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ QWidget* w;
+ if ( hasMultiLines )
+ w = box;
+ else
+ w = lined();
+
+ w->hide();
+}
+
+void PropertyTextItem::setValue( const QVariant &v )
+{
+ if ( ( !hasSubItems() || !isOpen() )
+ && value() == v )
+ return;
+ if ( lin ) {
+ lined()->blockSignals( TRUE );
+ int oldCursorPos;
+ oldCursorPos = lin->cursorPosition();
+ lined()->setText( v.toString() );
+ if ( oldCursorPos < (int)lin->text().length() )
+ lin->setCursorPosition( oldCursorPos );
+ lined()->blockSignals( FALSE );
+ }
+ setText( 1, v.toString() );
+ PropertyItem::setValue( v );
+}
+
+void PropertyTextItem::setValue()
+{
+ setText( 1, lined()->text() );
+ QVariant v;
+ if ( accel ) {
+ v = QVariant( QKeySequence( lined()->text() ) );
+ if ( v.toString().isNull() )
+ return; // not yet valid input
+ } else {
+ v = lined()->text();
+ }
+ PropertyItem::setValue( v );
+ notifyValueChange();
+}
+
+void PropertyTextItem::getText()
+{
+ bool richText = !::qt_cast<QButton*>(listview->propertyEditor()->widget()) ||
+ ( text( 0 ) == "whatsThis" );
+ bool doWrap = FALSE;
+ QString txt = MultiLineEditor::getText( listview, value().toString(), richText, &doWrap );
+ if ( !txt.isEmpty() ) {
+ setText( 1, txt );
+ PropertyItem::setValue( txt );
+ notifyValueChange();
+ lined()->blockSignals( TRUE );
+ lined()->setText( txt );
+ lined()->blockSignals( FALSE );
+ }
+}
+
+// --------------------------------------------------------------
+
+PropertyDoubleItem::PropertyDoubleItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ lin = 0;
+}
+
+QLineEdit *PropertyDoubleItem::lined()
+{
+ if ( lin )
+ return lin;
+ lin = new QLineEdit( listview->viewport() );
+ lin->setValidator( new QDoubleValidator( lin, "double_validator" ) );
+
+ connect( lin, SIGNAL( returnPressed() ),
+ this, SLOT( setValue() ) );
+ connect( lin, SIGNAL( textChanged( const QString & ) ),
+ this, SLOT( setValue() ) );
+ lin->installEventFilter( listview );
+ return lin;
+}
+
+PropertyDoubleItem::~PropertyDoubleItem()
+{
+ delete (QLineEdit*)lin;
+ lin = 0;
+}
+
+void PropertyDoubleItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !lin ) {
+ lined()->blockSignals( TRUE );
+ lined()->setText( QString::number( value().toDouble() ) );
+ lined()->blockSignals( FALSE );
+ }
+ QWidget* w = lined();
+
+ placeEditor( w );
+ if ( !w->isVisible() || !lined()->hasFocus() ) {
+ w->show();
+ setFocus( lined() );
+ }
+}
+
+
+void PropertyDoubleItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ QWidget* w = lined();
+ w->hide();
+}
+
+void PropertyDoubleItem::setValue( const QVariant &v )
+{
+ if ( value() == v )
+ return;
+ if ( lin ) {
+ lined()->blockSignals( TRUE );
+ int oldCursorPos;
+ oldCursorPos = lin->cursorPosition();
+ lined()->setText( QString::number( v.toDouble() ) );
+ if ( oldCursorPos < (int)lin->text().length() )
+ lin->setCursorPosition( oldCursorPos );
+ lined()->blockSignals( FALSE );
+ }
+ setText( 1, QString::number( v.toDouble() ) );
+ PropertyItem::setValue( v );
+}
+
+void PropertyDoubleItem::setValue()
+{
+ setText( 1, lined()->text() );
+ QVariant v = lined()->text().toDouble();
+ PropertyItem::setValue( v );
+ notifyValueChange();
+}
+
+
+// --------------------------------------------------------------
+
+PropertyDateItem::PropertyDateItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ lin = 0;
+}
+
+QDateEdit *PropertyDateItem::lined()
+{
+ if ( lin )
+ return lin;
+ lin = new QDateEdit( listview->viewport() );
+ QObjectList *l = lin->queryList( "QLineEdit" );
+ for ( QObject *o = l->first(); o; o = l->next() )
+ o->installEventFilter( listview );
+ delete l;
+ connect( lin, SIGNAL( valueChanged( const QDate & ) ),
+ this, SLOT( setValue() ) );
+ return lin;
+}
+
+PropertyDateItem::~PropertyDateItem()
+{
+ delete (QDateEdit*)lin;
+ lin = 0;
+}
+
+void PropertyDateItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !lin ) {
+ lined()->blockSignals( TRUE );
+ lined()->setDate( value().toDate() );
+ lined()->blockSignals( FALSE );
+ }
+ placeEditor( lin );
+ if ( !lin->isVisible() ) {
+ lin->show();
+ setFocus( lin );
+ }
+}
+
+void PropertyDateItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ if ( lin )
+ lin->hide();
+}
+
+void PropertyDateItem::setValue( const QVariant &v )
+{
+ if ( ( !hasSubItems() || !isOpen() )
+ && value() == v )
+ return;
+
+ if ( lin ) {
+ lined()->blockSignals( TRUE );
+ if ( lined()->date() != v.toDate() )
+ lined()->setDate( v.toDate() );
+ lined()->blockSignals( FALSE );
+ }
+ setText( 1, v.toDate().toString( ::Qt::ISODate ) );
+ PropertyItem::setValue( v );
+}
+
+void PropertyDateItem::setValue()
+{
+ setText( 1, lined()->date().toString( ::Qt::ISODate ) );
+ QVariant v;
+ v = lined()->date();
+ PropertyItem::setValue( v );
+ notifyValueChange();
+}
+
+// --------------------------------------------------------------
+
+PropertyTimeItem::PropertyTimeItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ lin = 0;
+}
+
+QTimeEdit *PropertyTimeItem::lined()
+{
+ if ( lin )
+ return lin;
+ lin = new QTimeEdit( listview->viewport() );
+ connect( lin, SIGNAL( valueChanged( const QTime & ) ),
+ this, SLOT( setValue() ) );
+ QObjectList *l = lin->queryList( "QLineEdit" );
+ for ( QObject *o = l->first(); o; o = l->next() )
+ o->installEventFilter( listview );
+ delete l;
+ return lin;
+}
+
+PropertyTimeItem::~PropertyTimeItem()
+{
+ delete (QTimeEdit*)lin;
+ lin = 0;
+}
+
+void PropertyTimeItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !lin ) {
+ lined()->blockSignals( TRUE );
+ lined()->setTime( value().toTime() );
+ lined()->blockSignals( FALSE );
+ }
+ placeEditor( lin );
+ if ( !lin->isVisible() ) {
+ lin->show();
+ setFocus( lin );
+ }
+}
+
+void PropertyTimeItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ if ( lin )
+ lin->hide();
+}
+
+void PropertyTimeItem::setValue( const QVariant &v )
+{
+ if ( ( !hasSubItems() || !isOpen() )
+ && value() == v )
+ return;
+
+ if ( lin ) {
+ lined()->blockSignals( TRUE );
+ if ( lined()->time() != v.toTime() )
+ lined()->setTime( v.toTime() );
+ lined()->blockSignals( FALSE );
+ }
+ setText( 1, v.toTime().toString( ::Qt::ISODate ) );
+ PropertyItem::setValue( v );
+}
+
+void PropertyTimeItem::setValue()
+{
+ setText( 1, lined()->time().toString( ::Qt::ISODate ) );
+ QVariant v;
+ v = lined()->time();
+ PropertyItem::setValue( v );
+ notifyValueChange();
+}
+
+// --------------------------------------------------------------
+
+PropertyDateTimeItem::PropertyDateTimeItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ lin = 0;
+}
+
+QDateTimeEdit *PropertyDateTimeItem::lined()
+{
+ if ( lin )
+ return lin;
+ lin = new QDateTimeEdit( listview->viewport() );
+ connect( lin, SIGNAL( valueChanged( const QDateTime & ) ),
+ this, SLOT( setValue() ) );
+ QObjectList *l = lin->queryList( "QLineEdit" );
+ for ( QObject *o = l->first(); o; o = l->next() )
+ o->installEventFilter( listview );
+ delete l;
+ return lin;
+}
+
+PropertyDateTimeItem::~PropertyDateTimeItem()
+{
+ delete (QDateTimeEdit*)lin;
+ lin = 0;
+}
+
+void PropertyDateTimeItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !lin ) {
+ lined()->blockSignals( TRUE );
+ lined()->setDateTime( value().toDateTime() );
+ lined()->blockSignals( FALSE );
+ }
+ placeEditor( lin );
+ if ( !lin->isVisible() ) {
+ lin->show();
+ setFocus( lin );
+ }
+}
+
+void PropertyDateTimeItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ if ( lin )
+ lin->hide();
+}
+
+void PropertyDateTimeItem::setValue( const QVariant &v )
+{
+ if ( ( !hasSubItems() || !isOpen() )
+ && value() == v )
+ return;
+
+ if ( lin ) {
+ lined()->blockSignals( TRUE );
+ if ( lined()->dateTime() != v.toDateTime() )
+ lined()->setDateTime( v.toDateTime() );
+ lined()->blockSignals( FALSE );
+ }
+ setText( 1, v.toDateTime().toString( ::Qt::ISODate ) );
+ PropertyItem::setValue( v );
+}
+
+void PropertyDateTimeItem::setValue()
+{
+ setText( 1, lined()->dateTime().toString( ::Qt::ISODate ) );
+ QVariant v;
+ v = lined()->dateTime();
+ PropertyItem::setValue( v );
+ notifyValueChange();
+}
+
+// --------------------------------------------------------------
+
+PropertyBoolItem::PropertyBoolItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ comb = 0;
+}
+
+QComboBox *PropertyBoolItem::combo()
+{
+ if ( comb )
+ return comb;
+ comb = new QComboBox( FALSE, listview->viewport() );
+ comb->hide();
+ comb->insertItem( tr( "False" ) );
+ comb->insertItem( tr( "True" ) );
+ connect( comb, SIGNAL( activated( int ) ),
+ this, SLOT( setValue() ) );
+ comb->installEventFilter( listview );
+ return comb;
+}
+
+PropertyBoolItem::~PropertyBoolItem()
+{
+ delete (QComboBox*)comb;
+ comb = 0;
+}
+
+void PropertyBoolItem::toggle()
+{
+ bool b = value().toBool();
+ setValue( QVariant( !b, 0 ) );
+ setValue();
+}
+
+void PropertyBoolItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !comb ) {
+ combo()->blockSignals( TRUE );
+ if ( value().toBool() )
+ combo()->setCurrentItem( 1 );
+ else
+ combo()->setCurrentItem( 0 );
+ combo()->blockSignals( FALSE );
+ }
+ placeEditor( combo() );
+ if ( !combo()->isVisible() || !combo()->hasFocus() ) {
+ combo()->show();
+ setFocus( combo() );
+ }
+}
+
+void PropertyBoolItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ combo()->hide();
+}
+
+void PropertyBoolItem::setValue( const QVariant &v )
+{
+ if ( ( !hasSubItems() || !isOpen() )
+ && value() == v )
+ return;
+
+ if ( comb ) {
+ combo()->blockSignals( TRUE );
+ if ( v.toBool() )
+ combo()->setCurrentItem( 1 );
+ else
+ combo()->setCurrentItem( 0 );
+ combo()->blockSignals( FALSE );
+ }
+ QString tmp = tr( "True" );
+ if ( !v.toBool() )
+ tmp = tr( "False" );
+ setText( 1, tmp );
+ PropertyItem::setValue( v );
+}
+
+void PropertyBoolItem::setValue()
+{
+ if ( !comb )
+ return;
+ setText( 1, combo()->currentText() );
+ bool b = combo()->currentItem() == 0 ? (bool)FALSE : (bool)TRUE;
+ PropertyItem::setValue( QVariant( b, 0 ) );
+ notifyValueChange();
+}
+
+// --------------------------------------------------------------
+
+PropertyIntItem::PropertyIntItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, bool s )
+ : PropertyItem( l, after, prop, propName ), signedValue( s )
+{
+ spinBx = 0;
+}
+
+QSpinBox *PropertyIntItem::spinBox()
+{
+ if ( spinBx )
+ return spinBx;
+ if ( signedValue )
+ spinBx = new QSpinBox( -INT_MAX, INT_MAX, 1, listview->viewport() );
+ else
+ spinBx = new QSpinBox( 0, INT_MAX, 1, listview->viewport() );
+ spinBx->hide();
+ spinBx->installEventFilter( listview );
+ QObjectList *ol = spinBx->queryList( "QLineEdit" );
+ if ( ol && ol->first() )
+ ol->first()->installEventFilter( listview );
+ delete ol;
+ connect( spinBx, SIGNAL( valueChanged( int ) ),
+ this, SLOT( setValue() ) );
+ return spinBx;
+}
+
+PropertyIntItem::~PropertyIntItem()
+{
+ delete (QSpinBox*)spinBx;
+ spinBx = 0;
+}
+
+void PropertyIntItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !spinBx ) {
+ spinBox()->blockSignals( TRUE );
+ if ( signedValue )
+ spinBox()->setValue( value().toInt() );
+ else
+ spinBox()->setValue( value().toUInt() );
+ spinBox()->blockSignals( FALSE );
+ }
+ placeEditor( spinBox() );
+ if ( !spinBox()->isVisible() || !spinBox()->hasFocus() ) {
+ spinBox()->show();
+ setFocus( spinBox() );
+ }
+}
+
+void PropertyIntItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ spinBox()->hide();
+}
+
+void PropertyIntItem::setValue( const QVariant &v )
+{
+ if ( ( !hasSubItems() || !isOpen() )
+ && value() == v )
+ return;
+
+ if ( spinBx ) {
+ spinBox()->blockSignals( TRUE );
+ if ( signedValue )
+ spinBox()->setValue( v.toInt() );
+ else
+ spinBox()->setValue( v.toUInt() );
+ spinBox()->blockSignals( FALSE );
+ }
+
+ if ( signedValue )
+ setText( 1, QString::number( v.toInt() ) );
+ else
+ setText( 1, QString::number( v.toUInt() ) );
+ PropertyItem::setValue( v );
+}
+
+void PropertyIntItem::setValue()
+{
+ if ( !spinBx )
+ return;
+ setText( 1, QString::number( spinBox()->value() ) );
+ if ( signedValue )
+ PropertyItem::setValue( spinBox()->value() );
+ else
+ PropertyItem::setValue( (uint)spinBox()->value() );
+ notifyValueChange();
+}
+
+// --------------------------------------------------------------
+
+PropertyLayoutItem::PropertyLayoutItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ spinBx = 0;
+}
+
+PropertyLayoutItem::~PropertyLayoutItem()
+{
+ delete (QSpinBox*)spinBx;
+ spinBx = 0;
+}
+
+QSpinBox* PropertyLayoutItem::spinBox()
+{
+ if ( spinBx )
+ return spinBx;
+ spinBx = new QSpinBox( -1, INT_MAX, 1, listview->viewport() );
+ spinBx->setSpecialValueText( tr( "default" ) );
+ spinBx->hide();
+ spinBx->installEventFilter( listview );
+ QObjectList *ol = spinBx->queryList( "QLineEdit" );
+ if ( ol && ol->first() )
+ ol->first()->installEventFilter( listview );
+ delete ol;
+ connect( spinBx, SIGNAL( valueChanged( int ) ),
+ this, SLOT( setValue() ) );
+ return spinBx;
+}
+
+void PropertyLayoutItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !spinBx ) {
+ spinBox()->blockSignals( TRUE );
+ spinBox()->setValue( value().toInt() );
+ spinBox()->blockSignals( TRUE );
+ }
+ placeEditor( spinBox() );
+ if ( !spinBox()->isVisible() || !spinBox()->hasFocus() ) {
+ spinBox()->show();
+ setFocus( spinBox() );
+ }
+}
+
+void PropertyLayoutItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ spinBox()->hide();
+}
+
+void PropertyLayoutItem::setValue( const QVariant &v )
+{
+ if ( spinBx ) {
+ spinBox()->blockSignals( TRUE );
+ spinBox()->setValue( v.toInt() );
+ spinBox()->blockSignals( FALSE );
+ }
+ QString s = v.toString();
+ if ( v.toInt() == -1 )
+ s = spinBox()->specialValueText();
+ setText( 1, s );
+ PropertyItem::setValue( v );
+}
+
+void PropertyLayoutItem::setValue()
+{
+ if ( !spinBx )
+ return;
+ PropertyItem::setValue( spinBox()->value() );
+ notifyValueChange();
+}
+
+
+// --------------------------------------------------------------
+
+PropertyListItem::PropertyListItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, bool e )
+ : PropertyItem( l, after, prop, propName ), editable( e )
+{
+ comb = 0;
+ oldInt = -1;
+}
+
+QComboBox *PropertyListItem::combo()
+{
+ if ( comb )
+ return comb;
+ comb = new QComboBox( editable, listview->viewport() );
+ comb->hide();
+ connect( comb, SIGNAL( activated( int ) ),
+ this, SLOT( setValue() ) );
+ comb->installEventFilter( listview );
+ if ( editable ) {
+ QObjectList *ol = comb->queryList( "QLineEdit" );
+ if ( ol && ol->first() )
+ ol->first()->installEventFilter( listview );
+ delete ol;
+ }
+ return comb;
+}
+
+PropertyListItem::~PropertyListItem()
+{
+ delete (QComboBox*)comb;
+ comb = 0;
+}
+
+void PropertyListItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !comb ) {
+ combo()->blockSignals( TRUE );
+ combo()->clear();
+ combo()->insertStringList( value().toStringList() );
+ combo()->blockSignals( FALSE );
+ }
+ placeEditor( combo() );
+ if ( !combo()->isVisible() || !combo()->hasFocus() ) {
+ combo()->show();
+ setFocus( combo() );
+ }
+}
+
+void PropertyListItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ combo()->hide();
+}
+
+void PropertyListItem::setValue( const QVariant &v )
+{
+ if ( comb ) {
+ combo()->blockSignals( TRUE );
+ combo()->clear();
+ combo()->insertStringList( v.toStringList() );
+ combo()->blockSignals( FALSE );
+ }
+ setText( 1, v.toStringList().first() );
+ PropertyItem::setValue( v );
+}
+
+void PropertyListItem::setValue()
+{
+ if ( !comb )
+ return;
+ setText( 1, combo()->currentText() );
+ QStringList lst;
+ for ( uint i = 0; i < combo()->listBox()->count(); ++i )
+ lst << combo()->listBox()->item( i )->text();
+ PropertyItem::setValue( lst );
+ notifyValueChange();
+ oldInt = currentIntItem();
+ oldString = currentItem();
+}
+
+QString PropertyListItem::currentItem() const
+{
+ return ( (PropertyListItem*)this )->combo()->currentText();
+}
+
+void PropertyListItem::setCurrentItem( const QString &s )
+{
+ if ( comb && currentItem().lower() == s.lower() )
+ return;
+
+ if ( !comb ) {
+ combo()->blockSignals( TRUE );
+ combo()->clear();
+ combo()->insertStringList( value().toStringList() );
+ combo()->blockSignals( FALSE );
+ }
+ for ( uint i = 0; i < combo()->listBox()->count(); ++i ) {
+ if ( combo()->listBox()->item( i )->text().lower() == s.lower() ) {
+ combo()->setCurrentItem( i );
+ setText( 1, combo()->currentText() );
+ break;
+ }
+ }
+ oldInt = currentIntItem();
+ oldString = currentItem();
+}
+
+void PropertyListItem::addItem( const QString &s )
+{
+ combo()->insertItem( s );
+}
+
+void PropertyListItem::setCurrentItem( int i )
+{
+ if ( comb && i == combo()->currentItem() )
+ return;
+
+ if ( !comb ) {
+ combo()->blockSignals( TRUE );
+ combo()->clear();
+ combo()->insertStringList( value().toStringList() );
+ combo()->blockSignals( FALSE );
+ }
+ combo()->setCurrentItem( i );
+ setText( 1, combo()->currentText() );
+ oldInt = currentIntItem();
+ oldString = currentItem();
+}
+
+int PropertyListItem::currentIntItem() const
+{
+ return ( (PropertyListItem*)this )->combo()->currentItem();
+}
+
+int PropertyListItem::currentIntItemFromObject() const
+{
+ return oldInt;
+}
+
+QString PropertyListItem::currentItemFromObject() const
+{
+ return oldString;
+}
+
+// --------------------------------------------------------------
+
+PropertyCoordItem::PropertyCoordItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, Type t )
+ : PropertyItem( l, after, prop, propName ), typ( t )
+{
+ lin = 0;
+
+}
+
+QLineEdit *PropertyCoordItem::lined()
+{
+ if ( lin )
+ return lin;
+ lin = new QLineEdit( listview->viewport() );
+ lin->setReadOnly( TRUE );
+ lin->installEventFilter( listview );
+ lin->hide();
+ return lin;
+}
+
+void PropertyCoordItem::createChildren()
+{
+ PropertyItem *i = this;
+ if ( typ == Rect || typ == Point ) {
+ i = new PropertyIntItem( listview, i, this, tr( "x" ), TRUE );
+ addChild( i );
+ i = new PropertyIntItem( listview, i, this, tr( "y" ), TRUE );
+ addChild( i );
+ }
+ if ( typ == Rect || typ == Size ) {
+ i = new PropertyIntItem( listview, i, this, tr( "width" ), TRUE );
+ addChild( i );
+ i = new PropertyIntItem( listview, i, this, tr( "height" ), TRUE );
+ addChild( i );
+ }
+}
+
+void PropertyCoordItem::initChildren()
+{
+ PropertyItem *item = 0;
+ for ( int i = 0; i < childCount(); ++i ) {
+ item = PropertyItem::child( i );
+ if ( item->name() == tr( "x" ) ) {
+ if ( typ == Rect )
+ item->setValue( val.toRect().x() );
+ else if ( typ == Point )
+ item->setValue( val.toPoint().x() );
+ } else if ( item->name() == tr( "y" ) ) {
+ if ( typ == Rect )
+ item->setValue( val.toRect().y() );
+ else if ( typ == Point )
+ item->setValue( val.toPoint().y() );
+ } else if ( item->name() == tr( "width" ) ) {
+ if ( typ == Rect )
+ item->setValue( val.toRect().width() );
+ else if ( typ == Size )
+ item->setValue( val.toSize().width() );
+ } else if ( item->name() == tr( "height" ) ) {
+ if ( typ == Rect )
+ item->setValue( val.toRect().height() );
+ else if ( typ == Size )
+ item->setValue( val.toSize().height() );
+ }
+ }
+}
+
+PropertyCoordItem::~PropertyCoordItem()
+{
+ delete (QLineEdit*)lin;
+ lin = 0;
+}
+
+void PropertyCoordItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !lin )
+ lined()->setText( text( 1 ) );
+ placeEditor( lined() );
+ if ( !lined()->isVisible() || !lined()->hasFocus() ) {
+ lined()->show();
+ setFocus( lined() );
+ }
+}
+
+void PropertyCoordItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ lined()->hide();
+}
+
+void PropertyCoordItem::setValue( const QVariant &v )
+{
+ if ( ( !hasSubItems() || !isOpen() )
+ && value() == v )
+ return;
+
+ QString s;
+ if ( typ == Rect )
+ s = "[ " + QString::number( v.toRect().x() ) + ", " + QString::number( v.toRect().y() ) + ", " +
+ QString::number( v.toRect().width() ) + ", " + QString::number( v.toRect().height() ) + " ]";
+ else if ( typ == Point )
+ s = "[ " + QString::number( v.toPoint().x() ) + ", " +
+ QString::number( v.toPoint().y() ) + " ]";
+ else if ( typ == Size )
+ s = "[ " + QString::number( v.toSize().width() ) + ", " +
+ QString::number( v.toSize().height() ) + " ]";
+ setText( 1, s );
+ if ( lin )
+ lined()->setText( s );
+ PropertyItem::setValue( v );
+}
+
+bool PropertyCoordItem::hasSubItems() const
+{
+ return TRUE;
+}
+
+void PropertyCoordItem::childValueChanged( PropertyItem *child )
+{
+ if ( typ == Rect ) {
+ QRect r = value().toRect();
+ if ( child->name() == tr( "x" ) )
+ r.moveBy( -r.x() + child->value().toInt(), 0 );
+ else if ( child->name() == tr( "y" ) )
+ r.moveBy( 0, -r.y() + child->value().toInt() );
+ else if ( child->name() == tr( "width" ) )
+ r.setWidth( child->value().toInt() );
+ else if ( child->name() == tr( "height" ) )
+ r.setHeight( child->value().toInt() );
+ setValue( r );
+ } else if ( typ == Point ) {
+ QPoint r = value().toPoint();
+ if ( child->name() == tr( "x" ) )
+ r.setX( child->value().toInt() );
+ else if ( child->name() == tr( "y" ) )
+ r.setY( child->value().toInt() );
+ setValue( r );
+ } else if ( typ == Size ) {
+ QSize r = value().toSize();
+ if ( child->name() == tr( "width" ) )
+ r.setWidth( child->value().toInt() );
+ else if ( child->name() == tr( "height" ) )
+ r.setHeight( child->value().toInt() );
+ setValue( r );
+ }
+ notifyValueChange();
+}
+
+// --------------------------------------------------------------
+
+PropertyPixmapItem::PropertyPixmapItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, Type t )
+ : PropertyItem( l, after, prop, propName ), type( t )
+{
+ box = new QHBox( listview->viewport() );
+ box->hide();
+ pixPrev = new QLabel( box );
+ pixPrev->setSizePolicy( QSizePolicy( QSizePolicy::Ignored, QSizePolicy::Minimum ) );
+ pixPrev->setBackgroundColor( pixPrev->colorGroup().color( QColorGroup::Base ) );
+ button = new QPushButton( "...", box );
+ setupStyle( button );
+ button->setFixedWidth( 20 );
+ box->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ box->setLineWidth( 2 );
+ pixPrev->setFrameStyle( QFrame::NoFrame );
+ box->installEventFilter( listview );
+ connect( button, SIGNAL( clicked() ),
+ this, SLOT( getPixmap() ) );
+}
+
+PropertyPixmapItem::~PropertyPixmapItem()
+{
+ delete (QHBox*)box;
+}
+
+void PropertyPixmapItem::showEditor()
+{
+ PropertyItem::showEditor();
+ placeEditor( box );
+ if ( !box->isVisible() ) {
+ box->show();
+ listView()->viewport()->setFocus();
+ }
+}
+
+void PropertyPixmapItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ box->hide();
+}
+
+void PropertyPixmapItem::setValue( const QVariant &v )
+{
+ QString s;
+ if ( type == Pixmap )
+ pixPrev->setPixmap( v.toPixmap() );
+ else if ( type == IconSet )
+ pixPrev->setPixmap( v.toIconSet().pixmap() );
+ else
+ pixPrev->setPixmap( v.toImage() );
+ PropertyItem::setValue( v );
+ repaint();
+}
+
+void PropertyPixmapItem::getPixmap()
+{
+ QPixmap pix = qChoosePixmap( listview, listview->propertyEditor()->formWindow(), value().toPixmap() );
+ if ( !pix.isNull() ) {
+ if ( type == Pixmap )
+ setValue( pix );
+ else if ( type == IconSet )
+ setValue( QIconSet( pix ) );
+ else
+ setValue( pix.convertToImage() );
+
+ notifyValueChange();
+ }
+}
+
+bool PropertyPixmapItem::hasCustomContents() const
+{
+ return TRUE;
+}
+
+void PropertyPixmapItem::drawCustomContents( QPainter *p, const QRect &r )
+{
+ QPixmap pix;
+ if ( type == Pixmap )
+ pix = value().toPixmap();
+ else if ( type == IconSet )
+ pix = value().toIconSet().pixmap();
+ else
+ pix = value().toImage();
+
+ if ( !pix.isNull() ) {
+ p->save();
+ p->setClipRect( QRect( QPoint( (int)(p->worldMatrix().dx() + r.x()),
+ (int)(p->worldMatrix().dy() + r.y()) ),
+ r.size() ) );
+ p->drawPixmap( r.x(), r.y() + ( r.height() - pix.height() ) / 2, pix );
+ p->restore();
+ }
+}
+
+
+// --------------------------------------------------------------
+
+PropertyColorItem::PropertyColorItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, bool children )
+ : PropertyItem( l, after, prop, propName ), withChildren( children )
+{
+ box = new QHBox( listview->viewport() );
+ box->hide();
+ colorPrev = new QFrame( box );
+ button = new QPushButton( "...", box );
+ setupStyle( button );
+ button->setFixedWidth( 20 );
+ box->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ box->setLineWidth( 2 );
+ colorPrev->setFrameStyle( QFrame::Plain | QFrame::Box );
+ colorPrev->setLineWidth( 2 );
+ QPalette pal = colorPrev->palette();
+ QColorGroup cg = pal.active();
+ cg.setColor( QColorGroup::Foreground, cg.color( QColorGroup::Base ) );
+ pal.setActive( cg );
+ pal.setInactive( cg );
+ pal.setDisabled( cg );
+ colorPrev->setPalette( pal );
+ box->installEventFilter( listview );
+ connect( button, SIGNAL( clicked() ),
+ this, SLOT( getColor() ) );
+}
+
+void PropertyColorItem::createChildren()
+{
+ PropertyItem *i = this;
+ i = new PropertyIntItem( listview, i, this, tr( "Red" ), TRUE );
+ addChild( i );
+ i = new PropertyIntItem( listview, i, this, tr( "Green" ), TRUE );
+ addChild( i );
+ i = new PropertyIntItem( listview, i, this, tr( "Blue" ), TRUE );
+ addChild( i );
+}
+
+void PropertyColorItem::initChildren()
+{
+ PropertyItem *item = 0;
+ for ( int i = 0; i < childCount(); ++i ) {
+ item = PropertyItem::child( i );
+ if ( item->name() == tr( "Red" ) )
+ item->setValue( val.toColor().red() );
+ else if ( item->name() == tr( "Green" ) )
+ item->setValue( val.toColor().green() );
+ else if ( item->name() == tr( "Blue" ) )
+ item->setValue( val.toColor().blue() );
+ }
+}
+
+PropertyColorItem::~PropertyColorItem()
+{
+ delete (QHBox*)box;
+}
+
+void PropertyColorItem::showEditor()
+{
+ PropertyItem::showEditor();
+ placeEditor( box );
+ if ( !box->isVisible() ) {
+ box->show();
+ listView()->viewport()->setFocus();
+ }
+}
+
+void PropertyColorItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ box->hide();
+}
+
+void PropertyColorItem::setValue( const QVariant &v )
+{
+ if ( ( !hasSubItems() || !isOpen() )
+ && value() == v )
+ return;
+
+ QString s;
+ setText( 1, v.toColor().name() );
+ colorPrev->setBackgroundColor( v.toColor() );
+ PropertyItem::setValue( v );
+}
+
+bool PropertyColorItem::hasSubItems() const
+{
+ return withChildren;
+}
+
+void PropertyColorItem::childValueChanged( PropertyItem *child )
+{
+ QColor c( val.toColor() );
+ if ( child->name() == tr( "Red" ) )
+ c.setRgb( child->value().toInt(), c.green(), c.blue() );
+ else if ( child->name() == tr( "Green" ) )
+ c.setRgb( c.red(), child->value().toInt(), c.blue() );
+ else if ( child->name() == tr( "Blue" ) )
+ c.setRgb( c.red(), c.green(), child->value().toInt() );
+ setValue( c );
+ notifyValueChange();
+}
+
+void PropertyColorItem::getColor()
+{
+ QColor c = QColorDialog::getColor( val.asColor(), listview );
+ if ( c.isValid() ) {
+ setValue( c );
+ notifyValueChange();
+ }
+}
+
+bool PropertyColorItem::hasCustomContents() const
+{
+ return TRUE;
+}
+
+void PropertyColorItem::drawCustomContents( QPainter *p, const QRect &r )
+{
+ p->save();
+ p->setPen( QPen( black, 1 ) );
+ p->setBrush( val.toColor() );
+ p->drawRect( r.x() + 2, r.y() + 2, r.width() - 5, r.height() - 5 );
+ p->restore();
+}
+
+// --------------------------------------------------------------
+
+PropertyFontItem::PropertyFontItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ box = new QHBox( listview->viewport() );
+ box->hide();
+ lined = new QLineEdit( box );
+ button = new QPushButton( "...", box );
+ setupStyle( button );
+ button->setFixedWidth( 20 );
+ box->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ box->setLineWidth( 2 );
+ lined->setFrame( FALSE );
+ lined->setReadOnly( TRUE );
+ box->setFocusProxy( lined );
+ box->installEventFilter( listview );
+ lined->installEventFilter( listview );
+ button->installEventFilter( listview );
+ connect( button, SIGNAL( clicked() ),
+ this, SLOT( getFont() ) );
+}
+
+void PropertyFontItem::createChildren()
+{
+ PropertyItem *i = this;
+ i = new PropertyListItem( listview, i, this, tr( "Family" ), FALSE );
+ addChild( i );
+ i = new PropertyIntItem( listview, i, this, tr( "Point Size" ), TRUE );
+ addChild( i );
+ i = new PropertyBoolItem( listview, i, this, tr( "Bold" ) );
+ addChild( i );
+ i = new PropertyBoolItem( listview, i, this, tr( "Italic" ) );
+ addChild( i );
+ i = new PropertyBoolItem( listview, i, this, tr( "Underline" ) );
+ addChild( i );
+ i = new PropertyBoolItem( listview, i, this, tr( "Strikeout" ) );
+ addChild( i );
+}
+
+void PropertyFontItem::initChildren()
+{
+ PropertyItem *item = 0;
+ for ( int i = 0; i < childCount(); ++i ) {
+ item = PropertyItem::child( i );
+ if ( item->name() == tr( "Family" ) ) {
+ ( (PropertyListItem*)item )->setValue( getFontList() );
+ ( (PropertyListItem*)item )->setCurrentItem( val.toFont().family() );
+ } else if ( item->name() == tr( "Point Size" ) )
+ item->setValue( val.toFont().pointSize() );
+ else if ( item->name() == tr( "Bold" ) )
+ item->setValue( QVariant( val.toFont().bold(), 0 ) );
+ else if ( item->name() == tr( "Italic" ) )
+ item->setValue( QVariant( val.toFont().italic(), 0 ) );
+ else if ( item->name() == tr( "Underline" ) )
+ item->setValue( QVariant( val.toFont().underline(), 0 ) );
+ else if ( item->name() == tr( "Strikeout" ) )
+ item->setValue( QVariant( val.toFont().strikeOut(), 0 ) );
+ }
+}
+
+PropertyFontItem::~PropertyFontItem()
+{
+ delete (QHBox*)box;
+}
+
+void PropertyFontItem::showEditor()
+{
+ PropertyItem::showEditor();
+ placeEditor( box );
+ if ( !box->isVisible() || !lined->hasFocus() ) {
+ box->show();
+ setFocus( lined );
+ }
+}
+
+void PropertyFontItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ box->hide();
+}
+
+void PropertyFontItem::setValue( const QVariant &v )
+{
+ if ( value() == v )
+ return;
+
+ setText( 1, v.toFont().family() + "-" + QString::number( v.toFont().pointSize() ) );
+ lined->setText( v.toFont().family() + "-" + QString::number( v.toFont().pointSize() ) );
+ PropertyItem::setValue( v );
+}
+
+void PropertyFontItem::getFont()
+{
+ bool ok = FALSE;
+ QFont f = QFontDialog::getFont( &ok, val.toFont(), listview );
+ if ( ok && f != val.toFont() ) {
+ setValue( f );
+ notifyValueChange();
+ }
+}
+
+bool PropertyFontItem::hasSubItems() const
+{
+ return TRUE;
+}
+
+void PropertyFontItem::childValueChanged( PropertyItem *child )
+{
+ QFont f = val.toFont();
+ if ( child->name() == tr( "Family" ) )
+ f.setFamily( ( (PropertyListItem*)child )->currentItem() );
+ else if ( child->name() == tr( "Point Size" ) )
+ f.setPointSize( child->value().toInt() );
+ else if ( child->name() == tr( "Bold" ) )
+ f.setBold( child->value().toBool() );
+ else if ( child->name() == tr( "Italic" ) )
+ f.setItalic( child->value().toBool() );
+ else if ( child->name() == tr( "Underline" ) )
+ f.setUnderline( child->value().toBool() );
+ else if ( child->name() == tr( "Strikeout" ) )
+ f.setStrikeOut( child->value().toBool() );
+ setValue( f );
+ notifyValueChange();
+}
+
+// --------------------------------------------------------------
+
+PropertyDatabaseItem::PropertyDatabaseItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, bool wField )
+ : PropertyItem( l, after, prop, propName ), withField( wField )
+{
+ box = new QHBox( listview->viewport() );
+ box->hide();
+ lined = new QLineEdit( box );
+ button = new QPushButton( "...", box );
+ setupStyle( button );
+ button->setFixedWidth( 20 );
+ box->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ box->setLineWidth( 2 );
+ lined->setFrame( FALSE );
+ lined->setReadOnly( TRUE );
+ box->setFocusProxy( lined );
+ box->installEventFilter( listview );
+ lined->installEventFilter( listview );
+ button->installEventFilter( listview );
+}
+
+void PropertyDatabaseItem::createChildren()
+{
+ PropertyItem *i = this;
+ i = new PropertyListItem( listview, i, this, tr( "Connection" ), TRUE );
+ addChild( i );
+ i = new PropertyListItem( listview, i, this, tr( "Table" ), TRUE );
+ addChild( i );
+ if ( withField ) {
+ i = new PropertyListItem( listview, i, this, tr( "Field" ), TRUE );
+ addChild( i );
+ }
+}
+
+void PropertyDatabaseItem::initChildren()
+{
+#ifndef QT_NO_SQL
+ PropertyItem *item = 0;
+ QStringList lst = value().toStringList();
+ QString conn, table;
+ for ( int i = 0; i < childCount(); ++i ) {
+ item = PropertyItem::child( i );
+ if ( item->name() == tr( "Connection" ) ) {
+ QStringList cl = listview->propertyEditor()->formWindow()->project()->databaseConnectionList();
+ if ( !cl.isEmpty() )
+ item->setValue( cl );
+ else if ( lst.count() > 0 )
+ item->setValue( QStringList( lst[ 0 ] ) );
+ else if ( withField )
+ item->setValue( QStringList( MetaDataBase::fakeProperty( listview->propertyEditor()->formWindow()->mainContainer(),
+ "database" ).toStringList()[ 0 ] ) );
+
+ if ( lst.count() > 0 && !lst[ 0 ].isEmpty() )
+ item->setCurrentItem( lst[ 0 ] );
+ else if ( !isChanged() && withField )
+ item->setCurrentItem( MetaDataBase::fakeProperty( listview->propertyEditor()->formWindow()->mainContainer(),
+ "database" ).toStringList()[ 0 ] );
+ else
+ item->setCurrentItem( 0 );
+ conn = item->currentItem();
+ } else if ( item->name() == tr( "Table" ) ) {
+ QStringList cl = listview->propertyEditor()->formWindow()->project()->databaseTableList( conn );
+ if ( !cl.isEmpty() )
+ item->setValue( cl );
+ else if ( lst.count() > 1 )
+ item->setValue( QStringList( lst[ 1 ] ) );
+ else if ( withField ) {
+ QStringList fakeLst = MetaDataBase::fakeProperty( listview->propertyEditor()->formWindow()->mainContainer(), "database" ).toStringList();
+ if ( fakeLst.count() > 1 )
+ item->setValue( fakeLst[ 1 ] );
+ }
+
+ if ( lst.count() > 1 && !lst[ 1 ].isEmpty() )
+ item->setCurrentItem( lst[ 1 ] );
+ else if ( !isChanged() && withField ) {
+ QStringList fakeLst = MetaDataBase::fakeProperty( listview->propertyEditor()->formWindow()->mainContainer(), "database" ).toStringList();
+ if ( fakeLst.count() > 1 )
+ item->setCurrentItem( fakeLst[ 1 ] );
+ else
+ item->setCurrentItem( 0 );
+ } else
+ item->setCurrentItem( 0 );
+ table = item->currentItem();
+ } else if ( item->name() == tr( "Field" ) ) {
+ QStringList cl = listview->propertyEditor()->formWindow()->project()->databaseFieldList( conn, table );
+ if ( !cl.isEmpty() )
+ item->setValue( cl );
+ else if ( lst.count() > 2 )
+ item->setValue( QStringList( lst[ 2 ] ) );
+ if ( lst.count() > 2 && !lst[ 2 ].isEmpty() )
+ item->setCurrentItem( lst[ 2 ] );
+ else
+ item->setCurrentItem( 0 );
+ }
+ }
+#endif
+}
+
+PropertyDatabaseItem::~PropertyDatabaseItem()
+{
+ delete (QHBox*)box;
+}
+
+void PropertyDatabaseItem::showEditor()
+{
+ PropertyItem::showEditor();
+ placeEditor( box );
+ if ( !box->isVisible() || !lined->hasFocus() ) {
+ box->show();
+ setFocus( lined );
+ }
+}
+
+void PropertyDatabaseItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ box->hide();
+}
+
+void PropertyDatabaseItem::setValue( const QVariant &v )
+{
+ if ( value() == v )
+ return;
+
+ QStringList lst = v.toStringList();
+ QString s = lst.join( "." );
+ setText( 1, s );
+ lined->setText( s );
+ PropertyItem::setValue( v );
+}
+
+bool PropertyDatabaseItem::hasSubItems() const
+{
+ return TRUE;
+}
+
+void PropertyDatabaseItem::childValueChanged( PropertyItem *c )
+{
+#ifndef QT_NO_SQL
+ QStringList lst;
+ lst << ( (PropertyListItem*)PropertyItem::child( 0 ) )->currentItem()
+ << ( (PropertyListItem*)PropertyItem::child( 1 ) )->currentItem();
+ if ( withField )
+ lst << ( (PropertyListItem*)PropertyItem::child( 2 ) )->currentItem();
+ if ( c == PropertyItem::child( 0 ) ) { // if the connection changed
+ lst[ 0 ] = ( (PropertyListItem*)c )->currentItem();
+ PropertyItem::child( 1 )->setValue( listview->propertyEditor()->formWindow()->project()->databaseTableList( lst[ 0 ] ) );
+ if ( withField )
+ PropertyItem::child( 2 )->setValue( listview->propertyEditor()->formWindow()->project()->databaseFieldList( lst[ 0 ], lst[ 1 ] ) );
+ } else if ( withField && c == PropertyItem::child( 1 ) ) { // if the table changed
+ lst[ 1 ] = ( (PropertyListItem*)c )->currentItem();
+ if ( withField )
+ PropertyItem::child( 2 )->setValue( listview->propertyEditor()->formWindow()->project()->databaseFieldList( lst[ 0 ], lst[ 1 ] ) );
+ }
+ lst.clear();
+ lst << ( (PropertyListItem*)PropertyItem::child( 0 ) )->currentItem()
+ << ( (PropertyListItem*)PropertyItem::child( 1 ) )->currentItem();
+ if ( withField )
+ lst << ( (PropertyListItem*)PropertyItem::child( 2 ) )->currentItem();
+ setValue( lst );
+ notifyValueChange();
+#else
+ Q_UNUSED( c );
+#endif
+}
+
+// --------------------------------------------------------------
+
+PropertySizePolicyItem::PropertySizePolicyItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ lin = 0;
+}
+
+QLineEdit *PropertySizePolicyItem::lined()
+{
+ if ( lin )
+ return lin;
+ lin = new QLineEdit( listview->viewport() );
+ lin->hide();
+ lin->setReadOnly( TRUE );
+ return lin;
+}
+
+void PropertySizePolicyItem::createChildren()
+{
+ QStringList lst;
+ lst << "Fixed" << "Minimum" << "Maximum" << "Preferred" << "MinimumExpanding" << "Expanding" << "Ignored";
+
+ PropertyItem *i = this;
+ i = new PropertyListItem( listview, i, this, tr( "hSizeType" ), FALSE );
+ i->setValue( lst );
+ addChild( i );
+ i = new PropertyListItem( listview, i, this, tr( "vSizeType" ), FALSE );
+ i->setValue( lst );
+ addChild( i );
+ i = new PropertyIntItem( listview, i, this, tr( "horizontalStretch" ), TRUE );
+ addChild( i );
+ i = new PropertyIntItem( listview, i, this, tr( "verticalStretch" ), TRUE );
+ addChild( i );
+}
+
+void PropertySizePolicyItem::initChildren()
+{
+ PropertyItem *item = 0;
+ QSizePolicy sp = val.toSizePolicy();
+ for ( int i = 0; i < childCount(); ++i ) {
+ item = PropertyItem::child( i );
+ if ( item->name() == tr( "hSizeType" ) )
+ ( (PropertyListItem*)item )->setCurrentItem( size_type_to_int( sp.horData() ) );
+ else if ( item->name() == tr( "vSizeType" ) )
+ ( (PropertyListItem*)item )->setCurrentItem( size_type_to_int( sp.verData() ) );
+ else if ( item->name() == tr( "horizontalStretch" ) )
+ ( (PropertyIntItem*)item )->setValue( sp.horStretch() );
+ else if ( item->name() == tr( "verticalStretch" ) )
+ ( (PropertyIntItem*)item )->setValue( sp.verStretch() );
+ }
+}
+
+PropertySizePolicyItem::~PropertySizePolicyItem()
+{
+ delete (QLineEdit*)lin;
+}
+
+void PropertySizePolicyItem::showEditor()
+{
+ PropertyItem::showEditor();
+ placeEditor( lined() );
+ if ( !lined()->isVisible() || !lined()->hasFocus() ) {
+ lined()->show();
+ listView()->viewport()->setFocus();
+ }
+}
+
+void PropertySizePolicyItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ lined()->hide();
+}
+
+void PropertySizePolicyItem::setValue( const QVariant &v )
+{
+ if ( value() == v )
+ return;
+
+ QString s = tr( "%1/%2/%2/%2" );
+ s = s.arg( size_type_to_string( v.toSizePolicy().horData() ) ).
+ arg( size_type_to_string( v.toSizePolicy().verData() ) ).
+ arg( v.toSizePolicy().horStretch() ).
+ arg( v.toSizePolicy().verStretch() );
+ setText( 1, s );
+ lined()->setText( s );
+ PropertyItem::setValue( v );
+}
+
+void PropertySizePolicyItem::childValueChanged( PropertyItem *child )
+{
+ QSizePolicy sp = val.toSizePolicy();
+ if ( child->name() == tr( "hSizeType" ) )
+ sp.setHorData( int_to_size_type( ( ( PropertyListItem*)child )->currentIntItem() ) );
+ else if ( child->name() == tr( "vSizeType" ) )
+ sp.setVerData( int_to_size_type( ( ( PropertyListItem*)child )->currentIntItem() ) );
+ else if ( child->name() == tr( "horizontalStretch" ) )
+ sp.setHorStretch( ( ( PropertyIntItem*)child )->value().toInt() );
+ else if ( child->name() == tr( "verticalStretch" ) )
+ sp.setVerStretch( ( ( PropertyIntItem*)child )->value().toInt() );
+ setValue( sp );
+ notifyValueChange();
+}
+
+bool PropertySizePolicyItem::hasSubItems() const
+{
+ return TRUE;
+}
+
+// --------------------------------------------------------------
+
+PropertyPaletteItem::PropertyPaletteItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ box = new QHBox( listview->viewport() );
+ box->hide();
+ palettePrev = new QLabel( box );
+ button = new QPushButton( "...", box );
+ setupStyle( button );
+ button->setFixedWidth( 20 );
+ box->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ box->setLineWidth( 2 );
+ palettePrev->setFrameStyle( QFrame::NoFrame );
+ box->installEventFilter( listview );
+ connect( button, SIGNAL( clicked() ),
+ this, SLOT( getPalette() ) );
+}
+PropertyPaletteItem::~PropertyPaletteItem()
+{
+ delete (QHBox*)box;
+}
+
+void PropertyPaletteItem::showEditor()
+{
+ PropertyItem::showEditor();
+ placeEditor( box );
+ if ( !box->isVisible() ) {
+ box->show();
+ listView()->viewport()->setFocus();
+ }
+}
+
+void PropertyPaletteItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ box->hide();
+}
+
+void PropertyPaletteItem::setValue( const QVariant &v )
+{
+ QString s;
+ palettePrev->setPalette( v.toPalette() );
+ PropertyItem::setValue( v );
+ repaint();
+}
+
+void PropertyPaletteItem::getPalette()
+{
+ if ( !listview->propertyEditor()->widget()->isWidgetType() )
+ return;
+ bool ok = FALSE;
+ QWidget *w = (QWidget*)listview->propertyEditor()->widget();
+ if ( ::qt_cast<QScrollView*>(w) )
+ w = ( (QScrollView*)w )->viewport();
+ QPalette pal = PaletteEditor::getPalette( &ok, val.toPalette(),
+#if defined(QT_NON_COMMERCIAL)
+ w->backgroundMode(), listview->topLevelWidget(),
+#else
+ w->backgroundMode(), listview,
+#endif
+ "choose_palette", listview->propertyEditor()->formWindow() );
+ if ( !ok )
+ return;
+ setValue( pal );
+ notifyValueChange();
+}
+
+bool PropertyPaletteItem::hasCustomContents() const
+{
+ return TRUE;
+}
+
+void PropertyPaletteItem::drawCustomContents( QPainter *p, const QRect &r )
+{
+ QPalette pal( value().toPalette() );
+ p->save();
+ p->setClipRect( QRect( QPoint( (int)(p->worldMatrix().dx() + r.x()),
+ (int)(p->worldMatrix().dy() + r.y()) ),
+ r.size() ) );
+ QRect r2( r );
+ r2.setX( r2.x() + 2 );
+ r2.setY( r2.y() + 2 );
+ r2.setWidth( r2.width() - 3 );
+ r2.setHeight( r2.height() - 3 );
+ p->setPen( QPen( black, 1 ) );
+ p->setBrush( pal.active().background() );
+ p->drawRect( r2 );
+ p->restore();
+}
+
+// --------------------------------------------------------------
+
+PropertyCursorItem::PropertyCursorItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ comb = 0;
+}
+
+QComboBox *PropertyCursorItem::combo()
+{
+ if ( comb )
+ return comb;
+ comb = new QComboBox( FALSE, listview->viewport() );
+ comb->hide();
+ QBitmap cur;
+
+ comb->insertItem( QPixmap::fromMimeSource( "designer_arrow.png" ), tr("Arrow"), QObject::ArrowCursor);
+ comb->insertItem( QPixmap::fromMimeSource( "designer_uparrow.png" ), tr("Up-Arrow"), QObject::UpArrowCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_cross.png" ), tr("Cross"), QObject::CrossCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_wait.png" ), tr("Waiting"), QObject::WaitCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_ibeam.png" ), tr("iBeam"), QObject::IbeamCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_sizev.png" ), tr("Size Vertical"), QObject::SizeVerCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_sizeh.png" ), tr("Size Horizontal"), QObject::SizeHorCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_sizef.png" ), tr("Size Slash"), QObject::SizeBDiagCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_sizeb.png" ), tr("Size Backslash"), QObject::SizeFDiagCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_sizeall.png" ), tr("Size All"), QObject::SizeAllCursor );
+ cur = QBitmap( 25, 25, 1 );
+ cur.setMask( cur );
+ comb->insertItem( cur, tr("Blank"), QObject::BlankCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_vsplit.png" ), tr("Split Vertical"), QObject::SplitVCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_hsplit.png" ), tr("Split Horizontal"), QObject::SplitHCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_hand.png" ), tr("Pointing Hand"), QObject::PointingHandCursor );
+ comb->insertItem( QPixmap::fromMimeSource( "designer_no.png" ), tr("Forbidden"), QObject::ForbiddenCursor );
+
+ connect( comb, SIGNAL( activated( int ) ),
+ this, SLOT( setValue() ) );
+ comb->installEventFilter( listview );
+ return comb;
+}
+
+PropertyCursorItem::~PropertyCursorItem()
+{
+ delete (QComboBox*)comb;
+}
+
+void PropertyCursorItem::showEditor()
+{
+ PropertyItem::showEditor();
+ if ( !comb ) {
+ combo()->blockSignals( TRUE );
+ combo()->setCurrentItem( (int)value().toCursor().shape() );
+ combo()->blockSignals( FALSE );
+ }
+ placeEditor( combo() );
+ if ( !combo()->isVisible() || !combo()->hasFocus() ) {
+ combo()->show();
+ setFocus( combo() );
+ }
+}
+
+void PropertyCursorItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ combo()->hide();
+}
+
+void PropertyCursorItem::setValue( const QVariant &v )
+{
+ if ( ( !hasSubItems() || !isOpen() )
+ && value() == v )
+ return;
+
+ combo()->blockSignals( TRUE );
+ combo()->setCurrentItem( (int)v.toCursor().shape() );
+ combo()->blockSignals( FALSE );
+ setText( 1, combo()->currentText() );
+ PropertyItem::setValue( v );
+}
+
+void PropertyCursorItem::setValue()
+{
+ if ( !comb )
+ return;
+ if ( QVariant( QCursor( combo()->currentItem() ) ) == val )
+ return;
+ setText( 1, combo()->currentText() );
+ PropertyItem::setValue( QCursor( combo()->currentItem() ) );
+ notifyValueChange();
+}
+
+// --------------------------------------------------------------
+
+PropertyKeysequenceItem::PropertyKeysequenceItem( PropertyList *l,
+ PropertyItem *after,
+ PropertyItem *prop,
+ const QString &propName )
+ : PropertyItem( l, after, prop, propName ),
+ k1( 0 ), k2( 0 ), k3( 0 ), k4( 0 ), num( 0 ), mouseEnter( FALSE )
+{
+ box = new QHBox( listview->viewport() );
+ box->hide();
+ sequence = new QLineEdit( box );
+ connect( sequence, SIGNAL(textChanged( const QString & )),
+ this, SLOT(setValue()) );
+ sequence->installEventFilter( this );
+}
+
+PropertyKeysequenceItem::~PropertyKeysequenceItem()
+{
+ delete (QHBox*)box;
+}
+
+void PropertyKeysequenceItem::showEditor()
+{
+ PropertyItem::showEditor();
+ placeEditor( box );
+ if ( !box->isVisible() ) {
+ box->show();
+ sequence->setFocus();
+ }
+}
+
+void PropertyKeysequenceItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ box->hide();
+}
+
+bool PropertyKeysequenceItem::eventFilter( QObject *o, QEvent *e )
+{
+ Q_UNUSED( o );
+ if ( e->type() == QEvent::KeyPress ) {
+ QKeyEvent *k = (QKeyEvent *)e;
+ if ( !mouseEnter &&
+ (k->key() == QObject::Key_Up ||
+ k->key() == QObject::Key_Down) )
+ return FALSE;
+ handleKeyEvent( k );
+ return TRUE;
+ } else if ( (e->type() == QEvent::FocusIn) ||
+ (e->type() == QEvent::MouseButtonPress) ) {
+ mouseEnter = ( listview->lastEvent() == PropertyList::MouseEvent ) ||
+ (e->type() == QEvent::MouseButtonPress);
+ return TRUE;
+ }
+
+ // Lets eat accelerators now..
+ if ( e->type() == QEvent::Accel ||
+ e->type() == QEvent::AccelOverride ||
+ e->type() == QEvent::KeyRelease )
+ return TRUE;
+ return FALSE;
+}
+
+void PropertyKeysequenceItem::handleKeyEvent( QKeyEvent *e )
+{
+ int nextKey = e->key();
+
+ if ( num > 3 ||
+ nextKey == QObject::Key_Control ||
+ nextKey == QObject::Key_Shift ||
+ nextKey == QObject::Key_Meta ||
+ nextKey == QObject::Key_Alt)
+ return;
+
+ int modifier = translateModifiers( e->state() );
+ if (nextKey == QObject::Key_BackTab)
+ modifier &= ~QObject::SHIFT;
+
+ nextKey |= modifier;
+ switch( num ) {
+ case 0:
+ k1 = nextKey;
+ break;
+ case 1:
+ k2 = nextKey;
+ break;
+ case 2:
+ k3 = nextKey;
+ break;
+ case 3:
+ k4 = nextKey;
+ break;
+ default:
+ break;
+ }
+ num++;
+ QKeySequence ks( k1, k2, k3, k4 );
+ sequence->setText( ks );
+}
+
+int PropertyKeysequenceItem::translateModifiers( int state )
+{
+ int result = 0;
+ if ( state & QObject::ShiftButton )
+ result |= QObject::SHIFT;
+ if ( state & QObject::ControlButton )
+ result |= QObject::CTRL;
+ if ( state & QObject::MetaButton )
+ result |= QObject::META;
+ if ( state & QObject::AltButton )
+ result |= QObject::ALT;
+ return result;
+}
+
+void PropertyKeysequenceItem::setValue()
+{
+ QVariant v;
+ v = QVariant( QKeySequence(sequence->text()) );
+ if ( v.toString().isNull() )
+ return;
+ setText( 1, sequence->text() );
+ PropertyItem::setValue( v );
+ if (sequence->hasFocus()
+ // if the user wants to use F1 as accelerator, Designer will pop up a QWhatsThat widget
+ || (qApp->focusWidget() && qApp->focusWidget()->inherits("QWhatsThat")))
+ notifyValueChange();
+ setChanged( TRUE );
+}
+
+void PropertyKeysequenceItem::setValue( const QVariant &v )
+{
+ QKeySequence ks = v.toKeySequence();
+ if ( sequence ) {
+ sequence->setText( ks );
+ }
+ num = ks.count();
+ k1 = ks[0];
+ k2 = ks[1];
+ k3 = ks[2];
+ k4 = ks[3];
+ setText( 1, ks );
+ PropertyItem::setValue( v );
+}
+
+// --------------------------------------------------------------
+
+EnumPopup::EnumPopup( QWidget *parent, const char *name, WFlags f )
+ : QFrame( parent, name, f )
+{
+ setLineWidth( 1 );
+ setFrameStyle( Panel | Plain );
+ setPaletteBackgroundColor( Qt::white );
+ popLayout = new QVBoxLayout( this, 3 );
+ checkBoxList.setAutoDelete( TRUE );
+}
+
+EnumPopup::~EnumPopup()
+{
+}
+
+void EnumPopup::insertEnums( QValueList<EnumItem> lst )
+{
+ while ( checkBoxList.count() )
+ checkBoxList.removeFirst();
+
+ itemList = lst;
+ QCheckBox *cb;
+ QValueListConstIterator<EnumItem> it = itemList.begin();
+ for ( ; it != itemList.end(); ++it ) {
+ cb = new QCheckBox( this );
+ cb->setText( (*it).key );
+ cb->setChecked( (*it).selected );
+ if ( it == itemList.begin() )
+ cb->setFocus();
+ checkBoxList.append( cb );
+ cb->resize( width(), cb->height() );
+ popLayout->addWidget( cb );
+ }
+}
+
+void EnumPopup::keyPressEvent( QKeyEvent *e )
+{
+ if ( e->key() == Key_Escape ) {
+ hide();
+ emit hidden();
+ } else if ( e->key() == Key_Enter || e->key() == Key_Return ) {
+ closeWidget();
+ }
+}
+
+void EnumPopup::closeWidget()
+{
+ QPtrListIterator<QCheckBox> it( checkBoxList );
+ int i = 0;
+ while ( it.current() != 0 ) {
+ itemList[i].selected = (*it)->isChecked();
+ ++it;
+ ++i;
+ }
+ close();
+ emit closed();
+}
+
+QValueList<EnumItem> EnumPopup::enumList() const
+{
+ return itemList;
+}
+
+EnumBox::EnumBox( QWidget *parent, const char *name )
+ : QComboBox( parent, name )
+{
+ pop = new EnumPopup( this, "popup", QObject::WType_Popup );
+ connect( pop, SIGNAL( hidden() ), this, SLOT( popupHidden() ) );
+ connect( pop, SIGNAL( closed() ), this, SLOT( popupClosed() ) );
+ popupShown = FALSE;
+ arrowDown = FALSE;
+}
+
+void EnumBox::popupHidden()
+{
+ popupShown = FALSE;
+}
+
+void EnumBox::popupClosed()
+{
+ popupShown = FALSE;
+ emit valueChanged();
+}
+
+void EnumBox::paintEvent( QPaintEvent * )
+{
+ QPainter p( this );
+ const QColorGroup & g = colorGroup();
+ p.setPen(g.text());
+
+ QStyle::SFlags flags = QStyle::Style_Default;
+ if (isEnabled())
+ flags |= QStyle::Style_Enabled;
+ if (hasFocus())
+ flags |= QStyle::Style_HasFocus;
+
+ if ( width() < 5 || height() < 5 ) {
+ qDrawShadePanel( &p, rect().x(), rect().y(), rect().width(), rect().height(), g, FALSE, 2,
+ &g.brush( QColorGroup::Button ) );
+ return;
+ }
+ style().drawComplexControl( QStyle::CC_ComboBox, &p, this, rect(), g,
+ flags, QStyle::SC_All,
+ (arrowDown ?
+ QStyle::SC_ComboBoxArrow :
+ QStyle::SC_None ));
+
+ QRect re = style().querySubControlMetrics( QStyle::CC_ComboBox, this,
+ QStyle::SC_ComboBoxEditField );
+ re = QStyle::visualRect(re, this);
+ p.setClipRect( re );
+
+ if ( !str.isNull() ) {
+ p.save();
+ p.setFont(font());
+ QFontMetrics fm(font());
+ int x = re.x(), y = re.y() + fm.ascent();
+ p.drawText( x, y, str );
+ p.restore();
+ }
+}
+
+void EnumBox::insertEnums( QValueList<EnumItem> lst )
+{
+ pop->insertEnums( lst );
+}
+
+QValueList<EnumItem> EnumBox::enumList() const
+{
+ return pop->enumList();
+}
+
+void EnumBox::popup()
+{
+ if ( popupShown ) {
+ pop->closeWidget();
+ popupShown = FALSE;
+ return;
+ }
+ pop->move( ((QWidget*)parent())->mapToGlobal( geometry().bottomLeft() ) );
+ pop->setMinimumWidth( width() );
+ emit aboutToShowPopup();
+ pop->show();
+ popupShown = TRUE;
+}
+
+void EnumBox::mousePressEvent( QMouseEvent *e )
+{
+ if ( e->button() != LeftButton )
+ return;
+
+ QRect arrowRect = style().querySubControlMetrics( QStyle::CC_ComboBox, this,
+ QStyle::SC_ComboBoxArrow);
+ arrowRect = QStyle::visualRect(arrowRect, this);
+
+ arrowRect.setHeight( QMAX( height() - (2 * arrowRect.y()), arrowRect.height() ) );
+
+ if ( arrowRect.contains( e->pos() ) ) {
+ arrowDown = TRUE;
+ repaint( FALSE );
+ }
+
+ popup();
+ QTimer::singleShot( 100, this, SLOT( restoreArrow() ) );
+}
+
+void EnumBox::keyPressEvent( QKeyEvent *e )
+{
+ if ( e->key() == Key_Space ) {
+ popup();
+ QTimer::singleShot( 100, this, SLOT( restoreArrow() ) );
+ } else if ( e->key() == Key_Enter || e->key() == Key_Return ) {
+ popup();
+ }
+}
+
+void EnumBox::restoreArrow()
+{
+ arrowDown = FALSE;
+ repaint( FALSE );
+}
+
+void EnumBox::setText( const QString &text )
+{
+ str = text;
+ repaint( FALSE );
+}
+
+
+
+PropertyEnumItem::PropertyEnumItem( PropertyList *l,
+ PropertyItem *after,
+ PropertyItem *prop,
+ const QString &propName )
+ : PropertyItem( l, after, prop, propName )
+{
+ box = new EnumBox( listview->viewport() );
+ box->hide();
+ box->installEventFilter( listview );
+ connect( box, SIGNAL( aboutToShowPopup() ), this, SLOT( insertEnums() ) );
+ connect( box, SIGNAL( valueChanged() ), this, SLOT( setValue() ) );
+}
+
+PropertyEnumItem::~PropertyEnumItem()
+{
+ delete (EnumBox*)box;
+}
+
+void PropertyEnumItem::showEditor()
+{
+ PropertyItem::showEditor();
+ placeEditor( box );
+ if ( !box->isVisible() ) {
+ box->show();
+ box->setText( enumString );
+ listView()->viewport()->setFocus();
+ }
+ box->setFocus();
+}
+
+void PropertyEnumItem::hideEditor()
+{
+ PropertyItem::hideEditor();
+ box->hide();
+}
+
+void PropertyEnumItem::setValue( const QVariant &v )
+{
+ enumString = "";
+ enumList.clear();
+ QStringList lst = v.toStringList();
+ QValueListConstIterator<QString> it = lst.begin();
+ for ( ; it != lst.end(); ++it )
+ enumList.append( EnumItem( *it, FALSE ) );
+ enumList.first().selected = TRUE;
+ enumString = enumList.first().key;
+ box->setText( enumString );
+ setText( 1, enumString );
+ PropertyItem::setValue( v );
+}
+
+void PropertyEnumItem::insertEnums()
+{
+ box->insertEnums( enumList );
+}
+
+void PropertyEnumItem::setValue()
+{
+ enumList = box->enumList();
+ enumString = "";
+ QValueListConstIterator<EnumItem> it = enumList.begin();
+ for ( ; it != enumList.end(); ++it ) {
+ if ( (*it).selected )
+ enumString += "|" + (*it).key;
+ }
+ if ( !enumString.isEmpty() )
+ enumString.replace( 0, 1, "" );
+
+ box->setText( enumString );
+ setText( 1, enumString );
+ notifyValueChange();
+}
+
+void PropertyEnumItem::setCurrentValues( QStrList lst )
+{
+ enumString ="";
+ QStrList::ConstIterator it = lst.begin();
+ QValueList<EnumItem>::Iterator eit = enumList.begin();
+ for ( ; eit != enumList.end(); ++eit ) {
+ (*eit).selected = FALSE;
+ for ( it = lst.begin(); it != lst.end(); ++it ) {
+ if ( QString( *it ) == (*eit).key ) {
+ (*eit).selected = TRUE;
+ enumString += "|" + (*eit).key;
+ break;
+ }
+ }
+ }
+ if ( !enumString.isEmpty() )
+ enumString.replace( 0, 1, "" );
+ box->setText( enumString );
+ setText( 1, enumString );
+}
+
+QString PropertyEnumItem::currentItem() const
+{
+ return enumString;
+}
+
+QString PropertyEnumItem::currentItemFromObject() const
+{
+ return enumString;
+}
+
+// --------------------------------------------------------------
+
+/*!
+ \class PropertyList propertyeditor.h
+ \brief PropertyList is a QListView derived class which is used for editing widget properties
+
+ This class is used for widget properties. It has to be child of a
+ PropertyEditor.
+
+ To initialize it for editing a widget call setupProperties() which
+ iterates through the properties of the current widget (see
+ PropertyEditor::widget()) and builds the list.
+
+ To update the item values, refetchData() can be called.
+
+ If the value of an item has been changed by the user, and this
+ change should be applied to the widget's property, valueChanged()
+ has to be called.
+
+ To set the value of an item, setPropertyValue() has to be called.
+*/
+
+PropertyList::PropertyList( PropertyEditor *e )
+ : QListView( e ), editor( e )
+{
+ init_colors();
+
+ whatsThis = new PropertyWhatsThis( this );
+ showSorted = FALSE;
+ header()->setMovingEnabled( FALSE );
+ header()->setStretchEnabled( TRUE );
+ setResizePolicy( QScrollView::Manual );
+ viewport()->setAcceptDrops( TRUE );
+ viewport()->installEventFilter( this );
+ addColumn( tr( "Property" ) );
+ addColumn( tr( "Value" ) );
+ connect( header(), SIGNAL( sizeChange( int, int, int ) ),
+ this, SLOT( updateEditorSize() ) );
+ disconnect( header(), SIGNAL( sectionClicked( int ) ),
+ this, SLOT( changeSortColumn( int ) ) );
+ connect( header(), SIGNAL( sectionClicked( int ) ),
+ this, SLOT( toggleSort() ) );
+ connect( this, SIGNAL( pressed( QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( itemPressed( QListViewItem *, const QPoint &, int ) ) );
+ connect( this, SIGNAL( doubleClicked( QListViewItem * ) ),
+ this, SLOT( toggleOpen( QListViewItem * ) ) );
+ setSorting( -1 );
+ setHScrollBarMode( AlwaysOff );
+ setVScrollBarMode( AlwaysOn );
+ setColumnWidthMode( 1, Manual );
+ mousePressed = FALSE;
+ pressItem = 0;
+ theLastEvent = MouseEvent;
+ header()->installEventFilter( this );
+}
+
+void PropertyList::toggleSort()
+{
+ showSorted = !showSorted;
+ editor->clear();
+ editor->setup();
+}
+
+void PropertyList::resizeEvent( QResizeEvent *e )
+{
+ QListView::resizeEvent( e );
+ if ( currentItem() )
+ ( ( PropertyItem* )currentItem() )->showEditor();
+}
+
+static QVariant::Type type_to_variant( const QString &s )
+{
+ if ( s == "Invalid " )
+ return QVariant::Invalid;
+ if ( s == "Map" )
+ return QVariant::Map;
+ if ( s == "List" )
+ return QVariant::List;
+ if ( s == "String" )
+ return QVariant::String;
+ if ( s == "StringList" )
+ return QVariant::StringList;
+ if ( s == "Font" )
+ return QVariant::Font;
+ if ( s == "Pixmap" )
+ return QVariant::Pixmap;
+ if ( s == "Brush" )
+ return QVariant::Brush;
+ if ( s == "Rect" )
+ return QVariant::Rect;
+ if ( s == "Size" )
+ return QVariant::Size;
+ if ( s == "Color" )
+ return QVariant::Color;
+ if ( s == "Palette" )
+ return QVariant::Palette;
+ if ( s == "ColorGroup" )
+ return QVariant::ColorGroup;
+ if ( s == "IconSet" )
+ return QVariant::IconSet;
+ if ( s == "Point" )
+ return QVariant::Point;
+ if ( s == "Image" )
+ return QVariant::Image;
+ if ( s == "Int" )
+ return QVariant::Int;
+ if ( s == "UInt" )
+ return QVariant::UInt;
+ if ( s == "Bool" )
+ return QVariant::Bool;
+ if ( s == "Double" )
+ return QVariant::Double;
+ if ( s == "CString" )
+ return QVariant::CString;
+ if ( s == "PointArray" )
+ return QVariant::PointArray;
+ if ( s == "Region" )
+ return QVariant::Region;
+ if ( s == "Bitmap" )
+ return QVariant::Bitmap;
+ if ( s == "Cursor" )
+ return QVariant::Cursor;
+ if ( s == "SizePolicy" )
+ return QVariant::SizePolicy;
+ if ( s == "Date" )
+ return QVariant::Date;
+ if ( s == "Time" )
+ return QVariant::Time;
+ if ( s == "DateTime" )
+ return QVariant::DateTime;
+ return QVariant::Invalid;
+}
+
+#ifndef QT_NO_SQL
+static bool parent_is_data_aware( QWidget *w )
+{
+ QWidget *p = w ? w->parentWidget() : 0;
+ while ( p && !p->isTopLevel() ) {
+ if ( ::qt_cast<QDesignerDataBrowser*>(p) || ::qt_cast<QDesignerDataView*>(p) )
+ return TRUE;
+ p = p->parentWidget();
+ }
+ return FALSE;
+}
+#endif
+
+/*! Sets up the property list by adding an item for each designable
+property of the widget which is just edited.
+*/
+
+void PropertyList::setupProperties()
+{
+ if ( !editor->widget() )
+ return;
+ bool allProperties = !::qt_cast<Spacer*>(editor->widget());
+ QStrList lst = editor->widget()->metaObject()->propertyNames( allProperties );
+ PropertyItem *item = 0;
+ QMap<QString, bool> unique;
+ QObject *w = editor->widget();
+ QStringList valueSet;
+ bool parentHasLayout =
+ w->isWidgetType() &&
+ !editor->formWindow()->isMainContainer( (QWidget*)w ) && ( (QWidget*)w )->parentWidget() &&
+ WidgetFactory::layoutType( ( (QWidget*)w )->parentWidget() ) != WidgetFactory::NoLayout;
+ for ( QPtrListIterator<char> it( lst ); it.current(); ++it ) {
+ const QMetaProperty* p =
+ editor->widget()->metaObject()->
+ property( editor->widget()->metaObject()->findProperty( it.current(), allProperties), allProperties );
+ if ( !p )
+ continue;
+ if ( unique.contains( QString::fromLatin1( it.current() ) ) )
+ continue;
+ if ( ::qt_cast<QDesignerToolBar*>(editor->widget()) ||
+ ::qt_cast<MenuBarEditor*>(editor->widget()) ) {
+ if ( qstrcmp( p->name(), "minimumHeight" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "minimumWidth" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "maximumHeight" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "maximumWidth" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "geometry" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "sizePolicy" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "minimumSize" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "maximumSize" ) == 0 )
+ continue;
+ }
+ unique.insert( QString::fromLatin1( it.current() ), TRUE );
+ if ( editor->widget()->isWidgetType() &&
+ editor->formWindow()->isMainContainer( (QWidget*)editor->widget() ) ) {
+ if ( qstrcmp( p->name(), "geometry" ) == 0 )
+ continue;
+ } else { // hide some toplevel-only stuff
+ if ( qstrcmp( p->name(), "icon" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "iconText" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "caption" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "sizeIncrement" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "baseSize" ) == 0 )
+ continue;
+ if ( parentHasLayout && qstrcmp( p->name(), "geometry" ) == 0 )
+ continue;
+ if ( ::qt_cast<QLayoutWidget*>(w) || ::qt_cast<Spacer*>(w) ) {
+ if ( qstrcmp( p->name(), "sizePolicy" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "minimumHeight" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "minimumWidth" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "maximumHeight" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "maximumWidth" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "geometry" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "minimumSize" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "maximumSize" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "enabled" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "paletteForegroundColor" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "paletteBackgroundColor" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "paletteBackgroundPixmap" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "palette" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "font" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "cursor" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "mouseTracking" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "focusPolicy" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "acceptDrops" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "autoMask" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "backgroundOrigin" ) == 0 )
+ continue;
+ }
+ }
+ if ( ::qt_cast<QActionGroup*>(w) ) {
+ if ( qstrcmp( p->name(), "usesDropDown" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "toggleAction" ) == 0 )
+ continue;
+ }
+ if ( qstrcmp( p->name(), "minimumHeight" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "minimumWidth" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "maximumHeight" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "maximumWidth" ) == 0 )
+ continue;
+ if ( qstrcmp( p->name(), "buttonGroupId" ) == 0 ) { // #### remove this when designable in Q_PROPERTY can take a function (isInButtonGroup() in this case)
+ if ( !editor->widget()->isWidgetType() ||
+ !editor->widget()->parent() ||
+ !::qt_cast<QButtonGroup*>(editor->widget()->parent()) )
+ continue;
+ }
+
+ bool isPropertyObject = w->isA( "PropertyObject" );
+
+ if ( ( p->designable(w) ||
+ isPropertyObject && p->designable( ( (PropertyObject*)w )->widgetList().first() ) ) &&
+ ( !isPropertyObject || qstrcmp( p->name(), "name" ) != 0 ) ) {
+ if ( p->isSetType() ) {
+ if ( QString( p->name() ) == "alignment" ) {
+ QStringList lst;
+ lst << p->valueToKey( AlignAuto )
+ << p->valueToKey( AlignLeft )
+ << p->valueToKey( AlignHCenter )
+ << p->valueToKey( AlignRight )
+ << p->valueToKey( AlignJustify );
+ item = new PropertyListItem( this, item, 0, "hAlign", FALSE );
+ item->setValue( lst );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), "hAlign" ) )
+ item->setChanged( TRUE, FALSE );
+ if ( !::qt_cast<QMultiLineEdit*>(editor->widget()) ) {
+ lst.clear();
+ lst << p->valueToKey( AlignTop )
+ << p->valueToKey( AlignVCenter )
+ << p->valueToKey( AlignBottom );
+ item = new PropertyListItem( this, item, 0, "vAlign", FALSE );
+ item->setValue( lst );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), "vAlign" ) )
+ item->setChanged( TRUE, FALSE );
+ item = new PropertyBoolItem( this, item, 0, "wordwrap" );
+ if ( ::qt_cast<QGroupBox*>(w) )
+ item->setVisible( FALSE );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), "wordwrap" ) )
+ item->setChanged( TRUE, FALSE );
+ }
+ } else {
+ QStrList lst( p->enumKeys() );
+ QStringList l;
+ QPtrListIterator<char> it( lst );
+ while ( it.current() != 0 ) {
+ l << QString(*it);
+ ++it;
+ }
+ item = new PropertyEnumItem( this, item, 0, p->name() );
+ item->setValue( l );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), p->name() ) )
+ item->setChanged( TRUE, FALSE );
+ }
+ } else if ( p->isEnumType() ) {
+ QStrList l = p->enumKeys();
+ QStringList lst;
+ for ( uint i = 0; i < l.count(); ++i ) {
+ QString k = l.at( i );
+ // filter out enum-masks
+ if ( k[0] == 'M' && k[1].category() == QChar::Letter_Uppercase )
+ continue;
+ lst << k;
+ }
+ item = new PropertyListItem( this, item, 0, p->name(), FALSE );
+ item->setValue( lst );
+ } else {
+ QVariant::Type t = QVariant::nameToType( p->type() );
+ if ( !addPropertyItem( item, p->name(), t ) )
+ continue;
+ }
+ }
+ if ( item && !p->isSetType() ) {
+ if ( valueSet.findIndex( item->name() ) == -1 ) {
+ setPropertyValue( item );
+ valueSet << item->name();
+ }
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), p->name() ) )
+ item->setChanged( TRUE, FALSE );
+ }
+ }
+
+ if ( !::qt_cast<QSplitter*>(w) && !::qt_cast<MenuBarEditor*>(w) && !::qt_cast<QDesignerToolBar*>(w) &&
+ w->isWidgetType() && WidgetFactory::layoutType( (QWidget*)w ) != WidgetFactory::NoLayout ) {
+ item = new PropertyLayoutItem( this, item, 0, "layoutSpacing" );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), "layoutSpacing" )
+ || MetaDataBase::spacing( editor->widget() ) != -1 )
+ layoutInitValue( item, TRUE );
+ else
+ layoutInitValue( item );
+ item = new PropertyLayoutItem( this, item, 0, "layoutMargin" );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), "layoutMargin" )
+ || MetaDataBase::margin( editor->widget() ) != -1 )
+ layoutInitValue( item, TRUE );
+ else
+ layoutInitValue( item );
+ QWidget *widget = (QWidget*)w;
+ if ( ( !::qt_cast<QLayoutWidget*>(widget) &&
+ widget->parentWidget() && ::qt_cast<FormWindow*>(widget->parentWidget()) ) ) {
+ item = new PropertyListItem( this, item, 0, "resizeMode", FALSE );
+ QStringList lst;
+ lst << "Auto" << "FreeResize" << "Minimum" << "Fixed";
+ item->setValue( lst );
+ setPropertyValue( item );
+ QString resizeMod = MetaDataBase::resizeMode( editor->widget() );
+ if ( !resizeMod.isEmpty() &&
+ resizeMod != WidgetFactory::defaultCurrentItem( editor->widget(), "resizeMode" ) ) {
+ item->setChanged( TRUE, FALSE );
+ MetaDataBase::setPropertyChanged( editor->widget(), "resizeMode", TRUE );
+ }
+ }
+ }
+
+ if ( !::qt_cast<Spacer*>(w) && !::qt_cast<QLayoutWidget*>(w) &&
+ !::qt_cast<MenuBarEditor*>(w) && !::qt_cast<QDesignerToolBar*>(w) ) {
+ item = new PropertyTextItem( this, item, 0, "toolTip", TRUE, FALSE );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), "toolTip" ) )
+ item->setChanged( TRUE, FALSE );
+ item = new PropertyTextItem( this, item, 0, "whatsThis", TRUE, TRUE );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), "whatsThis" ) )
+ item->setChanged( TRUE, FALSE );
+ }
+
+#ifndef QT_NO_SQL
+ if ( !::qt_cast<QDataTable*>(editor->widget()) && !::qt_cast<QDataBrowser*>(editor->widget()) &&
+ !::qt_cast<QDataView*>(editor->widget()) && parent_is_data_aware( ::qt_cast<QWidget*>(editor->widget()) ) ) {
+ item = new PropertyDatabaseItem( this, item, 0, "database", editor->formWindow()->mainContainer() != w );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), "database" ) )
+ item->setChanged( TRUE, FALSE );
+ }
+
+ if ( ::qt_cast<QDataTable*>(editor->widget()) || ::qt_cast<QDataBrowser*>(editor->widget()) ||
+ ::qt_cast<QDataView*>(editor->widget()) ) {
+ item = new PropertyDatabaseItem( this, item, 0, "database", FALSE );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), "database" ) )
+ item->setChanged( TRUE, FALSE );
+ item = new PropertyBoolItem( this, item, 0, "frameworkCode" );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), "frameworkCode" ) )
+ item->setChanged( TRUE, FALSE );
+ }
+#endif
+
+ if ( w->isA("PropertyObject") ) {
+ const QWidgetList wl = ( (PropertyObject*)w )->widgetList();
+ QPtrListIterator<QWidget> wIt( wl );
+ while ( *wIt ) {
+ if ( (*wIt)->inherits("CustomWidget") ) {
+ MetaDataBase::CustomWidget *cw = ( (CustomWidget*)*wIt )->customWidget();
+ setupCusWidgetProperties( cw, unique, item );
+ }
+ ++wIt;
+ }
+ } else if ( w->inherits( "CustomWidget" ) ) {
+ MetaDataBase::CustomWidget *cw = ( (CustomWidget*)w )->customWidget();
+ setupCusWidgetProperties( cw, unique, item );
+ }
+
+ setCurrentItem( firstChild() );
+
+ if ( showSorted ) {
+ setSorting( 0 );
+ sort();
+ setSorting( -1 );
+ setCurrentItem( firstChild() );
+ qApp->processEvents();
+ }
+
+ updateEditorSize();
+}
+
+void PropertyList::setupCusWidgetProperties( MetaDataBase::CustomWidget *cw,
+ QMap<QString, bool> &unique,
+ PropertyItem *&item )
+{
+ if ( !cw )
+ return;
+
+ for ( QValueList<MetaDataBase::Property>::Iterator it =
+ cw->lstProperties.begin(); it != cw->lstProperties.end(); ++it ) {
+ if ( unique.contains( QString( (*it).property ) ) )
+ continue;
+ unique.insert( QString( (*it).property ), TRUE );
+ addPropertyItem( item, (*it).property, type_to_variant( (*it).type ) );
+ setPropertyValue( item );
+ if ( MetaDataBase::isPropertyChanged( editor->widget(), (*it).property ) )
+ item->setChanged( TRUE, FALSE );
+ }
+}
+
+bool PropertyList::addPropertyItem( PropertyItem *&item, const QCString &name, QVariant::Type t )
+{
+ if ( name == "buddy" ) {
+ PropertyListItem *itm = new PropertyListItem( this, item, 0, name, TRUE );
+ QPtrDict<QWidget> *widgets = editor->formWindow()->widgets();
+ QPtrDictIterator<QWidget> it( *widgets );
+ QStringList l;
+ l << "";
+ while ( it.current() ) {
+ if ( editor->formWindow()->canBeBuddy( it.current() ) ) {
+ if ( l.find( it.current()->name() ) == l.end() )
+ l << it.current()->name();
+ }
+ ++it;
+ }
+ l.sort();
+ itm->setValue( l );
+ item = itm;
+ return TRUE;
+ }
+
+ switch ( t ) {
+ case QVariant::String:
+ item = new PropertyTextItem( this, item, 0, name, TRUE,
+ ::qt_cast<QLabel*>(editor->widget()) ||
+ ::qt_cast<QTextView*>(editor->widget()) ||
+ ::qt_cast<QButton*>(editor->widget()) );
+ break;
+ case QVariant::CString:
+ item = new PropertyTextItem( this, item, 0,
+ name, name == "name" &&
+ editor->widget() == editor->formWindow()->mainContainer(),
+ FALSE, TRUE );
+ break;
+ case QVariant::Bool:
+ item = new PropertyBoolItem( this, item, 0, name );
+ break;
+ case QVariant::Font:
+ item = new PropertyFontItem( this, item, 0, name );
+ break;
+ case QVariant::Int:
+ if ( name == "accel" )
+ item = new PropertyTextItem( this, item, 0, name, FALSE, FALSE, FALSE, TRUE );
+ else if ( name == "layoutSpacing" || name == "layoutMargin" )
+ item = new PropertyLayoutItem( this, item, 0, name );
+ else if ( name == "resizeMode" )
+ item = new PropertyListItem( this, item, 0, name, TRUE );
+ else
+ item = new PropertyIntItem( this, item, 0, name, TRUE );
+ break;
+ case QVariant::Double:
+ item = new PropertyDoubleItem( this, item, 0, name );
+ break;
+ case QVariant::KeySequence:
+ item = new PropertyKeysequenceItem( this, item, 0, name );
+ break;
+ case QVariant::UInt:
+ item = new PropertyIntItem( this, item, 0, name, FALSE );
+ break;
+ case QVariant::StringList:
+ item = new PropertyListItem( this, item, 0, name, TRUE );
+ break;
+ case QVariant::Rect:
+ item = new PropertyCoordItem( this, item, 0, name, PropertyCoordItem::Rect );
+ break;
+ case QVariant::Point:
+ item = new PropertyCoordItem( this, item, 0, name, PropertyCoordItem::Point );
+ break;
+ case QVariant::Size:
+ item = new PropertyCoordItem( this, item, 0, name, PropertyCoordItem::Size );
+ break;
+ case QVariant::Color:
+ item = new PropertyColorItem( this, item, 0, name, TRUE );
+ break;
+ case QVariant::Pixmap:
+ item = new PropertyPixmapItem( this, item, 0, name, PropertyPixmapItem::Pixmap );
+ break;
+ case QVariant::IconSet:
+ item = new PropertyPixmapItem( this, item, 0, name, PropertyPixmapItem::IconSet );
+ break;
+ case QVariant::Image:
+ item = new PropertyPixmapItem( this, item, 0, name, PropertyPixmapItem::Image );
+ break;
+ case QVariant::SizePolicy:
+ item = new PropertySizePolicyItem( this, item, 0, name );
+ break;
+ case QVariant::Palette:
+ item = new PropertyPaletteItem( this, item, 0, name );
+ break;
+ case QVariant::Cursor:
+ item = new PropertyCursorItem( this, item, 0, name );
+ break;
+ case QVariant::Date:
+ item = new PropertyDateItem( this, item, 0, name );
+ break;
+ case QVariant::Time:
+ item = new PropertyTimeItem( this, item, 0, name );
+ break;
+ case QVariant::DateTime:
+ item = new PropertyDateTimeItem( this, item, 0, name );
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void PropertyList::paintEmptyArea( QPainter *p, const QRect &r )
+{
+ p->fillRect( r, *backColor2 );
+}
+
+void PropertyList::setCurrentItem( QListViewItem *i )
+{
+ if ( !i )
+ return;
+
+ if ( currentItem() )
+ ( (PropertyItem*)currentItem() )->hideEditor();
+ QListView::setCurrentItem( i );
+ ( (PropertyItem*)currentItem() )->showEditor();
+}
+
+void PropertyList::updateEditorSize()
+{
+ if ( currentItem() )
+ ( ( PropertyItem* )currentItem() )->showEditor();
+}
+
+/*! This has to be called if the value if \a i should be set as
+ property to the currently edited widget.
+*/
+
+void PropertyList::valueChanged( PropertyItem *i )
+{
+ if ( !editor->widget() )
+ return;
+ QString pn( tr( "Set '%1' of '%2'" ).arg( i->name() ).arg( editor->widget()->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, editor->formWindow(),
+ editor->widget(), editor,
+ i->name(), WidgetFactory::property( editor->widget(), i->name() ),
+ i->value(), i->currentItem(), i->currentItemFromObject() );
+
+ cmd->execute();
+ editor->formWindow()->commandHistory()->addCommand( cmd, TRUE );
+}
+
+void PropertyList::layoutInitValue( PropertyItem *i, bool changed )
+{
+ if ( !editor->widget() )
+ return;
+ QString pn( tr( "Set '%1' of '%2'" ).arg( i->name() ).arg( editor->widget()->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, editor->formWindow(),
+ editor->widget(), editor,
+ i->name(), WidgetFactory::property( editor->widget(), i->name() ),
+ i->value(), i->currentItem(), i->currentItemFromObject() );
+ cmd->execute();
+ if ( i->value().toString() != "-1" )
+ changed = TRUE;
+ i->setChanged( changed );
+}
+
+void PropertyList::itemPressed( QListViewItem *i, const QPoint &p, int c )
+{
+ if ( !i )
+ return;
+ PropertyItem *pi = (PropertyItem*)i;
+ if ( !pi->hasSubItems() )
+ return;
+
+ if ( c == 0 && viewport()->mapFromGlobal( p ).x() < 20 )
+ toggleOpen( i );
+}
+
+void PropertyList::toggleOpen( QListViewItem *i )
+{
+ if ( !i )
+ return;
+ PropertyItem *pi = (PropertyItem*)i;
+ if ( pi->hasSubItems() ) {
+ pi->setOpen( !pi->isOpen() );
+ } else {
+ pi->toggle();
+ }
+}
+
+bool PropertyList::eventFilter( QObject *o, QEvent *e )
+{
+ if ( !o || !e )
+ return TRUE;
+
+ PropertyItem *i = (PropertyItem*)currentItem();
+ if ( e->type() == QEvent::KeyPress )
+ theLastEvent = KeyEvent;
+ else if ( e->type() == QEvent::MouseButtonPress )
+ theLastEvent = MouseEvent;
+
+ if ( o != this &&e->type() == QEvent::KeyPress ) {
+ QKeyEvent *ke = (QKeyEvent*)e;
+ if ( ( ke->key() == Key_Up || ke->key() == Key_Down ) &&
+ ( o != this || o != viewport() ) &&
+ !( ke->state() & ControlButton ) ) {
+ QApplication::sendEvent( this, (QKeyEvent*)e );
+ return TRUE;
+ } else if ( ( !::qt_cast<QLineEdit*>(o) ||
+ ( ::qt_cast<QLineEdit*>(o) && ( (QLineEdit*)o )->isReadOnly() ) ) &&
+ i && i->hasSubItems() ) {
+ if ( !i->isOpen() &&
+ ( ke->key() == Key_Plus ||
+ ke->key() == Key_Right ))
+ i->setOpen( TRUE );
+ else if ( i->isOpen() &&
+ ( ke->key() == Key_Minus ||
+ ke->key() == Key_Left ) )
+ i->setOpen( FALSE );
+ } else if ( ( ke->key() == Key_Return || ke->key() == Key_Enter ) && ::qt_cast<QComboBox*>(o) ) {
+ QKeyEvent ke2( QEvent::KeyPress, Key_Space, 0, 0 );
+ QApplication::sendEvent( o, &ke2 );
+ return TRUE;
+ }
+ } else if ( e->type() == QEvent::FocusOut && ::qt_cast<QLineEdit*>(o) && editor->formWindow() ) {
+ QTimer::singleShot( 100, editor->formWindow()->commandHistory(), SLOT( checkCompressedCommand() ) );
+ } else if ( o == viewport() ) {
+ QMouseEvent *me;
+ PropertyListItem* i;
+ switch ( e->type() ) {
+ case QEvent::MouseButtonPress:
+ me = (QMouseEvent*)e;
+ i = (PropertyListItem*) itemAt( me->pos() );
+ if ( i && ( ::qt_cast<PropertyColorItem*>(i) || ::qt_cast<PropertyPixmapItem*>(i) ) ) {
+ pressItem = i;
+ pressPos = me->pos();
+ mousePressed = TRUE;
+ }
+ break;
+ case QEvent::MouseMove:
+ me = (QMouseEvent*)e;
+ if ( me && me->state() & LeftButton && mousePressed) {
+
+ i = (PropertyListItem*) itemAt( me->pos() );
+ if ( i && i == pressItem ) {
+
+ if (( pressPos - me->pos() ).manhattanLength() > QApplication::startDragDistance() ){
+ if ( ::qt_cast<PropertyColorItem*>(i) ) {
+ QColor col = i->value().asColor();
+ QColorDrag *drg = new QColorDrag( col, this );
+ QPixmap pix( 25, 25 );
+ pix.fill( col );
+ QPainter p( &pix );
+ p.drawRect( 0, 0, pix.width(), pix.height() );
+ p.end();
+ drg->setPixmap( pix );
+ mousePressed = FALSE;
+ drg->dragCopy();
+ }
+ else if ( ::qt_cast<PropertyPixmapItem*>(i) ) {
+ QPixmap pix = i->value().asPixmap();
+ if( !pix.isNull() ) {
+ QImage img = pix.convertToImage();
+ QImageDrag *drg = new QImageDrag( img, this );
+ drg->setPixmap( pix );
+ mousePressed = FALSE;
+ drg->dragCopy();
+ }
+ }
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ } else if ( o == header() ) {
+ if ( e->type() == QEvent::ContextMenu ) {
+ ((QContextMenuEvent *)e)->accept();
+ QPopupMenu menu( 0 );
+ menu.setCheckable( TRUE );
+ const int cat_id = 1;
+ const int alpha_id = 2;
+ menu.insertItem( tr( "Sort &Categorized" ), cat_id );
+ int alpha = menu.insertItem( tr( "Sort &Alphabetically" ), alpha_id );
+ if ( showSorted )
+ menu.setItemChecked( alpha_id, TRUE );
+ else
+ menu.setItemChecked( cat_id, TRUE );
+ int res = menu.exec( ( (QContextMenuEvent*)e )->globalPos() );
+ if ( res != -1 ) {
+ bool newShowSorted = ( res == alpha );
+ if ( showSorted != newShowSorted ) {
+ showSorted = newShowSorted;
+ editor->clear();
+ editor->setup();
+ }
+ }
+ return TRUE;
+ }
+ }
+
+ return QListView::eventFilter( o, e );
+}
+
+/*! This method re-initializes each item of the property list.
+*/
+
+void PropertyList::refetchData()
+{
+ QListViewItemIterator it( this );
+ for ( ; it.current(); ++it ) {
+ PropertyItem *i = (PropertyItem*)it.current();
+ if ( !i->propertyParent() )
+ setPropertyValue( i );
+ if ( i->hasSubItems() )
+ i->initChildren();
+ bool changed = MetaDataBase::isPropertyChanged( editor->widget(), i->name() );
+ if ( ( i->name() == "layoutSpacing" || i->name() == "layoutMargin" ) ) {
+ if ( i->value().toString() != "-1" )
+ i->setChanged( TRUE, FALSE );
+ else
+ i->setChanged( FALSE, FALSE );
+ }
+ else if ( changed != i->isChanged() )
+ i->setChanged( changed, FALSE );
+ }
+ updateEditorSize();
+}
+
+static void clearAlignList( QStrList &l )
+{
+ if ( l.count() == 1 )
+ return;
+ if ( l.find( "AlignAuto" ) != -1 )
+ l.remove( "AlignAuto" );
+ if ( l.find( "WordBreak" ) != -1 )
+ l.remove( "WordBreak" );
+}
+
+/*! This method initializes the value of the item \a i to the value
+ of the corresponding property.
+*/
+
+void PropertyList::setPropertyValue( PropertyItem *i )
+{
+ const QMetaProperty *p =
+ editor->widget()->metaObject()->
+ property( editor->widget()->metaObject()->findProperty( i->name(), TRUE), TRUE );
+ if ( !p ) {
+ if ( i->name() == "hAlign" ) {
+ int align = editor->widget()->property( "alignment" ).toInt();
+ p = editor->widget()->metaObject()->
+ property( editor->widget()->metaObject()->findProperty( "alignment", TRUE ), TRUE );
+ align &= ~AlignVertical_Mask;
+ QStrList l = p->valueToKeys( align );
+ clearAlignList( l );
+ ( (PropertyListItem*)i )->setCurrentItem( l.last() );
+ } else if ( i->name() == "vAlign" ) {
+ int align = editor->widget()->property( "alignment" ).toInt();
+ p = editor->widget()->metaObject()->
+ property( editor->widget()->metaObject()->findProperty( "alignment", TRUE ), TRUE );
+ align &= ~AlignHorizontal_Mask;
+ ( (PropertyListItem*)i )->setCurrentItem( p->valueToKeys( align ).last() );
+ } else if ( i->name() == "wordwrap" ) {
+ int align = editor->widget()->property( "alignment" ).toInt();
+ if ( align & WordBreak )
+ i->setValue( QVariant( TRUE, 0 ) );
+ else
+ i->setValue( QVariant( FALSE, 0 ) );
+ } else if ( i->name() == "layoutSpacing" ) {
+ ( (PropertyLayoutItem*)i )->setValue( MetaDataBase::spacing( WidgetFactory::containerOfWidget( (QWidget*)editor->widget() ) ) );
+ } else if ( i->name() == "layoutMargin" ) {
+ ( (PropertyLayoutItem*)i )->setValue( MetaDataBase::margin( WidgetFactory::containerOfWidget( (QWidget*)editor->widget() ) ) );
+ } else if ( i->name() == "resizeMode" ) {
+ ( (PropertyListItem*)i )->setCurrentItem( MetaDataBase::resizeMode( WidgetFactory::containerOfWidget( (QWidget*)editor->widget() ) ) );
+ } else if ( i->name() == "toolTip" || i->name() == "whatsThis" || i->name() == "database" || i->name() == "frameworkCode" ) {
+ i->setValue( MetaDataBase::fakeProperty( editor->widget(), i->name() ) );
+ } else if ( editor->widget()->inherits( "CustomWidget" ) ) {
+ MetaDataBase::CustomWidget *cw = ( (CustomWidget*)editor->widget() )->customWidget();
+ if ( !cw )
+ return;
+ i->setValue( MetaDataBase::fakeProperty( editor->widget(), i->name() ) );
+ }
+ return;
+ }
+ if ( p->isSetType() )
+ ( (PropertyEnumItem*)i )->setCurrentValues( p->valueToKeys( editor->widget()->property( i->name() ).toInt() ) );
+ else if ( p->isEnumType() )
+ ( (PropertyListItem*)i )->setCurrentItem( p->valueToKey( editor->widget()->property( i->name() ).toInt() ) );
+ else if ( qstrcmp( p->name(), "buddy" ) == 0 )
+ ( (PropertyListItem*)i )->setCurrentItem( editor->widget()->property( i->name() ).toString() );
+ else
+ i->setValue( editor->widget()->property( i->name() ) );
+}
+
+void PropertyList::setCurrentProperty( const QString &n )
+{
+ if ( currentItem() && currentItem()->text( 0 ) == n ||
+ currentItem() && ( (PropertyItem*)currentItem() )->propertyParent() &&
+ ( (PropertyItem*)currentItem() )->propertyParent()->text( 0 ) == n )
+ return;
+
+ QListViewItemIterator it( this );
+ for ( ; it.current(); ++it ) {
+ if ( it.current()->text( 0 ) == n ) {
+ setCurrentItem( it.current() );
+ break;
+ }
+ }
+}
+
+PropertyEditor *PropertyList::propertyEditor() const
+{
+ return editor;
+}
+
+void PropertyList::resetProperty()
+{
+ if ( !currentItem() )
+ return;
+ PropertyItem *i = (PropertyItem*)currentItem();
+ if ( !MetaDataBase::isPropertyChanged( editor->widget(), i->PropertyItem::name() ) )
+ return;
+ QString pn( tr( "Reset '%1' of '%2'" ).arg( i->name() ).arg( editor->widget()->name() ) );
+ SetPropertyCommand *cmd = new SetPropertyCommand( pn, editor->formWindow(),
+ editor->widget(), editor,
+ i->name(), i->value(),
+ WidgetFactory::defaultValue( editor->widget(), i->name() ),
+ WidgetFactory::defaultCurrentItem( editor->widget(), i->name() ),
+ i->currentItem(), TRUE );
+ cmd->execute();
+ editor->formWindow()->commandHistory()->addCommand( cmd, FALSE );
+ if ( i->hasSubItems() )
+ i->initChildren();
+}
+
+void PropertyList::viewportDragEnterEvent( QDragEnterEvent *e )
+{
+ PropertyListItem *i = (PropertyListItem*) itemAt( e->pos() );
+ if( !i ) {
+ e->ignore();
+ return;
+ }
+
+ if ( ::qt_cast<PropertyColorItem*>(i) && QColorDrag::canDecode( e ) )
+ e->accept();
+ else if ( ::qt_cast<PropertyPixmapItem*>(i) && QImageDrag::canDecode( e ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void PropertyList::viewportDragMoveEvent ( QDragMoveEvent *e )
+{
+ PropertyListItem *i = (PropertyListItem*) itemAt( e->pos() );
+ if( !i ) {
+ e->ignore();
+ return;
+ }
+
+ if ( ::qt_cast<PropertyColorItem*>(i) && QColorDrag::canDecode( e ) )
+ e->accept();
+ else if ( ::qt_cast<PropertyPixmapItem*>(i) && QImageDrag::canDecode( e ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void PropertyList::viewportDropEvent ( QDropEvent *e )
+{
+ PropertyListItem *i = (PropertyListItem*) itemAt( e->pos() );
+ if( !i ) {
+ e->ignore();
+ return;
+ }
+
+ if ( ::qt_cast<PropertyColorItem*>(i) && QColorDrag::canDecode( e ) ) {
+ QColor color;
+ QColorDrag::decode( e, color );
+ i->setValue( QVariant( color ) );
+ valueChanged( i );
+ e->accept();
+ }
+ else if ( ::qt_cast<PropertyPixmapItem*>(i) && QImageDrag::canDecode( e ) ) {
+ QImage img;
+ QImageDrag::decode( e, img );
+ QPixmap pm;
+ pm.convertFromImage( img );
+ i->setValue( QVariant( pm ) );
+ valueChanged( i );
+ e->accept();
+ }
+ else
+ e->ignore();
+}
+
+QString PropertyList::whatsThisAt( const QPoint &p )
+{
+ return whatsThisText( itemAt( p ) );
+}
+
+void PropertyList::showCurrentWhatsThis()
+{
+ if ( !currentItem() )
+ return;
+ QPoint p( 0, currentItem()->itemPos() );
+ p = viewport()->mapToGlobal( contentsToViewport( p ) );
+ QWhatsThis::display( whatsThisText( currentItem() ), p, viewport() );
+}
+
+QString PropertyList::whatsThisText( QListViewItem *i )
+{
+ if ( !i || !editor->widget() )
+ return QString::null;
+ readPropertyDocs();
+ if ( ( (PropertyItem*)i )->propertyParent() )
+ i = ( (PropertyItem*)i )->propertyParent();
+
+ const QMetaObject *mo = editor->widget()->metaObject();
+ QString prop = ( (PropertyItem*)i )->name();
+ while ( mo ) {
+ QString s;
+ s = QString( mo->className() ) + "::" + prop;
+ QMap<QString, QString>::Iterator it;
+ if ( ( it = propertyDocs.find( s ) ) != propertyDocs.end() ) {
+ return *it;
+ }
+ mo = mo->superClass();
+ }
+
+ return tr( "<p><b>QWidget::%1</b></p><p>There is no documentation available for this property.</p>" ).arg( prop );
+}
+
+void PropertyList::readPropertyDocs()
+{
+ if ( !propertyDocs.isEmpty() )
+ return;
+
+ QString docFile = MainWindow::self->documentationPath() + "/propertydocs";
+ QFile f( docFile );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+ QDomDocument doc;
+ QString errMsg;
+ int errLine;
+ if ( !doc.setContent( &f, &errMsg, &errLine ) )
+ return;
+ QDomElement e = doc.firstChild().toElement().firstChild().toElement();
+
+ for ( ; !e.isNull(); e = e.nextSibling().toElement() ) {
+ QDomElement n = e.firstChild().toElement();
+ QString name;
+ QString doc;
+ for ( ; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "name" )
+ name = n.firstChild().toText().data();
+ else if ( n.tagName() == "doc" )
+ doc = n.firstChild().toText().data();
+ }
+ doc.insert( 0, "<p><b>" + name + "</b></p>" );
+ propertyDocs.insert( name, doc );
+ }
+}
+
+PropertyList::LastEventType PropertyList::lastEvent()
+{
+ return theLastEvent;
+}
+// ------------------------------------------------------------
+
+EventList::EventList( QWidget *parent, FormWindow *fw, PropertyEditor *e )
+ : HierarchyList( parent, fw, TRUE ), editor( e )
+{
+ header()->hide();
+ removeColumn( 1 );
+ setRootIsDecorated( TRUE );
+ connect( this, SIGNAL( itemRenamed( QListViewItem *, int, const QString & ) ),
+ this, SLOT( renamed( QListViewItem * ) ) );
+}
+
+QString clean_arguments( const QString &s )
+{
+ QString slot = s;
+ QString arg = slot.mid( slot.find( '(' ) + 1 );
+ arg = arg.left( arg.findRev( ')' ) );
+ QStringList args = QStringList::split( ',', arg );
+ slot = slot.left( slot.find( '(' ) + 1 );
+ int num = 0;
+ for ( QStringList::Iterator it = args.begin(); it != args.end(); ++it, ++num ) {
+ QString a = *it;
+ int i;
+ if ( ( i =a.find( ':' ) ) == -1 )
+ slot += a.simplifyWhiteSpace();
+ else
+ slot += a.mid( i + 1 ).simplifyWhiteSpace();
+ if ( num < (int)args.count() - 1 )
+ slot += ",";
+ }
+
+ slot += ")";
+
+ return slot;
+}
+
+
+void EventList::setup()
+{
+ clear();
+
+ if ( !formWindow )
+ return;
+ LanguageInterface *iface = MetaDataBase::languageInterface( formWindow->project()->language() );
+ QStrList sigs;
+ if ( iface )
+ sigs = iface->signalNames( editor->widget() );
+ QStrListIterator it( sigs );
+ while ( it.current() ) {
+ HierarchyItem *eventItem = new HierarchyItem( HierarchyItem::Event, this, (HierarchyItem*)0,
+ it.current(), QString::null, QString::null );
+ eventItem->setOpen( TRUE );
+ QValueList<MetaDataBase::Connection> conns =
+ MetaDataBase::connections( formWindow, editor->widget(), formWindow->mainContainer() );
+ HierarchyItem *item = 0;
+ for ( QValueList<MetaDataBase::Connection>::Iterator cit = conns.begin();
+ cit != conns.end(); ++cit ) {
+ QString s = it.current();
+ if ( MetaDataBase::normalizeFunction( clean_arguments( QString( (*cit).signal ) ) ) !=
+ MetaDataBase::normalizeFunction( clean_arguments( s ) ) )
+ continue;
+ item = new HierarchyItem( HierarchyItem::EventFunction, eventItem, item,
+ (*cit).slot, QString::null, QString::null );
+ item->setPixmap( 0, QPixmap::fromMimeSource( "designer_editslots.png" ) );
+ }
+ ++it;
+ }
+}
+
+extern QListViewItem *newItem;
+
+void EventList::contentsMouseDoubleClickEvent( QMouseEvent *e )
+{
+ QListViewItem *i = itemAt( contentsToViewport( e->pos() ) );
+ if ( !i || i->parent() )
+ return;
+ QString s;
+ if ( !formWindow->project()->isCpp() ) {
+ QString s1 = i->text( 0 );
+ int pt = s1.find( "(" );
+ if ( pt != -1 )
+ s1 = s1.left( pt );
+ s = QString( editor->widget()->name() ) + "_" + s1;
+ } else {
+ s = QString( editor->widget()->name() ) + "_" + i->text( 0 );
+ }
+
+ insertEntry( i, QPixmap::fromMimeSource( "designer_editslots.png" ), s );
+}
+
+void EventList::setCurrent( QWidget * )
+{
+}
+
+void EventList::objectClicked( QListViewItem *i )
+{
+ if ( !i || !i->parent() )
+ return;
+ formWindow->mainWindow()->editFunction( i->text( 0 ) );
+}
+
+void EventList::showRMBMenu( QListViewItem *i, const QPoint &pos )
+{
+ if ( !i )
+ return;
+ QPopupMenu menu;
+ const int NEW_ITEM = 1;
+ const int DEL_ITEM = 2;
+ menu.insertItem( QPixmap::fromMimeSource( "designer_filenew.png" ), tr( "New Signal Handler" ), NEW_ITEM );
+ menu.insertItem( QPixmap::fromMimeSource( "designer_editcut.png" ), tr( "Delete Signal Handler" ), DEL_ITEM );
+ int res = menu.exec( pos );
+ if ( res == NEW_ITEM ) {
+ QString s;
+ if ( !formWindow->project()->isCpp() ) {
+ QString s1 = ( i->parent() ? i->parent() : i )->text( 0 );
+ int pt = s1.find( "(" );
+ if ( pt != -1 )
+ s1 = s1.left( pt );
+ s = QString( editor->widget()->name() ) + "_" + s1;
+ } else {
+ s = QString( editor->widget()->name() ) + "_" + ( i->parent() ? i->parent() : i )->text( 0 );
+ }
+ insertEntry( i->parent() ? i->parent() : i, QPixmap::fromMimeSource( "designer_editslots.png" ), s );
+ } else if ( res == DEL_ITEM && i->parent() ) {
+ MetaDataBase::Connection conn;
+ conn.sender = editor->widget();
+ conn.receiver = formWindow->mainContainer();
+ conn.signal = i->parent()->text( 0 );
+ conn.slot = i->text( 0 );
+ delete i;
+ RemoveConnectionCommand *cmd = new RemoveConnectionCommand( tr( "Remove connection" ),
+ formWindow,
+ conn );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ editor->formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ }
+}
+
+void EventList::renamed( QListViewItem *i )
+{
+ if ( newItem == i )
+ newItem = 0;
+ if ( !i->parent() )
+ return;
+ QListViewItem *itm = i->parent()->firstChild();
+ bool del = FALSE;
+ while ( itm ) {
+ if ( itm != i && itm->text( 0 ) == i->text( 0 ) ) {
+ del = TRUE;
+ break;
+ }
+ itm = itm->nextSibling();
+ }
+ i->setRenameEnabled( 0, FALSE );
+ if ( del ) {
+ delete i;
+ } else {
+ MetaDataBase::Connection conn;
+ conn.sender = editor->widget();
+ conn.receiver = formWindow->mainContainer();
+ conn.signal = i->parent()->text( 0 );
+ conn.slot = i->text( 0 );
+ AddConnectionCommand *cmd = new AddConnectionCommand( tr( "Add connection" ),
+ formWindow,
+ conn );
+ formWindow->commandHistory()->addCommand( cmd );
+ // #### we should look if the specified slot already
+ // exists and if we can connect to this one
+ QString funcname = i->text( 0 ).latin1();
+ if ( funcname.find( '(' ) == -1 ) { // try to create a signature
+ QString sig = i->parent()->text( 0 );
+ sig = sig.mid( sig.find( '(' ) + 1 );
+ sig.remove( (int)sig.length() - 1, 1 );
+ LanguageInterface *iface = MetaDataBase::languageInterface( formWindow->project()->language() );
+ if ( iface )
+ sig = iface->createArguments( sig.simplifyWhiteSpace() );
+ funcname += "(" + sig + ")";
+ }
+ MetaDataBase::addFunction( formWindow, funcname.latin1(), "virtual", "public",
+ "slot", formWindow->project()->language(), "void" );
+ editor->formWindow()->mainWindow()->
+ editFunction( i->text( 0 ).left( i->text( 0 ).find( "(" ) ), TRUE );
+ cmd->execute();
+ editor->formWindow()->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ editor->formWindow()->formFile()->setModified( TRUE );
+ }
+}
+
+void EventList::save( QListViewItem *p )
+{
+ QStringList lst;
+ QListViewItem *i = p->firstChild();
+ while ( i ) {
+ lst << i->text( 0 );
+ i = i->nextSibling();
+ }
+}
+
+// --------------------------------------------------------------
+
+/*!
+ \class PropertyEditor propertyeditor.h
+ \brief PropertyEdior toplevel window
+
+ This is the toplevel window of the property editor which contains a
+ listview for editing properties.
+*/
+
+PropertyEditor::PropertyEditor( QWidget *parent )
+ : QTabWidget( parent, 0, WStyle_Customize | WStyle_NormalBorder | WStyle_Title |
+ WStyle_StaysOnTop | WStyle_Tool |WStyle_MinMax | WStyle_SysMenu )
+{
+ setCaption( tr( "Property Editor" ) );
+ wid = 0;
+ formwindow = 0;
+ listview = new PropertyList( this );
+ addTab( listview, tr( "P&roperties" ) );
+ eList = new EventList( this, formWindow(), this );
+ addTab( eList, tr( "Signa&l Handlers" ) );
+}
+
+QObject *PropertyEditor::widget() const
+{
+ return wid;
+}
+
+void PropertyEditor::setWidget( QObject *w, FormWindow *fw )
+{
+ if ( fw && fw->isFake() )
+ w = fw->project()->objectForFakeForm( fw );
+ eList->setFormWindow( fw );
+ if ( w && w == wid ) {
+ // if there is no properties displayed then we really should show them.
+ // to do this check the number of properties in the list.
+ bool ret = (listview->childCount() > 0) ? TRUE : FALSE;
+ if ( wid->isWidgetType() && WidgetFactory::layoutType( (QWidget*)wid ) != WidgetFactory::NoLayout ) {
+ QListViewItemIterator it( listview );
+ ret = FALSE;
+ while ( it.current() ) {
+ if ( it.current()->text( 0 ) == "layoutSpacing" || it.current()->text( 0 ) == "layoutMargin" ) {
+ ret = TRUE;
+ break;
+ }
+ ++it;
+ }
+ }
+ if ( ret )
+ return;
+ }
+
+ if ( !w || !fw ) {
+ setCaption( tr( "Property Editor" ) );
+ clear();
+ wid = 0;
+ formwindow = 0;
+ return;
+ }
+
+ wid = w;
+ formwindow = fw;
+ setCaption( tr( "Property Editor (%1)" ).arg( formwindow->name() ) );
+ listview->viewport()->setUpdatesEnabled( FALSE );
+ listview->setUpdatesEnabled( FALSE );
+ clear();
+ listview->viewport()->setUpdatesEnabled( TRUE );
+ listview->setUpdatesEnabled( TRUE );
+ setup();
+}
+
+void PropertyEditor::clear()
+{
+ listview->setContentsPos( 0, 0 );
+ listview->clear();
+ eList->setContentsPos( 0, 0 );
+ eList->clear();
+}
+
+void PropertyEditor::setup()
+{
+ if ( !formwindow || !wid )
+ return;
+ listview->viewport()->setUpdatesEnabled( FALSE );
+ listview->setupProperties();
+ listview->viewport()->setUpdatesEnabled( TRUE );
+ listview->updateEditorSize();
+
+ // the forced processing of events in setupProperties() can set wid to 0, so we have to check
+ if ( wid && !wid->isA( "PropertyObject" ) ) {
+ eList->viewport()->setUpdatesEnabled( FALSE );
+ eList->setup();
+ eList->viewport()->setUpdatesEnabled( TRUE );
+ }
+}
+
+void PropertyEditor::refetchData()
+{
+ listview->refetchData();
+}
+
+void PropertyEditor::emitWidgetChanged()
+{
+ if ( formwindow && wid )
+ formwindow->widgetChanged( wid );
+}
+
+void PropertyEditor::closed( FormWindow *w )
+{
+ if ( w == formwindow ) {
+ formwindow = 0;
+ wid = 0;
+ clear();
+ }
+}
+
+void PropertyEditor::closeEvent( QCloseEvent *e )
+{
+ emit hidden();
+ e->accept();
+}
+
+PropertyList *PropertyEditor::propertyList() const
+{
+ return listview;
+}
+
+FormWindow *PropertyEditor::formWindow() const
+{
+ return formwindow;
+}
+
+QString PropertyEditor::currentProperty() const
+{
+ if ( !wid )
+ return QString::null;
+ if ( ( (PropertyItem*)listview->currentItem() )->propertyParent() )
+ return ( (PropertyItem*)listview->currentItem() )->propertyParent()->name();
+ return ( (PropertyItem*)listview->currentItem() )->name();
+}
+
+QString PropertyEditor::classOfCurrentProperty() const
+{
+ if ( !wid )
+ return QString::null;
+ QObject *o = wid;
+ QString curr = currentProperty();
+ QMetaObject *mo = o->metaObject();
+ while ( mo ) {
+ QStrList props = mo->propertyNames( FALSE );
+ if ( props.find( curr.latin1() ) != -1 )
+ return mo->className();
+ mo = mo->superClass();
+ }
+ return QString::null;
+}
+
+QMetaObject* PropertyEditor::metaObjectOfCurrentProperty() const
+{
+ if ( !wid )
+ return 0;
+ return wid->metaObject();
+}
+
+void PropertyEditor::resetFocus()
+{
+ if ( listview->currentItem() )
+ ( (PropertyItem*)listview->currentItem() )->showEditor();
+}
+
+EventList *PropertyEditor::eventList() const
+{
+ return eList;
+}
+
+void PropertyEditor::setPropertyEditorEnabled( bool b )
+{
+ if ( !b )
+ removePage( listview );
+ else
+ insertTab( listview, tr( "Property Editor" ), 0 );
+ updateWindow();
+}
+
+void PropertyEditor::setSignalHandlersEnabled( bool b )
+{
+ if ( !b )
+ removePage( eList );
+ else
+ insertTab( eList, tr( "Signal Handlers" ), 0 );
+ updateWindow();
+}
+
+void PropertyEditor::updateWindow()
+{
+ if ( isHidden() && count() ) {
+ parentWidget()->show();
+ MainWindow::self->setAppropriate( (QDockWindow*)parentWidget(), TRUE );
+ } else if ( isShown() && !count() ) {
+ parentWidget()->hide();
+ MainWindow::self->setAppropriate( (QDockWindow*)parentWidget(), FALSE );
+ }
+}
diff --git a/tools/designer/designer/propertyeditor.h b/tools/designer/designer/propertyeditor.h
new file mode 100644
index 0000000..c5ad46b
--- /dev/null
+++ b/tools/designer/designer/propertyeditor.h
@@ -0,0 +1,874 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PROPERTYEDITOR_H
+#define PROPERTYEDITOR_H
+
+#include <qfeatures.h>
+#include <qvariant.h>
+#include <qlistview.h>
+#include <qptrlist.h>
+#include <qguardedptr.h>
+#include <qtabwidget.h>
+#include <qmodules.h>
+#include <qptrlist.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include "hierarchyview.h"
+#include "metadatabase.h"
+
+class PropertyList;
+class PropertyEditor;
+class QPainter;
+class QColorGroup;
+class QLineEdit;
+class QPushButton;
+class QHBox;
+class QSpinBox;
+class QLabel;
+class QFrame;
+class FormWindow;
+class QCloseEvent;
+class QResizeEvent;
+class PropertyWhatsThis;
+class QDateEdit;
+class QTimeEdit;
+class QDateTimeEdit;
+
+class PropertyItem : public QListViewItem
+{
+public:
+ PropertyItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName );
+ ~PropertyItem();
+
+ void paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int align );
+ void paintBranches( QPainter * p, const QColorGroup & cg,
+ int w, int y, int h );
+ void paintFocus( QPainter *p, const QColorGroup &cg, const QRect &r );
+
+ virtual bool hasSubItems() const;
+ virtual void createChildren();
+ virtual void initChildren();
+
+ bool isOpen() const;
+ void setOpen( bool b );
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+ QVariant value() const;
+ QString name() const;
+ virtual void notifyValueChange();
+
+ virtual void setChanged( bool b, bool updateDb = TRUE );
+ bool isChanged() const;
+
+ virtual void placeEditor( QWidget *w );
+
+ virtual PropertyItem *propertyParent() const;
+ virtual void childValueChanged( PropertyItem *child );
+
+ void addChild( PropertyItem *i );
+ int childCount() const;
+ PropertyItem *child( int i ) const;
+
+ virtual bool hasCustomContents() const;
+ virtual void drawCustomContents( QPainter *p, const QRect &r );
+
+ void updateBackColor();
+
+ void setup() { QListViewItem::setup(); setHeight( QListViewItem::height() + 2 ); }
+
+ virtual QString currentItem() const;
+ virtual int currentIntItem() const;
+ virtual void setCurrentItem( const QString &s );
+ virtual void setCurrentItem( int i );
+ virtual int currentIntItemFromObject() const;
+ virtual QString currentItemFromObject() const;
+
+ void setFocus( QWidget *w );
+
+ virtual void toggle();
+ void setText( int col, const QString &txt );
+
+protected:
+ PropertyList *listview;
+ QVariant val;
+
+private:
+ QColor backgroundColor();
+ void createResetButton();
+ void updateResetButtonState();
+
+private:
+ bool open, changed;
+ PropertyItem *property;
+ QString propertyName;
+ QPtrList<PropertyItem> children;
+ QColor backColor;
+ QPushButton *resetButton;
+
+};
+
+class PropertyTextItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyTextItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, bool comment, bool multiLine, bool ascii = FALSE, bool a = FALSE );
+ ~PropertyTextItem();
+
+ virtual void createChildren();
+ virtual void initChildren();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+ virtual bool hasSubItems() const;
+ virtual void childValueChanged( PropertyItem *child );
+
+ virtual void setChanged( bool b, bool updateDb = TRUE );
+
+private slots:
+ void setValue();
+ void getText();
+
+private:
+ QLineEdit *lined();
+ QGuardedPtr<QLineEdit> lin;
+ QGuardedPtr<QHBox> box;
+ QPushButton *button;
+ bool withComment, hasMultiLines, asciiOnly, accel;
+
+};
+
+
+class PropertyBoolItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyBoolItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName );
+ ~PropertyBoolItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+ virtual void toggle();
+
+private slots:
+ void setValue();
+
+private:
+ QComboBox *combo();
+ QGuardedPtr<QComboBox> comb;
+
+};
+
+class PropertyIntItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyIntItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, bool s );
+ ~PropertyIntItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+private slots:
+ void setValue();
+
+private:
+ QSpinBox *spinBox();
+ QGuardedPtr<QSpinBox> spinBx;
+ bool signedValue;
+
+};
+
+class PropertyLayoutItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyLayoutItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName );
+ ~PropertyLayoutItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+private slots:
+ void setValue();
+
+private:
+ QSpinBox *spinBox();
+ QGuardedPtr<QSpinBox> spinBx;
+
+};
+
+class PropertyDoubleItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyDoubleItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName );
+ ~PropertyDoubleItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+private slots:
+ void setValue();
+
+private:
+ QLineEdit *lined();
+ QGuardedPtr<QLineEdit> lin;
+};
+
+class PropertyListItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyListItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, bool editable );
+ ~PropertyListItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+ QString currentItem() const;
+ int currentIntItem() const;
+ void setCurrentItem( const QString &s );
+ void setCurrentItem( int i );
+ int currentIntItemFromObject() const;
+ QString currentItemFromObject() const;
+ void addItem( const QString &s );
+
+private slots:
+ void setValue();
+
+private:
+ QComboBox *combo();
+ QGuardedPtr<QComboBox> comb;
+ int oldInt;
+ bool editable;
+ QString oldString;
+
+};
+
+class PropertyFontItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyFontItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName );
+ ~PropertyFontItem();
+
+ virtual void createChildren();
+ virtual void initChildren();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+ virtual bool hasSubItems() const;
+ virtual void childValueChanged( PropertyItem *child );
+
+private slots:
+ void getFont();
+
+private:
+ QGuardedPtr<QLineEdit> lined;
+ QGuardedPtr<QPushButton> button;
+ QGuardedPtr<QHBox> box;
+
+};
+
+class PropertyCoordItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ enum Type { Rect, Size, Point };
+
+ PropertyCoordItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, Type t );
+ ~PropertyCoordItem();
+
+ virtual void createChildren();
+ virtual void initChildren();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+ virtual bool hasSubItems() const;
+ virtual void childValueChanged( PropertyItem *child );
+
+private:
+ QLineEdit *lined();
+ QGuardedPtr<QLineEdit> lin;
+ Type typ;
+
+};
+
+class PropertyColorItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyColorItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, bool children );
+ ~PropertyColorItem();
+
+ virtual void createChildren();
+ virtual void initChildren();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+ virtual bool hasSubItems() const;
+ virtual void childValueChanged( PropertyItem *child );
+
+ virtual bool hasCustomContents() const;
+ virtual void drawCustomContents( QPainter *p, const QRect &r );
+
+private slots:
+ void getColor();
+
+private:
+ QGuardedPtr<QHBox> box;
+ QGuardedPtr<QFrame> colorPrev;
+ QGuardedPtr<QPushButton> button;
+ bool withChildren;
+
+};
+
+class PropertyPixmapItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ enum Type { Pixmap, IconSet, Image };
+
+ PropertyPixmapItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName, Type t );
+ ~PropertyPixmapItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+ virtual bool hasCustomContents() const;
+ virtual void drawCustomContents( QPainter *p, const QRect &r );
+
+private slots:
+ void getPixmap();
+
+private:
+ QGuardedPtr<QHBox> box;
+ QGuardedPtr<QLabel> pixPrev;
+ QPushButton *button;
+ Type type;
+
+};
+
+
+class PropertySizePolicyItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertySizePolicyItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName );
+ ~PropertySizePolicyItem();
+
+ virtual void createChildren();
+ virtual void initChildren();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+ virtual bool hasSubItems() const;
+ virtual void childValueChanged( PropertyItem *child );
+
+private:
+ QLineEdit *lined();
+ QGuardedPtr<QLineEdit> lin;
+
+};
+
+class PropertyPaletteItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyPaletteItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName );
+ ~PropertyPaletteItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+ virtual bool hasCustomContents() const;
+ virtual void drawCustomContents( QPainter *p, const QRect &r );
+
+private slots:
+ void getPalette();
+
+private:
+ QGuardedPtr<QHBox> box;
+ QGuardedPtr<QLabel> palettePrev;
+ QGuardedPtr<QPushButton> button;
+
+};
+
+class PropertyCursorItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyCursorItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName );
+ ~PropertyCursorItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+private slots:
+ void setValue();
+
+private:
+ QComboBox *combo();
+ QGuardedPtr<QComboBox> comb;
+
+};
+
+class PropertyKeysequenceItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyKeysequenceItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName );
+ ~PropertyKeysequenceItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+private slots:
+ void setValue();
+
+private:
+ bool eventFilter( QObject *o, QEvent *e );
+ void handleKeyEvent( QKeyEvent *e );
+ int translateModifiers( int state );
+
+ QGuardedPtr<QLineEdit> sequence;
+ QGuardedPtr<QHBox> box;
+ int k1,k2,k3,k4;
+ int num;
+ bool mouseEnter;
+};
+
+class PropertyDatabaseItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyDatabaseItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName, bool wField );
+ ~PropertyDatabaseItem();
+
+ virtual void createChildren();
+ virtual void initChildren();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+ virtual bool hasSubItems() const;
+ virtual void childValueChanged( PropertyItem *child );
+
+private:
+ QGuardedPtr<QLineEdit> lined;
+ QGuardedPtr<QPushButton> button;
+ QGuardedPtr<QHBox> box;
+ bool withField;
+
+};
+
+struct EnumItem {
+ EnumItem( const QString &k, bool s )
+ : key( k ), selected( s ) {}
+ EnumItem() : key( QString::null ), selected( FALSE ) {}
+ bool operator==( const EnumItem &item ) const {
+ return key == item.key;
+ }
+ QString key;
+ bool selected;
+};
+
+class EnumPopup : public QFrame
+{
+ Q_OBJECT
+
+public:
+ EnumPopup( QWidget *parent, const char *name, WFlags f=0 );
+ ~EnumPopup();
+ void insertEnums( QValueList<EnumItem> lst );
+ QValueList<EnumItem> enumList() const;
+ void closeWidget();
+
+signals:
+ void closed();
+ void hidden();
+
+protected:
+ void keyPressEvent( QKeyEvent *e );
+
+private:
+ QValueList<EnumItem> itemList;
+ QPtrList<QCheckBox> checkBoxList;
+ QVBoxLayout *popLayout;
+};
+
+class EnumBox : public QComboBox
+{
+ Q_OBJECT
+
+public:
+ EnumBox( QWidget *parent, const char *name = 0 );
+ ~EnumBox() {}
+ void setText( const QString &text );
+ void insertEnums( QValueList<EnumItem> lst );
+ QValueList<EnumItem> enumList() const;
+
+signals:
+ void aboutToShowPopup();
+ void valueChanged();
+
+protected:
+ void paintEvent( QPaintEvent * );
+ void mousePressEvent( QMouseEvent *e );
+ void keyPressEvent( QKeyEvent *e );
+
+protected slots:
+ void restoreArrow();
+ void popupHidden();
+ void popupClosed();
+
+private:
+ void popup();
+ bool arrowDown;
+ QString str;
+ bool popupShown;
+ EnumPopup *pop;
+
+};
+class PropertyEnumItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyEnumItem( PropertyList *l, PropertyItem *after, PropertyItem *prop,
+ const QString &propName );
+ ~PropertyEnumItem();
+
+ void showEditor();
+ void hideEditor();
+ void setValue( const QVariant &v );
+ QString currentItem() const;
+ QString currentItemFromObject() const;
+ void setCurrentValues( QStrList lst );
+
+private slots:
+ void setValue();
+ void insertEnums();
+
+private:
+ QGuardedPtr<EnumBox> box;
+ QValueList<EnumItem> enumList;
+ QString enumString;
+};
+
+class PropertyList : public QListView
+{
+ Q_OBJECT
+
+public:
+ PropertyList( PropertyEditor *e );
+
+ virtual void setupProperties();
+
+ virtual void setCurrentItem( QListViewItem *i );
+ virtual void valueChanged( PropertyItem *i );
+ virtual void refetchData();
+ virtual void setPropertyValue( PropertyItem *i );
+ virtual void setCurrentProperty( const QString &n );
+
+ void layoutInitValue( PropertyItem *i, bool changed = FALSE );
+ PropertyEditor *propertyEditor() const;
+ QString whatsThisAt( const QPoint &p );
+ void showCurrentWhatsThis();
+
+ enum LastEventType { KeyEvent, MouseEvent };
+ LastEventType lastEvent();
+
+public slots:
+ void updateEditorSize();
+ void resetProperty();
+ void toggleSort();
+
+private slots:
+ void itemPressed( QListViewItem *i, const QPoint &p, int c );
+ void toggleOpen( QListViewItem *i );
+ bool eventFilter( QObject *o, QEvent *e );
+
+protected:
+ void resizeEvent( QResizeEvent *e );
+ void paintEmptyArea( QPainter *p, const QRect &r );
+ bool addPropertyItem( PropertyItem *&item, const QCString &name, QVariant::Type t );
+
+ void viewportDragEnterEvent( QDragEnterEvent * );
+ void viewportDragMoveEvent ( QDragMoveEvent * );
+ void viewportDropEvent ( QDropEvent * );
+
+protected:
+ PropertyEditor *editor;
+
+private:
+ void readPropertyDocs();
+ void setupCusWidgetProperties( MetaDataBase::CustomWidget *cw,
+ QMap<QString, bool> &unique,
+ PropertyItem *&item );
+ QString whatsThisText( QListViewItem *i );
+
+private:
+ PropertyListItem* pressItem;
+ QPoint pressPos;
+ bool mousePressed;
+ bool showSorted;
+ QMap<QString, QString> propertyDocs;
+ PropertyWhatsThis *whatsThis;
+ LastEventType theLastEvent;
+};
+
+class EventList : public HierarchyList
+{
+ Q_OBJECT
+
+public:
+ EventList( QWidget *parent, FormWindow *fw, PropertyEditor *e );
+
+ void setup();
+ void setCurrent( QWidget *w );
+
+protected:
+ void contentsMouseDoubleClickEvent( QMouseEvent *e );
+
+private:
+ void save( QListViewItem *p );
+
+private slots:
+ void objectClicked( QListViewItem *i );
+ void showRMBMenu( QListViewItem *, const QPoint & );
+ void renamed( QListViewItem *i );
+
+private:
+ PropertyEditor *editor;
+
+};
+
+
+class PropertyEditor : public QTabWidget
+{
+ Q_OBJECT
+
+public:
+ PropertyEditor( QWidget *parent );
+
+ QObject *widget() const;
+
+ void clear();
+ void setup();
+
+ void emitWidgetChanged();
+ void refetchData();
+
+ void closed( FormWindow *w );
+
+ PropertyList *propertyList() const;
+ FormWindow *formWindow() const;
+ EventList *eventList() const;
+
+ QString currentProperty() const;
+ QString classOfCurrentProperty() const;
+ QMetaObject* metaObjectOfCurrentProperty() const;
+
+ void resetFocus();
+
+ void setPropertyEditorEnabled( bool b );
+ void setSignalHandlersEnabled( bool b );
+
+signals:
+ void hidden();
+
+public slots:
+ void setWidget( QObject *w, FormWindow *fw );
+
+protected:
+ void closeEvent( QCloseEvent *e );
+
+private:
+ void updateWindow();
+
+private:
+ QObject *wid;
+ PropertyList *listview;
+ EventList *eList;
+ FormWindow *formwindow;
+
+};
+
+class PropertyDateItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyDateItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName );
+ ~PropertyDateItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+private slots:
+ void setValue();
+
+private:
+ QDateEdit *lined();
+ QGuardedPtr<QDateEdit> lin;
+
+};
+
+class PropertyTimeItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyTimeItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName );
+ ~PropertyTimeItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+private slots:
+ void setValue();
+
+private:
+ QTimeEdit *lined();
+ QGuardedPtr<QTimeEdit> lin;
+
+};
+
+class PropertyDateTimeItem : public QObject,
+ public PropertyItem
+{
+ Q_OBJECT
+
+public:
+ PropertyDateTimeItem( PropertyList *l, PropertyItem *after, PropertyItem *prop, const QString &propName );
+ ~PropertyDateTimeItem();
+
+ virtual void showEditor();
+ virtual void hideEditor();
+
+ virtual void setValue( const QVariant &v );
+
+private slots:
+ void setValue();
+
+private:
+ QDateTimeEdit *lined();
+ QGuardedPtr<QDateTimeEdit> lin;
+
+};
+
+#endif
diff --git a/tools/designer/designer/propertyobject.cpp b/tools/designer/designer/propertyobject.cpp
new file mode 100644
index 0000000..72ccdb0
--- /dev/null
+++ b/tools/designer/designer/propertyobject.cpp
@@ -0,0 +1,165 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "propertyobject.h"
+#include "metadatabase.h"
+#include <qptrvector.h>
+#include <qptrlist.h>
+#include <qmetaobject.h>
+#include <qvariant.h>
+
+PropertyObject::PropertyObject( const QWidgetList &objs )
+ : QObject(), objects( objs ), mobj( 0 )
+{
+ QPtrVector<QPtrList<QMetaObject> > v;
+ v.resize( objects.count() );
+ v.setAutoDelete( TRUE );
+
+ for ( QObject *o = objects.first(); o; o = objects.next() ) {
+ const QMetaObject *m = o->metaObject();
+ QPtrList<QMetaObject> *mol = new QPtrList<QMetaObject>;
+ while ( m ) {
+ mol->insert( 0, m );
+ m = m->superClass();
+ }
+ v.insert( v.count(), mol );
+ }
+
+ int numObjects = objects.count();
+ int minDepth = v[0]->count();
+ int depth = minDepth;
+
+ for ( int i = 0; i < numObjects; ++i ) {
+ depth = (int)v[i]->count();
+ if ( depth < minDepth )
+ minDepth = depth;
+ }
+
+ const QMetaObject *m = v[0]->at( --minDepth );
+
+ for ( int j = 0; j < numObjects; ++j ) {
+ if ( v[j]->at( minDepth ) != m ) {
+ m = v[0]->at( --minDepth );
+ j = 0;
+ }
+ }
+
+ mobj = m;
+
+ Q_ASSERT( mobj );
+}
+
+bool PropertyObject::setProperty( const char *name, const QVariant& value )
+{
+ for ( QObject *o = objects.first(); o; o = objects.next() )
+ o->setProperty( name, value );
+
+ return TRUE;
+}
+
+QVariant PropertyObject::property( const char *name ) const
+{
+ return ( (PropertyObject*)this )->objects.first()->property( name );
+}
+
+void PropertyObject::mdPropertyChanged( const QString &property, bool changed )
+{
+ for ( QObject *o = objects.first(); o; o = objects.next() )
+ MetaDataBase::setPropertyChanged( o, property, changed );
+}
+
+bool PropertyObject::mdIsPropertyChanged( const QString &property )
+{
+ for ( QObject *o = objects.first(); o; o = objects.next() ) {
+ if ( MetaDataBase::isPropertyChanged( o, property ) )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void PropertyObject::mdSetPropertyComment( const QString &property, const QString &comment )
+{
+ for ( QObject *o = objects.first(); o; o = objects.next() )
+ MetaDataBase::setPropertyComment( o, property, comment );
+}
+
+QString PropertyObject::mdPropertyComment( const QString &property )
+{
+ return MetaDataBase::propertyComment( objects.first(), property );
+}
+
+void PropertyObject::mdSetFakeProperty( const QString &property, const QVariant &value )
+{
+ for ( QObject *o = objects.first(); o; o = objects.next() )
+ MetaDataBase::setFakeProperty( o, property, value );
+}
+
+QVariant PropertyObject::mdFakeProperty( const QString &property )
+{
+ return MetaDataBase::fakeProperty( objects.first(), property );
+}
+
+void PropertyObject::mdSetCursor( const QCursor &c )
+{
+ for ( QObject *o = objects.first(); o; o = objects.next() ) {
+ if ( o->isWidgetType() )
+ MetaDataBase::setCursor( (QWidget*)o, c );
+ }
+}
+
+QCursor PropertyObject::mdCursor()
+{
+ return MetaDataBase::cursor( objects.first() );
+}
+
+void PropertyObject::mdSetPixmapKey( int pixmap, const QString &arg )
+{
+ for ( QObject *o = objects.first(); o; o = objects.next() )
+ MetaDataBase::setPixmapKey( o, pixmap, arg );
+}
+
+QString PropertyObject::mdPixmapKey( int pixmap )
+{
+ return MetaDataBase::pixmapKey( objects.first(), pixmap );
+}
+
+void PropertyObject::mdSetExportMacro( const QString &macro )
+{
+ for ( QObject *o = objects.first(); o; o = objects.next() )
+ MetaDataBase::setExportMacro( o, macro );
+}
+
+QString PropertyObject::mdExportMacro()
+{
+ return MetaDataBase::exportMacro( objects.first() );
+}
diff --git a/tools/designer/designer/propertyobject.h b/tools/designer/designer/propertyobject.h
new file mode 100644
index 0000000..c844523
--- /dev/null
+++ b/tools/designer/designer/propertyobject.h
@@ -0,0 +1,43 @@
+#ifndef PROPERTYOBJECT_H
+#define PROPERTYOBJECT_H
+
+#include <qobject.h>
+#include <qwidgetlist.h>
+#include <qcursor.h>
+
+class PropertyObject : public QObject
+{
+public:
+ QMetaObject *metaObject() const { return (QMetaObject*)mobj; }
+ const char *className() const { return "PropertyObject"; }
+ QObject* qObject() { return (QObject*)this; }
+private:
+ static QMetaObject *metaObj;
+
+public:
+ PropertyObject( const QWidgetList &objs );
+
+ bool setProperty( const char *name, const QVariant& value );
+ QVariant property( const char *name ) const;
+
+ void mdPropertyChanged( const QString &property, bool changed );
+ bool mdIsPropertyChanged( const QString &property );
+ void mdSetPropertyComment( const QString &property, const QString &comment );
+ QString mdPropertyComment( const QString &property );
+ void mdSetFakeProperty( const QString &property, const QVariant &value );
+ QVariant mdFakeProperty( const QString &property );
+ void mdSetCursor( const QCursor &c );
+ QCursor mdCursor();
+ void mdSetPixmapKey( int pixmap, const QString &arg );
+ QString mdPixmapKey( int pixmap );
+ void mdSetExportMacro( const QString &macro );
+ QString mdExportMacro();
+ QWidgetList widgetList() const { return objects; }
+
+private:
+ QWidgetList objects;
+ const QMetaObject *mobj;
+
+};
+
+#endif
diff --git a/tools/designer/designer/qcompletionedit.cpp b/tools/designer/designer/qcompletionedit.cpp
new file mode 100644
index 0000000..a293135
--- /dev/null
+++ b/tools/designer/designer/qcompletionedit.cpp
@@ -0,0 +1,217 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "qcompletionedit.h"
+#include <qlistbox.h>
+#include <qsizegrip.h>
+#include <qapplication.h>
+#include <qvbox.h>
+
+QCompletionEdit::QCompletionEdit( QWidget *parent, const char *name )
+ : QLineEdit( parent, name ), aAdd( FALSE ), caseSensitive( FALSE )
+{
+ popup = new QVBox( 0, 0, WType_Popup );
+ popup->setFrameStyle( QFrame::Box | QFrame::Plain );
+ popup->setLineWidth( 1 );
+ popup->hide();
+
+ listbox = new QListBox( popup );
+ listbox->setFrameStyle( QFrame::NoFrame );
+ listbox->setLineWidth( 1 );
+ listbox->installEventFilter( this );
+ listbox->setHScrollBarMode( QScrollView::AlwaysOn );
+ listbox->setVScrollBarMode( QScrollView::AlwaysOn );
+ listbox->setCornerWidget( new QSizeGrip( listbox, "completion sizegrip" ) );
+ connect( this, SIGNAL( textChanged( const QString & ) ),
+ this, SLOT( textDidChange( const QString & ) ) );
+ popup->setFocusProxy( listbox );
+ installEventFilter( this );
+}
+
+bool QCompletionEdit::autoAdd() const
+{
+ return aAdd;
+}
+
+QStringList QCompletionEdit::completionList() const
+{
+ return compList;
+}
+
+void QCompletionEdit::setCompletionList( const QStringList &l )
+{
+ compList = l;
+}
+
+void QCompletionEdit::setAutoAdd( bool add )
+{
+ aAdd = add;
+}
+
+void QCompletionEdit::textDidChange( const QString &text )
+{
+ if ( text.isEmpty() ) {
+ popup->close();
+ return;
+ }
+ updateListBox();
+ placeListBox();
+}
+
+void QCompletionEdit::placeListBox()
+{
+ if ( listbox->count() == 0 ) {
+ popup->close();
+ return;
+ }
+
+ popup->resize( QMAX( listbox->sizeHint().width() + listbox->verticalScrollBar()->width() + 4, width() ),
+ listbox->sizeHint().height() + listbox->horizontalScrollBar()->height() + 4 );
+
+ QPoint p( mapToGlobal( QPoint( 0, 0 ) ) );
+ if ( p.y() + height() + popup->height() <= QApplication::desktop()->height() )
+ popup->move( p.x(), p.y() + height() );
+ else
+ popup->move( p.x(), p.y() - listbox->height() );
+ popup->show();
+ listbox->setCurrentItem( 0 );
+ listbox->setSelected( 0, TRUE );
+ setFocus();
+}
+
+void QCompletionEdit::updateListBox()
+{
+ listbox->clear();
+ if ( compList.isEmpty() )
+ return;
+ for ( QStringList::Iterator it = compList.begin(); it != compList.end(); ++it ) {
+ if ( caseSensitive && (*it).left( text().length() ) == text() ||
+ !caseSensitive && (*it).left( text().length() ).lower() == text().lower() )
+ listbox->insertItem( *it );
+ }
+}
+
+bool QCompletionEdit::eventFilter( QObject *o, QEvent *e )
+{
+ if ( o == popup || o == listbox || o == listbox->viewport() ) {
+ if ( e->type() == QEvent::KeyPress ) {
+ QKeyEvent *ke = (QKeyEvent*)e;
+ if ( ke->key() == Key_Enter || ke->key() == Key_Return || ke->key() == Key_Tab ) {
+ if ( ke->key() == Key_Tab && listbox->count() > 1 &&
+ listbox->currentItem() < (int)listbox->count() - 1 ) {
+ listbox->setCurrentItem( listbox->currentItem() + 1 );
+ return TRUE;
+ }
+ popup->close();
+ setFocus();
+ blockSignals( TRUE );
+ setText( listbox->currentText() );
+ blockSignals( FALSE );
+ emit chosen( text() );
+ return TRUE;
+ } else if ( ke->key() == Key_Left || ke->key() == Key_Right ||
+ ke->key() == Key_Up || ke->key() == Key_Down ||
+ ke->key() == Key_Home || ke->key() == Key_End ||
+ ke->key() == Key_Prior || ke->key() == Key_Next ) {
+ return FALSE;
+ } else if ( ke->key() == Key_Escape ) {
+ popup->close();
+ setFocus();
+ } else if ( ke->key() != Key_Shift && ke->key() != Key_Control &&
+ ke->key() != Key_Alt ) {
+ updateListBox();
+ if ( listbox->count() == 0 || text().length() == 0 ) {
+ popup->close();
+ setFocus();
+ }
+ QApplication::sendEvent( this, e );
+ return TRUE;
+ }
+ } else if ( e->type() == QEvent::MouseButtonDblClick ) {
+ popup->close();
+ setFocus();
+ blockSignals( TRUE );
+ setText( listbox->currentText() );
+ blockSignals( FALSE );
+ emit chosen( text() );
+ return TRUE;
+ }
+ } else if ( o == this ) {
+ if ( e->type() == QEvent::KeyPress ) {
+ QKeyEvent *ke = (QKeyEvent*)e;
+ if ( ke->key() == Key_Up ||
+ ke->key() == Key_Down ||
+ ke->key() == Key_Prior ||
+ ke->key() == Key_Next ||
+ ke->key() == Key_Return ||
+ ke->key() == Key_Enter ||
+ ke->key() == Key_Tab ||
+ ke->key() == Key_Escape ) {
+ QApplication::sendEvent( listbox, e );
+ return TRUE;
+ }
+ }
+ }
+ return QLineEdit::eventFilter( o, e );
+}
+
+void QCompletionEdit::addCompletionEntry( const QString &entry )
+{
+ if ( compList.find( entry ) == compList.end() ) {
+ compList << entry;
+ compList.sort();
+ }
+}
+
+void QCompletionEdit::removeCompletionEntry( const QString &entry )
+{
+ QStringList::Iterator it = compList.find( entry );
+ if ( it != compList.end() )
+ compList.remove( it );
+}
+
+void QCompletionEdit::setCaseSensitive( bool b )
+{
+ caseSensitive = b;
+}
+
+bool QCompletionEdit::isCaseSensitive() const
+{
+ return caseSensitive;
+}
+
+void QCompletionEdit::clear()
+{
+ QLineEdit::clear();
+ compList.clear();
+}
diff --git a/tools/designer/designer/qcompletionedit.h b/tools/designer/designer/qcompletionedit.h
new file mode 100644
index 0000000..514a7f5
--- /dev/null
+++ b/tools/designer/designer/qcompletionedit.h
@@ -0,0 +1,86 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef QCOMPLETIONEDIT_H
+#define QCOMPLETIONEDIT_H
+
+#include <qlineedit.h>
+#include <qstringlist.h>
+
+class QListBox;
+class QVBox;
+
+class QCompletionEdit : public QLineEdit
+{
+ Q_OBJECT
+ Q_PROPERTY( bool autoAdd READ autoAdd WRITE setAutoAdd )
+ Q_PROPERTY( bool caseSensitive READ isCaseSensitive WRITE setCaseSensitive )
+
+public:
+ QCompletionEdit( QWidget *parent = 0, const char *name = 0 );
+
+ bool autoAdd() const;
+ QStringList completionList() const;
+ bool eventFilter( QObject *o, QEvent *e );
+ bool isCaseSensitive() const;
+
+public slots:
+ void setCompletionList( const QStringList &l );
+ void setAutoAdd( bool add );
+ void clear();
+ void addCompletionEntry( const QString &entry );
+ void removeCompletionEntry( const QString &entry );
+ void setCaseSensitive( bool b );
+
+signals:
+ void chosen( const QString &text );
+
+private slots:
+ void textDidChange( const QString &text );
+
+private:
+ void placeListBox();
+ void updateListBox();
+
+private:
+ bool aAdd;
+ QStringList compList;
+ QListBox *listbox;
+ QVBox *popup;
+ bool caseSensitive;
+
+};
+
+
+
+#endif
diff --git a/tools/designer/designer/replacedialog.ui b/tools/designer/designer/replacedialog.ui
new file mode 100644
index 0000000..0be991c
--- /dev/null
+++ b/tools/designer/designer/replacedialog.ui
@@ -0,0 +1,325 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ReplaceDialog</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ReplaceDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>286</width>
+ <height>217</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Replace Text</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>R&amp;eplace</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboReplace</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Find</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboFind</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>comboFind</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>comboReplace</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonReplace</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Replace</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonReplaceAll</cstring>
+ </property>
+ <property name="text">
+ <string>Replace &amp;All</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="0">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkWords</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Whole words only</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkCase</cstring>
+ </property>
+ <property name="text">
+ <string>Case &amp;sensitive</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBegin</cstring>
+ </property>
+ <property name="text">
+ <string>Start at &amp;Beginning</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="1">
+ <property name="name">
+ <cstring>ButtonGroup2</cstring>
+ </property>
+ <property name="title">
+ <string>Direction</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioForward</cstring>
+ </property>
+ <property name="text">
+ <string>Forwar&amp;d</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioBackward</cstring>
+ </property>
+ <property name="text">
+ <string>Bac&amp;kward</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonReplace</sender>
+ <signal>clicked()</signal>
+ <receiver>ReplaceDialog</receiver>
+ <slot>doReplace()</slot>
+ </connection>
+ <connection>
+ <sender>buttonReplaceAll</sender>
+ <signal>clicked()</signal>
+ <receiver>ReplaceDialog</receiver>
+ <slot>doReplaceAll()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>ReplaceDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>comboFind</tabstop>
+ <tabstop>comboReplace</tabstop>
+ <tabstop>checkWords</tabstop>
+ <tabstop>checkCase</tabstop>
+ <tabstop>checkBegin</tabstop>
+ <tabstop>radioForward</tabstop>
+ <tabstop>radioBackward</tabstop>
+ <tabstop>buttonReplace</tabstop>
+ <tabstop>buttonReplaceAll</tabstop>
+ <tabstop>PushButton2</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">../interfaces/editorinterface.h</include>
+ <include location="global" impldecl="in implementation">qlineedit.h</include>
+ <include location="local" impldecl="in implementation">replacedialog.ui.h</include>
+</includes>
+<forwards>
+ <forward>struct EditorInterface;</forward>
+</forwards>
+<variables>
+ <variable>EditorInterface *editor;</variable>
+ <variable>QObject *formWindow;</variable>
+</variables>
+<slots>
+ <slot>init()</slot>
+ <slot>destroy()</slot>
+ <slot>doReplace()</slot>
+ <slot>doReplaceAll()</slot>
+ <slot>setEditor( EditorInterface * e, QObject * fw )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/replacedialog.ui.h b/tools/designer/designer/replacedialog.ui.h
new file mode 100644
index 0000000..77ed9cc
--- /dev/null
+++ b/tools/designer/designer/replacedialog.ui.h
@@ -0,0 +1,82 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+
+void ReplaceDialog::init()
+{
+ editor = 0;
+ formWindow = 0;
+}
+
+void ReplaceDialog::destroy()
+{
+ if ( editor )
+ editor->release();
+ editor = 0;
+ formWindow = 0;
+}
+
+void ReplaceDialog::doReplace()
+{
+ if ( !editor )
+ return;
+
+ if ( !editor->replace( comboFind->currentText(), comboReplace->currentText(), checkCase->isChecked(),
+ checkWords->isChecked(), radioForward->isChecked(), !checkBegin->isChecked(), FALSE ) )
+ checkBegin->setChecked( TRUE );
+ else
+ checkBegin->setChecked( FALSE );
+}
+
+void ReplaceDialog::doReplaceAll()
+{
+ if ( !editor )
+ return;
+
+ if ( !editor->replace( comboFind->currentText(), comboReplace->currentText(), checkCase->isChecked(),
+ checkWords->isChecked(), radioForward->isChecked(), !checkBegin->isChecked(), TRUE ) )
+ checkBegin->setChecked( TRUE );
+ else
+ checkBegin->setChecked( FALSE );
+}
+
+void ReplaceDialog::setEditor( EditorInterface * e, QObject * fw )
+{
+ if ( fw != formWindow )
+ checkBegin->setChecked( TRUE );
+ formWindow = fw;
+ if ( editor )
+ editor->release();
+ editor = e;
+ editor->addRef();
+}
diff --git a/tools/designer/designer/resource.cpp b/tools/designer/designer/resource.cpp
new file mode 100644
index 0000000..257f4e6
--- /dev/null
+++ b/tools/designer/designer/resource.cpp
@@ -0,0 +1,3359 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "actiondnd.h"
+#include "command.h"
+#ifndef QT_NO_SQL
+#include "database.h"
+#endif
+#include "formfile.h"
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "menubareditor.h"
+#include "metadatabase.h"
+#include "pixmapcollection.h"
+#include "popupmenueditor.h"
+#include "project.h"
+#include "resource.h"
+#include "widgetfactory.h"
+
+#include <domtool.h>
+#include <widgetdatabase.h>
+
+#include <qaccel.h>
+#include <qapplication.h>
+#include <qbuffer.h>
+#include <qcombobox.h>
+#include <qdatetime.h>
+#include <qdom.h>
+#include <qfeatures.h>
+#include <qfile.h>
+#include <qheader.h>
+#include <qiconview.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qlistview.h>
+#include <qmenudata.h>
+#include <qmessagebox.h>
+#include <qmetaobject.h>
+#include <qobject.h>
+#include <qobjectlist.h>
+#include <qtabbar.h>
+#ifndef QT_NO_TABLE
+#include <qtable.h>
+#include <qdatatable.h>
+#endif
+#include <qtabwidget.h>
+#include <qtabwidget.h>
+#include <qtextcodec.h>
+#include <qtextstream.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+#include <qwizard.h>
+#include <qworkspace.h>
+#include <qworkspace.h>
+#include <qsplitter.h>
+#include <private/qucom_p.h>
+
+static QString makeIndent( int indent )
+{
+ QString s;
+ s.fill( ' ', indent * 4 );
+ return s;
+}
+
+static QString entitize( const QString &s, bool attribute = FALSE )
+{
+ QString s2 = s;
+ s2 = s2.replace( "&", "&amp;" );
+ s2 = s2.replace( ">", "&gt;" );
+ s2 = s2.replace( "<", "&lt;" );
+ if ( attribute ) {
+ s2 = s2.replace( "\"", "&quot;" );
+ s2 = s2.replace( "'", "&apos;" );
+ }
+ return s2;
+}
+
+#ifdef Q_WS_MACX
+static struct {
+ int key;
+ const char* name;
+} keyname[] = {
+ { Qt::Key_Space, QT_TRANSLATE_NOOP( "QAccel", "Space" ) },
+ { Qt::Key_Escape, QT_TRANSLATE_NOOP( "QAccel", "Esc" ) },
+ { Qt::Key_Tab, QT_TRANSLATE_NOOP( "QAccel", "Tab" ) },
+ { Qt::Key_Backtab, QT_TRANSLATE_NOOP( "QAccel", "Backtab" ) },
+ { Qt::Key_Backspace, QT_TRANSLATE_NOOP( "QAccel", "Backspace" ) },
+ { Qt::Key_Return, QT_TRANSLATE_NOOP( "QAccel", "Return" ) },
+ { Qt::Key_Enter, QT_TRANSLATE_NOOP( "QAccel", "Enter" ) },
+ { Qt::Key_Insert, QT_TRANSLATE_NOOP( "QAccel", "Ins" ) },
+ { Qt::Key_Delete, QT_TRANSLATE_NOOP( "QAccel", "Del" ) },
+ { Qt::Key_Pause, QT_TRANSLATE_NOOP( "QAccel", "Pause" ) },
+ { Qt::Key_Print, QT_TRANSLATE_NOOP( "QAccel", "Print" ) },
+ { Qt::Key_SysReq, QT_TRANSLATE_NOOP( "QAccel", "SysReq" ) },
+ { Qt::Key_Home, QT_TRANSLATE_NOOP( "QAccel", "Home" ) },
+ { Qt::Key_End, QT_TRANSLATE_NOOP( "QAccel", "End" ) },
+ { Qt::Key_Left, QT_TRANSLATE_NOOP( "QAccel", "Left" ) },
+ { Qt::Key_Up, QT_TRANSLATE_NOOP( "QAccel", "Up" ) },
+ { Qt::Key_Right, QT_TRANSLATE_NOOP( "QAccel", "Right" ) },
+ { Qt::Key_Down, QT_TRANSLATE_NOOP( "QAccel", "Down" ) },
+ { Qt::Key_Prior, QT_TRANSLATE_NOOP( "QAccel", "PgUp" ) },
+ { Qt::Key_Next, QT_TRANSLATE_NOOP( "QAccel", "PgDown" ) },
+ { Qt::Key_CapsLock, QT_TRANSLATE_NOOP( "QAccel", "CapsLock" ) },
+ { Qt::Key_NumLock, QT_TRANSLATE_NOOP( "QAccel", "NumLock" ) },
+ { Qt::Key_ScrollLock, QT_TRANSLATE_NOOP( "QAccel", "ScrollLock" ) },
+ { Qt::Key_Menu, QT_TRANSLATE_NOOP( "QAccel", "Menu" ) },
+ { Qt::Key_Help, QT_TRANSLATE_NOOP( "QAccel", "Help" ) },
+
+ // Multimedia keys
+ { Qt::Key_Back, QT_TRANSLATE_NOOP( "QAccel", "Back" ) },
+ { Qt::Key_Forward, QT_TRANSLATE_NOOP( "QAccel", "Forward" ) },
+ { Qt::Key_Stop, QT_TRANSLATE_NOOP( "QAccel", "Stop" ) },
+ { Qt::Key_Refresh, QT_TRANSLATE_NOOP( "QAccel", "Refresh" ) },
+ { Qt::Key_VolumeDown, QT_TRANSLATE_NOOP( "QAccel", "Volume Down" ) },
+ { Qt::Key_VolumeMute, QT_TRANSLATE_NOOP( "QAccel", "Volume Mute" ) },
+ { Qt::Key_VolumeUp, QT_TRANSLATE_NOOP( "QAccel", "Volume Up" ) },
+ { Qt::Key_BassBoost, QT_TRANSLATE_NOOP( "QAccel", "Bass Boost" ) },
+ { Qt::Key_BassUp, QT_TRANSLATE_NOOP( "QAccel", "Bass Up" ) },
+ { Qt::Key_BassDown, QT_TRANSLATE_NOOP( "QAccel", "Bass Down" ) },
+ { Qt::Key_TrebleUp, QT_TRANSLATE_NOOP( "QAccel", "Treble Up" ) },
+ { Qt::Key_TrebleDown, QT_TRANSLATE_NOOP( "QAccel", "Treble Down" ) },
+ { Qt::Key_MediaPlay, QT_TRANSLATE_NOOP( "QAccel", "Media Play" ) },
+ { Qt::Key_MediaStop, QT_TRANSLATE_NOOP( "QAccel", "Media Stop" ) },
+ { Qt::Key_MediaPrev, QT_TRANSLATE_NOOP( "QAccel", "Media Previous" ) },
+ { Qt::Key_MediaNext, QT_TRANSLATE_NOOP( "QAccel", "Media Next" ) },
+ { Qt::Key_MediaRecord, QT_TRANSLATE_NOOP( "QAccel", "Media Record" ) },
+ { Qt::Key_HomePage, QT_TRANSLATE_NOOP( "QAccel", "Home" ) },
+ { Qt::Key_Favorites, QT_TRANSLATE_NOOP( "QAccel", "Favorites" ) },
+ { Qt::Key_Search, QT_TRANSLATE_NOOP( "QAccel", "Search" ) },
+ { Qt::Key_Standby, QT_TRANSLATE_NOOP( "QAccel", "Standby" ) },
+ { Qt::Key_OpenUrl, QT_TRANSLATE_NOOP( "QAccel", "Open URL" ) },
+ { Qt::Key_LaunchMail, QT_TRANSLATE_NOOP( "QAccel", "Launch Mail" ) },
+ { Qt::Key_LaunchMedia, QT_TRANSLATE_NOOP( "QAccel", "Launch Media" ) },
+ { Qt::Key_Launch0, QT_TRANSLATE_NOOP( "QAccel", "Launch (0)" ) },
+ { Qt::Key_Launch1, QT_TRANSLATE_NOOP( "QAccel", "Launch (1)" ) },
+ { Qt::Key_Launch2, QT_TRANSLATE_NOOP( "QAccel", "Launch (2)" ) },
+ { Qt::Key_Launch3, QT_TRANSLATE_NOOP( "QAccel", "Launch (3)" ) },
+ { Qt::Key_Launch4, QT_TRANSLATE_NOOP( "QAccel", "Launch (4)" ) },
+ { Qt::Key_Launch5, QT_TRANSLATE_NOOP( "QAccel", "Launch (5)" ) },
+ { Qt::Key_Launch6, QT_TRANSLATE_NOOP( "QAccel", "Launch (6)" ) },
+ { Qt::Key_Launch7, QT_TRANSLATE_NOOP( "QAccel", "Launch (7)" ) },
+ { Qt::Key_Launch8, QT_TRANSLATE_NOOP( "QAccel", "Launch (8)" ) },
+ { Qt::Key_Launch9, QT_TRANSLATE_NOOP( "QAccel", "Launch (9)" ) },
+ { Qt::Key_LaunchA, QT_TRANSLATE_NOOP( "QAccel", "Launch (A)" ) },
+ { Qt::Key_LaunchB, QT_TRANSLATE_NOOP( "QAccel", "Launch (B)" ) },
+ { Qt::Key_LaunchC, QT_TRANSLATE_NOOP( "QAccel", "Launch (C)" ) },
+ { Qt::Key_LaunchD, QT_TRANSLATE_NOOP( "QAccel", "Launch (D)" ) },
+ { Qt::Key_LaunchE, QT_TRANSLATE_NOOP( "QAccel", "Launch (E)" ) },
+ { Qt::Key_LaunchF, QT_TRANSLATE_NOOP( "QAccel", "Launch (F)" ) },
+
+ // --------------------------------------------------------------
+ // More consistent namings
+ { Qt::Key_Print, QT_TRANSLATE_NOOP( "QAccel", "Print Screen" ) },
+ { Qt::Key_Prior, QT_TRANSLATE_NOOP( "QAccel", "Page Up" ) },
+ { Qt::Key_Next, QT_TRANSLATE_NOOP( "QAccel", "Page Down" ) },
+ { Qt::Key_CapsLock, QT_TRANSLATE_NOOP( "QAccel", "Caps Lock" ) },
+ { Qt::Key_NumLock, QT_TRANSLATE_NOOP( "QAccel", "Num Lock" ) },
+ { Qt::Key_NumLock, QT_TRANSLATE_NOOP( "QAccel", "Number Lock" ) },
+ { Qt::Key_ScrollLock, QT_TRANSLATE_NOOP( "QAccel", "Scroll Lock" ) },
+ { Qt::Key_Insert, QT_TRANSLATE_NOOP( "QAccel", "Insert" ) },
+ { Qt::Key_Delete, QT_TRANSLATE_NOOP( "QAccel", "Delete" ) },
+ { Qt::Key_Escape, QT_TRANSLATE_NOOP( "QAccel", "Escape" ) },
+ { Qt::Key_SysReq, QT_TRANSLATE_NOOP( "QAccel", "System Request" ) },
+
+ { 0, 0 }
+};
+#endif
+static QString platformNeutralKeySequence(const QKeySequence &ks)
+{
+#ifndef Q_WS_MACX
+ return QString(ks);
+#else
+ uint k;
+ QString str;
+ QString p;
+ for (k = 0; k < ks.count(); ++k) {
+ int keycombo = ks[k];
+ int basekey = keycombo & ~(Qt::SHIFT | Qt::CTRL | Qt::ALT | Qt::META);
+ if (keycombo & Qt::CTRL)
+ str += "Ctrl+";
+ if (keycombo & Qt::ALT)
+ str += "Alt+";
+ if (keycombo & Qt::META)
+ str += "Meta+";
+ if (keycombo & Qt::SHIFT)
+ str += "Shift+";
+
+ // begin copy and paste from QKeySequence :(
+ if (basekey & Qt::UNICODE_ACCEL) {
+ // Note: This character should NOT be upper()'ed, since
+ // the encoded string should indicate EXACTLY what the
+ // key represents! Hence a 'Ctrl+Shift+c' is posible to
+ // represent, but is clearly impossible to trigger...
+ p = QChar(basekey & 0xffff);
+ } else if ( basekey >= Qt::Key_F1 && basekey <= Qt::Key_F35 ) {
+ p = QAccel::tr( "F%1" ).arg(basekey - Qt::Key_F1 + 1);
+ } else if ( basekey > Qt::Key_Space && basekey <= Qt::Key_AsciiTilde ) {
+ p.sprintf( "%c", basekey );
+ } else {
+ int i = 0;
+ while (keyname[i].name) {
+ if (basekey == keyname[i].key) {
+ p = QAccel::tr(keyname[i].name);
+ break;
+ }
+ ++i;
+ }
+ // If we can't find the actual translatable keyname,
+ // fall back on the unicode representation of it...
+ // Or else characters like Key_aring may not get displayed
+ // ( Really depends on you locale )
+ if ( !keyname[i].name )
+ // Note: This character should NOT be upper()'ed, see above!
+ p = QChar(basekey & 0xffff);
+ }
+ // end copy...
+ str += p + ", ";
+ }
+ str.truncate(str.length() - 2);
+ return str;
+#endif
+}
+
+static QString mkBool( bool b )
+{
+ return b? "true" : "false";
+}
+
+/*!
+ \class Resource resource.h
+ \brief Class for saving/loading, etc. forms
+
+ This class is used for saving and loading forms, code generation,
+ transferring data of widgets over the clipboard, etc..
+
+*/
+
+
+Resource::Resource()
+{
+ mainwindow = 0;
+ formwindow = 0;
+ toplevel = 0;
+ copying = FALSE;
+ pasting = FALSE;
+ hadGeometry = FALSE;
+ langIface = 0;
+ hasFunctions = FALSE;
+}
+
+Resource::Resource( MainWindow* mw )
+ : mainwindow( mw )
+{
+ formwindow = 0;
+ toplevel = 0;
+ copying = FALSE;
+ pasting = FALSE;
+ hadGeometry = FALSE;
+ langIface = 0;
+ hasFunctions = FALSE;
+}
+
+Resource::~Resource()
+{
+ if ( langIface )
+ langIface->release();
+}
+
+void Resource::setWidget( FormWindow *w )
+{
+ formwindow = w;
+ toplevel = w;
+}
+
+QWidget *Resource::widget() const
+{
+ return toplevel;
+}
+
+bool Resource::load( FormFile *ff, Project *defProject )
+{
+ if ( !ff || ff->absFileName().isEmpty() )
+ return FALSE;
+ currFileName = ff->absFileName();
+ mainContainerSet = FALSE;
+
+ QFile f( ff->absFileName() );
+ f.open( IO_ReadOnly | IO_Translate );
+
+ bool b = load( ff, &f, defProject );
+ f.close();
+
+ return b;
+}
+
+#undef signals
+#undef slots
+
+bool Resource::load( FormFile *ff, QIODevice* dev, Project *defProject )
+{
+ QDomDocument doc;
+ QString errMsg;
+ int errLine;
+ if ( !doc.setContent( dev, &errMsg, &errLine ) ) {
+ return FALSE;
+ }
+
+ DomTool::fixDocument( doc );
+
+ QWidget *p = mainwindow ? mainwindow->qWorkspace() : 0;
+ toplevel = formwindow = new FormWindow( ff, p, 0 );
+ if ( defProject )
+ formwindow->setProject( defProject );
+ else if ( MainWindow::self )
+ formwindow->setProject( MainWindow::self->currProject() );
+ if ( mainwindow )
+ formwindow->setMainWindow( mainwindow );
+ MetaDataBase::addEntry( formwindow );
+
+ if ( !langIface ) {
+ QString lang = "Qt Script";
+ if ( mainwindow )
+ lang = mainwindow->currProject()->language();
+ langIface = MetaDataBase::languageInterface( lang );
+ if ( langIface )
+ langIface->addRef();
+ }
+
+ uiFileVersion = doc.firstChild().toElement().attribute("version");
+ QDomElement e = doc.firstChild().toElement().firstChild().toElement();
+
+ QDomElement forwards = e;
+ while ( forwards.tagName() != "forwards" && !forwards.isNull() )
+ forwards = forwards.nextSibling().toElement();
+
+ QDomElement includes = e;
+ while ( includes.tagName() != "includes" && !includes.isNull() )
+ includes = includes.nextSibling().toElement();
+
+ QDomElement variables = e;
+ while ( variables.tagName() != "variables" && !variables.isNull() )
+ variables = variables.nextSibling().toElement();
+
+ QDomElement signals = e;
+ while ( signals.tagName() != "signals" && !signals.isNull() )
+ signals = signals.nextSibling().toElement();
+
+ QDomElement slots = e;
+ while ( slots.tagName() != "slots" && !slots.isNull() )
+ slots = slots.nextSibling().toElement();
+
+ QDomElement functions = e;
+ while ( functions.tagName() != "functions" && !functions.isNull() )
+ functions = functions.nextSibling().toElement();
+
+ QDomElement connections = e;
+ while ( connections.tagName() != "connections" && !connections.isNull() )
+ connections = connections.nextSibling().toElement();
+
+ QDomElement imageCollection = e;
+ images.clear();
+ while ( imageCollection.tagName() != "images" && !imageCollection.isNull() )
+ imageCollection = imageCollection.nextSibling().toElement();
+
+ QDomElement customWidgets = e;
+ while ( customWidgets.tagName() != "customwidgets" && !customWidgets.isNull() )
+ customWidgets = customWidgets.nextSibling().toElement();
+
+ QDomElement tabOrder = e;
+ while ( tabOrder.tagName() != "tabstops" && !tabOrder.isNull() )
+ tabOrder = tabOrder.nextSibling().toElement();
+
+ QDomElement actions = e;
+ while ( actions.tagName() != "actions" && !actions.isNull() )
+ actions = actions.nextSibling().toElement();
+
+ QDomElement toolbars = e;
+ while ( toolbars.tagName() != "toolbars" && !toolbars.isNull() )
+ toolbars = toolbars.nextSibling().toElement();
+
+ QDomElement menubar = e;
+ while ( menubar.tagName() != "menubar" && !menubar.isNull() )
+ menubar = menubar.nextSibling().toElement();
+
+ QDomElement widget;
+ while ( !e.isNull() ) {
+ if ( e.tagName() == "widget" ) {
+ widgets.clear();
+ widget = e;
+ } else if ( e.tagName() == "include" ) { // compatibility with 2.x
+ MetaDataBase::Include inc;
+ inc.location = "global";
+ if ( e.attribute( "location" ) == "local" )
+ inc.location = "local";
+ inc.implDecl = "in declaration";
+ if ( e.attribute( "impldecl" ) == "in implementation" )
+ inc.implDecl = "in implementation";
+ inc.header = e.firstChild().toText().data();
+ if ( inc.header.right( 5 ) != ".ui.h" ) {
+ metaIncludes.append( inc );
+ } else {
+ if ( formwindow->formFile() )
+ formwindow->formFile()->setCodeFileState( FormFile::Ok );
+ }
+ } else if ( e.tagName() == "comment" ) {
+ metaInfo.comment = e.firstChild().toText().data();
+ } else if ( e.tagName() == "forward" ) { // compatibility with old betas
+ metaForwards << e.firstChild().toText().data();
+ } else if ( e.tagName() == "variable" ) { // compatibility with old betas
+ MetaDataBase::Variable v;
+ v.varName = e.firstChild().toText().data();
+ v.varAccess = "protected";
+ metaVariables << v;
+ } else if ( e.tagName() == "author" ) {
+ metaInfo.author = e.firstChild().toText().data();
+ } else if ( e.tagName() == "class" ) {
+ metaInfo.className = e.firstChild().toText().data();
+ } else if ( e.tagName() == "pixmapfunction" ) {
+ if ( formwindow ) {
+ formwindow->setSavePixmapInline( FALSE );
+ formwindow->setSavePixmapInProject( FALSE );
+ formwindow->setPixmapLoaderFunction( e.firstChild().toText().data() );
+ }
+ } else if ( e.tagName() == "pixmapinproject" ) {
+ if ( formwindow ) {
+ formwindow->setSavePixmapInline( FALSE );
+ formwindow->setSavePixmapInProject( TRUE );
+ }
+ } else if ( e.tagName() == "exportmacro" ) {
+ exportMacro = e.firstChild().toText().data();
+ } else if ( e.tagName() == "layoutdefaults" ) {
+ formwindow->setLayoutDefaultSpacing( e.attribute( "spacing", QString::number( formwindow->layoutDefaultSpacing() ) ).toInt() );
+ formwindow->setLayoutDefaultMargin( e.attribute( "margin", QString::number( formwindow->layoutDefaultMargin() ) ).toInt() );
+ } else if ( e.tagName() == "layoutfunctions" ) {
+ formwindow->setSpacingFunction( e.attribute( "spacing" ) );
+ formwindow->setMarginFunction( e.attribute( "margin" ) );
+ if ( !formwindow->marginFunction().isEmpty() || !formwindow->spacingFunction().isEmpty() )
+ formwindow->hasLayoutFunctions( TRUE );
+ }
+
+ e = e.nextSibling().toElement();
+ }
+
+ if ( !imageCollection.isNull() )
+ loadImageCollection( imageCollection );
+ if ( !customWidgets.isNull() )
+ loadCustomWidgets( customWidgets, this );
+
+#if defined (QT_NON_COMMERCIAL)
+ bool previewMode = MainWindow::self ? MainWindow::self->isPreviewing() : FALSE;
+ QWidget *w = (QWidget*)createObject( widget, !previewMode ? (QWidget*)formwindow : MainWindow::self );
+ if ( !w )
+ return FALSE;
+ if ( previewMode )
+ w->reparent( MainWindow::self, Qt::WType_TopLevel, w->pos(), TRUE );
+#else
+ if ( !createObject( widget, formwindow) )
+ return FALSE;
+#endif
+
+ if ( !forwards.isNull() ) {
+ for ( QDomElement n = forwards.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() )
+ if ( n.tagName() == "forward" )
+ metaForwards << n.firstChild().toText().data();
+ }
+
+ if ( !includes.isNull() ) {
+ for ( QDomElement n = includes.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() )
+ if ( n.tagName() == "include" ) {
+ if ( n.tagName() == "include" ) {
+ MetaDataBase::Include inc;
+ inc.location = "global";
+ if ( n.attribute( "location" ) == "local" )
+ inc.location = "local";
+ inc.implDecl = "in declaration";
+ if ( n.attribute( "impldecl" ) == "in implementation" )
+ inc.implDecl = "in implementation";
+ inc.header = n.firstChild().toText().data();
+ if ( inc.header.right( 5 ) != ".ui.h" ) {
+ metaIncludes.append( inc );
+ } else {
+ if ( formwindow->formFile() )
+ formwindow->formFile()->setCodeFileState( FormFile::Ok );
+ }
+ }
+ }
+ }
+
+ if ( !variables.isNull() ) {
+ for ( QDomElement n = variables.firstChild().toElement(); !n.isNull();
+ n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "variable" ) {
+ MetaDataBase::Variable v;
+ v.varName = n.firstChild().toText().data();
+ v.varAccess = n.attribute( "access", "protected" );
+ if ( v.varAccess.isEmpty() )
+ v.varAccess = "protected";
+ metaVariables << v;
+ }
+ }
+ }
+ if ( !signals.isNull() ) {
+ for ( QDomElement n = signals.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() )
+ if ( n.tagName() == "signal" )
+ metaSignals << n.firstChild().toText().data();
+ }
+ if ( !slots.isNull() ) {
+ for ( QDomElement n = slots.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() )
+ if ( n.tagName() == "slot" ) {
+ MetaDataBase::Function function;
+ function.specifier = n.attribute( "specifier", "virtual" );
+ if ( function.specifier.isEmpty() )
+ function.specifier = "virtual";
+ function.access = n.attribute( "access", "public" );
+ if ( function.access.isEmpty() )
+ function.access = "public";
+ function.language = n.attribute( "language", "C++" );
+ function.returnType = n.attribute( "returnType", "void" );
+ if ( function.returnType.isEmpty() )
+ function.returnType = "void";
+ function.type = "slot";
+ function.function = n.firstChild().toText().data();
+ if ( !MetaDataBase::hasFunction( formwindow, function.function, TRUE ) )
+ MetaDataBase::addFunction( formwindow, function.function, function.specifier,
+ function.access, "slot", function.language, function.returnType );
+ else
+ MetaDataBase::changeFunctionAttributes( formwindow, function.function, function.function,
+ function.specifier, function.access,
+ "slot", function.language,
+ function.returnType );
+ }
+ }
+
+ if ( !functions.isNull() ) {
+ for ( QDomElement n = functions.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "function" ) {
+ MetaDataBase::Function function;
+ function.specifier = n.attribute( "specifier", "virtual" );
+ if ( function.specifier.isEmpty() )
+ function.specifier = "virtual";
+ function.access = n.attribute( "access", "public" );
+ if ( function.access.isEmpty() )
+ function.access = "public";
+ function.type = n.attribute( "type", "function" );
+ function.type = "function";
+ function.language = n.attribute( "language", "C++" );
+ function.returnType = n.attribute( "returnType", "void" );
+ if ( function.returnType.isEmpty() )
+ function.returnType = "void";
+ function.function = n.firstChild().toText().data();
+ if ( !MetaDataBase::hasFunction( formwindow, function.function, TRUE ) )
+ MetaDataBase::addFunction( formwindow, function.function, function.specifier,
+ function.access, function.type, function.language,
+ function.returnType );
+ else
+ MetaDataBase::changeFunctionAttributes( formwindow, function.function, function.function,
+ function.specifier, function.access,
+ function.type, function.language, function.returnType );
+ }
+ }
+ }
+
+ if ( !actions.isNull() )
+ loadActions( actions );
+ if ( !toolbars.isNull() )
+ loadToolBars( toolbars );
+ if ( !menubar.isNull() )
+ loadMenuBar( menubar );
+
+ if ( !connections.isNull() )
+ loadConnections( connections );
+
+ if ( !tabOrder.isNull() )
+ loadTabOrder( tabOrder );
+
+ if ( formwindow ) {
+ MetaDataBase::setIncludes( formwindow, metaIncludes );
+ MetaDataBase::setForwards( formwindow, metaForwards );
+ MetaDataBase::setVariables( formwindow, metaVariables );
+ MetaDataBase::setSignalList( formwindow, metaSignals );
+ metaInfo.classNameChanged = metaInfo.className != QString( formwindow->name() );
+ MetaDataBase::setMetaInfo( formwindow, metaInfo );
+ MetaDataBase::setExportMacro( formwindow->mainContainer(), exportMacro );
+ }
+
+ loadExtraSource( formwindow->formFile(), currFileName, langIface, hasFunctions );
+
+ if ( mainwindow && formwindow )
+ mainwindow->insertFormWindow( formwindow );
+
+ if ( formwindow ) {
+ formwindow->killAccels( formwindow );
+ if ( formwindow->layout() )
+ formwindow->layout()->activate();
+ if ( hadGeometry )
+ formwindow->resize( formwindow->size().expandedTo( formwindow->minimumSize().
+ expandedTo( formwindow->minimumSizeHint() ) ) );
+ else
+ formwindow->resize( formwindow->size().expandedTo( formwindow->sizeHint() ) );
+ }
+
+ return TRUE;
+}
+
+static bool saveCode( const QString &filename, const QString &code )
+{
+ QFile f( filename );
+ if ( f.open(IO_WriteOnly | IO_Translate) ) {
+ QTextStream ts( &f );
+ ts << code;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool Resource::save( const QString& filename, bool formCodeOnly )
+{
+ if ( !formwindow || filename.isEmpty() )
+ return FALSE;
+ if (!langIface) {
+ QString lang = "Qt Script";
+ if ( mainwindow )
+ lang = mainwindow->currProject()->language();
+ langIface = MetaDataBase::languageInterface( lang );
+ if ( langIface )
+ langIface->addRef();
+ }
+ if ( formCodeOnly && langIface ) {
+ if ( saveFormCode(formwindow->formFile(), langIface) )
+ return TRUE;
+ bool breakout = FALSE;
+ FormFile *ff = formwindow->formFile();
+ QString codeFile = ff->project()->makeAbsolute( ff->codeFile() );
+ QString filter = langIface->fileFilterList().join(";;");
+ while ( !breakout ) {
+ QString fn = QFileDialog::getSaveFileName( codeFile, filter );
+ breakout = fn.isEmpty();
+ if ( !breakout ) {
+ if ( saveCode(fn, ff->code()) )
+ return TRUE;
+ }
+ }
+ }
+ currFileName = filename;
+
+ QFile f( filename );
+ if ( !f.open( IO_WriteOnly | IO_Translate ) )
+ return FALSE;
+ bool b = save( &f );
+ f.close();
+ return b;
+}
+
+bool Resource::save( QIODevice* dev )
+{
+ if ( !formwindow )
+ return FALSE;
+
+ if ( !langIface ) {
+ QString lang = "C++";
+ if ( mainwindow )
+ lang = mainwindow->currProject()->language();
+ langIface = MetaDataBase::languageInterface( lang );
+ if ( langIface )
+ langIface->addRef();
+ }
+
+ QTextStream ts( dev );
+ ts.setCodec( QTextCodec::codecForName( "UTF-8" ) );
+
+ ts << "<!DOCTYPE UI><UI version=\"3.3\" stdsetdef=\"1\">" << endl;
+ saveMetaInfoBefore( ts, 0 );
+ saveObject( formwindow->mainContainer(), 0, ts, 0 );
+ if ( ::qt_cast<QMainWindow*>(formwindow->mainContainer()) ) {
+ saveMenuBar( (QMainWindow*)formwindow->mainContainer(), ts, 0 );
+ saveToolBars( (QMainWindow*)formwindow->mainContainer(), ts, 0 );
+ }
+ if ( !MetaDataBase::customWidgets()->isEmpty() && !usedCustomWidgets.isEmpty() )
+ saveCustomWidgets( ts, 0 );
+ if ( ::qt_cast<QMainWindow*>(formwindow->mainContainer()) )
+ saveActions( formwindow->actionList(), ts, 0 );
+ if ( !images.isEmpty() )
+ saveImageCollection( ts, 0 );
+ if ( !MetaDataBase::connections( formwindow ).isEmpty() ||
+ !MetaDataBase::slotList( formwindow ).isEmpty() )
+ saveConnections( ts, 0 );
+ saveTabOrder( ts, 0 );
+ saveMetaInfoAfter( ts, 0 );
+ saveIncludeHints( ts, 0 );
+ ts << "</UI>" << endl;
+ bool ok = saveFormCode( formwindow->formFile(), langIface );
+ images.clear();
+
+ return ok;
+}
+
+QString Resource::copy()
+{
+ if ( !formwindow )
+ return QString::null;
+
+ copying = TRUE;
+ QString s;
+ QTextOStream ts( &s );
+
+ ts << "<!DOCTYPE UI-SELECTION><UI-SELECTION>" << endl;
+ QWidgetList widgets = formwindow->selectedWidgets();
+ QWidgetList tmp( widgets );
+ for ( QWidget *w = widgets.first(); w; w = widgets.next() ) {
+ QWidget *p = w->parentWidget();
+ bool save = TRUE;
+ while ( p ) {
+ if ( tmp.findRef( p ) != -1 ) {
+ save = FALSE;
+ break;
+ }
+ p = p->parentWidget();
+ }
+ if ( save )
+ saveObject( w, 0, ts, 0 );
+ }
+ if ( !MetaDataBase::customWidgets()->isEmpty() && !usedCustomWidgets.isEmpty() )
+ saveCustomWidgets( ts, 0 );
+ if ( !images.isEmpty() )
+ saveImageCollection( ts, 0 );
+ ts << "</UI-SELECTION>" << endl;
+
+ return s;
+}
+
+
+void Resource::paste( const QString &cb, QWidget *parent )
+{
+ if ( !formwindow )
+ return;
+ mainContainerSet = TRUE;
+
+ pasting = TRUE;
+ QDomDocument doc;
+ QString errMsg;
+ int errLine;
+ doc.setContent( cb, &errMsg, &errLine );
+
+ QDomElement firstWidget = doc.firstChild().toElement().firstChild().toElement();
+
+ QDomElement imageCollection = firstWidget;
+ images.clear();
+ while ( imageCollection.tagName() != "images" && !imageCollection.isNull() )
+ imageCollection = imageCollection.nextSibling().toElement();
+
+ QDomElement customWidgets = firstWidget;
+ while ( customWidgets.tagName() != "customwidgets" && !customWidgets.isNull() )
+ customWidgets = customWidgets.nextSibling().toElement();
+
+ if ( !imageCollection.isNull() )
+ loadImageCollection( imageCollection );
+ if ( !customWidgets.isNull() )
+ loadCustomWidgets( customWidgets, this );
+
+ QWidgetList widgets;
+ formwindow->clearSelection( FALSE );
+ formwindow->setPropertyShowingBlocked( TRUE );
+ formwindow->clearSelection( FALSE );
+ while ( !firstWidget.isNull() ) {
+ if ( firstWidget.tagName() == "widget" ) {
+ QWidget *w = (QWidget*)createObject( firstWidget, parent, 0 );
+ if ( !w )
+ continue;
+ widgets.append( w );
+ int x = w->x() + formwindow->grid().x();
+ int y = w->y() + formwindow->grid().y();
+ if ( w->x() + w->width() > parent->width() )
+ x = QMAX( 0, parent->width() - w->width() );
+ if ( w->y() + w->height() > parent->height() )
+ y = QMAX( 0, parent->height() - w->height() );
+ if ( x != w->x() || y != w->y() )
+ w->move( x, y );
+ formwindow->selectWidget( w );
+ } else if ( firstWidget.tagName() == "spacer" ) {
+ QWidget *w = createSpacer( firstWidget, parent, 0, firstWidget.tagName() == "vspacer" ? Qt::Vertical : Qt::Horizontal );
+ if ( !w )
+ continue;
+ widgets.append( w );
+ int x = w->x() + formwindow->grid().x();
+ int y = w->y() + formwindow->grid().y();
+ if ( w->x() + w->width() > parent->width() )
+ x = QMAX( 0, parent->width() - w->width() );
+ if ( w->y() + w->height() > parent->height() )
+ y = QMAX( 0, parent->height() - w->height() );
+ if ( x != w->x() || y != w->y() )
+ w->move( x, y );
+ formwindow->selectWidget( w );
+ }
+ firstWidget = firstWidget.nextSibling().toElement();
+ }
+ formwindow->setPropertyShowingBlocked( FALSE );
+ formwindow->emitShowProperties();
+
+ PasteCommand *cmd = new PasteCommand( FormWindow::tr( "Paste" ), formwindow, widgets );
+ formwindow->commandHistory()->addCommand( cmd );
+}
+
+void Resource::saveObject( QObject *obj, QDesignerGridLayout* grid, QTextStream &ts, int indent )
+{
+ if ( obj && obj->isWidgetType() && ( (QWidget*)obj )->isHidden() )
+ return;
+ QString closeTag;
+ const char* className = WidgetFactory::classNameOf( obj );
+ int classID = WidgetDatabase::idFromClassName( className );
+ bool isPlugin = WidgetDatabase::isCustomPluginWidget( classID );
+ if ( obj->isWidgetType() ) {
+ if ( obj->isA("CustomWidget") || isPlugin ) {
+ usedCustomWidgets << QString( className );
+ includeHints << WidgetDatabase::includeFile( classID );
+ }
+
+ if ( obj != formwindow && !formwindow->widgets()->find( (QWidget*)obj ) )
+ return; // we don't know anything about this thing
+
+ QString attributes;
+ if ( grid ) {
+ QDesignerGridLayout::Item item = grid->items[ (QWidget*)obj ];
+ attributes += QString(" row=\"") + QString::number(item.row) + "\"";
+ attributes += QString(" column=\"") + QString::number(item.column) + "\"";
+ if ( item.rowspan * item.colspan != 1 ) {
+ attributes += QString(" rowspan=\"") + QString::number(item.rowspan) + "\"";
+ attributes += QString(" colspan=\"") + QString::number(item.colspan) + "\"";
+ }
+ }
+
+ if ( qstrcmp( className, "Spacer" ) == 0 ) {
+ closeTag = makeIndent( indent ) + "</spacer>\n";
+ ts << makeIndent( indent ) << "<spacer" << attributes << ">" << endl;
+ ++indent;
+ } else {
+ closeTag = makeIndent( indent ) + "</widget>\n";
+ ts << makeIndent( indent ) << "<widget class=\"" << className << "\"" << attributes << ">" << endl;
+ ++indent;
+ }
+ if ( WidgetFactory::hasItems(classID, obj) )
+ saveItems( obj, ts, indent );
+ saveObjectProperties( obj, ts, indent );
+ } else {
+ // test for other objects we created. Nothing so far.
+ return;
+ }
+
+ QDesignerWidgetStack* ws = 0;
+
+ if ( ::qt_cast<QTabWidget*>(obj) ) {
+ QTabWidget* tw = (QTabWidget*) obj;
+ QObjectList* tmpl = tw->queryList( "QWidgetStack" );
+ QWidgetStack *ws = (QWidgetStack*)tmpl->first();
+ QTabBar *tb = ( (QDesignerTabWidget*)obj )->tabBar();
+ for ( int i = 0; i < tb->count(); ++i ) {
+ QTab *t = tb->tabAt( i );
+ if ( !t )
+ continue;
+ QWidget *w = ws->widget( t->identifier() );
+ if ( !w )
+ continue;
+ if ( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf(w) ) == -1 )
+ continue; // we don't know this widget
+ ts << makeIndent( indent ) << "<widget class=\"QWidget\">" << endl;
+ ++indent;
+ ts << makeIndent( indent ) << "<property name=\"name\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() ) << "</cstring>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+
+ ts << makeIndent( indent ) << "<attribute name=\"title\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<string>" << entitize( t->text() ) << "</string>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</attribute>" << endl;
+ saveChildrenOf( w, ts, indent );
+ --indent;
+ ts << makeIndent( indent ) << "</widget>" << endl;
+ }
+ delete tmpl;
+ } else if ( (ws = ::qt_cast<QDesignerWidgetStack*>(obj)) != 0 ) {
+ for ( int i = 0; i < ws->count(); ++i ) {
+ QWidget *w = ws->page( i );
+ if ( !w )
+ continue;
+ if ( WidgetDatabase::idFromClassName(WidgetFactory::classNameOf(w)) == -1 )
+ continue; // we don't know this widget
+ ts << makeIndent( indent ) << "<widget class=\"QWidget\">" << endl;
+ ++indent;
+ ts << makeIndent( indent ) << "<property name=\"name\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() ) << "</cstring>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ ts << makeIndent( indent ) << "<attribute name=\"id\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<number>" << QString::number(i) << "</number>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</attribute>" << endl;
+ saveChildrenOf( w, ts, indent );
+ --indent;
+ ts << makeIndent( indent ) << "</widget>" << endl;
+ }
+ } else if ( ::qt_cast<QToolBox*>(obj) ) {
+ QToolBox* tb = (QToolBox*)obj;
+ for ( int i = 0; i < tb->count(); ++i ) {
+ QWidget *w = tb->item( i );
+ if ( !w )
+ continue;
+ if ( WidgetDatabase::idFromClassName(WidgetFactory::classNameOf(w)) == -1 )
+ continue; // we don't know this widget
+ ts << makeIndent( indent ) << "<widget class=\"QWidget\">" << endl;
+ ++indent;
+ ts << makeIndent( indent ) << "<property name=\"name\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() ) << "</cstring>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ ts << makeIndent( indent ) << "<property name=\"backgroundMode\">" << endl;
+ indent++;
+ saveEnumProperty( w, "backgroundMode", QVariant::Invalid, ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ ts << makeIndent( indent ) << "<attribute name=\"label\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<string>" << entitize( tb->itemLabel( tb->indexOf(w) ) ) << "</string>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</attribute>" << endl;
+ saveChildrenOf( w, ts, indent );
+ --indent;
+ ts << makeIndent( indent ) << "</widget>" << endl;
+ }
+ } else if ( ::qt_cast<QWizard*>(obj) ) {
+ QWizard* wiz = (QWizard*)obj;
+ for ( int i = 0; i < wiz->pageCount(); ++i ) {
+ QWidget *w = wiz->page( i );
+ if ( !w )
+ continue;
+ if ( WidgetDatabase::idFromClassName(WidgetFactory::classNameOf(w)) == -1 )
+ continue; // we don't know this widget
+ ts << makeIndent( indent ) << "<widget class=\"QWidget\">" << endl;
+ ++indent;
+ ts << makeIndent( indent ) << "<property name=\"name\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() ) << "</cstring>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+
+ ts << makeIndent( indent ) << "<attribute name=\"title\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<string>" << entitize( wiz->title( w ) ) << "</string>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</attribute>" << endl;
+ saveChildrenOf( w, ts, indent );
+ --indent;
+ ts << makeIndent( indent ) << "</widget>" << endl;
+ }
+ } else if ( ::qt_cast<QMainWindow*>(obj) ) {
+ saveChildrenOf( ( (QMainWindow*)obj )->centralWidget(), ts, indent );
+ } else {
+ bool saved = FALSE;
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ if ( isPlugin ) {
+ WidgetInterface *iface = 0;
+ widgetManager()->queryInterface( className, &iface );
+ if ( iface ) {
+ QWidgetContainerInterfacePrivate *iface2 = 0;
+ iface->queryInterface( IID_QWidgetContainer, (QUnknownInterface**)&iface2 );
+ if ( iface2 ) {
+ if ( iface2->supportsPages( className ) ) {
+ QWidgetList containers = iface2->pages( className, (QWidget*)obj );
+ if ( !containers.isEmpty() ) {
+ saved = TRUE;
+ int i = 0;
+ for ( QWidget *w = containers.first(); w; w = containers.next(), ++i ) {
+ if ( WidgetDatabase::
+ idFromClassName( WidgetFactory::classNameOf( w ) ) == -1 )
+ continue; // we don't know this widget
+ ts << makeIndent( indent ) << "<widget class=\""
+ << WidgetFactory::classNameOf( w )
+ << "\">" << endl;
+ ++indent;
+ ts << makeIndent( indent ) << "<property name=\"name\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() )
+ << "</cstring>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ ts << makeIndent( indent ) << "<attribute name=\"label\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<cstring>"
+ << entitize( iface2->pageLabel( className, (QWidget*)obj, i ) )
+ << "</cstring>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</attribute>" << endl;
+ saveChildrenOf( w, ts, indent );
+ --indent;
+ ts << makeIndent( indent ) << "</widget>" << endl;
+ }
+ }
+ } else {
+ saved = TRUE;
+ QWidget *w = iface2->containerOfWidget( className, (QWidget*)obj );
+ if ( obj != w ) {
+ ts << makeIndent( indent ) << "<widget class=\""
+ << WidgetFactory::classNameOf( w )
+ << "\">" << endl;
+ ++indent;
+ ts << makeIndent( indent ) << "<property name=\"name\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<cstring>" << entitize( w->name() )
+ << "</cstring>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ saveChildrenOf( w, ts, indent );
+ --indent;
+ ts << makeIndent( indent ) << "</widget>" << endl;
+ }
+ // Create a custom widget and then store it in the database
+ // so we can save the custom widgets.
+ MetaDataBase::CustomWidget *cw = new MetaDataBase::CustomWidget;
+ cw->className = className;
+ cw->includeFile = WidgetDatabase::includeFile( classID );
+ QStrList lst = w->metaObject()->signalNames( TRUE );
+ for ( QPtrListIterator<char> it(lst); it.current(); ++it )
+ cw->lstSignals.append(it.current());
+
+ int i;
+ int total = w->metaObject()->numProperties( TRUE );
+ for ( i = 0; i < total; i++ ) {
+ const QMetaProperty *p = w->metaObject()->property( i, TRUE );
+ if ( p->designable(w) ) {
+ MetaDataBase::Property prop;
+ prop.property = p->name();
+ QString pType = p->type();
+ // *sigh* designer types are not normal types
+ // Handle most cases, the ones it misses are
+ // probably too difficult to deal with anyway...
+ if ( pType.startsWith("Q") ) {
+ pType = pType.right( pType.length() - 1 );
+ } else {
+ pType[0] = pType[0].upper();
+ }
+ prop.type = pType;
+ cw->lstProperties.append( prop );
+ }
+ }
+
+ total = w->metaObject()->numSlots( TRUE );
+ for ( i = 0; i < total; i++ ) {
+ const QMetaData *md = w->metaObject()->slot( i, TRUE );
+ MetaDataBase::Function funky;
+ // Find out if we have a return type.
+ if ( md->method->count > 0 ) {
+ const QUParameter p = md->method->parameters[0];
+ if ( p.inOut == QUParameter::InOut )
+ funky.returnType = p.type->desc();
+ }
+
+ funky.function = md->name;
+ funky.language = "C++";
+ switch ( md->access ) {
+ case QMetaData::Public:
+ funky.access = "public";
+ break;
+ case QMetaData::Protected:
+ funky.access = "protected";
+ break;
+ case QMetaData::Private:
+ funky.access = "private";
+ break;
+ }
+ cw->lstSlots.append( funky );
+ }
+ MetaDataBase::addCustomWidget( cw );
+ }
+ iface2->release();
+ }
+ iface->release();
+ }
+ }
+#endif // QT_CONTAINER_CUSTOM_WIDGETS
+ if ( !saved )
+ saveChildrenOf( obj, ts, indent );
+ }
+
+ indent--;
+ ts << closeTag;
+}
+
+void Resource::saveItems( QObject *obj, QTextStream &ts, int indent )
+{
+ if ( ::qt_cast<QListBox*>(obj) || ::qt_cast<QComboBox*>(obj) ) {
+ QListBox *lb = 0;
+ if ( ::qt_cast<QListBox*>(obj) ) {
+ lb = (QListBox*)obj;
+ } else {
+ QComboBox *cb = (QComboBox*)obj;
+ lb = cb->listBox();
+ if (!lb) {
+ QPopupMenu *popup = (QPopupMenu*)cb->child( 0, "QPopupMenu" );
+ Q_ASSERT(popup);
+ for ( int id = 0; id < (int)popup->count(); ++id ) {
+ ts << makeIndent( indent ) << "<item>" << endl;
+ indent++;
+ QStringList text;
+ text << popup->text(id);
+ QPtrList<QPixmap> pixmaps;
+ if ( popup->pixmap(id) )
+ pixmaps.append( popup->pixmap(id) );
+ saveItem( text, pixmaps, ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</item>" << endl;
+ }
+ }
+ }
+
+ if (lb) {
+ QListBoxItem *i = lb->firstItem();
+ for ( ; i; i = i->next() ) {
+ ts << makeIndent( indent ) << "<item>" << endl;
+ indent++;
+ QStringList text;
+ text << i->text();
+ QPtrList<QPixmap> pixmaps;
+ if ( i->pixmap() )
+ pixmaps.append( i->pixmap() );
+ saveItem( text, pixmaps, ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</item>" << endl;
+ }
+ }
+
+ } else if ( ::qt_cast<QIconView*>(obj) ) {
+ QIconView *iv = (QIconView*)obj;
+
+ QIconViewItem *i = iv->firstItem();
+ for ( ; i; i = i->nextItem() ) {
+ ts << makeIndent( indent ) << "<item>" << endl;
+ indent++;
+ QStringList text;
+ text << i->text();
+ QPtrList<QPixmap> pixmaps;
+ if ( i->pixmap() )
+ pixmaps.append( i->pixmap() );
+ saveItem( text, pixmaps, ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</item>" << endl;
+ }
+ } else if ( ::qt_cast<QListView*>(obj) ) {
+ QListView *lv = (QListView*)obj;
+ int i;
+ for ( i = 0; i < lv->header()->count(); ++i ) {
+ ts << makeIndent( indent ) << "<column>" << endl;
+ indent++;
+ QStringList l;
+ l << lv->header()->label( i );
+ QPtrList<QPixmap> pix;
+ pix.setAutoDelete( TRUE );
+ if ( lv->header()->iconSet( i ) )
+ pix.append( new QPixmap( lv->header()->iconSet( i )->pixmap() ) );
+ saveItem( l, pix, ts, indent );
+ ts << makeIndent( indent ) << "<property name=\"clickable\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<bool>" << mkBool( lv->header()->isClickEnabled( i ) )<< "</bool>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ ts << makeIndent( indent ) << "<property name=\"resizable\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<bool>" << mkBool( lv->header()->isResizeEnabled( i ) ) << "</bool>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</column>" << endl;
+ }
+ saveItem( lv->firstChild(), ts, indent - 1 );
+ }
+#if !defined (QT_NO_TABLE)
+ else if ( ::qt_cast<QTable*>(obj) ) {
+ QTable *table = (QTable*)obj;
+ int i;
+ QMap<QString, QString> columnFields = MetaDataBase::columnFields( table );
+# ifndef QT_NO_SQL
+ bool isDataTable = ::qt_cast<QDataTable*>(table);
+# else
+ bool isDataTable = false;
+# endif
+ for ( i = 0; i < table->horizontalHeader()->count(); ++i ) {
+ if ( !table->horizontalHeader()->label( i ).isNull() &&
+ table->horizontalHeader()->label( i ).toInt() != i + 1 ||
+ table->horizontalHeader()->iconSet( i ) ||
+ isDataTable ) {
+ ts << makeIndent( indent ) << "<column>" << endl;
+ indent++;
+ QStringList l;
+ l << table->horizontalHeader()->label( i );
+ QPtrList<QPixmap> pix;
+ pix.setAutoDelete( TRUE );
+ if ( table->horizontalHeader()->iconSet( i ) )
+ pix.append( new QPixmap( table->horizontalHeader()->iconSet( i )->pixmap() ) );
+ saveItem( l, pix, ts, indent );
+ if ( isDataTable && !columnFields.isEmpty() ) {
+ ts << makeIndent( indent ) << "<property name=\"field\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<string>" << entitize( *columnFields.find( l[ 0 ] ) ) << "</string>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</column>" << endl;
+ }
+ }
+ for ( i = 0; i < table->verticalHeader()->count(); ++i ) {
+ if ( !table->verticalHeader()->label( i ).isNull() &&
+ table->verticalHeader()->label( i ).toInt() != i + 1 ||
+ table->verticalHeader()->iconSet( i ) ) {
+ ts << makeIndent( indent ) << "<row>" << endl;
+ indent++;
+ QStringList l;
+ l << table->verticalHeader()->label( i );
+ QPtrList<QPixmap> pix;
+ pix.setAutoDelete( TRUE );
+ if ( table->verticalHeader()->iconSet( i ) )
+ pix.append( new QPixmap( table->verticalHeader()->iconSet( i )->pixmap() ) );
+ saveItem( l, pix, ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</row>" << endl;
+ }
+ }
+ }
+#endif
+}
+
+void Resource::saveItem( QListViewItem *i, QTextStream &ts, int indent )
+{
+ QListView *lv = i->listView();
+ while ( i ) {
+ ts << makeIndent( indent ) << "<item>" << endl;
+ indent++;
+
+ QPtrList<QPixmap> pixmaps;
+ QStringList textes;
+ for ( int c = 0; c < lv->columns(); ++c ) {
+ pixmaps.append( i->pixmap( c ) );
+ textes << i->text( c );
+ }
+ saveItem( textes, pixmaps, ts, indent );
+
+ if ( i->firstChild() )
+ saveItem( i->firstChild(), ts, indent );
+
+ indent--;
+ ts << makeIndent( indent ) << "</item>" << endl;
+ i = i->nextSibling();
+ }
+}
+
+void Resource::savePixmap( const QPixmap &p, QTextStream &ts, int indent, const QString &tagname )
+{
+ if ( p.isNull() ) {
+ ts << makeIndent( indent ) << "<" << tagname << "></" << tagname << ">" << endl;
+ return;
+ }
+
+ if ( formwindow && formwindow->savePixmapInline() )
+ ts << makeIndent( indent ) << "<" << tagname << ">" << saveInCollection( p ) << "</" << tagname << ">" << endl;
+ else if ( formwindow && formwindow->savePixmapInProject() )
+ ts << makeIndent( indent ) << "<" << tagname << ">" << MetaDataBase::pixmapKey( formwindow, p.serialNumber() )
+ << "</" << tagname << ">" << endl;
+ else
+ ts << makeIndent( indent ) << "<" << tagname << ">" << MetaDataBase::pixmapArgument( formwindow, p.serialNumber() )
+ << "</" << tagname << ">" << endl;
+}
+
+QPixmap Resource::loadPixmap( const QDomElement &e, const QString &/*tagname*/ )
+{
+ QString arg = e.firstChild().toText().data();
+
+ if ( formwindow && formwindow->savePixmapInline() ) {
+ QImage img = loadFromCollection( arg );
+ QPixmap pix;
+ pix.convertFromImage( img );
+ MetaDataBase::setPixmapArgument( formwindow, pix.serialNumber(), arg );
+ return pix;
+ } else if ( formwindow && formwindow->savePixmapInProject() ) {
+ QPixmap pix;
+ if ( mainwindow && mainwindow->currProject() ) {
+ pix = mainwindow->currProject()->pixmapCollection()->pixmap( arg );
+ } else {
+ pix = QPixmap::fromMimeSource( "designer_image.png" );
+ // we have to force the pixmap to get a new and unique serial number. Unfortunately detatch() doesn't do that
+ pix.convertFromImage( pix.convertToImage() );
+ }
+
+ MetaDataBase::setPixmapKey( formwindow, pix.serialNumber(), arg );
+ return pix;
+ }
+ QPixmap pix = QPixmap::fromMimeSource( "designer_image.png" );
+ // we have to force the pixmap to get a new and unique serial number. Unfortunately detatch() doesn't do that
+ pix.convertFromImage( pix.convertToImage() );
+ MetaDataBase::setPixmapArgument( formwindow, pix.serialNumber(), arg );
+ return pix;
+}
+
+void Resource::saveItem( const QStringList &text,
+ const QPtrList<QPixmap> &pixmaps, QTextStream &ts,
+ int indent )
+{
+ QStringList::ConstIterator it = text.begin();
+ for ( ; it != text.end(); ++it ) {
+ ts << makeIndent( indent ) << "<property name=\"text\">" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<string>" << entitize( *it ) << "</string>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ }
+
+ for ( int i = 0; i < (int)pixmaps.count(); ++i ) {
+ QPixmap *p = ( (QPtrList<QPixmap>)pixmaps ).at( i );
+ ts << makeIndent( indent ) << "<property name=\"pixmap\">" << endl;
+ indent++;
+ if ( p )
+ savePixmap( *p, ts, indent );
+ else
+ savePixmap( QPixmap(), ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ }
+}
+
+void Resource::saveChildrenOf( QObject* obj, QTextStream &ts, int indent )
+{
+ const QObjectList *l = obj->children();
+ if ( !l )
+ return; // no children to save
+
+ QString closeTag;
+ // if the widget has a layout we pretend that all widget's childs are childs of the layout - makes the structure nicer
+ QLayout *layout = 0;
+ QDesignerGridLayout* grid = 0;
+ if ( !::qt_cast<QSplitter*>(obj) &&
+ WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( obj ) ) ) &&
+ obj->isWidgetType() &&
+ WidgetFactory::layoutType( (QWidget*)obj, layout ) != WidgetFactory::NoLayout ) {
+ WidgetFactory::LayoutType lay = WidgetFactory::layoutType( (QWidget*)obj, layout );
+ switch ( lay ) {
+ case WidgetFactory::HBox:
+ closeTag = makeIndent( indent ) + "</hbox>";
+ ts << makeIndent( indent ) << "<hbox>" << endl;
+ ++indent;
+ break;
+ case WidgetFactory::VBox:
+ closeTag = makeIndent( indent ) + "</vbox>";
+ ts << makeIndent( indent ) << "<vbox>" << endl;
+ ++indent;
+ break;
+ case WidgetFactory::Grid:
+ closeTag = makeIndent( indent ) + "</grid>";
+ ts << makeIndent( indent ) << "<grid>" << endl;
+ ++indent;
+ grid = (QDesignerGridLayout*) layout;
+ break;
+ default:
+ break;
+ }
+
+ // save properties of layout
+ if ( lay != WidgetFactory::NoLayout )
+ saveObjectProperties( layout, ts, indent );
+
+ }
+
+ QObject *o = 0;
+ for ( QPtrListIterator<QObject> it ( *l ); ( o = it.current() ); ++it )
+ if ( !QString( o->name() ).startsWith( "qt_dead_widget_" ) )
+ saveObject( o, grid, ts, indent );
+ if ( !closeTag.isEmpty() ) {
+ indent--;
+ ts << closeTag << endl;
+ }
+}
+
+void Resource::saveObjectProperties( QObject *w, QTextStream &ts, int indent )
+{
+ QStringList saved;
+ QStringList changed;
+ changed = MetaDataBase::changedProperties( w );
+ if ( w->isWidgetType() ) {
+ if ( ::qt_cast<Spacer*>(w) ) {
+ if ( !changed.contains( "sizeHint" ) )
+ changed << "sizeHint";
+ if ( !changed.contains( "geometry" ) )
+ changed << "geometry";
+ } else {
+ QToolButton *tb = ::qt_cast<QToolButton*>(w);
+ if ( tb && !tb->iconSet().isNull() ) {
+ changed << "iconSet";
+ }
+ }
+ } else if ( ::qt_cast<QLayout*>(w) ) {
+ if ( MetaDataBase::spacing( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)w ) ) ) > -1 )
+ changed << "spacing";
+ if ( MetaDataBase::margin( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)w ) ) ) > -1 )
+ changed << "margin";
+ if ( MetaDataBase::resizeMode( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)w ) ) ) != "Auto"
+ && !MetaDataBase::resizeMode( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)w ) ) ).isEmpty() )
+ changed << "resizeMode";
+ }
+
+ if ( w == formwindow->mainContainer() ) {
+ if ( changed.findIndex( "geometry" ) == -1 )
+ changed << "geometry";
+ if ( changed.findIndex( "caption" ) == -1 )
+ changed << "caption";
+ }
+
+ if ( changed.isEmpty() )
+ return;
+
+ bool inLayout = w != formwindow->mainContainer() && !copying && w->isWidgetType() && ( (QWidget*)w )->parentWidget() &&
+ WidgetFactory::layoutType( ( (QWidget*)w )->parentWidget() ) != WidgetFactory::NoLayout;
+
+ QStrList lst = w->metaObject()->propertyNames( !::qt_cast<Spacer*>(w) );
+ for ( QPtrListIterator<char> it( lst ); it.current(); ++it ) {
+ if ( changed.find( QString::fromLatin1( it.current() ) ) == changed.end() )
+ continue;
+ if ( saved.find( QString::fromLatin1( it.current() ) ) != saved.end() )
+ continue;
+ saved << QString::fromLatin1( it.current() );
+ const QMetaProperty* p = w->metaObject()->
+ property( w->metaObject()->findProperty( it.current(), TRUE ), TRUE );
+ if ( !p || !p->stored( w ) || ( inLayout && qstrcmp( p->name(), "geometry" ) == 0 ) )
+ continue;
+ if ( ::qt_cast<QLabel*>(w) && qstrcmp( p->name(), "pixmap" ) == 0 &&
+ ( !( (QLabel*)w )->pixmap() || ( (QLabel*)w )->pixmap()->isNull() ) )
+ continue;
+ if ( ::qt_cast<MenuBarEditor*>(w) &&
+ ( qstrcmp( p->name(), "itemName" ) == 0 || qstrcmp( p->name(), "itemNumber" ) == 0 ||
+ qstrcmp( p->name(), "itemText" ) == 0 ) )
+ continue;
+ if ( qstrcmp( p->name(), "name" ) == 0 )
+ knownNames << w->property( "name" ).toString();
+ if ( !p->isSetType() && !p->isEnumType() && !w->property( p->name() ).isValid() )
+ continue;
+ ts << makeIndent( indent ) << "<property";
+ ts << " name=\"" << it.current() << "\"";
+ if ( !p->stdSet() )
+ ts << " stdset=\"0\"";
+ ts << ">" << endl;
+ indent++;
+ if ( strcmp( it.current(), "resizeMode" ) == 0 && ::qt_cast<QLayout*>(w) ) {
+ saveProperty( w, it.current(), "", QVariant::String, ts, indent );
+ } else if ( p->isSetType() ) {
+ saveSetProperty( w, it.current(), QVariant::nameToType( p->type() ), ts, indent );
+ } else if ( p->isEnumType() ) {
+ saveEnumProperty( w, it.current(), QVariant::nameToType( p->type() ), ts, indent );
+ } else {
+ saveProperty( w, it.current(), w->property( p->name() ), QVariant::nameToType( p->type() ), ts, indent );
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ }
+
+ if ( w->isWidgetType() && MetaDataBase::fakeProperties( w ) ) {
+ QMap<QString, QVariant>* fakeProperties = MetaDataBase::fakeProperties( w );
+ for ( QMap<QString, QVariant>::Iterator fake = fakeProperties->begin();
+ fake != fakeProperties->end(); ++fake ) {
+ if ( MetaDataBase::isPropertyChanged( w, fake.key() ) ) {
+ if ( w->inherits("CustomWidget") ) {
+ MetaDataBase::CustomWidget *cw = ( (CustomWidget*)w )->customWidget();
+ if ( cw && !cw->hasProperty( fake.key().latin1() ) && fake.key() != "toolTip" && fake.key() != "whatsThis" )
+ continue;
+ }
+
+ ts << makeIndent( indent ) << "<property name=\"" << fake.key() << "\" stdset=\"0\">" << endl;
+ indent++;
+ saveProperty( w, fake.key(), *fake, (*fake).type(), ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</property>" << endl;
+ }
+ }
+ }
+}
+
+void Resource::saveSetProperty( QObject *w, const QString &name, QVariant::Type, QTextStream &ts, int indent )
+{
+ const QMetaProperty *p = w->metaObject()->property( w->metaObject()->findProperty( name, TRUE ), TRUE );
+ QStrList l( p->valueToKeys( w->property( name ).toInt() ) );
+ QString v;
+ for ( uint i = 0; i < l.count(); ++i ) {
+ v += l.at( i );
+ if ( i < l.count() - 1 )
+ v += "|";
+ }
+ ts << makeIndent( indent ) << "<set>" << v << "</set>" << endl;
+}
+
+void Resource::saveEnumProperty( QObject *w, const QString &name, QVariant::Type, QTextStream &ts, int indent )
+{
+ const QMetaProperty *p = w->metaObject()->property( w->metaObject()->findProperty( name, TRUE ), TRUE );
+ int value = w->property( name ).toInt();
+ const char* key = p->valueToKey( value );
+ if (key)
+ ts << makeIndent( indent ) << "<enum>" << key << "</enum>" << endl;
+}
+
+void Resource::saveProperty( QObject *w, const QString &name, const QVariant &value, QVariant::Type t, QTextStream &ts, int indent )
+{
+ if ( name == "hAlign" || name =="vAlign" || name == "wordwrap" ||
+ name == "layoutMargin" || name =="layoutSpacing" )
+ return;
+ int num;
+ uint unum;
+ double dob;
+ QString comment;
+ if ( w && formwindow->widgets()->find( (QWidget*)w ) || formwindow->actionList().find( (QAction*)w ) )
+ comment = MetaDataBase::propertyComment( w, name );
+ switch ( t ) {
+ case QVariant::String:
+ if ( name == "resizeMode" ) {
+ QString resmod = MetaDataBase::resizeMode( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)w ) ) );
+ if ( !resmod.isNull() && resmod != "Auto" ) {
+ ts << makeIndent( indent ) << "<enum>";
+ ts << resmod;
+ ts << "</enum>" << endl;
+ }
+
+ } else {
+ ts << makeIndent( indent ) << "<string>" << entitize( value.toString() ) << "</string>" << endl;
+ if ( !comment.isEmpty() )
+ ts << makeIndent( indent ) << "<comment>" << entitize( comment ) << "</comment>" << endl;
+ }
+ break;
+ case QVariant::CString:
+ ts << makeIndent( indent ) << "<cstring>" << entitize( value.toCString() ).latin1() << "</cstring>" << endl;
+ break;
+ case QVariant::Bool:
+ ts << makeIndent( indent ) << "<bool>" << mkBool( value.toBool() ) << "</bool>" << endl;
+ break;
+ case QVariant::Int:
+ if ( ::qt_cast<QLayout*>(w) ) {
+ num = -1;
+ if ( name == "spacing" )
+ num = MetaDataBase::spacing( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)w ) ) );
+ else if ( name == "margin" )
+ num = MetaDataBase::margin( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)w ) ) );
+ if ( num != -1 )
+ ts << makeIndent( indent ) << "<number>" << QString::number( num ) << "</number>" << endl;
+ } else {
+ num = value.toInt();
+ ts << makeIndent( indent ) << "<number>" << QString::number( num ) << "</number>" << endl;
+ }
+ break;
+ case QVariant::Double:
+ dob = value.toDouble();
+ ts << makeIndent( indent ) << "<number>" << QString::number( dob ) << "</number>" << endl;
+ break;
+ case QVariant::KeySequence:
+ ts << makeIndent( indent ) << "<string>"
+ << entitize(platformNeutralKeySequence(value.toKeySequence())) << "</string>" << endl;
+ break;
+ case QVariant::UInt:
+ unum = value.toUInt();
+ ts << makeIndent( indent ) << "<number>" << QString::number( unum ) << "</number>" << endl;
+ break;
+ case QVariant::Rect: {
+ QVariant v( value );
+ ts << makeIndent( indent ) << "<rect>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<x>" << QString::number( v.toRect().x() ) << "</x>" << endl;
+ ts << makeIndent( indent ) << "<y>" << QString::number( v.toRect().y() ) << "</y>" << endl;
+ ts << makeIndent( indent ) << "<width>" << QString::number( v.toRect().width() ) << "</width>" << endl;
+ ts << makeIndent( indent ) << "<height>" << QString::number( v.toRect().height() ) << "</height>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</rect>" << endl;
+ } break;
+ case QVariant::Point: {
+ QVariant v( value );
+ ts << makeIndent( indent ) << "<point>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<x>" << QString::number( v.toPoint().x() ) << "</x>" << endl;
+ ts << makeIndent( indent ) << "<y>" << QString::number( v.toPoint().y() ) << "</y>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</point>" << endl;
+ } break;
+ case QVariant::Size: {
+ QVariant v( value );
+ ts << makeIndent( indent ) << "<size>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<width>" << QString::number( v.toSize().width() ) << "</width>" << endl;
+ ts << makeIndent( indent ) << "<height>" << QString::number( v.toSize().height() ) << "</height>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</size>" << endl;
+ } break;
+ case QVariant::Color: {
+ QVariant v( value );
+ ts << makeIndent( indent ) << "<color>" << endl;
+ indent++;
+ saveColor( ts, indent, v.toColor() );
+ indent--;
+ ts << makeIndent( indent ) << "</color>" << endl;
+ } break;
+ case QVariant::Font: {
+ QVariant v( value );
+ ts << makeIndent( indent ) << "<font>" << endl;
+ QFont f( qApp->font() );
+ if ( w && w->isWidgetType() && ((QWidget*)w)->parentWidget() )
+ f = ((QWidget*)w)->parentWidget()->font();
+ QFont f2( v.toFont() );
+ indent++;
+ if ( f.family() != f2.family() )
+ ts << makeIndent( indent ) << "<family>" << f2.family() << "</family>" << endl;
+ if ( f.pointSize() != f2.pointSize() )
+ ts << makeIndent( indent ) << "<pointsize>" << QString::number( f2.pointSize() ) << "</pointsize>" << endl;
+ if ( f.bold() != f2.bold() )
+ ts << makeIndent( indent ) << "<bold>" << QString::number( (int)f2.bold() ) << "</bold>" << endl;
+ if ( f.italic() != f2.italic() )
+ ts << makeIndent( indent ) << "<italic>" << QString::number( (int)f2.italic() ) << "</italic>" << endl;
+ if ( f.underline() != f2.underline() )
+ ts << makeIndent( indent ) << "<underline>" << QString::number( (int)f2.underline() ) << "</underline>" << endl;
+ if ( f.strikeOut() != f2.strikeOut() )
+ ts << makeIndent( indent ) << "<strikeout>" << QString::number( (int)f2.strikeOut() ) << "</strikeout>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</font>" << endl;
+ } break;
+ case QVariant::SizePolicy: {
+ QSizePolicy sp( value.toSizePolicy() );
+ ts << makeIndent( indent ) << "<sizepolicy>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<hsizetype>" << (int)sp.horData() << "</hsizetype>" << endl;
+ ts << makeIndent( indent ) << "<vsizetype>" << (int)sp.verData() << "</vsizetype>" << endl;
+ ts << makeIndent( indent ) << "<horstretch>" << (int)sp.horStretch() << "</horstretch>" << endl;
+ ts << makeIndent( indent ) << "<verstretch>" << (int)sp.verStretch() << "</verstretch>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</sizepolicy>" << endl;
+ break;
+ }
+ case QVariant::Pixmap:
+ savePixmap( value.toPixmap(), ts, indent );
+ break;
+ case QVariant::IconSet:
+ savePixmap( value.toIconSet().pixmap(), ts, indent, "iconset" );
+ break;
+ case QVariant::Image:
+ ts << makeIndent( indent ) << "<image>" << saveInCollection( value.toImage() ) << "</image>" << endl;
+ break;
+ case QVariant::Palette: {
+ QPalette p( value.toPalette() );
+ ts << makeIndent( indent ) << "<palette>" << endl;
+ indent++;
+
+ ts << makeIndent( indent ) << "<active>" << endl;
+ indent++;
+ saveColorGroup( ts, indent, p.active() );
+ indent--;
+ ts << makeIndent( indent ) << "</active>" << endl;
+
+ ts << makeIndent( indent ) << "<disabled>" << endl;
+ indent++;
+ saveColorGroup( ts, indent, p.disabled() );
+ indent--;
+ ts << makeIndent( indent ) << "</disabled>" << endl;
+
+ ts << makeIndent( indent ) << "<inactive>" << endl;
+ indent++;
+ saveColorGroup( ts, indent, p.inactive() );
+ indent--;
+ ts << makeIndent( indent ) << "</inactive>" << endl;
+
+ indent--;
+ ts << makeIndent( indent ) << "</palette>" << endl;
+ } break;
+ case QVariant::Cursor:
+ ts << makeIndent( indent ) << "<cursor>" << value.toCursor().shape() << "</cursor>" << endl;
+ break;
+ case QVariant::StringList: {
+ QStringList lst = value.toStringList();
+ uint i = 0;
+ ts << makeIndent( indent ) << "<stringlist>" << endl;
+ indent++;
+ if ( !lst.isEmpty() ) {
+ for ( i = 0; i < lst.count(); ++i )
+ ts << makeIndent( indent ) << "<string>" << entitize( lst[ i ] ) << "</string>" << endl;
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</stringlist>" << endl;
+ } break;
+ case QVariant::Date: {
+ QDate d = value.toDate();
+ ts << makeIndent( indent ) << "<date>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<year>" << d.year() << "</year>" << endl;
+ ts << makeIndent( indent ) << "<month>" << d.month() << "</month>" << endl;
+ ts << makeIndent( indent ) << "<day>" << d.day() << "</day>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</date>" << endl;
+ break;
+ }
+ case QVariant::Time: {
+ QTime t = value.toTime();
+ ts << makeIndent( indent ) << "<time>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<hour>" << t.hour() << "</hour>" << endl;
+ ts << makeIndent( indent ) << "<minute>" << t.minute() << "</minute>" << endl;
+ ts << makeIndent( indent ) << "<second>" << t.second() << "</second>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</time>" << endl;
+ break;
+ }
+ case QVariant::DateTime: {
+ QDateTime dt = value.toDateTime();
+ ts << makeIndent( indent ) << "<datetime>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<year>" << dt.date().year() << "</year>" << endl;
+ ts << makeIndent( indent ) << "<month>" << dt.date().month() << "</month>" << endl;
+ ts << makeIndent( indent ) << "<day>" << dt.date().day() << "</day>" << endl;
+ ts << makeIndent( indent ) << "<hour>" << dt.time().hour() << "</hour>" << endl;
+ ts << makeIndent( indent ) << "<minute>" << dt.time().minute() << "</minute>" << endl;
+ ts << makeIndent( indent ) << "<second>" << dt.time().second() << "</second>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</datetime>" << endl;
+ break;
+ }
+ default:
+ qWarning( "saving the property %s of type %d not supported yet", name.latin1(), (int)t );
+ }
+}
+
+void Resource::saveColorGroup( QTextStream &ts, int indent, const QColorGroup &cg )
+{
+ for( int r = 0 ; r < QColorGroup::NColorRoles ; r++ ) {
+ ts << makeIndent( indent ) << "<color>" << endl;
+ indent++;
+ saveColor( ts, indent, cg.color( (QColorGroup::ColorRole)r ) );
+ indent--;
+ ts << makeIndent( indent ) << "</color>" << endl;
+ QPixmap* pm = cg.brush( (QColorGroup::ColorRole)r ).pixmap();
+ if ( pm && !pm->isNull() )
+ savePixmap( *pm, ts, indent );
+ }
+}
+
+void Resource::saveColor( QTextStream &ts, int indent, const QColor &c )
+{
+ ts << makeIndent( indent ) << "<red>" << QString::number( c.red() ) << "</red>" << endl;
+ ts << makeIndent( indent ) << "<green>" << QString::number( c.green() ) << "</green>" << endl;
+ ts << makeIndent( indent ) << "<blue>" << QString::number( c.blue() ) << "</blue>" << endl;
+}
+
+QObject *Resource::createObject( const QDomElement &e, QWidget *parent, QLayout* layout )
+{
+ lastItem = 0;
+ QDomElement n = e.firstChild().toElement();
+ QWidget *w = 0; // the widget that got created
+ QObject *obj = 0; // gets the properties
+
+ int row = e.attribute( "row" ).toInt();
+ int col = e.attribute( "column" ).toInt();
+ int rowspan = e.attribute( "rowspan" ).toInt();
+ int colspan = e.attribute( "colspan" ).toInt();
+ if ( rowspan < 1 )
+ rowspan = 1;
+ if ( colspan < 1 )
+ colspan = 1;
+
+ QString className = e.attribute( "class", "QWidget" );
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ QString parentClassName = WidgetFactory::classNameOf( parent );
+ bool isPlugin =
+ WidgetDatabase::isCustomPluginWidget( WidgetDatabase::idFromClassName( parentClassName ) );
+ if ( isPlugin )
+ qWarning( "####### loading custom container widgets without page support not implemented!" );
+ // ### TODO loading for custom container widgets without pages
+#endif
+ if ( !className.isNull() ) {
+ obj = WidgetFactory::create( WidgetDatabase::idFromClassName( className ), parent, 0, FALSE );
+ if ( !obj ) {
+ QMessageBox::critical( MainWindow::self, MainWindow::tr( "Loading File" ),
+ MainWindow::tr( "Error loading %1.\n"
+ "The widget %2 couldn't be created.\n"
+ "Information may be lost if this form is saved." ).
+ arg( currFileName ).arg( className ) );
+ return 0;
+ }
+ if ( !mainContainerSet ) {
+ if ( formwindow )
+ formwindow->setMainContainer( (QWidget*)obj );
+ mainContainerSet = TRUE;
+ }
+ w = (QWidget*)obj;
+ if ( ::qt_cast<QMainWindow*>(w) )
+ w = ( (QMainWindow*)w )->centralWidget();
+ if ( layout ) {
+ switch ( WidgetFactory::layoutType( layout ) ) {
+ case WidgetFactory::HBox:
+ ( (QHBoxLayout*)layout )->addWidget( w );
+ break;
+ case WidgetFactory::VBox:
+ ( (QVBoxLayout*)layout )->addWidget( w );
+ break;
+ case WidgetFactory::Grid:
+ ( (QDesignerGridLayout*)layout )->addMultiCellWidget( w, row, row + rowspan - 1,
+ col, col + colspan - 1 );
+ break;
+ default:
+ break;
+ }
+ }
+
+ if ( !toplevel )
+ toplevel = w;
+ layout = 0;
+
+ if ( w && formwindow ) {
+ if ( !parent ||
+ ( !::qt_cast<QTabWidget*>(parent) &&
+ !::qt_cast<QWidgetStack*>(parent) &&
+ !::qt_cast<QToolBox*>(parent) &&
+ !::qt_cast<QWizard*>(parent)
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ && !isPlugin
+#endif
+ ) )
+ formwindow->insertWidget( w, pasting );
+ else if ( parent &&
+ ( ::qt_cast<QTabWidget*>(parent) ||
+ ::qt_cast<QWidgetStack*>(parent) ||
+ ::qt_cast<QToolBox*>(parent) ||
+ ::qt_cast<QWizard*>(parent)
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ || isPlugin
+#endif
+ ) )
+ MetaDataBase::addEntry( w );
+ }
+ }
+
+ QDomElement sizePolicyElement;
+ QObject *sizePolicyObject = 0;
+
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "spacer" ) {
+ createSpacer( n, w, layout, Qt::Horizontal );
+ } else if ( n.tagName() == "widget" ) {
+ createObject( n, w, layout );
+ } else if ( n.tagName() == "hbox" ) {
+ layout = WidgetFactory::createLayout( w, layout, WidgetFactory::HBox );
+ obj = layout;
+ n = n.firstChild().toElement();
+ continue;
+ } else if ( n.tagName() == "grid" ) {
+ layout = WidgetFactory::createLayout( w, layout, WidgetFactory::Grid );
+ obj = layout;
+ n = n.firstChild().toElement();
+ continue;
+ } else if ( n.tagName() == "vbox" ) {
+ layout = WidgetFactory::createLayout( w, layout, WidgetFactory::VBox );
+ obj = layout;
+ n = n.firstChild().toElement();
+ continue;
+ } else if ( n.tagName() == "property" && obj ) {
+ if ( n.attribute( "name" ) == "sizePolicy" ) {
+ // ### Evil hack ### Delay setting sizePolicy so it won't be overridden by other properties.
+ sizePolicyElement = n;
+ sizePolicyObject = obj;
+ } else {
+ setObjectProperty( obj, n.attribute( "name" ), n.firstChild().toElement() );
+ }
+ } else if ( n.tagName() == "attribute" && w ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( ::qt_cast<QTabWidget*>(parent) ) {
+ if ( attrib == "title" )
+ ( (QTabWidget*)parent )->insertTab( w, v.toString() );
+ } else if ( ::qt_cast<QWidgetStack*>(parent) ) {
+ if ( attrib == "id" )
+ ( (QDesignerWidgetStack*)parent )->insertPage( w, v.toInt() );
+ } else if ( ::qt_cast<QToolBox*>(parent) ) {
+ if ( attrib == "label" )
+ ( (QToolBox*)parent )->addItem( w, v.toString() );
+ } else if ( ::qt_cast<QWizard*>(parent) ) {
+ if ( attrib == "title" )
+ ( (QWizard*)parent )->addPage( w, v.toString() );
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ } else if ( isPlugin ) {
+ if ( attrib == "label" ) {
+ WidgetInterface *iface = 0;
+ widgetManager()->queryInterface( parentClassName, &iface );
+ if ( iface ) {
+ QWidgetContainerInterfacePrivate *iface2 = 0;
+ iface->queryInterface( IID_QWidgetContainer, (QUnknownInterface**)&iface2 );
+ if ( iface2 ) {
+ iface2->insertPage( parentClassName,
+ (QWidget*)parent, v.toString(), -1, w );
+ iface2->release();
+ }
+ iface->release();
+ }
+ }
+#endif // QT_CONTAINER_CUSTOM_WIDGETS
+ }
+ } else if ( n.tagName() == "item" ) {
+ createItem( n, w );
+ } else if ( n.tagName() == "column" || n.tagName() =="row" ) {
+ createColumn( n, w );
+ }
+
+ n = n.nextSibling().toElement();
+ }
+
+ // ### Evil hack ### See description above.
+ if ( !sizePolicyElement.isNull() ) {
+ setObjectProperty( sizePolicyObject,
+ sizePolicyElement.attribute( "name" ),
+ sizePolicyElement.firstChild().toElement() );
+ }
+
+ if ( w->isWidgetType() )
+ widgets.insert( w->name(), w );
+
+ return w;
+}
+
+void Resource::createColumn( const QDomElement &e, QWidget *widget )
+{
+ if ( !widget )
+ return;
+
+ if ( ::qt_cast<QListView*>(widget) && e.tagName() == "column" ) {
+ QListView *lv = (QListView*)widget;
+ QDomElement n = e.firstChild().toElement();
+ QPixmap pix;
+ bool hasPixmap = FALSE;
+ QString txt;
+ bool clickable = TRUE, resizable = TRUE;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" )
+ txt = v.toString();
+ else if ( attrib == "pixmap" ) {
+ pix = loadPixmap( n.firstChild().toElement().toElement() );
+ hasPixmap = !pix.isNull();
+ } else if ( attrib == "clickable" )
+ clickable = v.toBool();
+ else if ( attrib == "resizable" )
+ resizable = v.toBool();
+ }
+ n = n.nextSibling().toElement();
+ }
+ lv->addColumn( txt );
+ int i = lv->header()->count() - 1;
+ if ( hasPixmap ) {
+ lv->header()->setLabel( i, pix, txt );
+ }
+ if ( !clickable )
+ lv->header()->setClickEnabled( clickable, i );
+ if ( !resizable )
+ lv->header()->setResizeEnabled( resizable, i );
+ }
+#ifndef QT_NO_TABLE
+ else if ( ::qt_cast<QTable*>(widget) ) {
+ QTable *table = (QTable*)widget;
+ bool isRow;
+ if ( ( isRow = e.tagName() == "row" ) )
+ table->setNumRows( table->numRows() + 1 );
+ else
+ table->setNumCols( table->numCols() + 1 );
+
+ QDomElement n = e.firstChild().toElement();
+ QPixmap pix;
+ bool hasPixmap = FALSE;
+ QString txt;
+ QString field;
+ QMap<QString, QString> fieldMap = MetaDataBase::columnFields( table );
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" )
+ txt = v.toString();
+ else if ( attrib == "pixmap" ) {
+ hasPixmap = !n.firstChild().firstChild().toText().data().isEmpty();
+ if ( hasPixmap )
+ pix = loadPixmap( n.firstChild().toElement() );
+ } else if ( attrib == "field" )
+ field = v.toString();
+ }
+ n = n.nextSibling().toElement();
+ }
+
+ int i = isRow ? table->numRows() - 1 : table->numCols() - 1;
+ QHeader *h = !isRow ? table->horizontalHeader() : table->verticalHeader();
+ if ( hasPixmap )
+ h->setLabel( i, pix, txt );
+ else
+ h->setLabel( i, txt );
+ if ( !isRow && !field.isEmpty() )
+ fieldMap.insert( txt, field );
+ MetaDataBase::setColumnFields( table, fieldMap );
+ }
+#endif
+}
+
+void Resource::loadItem( const QDomElement &e, QPixmap &pix, QString &txt, bool &hasPixmap )
+{
+ QDomElement n = e;
+ hasPixmap = FALSE;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" )
+ txt = v.toString();
+ else if ( attrib == "pixmap" ) {
+ pix = loadPixmap( n.firstChild().toElement() );
+ hasPixmap = !pix.isNull();
+ }
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void Resource::createItem( const QDomElement &e, QWidget *widget, QListViewItem *i )
+{
+ if ( !widget || !WidgetFactory::hasItems( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( widget ) ), widget ) )
+ return;
+
+ if ( ::qt_cast<QListBox*>(widget) || ::qt_cast<QComboBox*>(widget) ) {
+ QDomElement n = e.firstChild().toElement();
+ QPixmap pix;
+ bool hasPixmap = FALSE;
+ QString txt;
+ loadItem( n, pix, txt, hasPixmap );
+ QListBox *lb = 0;
+ if ( ::qt_cast<QListBox*>(widget) ) {
+ lb = (QListBox*)widget;
+ } else {
+ QComboBox *cb = (QComboBox*)widget;
+ lb = cb->listBox();
+ if (!lb) {
+ lb = new QListBox(cb);
+ cb->setListBox(lb);
+ }
+ }
+ if ( hasPixmap ) {
+ new QListBoxPixmap( lb, pix, txt );
+ } else {
+ new QListBoxText( lb, txt );
+ }
+ } else if ( ::qt_cast<QIconView*>(widget) ) {
+ QDomElement n = e.firstChild().toElement();
+ QPixmap pix;
+ bool hasPixmap = FALSE;
+ QString txt;
+ loadItem( n, pix, txt, hasPixmap );
+ QIconView *iv = (QIconView*)widget;
+ if ( hasPixmap )
+ new QIconViewItem( iv, txt, pix );
+ else
+ new QIconViewItem( iv, txt );
+ } else if ( ::qt_cast<QListView*>(widget) ) {
+ QDomElement n = e.firstChild().toElement();
+ QPixmap pix;
+ QValueList<QPixmap> pixmaps;
+ QStringList textes;
+ QListViewItem *item = 0;
+ QListView *lv = (QListView*)widget;
+ if ( i )
+ item = new QListViewItem( i, lastItem );
+ else
+ item = new QListViewItem( lv, lastItem );
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" )
+ textes << v.toString();
+ else if ( attrib == "pixmap" ) {
+ QString s = v.toString();
+ if ( s.isEmpty() ) {
+ pixmaps << QPixmap();
+ } else {
+ pix = loadPixmap( n.firstChild().toElement() );
+ pixmaps << pix;
+ }
+ }
+ } else if ( n.tagName() == "item" ) {
+ item->setOpen( TRUE );
+ createItem( n, widget, item );
+ }
+
+ n = n.nextSibling().toElement();
+ }
+
+ for ( int i = 0; i < lv->columns(); ++i ) {
+ item->setText( i, textes[ i ] );
+ item->setPixmap( i, pixmaps[ i ] );
+ }
+ lastItem = item;
+ }
+}
+
+QWidget *Resource::createSpacer( const QDomElement &e, QWidget *parent, QLayout *layout, Qt::Orientation o )
+{
+ QDomElement n = e.firstChild().toElement();
+ int row = e.attribute( "row" ).toInt();
+ int col = e.attribute( "column" ).toInt();
+ int rowspan = e.attribute( "rowspan" ).toInt();
+ int colspan = e.attribute( "colspan" ).toInt();
+ if ( rowspan < 1 )
+ rowspan = 1;
+ if ( colspan < 1 )
+ colspan = 1;
+
+ Spacer *spacer = (Spacer*) WidgetFactory::create( WidgetDatabase::idFromClassName("Spacer"),
+ parent, "spacer", FALSE);
+ spacer->setOrientation( o );
+ spacer->setInteraciveMode( FALSE );
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" )
+ setObjectProperty( spacer, n.attribute( "name" ), n.firstChild().toElement() );
+ n = n.nextSibling().toElement();
+ }
+ spacer->setInteraciveMode( TRUE );
+ if ( formwindow )
+ formwindow->insertWidget( spacer, pasting );
+ if ( layout ) {
+ if ( ::qt_cast<QBoxLayout*>(layout) )
+ ( (QBoxLayout*)layout )->addWidget( spacer, 0, spacer->alignment() );
+ else
+ ( (QDesignerGridLayout*)layout )->addMultiCellWidget( spacer, row, row + rowspan - 1, col, col + colspan - 1,
+ spacer->alignment() );
+ }
+ return spacer;
+}
+
+/*!
+ Attention: this function has to be in sync with Uic::setObjectProperty(). If you change one, change both.
+*/
+void Resource::setObjectProperty( QObject* obj, const QString &prop, const QDomElement &e )
+{
+ const QMetaProperty *p = obj->metaObject()->property( obj->metaObject()->findProperty( prop, TRUE ), TRUE );
+
+ if ( !::qt_cast<QLayout*>(obj) ) {// no layouts in metadatabase... (RS)
+ if ( obj->inherits( "CustomWidget" ) ) {
+ MetaDataBase::CustomWidget *cw = ( (CustomWidget*)obj )->customWidget();
+ if ( cw && !cw->hasProperty( prop.latin1() ) && !p && prop != "toolTip" && prop != "whatsThis" )
+ return;
+ }
+ MetaDataBase::setPropertyChanged( obj, prop, TRUE );
+ }
+
+ QVariant defVarient;
+ if ( e.tagName() == "font" ) {
+ QFont f( qApp->font() );
+ if ( obj->isWidgetType() && ( (QWidget*)obj )->parentWidget() )
+ f = ( (QWidget*)obj )->parentWidget()->font();
+ defVarient = QVariant( f );
+ }
+
+ QString comment;
+ QVariant v( DomTool::elementToVariant( e, defVarient, comment ) );
+
+ if ( !comment.isEmpty() ) {
+ MetaDataBase::addEntry( obj );
+ MetaDataBase::setPropertyComment( obj, prop, comment );
+ }
+
+ if ( e.tagName() == "pixmap" ) {
+ QPixmap pix = loadPixmap( e );
+ if ( pix.isNull() )
+ return;
+ v = QVariant( pix );
+ } else if ( e.tagName() == "iconset" ) {
+ QPixmap pix = loadPixmap( e, "iconset" );
+ if ( pix.isNull() )
+ return;
+ v = QVariant( QIconSet( pix ) );
+ } else if ( e.tagName() == "image" ) {
+ v = QVariant( loadFromCollection( v.toString() ) );
+ }
+
+ if ( !p ) {
+ MetaDataBase::setFakeProperty( obj, prop, v );
+ if ( obj->isWidgetType() ) {
+ if ( prop == "database" && obj != toplevel ) {
+ QStringList lst = MetaDataBase::fakeProperty( obj, "database" ).toStringList();
+ if ( lst.count() > 2 )
+ dbControls.insert( obj->name(), lst[ 2 ] );
+ else if ( lst.count() == 2 )
+ dbTables.insert( obj->name(), lst );
+ }
+ return;
+ }
+ }
+
+ if ( e.tagName() == "palette" ) {
+ QDomElement n = e.firstChild().toElement();
+ QPalette p;
+ while ( !n.isNull() ) {
+ QColorGroup cg;
+ if ( n.tagName() == "active" ) {
+ cg = loadColorGroup( n );
+ p.setActive( cg );
+ } else if ( n.tagName() == "inactive" ) {
+ cg = loadColorGroup( n );
+ p.setInactive( cg );
+ } else if ( n.tagName() == "disabled" ) {
+ cg = loadColorGroup( n );
+ p.setDisabled( cg );
+ }
+ n = n.nextSibling().toElement();
+ }
+ v = QPalette( p );
+ } else if ( e.tagName() == "enum" && p && p->isEnumType() && prop != "resizeMode" ) {
+ QString key( v.toString() );
+ int vi = p->keyToValue( key );
+ if ( vi == -1 )
+ return; // ignore invalid properties
+ v = QVariant( vi );
+ } else if ( e.tagName() == "set" && p && p->isSetType() ) {
+ QString keys( v.toString() );
+ QStringList lst = QStringList::split( '|', keys );
+ QStrList l;
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it )
+ l.append( *it );
+ v = QVariant( p->keysToValue( l ) );
+ }
+
+ if ( prop == "caption" ) {
+ QCString s1 = v.toCString();
+ QString s2 = v.toString();
+ if ( !s2.isEmpty() )
+ formwindow->setCaption( s2 );
+ else if ( !s1.isEmpty() )
+ formwindow->setCaption( s1 );
+ }
+ if ( prop == "icon" ) {
+ formwindow->setIcon( v.toPixmap() );
+ QString pmk = MetaDataBase::pixmapKey( formwindow, v.toPixmap().serialNumber() );
+ MetaDataBase::setPixmapKey( formwindow,
+ formwindow->icon()->serialNumber(), pmk );
+ }
+
+ if ( prop == "geometry" ) {
+ if ( obj == toplevel ) {
+ hadGeometry = TRUE;
+ toplevel->resize( v.toRect().size() );
+ return;
+ } else if ( obj == formwindow->mainContainer() ) {
+ hadGeometry = TRUE;
+ formwindow->resize( v.toRect().size() );
+ return;
+ }
+ }
+
+ if ( ::qt_cast<QLayout*>(obj) ) {
+ if ( prop == "spacing" ) {
+ MetaDataBase::setSpacing( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)obj ) ), v.toInt() );
+ return;
+ } else if ( prop == "margin" ) {
+ MetaDataBase::setMargin( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)obj ) ), v.toInt() );
+ return;
+ } else if ( e.tagName() == "enum" && prop == "resizeMode" ) {
+ MetaDataBase::setResizeMode( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)obj ) ), v.toString() );
+ return;
+ }
+ }
+
+ if ( prop == "name" ) {
+ if ( pasting ) {
+ QString s = v.toString();
+ formwindow->unify( (QWidget*)obj, s, TRUE );
+ obj->setName( s );
+ return;
+ } else if ( formwindow && obj == formwindow->mainContainer() ) {
+ formwindow->setName( v.toCString() );
+ }
+ }
+
+ if ( prop == "sizePolicy" ) {
+ QSizePolicy sp = v.toSizePolicy();
+ sp.setHeightForWidth( ( (QWidget*)obj )->sizePolicy().hasHeightForWidth() );
+ }
+
+ if ( prop == "cursor" )
+ MetaDataBase::setCursor( (QWidget*)obj, v.toCursor() );
+
+ obj->setProperty( prop, v );
+}
+
+
+QString Resource::saveInCollection( const QImage &img )
+{
+ QString imgName = "none";
+ QValueList<Image>::Iterator it = images.begin();
+ for ( ; it != images.end(); ++it ) {
+ if ( img == ( *it ).img ) {
+ imgName = ( *it ).name;
+ break;
+ }
+ }
+
+ if ( imgName == "none" ) {
+ Image i;
+ imgName = "image" + QString::number( images.count() );
+ i.name = imgName;
+ i.img = img;
+ images.append( i );
+ }
+ return imgName;
+}
+
+void Resource::saveImageData( const QImage &img, QTextStream &ts, int indent )
+{
+ QByteArray ba;
+ QBuffer buf( ba );
+ buf.open( IO_WriteOnly | IO_Translate );
+ QString format;
+ bool compress = FALSE;
+ if (img.hasAlphaBuffer()) {
+ format = "PNG";
+ } else {
+ format = img.depth() > 1 ? "XPM" : "XBM";
+ compress = TRUE;
+ }
+ QImageIO iio( &buf, format );
+ iio.setImage( img );
+ iio.write();
+ buf.close();
+ QByteArray bazip = ba;
+ int i = 0;
+ if (compress) {
+ bazip = qCompress( ba );
+ format += ".GZ";
+ // The first 4 bytes in qCompress() are the length of the unzipped
+ // format. The XPM.GZ format does not use these.
+ i = 4;
+ }
+ ulong len = bazip.size();
+ ts << makeIndent( indent ) << "<data format=\"" + format + "\" length=\"" << ba.size() << "\">";
+ static const char hexchars[] = "0123456789abcdef";
+ for (; i < (int)len; ++i ) {
+ uchar s = (uchar) bazip[i];
+ ts << hexchars[s >> 4];
+ ts << hexchars[s & 0x0f];
+ }
+ ts << "</data>" << endl;
+}
+
+void Resource::saveImageCollection( QTextStream &ts, int indent )
+{
+ ts << makeIndent( indent ) << "<images>" << endl;
+ indent++;
+
+ QValueList<Image>::Iterator it = images.begin();
+ for ( ; it != images.end(); ++it ) {
+ ts << makeIndent( indent ) << "<image name=\"" << (*it).name << "\">" << endl;
+ indent++;
+ saveImageData( (*it).img, ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</image>" << endl;
+ }
+
+ indent--;
+ ts << makeIndent( indent ) << "</images>" << endl;
+}
+
+static QImage loadImageData( QDomElement &n2 )
+{
+ QImage img;
+ QString data = n2.firstChild().toText().data();
+ const int lengthOffset = 4;
+ int baSize = data.length() / 2 + lengthOffset;
+ uchar *ba = new uchar[ baSize ];
+ for ( int i = lengthOffset; i < baSize; ++i ) {
+ char h = data[ 2 * (i-lengthOffset) ].latin1();
+ char l = data[ 2 * (i-lengthOffset) + 1 ].latin1();
+ uchar r = 0;
+ if ( h <= '9' )
+ r += h - '0';
+ else
+ r += h - 'a' + 10;
+ r = r << 4;
+ if ( l <= '9' )
+ r += l - '0';
+ else
+ r += l - 'a' + 10;
+ ba[ i ] = r;
+ }
+ QString format = n2.attribute( "format", "PNG" );
+ if ( format == "XPM.GZ" || format == "XBM.GZ" ) {
+ ulong len = n2.attribute( "length" ).toULong();
+ if ( len < data.length() * 5 )
+ len = data.length() * 5;
+ // qUncompress() expects the first 4 bytes to be the expected length of
+ // the uncompressed data
+ ba[0] = ( len & 0xff000000 ) >> 24;
+ ba[1] = ( len & 0x00ff0000 ) >> 16;
+ ba[2] = ( len & 0x0000ff00 ) >> 8;
+ ba[3] = ( len & 0x000000ff );
+ QByteArray baunzip = qUncompress( ba, baSize );
+ img.loadFromData( (const uchar*)baunzip.data(), baunzip.size(), format.left(format.find('.')) );
+ } else {
+ img.loadFromData( (const uchar*)ba+lengthOffset, baSize-lengthOffset, format );
+ }
+ delete [] ba;
+ return img;
+}
+
+void Resource::loadImageCollection( const QDomElement &e )
+{
+ QDomElement n = e.firstChild().toElement();
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "image" ) {
+ Image img;
+ img.name = n.attribute( "name" );
+ QDomElement n2 = n.firstChild().toElement();
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "data" )
+ img.img = loadImageData( n2 );
+ n2 = n2.nextSibling().toElement();
+ }
+ images.append( img );
+ n = n.nextSibling().toElement();
+ }
+ }
+}
+
+QImage Resource::loadFromCollection( const QString &name )
+{
+ QValueList<Image>::Iterator it = images.begin();
+ for ( ; it != images.end(); ++it ) {
+ if ( ( *it ).name == name )
+ return ( *it ).img;
+ }
+ return QImage();
+}
+
+void Resource::saveConnections( QTextStream &ts, int indent )
+{
+ QValueList<MetaDataBase::Connection> connections = MetaDataBase::connections( formwindow );
+ if ( connections.isEmpty() )
+ return;
+ ts << makeIndent( indent ) << "<connections>" << endl;
+ indent++;
+ QValueList<MetaDataBase::Connection>::Iterator it = connections.begin();
+ for ( ; it != connections.end(); ++it ) {
+ MetaDataBase::Connection conn = *it;
+ if ( ( knownNames.findIndex( QString( conn.sender->name() ) ) == -1 &&
+ qstrcmp( conn.sender->name(), "this" ) != 0 ) ||
+ ( knownNames.findIndex( QString( conn.receiver->name() ) ) == -1 &&
+ qstrcmp( conn.receiver->name(), "this" ) != 0 ) )
+ continue;
+ if ( formwindow->isMainContainer( (QWidget*)(*it).receiver ) &&
+ !MetaDataBase::hasSlot( formwindow, MetaDataBase::normalizeFunction( (*it).slot ).latin1() ) )
+ continue;
+
+ if ( conn.sender->inherits( "CustomWidget" ) ) {
+ MetaDataBase::CustomWidget *cw = ( (CustomWidget*)conn.sender )->customWidget();
+ if ( cw && !cw->hasSignal( conn.signal ) )
+ continue;
+ }
+
+ if ( conn.receiver->inherits( "CustomWidget" ) && !formwindow->isMainContainer( conn.receiver ) ) {
+ MetaDataBase::CustomWidget *cw = ( (CustomWidget*)conn.receiver )->customWidget();
+ if ( cw && !cw->hasSlot( MetaDataBase::normalizeFunction( conn.slot ).latin1() ) )
+ continue;
+ }
+
+ ts << makeIndent( indent ) << "<connection>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<sender>" << entitize( conn.sender->name() ) << "</sender>" << endl;
+ ts << makeIndent( indent ) << "<signal>" << entitize( conn.signal ) << "</signal>" << endl;
+ ts << makeIndent( indent ) << "<receiver>" << entitize( conn.receiver->name() ) << "</receiver>" << endl;
+ ts << makeIndent( indent ) << "<slot>" << entitize( MetaDataBase::normalizeFunction( conn.slot ) ) << "</slot>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</connection>" << endl;
+ }
+
+ QString lang = formwindow->project()->language();
+ indent--;
+ ts << makeIndent( indent ) << "</connections>" << endl;
+}
+
+void Resource::loadConnections( const QDomElement &e )
+{
+ QDomElement n = e.firstChild().toElement();
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "connection" ) {
+ QString lang = n.attribute( "language", "C++" );
+ QDomElement n2 = n.firstChild().toElement();
+ MetaDataBase::Connection conn;
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "sender" ) {
+ conn.sender = 0;
+ QString name = n2.firstChild().toText().data();
+ if ( name == "this" || qstrcmp( toplevel->name(), name ) == 0 ) {
+ conn.sender = toplevel;
+ } else {
+ if ( name == "this" )
+ name = toplevel->name();
+ QObjectList *l = toplevel->queryList( 0, name, FALSE );
+ if ( l ) {
+ if ( l->first() )
+ conn.sender = l->first();
+ delete l;
+ l = 0;
+ }
+ if ( !conn.sender )
+ conn.sender = formwindow->findAction( name );
+ }
+ } else if ( n2.tagName() == "signal" ) {
+ conn.signal = n2.firstChild().toText().data();
+ } else if ( n2.tagName() == "receiver" ) {
+ conn.receiver = 0;
+ QString name = n2.firstChild().toText().data();
+ if ( name == "this" || qstrcmp( toplevel->name(), name ) == 0 ) {
+ conn.receiver = toplevel;
+ } else {
+ QObjectList *l = toplevel->queryList( 0, name, FALSE );
+ if ( l ) {
+ if ( l->first() )
+ conn.receiver = l->first();
+ delete l;
+ l = 0;
+ }
+ if ( !conn.receiver )
+ conn.receiver = formwindow->findAction( name );
+ }
+ } else if ( n2.tagName() == "slot" ) {
+ conn.slot = n2.firstChild().toText().data();
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ if ( formwindow ) {
+ if ( conn.sender == formwindow )
+ conn.sender = formwindow->mainContainer();
+ if ( conn.receiver == formwindow )
+ conn.receiver = formwindow->mainContainer();
+ }
+ if ( conn.sender && conn.receiver ) {
+ if ( lang == "C++" ) {
+ MetaDataBase::addConnection( formwindow ? formwindow : toplevel,
+ conn.sender, conn.signal, conn.receiver, conn.slot );
+ }
+ }
+ } else if ( n.tagName() == "slot" ) { // compatibility with 2.x
+ MetaDataBase::Function slot;
+ slot.specifier = n.attribute( "specifier", "virtual" );
+ if ( slot.specifier.isEmpty() )
+ slot.specifier = "virtual";
+ slot.access = n.attribute( "access", "public" );
+ if ( slot.access.isEmpty() )
+ slot.access = "public";
+ slot.language = n.attribute( "language", "C++" );
+ slot.returnType = n.attribute( "returnType", "void" );
+ if ( slot.returnType.isEmpty() )
+ slot.returnType = "void";
+ slot.function = n.firstChild().toText().data();
+ if ( !MetaDataBase::hasFunction( formwindow, slot.function, TRUE ) )
+ MetaDataBase::addFunction( formwindow, slot.function, slot.specifier,
+ slot.access, "slot", slot.language, slot.returnType );
+ else
+ MetaDataBase::changeFunctionAttributes( formwindow, slot.function, slot.function,
+ slot.specifier, slot.access,
+ "slot", slot.language, slot.returnType );
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void Resource::saveCustomWidgets( QTextStream &ts, int indent )
+{
+ ts << makeIndent( indent ) << "<customwidgets>" << endl;
+ indent++;
+
+ QPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets();
+ for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) {
+ if ( usedCustomWidgets.findIndex( w->className ) == -1 )
+ continue;
+ ts << makeIndent( indent ) << "<customwidget>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<class>" << w->className << "</class>" << endl;
+ ts << makeIndent( indent ) << "<header location=\""
+ << ( w->includePolicy == MetaDataBase::CustomWidget::Local ? "local" : "global" )
+ << "\">" << w->includeFile << "</header>" << endl;
+ ts << makeIndent( indent ) << "<sizehint>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<width>" << w->sizeHint.width() << "</width>" << endl;
+ ts << makeIndent( indent ) << "<height>" << w->sizeHint.height() << "</height>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</sizehint>" << endl;
+ ts << makeIndent( indent ) << "<container>" << (int)w->isContainer << "</container>" << endl;
+ ts << makeIndent( indent ) << "<sizepolicy>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<hordata>" << (int)w->sizePolicy.horData() << "</hordata>" << endl;
+ ts << makeIndent( indent ) << "<verdata>" << (int)w->sizePolicy.verData() << "</verdata>" << endl;
+ ts << makeIndent( indent ) << "<horstretch>" << (int)w->sizePolicy.horStretch() << "</horstretch>" << endl;
+ ts << makeIndent( indent ) << "<verstretch>" << (int)w->sizePolicy.verStretch() << "</verstretch>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</sizepolicy>" << endl;
+ ts << makeIndent( indent ) << "<pixmap>" << saveInCollection( w->pixmap->convertToImage() ) << "</pixmap>" << endl;
+ if ( !w->lstSignals.isEmpty() ) {
+ for ( QValueList<QCString>::Iterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it )
+ ts << makeIndent( indent ) << "<signal>" << entitize( *it ) << "</signal>" << endl;
+ }
+ if ( !w->lstSlots.isEmpty() ) {
+ for ( QValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it )
+ ts << makeIndent( indent ) << "<slot access=\"" << (*it).access << "\" specifier=\""
+ << (*it).specifier << "\">" << entitize( (*it).function ) << "</slot>" << endl;
+ }
+ if ( !w->lstProperties.isEmpty() ) {
+ for ( QValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.begin(); it != w->lstProperties.end(); ++it )
+ ts << makeIndent( indent ) << "<property type=\"" << (*it).type << "\">" << entitize( (*it).property ) << "</property>" << endl;
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</customwidget>" << endl;
+ }
+
+
+ indent--;
+ ts << makeIndent( indent ) << "</customwidgets>" << endl;
+}
+
+void Resource::loadCustomWidgets( const QDomElement &e, Resource *r )
+{
+ QDomElement n = e.firstChild().toElement();
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "customwidget" ) {
+ QDomElement n2 = n.firstChild().toElement();
+ MetaDataBase::CustomWidget *w = new MetaDataBase::CustomWidget;
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "class" ) {
+ w->className = n2.firstChild().toText().data();
+ } else if ( n2.tagName() == "header" ) {
+ w->includeFile = n2.firstChild().toText().data();
+ QString s = n2.attribute( "location" );
+ if ( s != "local" )
+ w->includePolicy = MetaDataBase::CustomWidget::Global;
+ else
+ w->includePolicy = MetaDataBase::CustomWidget::Local;
+ } else if ( n2.tagName() == "sizehint" ) {
+ QDomElement n3 = n2.firstChild().toElement();
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "width" )
+ w->sizeHint.setWidth( n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "height" )
+ w->sizeHint.setHeight( n3.firstChild().toText().data().toInt() );
+ n3 = n3.nextSibling().toElement();
+ }
+ } else if ( n2.tagName() == "sizepolicy" ) {
+ QDomElement n3 = n2.firstChild().toElement();
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "hordata" )
+ w->sizePolicy.setHorData( (QSizePolicy::SizeType)n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "verdata" )
+ w->sizePolicy.setVerData( (QSizePolicy::SizeType)n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "horstretch" )
+ w->sizePolicy.setHorStretch( n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "verstretch" )
+ w->sizePolicy.setVerStretch( n3.firstChild().toText().data().toInt() );
+ n3 = n3.nextSibling().toElement();
+ }
+ } else if ( n2.tagName() == "pixmap" ) {
+ QPixmap pix;
+ if ( r ) {
+ pix = r->loadPixmap( n2 );
+ } else {
+ QDomElement n3 = n2.firstChild().toElement();
+ QImage img;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "data" ) {
+ img = loadImageData( n3 );
+ }
+ n3 = n3.nextSibling().toElement();
+ }
+ pix.convertFromImage( img );
+ }
+ w->pixmap = new QPixmap( pix );
+ } else if ( n2.tagName() == "signal" ) {
+ w->lstSignals.append( n2.firstChild().toText().data().latin1() );
+ } else if ( n2.tagName() == "container" ) {
+ w->isContainer = (bool)n2.firstChild().toText().data().toInt();
+ } else if ( n2.tagName() == "slot" ) {
+ MetaDataBase::Function function;
+ function.function = n2.firstChild().toText().data().latin1();
+ function.access = n2.attribute( "access" );
+ function.type = "slot";
+ w->lstSlots.append( function );
+ } else if ( n2.tagName() == "property" ) {
+ MetaDataBase::Property property;
+ property.property = n2.firstChild().toText().data().latin1();
+ property.type = n2.attribute( "type" );
+ w->lstProperties.append( property );
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ MetaDataBase::addCustomWidget( w );
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void Resource::saveTabOrder( QTextStream &ts, int indent )
+{
+ QWidgetList l = MetaDataBase::tabOrder( toplevel );
+ if ( l.isEmpty() )
+ return;
+
+ ts << makeIndent( indent ) << "<tabstops>" << endl;
+ indent++;
+
+ for ( QWidget *w = l.first(); w; w = l.next() ) {
+ if ( w->testWState( Qt::WState_ForceHide ) || knownNames.findIndex( w->name() ) == -1 )
+ continue;
+ ts << makeIndent( indent ) << "<tabstop>" << w->name() << "</tabstop>" << endl;
+ }
+
+ indent--;
+ ts << makeIndent( indent ) << "</tabstops>" << endl;
+}
+
+void Resource::loadTabOrder( const QDomElement &e )
+{
+ QWidget *last = 0;
+ QDomElement n = e.firstChild().toElement();
+ QWidgetList widgets;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "tabstop" ) {
+ QString name = n.firstChild().toText().data();
+ if ( name.isEmpty() )
+ continue;
+ QObjectList *l = toplevel->queryList( 0, name, FALSE );
+ if ( l ) {
+ if ( l->first() ) {
+ QWidget *w = (QWidget*)l->first();
+ widgets.append( w );
+ if ( last )
+ toplevel->setTabOrder( last, w );
+ last = w;
+ }
+ delete l;
+ }
+ }
+ n = n.nextSibling().toElement();
+ }
+
+ if ( !widgets.isEmpty() )
+ MetaDataBase::setTabOrder( toplevel, widgets );
+}
+
+void Resource::saveMetaInfoBefore( QTextStream &ts, int indent )
+{
+ MetaDataBase::MetaInfo info = MetaDataBase::metaInfo( formwindow );
+ QString cn;
+ if ( info.classNameChanged && !info.className.isEmpty() )
+ cn = info.className;
+ else
+ cn = formwindow->name();
+ ts << makeIndent( indent ) << "<class>" << entitize( cn ) << "</class>" << endl;
+ if ( !info.comment.isEmpty() )
+ ts << makeIndent( indent ) << "<comment>" << entitize( info.comment ) << "</comment>" << endl;
+ if ( !info.author.isEmpty() )
+ ts << makeIndent( indent ) << "<author>" << entitize( info.author ) << "</author>" << endl;
+}
+
+void Resource::saveMetaInfoAfter( QTextStream &ts, int indent )
+{
+ MetaDataBase::MetaInfo info = MetaDataBase::metaInfo( formwindow );
+ if ( !langIface || formwindow->project()->isCpp() ) {
+ QValueList<MetaDataBase::Include> includes = MetaDataBase::includes( formwindow );
+ QString extensionInclude;
+ bool needExtensionInclude = FALSE;
+ if ( langIface &&
+ formwindow->formFile()->hasFormCode() &&
+ formwindow->formFile()->codeFileState() != FormFile::Deleted ) {
+ extensionInclude = QFileInfo( currFileName ).fileName() + langIface->formCodeExtension();
+ needExtensionInclude = TRUE;
+ }
+ if ( !includes.isEmpty() || needExtensionInclude ) {
+ ts << makeIndent( indent ) << "<includes>" << endl;
+ indent++;
+
+ for ( QValueList<MetaDataBase::Include>::Iterator it = includes.begin(); it != includes.end(); ++it ) {
+ ts << makeIndent( indent ) << "<include location=\"" << (*it).location
+ << "\" impldecl=\"" << (*it).implDecl << "\">" << (*it).header << "</include>" << endl;
+ if ( needExtensionInclude )
+ needExtensionInclude = (*it).header != extensionInclude;
+ }
+
+ if ( needExtensionInclude )
+ ts << makeIndent( indent ) << "<include location=\"local\" impldecl=\"in implementation\">"
+ << extensionInclude << "</include>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</includes>" << endl;
+ }
+
+ QStringList forwards = MetaDataBase::forwards( formwindow );
+ if ( !forwards.isEmpty() ) {
+ ts << makeIndent( indent ) << "<forwards>" << endl;
+ indent++;
+ for ( QStringList::Iterator it2 = forwards.begin(); it2 != forwards.end(); ++it2 )
+ ts << makeIndent( indent ) << "<forward>" << entitize( *it2 ) << "</forward>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</forwards>" << endl;
+ }
+ QValueList<MetaDataBase::Variable> varLst = MetaDataBase::variables( formwindow );
+ if ( !varLst.isEmpty() ) {
+ ts << makeIndent( indent ) << "<variables>" << endl;
+ indent++;
+
+ QValueList<MetaDataBase::Variable>::Iterator it = varLst.begin();
+ for ( ; it != varLst.end(); ++it ) {
+ ts << makeIndent( indent ) << "<variable";
+ if ( (*it).varAccess != "protected" )
+ ts << " access=\"" << (*it).varAccess << "\"";
+
+ ts << ">" << entitize( (*it).varName ) << "</variable>" << endl;
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</variables>" << endl;
+ }
+ QStringList sigs = MetaDataBase::signalList( formwindow );
+ if ( !sigs.isEmpty() ) {
+ ts << makeIndent( indent ) << "<signals>" << endl;
+ indent++;
+ for ( QStringList::Iterator it3 = sigs.begin(); it3 != sigs.end(); ++it3 )
+ ts << makeIndent( indent ) << "<signal>" << entitize( *it3 ) << "</signal>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</signals>" << endl;
+ }
+
+ QValueList<MetaDataBase::Function> slotList = MetaDataBase::slotList( formwindow );
+ if ( !slotList.isEmpty() ) {
+ ts << makeIndent( indent ) << "<slots>" << endl;
+ indent++;
+ QString lang = formwindow->project()->language();
+ QValueList<MetaDataBase::Function>::Iterator it = slotList.begin();
+ for ( ; it != slotList.end(); ++it ) {
+ MetaDataBase::Function function = *it;
+ ts << makeIndent( indent ) << "<slot";
+ if ( function.access != "public" )
+ ts << " access=\"" << function.access << "\"";
+ if ( function.specifier != "virtual" )
+ ts << " specifier=\"" << function.specifier << "\"";
+ if ( function.language != "C++" )
+ ts << " language=\"" << function.language<< "\"";
+ if ( function.returnType != "void" )
+ ts << " returnType=\"" << entitize( function.returnType ) << "\"";
+ ts << ">" << entitize( function.function ) << "</slot>" << endl;
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</slots>" << endl;
+ }
+
+ QValueList<MetaDataBase::Function> functionList = MetaDataBase::functionList( formwindow, TRUE );
+ if ( !functionList.isEmpty() ) {
+ ts << makeIndent( indent ) << "<functions>" << endl;
+ indent++;
+ QString lang = formwindow->project()->language();
+ QValueList<MetaDataBase::Function>::Iterator it = functionList.begin();
+ for ( ; it != functionList.end(); ++it ) {
+ MetaDataBase::Function function = *it;
+ ts << makeIndent( indent ) << "<function";
+ if ( function.access != "public" )
+ ts << " access=\"" << function.access << "\"";
+ if ( function.specifier != "virtual" )
+ ts << " specifier=\"" << function.specifier << "\"";
+ if ( function.language != "C++" )
+ ts << " language=\"" << function.language<< "\"";
+ if ( function.returnType != "void" )
+ ts << " returnType=\"" << entitize( function.returnType ) << "\"";
+ ts << ">" << entitize( function.function ) << "</function>" << endl;
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</functions>" << endl;
+ }
+ }
+
+ if ( formwindow && formwindow->savePixmapInline() )
+ ;
+ else if ( formwindow && formwindow->savePixmapInProject() )
+ ts << makeIndent( indent ) << "<pixmapinproject/>" << endl;
+ else
+ ts << makeIndent( indent ) << "<pixmapfunction>" << formwindow->pixmapLoaderFunction() << "</pixmapfunction>" << endl;
+ if ( !( exportMacro = MetaDataBase::exportMacro( formwindow->mainContainer() ) ).isEmpty() )
+ ts << makeIndent( indent ) << "<exportmacro>" << exportMacro << "</exportmacro>" << endl;
+ if ( formwindow ) {
+ ts << makeIndent( indent ) << "<layoutdefaults spacing=\"" << formwindow->layoutDefaultSpacing()
+ << "\" margin=\"" << formwindow->layoutDefaultMargin() << "\"/>" << endl;
+ if ( formwindow->hasLayoutFunctions() ) {
+ QString s = "";
+ QString m = "";
+ if ( !formwindow->spacingFunction().isEmpty() )
+ s = QString( " spacing=\"%1\"" ).arg( formwindow->spacingFunction() );
+ if ( !formwindow->marginFunction().isEmpty() )
+ m = QString( " margin=\"%1\"" ).arg( formwindow->marginFunction() );
+ ts << makeIndent( indent ) << "<layoutfunctions" << s << m << "/>" << endl;
+ }
+ }
+}
+
+void Resource::saveIncludeHints( QTextStream &ts, int indent )
+{
+ if ( includeHints.isEmpty() )
+ return;
+ ts << makeIndent( indent ) << "<includehints>" << endl;
+ indent++;
+ for ( QStringList::Iterator it = includeHints.begin(); it != includeHints.end(); ++it )
+ ts << makeIndent( indent ) << "<includehint>" << *it << "</includehint>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</includehints>" << endl;
+}
+
+QColorGroup Resource::loadColorGroup( const QDomElement &e )
+{
+ QColorGroup cg;
+ int r = -1;
+ QDomElement n = e.firstChild().toElement();
+ QColor col;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "color" ) {
+ r++;
+ cg.setColor( (QColorGroup::ColorRole)r, (col = DomTool::readColor( n ) ) );
+ } else if ( n.tagName() == "pixmap" ) {
+ QPixmap pix = loadPixmap( n );
+ cg.setBrush( (QColorGroup::ColorRole)r, QBrush( col, pix ) );
+ }
+ n = n.nextSibling().toElement();
+ }
+ return cg;
+}
+
+void Resource::saveChildActions( QAction *a, QTextStream &ts, int indent )
+{
+ if ( !a->children() )
+ return;
+ QObjectListIt it( *a->children() );
+ while ( it.current() ) {
+ QObject *o = it.current();
+ ++it;
+ if ( !::qt_cast<QAction*>(o) )
+ continue;
+ QAction *ac = (QAction*)o;
+ bool isGroup = ::qt_cast<QActionGroup*>(ac);
+ if ( isGroup )
+ ts << makeIndent( indent ) << "<actiongroup>" << endl;
+ else
+ ts << makeIndent( indent ) << "<action>" << endl;
+ indent++;
+ saveObjectProperties( ac, ts, indent );
+ indent--;
+ if ( isGroup ) {
+ indent++;
+ saveChildActions( ac, ts, indent );
+ indent--;
+ }
+ if ( isGroup )
+ ts << makeIndent( indent ) << "</actiongroup>" << endl;
+ else
+ ts << makeIndent( indent ) << "</action>" << endl;
+ }
+}
+
+void Resource::saveActions( const QPtrList<QAction> &actions, QTextStream &ts, int indent )
+{
+ if ( actions.isEmpty() )
+ return;
+ ts << makeIndent( indent ) << "<actions>" << endl;
+ indent++;
+ QPtrListIterator<QAction> it( actions );
+ while ( it.current() ) {
+ QAction *a = it.current();
+ bool isGroup = ::qt_cast<QActionGroup*>(a);
+ if ( isGroup )
+ ts << makeIndent( indent ) << "<actiongroup>" << endl;
+ else
+ ts << makeIndent( indent ) << "<action>" << endl;
+ indent++;
+ saveObjectProperties( a, ts, indent );
+ indent--;
+ if ( isGroup ) {
+ indent++;
+ saveChildActions( a, ts, indent );
+ indent--;
+ }
+ if ( isGroup )
+ ts << makeIndent( indent ) << "</actiongroup>" << endl;
+ else
+ ts << makeIndent( indent ) << "</action>" << endl;
+ ++it;
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</actions>" << endl;
+}
+
+void Resource::loadChildAction( QObject *parent, const QDomElement &e )
+{
+ QDomElement n = e;
+ QAction *a = 0;
+ if ( n.tagName() == "action" ) {
+ a = new QDesignerAction( parent );
+ MetaDataBase::addEntry( a );
+ QDomElement n2 = n.firstChild().toElement();
+ bool hasMenuText = FALSE;
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "property" ) {
+ QDomElement n3(n2); // don't modify n2
+ QString prop = n3.attribute( "name" );
+ if (prop == "menuText")
+ hasMenuText = TRUE;
+ QDomElement value(n3.firstChild().toElement());
+ setObjectProperty( a, prop, value );
+ if (!hasMenuText && uiFileVersion < "3.3" && prop == "text")
+ setObjectProperty( a, "menuText", value );
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ if ( !::qt_cast<QAction*>(parent) )
+ formwindow->actionList().append( a );
+ } else if ( n.tagName() == "actiongroup" ) {
+ a = new QDesignerActionGroup( parent );
+ MetaDataBase::addEntry( a );
+ QDomElement n2 = n.firstChild().toElement();
+ bool hasMenuText = FALSE;
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "property" ) {
+ QDomElement n3(n2); // don't modify n2
+ QString prop = n3.attribute( "name" );
+ if (prop == "menuText")
+ hasMenuText = TRUE;
+ QDomElement value = n3.firstChild().toElement();
+ setObjectProperty( a, prop, value );
+ if (!hasMenuText && uiFileVersion < "3.3" && prop == "text")
+ setObjectProperty( a, "menuText", value );
+ } else if ( n2.tagName() == "action" ||
+ n2.tagName() == "actiongroup" ) {
+ loadChildAction( a, n2 );
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ if ( !::qt_cast<QAction*>(parent) )
+ formwindow->actionList().append( a );
+ }
+}
+
+void Resource::loadActions( const QDomElement &e )
+{
+ QDomElement n = e.firstChild().toElement();
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "action" ) {
+ loadChildAction( formwindow, n );
+ } else if ( n.tagName() == "actiongroup" ) {
+ loadChildAction( formwindow, n );
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void Resource::saveToolBars( QMainWindow *mw, QTextStream &ts, int indent )
+{
+ ts << makeIndent( indent ) << "<toolbars>" << endl;
+ indent++;
+
+ QPtrList<QToolBar> tbList;
+ for ( int i = 0; i <= (int)Qt::DockMinimized; ++i ) {
+ tbList = mw->toolBars( (Qt::Dock)i );
+ if ( tbList.isEmpty() )
+ continue;
+ for ( QToolBar *tb = tbList.first(); tb; tb = tbList.next() ) {
+ if ( tb->isHidden() )
+ continue;
+ ts << makeIndent( indent ) << "<toolbar dock=\"" << i << "\">" << endl;
+ indent++;
+ saveObjectProperties( tb, ts, indent );
+ QPtrList<QAction> actionList = ( (QDesignerToolBar*)tb )->insertedActions();
+ for ( QAction *a = actionList.first(); a; a = actionList.next() ) {
+ if ( ::qt_cast<QSeparatorAction*>(a) ) {
+ ts << makeIndent( indent ) << "<separator/>" << endl;
+ } else {
+ if ( ::qt_cast<QDesignerAction*>(a) && !( (QDesignerAction*)a )->supportsMenu() ) {
+ QWidget *w = ( (QDesignerAction*)a )->widget();
+ ts << makeIndent( indent ) << "<widget class=\""
+ << WidgetFactory::classNameOf( w ) << "\">" << endl;
+ indent++;
+ const char *className = WidgetFactory::classNameOf( w );
+ if ( w->isA( "CustomWidget" ) )
+ usedCustomWidgets << QString( className );
+ if ( WidgetFactory::hasItems( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( w ) ), w ) )
+ saveItems( w, ts, indent );
+ saveObjectProperties( w, ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</widget>" << endl;
+ } else {
+ ts << makeIndent( indent ) << "<action name=\"" << a->name() << "\"/>" << endl;
+ }
+ }
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</toolbar>" << endl;
+ }
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</toolbars>" << endl;
+}
+
+void Resource::saveMenuBar( QMainWindow *mw, QTextStream &ts, int indent )
+{
+ MenuBarEditor *mb = (MenuBarEditor *)mw->child( 0, "MenuBarEditor" );
+ if ( !mb )
+ return;
+ ts << makeIndent( indent ) << "<menubar>" << endl;
+ indent++;
+ MetaDataBase::setPropertyChanged( mb, "name", TRUE ); // FIXME: remove
+ saveObjectProperties( mb, ts, indent );
+
+ for ( int i = 0; i < (int)mb->count(); ++i ) {
+ MenuBarEditorItem *m = mb->item( i );
+ if ( !m )
+ continue;
+ if ( m->isSeparator() ) {
+ ts << makeIndent( indent ) << "<separator/>" << endl;
+ } else {
+ ts << makeIndent( indent ) << "<item text=\"" << entitize( m->menuText() )
+ << "\" name=\"" << entitize( m->menu()->name() ) << "\">" << endl;
+ indent++;
+ savePopupMenu( m->menu(), mw, ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</item>" << endl;
+ }
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</menubar>" << endl;
+}
+
+void Resource::savePopupMenu( PopupMenuEditor *pm, QMainWindow *mw, QTextStream &ts, int indent )
+{
+ for ( PopupMenuEditorItem *i = pm->items()->first(); i; i = pm->items()->next() ) {
+ QAction *a = i->action();
+ if ( ::qt_cast<QSeparatorAction*>(a) )
+ ts << makeIndent( indent ) << "<separator/>" << endl;
+ else if ( ::qt_cast<QDesignerAction*>(a) )
+ ts << makeIndent( indent ) << "<action name=\"" << a->name() << "\"/>" << endl;
+ else if ( ::qt_cast<QDesignerActionGroup*>(a) )
+ ts << makeIndent( indent ) << "<actiongroup name=\"" << a->name() << "\"/>" << endl;
+ PopupMenuEditor *s = i->subMenu();
+ if ( s && s->count() ) {
+ QString n = s->name();
+ ts << makeIndent( indent ) << "<item text=\"" << entitize( a->menuText() )
+ << "\" name=\"" << entitize( n )
+ << "\" accel=\"" << entitize( a->accel() )
+ << "\">" << endl;
+ indent++;
+ savePopupMenu( s, mw, ts, indent );
+ indent--;
+ ts << makeIndent( indent ) << "</item>" << endl;
+ }
+ }
+}
+
+void Resource::loadToolBars( const QDomElement &e )
+{
+ QDomElement n = e.firstChild().toElement();
+ QMainWindow *mw = ( (QMainWindow*)formwindow->mainContainer() );
+ QDesignerToolBar *tb = 0;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "toolbar" ) {
+ Qt::Dock dock = (Qt::Dock)n.attribute( "dock" ).toInt();
+ tb = new QDesignerToolBar( mw, dock );
+ QDomElement n2 = n.firstChild().toElement();
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "action" ) {
+ QAction *a = formwindow->findAction( n2.attribute( "name" ) );
+ if ( a ) {
+ a->addTo( tb );
+ tb->addAction( a );
+ }
+ } else if ( n2.tagName() == "separator" ) {
+ QAction *a = new QSeparatorAction( 0 );
+ a->addTo( tb );
+ tb->addAction( a );
+ } else if ( n2.tagName() == "widget" ) {
+ QWidget *w = (QWidget*)createObject( n2, tb );
+ QDesignerAction *a = new QDesignerAction( w, tb );
+ a->addTo( tb );
+ tb->addAction( a );
+ tb->installEventFilters( w );
+ } else if ( n2.tagName() == "property" ) {
+ setObjectProperty( tb, n2.attribute( "name" ), n2.firstChild().toElement() );
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void Resource::loadMenuBar( const QDomElement &e )
+{
+ QDomElement n = e.firstChild().toElement();
+ QMainWindow *mw = (QMainWindow*)formwindow->mainContainer();
+ MenuBarEditor *mb = new MenuBarEditor( formwindow, mw );
+ MetaDataBase::addEntry( mb );
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "item" ) {
+ PopupMenuEditor * popup = new PopupMenuEditor( formwindow, mw );
+ loadPopupMenu( popup, n );
+ popup->setName( n.attribute( "name" ) );
+ mb->insertItem( n.attribute( "text" ), popup );
+ MetaDataBase::addEntry( popup );
+ } else if ( n.tagName() == "property" ) {
+ setObjectProperty( mb, n.attribute( "name" ), n.firstChild().toElement() );
+ } else if ( n.tagName() == "separator" ) {
+ mb->insertSeparator();
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void Resource::loadPopupMenu( PopupMenuEditor *p, const QDomElement &e )
+{
+ MetaDataBase::addEntry( p );
+ QDomElement n = e.firstChild().toElement();
+ QAction *a = 0;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "action" || n.tagName() == "actiongroup") {
+ a = formwindow->findAction( n.attribute( "name" ) );
+ if ( a )
+ p->insert( a );
+ }
+ if ( n.tagName() == "item" ) {
+ PopupMenuEditorItem *i = p->at( p->find( a ) );
+ if ( i ) {
+ QString name = n.attribute( "name" );
+ formwindow->unify( i, name, TRUE );
+ i->setName( name );
+ MetaDataBase::addEntry( i );
+ loadPopupMenu( i->subMenu(), n );
+ }
+ } else if ( n.tagName() == "separator" ) {
+ a = new QSeparatorAction( 0 );
+ p->insert( a );
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+bool Resource::saveFormCode( FormFile *formfile, LanguageInterface * /*langIface*/ )
+{
+ QString lang = formfile->project()->language();
+ if ( formfile->hasTempFileName() ||
+ formfile->code().isEmpty() ||
+ !formfile->hasFormCode() ||
+ !formfile->isModified(FormFile::WFormCode) )
+ return TRUE; // There is no code to be saved.
+ return saveCode( formfile->project()->makeAbsolute(formfile->codeFile()),
+ formfile->code() );
+}
+
+void Resource::loadExtraSource( FormFile *formfile, const QString &currFileName,
+ LanguageInterface *langIface, bool hasFunctions )
+{
+ QString lang = "Qt Script";
+ if ( MainWindow::self )
+ lang = MainWindow::self->currProject()->language();
+ LanguageInterface *iface = langIface;
+ if ( hasFunctions || !iface )
+ return;
+ QValueList<LanguageInterface::Function> functions;
+ QStringList forwards;
+ QStringList includesImpl;
+ QStringList includesDecl;
+ QStringList vars;
+ QValueList<LanguageInterface::Connection> connections;
+
+ iface->loadFormCode( formfile->formName(),
+ currFileName + iface->formCodeExtension(),
+ functions,
+ vars,
+ connections );
+
+ QFile f( formfile->project()->makeAbsolute( formfile->codeFile() ) );
+ QString code;
+ if ( f.open( IO_ReadOnly ) ) {
+ QTextStream ts( &f );
+ code = ts.read();
+ }
+ formfile->setCode( code );
+
+ if ( !MainWindow::self || !MainWindow::self->currProject()->isCpp() )
+ MetaDataBase::setupConnections( formfile, connections );
+
+ for ( QValueList<LanguageInterface::Function>::Iterator fit = functions.begin();
+ fit != functions.end(); ++fit ) {
+
+ if ( MetaDataBase::hasFunction( formfile->formWindow() ?
+ (QObject*)formfile->formWindow() :
+ (QObject*)formfile,
+ (*fit).name.latin1() ) ) {
+ QString access = (*fit).access;
+ if ( !MainWindow::self || !MainWindow::self->currProject()->isCpp() )
+ MetaDataBase::changeFunction( formfile->formWindow() ?
+ (QObject*)formfile->formWindow() :
+ (QObject*)formfile,
+ (*fit).name,
+ (*fit).name,
+ QString::null );
+ } else {
+ QString access = (*fit).access;
+ if ( access.isEmpty() )
+ access = "protected";
+ QString type = "function";
+ if ( (*fit).returnType == "void" )
+ type = "slot";
+ MetaDataBase::addFunction( formfile->formWindow() ?
+ (QObject*)formfile->formWindow() :
+ (QObject*)formfile,
+ (*fit).name.latin1(), "virtual", (*fit).access,
+ type, lang, (*fit).returnType );
+ }
+ }
+}
diff --git a/tools/designer/designer/resource.h b/tools/designer/designer/resource.h
new file mode 100644
index 0000000..f7f4cea
--- /dev/null
+++ b/tools/designer/designer/resource.h
@@ -0,0 +1,172 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef RESOURCE_H
+#define RESOURCE_H
+
+#include <qstring.h>
+#include <qtextstream.h>
+#include <qvariant.h>
+#include <qvaluelist.h>
+#include <qimage.h>
+#include "actiondnd.h"
+
+#include "metadatabase.h"
+
+class QWidget;
+class QObject;
+class QLayout;
+class QStyle;
+class QPalette;
+class FormWindow;
+class MainWindow;
+class QDomElement;
+class QDesignerGridLayout;
+class QListViewItem;
+class QMainWindow;
+struct LanguageInterface;
+class FormFile;
+class Project;
+class PopupMenuEditor;
+
+class Resource
+{
+public:
+ struct Image {
+ QImage img;
+ QString name;
+ bool operator==( const Image &i ) const {
+ return ( i.name == name &&
+ i.img == img );
+ }
+ };
+
+ Resource();
+ Resource( MainWindow* mw );
+ ~Resource();
+
+ void setWidget( FormWindow *w );
+ QWidget *widget() const;
+
+ bool load( FormFile *ff, Project *defProject = 0 );
+ bool load( FormFile *ff, QIODevice*, Project *defProject = 0 );
+ QString copy();
+
+ bool save( const QString& filename, bool formCodeOnly = FALSE);
+ bool save( QIODevice* );
+ void paste( const QString &cb, QWidget *parent );
+
+ static void saveImageData( const QImage &img, QTextStream &ts, int indent );
+ static void loadCustomWidgets( const QDomElement &e, Resource *r );
+ static void loadExtraSource( FormFile *formfile, const QString &currFileName,
+ LanguageInterface *langIface, bool hasFunctions );
+ static bool saveFormCode( FormFile *formfile, LanguageInterface *langIface );
+
+private:
+ void saveObject( QObject *obj, QDesignerGridLayout* grid, QTextStream &ts, int indent );
+ void saveChildrenOf( QObject* obj, QTextStream &ts, int indent );
+ void saveObjectProperties( QObject *w, QTextStream &ts, int indent );
+ void saveSetProperty( QObject *w, const QString &name, QVariant::Type t, QTextStream &ts, int indent );
+ void saveEnumProperty( QObject *w, const QString &name, QVariant::Type t, QTextStream &ts, int indent );
+ void saveProperty( QObject *w, const QString &name, const QVariant &value, QVariant::Type t, QTextStream &ts, int indent );
+ void saveProperty( const QVariant &value, QTextStream &ts, int indent );
+ void saveItems( QObject *obj, QTextStream &ts, int indent );
+ void saveItem( const QStringList &text, const QPtrList<QPixmap> &pixmaps, QTextStream &ts, int indent );
+ void saveItem( QListViewItem *i, QTextStream &ts, int indent );
+ void saveConnections( QTextStream &ts, int indent );
+ void saveCustomWidgets( QTextStream &ts, int indent );
+ void saveTabOrder( QTextStream &ts, int indent );
+ void saveColorGroup( QTextStream &ts, int indent, const QColorGroup &cg );
+ void saveColor( QTextStream &ts, int indent, const QColor &c );
+ void saveMetaInfoBefore( QTextStream &ts, int indent );
+ void saveMetaInfoAfter( QTextStream &ts, int indent );
+ void saveIncludeHints( QTextStream &ts, int indent );
+ void savePixmap( const QPixmap &p, QTextStream &ts, int indent, const QString &tagname = "pixmap" );
+ void saveActions( const QPtrList<QAction> &actions, QTextStream &ts, int indent );
+ void saveChildActions( QAction *a, QTextStream &ts, int indent );
+ void saveToolBars( QMainWindow *mw, QTextStream &ts, int indent );
+ void saveMenuBar( QMainWindow *mw, QTextStream &ts, int indent );
+ void savePopupMenu( PopupMenuEditor *pm, QMainWindow *mw, QTextStream &ts, int indent );
+
+ QObject *createObject( const QDomElement &e, QWidget *parent, QLayout* layout = 0 );
+ QWidget *createSpacer( const QDomElement &e, QWidget *parent, QLayout *layout, Qt::Orientation o );
+ void createItem( const QDomElement &e, QWidget *widget, QListViewItem *i = 0 );
+ void createColumn( const QDomElement &e, QWidget *widget );
+ void setObjectProperty( QObject* widget, const QString &prop, const QDomElement &e);
+ QString saveInCollection( const QImage &img );
+ QString saveInCollection( const QPixmap &pix ) { return saveInCollection( pix.convertToImage() ); }
+ QImage loadFromCollection( const QString &name );
+ void saveImageCollection( QTextStream &ts, int indent );
+ void loadImageCollection( const QDomElement &e );
+ void loadConnections( const QDomElement &e );
+ void loadTabOrder( const QDomElement &e );
+ void loadItem( const QDomElement &n, QPixmap &pix, QString &txt, bool &hasPixmap );
+ void loadActions( const QDomElement &n );
+ void loadChildAction( QObject *parent, const QDomElement &e );
+ void loadToolBars( const QDomElement &n );
+ void loadMenuBar( const QDomElement &n );
+ void loadPopupMenu( PopupMenuEditor *pm, const QDomElement &e );
+ QColorGroup loadColorGroup( const QDomElement &e );
+ QPixmap loadPixmap( const QDomElement &e, const QString &tagname = "pixmap" );
+
+private:
+ MainWindow *mainwindow;
+ FormWindow *formwindow;
+ QWidget* toplevel;
+ QValueList<Image> images;
+ bool copying, pasting;
+ bool mainContainerSet;
+ QStringList knownNames;
+ QStringList usedCustomWidgets;
+ QListViewItem *lastItem;
+
+ QValueList<MetaDataBase::Include> metaIncludes;
+ QValueList<MetaDataBase::Variable> metaVariables;
+ QStringList metaForwards;
+ QStringList metaSignals;
+ MetaDataBase::MetaInfo metaInfo;
+ QMap<QString, QString> dbControls;
+ QMap<QString, QStringList> dbTables;
+ QMap<QString, QWidget*> widgets;
+ QString exportMacro;
+ bool hadGeometry;
+ QMap<QString, QValueList<MetaDataBase::Connection> > langConnections;
+ QString currFileName;
+ LanguageInterface *langIface;
+ bool hasFunctions;
+ QStringList includeHints;
+
+ QString uiFileVersion;
+};
+
+#endif
diff --git a/tools/designer/designer/richtextfontdialog.ui b/tools/designer/designer/richtextfontdialog.ui
new file mode 100644
index 0000000..ca340c2
--- /dev/null
+++ b/tools/designer/designer/richtextfontdialog.ui
@@ -0,0 +1,354 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>RichTextFontDialog</class>
+<comment>*********************************************************************
+** Copyright (C) 2002-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>RichTextFontDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>255</width>
+ <height>158</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Font Properties</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QComboBox" row="0" column="1" rowspan="1" colspan="2">
+ <item>
+ <property name="text">
+ <string>default</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>fontCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Font:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fontCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Rel. &amp;Size:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fontSizeCombo</cstring>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>Spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;olor:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>colorButton</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1" rowspan="1" colspan="2">
+ <item>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>-4</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>-3</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>-2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>-1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>+1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>+2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>+3</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>+4</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>fontSizeCombo</cstring>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ <property name="insertionPolicy">
+ <enum>AtTop</enum>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="2" column="1">
+ <property name="name">
+ <cstring>colorButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>Spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="Line" row="2" column="0">
+ <property name="name">
+ <cstring>Line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>Layout15</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>colorButton</sender>
+ <signal>clicked()</signal>
+ <receiver>RichTextFontDialog</receiver>
+ <slot>selectColor()</slot>
+ </connection>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>RichTextFontDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>RichTextFontDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>fontCombo</tabstop>
+ <tabstop>fontSizeCombo</tabstop>
+ <tabstop>colorButton</tabstop>
+ <tabstop>okButton</tabstop>
+ <tabstop>cancelButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">richtextfontdialog.ui.h</include>
+</includes>
+<variables>
+ <variable>QString font</variable>
+ <variable>QColor color</variable>
+ <variable>QString size</variable>
+</variables>
+<slots>
+ <slot>init()</slot>
+ <slot>selectColor()</slot>
+ <slot>accept()</slot>
+ <slot>reject()</slot>
+ <slot returnType="QString">getSize()</slot>
+ <slot returnType="QString">getColor()</slot>
+ <slot returnType="QString">getFont()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/richtextfontdialog.ui.h b/tools/designer/designer/richtextfontdialog.ui.h
new file mode 100644
index 0000000..8a3dd4c
--- /dev/null
+++ b/tools/designer/designer/richtextfontdialog.ui.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+#include <qcolordialog.h>
+#include <qfontdatabase.h>
+
+void RichTextFontDialog::init()
+{
+ QFontDatabase *db = new QFontDatabase();
+ fontCombo->insertStringList( db->families() );
+}
+
+void RichTextFontDialog::selectColor()
+{
+ color = QColorDialog::getColor( "", this );
+ if( color.isValid() )
+ colorButton->setPaletteBackgroundColor( color );
+}
+
+void RichTextFontDialog::accept()
+{
+ size = fontSizeCombo->currentText();
+ font = fontCombo->currentText();
+ done( Accepted );
+}
+
+void RichTextFontDialog::reject()
+{
+ done( Rejected );
+}
+
+QString RichTextFontDialog::getSize()
+{
+ return size;
+}
+
+QString RichTextFontDialog::getColor()
+{
+ return color.name();
+}
+
+QString RichTextFontDialog::getFont()
+{
+ return font;
+}
diff --git a/tools/designer/designer/sizehandle.cpp b/tools/designer/designer/sizehandle.cpp
new file mode 100644
index 0000000..f3134d8
--- /dev/null
+++ b/tools/designer/designer/sizehandle.cpp
@@ -0,0 +1,394 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qvariant.h> // HP-UX compiler needs this here
+
+#include "sizehandle.h"
+#include "formwindow.h"
+#include "widgetfactory.h"
+
+#include <qwidget.h>
+#include <qapplication.h>
+#include <qlabel.h>
+
+SizeHandle::SizeHandle( FormWindow *parent, Direction d, WidgetSelection *s )
+ : QWidget( parent )
+{
+ active = TRUE;
+ setBackgroundMode( active ? PaletteText : PaletteDark );
+ setFixedSize( 6, 6 );
+ widget = 0;
+ dir =d ;
+ setMouseTracking( FALSE );
+ formWindow = parent;
+ sel = s;
+ updateCursor();
+}
+
+void SizeHandle::updateCursor()
+{
+ if ( !active ) {
+ setCursor( arrowCursor );
+ return;
+ }
+
+ switch ( dir ) {
+ case LeftTop:
+ setCursor( sizeFDiagCursor );
+ break;
+ case Top:
+ setCursor( sizeVerCursor );
+ break;
+ case RightTop:
+ setCursor( sizeBDiagCursor );
+ break;
+ case Right:
+ setCursor( sizeHorCursor );
+ break;
+ case RightBottom:
+ setCursor( sizeFDiagCursor );
+ break;
+ case Bottom:
+ setCursor( sizeVerCursor );
+ break;
+ case LeftBottom:
+ setCursor( sizeBDiagCursor );
+ break;
+ case Left:
+ setCursor( sizeHorCursor );
+ break;
+ }
+}
+
+void SizeHandle::setActive( bool a )
+{
+ active = a;
+ setBackgroundMode( active ? PaletteText : PaletteDark );
+ updateCursor();
+}
+
+void SizeHandle::setWidget( QWidget *w )
+{
+ widget = w;
+}
+
+void SizeHandle::paintEvent( QPaintEvent * )
+{
+ if ( ( (FormWindow*)parentWidget() )->currentWidget() != widget )
+ return;
+ QPainter p( this );
+ p.setPen( blue );
+ p.drawRect( 0, 0, width(), height() );
+}
+
+void SizeHandle::mousePressEvent( QMouseEvent *e )
+{
+ if ( !widget || e->button() != LeftButton || !active )
+ return;
+ oldPressPos = e->pos();
+ geom = origGeom = QRect( widget->pos(), widget->size() );
+}
+
+void SizeHandle::mouseMoveEvent( QMouseEvent *e )
+{
+ if ( !widget || ( e->state() & LeftButton ) != LeftButton || !active )
+ return;
+ QPoint rp = mapFromGlobal( e->globalPos() );
+ QPoint d = oldPressPos - rp;
+ oldPressPos = rp;
+ QPoint checkPos = widget->parentWidget()->mapFromGlobal( e->globalPos() );
+ QRect pr = widget->parentWidget()->rect();
+
+ // ##### move code around a bit to reduce duplicated code here
+ switch ( dir ) {
+ case LeftTop: {
+ if ( checkPos.x() > pr.width() - 2 * width() || checkPos.y() > pr.height() - 2 * height() )
+ return;
+ int w = geom.width() + d.x();
+ geom.setWidth( w );
+ w = ( w / formWindow->grid().x() ) * formWindow->grid().x();
+ int h = geom.height() + d.y();
+ geom.setHeight( h );
+ h = ( h / formWindow->grid().y() ) * formWindow->grid().y();
+ int dx = widget->width() - w;
+ int dy = widget->height() - h;
+ trySetGeometry( widget, widget->x() + dx, widget->y() + dy, w, h );
+ } break;
+ case Top: {
+ if ( checkPos.y() > pr.height() - 2 * height() )
+ return;
+ int h = geom.height() + d.y();
+ geom.setHeight( h );
+ h = ( h / formWindow->grid().y() ) * formWindow->grid().y();
+ int dy = widget->height() - h;
+ trySetGeometry( widget, widget->x(), widget->y() + dy, widget->width(), h );
+ } break;
+ case RightTop: {
+ if ( checkPos.x() < 2 * width() || checkPos.y() > pr.height() - 2 * height() )
+ return;
+ int h = geom.height() + d.y();
+ geom.setHeight( h );
+ h = ( h / formWindow->grid().y() ) * formWindow->grid().y();
+ int dy = widget->height() - h;
+ int w = geom.width() - d.x();
+ geom.setWidth( w );
+ w = ( w / formWindow->grid().x() ) * formWindow->grid().x();
+ trySetGeometry( widget, widget->x(), widget->y() + dy, w, h );
+ } break;
+ case Right: {
+ if ( checkPos.x() < 2 * width() )
+ return;
+ int w = geom.width() - d.x();
+ geom.setWidth( w );
+ w = ( w / formWindow->grid().x() ) * formWindow->grid().x();
+ tryResize( widget, w, widget->height() );
+ } break;
+ case RightBottom: {
+ if ( checkPos.x() < 2 * width() || checkPos.y() < 2 * height() )
+ return;
+ int w = geom.width() - d.x();
+ geom.setWidth( w );
+ w = ( w / formWindow->grid().x() ) * formWindow->grid().x();
+ int h = geom.height() - d.y();
+ geom.setHeight( h );
+ h = ( h / formWindow->grid().y() ) * formWindow->grid().y();
+ tryResize( widget, w, h );
+ } break;
+ case Bottom: {
+ if ( checkPos.y() < 2 * height() )
+ return;
+ int h = geom.height() - d.y();
+ geom.setHeight( h );
+ h = ( h / formWindow->grid().y() ) * formWindow->grid().y();
+ tryResize( widget, widget->width(), h );
+ } break;
+ case LeftBottom: {
+ if ( checkPos.x() > pr.width() - 2 * width() || checkPos.y() < 2 * height() )
+ return;
+ int w = geom.width() + d.x();
+ geom.setWidth( w );
+ w = ( w / formWindow->grid().x() ) * formWindow->grid().x();
+ int dx = widget->width() - w;
+ int h = geom.height() - d.y();
+ geom.setHeight( h );
+ h = ( h / formWindow->grid().y() ) * formWindow->grid().y();
+ trySetGeometry( widget, widget->x() + dx, widget->y(), w, h );
+ } break;
+ case Left: {
+ if ( checkPos.x() > pr.width() - 2 * width() )
+ return;
+ int w = geom.width() + d.x();
+ geom.setWidth( w );
+ w = ( w / formWindow->grid().x() ) * formWindow->grid().x();
+ int dx = widget->width() - w;
+ trySetGeometry( widget, widget->x() + dx, widget->y(), w, widget->height() );
+ } break;
+ }
+
+ QPoint p = pos();
+ sel->updateGeometry();
+ oldPressPos += ( p - pos() );
+
+ formWindow->sizePreview()->setText( tr( "%1/%2" ).arg( widget->width() ).arg( widget->height() ) );
+ formWindow->sizePreview()->adjustSize();
+ QRect lg( formWindow->mapFromGlobal( e->globalPos() ) + QPoint( 16, 16 ),
+ formWindow->sizePreview()->size() );
+ formWindow->checkPreviewGeometry( lg );
+ formWindow->sizePreview()->setGeometry( lg );
+ formWindow->sizePreview()->show();
+ formWindow->sizePreview()->raise();
+ if ( WidgetFactory::layoutType( widget ) != WidgetFactory::NoLayout )
+ formWindow->updateChildSelections( widget );
+}
+
+void SizeHandle::mouseReleaseEvent( QMouseEvent *e )
+{
+ if ( e->button() != LeftButton || !active )
+ return;
+
+ formWindow->sizePreview()->hide();
+ if ( geom != widget->geometry() )
+ formWindow->commandHistory()->addCommand( new ResizeCommand( tr( "Resize" ),
+ formWindow,
+ widget, origGeom,
+ widget->geometry() ) );
+ formWindow->emitUpdateProperties( widget );
+}
+
+void SizeHandle::trySetGeometry( QWidget *w, int x, int y, int width, int height )
+{
+ int minw = QMAX( w->minimumSizeHint().width(), w->minimumSize().width() );
+ minw = QMAX( minw, 2 * formWindow->grid().x() );
+ int minh = QMAX( w->minimumSizeHint().height(), w->minimumSize().height() );
+ minh = QMAX( minh, 2 * formWindow->grid().y() );
+ if ( QMAX( minw, width ) > w->maximumWidth() ||
+ QMAX( minh, height ) > w->maximumHeight() )
+ return;
+ if ( width < minw && x != w->x() )
+ x -= minw - width;
+ if ( height < minh && y != w->y() )
+ y -= minh - height;
+ w->setGeometry( x, y, QMAX( minw, width ), QMAX( minh, height ) );
+}
+
+void SizeHandle::tryResize( QWidget *w, int width, int height )
+{
+ int minw = QMAX( w->minimumSizeHint().width(), w->minimumSize().width() );
+ minw = QMAX( minw, 16 );
+ int minh = QMAX( w->minimumSizeHint().height(), w->minimumSize().height() );
+ minh = QMAX( minh, 16 );
+ w->resize( QMAX( minw, width ), QMAX( minh, height ) );
+}
+
+// ------------------------------------------------------------------------
+
+WidgetSelection::WidgetSelection( FormWindow *parent, QPtrDict<WidgetSelection> *selDict )
+ : selectionDict( selDict )
+{
+ formWindow = parent;
+ for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) {
+ handles.insert( i, new SizeHandle( formWindow, (SizeHandle::Direction)i, this ) );
+ }
+ hide();
+}
+
+void WidgetSelection::setWidget( QWidget *w, bool updateDict )
+{
+ if ( !w ) {
+ hide();
+ if ( updateDict )
+ selectionDict->remove( wid );
+ wid = 0;
+ return;
+ }
+
+ wid = w;
+ bool active = !wid->parentWidget() || WidgetFactory::layoutType( wid->parentWidget() ) == WidgetFactory::NoLayout;
+ for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) {
+ SizeHandle *h = handles[ i ];
+ if ( h ) {
+ h->setWidget( wid );
+ h->setActive( active );
+ }
+ }
+ updateGeometry();
+ show();
+ if ( updateDict )
+ selectionDict->insert( w, this );
+}
+
+bool WidgetSelection::isUsed() const
+{
+ return wid != 0;
+}
+
+void WidgetSelection::updateGeometry()
+{
+ if ( !wid || !wid->parentWidget() )
+ return;
+
+ QPoint p = wid->parentWidget()->mapToGlobal( wid->pos() );
+ p = formWindow->mapFromGlobal( p );
+ QRect r( p, wid->size() );
+
+ int w = 6;
+ int h = 6;
+
+ for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) {
+ SizeHandle *hndl = handles[ i ];
+ if ( !hndl )
+ continue;
+ switch ( i ) {
+ case SizeHandle::LeftTop:
+ hndl->move( r.x() - w / 2, r.y() - h / 2 );
+ break;
+ case SizeHandle::Top:
+ hndl->move( r.x() + r.width() / 2 - w / 2, r.y() - h / 2 );
+ break;
+ case SizeHandle::RightTop:
+ hndl->move( r.x() + r.width() - w / 2, r.y() - h / 2 );
+ break;
+ case SizeHandle::Right:
+ hndl->move( r.x() + r.width() - w / 2, r.y() + r.height() / 2 - h / 2 );
+ break;
+ case SizeHandle::RightBottom:
+ hndl->move( r.x() + r.width() - w / 2, r.y() + r.height() - h / 2 );
+ break;
+ case SizeHandle::Bottom:
+ hndl->move( r.x() + r.width() / 2 - w / 2, r.y() + r.height() - h / 2 );
+ break;
+ case SizeHandle::LeftBottom:
+ hndl->move( r.x() - w / 2, r.y() + r.height() - h / 2 );
+ break;
+ case SizeHandle::Left:
+ hndl->move( r.x() - w / 2, r.y() + r.height() / 2 - h / 2 );
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void WidgetSelection::hide()
+{
+ for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) {
+ SizeHandle *h = handles[ i ];
+ if ( h )
+ h->hide();
+ }
+}
+
+void WidgetSelection::show()
+{
+ for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) {
+ SizeHandle *h = handles[ i ];
+ if ( h ) {
+ h->show();
+ h->raise();
+ }
+ }
+}
+
+void WidgetSelection::update()
+{
+ for ( int i = SizeHandle::LeftTop; i <= SizeHandle::Left; ++i ) {
+ SizeHandle *h = handles[ i ];
+ if ( h )
+ h->update();
+ }
+}
+
+QWidget *WidgetSelection::widget() const
+{
+ return wid;
+}
diff --git a/tools/designer/designer/sizehandle.h b/tools/designer/designer/sizehandle.h
new file mode 100644
index 0000000..dcf35b2
--- /dev/null
+++ b/tools/designer/designer/sizehandle.h
@@ -0,0 +1,104 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef SIZEHANDLE_H
+#define SIZEHANDLE_H
+
+#include <qwidget.h>
+#include <qintdict.h>
+#include <qptrdict.h>
+
+class QMouseEvent;
+class FormWindow;
+class WidgetSelection;
+class QPaintEvent;
+
+class SizeHandle : public QWidget
+{
+ Q_OBJECT
+
+public:
+ enum Direction { LeftTop, Top, RightTop, Right, RightBottom, Bottom, LeftBottom, Left };
+
+ SizeHandle( FormWindow *parent, Direction d, WidgetSelection *s );
+ void setWidget( QWidget *w );
+ void setActive( bool a );
+ void updateCursor();
+
+ void setEnabled( bool ) {}
+
+protected:
+ void paintEvent( QPaintEvent *e );
+ void mousePressEvent( QMouseEvent *e );
+ void mouseMoveEvent( QMouseEvent *e );
+ void mouseReleaseEvent( QMouseEvent *e );
+
+private:
+ void trySetGeometry( QWidget *w, int x, int y, int width, int height );
+ void tryResize( QWidget *w, int width, int height );
+
+private:
+ QWidget *widget;
+ Direction dir;
+ QPoint oldPressPos;
+ FormWindow *formWindow;
+ WidgetSelection *sel;
+ QRect geom, origGeom;
+ bool active;
+
+};
+
+class WidgetSelection
+{
+public:
+ WidgetSelection( FormWindow *parent, QPtrDict<WidgetSelection> *selDict );
+
+ void setWidget( QWidget *w, bool updateDict = TRUE );
+ bool isUsed() const;
+
+ void updateGeometry();
+ void hide();
+ void show();
+ void update();
+
+ QWidget *widget() const;
+
+protected:
+ QIntDict<SizeHandle> handles;
+ QWidget *wid;
+ FormWindow *formWindow;
+ QPtrDict<WidgetSelection> *selectionDict;
+
+};
+
+#endif
diff --git a/tools/designer/designer/sourceeditor.cpp b/tools/designer/designer/sourceeditor.cpp
new file mode 100644
index 0000000..3a063df
--- /dev/null
+++ b/tools/designer/designer/sourceeditor.cpp
@@ -0,0 +1,325 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "sourceeditor.h"
+
+#include "formwindow.h"
+#include "metadatabase.h"
+#include "project.h"
+#include "mainwindow.h"
+#include "../interfaces/languageinterface.h"
+#include <qregexp.h>
+#include "project.h"
+#include "sourcefile.h"
+#include "hierarchyview.h"
+#include <qmessagebox.h>
+#include <qtextstream.h>
+
+SourceEditor::SourceEditor( QWidget *parent, EditorInterface *iface, LanguageInterface *liface )
+ : QVBox( parent, 0, WDestructiveClose ), iFace( iface ), lIface( liface ), obj( 0 ), pro( 0 )
+{
+ iFace->addRef();
+ lIface->addRef();
+ editor = iFace->editor( MainWindow::self->areEditorsReadOnly(),
+ this, MainWindow::self->designerInterface() );
+ iFace->onBreakPointChange( MainWindow::self, SLOT( breakPointsChanged() ) );
+ resize( 600, 400 );
+ setIcon( QPixmap::fromMimeSource( "designer_filenew.png" ) );
+}
+
+SourceEditor::~SourceEditor()
+{
+ saveBreakPoints();
+ editor = 0;
+ if ( formWindow() ) {
+ formWindow()->formFile()->setCodeEdited( FALSE );
+ formWindow()->formFile()->setEditor( 0 );
+ } else if ( sourceFile() ) {
+ sourceFile()->setEditor( 0 );
+ if ( MainWindow::self->objectHierarchy()->sourceEditor() == this )
+ MainWindow::self->objectHierarchy()->setFormWindow( 0, 0 );
+ }
+ iFace->release();
+ lIface->release();
+ MainWindow::self->editorClosed( this );
+}
+
+void SourceEditor::setObject( QObject *o, Project *p )
+{
+ if ( sourceFile() )
+ sourceFile()->setEditor( 0 );
+ if ( formWindow() ) {
+ formWindow()->formFile()->setCodeEdited( FALSE );
+ formWindow()->formFile()->setEditor( 0 );
+ }
+ if ( ::qt_cast<FormWindow*>(o) )
+ ( (FormWindow*)o )->formFile()->setCodeEdited( TRUE );
+ save();
+ bool changed = FALSE;
+ if ( &(*obj) != o ) {
+ saveBreakPoints();
+ changed = TRUE;
+ }
+ obj = o;
+ pro = p;
+ if ( formWindow() ) {
+ if ( formWindow()->isFake() )
+ setCaption( formWindow()->project()->objectForFakeForm( formWindow() )->name() );
+ else
+ setCaption( obj->name() );
+ } else {
+ setCaption( sourceFile()->fileName() );
+ }
+ if ( sourceFile() )
+ sourceFile()->setEditor( this );
+ else if ( formWindow() )
+ formWindow()->formFile()->setEditor( this );
+ iFace->setText( sourceOfObject( obj, lang, iFace, lIface ) );
+ if ( pro && formWindow() ) {
+ if ( formWindow()->isFake() )
+ iFace->setContext( pro->objectForFakeFormFile( formWindow()->formFile() ) );
+ else
+ iFace->setContext( formWindow()->mainContainer() );
+ } else {
+ iFace->setContext( 0 );
+ }
+ if ( changed || sourceFile() )
+ iFace->setBreakPoints( MetaDataBase::breakPoints( o ) );
+ MainWindow::self->objectHierarchy()->showClasses( this );
+}
+
+QString SourceEditor::sourceOfObject( QObject *o, const QString &,
+ EditorInterface *, LanguageInterface * )
+{
+ QString txt;
+ if ( !o )
+ return txt;
+ if ( ::qt_cast<FormWindow*>(o) )
+ txt = ( (FormWindow*)o )->formFile()->code();
+ else if ( ::qt_cast<SourceFile*>(o) )
+ txt = ( (SourceFile*)o )->text();
+ return txt;
+}
+
+void SourceEditor::setFunction( const QString &func, const QString &clss )
+{
+ iFace->scrollTo( lIface->createFunctionStart( obj->name(), func, "", "" ), clss );
+}
+
+void SourceEditor::setClass( const QString &clss )
+{
+ iFace->scrollTo( clss, QString::null );
+}
+
+void SourceEditor::closeEvent( QCloseEvent *e )
+{
+ e->accept();
+ if ( !obj )
+ return;
+ if ( formWindow() ) {
+ save();
+ formWindow()->formFile()->cm = formWindow()->formFile()->isModified();
+ } else {
+ if ( !sourceFile()->closeEvent() )
+ e->ignore();
+ }
+}
+
+void SourceEditor::save()
+{
+ if ( !obj )
+ return;
+ if ( formWindow() )
+ formWindow()->formFile()->syncCode();
+ else if ( sourceFile() && sourceFile()->editor() )
+ sourceFile()->setText( iFace->text() );
+}
+
+QString SourceEditor::language() const
+{
+ return lang;
+}
+
+void SourceEditor::setLanguage( const QString &l )
+{
+ lang = l;
+}
+
+void SourceEditor::editCut()
+{
+ iFace->cut();
+}
+
+void SourceEditor::editCopy()
+{
+ iFace->copy();
+}
+
+void SourceEditor::editPaste()
+{
+ iFace->paste();
+}
+
+bool SourceEditor::editIsUndoAvailable()
+{
+ return iFace->isUndoAvailable();
+}
+
+bool SourceEditor::editIsRedoAvailable()
+{
+ return iFace->isRedoAvailable();
+}
+
+void SourceEditor::editUndo()
+{
+ iFace->undo();
+}
+
+void SourceEditor::editRedo()
+{
+ iFace->redo();
+}
+
+void SourceEditor::editSelectAll()
+{
+ iFace->selectAll();
+}
+
+void SourceEditor::configChanged()
+{
+ iFace->readSettings();
+}
+
+void SourceEditor::setModified( bool b )
+{
+ iFace->setModified( b );
+}
+
+void SourceEditor::refresh( bool allowSave )
+{
+ if ( allowSave )
+ save();
+ bool oldMod = iFace->isModified();
+ iFace->setText( sourceOfObject( obj, lang, iFace, lIface ) );
+ iFace->setModified( oldMod );
+}
+
+void SourceEditor::resetContext()
+{
+ if ( pro && formWindow() ) {
+ if ( formWindow()->isFake() )
+ iFace->setContext( pro->objectForFakeFormFile( formWindow()->formFile() ) );
+ else
+ iFace->setContext( formWindow()->mainContainer() );
+ } else {
+ iFace->setContext( 0 );
+ }
+}
+
+void SourceEditor::setFocus()
+{
+ if ( formWindow() )
+ formWindow()->formFile()->setCodeEdited( TRUE );
+ if ( editor )
+ editor->setFocus();
+}
+
+int SourceEditor::numLines() const
+{
+ return iFace->numLines();
+}
+
+void SourceEditor::saveBreakPoints()
+{
+ if ( !obj )
+ return;
+ QValueList<uint> l;
+ iFace->breakPoints( l );
+ MetaDataBase::setBreakPoints( obj, l );
+}
+
+void SourceEditor::clearStep()
+{
+ iFace->clearStep();
+}
+
+void SourceEditor::clearStackFrame()
+{
+ iFace->clearStackFrame();
+}
+
+void SourceEditor::resetBreakPoints()
+{
+ iFace->setBreakPoints( MetaDataBase::breakPoints( obj ) );
+}
+
+QString SourceEditor::text() const
+{
+ return iFace->text();
+}
+
+bool SourceEditor::isModified() const
+{
+ return iFace->isModified();
+}
+
+void SourceEditor::checkTimeStamp()
+{
+ if ( formWindow() )
+ formWindow()->formFile()->checkTimeStamp();
+ else if ( sourceFile() )
+ sourceFile()->checkTimeStamp();
+}
+
+bool SourceEditor::saveAs()
+{
+ if ( formWindow() )
+ return formWindow()->formFile()->saveAs();
+ else if ( sourceFile() )
+ return sourceFile()->saveAs();
+ return FALSE;
+}
+
+SourceFile *SourceEditor::sourceFile() const
+{
+ if ( !::qt_cast<SourceFile*>((QObject *)obj) )
+ return 0;
+ return (SourceFile*)(QObject*)obj;
+}
+
+FormWindow *SourceEditor::formWindow() const
+{
+ if ( !::qt_cast<FormWindow*>((QObject *)obj) )
+ return 0;
+ return (FormWindow*)(QObject*)obj;
+}
diff --git a/tools/designer/designer/sourceeditor.h b/tools/designer/designer/sourceeditor.h
new file mode 100644
index 0000000..c87a94a
--- /dev/null
+++ b/tools/designer/designer/sourceeditor.h
@@ -0,0 +1,113 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef SOURCEEDITOR_H
+#define SOURCEEDITOR_H
+
+#include "../interfaces/editorinterface.h"
+#include <qvbox.h>
+#include <qguardedptr.h>
+
+class FormWindow;
+class QCloseEvent;
+struct LanguageInterface;
+class Project;
+class SourceFile;
+
+class SourceEditor : public QVBox
+{
+ Q_OBJECT
+
+public:
+ SourceEditor( QWidget *parent, EditorInterface *iface, LanguageInterface *liface );
+ ~SourceEditor();
+
+ void setObject( QObject *fw, Project *p );
+ QObject *object() const { return obj; }
+ Project *project() const { return pro; }
+ void setFunction( const QString &func, const QString &clss = QString::null );
+ void setClass( const QString &clss );
+ void save();
+ bool saveAs();
+ void setModified( bool b );
+ bool isModified() const;
+
+ static QString sourceOfObject( QObject *fw, const QString &lang, EditorInterface *iface, LanguageInterface *lIface );
+
+ QString language() const;
+ void setLanguage( const QString &l );
+
+ void editCut();
+ void editCopy();
+ void editPaste();
+ bool editIsUndoAvailable();
+ bool editIsRedoAvailable();
+ void editUndo();
+ void editRedo();
+ void editSelectAll();
+
+ void configChanged();
+ void refresh( bool allowSave );
+ void resetContext();
+
+ EditorInterface *editorInterface() const { return iFace; }
+
+ void setFocus();
+ int numLines() const;
+ void saveBreakPoints();
+ void clearStep();
+ void clearStackFrame();
+ void resetBreakPoints();
+
+ QString text() const;
+
+ void checkTimeStamp();
+
+ SourceFile *sourceFile() const;
+ FormWindow *formWindow() const;
+
+protected:
+ void closeEvent( QCloseEvent *e );
+
+
+private:
+ EditorInterface *iFace;
+ LanguageInterface *lIface;
+ QGuardedPtr<QObject> obj;
+ Project *pro;
+ QString lang;
+ QGuardedPtr<QWidget> editor;
+
+};
+
+#endif
diff --git a/tools/designer/designer/sourcefile.cpp b/tools/designer/designer/sourcefile.cpp
new file mode 100644
index 0000000..370bfd3
--- /dev/null
+++ b/tools/designer/designer/sourcefile.cpp
@@ -0,0 +1,302 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "sourcefile.h"
+#include <qfile.h>
+#include <qtextstream.h>
+#include "designerappiface.h"
+#include "sourceeditor.h"
+#include "metadatabase.h"
+#include "../interfaces/languageinterface.h"
+#include <qfiledialog.h>
+#include <qmessagebox.h>
+#include "mainwindow.h"
+#include "workspace.h"
+#include <stdlib.h>
+
+SourceFile::SourceFile( const QString &fn, bool temp, Project *p )
+ : filename( fn ), ed( 0 ), fileNameTemp( temp ),
+ timeStamp( 0, p->makeAbsolute( fn ) ), pro( p ), pkg( FALSE )
+ , accepted( TRUE )
+{
+ iface = 0;
+
+ if ( !temp )
+ accepted = checkFileName( TRUE );
+
+ if (accepted) {
+ load();
+ pro->addSourceFile( this );
+ MetaDataBase::addEntry( this );
+ }
+
+}
+
+SourceFile::~SourceFile()
+{
+ if (iface)
+ delete iface;
+}
+
+QString SourceFile::text() const
+{
+ return txt;
+}
+
+void SourceFile::setText( const QString &s )
+{
+ txt = s;
+}
+
+bool SourceFile::save( bool ignoreModified )
+{
+ if ( fileNameTemp )
+ return saveAs();
+ if ( !ignoreModified && !isModified() )
+ return TRUE;
+ if ( ed )
+ ed->save();
+
+ if ( QFile::exists( pro->makeAbsolute( filename ) ) ) {
+ QString fn( pro->makeAbsolute( filename ) );
+#if defined(Q_OS_WIN32)
+ fn += ".bak";
+#else
+ fn += "~";
+#endif
+ QFile f( pro->makeAbsolute( filename ) );
+ if ( f.open( IO_ReadOnly ) ) {
+ QFile f2( fn );
+ if ( f2.open( IO_WriteOnly | IO_Translate ) ) {
+ QCString data( f.size() );
+ f.readBlock( data.data(), f.size() );
+ f2.writeBlock( data );
+ }
+ }
+ }
+
+ QFile f( pro->makeAbsolute( filename ) );
+ if ( !f.open( IO_WriteOnly | IO_Translate ) )
+ return saveAs();
+
+ QTextStream ts( &f );
+ ts << txt;
+ timeStamp.update();
+ setModified( FALSE );
+ return TRUE;
+}
+
+bool SourceFile::saveAs( bool ignoreModified )
+{
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ QString filter;
+ if ( iface )
+ filter = iface->fileFilterList().join(";;");
+
+ QString old = filename;
+ QString initFn = pro->makeAbsolute( filename );
+ if ( ignoreModified ) {
+ QString dir = QStringList::split( ':', project()->iFace()->customSetting( "QTSCRIPT_PACKAGES" ) ).first();
+ initFn = QFileInfo( initFn ).fileName();
+ initFn.prepend( dir + "/" );
+ }
+ QString fn = QFileDialog::getSaveFileName( initFn, filter );
+ if ( fn.isEmpty() )
+ return FALSE;
+ fileNameTemp = FALSE;
+ filename = pro->makeRelative( fn );
+ if ( !checkFileName( TRUE ) ) {
+ filename = old;
+ return FALSE;
+ }
+ pro->setModified( TRUE );
+ timeStamp.setFileName( pro->makeAbsolute( filename ) );
+ if ( ed )
+ ed->setCaption( tr( "Edit %1" ).arg( filename ) );
+ setModified( TRUE );
+ if ( pro->isDummy() ) {
+ QObject *o = ed->parent();
+ while ( o && !o->isA( "MainWindow" ) )
+ o = o->parent();
+ if ( o )
+ ((MainWindow *)o)->addRecentlyOpenedFile( fn );
+ }
+ return save( ignoreModified );
+}
+
+bool SourceFile::load()
+{
+ QFile f( pro->makeAbsolute( filename ) );
+ if ( !f.open( IO_ReadOnly ) )
+ return FALSE;
+ QTextStream ts( &f );
+ txt = ts.read();
+ timeStamp.update();
+ return TRUE;
+}
+
+DesignerSourceFile *SourceFile::iFace()
+{
+ if ( !iface )
+ iface = new DesignerSourceFileImpl( this );
+ return iface;
+}
+
+void SourceFile::setEditor( SourceEditor *e )
+{
+ ed = e;
+}
+
+bool SourceFile::isModified() const
+{
+ if ( !ed )
+ return FALSE;
+ return ed->isModified();
+}
+
+static QMap<QString, int> *extensionCounter;
+QString SourceFile::createUnnamedFileName( const QString &extension )
+{
+ if ( !extensionCounter )
+ extensionCounter = new QMap<QString, int>;
+ int count = -1;
+ QMap<QString, int>::Iterator it;
+ if ( ( it = extensionCounter->find( extension ) ) != extensionCounter->end() ) {
+ count = *it;
+ ++count;
+ extensionCounter->replace( extension, count );
+ } else {
+ count = 1;
+ extensionCounter->insert( extension, count );
+ }
+
+ return "unnamed" + QString::number( count ) + "." + extension;
+}
+
+void SourceFile::setModified( bool m )
+{
+ if ( !ed )
+ return;
+ ed->setModified( m );
+}
+
+bool SourceFile::closeEvent()
+{
+ if ( !isModified() && fileNameTemp ) {
+ pro->removeSourceFile( this );
+ return TRUE;
+ }
+
+ if ( !isModified() )
+ return TRUE;
+
+ if ( ed )
+ ed->save();
+
+ switch ( QMessageBox::warning( MainWindow::self, tr( "Save Code" ),
+ tr( "Save changes to '%1'?" ).arg( filename ),
+ tr( "&Yes" ), tr( "&No" ), tr( "&Cancel" ), 0, 2 ) ) {
+ case 0: // save
+ if ( !save() )
+ return FALSE;
+ break;
+ case 1: // don't save
+ load();
+ if ( ed )
+ ed->editorInterface()->setText( txt );
+ if ( fileNameTemp ) {
+ pro->removeSourceFile( this );
+ return TRUE;
+ }
+ if ( MainWindow::self )
+ MainWindow::self->workspace()->update();
+ break;
+ case 2: // cancel
+ return FALSE;
+ default:
+ break;
+ }
+ setModified( FALSE );
+ return TRUE;
+}
+
+bool SourceFile::close()
+{
+ if ( !ed )
+ return TRUE;
+ return ed->close();
+}
+
+Project *SourceFile::project() const
+{
+ return pro;
+}
+
+void SourceFile::checkTimeStamp()
+{
+ if ( timeStamp.isUpToDate() )
+ return;
+ timeStamp.update();
+ if ( QMessageBox::information( MainWindow::self, tr( "Qt Designer" ),
+ tr( "File '%1' has been changed outside Qt Designer.\n"
+ "Do you want to reload it?" ).arg( filename ),
+ tr( "&Yes" ), tr( "&No" ) ) == 0 ) {
+ load();
+ if ( ed )
+ ed->editorInterface()->setText( txt );
+ }
+}
+
+bool SourceFile::checkFileName( bool allowBreak )
+{
+ SourceFile *sf = pro->findSourceFile( filename, this );
+ if ( sf )
+ QMessageBox::warning( MainWindow::self, tr( "Invalid Filename" ),
+ tr( "The project already contains a source file with \n"
+ "filename '%1'. Please choose a new filename." ).arg( filename ) );
+ while ( sf ) {
+ LanguageInterface *iface = MetaDataBase::languageInterface( pro->language() );
+ QString filter;
+ if ( iface )
+ filter = iface->fileFilterList().join(";;");
+ QString fn;
+ while ( fn.isEmpty() ) {
+ fn = QFileDialog::getSaveFileName( pro->makeAbsolute( filename ), filter );
+ if ( allowBreak && fn.isEmpty() )
+ return FALSE;
+ }
+ filename = pro->makeRelative( fn );
+ sf = pro->findSourceFile( filename, this );
+ }
+ return TRUE;
+}
diff --git a/tools/designer/designer/sourcefile.h b/tools/designer/designer/sourcefile.h
new file mode 100644
index 0000000..8e69efd
--- /dev/null
+++ b/tools/designer/designer/sourcefile.h
@@ -0,0 +1,93 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef SOURCEFILE_H
+#define SOURCEFILE_H
+
+#include <qobject.h>
+#include "timestamp.h"
+
+struct DesignerSourceFile;
+class SourceEditor;
+class Project;
+
+class SourceFile : public QObject
+{
+ Q_OBJECT
+
+public:
+ SourceFile( const QString &fn, bool temp, Project *p );
+ ~SourceFile();
+
+ void setText( const QString &s );
+ void setModified( bool m );
+
+ bool save( bool ignoreModified = FALSE );
+ bool saveAs( bool ignoreModified = FALSE );
+ bool load();
+ bool close();
+ bool closeEvent();
+ Project *project() const;
+
+ QString text() const;
+ QString fileName() const { return filename; }
+ bool isModified() const;
+
+ void checkTimeStamp();
+
+ DesignerSourceFile *iFace();
+
+ void setEditor( SourceEditor *e );
+ SourceEditor *editor() const { return ed; }
+
+ static QString createUnnamedFileName( const QString &extension );
+
+ bool isAccepted() const { return accepted; }
+
+private:
+ bool checkFileName( bool allowBreak );
+
+private:
+ QString filename;
+ QString txt;
+ DesignerSourceFile *iface;
+ SourceEditor *ed;
+ bool fileNameTemp;
+ TimeStamp timeStamp;
+ Project *pro;
+ bool pkg;
+ bool accepted;
+
+};
+
+#endif
diff --git a/tools/designer/designer/startdialog.ui b/tools/designer/designer/startdialog.ui
new file mode 100644
index 0000000..b8f6e7a
--- /dev/null
+++ b/tools/designer/designer/startdialog.ui
@@ -0,0 +1,331 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>StartDialogBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2002-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>StartDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>576</width>
+ <height>420</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Qt Designer - New/Open</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget8</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;New File/Project</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QIconView" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>templateView</cstring>
+ </property>
+ <property name="gridX">
+ <number>120</number>
+ </property>
+ <property name="resizeMode">
+ <enum>Adjust</enum>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Open File/Project</string>
+ </attribute>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ </hbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget9</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Recently Opened</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QIconView" row="0" column="0">
+ <property name="name">
+ <cstring>recentView</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>WheelFocus</enum>
+ </property>
+ <property name="gridX">
+ <number>120</number>
+ </property>
+ <property name="resizeMode">
+ <enum>Adjust</enum>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>fileInfoLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>2</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkShowInFuture</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Don't show this dialog in the future</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="accel">
+ <number>4144</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>StartDialogBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>StartDialogBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>templateView</sender>
+ <signal>doubleClicked(QIconViewItem*)</signal>
+ <receiver>StartDialogBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>templateView</sender>
+ <signal>returnPressed(QIconViewItem*)</signal>
+ <receiver>StartDialogBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>recentView</sender>
+ <signal>doubleClicked(QIconViewItem*)</signal>
+ <receiver>StartDialogBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>recentView</sender>
+ <signal>onItem(QIconViewItem*)</signal>
+ <receiver>StartDialogBase</receiver>
+ <slot>recentItemChanged(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>recentView</sender>
+ <signal>onViewport()</signal>
+ <receiver>StartDialogBase</receiver>
+ <slot>clearFileInfo()</slot>
+ </connection>
+ <connection>
+ <sender>recentView</sender>
+ <signal>returnPressed(QIconViewItem*)</signal>
+ <receiver>StartDialogBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>recentView</sender>
+ <signal>selectionChanged(QIconViewItem*)</signal>
+ <receiver>StartDialogBase</receiver>
+ <slot>recentItemChanged(QIconViewItem*)</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>recentItemChanged( QIconViewItem * )</slot>
+ <slot>clearFileInfo()</slot>
+ <slot>accept()</slot>
+ <slot>reject()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/startdialogimpl.cpp b/tools/designer/designer/startdialogimpl.cpp
new file mode 100644
index 0000000..231e7b6
--- /dev/null
+++ b/tools/designer/designer/startdialogimpl.cpp
@@ -0,0 +1,177 @@
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qptrlist.h>
+#include <qiconview.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qfiledialog.h>
+#include <qtabwidget.h>
+#include <qpoint.h>
+#include <qobjectlist.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qfileinfo.h>
+#include <qmap.h>
+#include <qdatetime.h>
+#include <qapplication.h>
+#include <qcheckbox.h>
+#include <qurl.h>
+
+#include "mainwindow.h"
+#include "startdialogimpl.h"
+#include "designerapp.h"
+
+FileDialog::FileDialog( const QString &dir, QWidget *parent )
+ : QFileDialog( dir, QString::null, parent )
+{
+}
+
+void FileDialog::accept()
+{
+ emit fileSelected();
+}
+
+
+StartDialog::StartDialog( QWidget *parent, const QString &templatePath )
+ : StartDialogBase( parent, 0 )
+{
+ newForm = new NewForm( templateView, templatePath );
+ recentFiles.clear();
+ initFileOpen();
+ showInFuture = TRUE;
+
+ connect( buttonHelp, SIGNAL( clicked() ),
+ MainWindow::self, SLOT( showDialogHelp() ) );
+ connect( recentView, SIGNAL( doubleClicked(QIconViewItem*) ),
+ this, SLOT( accept() ) );
+ connect( recentView, SIGNAL( returnPressed(QIconViewItem*) ),
+ this, SLOT( accept() ) );
+ connect( fd, SIGNAL( fileSelected() ), this, SLOT( accept() ) );
+}
+
+void StartDialog::accept()
+{
+ hide();
+ showInFuture = !checkShowInFuture->isChecked(); // means don't show it anymore
+
+ int tabindex = tabWidget->currentPageIndex();
+ QString filename;
+ if( !tabindex ) {
+ if ( !templateView->currentItem() )
+ return;
+ Project *pro = MainWindow::self->findProject( tr( "<No Project>" ) );
+ if ( !pro )
+ return;
+ MainWindow::self->setCurrentProject( pro );
+ ( (NewItem*)templateView->currentItem() )->insert( pro );
+ } else if ( tabindex == 1 ) {
+ filename = fd->selectedFile();
+ } else if ( tabindex == 2 ) {
+ filename = recentFiles[recentView->currentItem()->index()];
+ }
+ if ( tabindex ) {
+ if ( !filename.isEmpty() ) {
+ QFileInfo fi( filename );
+ if ( fi.extension() == "pro" )
+ MainWindow::self->openProject( filename );
+ else
+ MainWindow::self->fileOpen( "", "", filename );
+ }
+ }
+
+ done( Accepted );
+}
+
+void StartDialog::reject()
+{
+ done( Rejected );
+}
+
+void StartDialog::recentItemChanged( QIconViewItem *item )
+{
+ QString msg( recentFiles[item->index()] );
+ QFileInfo f( recentFiles[item->index()] );
+ uint s = f.size();
+ QString unit( "B" );
+ if( s > 1024 ) {
+ s /= 1024;
+ unit = "KB";
+ }
+ if ( s > 1024 ) {
+ s /= 1024;
+ unit = "MB";
+ }
+ QDateTime dt( f.lastModified() );
+ QString date( dt.toString( "MMMM dd hh:mm" ));
+ msg = QString( "%1 (%2 %3) %4" ).arg(msg).arg(s).arg(unit).arg(date);
+ fileInfoLabel->setText( msg );
+}
+
+void StartDialog::clearFileInfo()
+{
+ fileInfoLabel->clear();
+}
+
+void StartDialog::setRecentlyFiles( QStringList &files )
+{
+ insertRecentItems( files, FALSE );
+}
+
+void StartDialog::setRecentlyProjects( QStringList &projects )
+{
+ insertRecentItems( projects, TRUE );
+}
+
+void StartDialog::insertRecentItems( QStringList &files, bool isProject )
+{
+ QString iconName = "designer_newform.png";
+ if ( isProject )
+ iconName = "designer_project.png";
+ QIconViewItem *item;
+ QStringList::iterator it = files.begin();
+ for( ; it != files.end(); ++it ) {
+ QFileInfo fi( *it );
+ item = new QIconViewItem( recentView, fi.fileName() );
+ recentFiles[recentView->index( item )] = *it;
+ item->setPixmap( QPixmap::fromMimeSource( iconName ) );
+ item->setDragEnabled( FALSE );
+ }
+}
+
+void StartDialog::initFileOpen()
+{
+ QString encode = QDir::currentDirPath();
+ QUrl::encode( encode );
+ fd = new FileDialog( encode, this );
+ QPoint point( 0, 0 );
+ fd->reparent( tab, point );
+
+ QObjectList *l = fd->queryList( "QPushButton" );
+ QObjectListIt it( *l );
+ QObject *obj;
+ while ( (obj = it.current()) != 0 ) {
+ ++it;
+ ((QPushButton*)obj)->hide();
+ }
+ delete l;
+
+ fd->setSizeGripEnabled ( FALSE );
+ tabLayout->addWidget( fd );
+
+ QPluginManager<ImportFilterInterface> manager( IID_ImportFilter, QApplication::libraryPaths(),
+ MainWindow::self->pluginDirectory() );
+ QStringList filterlist;
+ filterlist << tr( "Designer Files (*.ui *.pro)" );
+ filterlist << tr( "Qt User-Interface Files (*.ui)" );
+ filterlist << tr( "QMAKE Project Files (*.pro)" );
+
+ QStringList list = manager.featureList();
+ for ( QStringList::Iterator it2 = list.begin(); it2 != list.end(); ++it2 )
+ filterlist << *it2;
+
+ filterlist << tr( "All Files (*)" );
+ QString filters = filterlist.join( ";;" );
+ fd->setFilters( filters );
+
+ fd->show();
+}
diff --git a/tools/designer/designer/startdialogimpl.h b/tools/designer/designer/startdialogimpl.h
new file mode 100644
index 0000000..7ad3b22
--- /dev/null
+++ b/tools/designer/designer/startdialogimpl.h
@@ -0,0 +1,87 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef STARTDIALOGIMPL_H
+#define STARTDIALOGIMPL_H
+
+#include <qiconview.h>
+#include <qlistview.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qfiledialog.h>
+#include <qmap.h>
+
+#include "newformimpl.h"
+#include "startdialog.h"
+
+class FileDialog : public QFileDialog
+{
+ Q_OBJECT
+
+public:
+ FileDialog( const QString &dir, QWidget *parent );
+
+protected slots:
+ void accept();
+
+signals:
+ void fileSelected();
+};
+
+
+class StartDialog : public StartDialogBase
+{
+ Q_OBJECT
+
+public:
+ StartDialog( QWidget *parent, const QString &templatePath );
+ void setRecentlyFiles( QStringList& );
+ void setRecentlyProjects( QStringList& );
+ bool showDialogInFuture() const { return showInFuture; }
+
+protected slots:
+ void recentItemChanged( QIconViewItem *item );
+ void clearFileInfo();
+ void accept();
+ void reject();
+
+private:
+ void initFileOpen();
+ void insertRecentItems( QStringList &files, bool isProject );
+ NewForm *newForm;
+ FileDialog *fd;
+ QMap<int, QString> recentFiles;
+ bool showInFuture;
+};
+
+#endif
diff --git a/tools/designer/designer/styledbutton.cpp b/tools/designer/designer/styledbutton.cpp
new file mode 100644
index 0000000..9365698
--- /dev/null
+++ b/tools/designer/designer/styledbutton.cpp
@@ -0,0 +1,302 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qvariant.h> // HP-UX compiler needs this here
+#include "styledbutton.h"
+#include "formwindow.h"
+#include "pixmapchooser.h"
+#include <qcolordialog.h>
+#include <qpalette.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qapplication.h>
+#include <qdragobject.h>
+#include <qstyle.h>
+
+StyledButton::StyledButton(QWidget* parent, const char* name)
+ : QButton( parent, name ), pix( 0 ), spix( 0 ), s( 0 ), formWindow( 0 ), mousePressed( FALSE )
+{
+ setMinimumSize( minimumSizeHint() );
+ setAcceptDrops( TRUE );
+
+ connect( this, SIGNAL(clicked()), SLOT(onEditor()));
+
+ setEditor( ColorEditor );
+}
+
+StyledButton::StyledButton( const QBrush& b, QWidget* parent, const char* name, WFlags f )
+ : QButton( parent, name, f ), spix( 0 ), s( 0 ), formWindow( 0 )
+{
+ col = b.color();
+ pix = b.pixmap();
+ setMinimumSize( minimumSizeHint() );
+}
+
+StyledButton::~StyledButton()
+{
+}
+
+void StyledButton::setEditor( EditorType e )
+{
+ if ( edit == e )
+ return;
+
+ edit = e;
+ update();
+}
+
+StyledButton::EditorType StyledButton::editor() const
+{
+ return edit;
+}
+
+void StyledButton::setColor( const QColor& c )
+{
+ col = c;
+ update();
+}
+
+void StyledButton::setPixmap( const QPixmap & pm )
+{
+ if ( !pm.isNull() ) {
+ delete pix;
+ pix = new QPixmap( pm );
+ } else {
+ delete pix;
+ pix = 0;
+ }
+ scalePixmap();
+}
+
+QColor StyledButton::color() const
+{
+ return col;
+}
+
+QPixmap* StyledButton::pixmap() const
+{
+ return pix;
+}
+
+bool StyledButton::scale() const
+{
+ return s;
+}
+
+void StyledButton::setScale( bool on )
+{
+ if ( s == on )
+ return;
+
+ s = on;
+ scalePixmap();
+}
+
+QSize StyledButton::sizeHint() const
+{
+ return QSize( 50, 25 );
+}
+
+QSize StyledButton::minimumSizeHint() const
+{
+ return QSize( 50, 25 );
+}
+
+void StyledButton::scalePixmap()
+{
+ delete spix;
+
+ if ( pix ) {
+ spix = new QPixmap( 6*width()/8, 6*height()/8 );
+ QImage img = pix->convertToImage();
+
+ spix->convertFromImage( s? img.smoothScale( 6*width()/8, 6*height()/8 ) : img );
+ } else {
+ spix = 0;
+ }
+
+ update();
+}
+
+void StyledButton::resizeEvent( QResizeEvent* e )
+{
+ scalePixmap();
+ QButton::resizeEvent( e );
+}
+
+void StyledButton::drawButton( QPainter *paint )
+{
+ style().drawPrimitive(QStyle::PE_ButtonBevel, paint, rect(), colorGroup(),
+ isDown() ? QStyle::Style_Sunken : QStyle::Style_Raised);
+ drawButtonLabel(paint);
+
+ if (hasFocus())
+ style().drawPrimitive(QStyle::PE_FocusRect, paint,
+ style().subRect(QStyle::SR_PushButtonFocusRect, this),
+ colorGroup(), QStyle::Style_Default);
+}
+
+void StyledButton::drawButtonLabel( QPainter *paint )
+{
+ QColor pen = isEnabled() ?
+ hasFocus() ? palette().active().buttonText() : palette().inactive().buttonText()
+ : palette().disabled().buttonText();
+ paint->setPen( pen );
+
+ if(!isEnabled()) {
+ paint->setBrush( QBrush( colorGroup().button() ) );
+ }
+ else if ( edit == PixmapEditor && spix ) {
+ paint->setBrush( QBrush( col, *spix ) );
+ paint->setBrushOrigin( width()/8, height()/8 );
+ } else
+ paint->setBrush( QBrush( col ) );
+
+ paint->drawRect( width()/8, height()/8, 6*width()/8, 6*height()/8 );
+}
+
+void StyledButton::onEditor()
+{
+ switch (edit) {
+ case ColorEditor: {
+ QColor c = QColorDialog::getColor( palette().active().background(), this );
+ if ( c.isValid() ) {
+ setColor( c );
+ emit changed();
+ }
+ } break;
+ case PixmapEditor: {
+ QPixmap p;
+ if ( pixmap() )
+ p = qChoosePixmap( this, formWindow, *pixmap() );
+ else
+ p = qChoosePixmap( this, formWindow, QPixmap() );
+ if ( !p.isNull() ) {
+ setPixmap( p );
+ emit changed();
+ }
+ } break;
+ default:
+ break;
+ }
+}
+
+void StyledButton::mousePressEvent(QMouseEvent* e)
+{
+ QButton::mousePressEvent(e);
+ mousePressed = TRUE;
+ pressPos = e->pos();
+}
+
+void StyledButton::mouseMoveEvent(QMouseEvent* e)
+{
+ QButton::mouseMoveEvent( e );
+#ifndef QT_NO_DRAGANDDROP
+ if ( !mousePressed )
+ return;
+ if ( ( pressPos - e->pos() ).manhattanLength() > QApplication::startDragDistance() ) {
+ if ( edit == ColorEditor ) {
+ QColorDrag *drg = new QColorDrag( col, this );
+ QPixmap pix( 25, 25 );
+ pix.fill( col );
+ QPainter p( &pix );
+ p.drawRect( 0, 0, pix.width(), pix.height() );
+ p.end();
+ drg->setPixmap( pix );
+ mousePressed = FALSE;
+ drg->dragCopy();
+ }
+ else if ( edit == PixmapEditor && pix && !pix->isNull() ) {
+ QImage img = pix->convertToImage();
+ QImageDrag *drg = new QImageDrag( img, this );
+ if(spix)
+ drg->setPixmap( *spix );
+ mousePressed = FALSE;
+ drg->dragCopy();
+ }
+ }
+#endif
+}
+
+#ifndef QT_NO_DRAGANDDROP
+void StyledButton::dragEnterEvent( QDragEnterEvent *e )
+{
+ setFocus();
+ if ( edit == ColorEditor && QColorDrag::canDecode( e ) )
+ e->accept();
+ else if ( edit == PixmapEditor && QImageDrag::canDecode( e ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void StyledButton::dragLeaveEvent( QDragLeaveEvent * )
+{
+ if ( hasFocus() )
+ parentWidget()->setFocus();
+}
+
+void StyledButton::dragMoveEvent( QDragMoveEvent *e )
+{
+ if ( edit == ColorEditor && QColorDrag::canDecode( e ) )
+ e->accept();
+ else if ( edit == PixmapEditor && QImageDrag::canDecode( e ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void StyledButton::dropEvent( QDropEvent *e )
+{
+ if ( edit == ColorEditor && QColorDrag::canDecode( e ) ) {
+ QColor color;
+ QColorDrag::decode( e, color );
+ setColor(color);
+ emit changed();
+ e->accept();
+ }
+ else if ( edit == PixmapEditor && QImageDrag::canDecode( e ) ) {
+ QImage img;
+ QImageDrag::decode( e, img );
+ QPixmap pm;
+ pm.convertFromImage(img);
+ setPixmap(pm);
+ emit changed();
+ e->accept();
+ } else {
+ e->ignore();
+ }
+}
+#endif // QT_NO_DRAGANDDROP
diff --git a/tools/designer/designer/styledbutton.h b/tools/designer/designer/styledbutton.h
new file mode 100644
index 0000000..f847306
--- /dev/null
+++ b/tools/designer/designer/styledbutton.h
@@ -0,0 +1,110 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef STYLEDBUTTON_H
+#define STYLEDBUTTON_H
+
+#include <qbutton.h>
+#include <qpixmap.h>
+
+class QColor;
+class QBrush;
+class FormWindow;
+
+class StyledButton : public QButton
+{
+ Q_OBJECT
+
+ Q_PROPERTY( QColor color READ color WRITE setColor )
+ Q_PROPERTY( QPixmap pixmap READ pixmap WRITE setPixmap )
+ Q_PROPERTY( EditorType editor READ editor WRITE setEditor )
+ Q_PROPERTY( bool scale READ scale WRITE setScale )
+
+ Q_ENUMS( EditorType )
+
+public:
+ enum EditorType { ColorEditor, PixmapEditor };
+
+ StyledButton( QWidget* parent = 0, const char* name = 0 );
+ StyledButton( const QBrush& b, QWidget* parent = 0, const char* name = 0, WFlags f = 0 );
+ ~StyledButton();
+
+ void setEditor( EditorType );
+ EditorType editor() const;
+
+ void setColor( const QColor& );
+ void setPixmap( const QPixmap& );
+
+ QPixmap* pixmap() const;
+ QColor color() const;
+
+ void setScale( bool );
+ bool scale() const;
+
+ QSize sizeHint() const;
+ QSize minimumSizeHint() const;
+
+ void setFormWindow( FormWindow *fw ) { formWindow = fw; }
+
+public slots:
+ virtual void onEditor();
+
+signals:
+ void changed();
+
+protected:
+ void mousePressEvent(QMouseEvent*);
+ void mouseMoveEvent(QMouseEvent*);
+#ifndef QT_NO_DRAGANDDROP
+ void dragEnterEvent ( QDragEnterEvent * );
+ void dragMoveEvent ( QDragMoveEvent * );
+ void dragLeaveEvent ( QDragLeaveEvent * );
+ void dropEvent ( QDropEvent * );
+#endif // QT_NO_DRAGANDDROP
+ void drawButton( QPainter* );
+ void drawButtonLabel( QPainter* );
+ void resizeEvent( QResizeEvent* );
+ void scalePixmap();
+
+private:
+ QPixmap* pix;
+ QPixmap* spix; // the pixmap scaled down to fit into the button
+ QColor col;
+ EditorType edit;
+ bool s;
+ FormWindow *formWindow;
+ QPoint pressPos;
+ bool mousePressed;
+};
+
+#endif //STYLEDBUTTON_H
diff --git a/tools/designer/designer/syntaxhighlighter_html.cpp b/tools/designer/designer/syntaxhighlighter_html.cpp
new file mode 100644
index 0000000..da9be19
--- /dev/null
+++ b/tools/designer/designer/syntaxhighlighter_html.cpp
@@ -0,0 +1,167 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "syntaxhighlighter_html.h"
+#include "qstring.h"
+#include "qmap.h"
+#include "qapplication.h"
+
+
+SyntaxHighlighter_HTML::SyntaxHighlighter_HTML()
+ : QTextPreProcessor(), lastFormat( 0 ), lastFormatId( -1 )
+{
+ QFont f( qApp->font() );
+
+ addFormat(Standard, new QTextFormat(f, qApp->palette().color(QPalette::Active, QColorGroup::Text)));
+ addFormat(Keyword, new QTextFormat(f, qApp->palette().color(QPalette::Active, QColorGroup::Dark)));
+ addFormat(Attribute, new QTextFormat(f, qApp->palette().color(QPalette::Active, QColorGroup::Link)));
+ addFormat(AttribValue, new QTextFormat(f, qApp->palette().color(QPalette::Active, QColorGroup::LinkVisited)));
+}
+
+SyntaxHighlighter_HTML::~SyntaxHighlighter_HTML()
+{
+}
+
+void SyntaxHighlighter_HTML::process( QTextDocument *doc, QTextParagraph *string, int, bool invalidate )
+{
+
+ QTextFormat *formatStandard = format( Standard );
+ QTextFormat *formatKeyword = format( Keyword );
+ QTextFormat *formatAttribute = format( Attribute );
+ QTextFormat *formatAttribValue = format( AttribValue );
+
+ const int StateStandard = 0;
+ const int StateTag = 1;
+ const int StateAttribute = 2;
+ const int StateAttribVal = 3;
+
+ QString buffer = "";
+
+ int state = StateStandard;
+
+
+ if ( string->prev() ) {
+ if ( string->prev()->endState() == -1 )
+ process( doc, string->prev(), 0, FALSE );
+ state = string->prev()->endState();
+ }
+
+
+ int i = 0;
+ for ( ;; ) {
+ QChar c = string->at( i )->c;
+
+ if ( c == '<' ) {
+ if ( state != StateStandard )
+ string->setFormat( i - buffer.length(), buffer.length(), formatStandard, FALSE );
+ buffer = c;
+ state = StateTag;
+ string->setFormat( i, 1, formatKeyword, FALSE );
+ }
+ else if ( c == '>' && ( state != StateStandard ) ) {
+ string->setFormat( i, 1, formatKeyword, FALSE );
+ buffer = "";
+ state = StateStandard;
+ }
+ else if ( c == ' ' && state == StateTag ) {
+ buffer += c;
+ string->setFormat( i, 1, formatStandard, FALSE );
+ state = StateAttribute;
+ }
+ else if ( c == '=' && state == StateAttribute ) {
+ buffer += c;
+ string->setFormat( i, 1, formatStandard, FALSE );
+ state = StateAttribute;
+ }
+ else if ( c == '\"' && state == StateAttribute ) {
+ buffer += c;
+ string->setFormat( i, 1, formatStandard, FALSE );
+ state = StateAttribVal;
+ }
+ else if ( c == '\"' && state == StateAttribVal ) {
+ buffer += c;
+ string->setFormat( i, 1, formatStandard, FALSE );
+ state = StateAttribute;
+ }
+ else if ( state == StateAttribute ) {
+ buffer += c;
+ string->setFormat( i, 1, formatAttribute, FALSE );
+ }
+ else if ( state == StateAttribVal ) {
+ buffer += c;
+ string->setFormat( i, 1, formatAttribValue, FALSE );
+ }
+ else if ( state == StateTag ) {
+ string->setFormat( i, 1, formatKeyword, FALSE );
+ buffer += c;
+ }
+ else if ( state == StateStandard ) {
+ string->setFormat( i, 1, formatStandard, FALSE );
+ }
+
+ i++;
+ if ( i >= string->length() )
+ break;
+ }
+
+ string->setEndState( state );
+ string->setFirstPreProcess( FALSE );
+
+ if ( invalidate && string->next() &&
+ !string->next()->firstPreProcess() && string->next()->endState() != -1 ) {
+ QTextParagraph *p = string->next();
+ while ( p ) {
+ if ( p->endState() == -1 )
+ return;
+ p->setEndState( -1 );
+ p = p->next();
+ }
+ }
+}
+
+QTextFormat *SyntaxHighlighter_HTML::format( int id )
+{
+ if ( lastFormatId == id && lastFormat )
+ return lastFormat;
+
+ QTextFormat *f = formats[ id ];
+ lastFormat = f ? f : formats[ 0 ];
+ lastFormatId = id;
+ return lastFormat;
+}
+
+void SyntaxHighlighter_HTML::addFormat( int id, QTextFormat *f )
+{
+ formats.insert( id, f );
+}
diff --git a/tools/designer/designer/syntaxhighlighter_html.h b/tools/designer/designer/syntaxhighlighter_html.h
new file mode 100644
index 0000000..862600b
--- /dev/null
+++ b/tools/designer/designer/syntaxhighlighter_html.h
@@ -0,0 +1,64 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef SYNTAXHIGHLIGHTER_HTML_H
+#define SYNTAXHIGHLIGHTER_HTML_H
+
+#include <./private/qrichtext_p.h>
+
+class SyntaxHighlighter_HTML : public QTextPreProcessor
+{
+public:
+
+ enum HTML {
+ Standard = 1,
+ Keyword,
+ Attribute,
+ AttribValue
+ };
+
+ SyntaxHighlighter_HTML();
+ virtual ~SyntaxHighlighter_HTML();
+ void process( QTextDocument *doc, QTextParagraph *string, int start, bool invalidate = TRUE );
+ QTextFormat *format( int id );
+
+private:
+ void addFormat( int id, QTextFormat *f );
+
+ QTextFormat *lastFormat;
+ int lastFormatId;
+ QIntDict<QTextFormat> formats;
+
+};
+
+#endif
diff --git a/tools/designer/designer/tableeditor.ui b/tools/designer/designer/tableeditor.ui
new file mode 100644
index 0000000..6ac73d3
--- /dev/null
+++ b/tools/designer/designer/tableeditor.ui
@@ -0,0 +1,831 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>TableEditorBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>TableEditorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>484</width>
+ <height>406</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Table</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTable" row="0" column="0">
+ <property name="name">
+ <cstring>table</cstring>
+ </property>
+ <property name="numRows">
+ <number>1</number>
+ </property>
+ <property name="numCols">
+ <number>1</number>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonApply</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Apply all changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QTabWidget" row="0" column="1">
+ <property name="name">
+ <cstring>TabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>columns_tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Co&amp;lumns</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer row="4" column="2">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QListBox" row="0" column="0" rowspan="6" colspan="1">
+ <property name="name">
+ <cstring>listColumns</cstring>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>buttonColumnUp</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_up.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move up</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Move the selected item up.&lt;/b&gt;&lt;p&gt;The top-most column will be the first column of the list.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="1">
+ <property name="name">
+ <cstring>buttonColumnDown</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_down.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move down</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Move the selected item down.&lt;/b&gt;&lt;p&gt;The top-most column will be the first column of the list.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>buttonDeleteColumn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Column</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>buttonNewColumn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Column</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>labelTable</cstring>
+ </property>
+ <property name="text">
+ <string>Table:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="1">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>labelColumnPixmap</cstring>
+ </property>
+ <property name="text">
+ <string>Label4</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonDeleteColPixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_editcut.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Delete the selected item's pixmap.&lt;/b&gt;&lt;p&gt;The pixmap in the current column of the selected item will be deleted.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonChooseColPixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select a Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Select a pixmap file for the item.&lt;/b&gt;&lt;p&gt;The pixmap will be changed in the current column of the selected item.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Label:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editColumnText</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>Label2</cstring>
+ </property>
+ <property name="text">
+ <string>Pixmap:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>itemChoosePixmap</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>labelFields</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Field:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboFields</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>editColumnText</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>comboFields</cstring>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>labelTableValue</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;no table&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>rows_tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Rows</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer row="4" column="2">
+ <property name="name">
+ <cstring>Spacer3_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>buttonRowUp</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_up.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move up</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Move the selected item up.&lt;/b&gt;&lt;p&gt;The top-most column will be the first column of the list.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QListBox" row="0" column="0" rowspan="6" colspan="1">
+ <property name="name">
+ <cstring>listRows</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="1">
+ <property name="name">
+ <cstring>buttonRowDown</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_down.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move down</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Move the selected item down.&lt;/b&gt;&lt;p&gt;The top-most column will be the first column of the list.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>Spacer2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>buttonNewRow</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Row</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>buttonDeleteRow</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Row</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout7_2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel2_3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Label:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editRowText</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>Label2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Pixmap:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>itemChoosePixmap</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>Layout2_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>labelRowPixmap</cstring>
+ </property>
+ <property name="text">
+ <string>Label4</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonDeleteRowPixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_editcut.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Delete Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Delete the selected item's pixmap.&lt;/b&gt;&lt;p&gt;The pixmap in the current column of the selected item will be deleted.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonChooseRowPixmap</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select a Pixmap</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Select a pixmap file for the item.&lt;/b&gt;&lt;p&gt;The pixmap will be changed in the current column of the selected item.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>editRowText</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonApply</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>applyClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>listColumns</sender>
+ <signal>currentChanged(QListBoxItem*)</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>currentColumnChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>listColumns</sender>
+ <signal>selectionChanged(QListBoxItem*)</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>currentColumnChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>editColumnText</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>columnTextChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>buttonNewColumn</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>newColumnClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonDeleteColumn</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>deleteColumnClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonColumnUp</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>columnUpClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonColumnDown</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>columnDownClicked()</slot>
+ </connection>
+ <connection>
+ <sender>comboFields</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>currentFieldChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>listRows</sender>
+ <signal>selectionChanged(QListBoxItem*)</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>currentRowChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>listRows</sender>
+ <signal>currentChanged(QListBoxItem*)</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>currentRowChanged(QListBoxItem*)</slot>
+ </connection>
+ <connection>
+ <sender>buttonNewRow</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>newRowClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonDeleteRow</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>deleteRowClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonRowUp</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>rowUpClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonRowDown</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>rowDownClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonChooseRowPixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>chooseRowPixmapClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonDeleteColPixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>deleteColPixmapClicked()</slot>
+ </connection>
+ <connection>
+ <sender>editRowText</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>rowTextChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>buttonChooseColPixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>chooseColPixmapClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonDeleteRowPixmap</sender>
+ <signal>clicked()</signal>
+ <receiver>TableEditorBase</receiver>
+ <slot>deleteRowPixmapClicked()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+ <tabstop>table</tabstop>
+ <tabstop>TabWidget</tabstop>
+ <tabstop>listColumns</tabstop>
+ <tabstop>buttonNewColumn</tabstop>
+ <tabstop>buttonDeleteColumn</tabstop>
+ <tabstop>comboFields</tabstop>
+ <tabstop>editColumnText</tabstop>
+ <tabstop>buttonDeleteColPixmap</tabstop>
+ <tabstop>buttonChooseColPixmap</tabstop>
+ <tabstop>buttonColumnUp</tabstop>
+ <tabstop>buttonColumnDown</tabstop>
+ <tabstop>buttonApply</tabstop>
+ <tabstop>listRows</tabstop>
+ <tabstop>buttonNewRow</tabstop>
+ <tabstop>buttonDeleteRow</tabstop>
+ <tabstop>editRowText</tabstop>
+ <tabstop>buttonDeleteRowPixmap</tabstop>
+ <tabstop>buttonChooseRowPixmap</tabstop>
+ <tabstop>buttonRowUp</tabstop>
+ <tabstop>buttonRowDown</tabstop>
+ <tabstop>buttonHelp</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">qtable.h</include>
+</includes>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot access="protected">applyClicked()</slot>
+ <slot access="protected">chooseRowPixmapClicked()</slot>
+ <slot access="protected">columnTextChanged( const QString &amp; )</slot>
+ <slot access="protected">columnUpClicked()</slot>
+ <slot access="protected">currentColumnChanged( QListBoxItem * )</slot>
+ <slot access="protected">currentFieldChanged( const QString &amp; )</slot>
+ <slot access="protected">currentRowChanged( QListBoxItem * )</slot>
+ <slot access="protected">deleteColPixmapClicked()</slot>
+ <slot access="protected">deleteColumnClicked()</slot>
+ <slot access="protected">deleteRowClicked()</slot>
+ <slot access="protected">deleteRowPixmapClicked()</slot>
+ <slot access="protected">newColumnClicked()</slot>
+ <slot access="protected">newRowClicked()</slot>
+ <slot access="protected">chooseColPixmapClicked()</slot>
+ <slot access="protected">okClicked()</slot>
+ <slot access="protected">rowDownClicked()</slot>
+ <slot access="protected">rowTextChanged( const QString &amp; )</slot>
+ <slot access="protected">rowUpClicked()</slot>
+ <slot access="protected">columnDownClicked()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/tableeditorimpl.cpp b/tools/designer/designer/tableeditorimpl.cpp
new file mode 100644
index 0000000..2518f6f
--- /dev/null
+++ b/tools/designer/designer/tableeditorimpl.cpp
@@ -0,0 +1,501 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "tableeditorimpl.h"
+#ifndef QT_NO_TABLE
+#include <qtable.h>
+#endif
+#include "formwindow.h"
+#include <qlabel.h>
+#include <qcombobox.h>
+#include <qheader.h>
+#include <qlistbox.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include "pixmapchooser.h"
+#include "command.h"
+#include <qvaluelist.h>
+#include <qtabwidget.h>
+#include <qdatatable.h>
+#include "project.h"
+#include "metadatabase.h"
+#include "mainwindow.h"
+
+TableEditor::TableEditor( QWidget* parent, QWidget *editWidget, FormWindow *fw, const char* name, bool modal, WFlags fl )
+ : TableEditorBase( parent, name, modal, fl ),
+#ifndef QT_NO_TABLE
+ editTable( (QTable*)editWidget ),
+#endif
+ formWindow( fw )
+{
+ connect( buttonHelp, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+#ifndef QT_NO_TABLE
+ labelColumnPixmap->setText( "" );
+ labelRowPixmap->setText( "" );
+
+#ifndef QT_NO_SQL
+ if ( !::qt_cast<QDataTable*>(editTable) )
+#endif
+ {
+ labelFields->hide();
+ comboFields->hide();
+ labelTable->hide();
+ labelTableValue->hide();
+ }
+#ifndef QT_NO_SQL
+ if ( ::qt_cast<QDataTable*>(editTable) ) {
+ // ## why does this behave weird?
+ // TabWidget->removePage( rows_tab );
+ // rows_tab->hide();
+ // ## do this in the meantime...
+ TabWidget->setTabEnabled( rows_tab, FALSE );
+ }
+
+ if ( formWindow->project() && ::qt_cast<QDataTable*>(editTable) ) {
+ QStringList lst = MetaDataBase::fakeProperty( editTable, "database" ).toStringList();
+ if ( lst.count() == 2 && !lst[ 0 ].isEmpty() && !lst[ 1 ].isEmpty() ) {
+ QStringList fields;
+ fields << "<no field>";
+ fields += formWindow->project()->databaseFieldList( lst[ 0 ], lst[ 1 ] );
+ comboFields->insertStringList( fields );
+ }
+ if ( !lst[ 1 ].isEmpty() )
+ labelTableValue->setText( lst[ 1 ] );
+ }
+#endif
+
+ readFromTable();
+#endif
+}
+
+TableEditor::~TableEditor()
+{
+}
+
+void TableEditor::columnDownClicked()
+{
+ if ( listColumns->currentItem() == -1 ||
+ listColumns->currentItem() == (int)listColumns->count() - 1 ||
+ listColumns->count() < 2 )
+ return;
+ saveFieldMap();
+ int index = listColumns->currentItem() + 1;
+ QListBoxItem *i = listColumns->item( listColumns->currentItem() );
+ listColumns->takeItem( i );
+ listColumns->insertItem( i, index );
+ listColumns->setCurrentItem( i );
+ readColumns();
+ restoreFieldMap();
+ currentColumnChanged( i );
+}
+
+void TableEditor::columnTextChanged( const QString &s )
+{
+ if ( listColumns->currentItem() == -1 )
+ return;
+ listColumns->blockSignals( TRUE );
+ listColumns->changeItem( s, listColumns->currentItem() );
+ listColumns->blockSignals( FALSE );
+#ifndef QT_NO_TABLE
+ if ( table->horizontalHeader()->iconSet( listColumns->currentItem() ) )
+ table->horizontalHeader()->setLabel( listColumns->currentItem(),
+ *table->horizontalHeader()->iconSet( listColumns->currentItem() ), s );
+ else
+ table->horizontalHeader()->setLabel( listColumns->currentItem(), s );
+#endif
+}
+
+void TableEditor::columnUpClicked()
+{
+ if ( listColumns->currentItem() <= 0 ||
+ listColumns->count() < 2 )
+ return;
+ saveFieldMap();
+ int index = listColumns->currentItem() - 1;
+ QListBoxItem *i = listColumns->item( listColumns->currentItem() );
+ listColumns->takeItem( i );
+ listColumns->insertItem( i, index );
+ listColumns->setCurrentItem( i );
+ readColumns();
+ restoreFieldMap();
+ currentColumnChanged( i );
+}
+
+void TableEditor::currentColumnChanged( QListBoxItem *i )
+{
+ if ( !i )
+ return;
+ editColumnText->blockSignals( TRUE );
+ editColumnText->setText( i->text() );
+ if ( i->pixmap() )
+ labelColumnPixmap->setPixmap( *i->pixmap() );
+ else
+ labelColumnPixmap->setText( "" );
+ editColumnText->blockSignals( FALSE );
+
+#ifndef QT_NO_SQL
+ if ( ::qt_cast<QDataTable*>(editTable) ) {
+ QString s = *fieldMap.find( listColumns->index( i ) );
+ if ( s.isEmpty() )
+ comboFields->setCurrentItem( 0 );
+ else if ( comboFields->listBox()->findItem( s ) )
+ comboFields->setCurrentItem( comboFields->listBox()->index( comboFields->listBox()->findItem( s ) ) );
+ else
+ comboFields->lineEdit()->setText( s );
+ }
+#endif
+}
+
+void TableEditor::currentFieldChanged( const QString &s )
+{
+ if ( listColumns->currentItem() == -1 )
+ return;
+ fieldMap.remove( listColumns->currentItem() );
+ fieldMap.insert( listColumns->currentItem(), s );
+ editColumnText->blockSignals( TRUE ); //## necessary
+ QString newColText = s.mid(0,1).upper() + s.mid(1);
+ editColumnText->setText( newColText );
+ columnTextChanged( newColText );
+ editColumnText->blockSignals( FALSE );
+}
+
+void TableEditor::currentRowChanged( QListBoxItem *i )
+{
+ if ( !i )
+ return;
+ editRowText->blockSignals( TRUE );
+ editRowText->setText( i->text() );
+ if ( i->pixmap() )
+ labelRowPixmap->setPixmap( *i->pixmap() );
+ else
+ labelRowPixmap->setText( "" );
+ editRowText->blockSignals( FALSE );
+}
+
+void TableEditor::deleteColumnClicked()
+{
+ if ( listColumns->currentItem() == -1 )
+ return;
+#ifndef QT_NO_TABLE
+ table->setNumCols( table->numCols() - 1 );
+ delete listColumns->item( listColumns->currentItem() );
+ readColumns();
+ if ( listColumns->firstItem() ) {
+ listColumns->setCurrentItem( listColumns->firstItem() );
+ listColumns->setSelected( listColumns->firstItem(), TRUE );
+ }
+#endif
+}
+
+void TableEditor::deleteRowClicked()
+{
+ if ( listRows->currentItem() == -1 )
+ return;
+#ifndef QT_NO_TABLE
+ table->setNumRows( table->numRows() - 1 );
+ delete listRows->item( listRows->currentItem() );
+ readRows();
+ if ( listRows->firstItem() ) {
+ listRows->setCurrentItem( listRows->firstItem() );
+ listRows->setSelected( listRows->firstItem(), TRUE );
+ }
+#endif
+}
+
+void TableEditor::newColumnClicked()
+{
+#ifndef QT_NO_TABLE
+ table->setNumCols( table->numCols() + 1 );
+ QMap<QString, bool> m;
+ for ( int i = 0; i < table->numCols() - 1; ++i )
+ m.insert( table->horizontalHeader()->label( i ), TRUE );
+ int n = table->numCols() - 1;
+ QString t = QString::number( n );
+ while ( m.find( t ) != m.end() )
+ t = QString::number( ++n );
+ table->horizontalHeader()->setLabel( table->numCols() - 1, t );
+ listColumns->insertItem( t );
+ QListBoxItem *item = listColumns->item( listColumns->count() - 1 );
+ listColumns->setCurrentItem( item );
+ listColumns->setSelected( item, TRUE );
+#ifndef QT_NO_SQL
+ if ( ::qt_cast<QDataTable*>(editTable) ) {
+ comboFields->setFocus();
+ } else
+#endif
+ {
+ editColumnText->setFocus();
+ editColumnText->selectAll();
+ }
+#endif
+}
+
+void TableEditor::newRowClicked()
+{
+#ifndef QT_NO_TABLE
+ table->setNumRows( table->numRows() + 1 );
+ QMap<QString, bool> m;
+ for ( int i = 0; i < table->numRows() - 1; ++i )
+ m.insert( table->verticalHeader()->label( i ), TRUE );
+ int n = table->numRows() - 1;
+ QString t = QString::number( n );
+ while ( m.find( t ) != m.end() )
+ t = QString::number( ++n );
+ table->verticalHeader()->setLabel( table->numRows() - 1, t );
+ listRows->insertItem( t );
+ QListBoxItem *item = listRows->item( listRows->count() - 1 );
+ listRows->setCurrentItem( item );
+ listRows->setSelected( item, TRUE );
+#endif
+}
+
+void TableEditor::okClicked()
+{
+ applyClicked();
+ accept();
+}
+
+void TableEditor::rowDownClicked()
+{
+ if ( listRows->currentItem() == -1 ||
+ listRows->currentItem() == (int)listRows->count() - 1 ||
+ listRows->count() < 2 )
+ return;
+ int index = listRows->currentItem() + 1;
+ QListBoxItem *i = listRows->item( listRows->currentItem() );
+ listRows->takeItem( i );
+ listRows->insertItem( i, index );
+ listRows->setCurrentItem( i );
+ readRows();
+}
+
+void TableEditor::rowTextChanged( const QString &s )
+{
+ if ( listRows->currentItem() == -1 )
+ return;
+#ifndef QT_NO_TABLE
+ listRows->blockSignals(TRUE);
+ listRows->changeItem( s, listRows->currentItem() );
+ listRows->blockSignals(FALSE);
+ if ( table->verticalHeader()->iconSet( listRows->currentItem() ) )
+ table->verticalHeader()->setLabel( listRows->currentItem(),
+ *table->verticalHeader()->iconSet( listRows->currentItem() ), s );
+ else
+ table->verticalHeader()->setLabel( listRows->currentItem(), s );
+#endif
+}
+
+void TableEditor::rowUpClicked()
+{
+ if ( listRows->currentItem() <= 0 ||
+ listRows->count() < 2 )
+ return;
+ int index = listRows->currentItem() - 1;
+ QListBoxItem *i = listRows->item( listRows->currentItem() );
+ listRows->takeItem( i );
+ listRows->insertItem( i, index );
+ listRows->setCurrentItem( i );
+ readRows();
+}
+
+void TableEditor::applyClicked()
+{
+ QValueList<PopulateTableCommand::Row> rows;
+ QValueList<PopulateTableCommand::Column> cols;
+
+ int i = 0;
+#ifndef QT_NO_TABLE
+ for ( i = 0; i < table->horizontalHeader()->count(); ++i ) {
+ PopulateTableCommand::Column col;
+ col.text = table->horizontalHeader()->label( i );
+ if ( table->horizontalHeader()->iconSet( i ) )
+ col.pix = table->horizontalHeader()->iconSet( i )->pixmap();
+ col.field = *fieldMap.find( i );
+ cols.append( col );
+ }
+ for ( i = 0; i < table->verticalHeader()->count(); ++i ) {
+ PopulateTableCommand::Row row;
+ row.text = table->verticalHeader()->label( i );
+ if ( table->verticalHeader()->iconSet( i ) )
+ row.pix = table->verticalHeader()->iconSet( i )->pixmap();
+ rows.append( row );
+ }
+ PopulateTableCommand *cmd = new PopulateTableCommand( tr( "Edit the Rows and Columns of '%1' " ).arg( editTable->name() ),
+ formWindow, editTable, rows, cols );
+ cmd->execute();
+ formWindow->commandHistory()->addCommand( cmd );
+#endif
+}
+
+void TableEditor::chooseRowPixmapClicked()
+{
+ if ( listRows->currentItem() == -1 )
+ return;
+ QPixmap pix;
+ if ( listRows->item( listRows->currentItem() )->pixmap() )
+ pix = qChoosePixmap( this, formWindow, *listRows->item( listRows->currentItem() )->pixmap() );
+ else
+ pix = qChoosePixmap( this, formWindow, QPixmap() );
+
+ if ( pix.isNull() )
+ return;
+
+#ifndef QT_NO_TABLE
+ table->verticalHeader()->setLabel( listRows->currentItem(), pix, table->verticalHeader()->label( listRows->currentItem() ) );
+ listRows->changeItem( pix, listRows->currentText(), listRows->currentItem() );
+#endif
+}
+
+void TableEditor::deleteRowPixmapClicked()
+{
+ if ( listRows->currentItem() == -1 )
+ return;
+#ifndef QT_NO_TABLE
+ table->verticalHeader()->setLabel( listRows->currentItem(), QPixmap(), table->verticalHeader()->label( listRows->currentItem() ) );
+ listRows->changeItem( listRows->currentText(), listRows->currentItem() );
+#endif
+}
+
+void TableEditor::chooseColPixmapClicked()
+{
+ if ( listColumns->currentItem() == -1 )
+ return;
+ QPixmap pix;
+ if ( listColumns->item( listColumns->currentItem() )->pixmap() )
+ pix = qChoosePixmap( this, formWindow, *listColumns->item( listColumns->currentItem() )->pixmap() );
+ else
+ pix = qChoosePixmap( this, formWindow, QPixmap() );
+
+ if ( pix.isNull() )
+ return;
+#ifndef QT_NO_TABLE
+ table->horizontalHeader()->setLabel( listColumns->currentItem(), pix, table->horizontalHeader()->label( listColumns->currentItem() ) );
+ listColumns->changeItem( pix, listColumns->currentText(), listColumns->currentItem() );
+#endif
+}
+
+void TableEditor::deleteColPixmapClicked()
+{
+ if ( listColumns->currentItem() == -1 )
+ return;
+#ifndef QT_NO_TABLE
+ table->horizontalHeader()->setLabel( listColumns->currentItem(), QPixmap(), table->horizontalHeader()->label( listColumns->currentItem() ) );
+ listColumns->changeItem( listColumns->currentText(), listColumns->currentItem() );
+#endif
+}
+
+void TableEditor::readFromTable()
+{
+#ifndef QT_NO_TABLE
+ QHeader *cols = editTable->horizontalHeader();
+ table->setNumCols( cols->count() );
+ QMap<QString, QString> columnFields = MetaDataBase::columnFields( editTable );
+ for ( int i = 0; i < cols->count(); ++i ) {
+ if ( editTable->horizontalHeader()->iconSet( i ) ) {
+ table->horizontalHeader()->setLabel( i, *editTable->horizontalHeader()->iconSet( i ),
+ editTable->horizontalHeader()->label( i ) );
+ listColumns->insertItem( editTable->horizontalHeader()->iconSet( i )->pixmap(),
+ editTable->horizontalHeader()->label( i ) );
+ } else {
+ table->horizontalHeader()->setLabel( i, editTable->horizontalHeader()->label( i ) );
+ listColumns->insertItem( editTable->horizontalHeader()->label( i ) );
+ }
+ QString cf = *columnFields.find( editTable->horizontalHeader()->label( i ) );
+ fieldMap.insert( i, cf );
+ }
+
+ if ( listColumns->firstItem() ) {
+ listColumns->setCurrentItem( listColumns->firstItem() );
+ listColumns->setSelected( listColumns->firstItem(), TRUE );
+ }
+
+ QHeader *rows = editTable->verticalHeader();
+ table->setNumRows( rows->count() );
+ for ( int j = 0; j < rows->count(); ++j ) {
+ if ( editTable->verticalHeader()->iconSet( j ) ) {
+ table->verticalHeader()->setLabel( j, *editTable->verticalHeader()->iconSet( j ),
+ editTable->verticalHeader()->label( j ) );
+ listRows->insertItem( editTable->verticalHeader()->iconSet( j )->pixmap(),
+ editTable->verticalHeader()->label( j ) );
+ } else {
+ table->verticalHeader()->setLabel( j, editTable->verticalHeader()->label( j ) );
+ listRows->insertItem( editTable->verticalHeader()->label( j ) );
+ }
+ }
+
+ if ( listRows->firstItem() ) {
+ listRows->setCurrentItem( listRows->firstItem() );
+ listRows->setSelected( listRows->firstItem(), TRUE );
+ }
+#endif
+}
+
+void TableEditor::readColumns()
+{
+ int j = 0;
+#ifndef QT_NO_TABLE
+ for ( QListBoxItem *i = listColumns->firstItem(); i; i = i->next(), ++j ) {
+ if ( i->pixmap() )
+ table->horizontalHeader()->setLabel( j, *i->pixmap(), i->text() );
+ else
+ table->horizontalHeader()->setLabel( j, i->text() );
+ }
+#endif
+}
+
+void TableEditor::readRows()
+{
+ int j = 0;
+#ifndef QT_NO_TABLE
+ for ( QListBoxItem *i = listRows->firstItem(); i; i = i->next(), ++j ) {
+ if ( i->pixmap() )
+ table->verticalHeader()->setLabel( j, *i->pixmap(), i->text() );
+ else
+ table->verticalHeader()->setLabel( j, i->text() );
+ }
+#endif
+}
+
+void TableEditor::saveFieldMap()
+{
+ tmpFieldMap.clear();
+ for ( QMap<int, QString>::Iterator it = fieldMap.begin(); it != fieldMap.end(); ++it )
+ tmpFieldMap.insert( listColumns->item( it.key() ), *it );
+}
+
+void TableEditor::restoreFieldMap()
+{
+ fieldMap.clear();
+ for ( QMap<QListBoxItem*, QString>::Iterator it = tmpFieldMap.begin(); it != tmpFieldMap.end(); ++it )
+ fieldMap.insert( listColumns->index( it.key() ), *it );
+}
diff --git a/tools/designer/designer/tableeditorimpl.h b/tools/designer/designer/tableeditorimpl.h
new file mode 100644
index 0000000..88e5dc1
--- /dev/null
+++ b/tools/designer/designer/tableeditorimpl.h
@@ -0,0 +1,89 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef TABLEEDITORIMPL_H
+#define TABLEEDITORIMPL_H
+
+#include "tableeditor.h"
+#include <qmap.h>
+
+class QListBoxItem;
+class QTable;
+class FormWindow;
+
+class TableEditor : public TableEditorBase
+{
+ Q_OBJECT
+
+public:
+ TableEditor( QWidget* parent = 0, QWidget *editWidget = 0, FormWindow *fw = 0,
+ const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~TableEditor();
+
+protected slots:
+ void columnDownClicked();
+ void columnTextChanged( const QString & );
+ void columnUpClicked();
+ void currentColumnChanged( QListBoxItem * );
+ void currentFieldChanged( const QString & );
+ void currentRowChanged( QListBoxItem * );
+ void deleteColumnClicked();
+ void deleteRowClicked();
+ void newColumnClicked();
+ void newRowClicked();
+ void okClicked();
+ void rowDownClicked();
+ void rowTextChanged( const QString & );
+ void rowUpClicked();
+ void applyClicked();
+ void chooseRowPixmapClicked();
+ void deleteRowPixmapClicked();
+ void chooseColPixmapClicked();
+ void deleteColPixmapClicked();
+
+private:
+ void readFromTable();
+ void readColumns();
+ void readRows();
+ void saveFieldMap();
+ void restoreFieldMap();
+
+private:
+ QTable *editTable;
+ FormWindow *formWindow;
+ QMap<int, QString> fieldMap;
+ QMap<QListBoxItem*, QString> tmpFieldMap;
+
+};
+
+#endif // TABLEEDITOR_H
diff --git a/tools/designer/designer/timestamp.cpp b/tools/designer/designer/timestamp.cpp
new file mode 100644
index 0000000..2822292
--- /dev/null
+++ b/tools/designer/designer/timestamp.cpp
@@ -0,0 +1,93 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "timestamp.h"
+#include <qfile.h>
+#include <qfileinfo.h>
+
+class QTimer;
+
+TimeStamp::TimeStamp( QObject *parent, const QString &f )
+ : QObject( parent ), filename( f ), autoCheck( FALSE )
+{
+ timer = new QTimer( this );
+ connect( timer, SIGNAL( timeout() ), this, SLOT( autoCheckTimeStamp() ) );
+ update();
+}
+
+void TimeStamp::setFileName( const QString &f )
+{
+ filename = f;
+ update();
+}
+
+QString TimeStamp::fileName() const
+{
+ return filename;
+}
+
+void TimeStamp::setAutoCheckEnabled( bool a )
+{
+ autoCheck = a;
+ if ( autoCheck )
+ timer->start( 5000 );
+ else
+ timer->stop();
+}
+
+void TimeStamp::update()
+{
+ QFile f( filename );
+ if ( !f.exists() )
+ return;
+ lastTimeStamp = QFileInfo( f ).lastModified();
+}
+
+bool TimeStamp::isUpToDate() const
+{
+ QFile f( filename );
+ if ( !f.exists() )
+ return TRUE;
+ return lastTimeStamp == QFileInfo( f ).lastModified();
+}
+
+bool TimeStamp::isAutoCheckEnabled() const
+{
+ return autoCheck;
+}
+
+void TimeStamp::autoCheckTimeStamp()
+{
+ if ( !isUpToDate() )
+ emit timeStampChanged();
+}
diff --git a/tools/designer/designer/timestamp.h b/tools/designer/designer/timestamp.h
new file mode 100644
index 0000000..c36c0bf
--- /dev/null
+++ b/tools/designer/designer/timestamp.h
@@ -0,0 +1,70 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef TIMESTAMP_H
+#define TIMESTAMP_H
+
+#include <qobject.h>
+#include <qdatetime.h>
+#include <qtimer.h>
+
+class TimeStamp : public QObject
+{
+ Q_OBJECT
+
+public:
+ TimeStamp( QObject *parent, const QString &f );
+
+ void setFileName( const QString &f );
+ QString fileName() const;
+ void setAutoCheckEnabled( bool a );
+ void update();
+
+ bool isUpToDate() const;
+ bool isAutoCheckEnabled() const;
+
+signals:
+ void timeStampChanged();
+
+private slots:
+ void autoCheckTimeStamp();
+
+private:
+ QDateTime lastTimeStamp;
+ QString filename;
+ bool autoCheck;
+ QTimer *timer;
+
+};
+
+#endif
diff --git a/tools/designer/designer/variabledialog.ui b/tools/designer/designer/variabledialog.ui
new file mode 100644
index 0000000..bf3dc3c
--- /dev/null
+++ b/tools/designer/designer/variabledialog.ui
@@ -0,0 +1,301 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>VariableDialogBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2002-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>VariableDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>276</width>
+ <height>320</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Variables</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListView" row="0" column="0" rowspan="1" colspan="4">
+ <column>
+ <property name="text">
+ <string>Variable</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Access</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>varView</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>deleteButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>propBox</cstring>
+ </property>
+ <property name="title">
+ <string>Variable Properties</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Acc&amp;ess:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>accessCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Variable:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>varName</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>varName</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <item>
+ <property name="text">
+ <string>public</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>protected</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>private</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>accessCombo</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>addButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="3" column="3">
+ <property name="name">
+ <cstring>cancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>okButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>VariableDialogBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>addButton</sender>
+ <signal>clicked()</signal>
+ <receiver>VariableDialogBase</receiver>
+ <slot>addVariable()</slot>
+ </connection>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>VariableDialogBase</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>varName</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>VariableDialogBase</receiver>
+ <slot>nameChanged()</slot>
+ </connection>
+ <connection>
+ <sender>deleteButton</sender>
+ <signal>clicked()</signal>
+ <receiver>VariableDialogBase</receiver>
+ <slot>deleteVariable()</slot>
+ </connection>
+ <connection>
+ <sender>accessCombo</sender>
+ <signal>activated(int)</signal>
+ <receiver>VariableDialogBase</receiver>
+ <slot>accessChanged()</slot>
+ </connection>
+ <connection>
+ <sender>varView</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>VariableDialogBase</receiver>
+ <slot>currentItemChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>varView</sender>
+ <signal>selectionChanged(QListViewItem*)</signal>
+ <receiver>VariableDialogBase</receiver>
+ <slot>currentItemChanged(QListViewItem*)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>varView</tabstop>
+ <tabstop>addButton</tabstop>
+ <tabstop>deleteButton</tabstop>
+ <tabstop>varName</tabstop>
+ <tabstop>accessCombo</tabstop>
+ <tabstop>okButton</tabstop>
+ <tabstop>cancelButton</tabstop>
+</tabstops>
+<slots>
+ <slot>addVariable()</slot>
+ <slot>deleteVariable()</slot>
+ <slot>accessChanged()</slot>
+ <slot>nameChanged()</slot>
+ <slot>okClicked()</slot>
+ <slot>currentItemChanged( QListViewItem * i )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/variabledialogimpl.cpp b/tools/designer/designer/variabledialogimpl.cpp
new file mode 100644
index 0000000..f71264e
--- /dev/null
+++ b/tools/designer/designer/variabledialogimpl.cpp
@@ -0,0 +1,185 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qlistview.h>
+#include <qgroupbox.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qmessagebox.h>
+
+#include "metadatabase.h"
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "hierarchyview.h"
+#include "command.h"
+#include "variabledialogimpl.h"
+
+
+VariableDialog::VariableDialog( FormWindow *fw, QWidget *parent )
+ : VariableDialogBase( parent ), formWindow( fw )
+{
+ varView->setSorting( -1 );
+ QValueList<MetaDataBase::Variable> varLst = MetaDataBase::variables( formWindow );
+ QValueList<MetaDataBase::Variable>::Iterator it = varLst.begin();
+ for ( ; it != varLst.end(); ++it ) {
+ QListViewItem *i = new QListViewItem( varView );
+ i->setText( 0, (*it).varName );
+ i->setText( 1, (*it).varAccess );
+ }
+
+ if ( varView->firstChild() )
+ varView->setCurrentItem( varView->firstChild() );
+ else
+ propBox->setEnabled( FALSE );
+}
+
+VariableDialog::~VariableDialog()
+{
+}
+
+void VariableDialog::setCurrentItem( QString text )
+{
+ QListViewItem *i = varView->findItem( text, 0 );
+ if ( i )
+ varView->setCurrentItem( i );
+}
+
+void VariableDialog::okClicked()
+{
+ QValueList<MetaDataBase::Variable> lst;
+
+ QListViewItemIterator it( varView );
+ while ( it.current() != 0 ) {
+ MetaDataBase::Variable v;
+ v.varName = it.current()->text( 0 ).simplifyWhiteSpace();
+ if ( v.varName[ (int)v.varName.length() - 1 ] != ';' )
+ v.varName += ";";
+ v.varAccess = it.current()->text( 1 );
+ lst << v;
+ ++it;
+ }
+
+ if ( !lst.isEmpty() ) {
+ QValueList<MetaDataBase::Variable> invalidLst;
+ QValueList<MetaDataBase::Variable>::Iterator it1 = lst.begin();
+ QValueList<MetaDataBase::Variable>::Iterator it2;
+ for ( ; it1 != lst.end(); ++it1 ) {
+ it2 = it1;
+ ++it2;
+ for ( ; it2 != lst.end(); ++it2 ) {
+ if ( MetaDataBase::extractVariableName( (*it1).varName ) ==
+ MetaDataBase::extractVariableName( (*it2).varName ) ) {
+ invalidLst << (*it1);
+ break;
+ }
+ }
+ }
+ if ( !invalidLst.isEmpty() ) {
+ if ( QMessageBox::information( this, tr( "Edit Variables" ),
+ tr( "One variable has been declared twice.\n"
+ "Remove this variable?" ), tr( "&Yes" ), tr( "&No" ) ) == 0 ) {
+ for ( it2 = invalidLst.begin(); it2 != invalidLst.end(); ++it2 ) {
+ it = varView->firstChild();
+ while ( it.current() != 0 ) {
+ if ( MetaDataBase::extractVariableName( (*it)->text( 0 ).simplifyWhiteSpace() ) ==
+ MetaDataBase::extractVariableName( (*it2).varName ) ) {
+ delete (*it);
+ break;
+ }
+ ++it;
+ }
+ }
+ }
+ formWindow->mainWindow()->objectHierarchy()->updateFormDefinitionView();
+ return;
+ }
+ }
+ Command *cmd = new SetVariablesCommand( "Edit variables", formWindow, lst );
+ formWindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ accept();
+}
+
+void VariableDialog::addVariable()
+{
+ QListViewItem *i = new QListViewItem( varView, varView->lastItem() );
+ i->setText( 0, "int newVariable" );
+ i->setText( 1, "protected" );
+ varView->setCurrentItem( i );
+ varView->setSelected( i, TRUE );
+ varName->setFocus();
+ varName->selectAll();
+}
+
+void VariableDialog::deleteVariable()
+{
+ QListViewItem *i = varView->selectedItem();
+ if ( !i )
+ return;
+ delete i;
+ i = 0;
+ if ( varView->firstChild() )
+ varView->setSelected( varView->firstChild(), TRUE );
+}
+
+void VariableDialog::currentItemChanged( QListViewItem *i )
+{
+ if ( !i ) {
+ varName->clear();
+ accessCombo->setCurrentItem( 1 );
+ propBox->setEnabled( FALSE );
+ return;
+ }
+ varName->setText( i->text( 0 ) );
+ if ( i->text( 1 ) == "public" )
+ accessCombo->setCurrentItem( 0 );
+ else if ( i->text( 1 ) == "protected" )
+ accessCombo->setCurrentItem( 1 );
+ else
+ accessCombo->setCurrentItem( 2 );
+ propBox->setEnabled( TRUE );
+}
+
+void VariableDialog::nameChanged()
+{
+ if ( !varView->currentItem() )
+ return;
+ varView->currentItem()->setText( 0, varName->text() );
+}
+
+void VariableDialog::accessChanged()
+{
+ if ( !varView->currentItem() )
+ return;
+ varView->currentItem()->setText( 1, accessCombo->currentText() );
+}
diff --git a/tools/designer/designer/variabledialogimpl.h b/tools/designer/designer/variabledialogimpl.h
new file mode 100644
index 0000000..d2dbbc1
--- /dev/null
+++ b/tools/designer/designer/variabledialogimpl.h
@@ -0,0 +1,63 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef VARIABLEDIALOGIMPL_H
+#define VARIABLEDIALOGIMPL_H
+
+#include "variabledialog.h"
+
+class FormWindow;
+class QListView;
+
+class VariableDialog : public VariableDialogBase
+{
+ Q_OBJECT
+public:
+ VariableDialog( FormWindow *fw, QWidget* parent = 0 );
+ ~VariableDialog();
+
+ void setCurrentItem( QString text );
+
+protected slots:
+ void okClicked();
+ void addVariable();
+ void deleteVariable();
+ void nameChanged();
+ void accessChanged();
+ void currentItemChanged( QListViewItem *i );
+
+private:
+ FormWindow *formWindow;
+};
+
+#endif
diff --git a/tools/designer/designer/widgetaction.cpp b/tools/designer/designer/widgetaction.cpp
new file mode 100644
index 0000000..3b59fec
--- /dev/null
+++ b/tools/designer/designer/widgetaction.cpp
@@ -0,0 +1,65 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "widgetaction.h"
+#include <qwidget.h>
+#include <qtoolbutton.h>
+#include "mainwindow.h"
+#include <qstylefactory.h>
+#include <qstyle.h>
+
+static QStyle *windowsStyle = 0;
+
+void WidgetAction::addedTo( QWidget *w, QWidget *container )
+{
+ if ( ::qt_cast<QToolButton*>(w) && ::qt_cast<QScrollView*>(container->parent()->parent()) ) {
+ if ( !windowsStyle )
+ windowsStyle = QStyleFactory::create( "windows" );
+ w->setStyle( windowsStyle );
+ ( (QToolButton*)w )->setUsesTextLabel( TRUE );
+ ( (QToolButton*)w )->setTextPosition( QToolButton::Right );
+ w->setBackgroundMode( container->backgroundMode() );
+ }
+}
+
+WidgetAction::~WidgetAction()
+{
+ if ( MainWindow::self )
+ MainWindow::self->toolActions.removeRef( this );
+}
+
+void WidgetAction::init( const QString &g )
+{
+ MainWindow::self->toolActions.append( this );
+ grp = g;
+}
diff --git a/tools/designer/designer/widgetaction.h b/tools/designer/designer/widgetaction.h
new file mode 100644
index 0000000..4eacca8
--- /dev/null
+++ b/tools/designer/designer/widgetaction.h
@@ -0,0 +1,72 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef WIDGETACTION_H
+#define WIDGETACTION_H
+
+#include <qaction.h>
+
+class WidgetAction : public QAction
+{
+ Q_OBJECT
+
+public:
+ WidgetAction( const QString &grp, QObject* parent,
+ const char* name = 0, bool toggle = FALSE )
+ : QAction( parent, name, toggle ) { init( grp ); }
+ WidgetAction( const QString &grp, const QString& text,
+ const QIconSet& icon, const QString& menuText, QKeySequence accel,
+ QObject* parent, const char* name = 0, bool toggle = FALSE )
+ : QAction( text, icon, menuText, accel, parent, name, toggle ) { init( grp ); }
+ WidgetAction( const QString &grp, const QString& text,
+ const QString& menuText, QKeySequence accel, QObject* parent,
+ const char* name = 0, bool toggle = FALSE )
+ : QAction( text, menuText, accel, parent, name, toggle ) { init( grp ); }
+ ~WidgetAction();
+
+#if !defined(Q_NO_USING_KEYWORD)
+ using QAction::addedTo;
+#endif
+ void addedTo( QWidget *, QWidget * );
+
+ QString group() const { return grp; }
+
+private:
+ void init( const QString &g );
+
+private:
+ QString grp;
+
+};
+
+#endif
diff --git a/tools/designer/designer/widgetfactory.cpp b/tools/designer/designer/widgetfactory.cpp
new file mode 100644
index 0000000..e168b4f
--- /dev/null
+++ b/tools/designer/designer/widgetfactory.cpp
@@ -0,0 +1,1821 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qvariant.h> // HP-UX compiler need this here
+#include "widgetfactory.h"
+#include <widgetdatabase.h>
+#include "metadatabase.h"
+#include "mainwindow.h"
+#include "formwindow.h"
+#include "propertyeditor.h"
+#include "layout.h"
+#include "listboxeditorimpl.h"
+#include "listvieweditorimpl.h"
+#include "iconvieweditorimpl.h"
+#include "formwindow.h"
+#include "multilineeditorimpl.h"
+#include "../interfaces/widgetinterface.h"
+#ifndef QT_NO_TABLE
+#include "tableeditorimpl.h"
+#endif
+#include "project.h"
+#include "menubareditor.h"
+#include "popupmenueditor.h"
+
+#include <qfeatures.h>
+
+#include <qpixmap.h>
+#include <qgroupbox.h>
+#include <qiconview.h>
+#ifndef QT_NO_TABLE
+#include <qtable.h>
+#endif
+#ifndef QT_NO_SQL
+#include <qdatatable.h>
+#endif
+#include <qdatetimeedit.h>
+#include <qlineedit.h>
+#include <qspinbox.h>
+#include <qmultilineedit.h>
+#include <qtextedit.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwidgetstack.h>
+#include <qcombobox.h>
+#include <qtabbar.h>
+#include <qlistbox.h>
+#include <qlistview.h>
+#include <qobjectlist.h>
+#include <qlcdnumber.h>
+#include <qslider.h>
+#include <qdial.h>
+#include <qprogressbar.h>
+#include <qtextview.h>
+#include <qtextbrowser.h>
+#include <qframe.h>
+#include <qmetaobject.h>
+#include <qwidgetstack.h>
+#include <qwizard.h>
+#include <qvaluelist.h>
+#include <qtimer.h>
+#include <qscrollbar.h>
+#include <qmainwindow.h>
+#include <qmenubar.h>
+#include <qapplication.h>
+#include <qsplitter.h>
+#include <qtoolbox.h>
+#include <qsizegrip.h>
+#ifndef QT_NO_SQL
+#include "database.h"
+#endif
+
+#define NO_STATIC_COLORS
+#include <globaldefs.h>
+#include <qobject.h>
+
+FormWindow *find_formwindow( QWidget *w )
+{
+ if ( !w )
+ return 0;
+ for (;;) {
+ if ( ::qt_cast<FormWindow*>(w) )
+ return (FormWindow*)w;
+ if ( !w->parentWidget() )
+ return 0;
+ w = w->parentWidget();
+ }
+}
+
+void QLayoutWidget::paintEvent( QPaintEvent* )
+{
+ QPainter p ( this );
+ p.setPen( red );
+ p.drawRect( rect() );
+}
+
+
+QDesignerTabWidget::QDesignerTabWidget( QWidget *parent, const char *name )
+ : QTabWidget( parent, name ), dropIndicator( 0 ), dragPage( 0 ), mousePressed( FALSE )
+{
+ tabBar()->setAcceptDrops( TRUE );
+ tabBar()->installEventFilter( this );
+}
+
+int QDesignerTabWidget::currentPage() const
+{
+ return tabBar()->currentTab();
+}
+
+void QDesignerTabWidget::setCurrentPage( int i )
+{
+ tabBar()->setCurrentTab( i );
+}
+
+QString QDesignerTabWidget::pageTitle() const
+{
+ return ((QTabWidget*)this)->tabLabel( QTabWidget::currentPage() );
+}
+
+void QDesignerTabWidget::setPageTitle( const QString& title )
+{
+ changeTab( QTabWidget::currentPage(), title );
+}
+
+void QDesignerTabWidget::setPageName( const QCString& name )
+{
+ if ( QTabWidget::currentPage() )
+ QTabWidget::currentPage()->setName( name );
+}
+
+QCString QDesignerTabWidget::pageName() const
+{
+ if ( !QTabWidget::currentPage() )
+ return 0;
+ return QTabWidget::currentPage()->name();
+}
+
+int QDesignerTabWidget::count() const
+{
+ return tabBar()->count();
+}
+
+bool QDesignerTabWidget::eventFilter( QObject *o, QEvent *e )
+{
+ if ( o != tabBar() ) return FALSE;
+
+ switch ( e->type() ) {
+ case QEvent::MouseButtonPress: {
+ mousePressed = TRUE;
+ QMouseEvent *me = (QMouseEvent*)e;
+ pressPoint = me->pos();
+ }
+ break;
+ case QEvent::MouseMove: {
+ QMouseEvent *me = (QMouseEvent*)e;
+ if ( mousePressed && ( pressPoint - me->pos()).manhattanLength() > QApplication::startDragDistance() ) {
+ QTextDrag *drg = new QTextDrag( QString::number( (long) this ) , this );
+ mousePressed = FALSE;
+ dragPage = QTabWidget::currentPage();
+ dragLabel = QTabWidget::tabLabel( dragPage );
+
+ int index = indexOf( dragPage );
+
+ removePage( dragPage );
+ if ( !drg->dragMove() ) {
+ insertTab( dragPage, dragLabel, index );
+ showPage( dragPage );
+ }
+ if ( dropIndicator )
+ dropIndicator->hide();
+ }
+ }
+ break;
+ case QEvent::DragLeave: {
+ if ( dropIndicator )
+ dropIndicator->hide();
+ }
+ break;
+ case QEvent::DragMove: {
+ QDragEnterEvent *de = (QDragEnterEvent*) e;
+ if ( QTextDrag::canDecode( de ) ) {
+ QString text;
+ QTextDrag::decode( de, text );
+ if ( text == QString::number( (long)this ) )
+ de->accept();
+ else
+ return FALSE;
+ }
+
+ int index = 0;
+ QRect rect;
+ for ( ; index < tabBar()->count(); index++ ) {
+ if ( tabBar()->tabAt( index )->rect().contains( de->pos() ) ) {
+ rect = tabBar()->tabAt( index )->rect();
+ break;
+ }
+ }
+
+ if ( index == tabBar()->count() -1 ) {
+ QRect rect2 = rect;
+ rect2.setLeft( rect2.left() + rect2.width() / 2 );
+ if ( rect2.contains( de->pos() ) )
+ index++;
+ }
+
+ if ( ! dropIndicator ) {
+ dropIndicator = new QWidget( this );
+ dropIndicator->setBackgroundColor( red );
+ }
+
+ QPoint pos;
+ if ( index == tabBar()->count() )
+ pos = tabBar()->mapToParent( QPoint( rect.x() + rect.width(), rect.y() ) );
+ else
+ pos = tabBar()->mapToParent( QPoint( rect.x(), rect.y() ) );
+
+ dropIndicator->setGeometry( pos.x(), pos.y() , 3, rect.height() );
+ dropIndicator->show();
+ }
+ break;
+ case QEvent::Drop: {
+ QDragEnterEvent *de = (QDragEnterEvent*) e;
+ if ( QTextDrag::canDecode( de ) ) {
+ QString text;
+ QTextDrag::decode( de, text );
+ if ( text == QString::number( (long)this ) ) {
+
+ int newIndex = 0;
+ for ( ; newIndex < tabBar()->count(); newIndex++ ) {
+ if ( tabBar()->tabAt( newIndex )->rect().contains( de->pos() ) )
+ break;
+ }
+
+ if ( newIndex == tabBar()->count() -1 ) {
+ QRect rect2 = tabBar()->tabAt( newIndex )->rect();
+ rect2.setLeft( rect2.left() + rect2.width() / 2 );
+ if ( rect2.contains( de->pos() ) )
+ newIndex++;
+ }
+
+ int oldIndex = 0;
+ for ( ; oldIndex < tabBar()->count(); oldIndex++ ) {
+ if ( tabBar()->tabAt( oldIndex )->rect().contains( pressPoint ) )
+ break;
+ }
+
+ FormWindow *fw = find_formwindow( this );
+ MoveTabPageCommand *cmd =
+ new MoveTabPageCommand( tr( "Move Tab Page" ), fw, this,
+ dragPage, dragLabel, newIndex, oldIndex );
+ fw->commandHistory()->addCommand( cmd );
+ cmd->execute();
+ de->accept();
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+
+QDesignerWidgetStack::QDesignerWidgetStack( QWidget *parent, const char *name )
+ : QWidgetStack( parent, name )
+{
+ prev = new QToolButton( Qt::LeftArrow, this, "designer_wizardstack_button" );
+ prev->setAutoRaise( TRUE );
+ prev->setAutoRepeat( TRUE );
+ prev->setSizePolicy( QSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+ next = new QToolButton( Qt::RightArrow, this, "designer_wizardstack_button" );
+ next->setAutoRaise( TRUE );
+ next->setAutoRepeat( TRUE );
+ next->setSizePolicy( QSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+ connect( prev, SIGNAL( clicked() ), this, SLOT( prevPage() ) );
+ connect( next, SIGNAL( clicked() ), this, SLOT( nextPage() ) );
+ updateButtons();
+}
+
+void QDesignerWidgetStack::updateButtons()
+{
+ prev->setGeometry( width() - 31, 1, 15, 15 );
+ next->setGeometry( width() - 16, 1, 15, 15 );
+ prev->show();
+ next->show();
+ prev->raise();
+ next->raise();
+}
+
+void QDesignerWidgetStack::prevPage()
+{
+ setCurrentPage( currentPage() - 1 );
+}
+
+void QDesignerWidgetStack::nextPage()
+{
+ setCurrentPage( currentPage() + 1 );
+}
+
+int QDesignerWidgetStack::currentPage() const
+{
+ QDesignerWidgetStack* that = (QDesignerWidgetStack*) this;
+ return that->pages.find( visibleWidget() );
+}
+
+void QDesignerWidgetStack::setCurrentPage( int i )
+{
+ // help next/prev page commands
+ if ( i < 0 )
+ i += count();
+ if ( i >= count() )
+ i -= count();
+
+ if ( i < 0 || i >= count() )
+ return;
+ raiseWidget( pages.at( i ) );
+ updateButtons();
+}
+
+QCString QDesignerWidgetStack::pageName() const
+{
+ if ( !visibleWidget() )
+ return 0;
+ return visibleWidget()->name();
+}
+
+void QDesignerWidgetStack::setPageName( const QCString& name )
+{
+ if ( visibleWidget() )
+ visibleWidget()->setName( name );
+}
+
+int QDesignerWidgetStack::count() const
+{
+ return pages.count();
+}
+
+QWidget* QDesignerWidgetStack::page( int i ) const
+{
+ if ( i < 0 || i >= count() )
+ return 0;
+ QDesignerWidgetStack* that = (QDesignerWidgetStack*) this;
+ return that->pages.at( i );
+}
+
+
+int QDesignerWidgetStack::insertPage( QWidget *p, int i )
+{
+ if ( i < 0 )
+ pages.append( p );
+ else
+ pages.insert( (uint) i, p );
+ addWidget( p );
+ p->show();
+ raiseWidget( p );
+ QApplication::sendPostedEvents();
+ updateButtons();
+ return pages.find( p );
+}
+
+int QDesignerWidgetStack::removePage( QWidget *p )
+{
+ int i = pages.find( p );
+ pages.remove( p );
+ removeWidget( p );
+ setCurrentPage( 0 );
+ updateButtons();
+ return i;
+}
+
+
+int QDesignerWizard::currentPageNum() const
+{
+ for ( int i = 0; i < pageCount(); ++i ) {
+ if ( page( i ) == currentPage() )
+ return i;
+ }
+ return 0;
+}
+
+
+
+
+
+void QDesignerWizard::setCurrentPage( int i )
+{
+ if ( i < currentPageNum() ) {
+ while ( i < currentPageNum() ) {
+ if ( currentPageNum() == 0 )
+ break;
+ back();
+ }
+
+ } else {
+ while ( i > currentPageNum() ) {
+ if ( currentPageNum() == pageCount() - 1 )
+ break;
+ next();
+ }
+ }
+}
+
+QString QDesignerWizard::pageTitle() const
+{
+ return title( currentPage() );
+}
+
+void QDesignerWizard::setPageTitle( const QString& title )
+{
+ setTitle( currentPage(), title );
+}
+
+void QDesignerWizard::setPageName( const QCString& name )
+{
+ if ( QWizard::currentPage() )
+ QWizard::currentPage()->setName( name );
+}
+
+QCString QDesignerWizard::pageName() const
+{
+ if ( !QWizard::currentPage() )
+ return 0;
+ return QWizard::currentPage()->name();
+}
+
+int QDesignerWizard::pageNum( QWidget *p )
+{
+ for ( int i = 0; i < pageCount(); ++i ) {
+ if ( page( i ) == p )
+ return i;
+ }
+ return -1;
+}
+
+void QDesignerWizard::addPage( QWidget *p, const QString &t )
+{
+ QWizard::addPage( p, t );
+ if ( removedPages.find( p ) )
+ removedPages.remove( p );
+}
+
+void QDesignerWizard::removePage( QWidget *p )
+{
+ QWizard::removePage( p );
+ removedPages.insert( p, p );
+}
+
+void QDesignerWizard::insertPage( QWidget *p, const QString &t, int index )
+{
+ QWizard::insertPage( p, t, index );
+ if ( removedPages.find( p ) )
+ removedPages.remove( p );
+}
+
+QMap< int, QMap< QString, QVariant> > *defaultProperties = 0;
+QMap< int, QStringList > *changedProperties = 0;
+
+/*!
+ \class WidgetFactory widgetfactory.h
+ \brief Set of static functions for creating widgets, layouts and do other stuff
+
+ The widget factory offers functions to create widgets, create and
+ delete layouts find out other details - all based on the
+ WidgetDatabase's data. So the functions that use ids use the same
+ ids as in the WidgetDatabase.
+*/
+
+
+void WidgetFactory::saveDefaultProperties( QObject *w, int id )
+{
+ QMap< QString, QVariant> propMap;
+ QStrList lst = w->metaObject()->propertyNames( TRUE );
+ for ( uint i = 0; i < lst.count(); ++i ) {
+ QVariant var = w->property( lst.at( i ) );
+ if ( !var.isValid() && qstrcmp( "pixmap", lst.at( i ) ) == 0 )
+ var = QVariant( QPixmap() );
+ else if ( !var.isValid() && qstrcmp( "iconSet", lst.at( i ) ) == 0 )
+ var = QVariant( QIconSet() );
+ propMap.replace( lst.at( i ), var );
+ }
+ defaultProperties->replace( id, propMap );
+}
+
+void WidgetFactory::saveChangedProperties( QObject *w, int id )
+{
+ QStringList l = MetaDataBase::changedProperties( w );
+ changedProperties->insert( id, l );
+}
+
+/*! Creates a widget of the type which is registered as \a id as
+ child of \a parent. The \a name is optional. If \a init is TRUE, the
+ widget is initialized with some defaults, else the plain widget is
+ created.
+*/
+
+QWidget *WidgetFactory::create( int id, QWidget *parent, const char *name, bool init, const QRect *r, Qt::Orientation orient )
+{
+ QString n = WidgetDatabase::className( id );
+ if ( n.isEmpty() )
+ return 0;
+
+ if ( !defaultProperties ) {
+ defaultProperties = new QMap< int, QMap< QString, QVariant> >();
+ changedProperties = new QMap< int, QStringList >();
+ }
+
+ QWidget *w = 0;
+ QString str = WidgetDatabase::createWidgetName( id );
+ const char *s = str.latin1();
+ w = createWidget( n, parent, name ? name : s, init, r, orient );
+ if ( ::qt_cast<QScrollView*>(w) )
+ ( (QScrollView*)w )->disableSizeHintCaching();
+ if ( !w && WidgetDatabase::isCustomWidget( id ) )
+ w = createCustomWidget( parent, name ? name : s, MetaDataBase::customWidget( id ) );
+ if ( !w )
+ return 0;
+ MetaDataBase::addEntry( w );
+
+ if ( !defaultProperties->contains( id ) )
+ saveDefaultProperties( w, id );
+ if ( !changedProperties->contains( id ) )
+ saveChangedProperties( w, id );
+
+ return w;
+}
+
+/*! Creates a layout on the widget \a widget of the type \a type
+ which can be \c HBox, \c VBox or \c Grid.
+*/
+
+QLayout *WidgetFactory::createLayout( QWidget *widget, QLayout *layout, LayoutType type )
+{
+ int spacing = MainWindow::self->currentLayoutDefaultSpacing();
+ int margin = 0;
+
+ int metaspacing = MetaDataBase::spacing( widget );
+ int metamargin = MetaDataBase::margin( widget );
+
+ if ( ::qt_cast<QLayoutWidget*>(widget) &&
+ ( WidgetDatabase::isContainer( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( widget ) ) ) ||
+ widget && ::qt_cast<FormWindow*>(widget->parentWidget()) ) )
+ margin = MainWindow::self->currentLayoutDefaultMargin();
+
+ if ( !layout && ::qt_cast<QTabWidget*>(widget) )
+ widget = ((QTabWidget*)widget)->currentPage();
+
+ if ( !layout && ::qt_cast<QWizard*>(widget) )
+ widget = ((QWizard*)widget)->currentPage();
+
+ if ( !layout && ::qt_cast<QMainWindow*>(widget) )
+ widget = ((QMainWindow*)widget)->centralWidget();
+
+ if ( !layout && ::qt_cast<QWidgetStack*>(widget) )
+ widget = ((QWidgetStack*)widget)->visibleWidget();
+
+ if ( !layout && ::qt_cast<QToolBox*>(widget) )
+ widget = ((QToolBox*)widget)->currentItem();
+
+ MetaDataBase::addEntry( widget );
+
+ QLayout *l = 0;
+ int align = 0;
+ if ( !layout && ::qt_cast<QGroupBox*>(widget) ) {
+ QGroupBox *gb = (QGroupBox*)widget;
+ gb->setColumnLayout( 0, Qt::Vertical );
+ layout = gb->layout();
+ layout->setMargin( 0 );
+ layout->setSpacing( 0 );
+ switch ( type ) {
+ case HBox:
+ l = new QHBoxLayout( layout );
+ break;
+ case VBox:
+ l = new QVBoxLayout( layout );
+ break;
+ case Grid:
+ l = new QDesignerGridLayout( layout );
+ break;
+ default:
+ return 0;
+ }
+ align = Qt::AlignTop;
+ MetaDataBase::setMargin( gb, metamargin );
+ MetaDataBase::setSpacing( gb, metaspacing );
+ } else {
+ if ( layout ) {
+ switch ( type ) {
+ case HBox:
+ l = new QHBoxLayout( layout );
+ break;
+ case VBox:
+ l = new QVBoxLayout( layout );
+ break;
+ case Grid:
+ l = new QDesignerGridLayout( layout );
+ break;
+ default:
+ return 0;
+ }
+ MetaDataBase::addEntry( l );
+ l->setSpacing( spacing );
+ l->setMargin( margin );
+ } else {
+ switch ( type ) {
+ case HBox:
+ l = new QHBoxLayout( widget );
+ break;
+ case VBox:
+ l = new QVBoxLayout( widget );
+ break;
+ case Grid:
+ l = new QDesignerGridLayout( widget );
+ break;
+ default:
+ return 0;
+ }
+ MetaDataBase::addEntry( l );
+ if ( widget ) {
+ MetaDataBase::setMargin( widget, metamargin );
+ MetaDataBase::setSpacing( widget, metaspacing );
+ } else {
+ l->setMargin( margin );
+ l->setSpacing( spacing );
+ }
+ }
+ }
+ l->setAlignment( align );
+ MetaDataBase::addEntry( l );
+ return l;
+}
+
+void WidgetFactory::deleteLayout( QWidget *widget )
+{
+ if ( !widget )
+ return;
+
+ if ( ::qt_cast<QTabWidget*>(widget) )
+ widget = ((QTabWidget*)widget)->currentPage();
+ if ( ::qt_cast<QWizard*>(widget) )
+ widget = ((QWizard*)widget)->currentPage();
+ if ( ::qt_cast<QMainWindow*>(widget) )
+ widget = ((QMainWindow*)widget)->centralWidget();
+ if ( ::qt_cast<QWidgetStack*>(widget) )
+ widget = ((QWidgetStack*)widget)->visibleWidget();
+ if ( ::qt_cast<QToolBox*>(widget) )
+ widget = ((QToolBox*)widget)->currentItem();
+ delete widget->layout();
+}
+
+/*! Factory functions for creating a widget of the type \a className
+ as child of \a parent with the name \a name.
+
+ If \a init is TRUE, some initial default properties are set. This
+ has to be in sync with the initChangedProperties() function!
+*/
+
+QWidget *WidgetFactory::createWidget( const QString &className, QWidget *parent, const char *name, bool init,
+ const QRect *r, Qt::Orientation orient )
+{
+ if ( className == "QPushButton" ) {
+ QPushButton *b = 0;
+ if ( init ) {
+ b = new QDesignerPushButton( parent, name );
+ b->setText( QString::fromLatin1( name ) );
+ } else {
+ b = new QDesignerPushButton( parent, name );
+ }
+ QWidget *w = find_formwindow( b );
+ b->setAutoDefault( w && ::qt_cast<QDialog*>(((FormWindow*)w)->mainContainer()) );
+ return b;
+ } else if ( className == "QToolButton" ) {
+ if ( init ) {
+ QDesignerToolButton *tb = new QDesignerToolButton( parent, name );
+ if ( ::qt_cast<QToolBox*>(widgetOfContainer(parent))) {
+ tb->setUsesTextLabel(TRUE);
+ tb->setTextLabel("...");
+ tb->setAutoRaise(TRUE);
+ tb->setTextPosition(QToolButton::BesideIcon);
+ } else {
+ tb->setText( "..." );
+ }
+ return tb;
+ }
+ return new QDesignerToolButton( parent, name );
+ } else if ( className == "QCheckBox" ) {
+ if ( init ) {
+ QDesignerCheckBox *cb = new QDesignerCheckBox( parent, name );
+ cb->setText( QString::fromLatin1( name ) );
+ return cb;
+ }
+ return new QDesignerCheckBox( parent, name );
+ } else if ( className == "QRadioButton" ) {
+ if ( init ) {
+ QDesignerRadioButton *rb = new QDesignerRadioButton( parent, name );
+ rb->setText( QString::fromLatin1( name ) );
+ return rb;
+ }
+ return new QDesignerRadioButton( parent, name );
+ } else if ( className == "QGroupBox" ) {
+ if ( init )
+ return new QGroupBox( QString::fromLatin1( name ), parent, name );
+ return new QGroupBox( parent, name );
+ } else if ( className == "QButtonGroup" ) {
+ if ( init )
+ return new QButtonGroup( QString::fromLatin1( name ), parent, name );
+ return new QButtonGroup( parent, name );
+ } else if ( className == "QIconView" ) {
+#if !defined(QT_NO_ICONVIEW)
+ QIconView* iv = new QIconView( parent, name );
+ if ( init )
+ (void) new QIconViewItem( iv, MainWindow::tr( "New Item" ) );
+ return iv;
+#else
+ return 0;
+#endif
+ } else if ( className == "QTable" ) {
+#if !defined(QT_NO_TABLE)
+ if ( init )
+ return new QTable( 3, 3, parent, name );
+ return new QTable( parent, name );
+#else
+ return 0;
+#endif
+#ifndef QT_NO_SQL
+ } else if ( className == "QDataTable" ) {
+ return new QDataTable( parent, name );
+#endif //QT_NO_SQL
+ } else if ( className == "QDateEdit" ) {
+ return new QDateEdit( parent, name );
+ } else if ( className == "QTimeEdit" ) {
+ return new QTimeEdit( parent, name );
+ } else if ( className == "QDateTimeEdit" ) {
+ return new QDateTimeEdit( parent, name );
+ }
+ else if ( className == "QListBox" ) {
+ QListBox* lb = new QListBox( parent, name );
+ if ( init ) {
+ lb->insertItem( MainWindow::tr( "New Item" ) );
+ lb->setCurrentItem( 0 );
+ }
+ return lb;
+ } else if ( className == "QListView" ) {
+ QListView *lv = new QListView( parent, name );
+ lv->setSorting( -1 );
+ if ( init ) {
+ lv->addColumn( MainWindow::tr( "Column 1" ) );
+ lv->setCurrentItem( new QListViewItem( lv, MainWindow::tr( "New Item" ) ) );
+ }
+ return lv;
+ } else if ( className == "QLineEdit" )
+ return new QLineEdit( parent, name );
+ else if ( className == "QSpinBox" )
+ return new QSpinBox( parent, name );
+ else if ( className == "QSplitter" )
+ return new QSplitter( parent, name );
+ else if ( className == "QMultiLineEdit" )
+ return new QMultiLineEdit( parent, name );
+ else if ( className == "QTextEdit" )
+ return new QTextEdit( parent, name );
+ else if ( className == "QLabel" || className == "TextLabel" ) {
+ QDesignerLabel *l = new QDesignerLabel( parent, name );
+ if ( init ) {
+ l->setText( QString::fromLatin1( name ) );
+ MetaDataBase::addEntry( l );
+ MetaDataBase::setPropertyChanged( l, "text", TRUE );
+ }
+ return l;
+ } else if ( className == "PixmapLabel" ) {
+ QDesignerLabel *l = new QDesignerLabel( parent, name );
+ if ( init ) {
+ l->setPixmap( QPixmap::fromMimeSource( "designer_qtlogo.png" ) );
+ l->setScaledContents( TRUE );
+ MetaDataBase::addEntry( l );
+ MetaDataBase::setPropertyChanged( l, "pixmap", TRUE );
+ MetaDataBase::setPropertyChanged( l, "scaledContents", TRUE );
+ }
+ return l;
+ } else if ( className == "QLayoutWidget" )
+ return new QLayoutWidget( parent, name );
+ else if ( className == "QTabWidget" ) {
+ QTabWidget *tw = new QDesignerTabWidget( parent, name );
+ if ( init ) {
+ FormWindow *fw = find_formwindow( parent );
+ QWidget *w = fw ? new QDesignerWidget( fw, tw, "tab" ) : new QWidget( tw, "tab" );
+ tw->addTab( w, MainWindow::tr("Tab 1") );
+ MetaDataBase::addEntry( w );
+ w = fw ? new QDesignerWidget( fw, tw, "tab" ) : new QWidget( tw, "tab" );
+ tw->addTab( w, MainWindow::tr("Tab 2") );
+ MetaDataBase::addEntry( tw );
+ MetaDataBase::addEntry( w );
+ }
+ return tw;
+ } else if ( className == "QWidgetStack" ) {
+ QDesignerWidgetStack *ws = new QDesignerWidgetStack( parent, name );
+ if ( init ) {
+ FormWindow *fw = find_formwindow( parent );
+ QWidget *w = fw ? new QDesignerWidget( fw, ws, "WStackPage" ) : new QWidget( ws, "WStackPage" );
+ ws->insertPage( w );
+ MetaDataBase::addEntry( w );
+ MetaDataBase::addEntry( ws );
+ }
+ return ws;
+ } else if ( className == "QComboBox" ) {
+ return new QComboBox( FALSE, parent, name );
+ } else if ( className == "QWidget" ) {
+ if ( parent &&
+ ( ::qt_cast<FormWindow*>(parent) ||
+ ::qt_cast<QWizard*>(parent) ||
+ ::qt_cast<QTabWidget*>(parent) ||
+ ::qt_cast<QWidgetStack*>(parent) ||
+ ::qt_cast<QToolBox*>(parent) ||
+ ::qt_cast<QMainWindow*>(parent) ) ) {
+ FormWindow *fw = find_formwindow( parent );
+ if ( fw ) {
+ QDesignerWidget *dw = new QDesignerWidget( fw, parent, name );
+ MetaDataBase::addEntry( dw );
+ return dw;
+ }
+ }
+ return new QWidget( parent, name );
+ } else if ( className == "QDialog" ) {
+ QDialog *dia = 0;
+ if ( ::qt_cast<FormWindow*>(parent) )
+ dia = new QDesignerDialog( (FormWindow*)parent, parent, name );
+ else
+ dia = new QDialog( parent, name );
+#if defined(QT_NON_COMMERCIAL)
+ if ( ::qt_cast<MainWindow*>(parent) )
+#else
+ if ( parent )
+#endif
+ dia->reparent( parent, QPoint( 0, 0 ), TRUE );
+ return dia;
+ } else if ( className == "QWizard" ) {
+ QWizard *wiz = new QDesignerWizard( parent, name );
+#if defined(QT_NON_COMMERCIAL)
+ if ( ::qt_cast<MainWindow*>(parent) )
+#else
+ if ( parent )
+#endif
+ wiz->reparent( parent, QPoint( 0, 0 ), TRUE );
+ if ( init && ::qt_cast<FormWindow*>(parent) ) {
+ QDesignerWidget *dw = new QDesignerWidget( (FormWindow*)parent, wiz, "WizardPage" );
+ MetaDataBase::addEntry( dw );
+ wiz->addPage( dw, FormWindow::tr( "Page" ) );
+ QTimer::singleShot( 0, wiz, SLOT( next() ) );
+ }
+ return wiz;
+ } else if ( className == "Spacer" ) {
+ Spacer *s = new Spacer( parent, name );
+ MetaDataBase::addEntry( s );
+ MetaDataBase::setPropertyChanged( s, "orientation", TRUE );
+ MetaDataBase::setPropertyChanged( s, "sizeType", TRUE );
+ if ( !r )
+ return s;
+ if ( !r->isValid() || r->width() < 2 && r->height() < 2 )
+ s->setOrientation( orient );
+ else if ( r->width() < r->height() )
+ s->setOrientation( Qt::Vertical );
+ else
+ s->setOrientation( Qt::Horizontal );
+ return s;
+ } else if ( className == "QLCDNumber" )
+ return new QLCDNumber( parent, name );
+ else if ( className == "QProgressBar" )
+ return new QProgressBar( parent, name );
+ else if ( className == "QTextView" )
+ return new QTextView( parent, name );
+ else if ( className == "QTextBrowser" )
+ return new QTextBrowser( parent, name );
+ else if ( className == "QDial" )
+ return new QDial( parent, name );
+ else if ( className == "QSlider" ) {
+ QSlider *s = new QSlider( parent, name );
+ if ( !r )
+ return s;
+ if ( !r->isValid() || r->width() < 2 && r->height() < 2 )
+ s->setOrientation( orient );
+ else if ( r->width() > r->height() )
+ s->setOrientation( Qt::Horizontal );
+ MetaDataBase::addEntry( s );
+ MetaDataBase::setPropertyChanged( s, "orientation", TRUE );
+ return s;
+ } else if ( className == "QScrollBar" ) {
+ QScrollBar *s = new QScrollBar( parent, name );
+ if ( !r )
+ return s;
+ if ( !r->isValid() || r->width() < 2 && r->height() < 2 )
+ s->setOrientation( orient );
+ else if ( r->width() > r->height() )
+ s->setOrientation( Qt::Horizontal );
+ MetaDataBase::addEntry( s );
+ MetaDataBase::setPropertyChanged( s, "orientation", TRUE );
+ return s;
+ } else if ( className == "QFrame" ) {
+ if ( !init )
+ return new QFrame( parent, name );
+ QFrame *f = new QFrame( parent, name );
+ f->setFrameStyle( QFrame::StyledPanel | QFrame::Raised );
+ return f;
+ } else if ( className == "Line" ) {
+ Line *l = new Line( parent, name );
+ MetaDataBase::addEntry( l );
+ MetaDataBase::setPropertyChanged( l, "orientation", TRUE );
+ MetaDataBase::setPropertyChanged( l, "frameShadow", TRUE );
+ MetaDataBase::setPropertyChanged( l, "frameShape", TRUE );
+ if ( !r )
+ return l;
+ if ( !r->isValid() || r->width() < 2 && r->height() < 2 )
+ l->setOrientation( orient );
+ else if ( r->width() < r->height() )
+ l->setOrientation( Qt::Vertical );
+ return l;
+ } else if ( className == "QMainWindow" ) {
+ QMainWindow *mw = new QMainWindow( parent, name, 0 );
+ mw->setDockEnabled( Qt::DockMinimized, FALSE );
+ QDesignerWidget *dw = new QDesignerWidget( (FormWindow*)parent, mw, "central widget" );
+ mw->setDockMenuEnabled( FALSE );
+ MetaDataBase::addEntry( dw );
+ mw->setCentralWidget( dw );
+ (void)mw->statusBar();
+ dw->show();
+ return mw;
+ } else if ( className == "QToolBox" ) {
+ if ( !init )
+ return new QDesignerToolBox( parent, name );
+ QToolBox *tb = new QDesignerToolBox( parent, name );
+ FormWindow *fw = find_formwindow( parent );
+ QWidget *w = fw ? new QDesignerWidget( fw, tb, "page1" ) :
+ new QWidget( tb, "page1" );
+ tb->addItem( w, MainWindow::tr("Page 1") );
+ MetaDataBase::addEntry( w );
+ w = fw ? new QDesignerWidget( fw, tb, "page2" ) : new QWidget( tb, "page2" );
+ tb->addItem( w, MainWindow::tr("Page 2") );
+ MetaDataBase::addEntry( tb );
+ MetaDataBase::addEntry( w );
+ return tb;
+ }
+#ifndef QT_NO_SQL
+ else if ( className == "QDataBrowser" ) {
+ QWidget *w = new QDesignerDataBrowser( parent, name );
+ if ( parent )
+ w->reparent( parent, QPoint( 0, 0 ), TRUE );
+ return w;
+ } else if ( className == "QDataView" ) {
+ QWidget *w = new QDesignerDataView( parent, name );
+ if ( parent )
+ w->reparent( parent, QPoint( 0, 0 ), TRUE );
+ return w;
+ }
+#endif
+
+ WidgetInterface *iface = 0;
+ widgetManager()->queryInterface( className, &iface );
+ if ( !iface )
+ return 0;
+
+ QWidget *w = iface->create( className, parent, name );
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ if ( init && WidgetDatabase::isCustomPluginWidget( WidgetDatabase::idFromClassName( className ) ) ) {
+ QWidgetContainerInterfacePrivate *iface2 = 0;
+ iface->queryInterface( IID_QWidgetContainer, (QUnknownInterface**)&iface2 );
+ if ( iface2 ) {
+ iface2->addPage( className, w, "Page", -1 );
+ iface2->release();
+ }
+ }
+#endif // QT_CONTAINER_CUSTOM_WIDGETS
+ iface->release();
+ return w;
+}
+
+
+
+/*! Find out which type the layout of the widget is. Returns \c HBox,
+ \c VBox, \c Grid or \c NoLayout. \a layout points to this
+ QWidget::layout() of \a w or to 0 after the function call.
+*/
+
+WidgetFactory::LayoutType WidgetFactory::layoutType( QWidget *w, QLayout *&layout )
+{
+ layout = 0;
+
+ if ( ::qt_cast<QTabWidget*>(w) )
+ w = ((QTabWidget*)w)->currentPage();
+ if ( ::qt_cast<QWizard*>(w) )
+ w = ((QWizard*)w)->currentPage();
+ if ( ::qt_cast<QMainWindow*>(w) )
+ w = ((QMainWindow*)w)->centralWidget();
+ if ( ::qt_cast<QWidgetStack*>(w) )
+ w = ((QWidgetStack*)w)->visibleWidget();
+ if ( ::qt_cast<QToolBox*>(w) )
+ w = ((QToolBox*)w)->currentItem();
+
+ if ( ::qt_cast<QSplitter*>(w) )
+ return ( (QSplitter*)w )->orientation() == Horizontal ? HBox : VBox;
+
+ if ( !w || !w->layout() )
+ return NoLayout;
+ QLayout *lay = w->layout();
+
+ if ( ::qt_cast<QGroupBox*>(w) ) {
+ QObjectList *l = lay->queryList( "QLayout" );
+ if ( l && l->first() )
+ lay = (QLayout*)l->first();
+ delete l;
+ }
+ layout = lay;
+
+ if ( ::qt_cast<QHBoxLayout*>(lay) )
+ return HBox;
+ else if ( ::qt_cast<QVBoxLayout*>(lay) )
+ return VBox;
+ else if ( ::qt_cast<QGridLayout*>(lay) )
+ return Grid;
+ return NoLayout;
+}
+
+/*!
+ \overload
+*/
+WidgetFactory::LayoutType WidgetFactory::layoutType( QLayout *layout )
+{
+ if ( ::qt_cast<QHBoxLayout*>(layout) )
+ return HBox;
+ else if ( ::qt_cast<QVBoxLayout*>(layout) )
+ return VBox;
+ else if ( ::qt_cast<QGridLayout*>(layout) )
+ return Grid;
+ return NoLayout;
+}
+
+/*!
+ \overload
+*/
+WidgetFactory::LayoutType WidgetFactory::layoutType( QWidget *w )
+{
+ QLayout *l = 0;
+ return layoutType( w, l );
+}
+
+
+QWidget *WidgetFactory::layoutParent( QLayout *layout )
+{
+ QObject *o = layout;
+ while ( o ) {
+ if ( o->isWidgetType() )
+ return (QWidget*)o;
+ o = o->parent();
+ }
+ return 0;
+}
+
+/*! Returns the widget into which children should be inserted when \a
+ w is a container known to the designer.
+
+ Usually that is \a w itself, sometimes it is different (e.g. a
+ tabwidget is known to the designer as a container but the child
+ widgets should be inserted into the current page of the
+ tabwidget. So in this case this function returns the current page of
+ the tabwidget.)
+ */
+QWidget* WidgetFactory::containerOfWidget( QWidget *w )
+{
+ if ( !w )
+ return w;
+ if ( ::qt_cast<QTabWidget*>(w) )
+ return ((QTabWidget*)w)->currentPage();
+ if ( ::qt_cast<QWizard*>(w) )
+ return ((QWizard*)w)->currentPage();
+ if ( ::qt_cast<QWidgetStack*>(w) )
+ return ((QWidgetStack*)w)->visibleWidget();
+ if ( ::qt_cast<QToolBox*>(w) )
+ return ((QToolBox*)w)->currentItem();
+ if ( ::qt_cast<QMainWindow*>(w) )
+ return ((QMainWindow*)w)->centralWidget();
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ if ( !WidgetDatabase::isCustomPluginWidget( WidgetDatabase::idFromClassName( classNameOf( w ) ) ) )
+ return w;
+ WidgetInterface *iface = 0;
+ widgetManager()->queryInterface( classNameOf( w ), &iface );
+ if ( !iface )
+ return w;
+ QWidgetContainerInterfacePrivate *iface2 = 0;
+ iface->queryInterface( IID_QWidgetContainer, (QUnknownInterface**)&iface2 );
+ if ( !iface2 )
+ return w;
+ QWidget *c = iface2->containerOfWidget( w->className(), w );
+ iface2->release();
+ iface->release();
+ if ( c )
+ return c;
+#endif // QT_CONTAINER_CUSTOM_WIDGETS
+ return w;
+}
+
+/*! Returns the actual designer widget of the container \a w. This is
+ normally \a w itself, but might be a parent or grand parent of \a w
+ (e.g. when working with a tabwidget and \a w is the container which
+ contains and layouts childs, but the actual widget known to the
+ designer is the tabwidget which is the parent of \a w. So this
+ function returns the tabwidget then.)
+*/
+
+QWidget* WidgetFactory::widgetOfContainer( QWidget *w )
+{
+ if ( w && ::qt_cast<QWidgetStack*>(w->parentWidget()) )
+ w = w->parentWidget();
+ if ( w->parentWidget() && w->parentWidget()->parentWidget() &&
+ w->parentWidget()->parentWidget()->parentWidget() &&
+ ::qt_cast<QToolBox*>(w->parentWidget()->parentWidget()->parentWidget()) )
+ return w->parentWidget()->parentWidget()->parentWidget();
+ while ( w ) {
+ int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( w ) );
+ if ( WidgetDatabase::isContainer( id ) ||
+ w && ::qt_cast<FormWindow*>(w->parentWidget()) )
+ return w;
+ w = w->parentWidget();
+ }
+ return w;
+}
+
+/*!
+ Returns whether \a o is a passive interactor or not.
+ */
+
+bool WidgetFactory::lastWasAPassiveInteractor = FALSE;
+QGuardedPtr<QObject> *WidgetFactory::lastPassiveInteractor = new QGuardedPtr<QObject>();
+
+bool WidgetFactory::isPassiveInteractor( QObject* o )
+{
+ if ( lastPassiveInteractor && *lastPassiveInteractor && (QObject*)(*lastPassiveInteractor) == o )
+ return lastWasAPassiveInteractor;
+ lastWasAPassiveInteractor = FALSE;
+ (*lastPassiveInteractor) = o;
+ if ( QApplication::activePopupWidget() ) // if a popup is open, we have to make sure that this one is closed, else X might do funny things
+ return ( lastWasAPassiveInteractor = TRUE );
+
+ if ( ::qt_cast<QTabBar*>(o) )
+ return ( lastWasAPassiveInteractor = TRUE );
+ else if ( ::qt_cast<QSizeGrip*>(o) )
+ return ( lastWasAPassiveInteractor = TRUE );
+ else if ( ::qt_cast<QButton*>(o) &&
+ ( ::qt_cast<QTabBar*>(o->parent()) || ::qt_cast<QToolBox*>(o->parent()) ) )
+ return ( lastWasAPassiveInteractor = TRUE );
+ else if ( ::qt_cast<QPushButton*>(o) && ::qt_cast<QWizard*>(o->parent()) )
+ return ( lastWasAPassiveInteractor = TRUE );
+ else if ( ::qt_cast<QMenuBar*>(o) && ::qt_cast<QMainWindow*>(o->parent()) )
+ return ( lastWasAPassiveInteractor = TRUE );
+// else if ( ::qt_cast<QDockWindowHandle*>(o) )
+ else if ( o->inherits( "QDockWindowHandle" ) )
+ return ( lastWasAPassiveInteractor = TRUE );
+// else if ( ::qt_cast<QHideDock*>(o) )
+ else if ( o->inherits( "QHideDock" ) )
+ return ( lastWasAPassiveInteractor = TRUE );
+ else if ( qstrcmp( o->name(), "designer_wizardstack_button" ) == 0 )
+ return ( lastWasAPassiveInteractor = TRUE );
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ if ( !o->isWidgetType() )
+ return ( lastWasAPassiveInteractor = FALSE );
+ WidgetInterface *iface = 0;
+ QWidget *w = (QWidget*)o;
+ while ( !iface && w && !::qt_cast<FormWindow*>(w) ) {
+ widgetManager()->queryInterface( classNameOf( w ), &iface );
+ w = w->parentWidget();
+ }
+ if ( !iface )
+ return ( lastWasAPassiveInteractor = FALSE );
+ QWidgetContainerInterfacePrivate *iface2 = 0;
+ iface->queryInterface( IID_QWidgetContainer, (QUnknownInterface**)&iface2 );
+ if ( !iface2 )
+ return ( lastWasAPassiveInteractor = FALSE );
+ QWidget *fw = MainWindow::self->isAFormWindowChild( (QWidget*)o );
+ if ( !fw )
+ return ( lastWasAPassiveInteractor = FALSE );
+ QWidget *dw = ( (FormWindow*)fw )->designerWidget( (QWidget*)o );
+ if ( !dw )
+ return ( lastWasAPassiveInteractor = FALSE );
+ lastWasAPassiveInteractor = iface2->isPassiveInteractor( dw->className(), (QWidget*)o );
+ iface2->release();
+ iface->release();
+#endif // QT_CONTAINER_CUSTOM_WIDGETS
+ return lastWasAPassiveInteractor;
+}
+
+
+/*!
+ Returns the class name of object \a o that should be used for externally (i.e. for saving)
+ */
+const char* WidgetFactory::classNameOf( QObject* o )
+{
+ if ( o->isA( "PropertyObject" ) )
+ return o->className();
+ if (WidgetDatabase::isCustomPluginWidget(WidgetDatabase::idFromClassName(o->className())))
+ return o->className();
+ else if ( ::qt_cast<QDesignerTabWidget*>(o) )
+ return "QTabWidget";
+ else if ( ::qt_cast<QDesignerWidgetStack*>(o) )
+ return "QWidgetStack";
+ else if ( ::qt_cast<QWidgetStack*>(o) )
+ return "QWeDoNotWantToBreakTabWidget";
+ else if ( ::qt_cast<QDesignerDialog*>(o) )
+ return "QDialog";
+ else if ( ::qt_cast<QDesignerWidget*>(o) )
+ return "QWidget";
+ else if ( o->inherits( "CustomWidget" ) )
+ return ( (CustomWidget*)o )->realClassName().latin1();
+ else if ( ::qt_cast<QDesignerLabel*>(o) )
+ return "QLabel";
+ else if ( ::qt_cast<QDesignerWizard*>(o) )
+ return "QWizard";
+ else if ( ::qt_cast<QDesignerPushButton*>(o) )
+ return "QPushButton";
+ else if ( ::qt_cast<QDesignerToolButton*>(o) )
+ return "QToolButton";
+ else if ( ::qt_cast<QDesignerRadioButton*>(o) )
+ return "QRadioButton";
+ else if ( ::qt_cast<QDesignerCheckBox*>(o) )
+ return "QCheckBox";
+ else if ( ::qt_cast<MenuBarEditor*>(o) )
+ return "QMenuBar";
+ else if ( ::qt_cast<QDesignerToolBar*>(o) )
+ return "QToolBar";
+ else if ( ::qt_cast<QDesignerAction*>(o) )
+ return "QAction";
+ else if ( ::qt_cast<QDesignerActionGroup*>(o) )
+ return "QActionGroup";
+ else if ( ::qt_cast<PopupMenuEditor*>(o) )
+ return "QPopupMenu";
+ else if ( ::qt_cast<QDesignerToolBox*>(o) )
+ return "QToolBox";
+#ifndef QT_NO_SQL
+ else if ( ::qt_cast<QDesignerDataBrowser*>(o) )
+ return "QDataBrowser";
+ else if ( ::qt_cast<QDesignerDataView*>(o) )
+ return "QDataView";
+#endif
+ return o->className();
+}
+
+QString WidgetFactory::defaultSignal( QObject *w )
+{
+ if ( ::qt_cast<QRadioButton*>(w) || ::qt_cast<QCheckBox*>(w) )
+ return "toggled";
+ else if ( ::qt_cast<QButton*>(w) || ::qt_cast<QButtonGroup*>(w) )
+ return "clicked";
+ else if ( ::qt_cast<QTextBrowser*>(w) )
+ return "linkClicked";
+ else if ( ::qt_cast<QLineEdit*>(w) || ::qt_cast<QTextEdit*>(w) )
+ return "textChanged";
+ else if ( ::qt_cast<QListView*>(w) || ::qt_cast<QIconView*>(w) ||
+ ::qt_cast<QListBox*>(w) || ::qt_cast<QTable*>(w) )
+ return "selectionChanged";
+ else if ( ::qt_cast<QTabWidget*>(w) )
+ return "selected";
+ else if ( ::qt_cast<QToolBox*>(w) )
+ return "currentChanged";
+ else if ( ::qt_cast<QWidgetStack*>(w) )
+ return "aboutToShow";
+ else if ( ::qt_cast<QSpinBox*>(w) || ::qt_cast<QSlider*>(w) ||
+ ::qt_cast<QScrollBar*>(w) || ::qt_cast<QDateEdit*>(w) ||
+ ::qt_cast<QTimeEdit*>(w) || ::qt_cast<QDateTimeEdit*>(w) ||
+ ::qt_cast<QDial*>(w) )
+ return "valueChanged";
+ else if ( ::qt_cast<QComboBox*>(w) )
+ return "activated";
+ return QString::null;
+}
+
+/*! As some properties are set by default when creating a widget this
+ functions markes this properties as changed. Has to be in sync with
+ createWidget()!
+*/
+
+void WidgetFactory::initChangedProperties( QObject *o )
+{
+ if ( MainWindow::self && MainWindow::self->currProject() &&
+ MainWindow::self->currProject()->fakeFormFileFor( o ) )
+ return;
+ MetaDataBase::setPropertyChanged( o, "name", TRUE );
+ if ( !::qt_cast<QDesignerToolBar*>(o) && !::qt_cast<MenuBarEditor*>(o) )
+ MetaDataBase::setPropertyChanged( o, "geometry", TRUE );
+
+ if ( ::qt_cast<QPushButton*>(o) ||
+ ::qt_cast<QRadioButton*>(o) ||
+ ::qt_cast<QCheckBox*>(o) ||
+ ::qt_cast<QToolButton*>(o) ) {
+ if (::qt_cast<QToolButton*>(o) && ::qt_cast<QToolBox*>(widgetOfContainer((QWidget*)o->parent()))) {
+ MetaDataBase::setPropertyChanged( o, "usesTextLabel", TRUE );
+ MetaDataBase::setPropertyChanged( o, "textLabel", TRUE );
+ MetaDataBase::setPropertyChanged( o, "autoRaise", TRUE );
+ MetaDataBase::setPropertyChanged( o, "textPosition", TRUE );
+ } else {
+ MetaDataBase::setPropertyChanged( o, "text", TRUE );
+ }
+ }
+ else if ( ::qt_cast<QGroupBox*>(o) )
+ MetaDataBase::setPropertyChanged( o, "title", TRUE );
+ else if ( o->isA( "QFrame" ) ) {
+ MetaDataBase::setPropertyChanged( o, "frameShadow", TRUE );
+ MetaDataBase::setPropertyChanged( o, "frameShape", TRUE );
+ } else if ( ::qt_cast<QTabWidget*>(o) || ::qt_cast<QWizard*>(o) ) {
+ MetaDataBase::setPropertyChanged( o, "pageTitle", TRUE );
+ MetaDataBase::setPropertyChanged( o, "pageName", TRUE );
+ MetaDataBase::setPropertyChanged( o, "currentPage", TRUE );
+ } else if ( ::qt_cast<QWidgetStack*>(o) ) {
+ MetaDataBase::setPropertyChanged( o, "currentPage", TRUE );
+ MetaDataBase::setPropertyChanged( o, "pageName", TRUE );
+ } else if ( ::qt_cast<QToolBox*>(o) ) {
+ MetaDataBase::setPropertyChanged( o, "currentIndex", TRUE );
+ MetaDataBase::setPropertyChanged( o, "itemName", TRUE );
+ MetaDataBase::setPropertyChanged( o, "itemLabel", TRUE );
+ MetaDataBase::setPropertyChanged( o, "itemIconSet", TRUE );
+ MetaDataBase::setPropertyChanged( o, "itemToolTip", TRUE );
+ MetaDataBase::setPropertyChanged( o, "itemBackgroundMode", TRUE );
+#ifndef QT_NO_TABLE
+ } else if ( ::qt_cast<QTable*>(o) ) {
+# ifndef QT_NO_SQL
+ if (!::qt_cast<QDataTable*>(o) )
+# endif
+ {
+ MetaDataBase::setPropertyChanged( o, "numRows", TRUE );
+ MetaDataBase::setPropertyChanged( o, "numCols", TRUE );
+ QTable *t = (QTable*)o;
+ for ( int i = 0; i < 3; ++i ) {
+ t->horizontalHeader()->setLabel( i, QString::number( i + 1 ) );
+ t->verticalHeader()->setLabel( i, QString::number( i + 1 ) );
+ }
+ }
+#endif
+ } else if ( ::qt_cast<QSplitter*>(o) ) {
+ MetaDataBase::setPropertyChanged( o, "orientation", TRUE );
+ } else if ( ::qt_cast<QDesignerToolBar*>(o) ) {
+ MetaDataBase::setPropertyChanged( o, "label", TRUE );
+ } else if ( ::qt_cast<MenuBarEditor*>(o) ) {
+ MetaDataBase::setPropertyChanged( o, "itemName", TRUE );
+ MetaDataBase::setPropertyChanged( o, "itemNumber", TRUE );
+ MetaDataBase::setPropertyChanged( o, "itemText", TRUE );
+ }
+}
+
+bool WidgetFactory::hasSpecialEditor( int id, QObject *editorWidget )
+{
+ QString className = WidgetDatabase::className( id );
+
+ if ( className.contains( "ListBox" ) )
+ return TRUE;
+ if ( className.contains( "ComboBox" ) )
+ return TRUE;
+ if ( className.contains( "ListView" ) )
+ return TRUE;
+ if ( className.contains( "IconView" ) )
+ return TRUE;
+ if ( className == "QTextEdit" || className == "QMultiLineEdit" )
+ return TRUE;
+ if ( ::qt_cast<QTable*>(editorWidget) != 0 )
+ return TRUE;
+
+ return FALSE;
+}
+
+bool WidgetFactory::hasItems( int id, QObject *editorWidget )
+{
+ QString className = WidgetDatabase::className( id );
+
+ if ( className.contains( "ListBox" ) || className.contains( "ListView" ) ||
+ className.contains( "IconView" ) || className.contains( "ComboBox" ) ||
+ ::qt_cast<QTable*>(editorWidget) != 0 )
+ return TRUE;
+
+ return FALSE;
+}
+
+void WidgetFactory::editWidget( int id, QWidget *parent, QWidget *editWidget, FormWindow *fw )
+{
+ QString className = WidgetDatabase::className( id );
+
+ if ( className.contains( "ListBox" ) ) {
+ if ( !::qt_cast<QListBox*>(editWidget) )
+ return;
+ ListBoxEditor *e = new ListBoxEditor( parent, editWidget, fw );
+ e->exec();
+ delete e;
+ return;
+ }
+
+ if ( className.contains( "ComboBox" ) ) {
+ if ( !::qt_cast<QComboBox*>(editWidget) )
+ return;
+ QComboBox *cb = (QComboBox*)editWidget;
+ QListBox *lb = cb->listBox();
+ if (!lb) {
+ lb = new QListBox(cb);
+ cb->setListBox(lb);
+ }
+ ListBoxEditor *e = new ListBoxEditor( parent, lb, fw );
+ e->exec();
+ delete e;
+ cb->update();
+ return;
+ }
+
+ if ( className.contains( "ListView" ) ) {
+ if ( !::qt_cast<QListView*>(editWidget) )
+ return;
+ QListView *lv = (QListView*)editWidget;
+ ListViewEditor *e = new ListViewEditor( parent, lv, fw );
+ e->exec();
+ delete e;
+ return;
+ }
+
+ if ( className.contains( "IconView" ) ) {
+ if ( !::qt_cast<QIconView*>(editWidget) )
+ return;
+ IconViewEditor *e = new IconViewEditor( parent, editWidget, fw );
+ e->exec();
+ delete e;
+ return;
+ }
+
+ if ( className == "QMultiLineEdit" || className == "QTextEdit" ) {
+ MultiLineEditor *e = new MultiLineEditor( FALSE, TRUE, parent, editWidget, fw );
+ e->exec();
+ delete e;
+ return;
+ }
+#ifndef QT_NO_TABLE
+ if (::qt_cast<QTable*>(editWidget) != 0) {
+ TableEditor *e = new TableEditor( parent, editWidget, fw );
+ e->exec();
+ delete e;
+ return;
+ }
+#endif
+}
+
+bool WidgetFactory::canResetProperty( QObject *w, const QString &propName )
+{
+ if ( propName == "name" || propName == "geometry" )
+ return FALSE;
+ QStringList l = *changedProperties->find( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( w ) ) );
+ return l.findIndex( propName ) == -1;
+}
+
+bool WidgetFactory::resetProperty( QObject *w, const QString &propName )
+{
+ const QMetaProperty *p = w->metaObject()->property( w->metaObject()->
+ findProperty( propName, TRUE ), TRUE );
+ if (!p )
+ return FALSE;
+ return p->reset( w );
+}
+
+QVariant WidgetFactory::defaultValue( QObject *w, const QString &propName )
+{
+ if ( propName == "wordwrap" ) {
+ int v = defaultValue( w, "alignment" ).toInt();
+ return QVariant( ( v & WordBreak ) == WordBreak, 0 );
+ } else if ( propName == "toolTip" || propName == "whatsThis" ) {
+ return QVariant( QString::fromLatin1( "" ) );
+ } else if ( w->inherits( "CustomWidget" ) ) {
+ return QVariant();
+ } else if ( propName == "frameworkCode" ) {
+ return QVariant( TRUE, 0 );
+ } else if ( propName == "layoutMargin" || propName == "layoutSpacing" ) {
+ return QVariant( -1 );
+ }
+
+ return *( *defaultProperties->find( WidgetDatabase::idFromClassName( classNameOf( w ) ) ) ).find( propName );
+}
+
+QString WidgetFactory::defaultCurrentItem( QObject *w, const QString &propName )
+{
+ const QMetaProperty *p = w->metaObject()->
+ property( w->metaObject()->findProperty( propName, TRUE ), TRUE );
+ if ( !p ) {
+ int v = defaultValue( w, "alignment" ).toInt();
+ if ( propName == "hAlign" ) {
+ if ( ( v & AlignAuto ) == AlignAuto )
+ return "AlignAuto";
+ if ( ( v & AlignLeft ) == AlignLeft )
+ return "AlignLeft";
+ if ( ( v & AlignCenter ) == AlignCenter || ( v & AlignHCenter ) == AlignHCenter )
+ return "AlignHCenter";
+ if ( ( v & AlignRight ) == AlignRight )
+ return "AlignRight";
+ if ( ( v & AlignJustify ) == AlignJustify )
+ return "AlignJustify";
+ } else if ( propName == "vAlign" ) {
+ if ( ( v & AlignTop ) == AlignTop )
+ return "AlignTop";
+ if ( ( v & AlignCenter ) == AlignCenter || ( v & AlignVCenter ) == AlignVCenter )
+ return "AlignVCenter";
+ if ( ( v & AlignBottom ) == AlignBottom )
+ return "AlignBottom";
+ } else if ( propName == "resizeMode" ) {
+ return "Auto";
+ }
+ return QString::null;
+
+ }
+ return p->valueToKey( defaultValue( w, propName ).toInt() );
+}
+
+QWidget *WidgetFactory::createCustomWidget( QWidget *parent, const char *name, MetaDataBase::CustomWidget *w )
+{
+ if ( !w )
+ return 0;
+ return new CustomWidget( parent, name, w );
+}
+
+QVariant WidgetFactory::property( QObject *w, const char *name )
+{
+ int id = w->metaObject()->findProperty( name, TRUE );
+ const QMetaProperty* p = w->metaObject()->property( id, TRUE );
+ if ( !p || !p->isValid() )
+ return MetaDataBase::fakeProperty( w, name );
+ return w->property( name );
+}
+
+void QDesignerLabel::updateBuddy()
+{
+
+ if ( myBuddy.isEmpty() )
+ return;
+
+ QObjectList *l = topLevelWidget()->queryList( "QWidget", myBuddy, FALSE, TRUE );
+ if ( !l || !l->first() ) {
+ delete l;
+ return;
+ }
+
+ QLabel::setBuddy( (QWidget*)l->first() );
+ delete l;
+}
+
+
+void QDesignerWidget::resizeEvent( QResizeEvent* e)
+{
+ if ( need_frame ) {
+ QPainter p(this);
+ p.setPen( backgroundColor() );
+ p.drawRect( QRect( QPoint(0,0), e->oldSize() ) );
+ }
+}
+
+void QDesignerWidget::paintEvent( QPaintEvent *e )
+{
+ if ( need_frame ) {
+ QPainter p(this);
+ p.setPen( backgroundColor().dark() );
+ p.drawRect( rect() );
+ }
+ formwindow->paintGrid( this, e );
+}
+
+void QDesignerDialog::paintEvent( QPaintEvent *e )
+{
+ formwindow->paintGrid( this, e );
+}
+
+QSizePolicy QLayoutWidget::sizePolicy() const
+{
+ return sp;
+}
+
+bool QLayoutWidget::event( QEvent *e )
+{
+ if ( e && ( e->type() == QEvent::ChildInserted ||
+ e->type() == QEvent::ChildRemoved ||
+ e->type() == QEvent::LayoutHint ||
+ e->type() == QEvent::Reparent ) )
+ updateSizePolicy();
+ return QWidget::event( e );
+}
+
+/*
+ This function must be called on QLayoutWidget creation and whenever
+ the QLayoutWidget's parent layout changes (e.g., from a QHBoxLayout
+ to a QVBoxLayout), because of the (illogical) way layouting works.
+*/
+void QLayoutWidget::updateSizePolicy()
+{
+ if ( !children() || children()->count() == 0 ) {
+ sp = QWidget::sizePolicy();
+ return;
+ }
+
+ /*
+ QSizePolicy::MayShrink & friends are private. Here we assume the
+ following:
+
+ Fixed = 0
+ Maximum = MayShrink
+ Minimum = MayGrow
+ Preferred = MayShrink | MayGrow
+ */
+
+ int ht = (int) QSizePolicy::Preferred;
+ int vt = (int) QSizePolicy::Preferred;
+
+ if ( layout() ) {
+ /*
+ parentLayout is set to the parent layout if there is one and if it is
+ top level, in which case layouting is illogical.
+ */
+ QLayout *parentLayout = 0;
+ if ( parent() && parent()->isWidgetType() ) {
+ parentLayout = ((QWidget *)parent())->layout();
+ if ( parentLayout &&
+ ::qt_cast<QLayoutWidget*>(parentLayout->mainWidget()) )
+ parentLayout = 0;
+ }
+
+ QObjectListIt it( *children() );
+ QObject *o;
+
+ if ( ::qt_cast<QVBoxLayout*>(layout()) ) {
+ if ( ::qt_cast<QHBoxLayout*>(parentLayout) )
+ vt = QSizePolicy::Minimum;
+ else
+ vt = QSizePolicy::Fixed;
+
+ while ( ( o = it.current() ) ) {
+ ++it;
+ if ( !o->isWidgetType() || ( (QWidget*)o )->testWState( WState_ForceHide ) )
+ continue;
+ QWidget *w = (QWidget*)o;
+
+ if ( !w->sizePolicy().mayGrowHorizontally() )
+ ht &= ~QSizePolicy::Minimum;
+ if ( !w->sizePolicy().mayShrinkHorizontally() )
+ ht &= ~QSizePolicy::Maximum;
+ if ( w->sizePolicy().mayGrowVertically() )
+ vt |= QSizePolicy::Minimum;
+ if ( w->sizePolicy().mayShrinkVertically() )
+ vt |= QSizePolicy::Maximum;
+ }
+ } else if ( ::qt_cast<QHBoxLayout*>(layout()) ) {
+ if ( ::qt_cast<QVBoxLayout*>(parentLayout) )
+ ht = QSizePolicy::Minimum;
+ else
+ ht = QSizePolicy::Fixed;
+
+ while ( ( o = it.current() ) ) {
+ ++it;
+ if ( !o->isWidgetType() || ( (QWidget*)o )->testWState( WState_ForceHide ) )
+ continue;
+ QWidget *w = (QWidget*)o;
+
+ if ( w->sizePolicy().mayGrowHorizontally() )
+ ht |= QSizePolicy::Minimum;
+ if ( w->sizePolicy().mayShrinkHorizontally() )
+ ht |= QSizePolicy::Maximum;
+ if ( !w->sizePolicy().mayGrowVertically() )
+ vt &= ~QSizePolicy::Minimum;
+ if ( !w->sizePolicy().mayShrinkVertically() )
+ vt &= ~QSizePolicy::Maximum;
+ }
+ } else if ( ::qt_cast<QGridLayout*>(layout()) ) {
+ ht = QSizePolicy::Fixed;
+ vt = QSizePolicy::Fixed;
+ if ( parentLayout ) {
+ if ( ::qt_cast<QVBoxLayout*>(parentLayout) )
+ ht = QSizePolicy::Minimum;
+ else if ( ::qt_cast<QHBoxLayout*>(parentLayout) )
+ vt = QSizePolicy::Minimum;
+ }
+
+ while ( ( o = it.current() ) ) {
+ ++it;
+ if ( !o->isWidgetType() || ( (QWidget*)o )->testWState( WState_ForceHide ) )
+ continue;
+ QWidget *w = (QWidget*)o;
+
+ if ( w->sizePolicy().mayGrowHorizontally() )
+ ht |= QSizePolicy::Minimum;
+ if ( w->sizePolicy().mayShrinkHorizontally() )
+ ht |= QSizePolicy::Maximum;
+ if ( w->sizePolicy().mayGrowVertically() )
+ vt |= QSizePolicy::Minimum;
+ if ( w->sizePolicy().mayShrinkVertically() )
+ vt |= QSizePolicy::Maximum;
+ }
+ }
+ if ( layout()->expanding() & QSizePolicy::Horizontally )
+ ht = QSizePolicy::Expanding;
+ if ( layout()->expanding() & QSizePolicy::Vertically )
+ vt = QSizePolicy::Expanding;
+
+ layout()->invalidate();
+ }
+
+ sp = QSizePolicy( (QSizePolicy::SizeType) ht, (QSizePolicy::SizeType) vt );
+ updateGeometry();
+}
+
+void CustomWidget::paintEvent( QPaintEvent *e )
+{
+ if ( ::qt_cast<FormWindow*>(parentWidget()) ) {
+ ( (FormWindow*)parentWidget() )->paintGrid( this, e );
+ } else {
+ QPainter p( this );
+ p.fillRect( rect(), colorGroup().dark() );
+ p.setPen( colorGroup().light() );
+ p.drawText( 2, 2, width() - 4, height() - 4, Qt::AlignAuto | Qt::AlignTop, cusw->className );
+ p.drawPixmap( ( width() - cusw->pixmap->width() ) / 2,
+ ( height() - cusw->pixmap->height() ) / 2,
+ *cusw->pixmap );
+ }
+}
+
+
+CustomWidgetFactory::CustomWidgetFactory()
+{
+}
+
+QWidget *CustomWidgetFactory::createWidget( const QString &className, QWidget *parent, const char *name ) const
+{
+ MetaDataBase::CustomWidget *w = MetaDataBase::customWidget( WidgetDatabase::idFromClassName( className ) );
+ if ( !w )
+ return 0;
+ return WidgetFactory::createCustomWidget( parent, name, w );
+}
+
+void QDesignerRadioButton::setFocusPolicy( FocusPolicy policy )
+{
+ // Make sure we only set a policy that has a key.
+ // If we set a policy that is a combination of enums, it will be imposible to save
+ // We need this check because QButtonGroup::buttonToggled(...) will remove TabFocus,
+ // making the policy StrongFocus & ~TabFocus
+
+ switch ( policy ) {
+ case NoFocus:
+ case TabFocus:
+ case ClickFocus:
+ case StrongFocus:
+ case WheelFocus:
+ QRadioButton::setFocusPolicy( policy );
+ return;
+ }
+ QRadioButton::setFocusPolicy( NoFocus );
+}
+
+QDesignerToolBox::QDesignerToolBox( QWidget *parent, const char *name )
+ : QToolBox( parent, name )
+{
+}
+
+QString QDesignerToolBox::itemLabel() const
+{
+ return QToolBox::itemLabel( currentIndex() );
+}
+
+void QDesignerToolBox::setItemLabel( const QString &l )
+{
+ QToolBox::setItemLabel( currentIndex(), l );
+}
+
+QCString QDesignerToolBox::itemName() const
+{
+ return currentItem() ? currentItem()->name() : 0;
+}
+
+void QDesignerToolBox::setItemName( const QCString &n )
+{
+ if (currentItem())
+ currentItem()->setName( n );
+}
+
+
+Qt::BackgroundMode QDesignerToolBox::itemBackgroundMode() const
+{
+ return (item(0) ? item(0)->backgroundMode() : PaletteBackground);
+}
+
+void QDesignerToolBox::setItemBackgroundMode( BackgroundMode bmode )
+{
+ for (int i = 0; i < count(); ++i) {
+ QWidget *w = item(i);
+ w->setBackgroundMode( bmode );
+ w->update();
+ }
+}
+
+void QDesignerToolBox::itemInserted( int index )
+{
+ if (count() > 1)
+ item(index)->setBackgroundMode(item(index>0?0:1)->backgroundMode());
+}
diff --git a/tools/designer/designer/widgetfactory.h b/tools/designer/designer/widgetfactory.h
new file mode 100644
index 0000000..8f12193
--- /dev/null
+++ b/tools/designer/designer/widgetfactory.h
@@ -0,0 +1,509 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef WIDGETFACTORY_H
+#define WIDGETFACTORY_H
+
+#include <qvariant.h>
+#include <qiconset.h>
+#include <qstring.h>
+#include <qintdict.h>
+#include <qtabwidget.h>
+#include <qpixmap.h>
+#include <qsize.h>
+#include <qpainter.h>
+#include <qevent.h>
+#include <qobjectlist.h>
+#include <qlabel.h>
+#include <qwizard.h>
+#include <qptrdict.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <qwidgetstack.h>
+#include <qguardedptr.h>
+#include <qtoolbox.h>
+
+#include "metadatabase.h"
+#include "qwidgetfactory.h"
+
+class QWidget;
+class QLayout;
+class FormWindow;
+
+class CustomWidgetFactory : public QWidgetFactory
+{
+public:
+ CustomWidgetFactory();
+ QWidget *createWidget( const QString &className, QWidget *parent, const char *name ) const;
+
+};
+
+class WidgetFactory : public Qt
+{
+ friend class CustomWidgetFactory;
+
+public:
+ enum LayoutType {
+ HBox,
+ VBox,
+ Grid,
+ NoLayout
+ };
+
+ static QWidget *create( int id, QWidget *parent, const char *name = 0, bool init = TRUE,
+ const QRect *rect = 0, Qt::Orientation orient = Qt::Horizontal );
+ static QLayout *createLayout( QWidget *widget, QLayout* layout, LayoutType type );
+ static void deleteLayout( QWidget *widget );
+
+ static LayoutType layoutType( QWidget *w );
+ static LayoutType layoutType( QWidget *w, QLayout *&layout );
+ static LayoutType layoutType( QLayout *layout );
+ static QWidget *layoutParent( QLayout *layout );
+
+ static QWidget* containerOfWidget( QWidget *w );
+ static QWidget* widgetOfContainer( QWidget *w );
+
+ static bool isPassiveInteractor( QObject* o );
+ static const char* classNameOf( QObject* o );
+
+ static void initChangedProperties( QObject *o );
+
+ static bool hasSpecialEditor( int id, QObject *editorWidget );
+ static bool hasItems( int id, QObject *editorWidget );
+ static void editWidget( int id, QWidget *parent, QWidget *editWidget, FormWindow *fw );
+
+ static bool canResetProperty( QObject *w, const QString &propName );
+ static bool resetProperty( QObject *w, const QString &propName );
+ static QVariant defaultValue( QObject *w, const QString &propName );
+ static QString defaultCurrentItem( QObject *w, const QString &propName );
+
+ static QVariant property( QObject *w, const char *name );
+ static void saveDefaultProperties( QObject *w, int id );
+ static void saveChangedProperties( QObject *w, int id );
+
+ static QString defaultSignal( QObject *w );
+
+private:
+ static QWidget *createWidget( const QString &className, QWidget *parent, const char *name, bool init,
+ const QRect *r = 0, Qt::Orientation orient = Qt::Horizontal );
+ static QWidget *createCustomWidget( QWidget *parent, const char *name, MetaDataBase::CustomWidget *w );
+
+ static QGuardedPtr<QObject> *lastPassiveInteractor;
+ static bool lastWasAPassiveInteractor;
+};
+
+
+class QDesignerTabWidget : public QTabWidget
+{
+ Q_OBJECT
+ Q_PROPERTY( int currentPage READ currentPage WRITE setCurrentPage STORED false DESIGNABLE true )
+ Q_PROPERTY( QString pageTitle READ pageTitle WRITE setPageTitle STORED false DESIGNABLE true )
+ Q_PROPERTY( QCString pageName READ pageName WRITE setPageName STORED false DESIGNABLE true )
+public:
+ QDesignerTabWidget( QWidget *parent, const char *name );
+
+ int currentPage() const;
+ void setCurrentPage( int i );
+ QString pageTitle() const;
+ void setPageTitle( const QString& title );
+ QCString pageName() const;
+ void setPageName( const QCString& name );
+
+ int count() const;
+ QTabBar *tabBar() const { return QTabWidget::tabBar(); }
+
+ bool eventFilter( QObject*, QEvent* );
+
+private:
+ QPoint pressPoint;
+ QWidget *dropIndicator;
+ QWidget *dragPage;
+ QString dragLabel;
+ bool mousePressed;
+};
+
+class QDesignerWidgetStack : public QWidgetStack
+{
+ Q_OBJECT
+ Q_PROPERTY( int currentPage READ currentPage WRITE setCurrentPage STORED false DESIGNABLE true )
+ Q_PROPERTY( QCString pageName READ pageName WRITE setPageName STORED false DESIGNABLE true )
+public:
+ QDesignerWidgetStack( QWidget *parent, const char *name );
+
+ int currentPage() const;
+ void setCurrentPage( int i );
+ QCString pageName() const;
+ void setPageName( const QCString& name );
+
+ int count() const;
+ QWidget* page( int i ) const;
+
+ int insertPage( QWidget *p, int i = -1 );
+ int removePage( QWidget *p );
+
+public slots:
+ void updateButtons();
+
+protected:
+ void resizeEvent( QResizeEvent *e ) {
+ QWidgetStack::resizeEvent( e );
+ updateButtons();
+ }
+
+ void showEvent( QShowEvent *e ) {
+ QWidgetStack::showEvent( e );
+ updateButtons();
+ }
+
+private slots:
+ void prevPage();
+ void nextPage();
+
+private:
+ QPtrList<QWidget> pages;
+ QToolButton *prev, *next;
+
+};
+
+class QDesignerWizard : public QWizard
+{
+ Q_OBJECT
+ Q_PROPERTY( int currentPage READ currentPageNum WRITE setCurrentPage STORED false DESIGNABLE true )
+ Q_PROPERTY( QString pageTitle READ pageTitle WRITE setPageTitle STORED false DESIGNABLE true )
+ Q_PROPERTY( QCString pageName READ pageName WRITE setPageName STORED false DESIGNABLE true )
+ Q_OVERRIDE( bool modal READ isModal WRITE setModal )
+
+public:
+ QDesignerWizard( QWidget *parent, const char *name )
+ : QWizard( parent, name ), modal(FALSE) {}
+
+ int currentPageNum() const;
+ void setCurrentPage( int i );
+ QString pageTitle() const;
+ void setPageTitle( const QString& title );
+ QCString pageName() const;
+ void setPageName( const QCString& name );
+ int pageNum( QWidget *page );
+ void addPage( QWidget *p, const QString & );
+ void removePage( QWidget *p );
+ void insertPage( QWidget *p, const QString &t, int index );
+ bool isPageRemoved( QWidget *p ) { return (removedPages.find( p ) != 0); }
+
+ bool isModal() const { return modal; }
+ void setModal(bool b) { modal = b; }
+
+ void reject() {}
+
+private:
+ struct Page
+ {
+ Page( QWidget *a, const QString &b ) : p( a ), t( b ) {}
+ Page() : p( 0 ), t( QString::null ) {}
+ QWidget *p;
+ QString t;
+ };
+ QPtrDict<QWidget> removedPages;
+ bool modal;
+
+};
+
+class QLayoutWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ QLayoutWidget( QWidget *parent, const char *name ) : QWidget( parent, name ), sp( QWidget::sizePolicy() ) {}
+
+ QSizePolicy sizePolicy() const;
+ void updateSizePolicy();
+
+protected:
+ void paintEvent( QPaintEvent * );
+ bool event( QEvent * );
+ QSizePolicy sp;
+
+};
+
+
+class CustomWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ CustomWidget( QWidget *parent, const char *name, MetaDataBase::CustomWidget *cw )
+ : QWidget( parent, name ), cusw( cw ) {
+ alwaysExpand = parentWidget() && parentWidget()->inherits( "FormWindow" );
+ setSizePolicy( cw->sizePolicy );
+ if ( !alwaysExpand )
+ setBackgroundMode( PaletteDark );
+ }
+
+ QSize sizeHint() const {
+ QSize sh = cusw->sizeHint;
+ if ( sh.isValid() )
+ return sh;
+ return QWidget::sizeHint();
+ }
+
+ QString realClassName() { return cusw->className; }
+ MetaDataBase::CustomWidget *customWidget() const { return cusw; }
+
+protected:
+ void paintEvent( QPaintEvent *e );
+
+ MetaDataBase::CustomWidget *cusw;
+ bool alwaysExpand;
+
+};
+
+
+class Line : public QFrame
+{
+ Q_OBJECT
+
+ Q_PROPERTY( Orientation orientation READ orientation WRITE setOrientation )
+ Q_OVERRIDE( int frameWidth DESIGNABLE false )
+ Q_OVERRIDE( Shape frameShape DESIGNABLE false )
+ Q_OVERRIDE( QRect frameRect DESIGNABLE false )
+ Q_OVERRIDE( QRect contentsRect DESIGNABLE false )
+public:
+ Line( QWidget *parent, const char *name )
+ : QFrame( parent, name, WMouseNoMask ) {
+ setFrameStyle( HLine | Sunken );
+ }
+
+ void setOrientation( Orientation orient ) {
+ if ( orient == Horizontal )
+ setFrameShape( HLine );
+ else
+ setFrameShape( VLine );
+ }
+ Orientation orientation() const {
+ return frameShape() == HLine ? Horizontal : Vertical;
+ }
+};
+
+class QDesignerLabel : public QLabel
+{
+ Q_OBJECT
+
+ Q_PROPERTY( QCString buddy READ buddyWidget WRITE setBuddyWidget )
+
+public:
+ QDesignerLabel( QWidget *parent = 0, const char *name = 0 )
+ : QLabel( parent, name ) { myBuddy = 0; }
+
+ void setBuddyWidget( const QCString &b ) {
+ myBuddy = b;
+ updateBuddy();
+ }
+ QCString buddyWidget() const {
+ return myBuddy;
+ };
+
+protected:
+ void showEvent( QShowEvent *e ) {
+ QLabel::showEvent( e );
+ updateBuddy();
+ }
+
+
+private:
+ void updateBuddy();
+
+ QCString myBuddy;
+
+};
+
+class QDesignerWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ QDesignerWidget( FormWindow *fw, QWidget *parent, const char *name )
+ : QWidget( parent, name, WResizeNoErase ), formwindow( fw ) {
+ need_frame = parent && parent->inherits("QDesignerWidgetStack" );
+ }
+
+protected:
+ void resizeEvent( QResizeEvent* e);
+ void paintEvent( QPaintEvent *e );
+
+private:
+ FormWindow *formwindow;
+ uint need_frame : 1;
+
+};
+
+class QDesignerDialog : public QDialog
+{
+ Q_OBJECT
+ Q_OVERRIDE( bool modal READ isModal WRITE setModal )
+
+public:
+ QDesignerDialog( FormWindow *fw, QWidget *parent, const char *name )
+ : QDialog( parent, name, FALSE, WResizeNoErase ), formwindow( fw ), modal(FALSE) {}
+
+ bool isModal() const { return modal; }
+ void setModal(bool b) { modal = b; }
+
+protected:
+ void paintEvent( QPaintEvent *e );
+
+private:
+ FormWindow *formwindow;
+ bool modal;
+
+};
+
+class QDesignerToolButton : public QToolButton
+{
+ Q_OBJECT
+ Q_PROPERTY( int buttonGroupId READ buttonGroupId WRITE setButtonGroupId )
+
+public:
+ QDesignerToolButton( QWidget *parent, const char *name )
+ : QToolButton( parent, name ) {}
+
+ bool isInButtonGroup() const {
+ return parentWidget() && parentWidget()->inherits( "QButtonGroup" );
+ }
+ int buttonGroupId() const {
+ return parentWidget() && parentWidget()->inherits( "QButtonGroup" ) ? ( (QButtonGroup*)parentWidget() )->id( (QButton*)this ) : -1;
+ }
+ void setButtonGroupId( int id ) {
+ if ( parentWidget() && parentWidget()->inherits( "QButtonGroup" ) ) {
+ ( (QButtonGroup*)parentWidget() )->remove( this );
+ ( (QButtonGroup*)parentWidget() )->insert( this, id );
+ }
+ }
+};
+
+class QDesignerRadioButton : public QRadioButton
+{
+ Q_OBJECT
+ Q_PROPERTY( int buttonGroupId READ buttonGroupId WRITE setButtonGroupId )
+
+public:
+ QDesignerRadioButton( QWidget *parent, const char *name )
+ : QRadioButton( parent, name ) {}
+
+ bool isInButtonGroup() const {
+ return parentWidget() && parentWidget()->inherits( "QButtonGroup" );
+ }
+ int buttonGroupId() const {
+ return parentWidget() && parentWidget()->inherits( "QButtonGroup" ) ? ( (QButtonGroup*)parentWidget() )->id( (QButton*)this ) : -1;
+ }
+ void setButtonGroupId( int id ) {
+ if ( parentWidget() && parentWidget()->inherits( "QButtonGroup" ) ) {
+ ( (QButtonGroup*)parentWidget() )->remove( this );
+ ( (QButtonGroup*)parentWidget() )->insert( this, id );
+ }
+ }
+
+ void setFocusPolicy( FocusPolicy policy );
+};
+
+class QDesignerPushButton : public QPushButton
+{
+ Q_OBJECT
+ Q_PROPERTY( int buttonGroupId READ buttonGroupId WRITE setButtonGroupId )
+
+public:
+ QDesignerPushButton( QWidget *parent, const char *name )
+ : QPushButton( parent, name ) {}
+
+ bool isInButtonGroup() const {
+ return parentWidget() && parentWidget()->inherits( "QButtonGroup" );
+ }
+ int buttonGroupId() const {
+ return parentWidget() && parentWidget()->inherits( "QButtonGroup" ) ? ( (QButtonGroup*)parentWidget() )->id( (QButton*)this ) : -1;
+ }
+ void setButtonGroupId( int id ) {
+ if ( parentWidget() && parentWidget()->inherits( "QButtonGroup" ) ) {
+ ( (QButtonGroup*)parentWidget() )->remove( this );
+ ( (QButtonGroup*)parentWidget() )->insert( this, id );
+ }
+ }
+
+};
+
+class QDesignerCheckBox : public QCheckBox
+{
+ Q_OBJECT
+ Q_PROPERTY( int buttonGroupId READ buttonGroupId WRITE setButtonGroupId )
+
+public:
+ QDesignerCheckBox( QWidget *parent, const char *name )
+ : QCheckBox( parent, name ) {}
+
+ bool isInButtonGroup() const {
+ return parentWidget() && parentWidget()->inherits( "QButtonGroup" );
+ }
+ int buttonGroupId() const {
+ return parentWidget() && parentWidget()->inherits( "QButtonGroup" ) ? ( (QButtonGroup*)parentWidget() )->id( (QButton*)this ) : -1;
+ }
+ void setButtonGroupId( int id ) {
+ if ( parentWidget() && parentWidget()->inherits( "QButtonGroup" ) ) {
+ ( (QButtonGroup*)parentWidget() )->remove( this );
+ ( (QButtonGroup*)parentWidget() )->insert( this, id );
+ }
+ }
+
+};
+
+class QDesignerToolBox : public QToolBox
+{
+ Q_OBJECT
+ Q_PROPERTY( QString itemLabel READ itemLabel WRITE setItemLabel STORED false DESIGNABLE true )
+ Q_PROPERTY( QCString itemName READ itemName WRITE setItemName STORED false DESIGNABLE true )
+ Q_PROPERTY( BackgroundMode itemBackgroundMode READ itemBackgroundMode WRITE setItemBackgroundMode STORED false DESIGNABLE true )
+
+public:
+ QDesignerToolBox( QWidget *parent, const char *name );
+
+ QString itemLabel() const;
+ void setItemLabel( const QString &l );
+ QCString itemName() const;
+ void setItemName( const QCString &n );
+ BackgroundMode itemBackgroundMode() const;
+ void setItemBackgroundMode( BackgroundMode );
+
+protected:
+ void itemInserted( int index );
+};
+
+#endif
diff --git a/tools/designer/designer/wizardeditor.ui b/tools/designer/designer/wizardeditor.ui
new file mode 100644
index 0000000..7fbd6bf
--- /dev/null
+++ b/tools/designer/designer/wizardeditor.ui
@@ -0,0 +1,345 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>WizardEditorBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>WizardEditorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>396</width>
+ <height>233</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Wizard Page Editor</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout19</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout14</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>pagesLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Wizard Pages:</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>listBox</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout18</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonAdd</cstring>
+ </property>
+ <property name="text">
+ <string>A&amp;dd</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonRemove</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonUp</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_up.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonDown</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_s_down.png</pixmap>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonApply</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Apply all changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and apply all the changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close the dialog and discard any changes.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonHelp</sender>
+ <signal>clicked()</signal>
+ <receiver>WizardEditorBase</receiver>
+ <slot>helpClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonApply</sender>
+ <signal>clicked()</signal>
+ <receiver>WizardEditorBase</receiver>
+ <slot>applyClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonUp</sender>
+ <signal>clicked()</signal>
+ <receiver>WizardEditorBase</receiver>
+ <slot>upClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonDown</sender>
+ <signal>clicked()</signal>
+ <receiver>WizardEditorBase</receiver>
+ <slot>downClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonAdd</sender>
+ <signal>clicked()</signal>
+ <receiver>WizardEditorBase</receiver>
+ <slot>addClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonRemove</sender>
+ <signal>clicked()</signal>
+ <receiver>WizardEditorBase</receiver>
+ <slot>removeClicked()</slot>
+ </connection>
+ <connection>
+ <sender>listBox</sender>
+ <signal>selected(int)</signal>
+ <receiver>WizardEditorBase</receiver>
+ <slot>itemSelected(int)</slot>
+ </connection>
+ <connection>
+ <sender>listBox</sender>
+ <signal>highlighted(int)</signal>
+ <receiver>WizardEditorBase</receiver>
+ <slot>itemHighlighted(int)</slot>
+ </connection>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>WizardEditorBase</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>WizardEditorBase</receiver>
+ <slot>cancelClicked()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot access="protected">addClicked()</slot>
+ <slot access="protected">applyClicked()</slot>
+ <slot access="protected">cancelClicked()</slot>
+ <slot access="protected">downClicked()</slot>
+ <slot access="protected">helpClicked()</slot>
+ <slot access="protected">itemHighlighted(int)</slot>
+ <slot access="protected">itemSelected(int)</slot>
+ <slot access="protected">okClicked()</slot>
+ <slot access="protected">removeClicked()</slot>
+ <slot access="protected">upClicked()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/designer/wizardeditorimpl.cpp b/tools/designer/designer/wizardeditorimpl.cpp
new file mode 100644
index 0000000..8754953
--- /dev/null
+++ b/tools/designer/designer/wizardeditorimpl.cpp
@@ -0,0 +1,258 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "wizardeditorimpl.h"
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "command.h"
+#include "listboxdnd.h"
+#include "listboxrename.h"
+
+#include <qwizard.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qinputdialog.h>
+
+WizardEditor::WizardEditor( QWidget *parent, QWizard *w, FormWindow *fw )
+ : WizardEditorBase( parent, 0 ), formwindow( fw ), wizard( w ), draggedItem( 0 )
+{
+ connect( buttonHelp, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) );
+ fillListBox();
+
+ // Add drag and drop
+ ListBoxDnd *listBoxDnd = new ListBoxDnd( listBox );
+ listBoxDnd->setDragMode( ListBoxDnd::Internal | ListBoxDnd::Move );
+ QObject::connect( listBoxDnd, SIGNAL( dropped( QListBoxItem * ) ),
+ listBoxDnd, SLOT( confirmDrop( QListBoxItem * ) ) );
+
+ QObject::connect( listBoxDnd, SIGNAL( dragged( QListBoxItem * ) ),
+ this, SLOT( itemDragged( QListBoxItem * ) ) );
+ QObject::connect( listBoxDnd, SIGNAL( dropped( QListBoxItem * ) ),
+ this, SLOT( itemDropped( QListBoxItem * ) ) );
+
+ // Add in-place rename
+ new ListBoxRename( listBox );
+}
+
+WizardEditor::~WizardEditor()
+{
+ commands.setAutoDelete( TRUE );
+}
+
+void WizardEditor::okClicked()
+{
+ applyClicked();
+ accept();
+}
+
+void WizardEditor::cancelClicked()
+{
+ reject();
+}
+
+void WizardEditor::applyClicked()
+{
+ if ( commands.isEmpty() ) return;
+
+ // schedule macro command
+ MacroCommand* cmd = new MacroCommand( tr( "Edit Wizard Pages" ), formwindow, commands );
+ formwindow->commandHistory()->addCommand( cmd );
+ cmd->execute();
+
+ // clear command list
+ commands.clear();
+
+ // fix wizard buttons
+ for ( int i = 0; i < wizard->pageCount(); i++ ) {
+
+ QWidget * page = wizard->page( i );
+ if ( i == 0 ) { // first page
+
+ wizard->setBackEnabled( page, FALSE );
+ wizard->setNextEnabled( page, TRUE );
+ }
+ else if ( i == wizard->pageCount() - 1 ) { // last page
+
+ wizard->setBackEnabled( page, TRUE );
+ wizard->setNextEnabled( page, FALSE );
+ }
+ else {
+
+ wizard->setBackEnabled( page, TRUE );
+ wizard->setNextEnabled( page, TRUE );
+ }
+ wizard->setFinishEnabled( page, FALSE );
+ }
+
+ // update listbox
+ int index = listBox->currentItem();
+ fillListBox();
+ listBox->setCurrentItem( index );
+
+ // show current page
+ wizard->showPage( wizard->page( 0 ) );
+}
+
+void WizardEditor::helpClicked()
+{
+
+}
+
+void WizardEditor::addClicked()
+{
+ int index = listBox->currentItem() + 1;
+ // update listbox
+ listBox->insertItem( "Page", index );
+
+ // schedule add command
+ AddWizardPageCommand *cmd = new AddWizardPageCommand( tr( "Add Page to %1" ).arg( wizard->name() ),
+ formwindow, wizard, "Page", index, FALSE);
+ commands.append( cmd );
+
+ // update buttons
+ updateButtons();
+}
+
+void WizardEditor::removeClicked()
+{
+ if ( listBox->count() < 2 ) return;
+
+ int index = listBox->currentItem();
+
+ // update listbox
+ listBox->removeItem( index );
+
+ // schedule remove command
+ DeleteWizardPageCommand *cmd = new DeleteWizardPageCommand( tr( "Delete Page %1 of %2" )
+ .arg( listBox->text( index ) ).arg( wizard->name() ),
+ formwindow, wizard, index, FALSE );
+ commands.append( cmd );
+
+ // update buttons
+ updateButtons();
+}
+
+void WizardEditor::upClicked()
+{
+ int index1 = listBox->currentItem();
+ int index2 = index1 - 1;
+
+ // swap listbox items
+ QString item1 = listBox->text( index1 );
+ listBox->removeItem( index1 );
+ listBox->insertItem( item1, index2 );
+ listBox->setCurrentItem( index2 );
+
+ // schedule swap command
+ SwapWizardPagesCommand *cmd = new SwapWizardPagesCommand( tr( "Swap pages %1 and %2 of %1" ).arg( index1 ).arg( index2 )
+ .arg( wizard->name() ), formwindow, wizard, index1, index2);
+ commands.append( cmd );
+
+ // update buttons
+ updateButtons();
+}
+
+void WizardEditor::downClicked()
+{
+ int index1 = listBox->currentItem();
+ int index2 = index1 + 1;
+
+ // swap listbox items
+ QString item1 = listBox->text( index1 );
+ listBox->removeItem( index1 );
+ listBox->insertItem( item1, index2 );
+ listBox->setCurrentItem( index2 );
+
+ // schedule swap command
+ SwapWizardPagesCommand *cmd = new SwapWizardPagesCommand( tr( "Swap pages %1 and %2 of %1" ).arg( index1 ).arg( index2 ).arg( wizard->name() ), formwindow, wizard, index2, index1);
+ commands.append( cmd );
+
+ // update buttons
+ updateButtons();
+}
+
+void WizardEditor::fillListBox()
+{
+ listBox->clear();
+
+ if ( !wizard ) return;
+ for ( int i = 0; i < wizard->pageCount(); i++ )
+ listBox->insertItem( wizard->title( wizard->page( i ) ) );
+
+ updateButtons();
+}
+
+void WizardEditor::itemHighlighted( int )
+{
+ updateButtons();
+}
+
+void WizardEditor::itemSelected( int index )
+{
+ if ( index < 0 ) return;
+ // Called when Qt::Key_Enter was pressed.
+ // ListBoxRename has renamed the list item, so we only need to rename the page to the same name.
+ QString pn( tr( "Rename page %1 of %2" ).arg( wizard->title( wizard->page( index ) ) ).arg( wizard->name() ) );
+ RenameWizardPageCommand *cmd = new RenameWizardPageCommand( pn, formwindow, wizard, index, listBox->text( index ) );
+ commands.append( cmd );
+}
+
+void WizardEditor::updateButtons()
+{
+ int index = listBox->currentItem();
+
+ buttonUp->setEnabled( index > 0 );
+ buttonDown->setEnabled( index < (int)listBox->count() - 1 );
+ buttonRemove->setEnabled( index >= 0 );
+
+ if ( listBox->count() < 2 )
+ buttonRemove->setEnabled( FALSE );
+}
+
+void WizardEditor::itemDragged( QListBoxItem * i )
+{
+ // Store item index
+ draggedItem = listBox->index( i );
+}
+
+void WizardEditor::itemDropped( QListBoxItem * i )
+{
+ if ( draggedItem < 0 ) return;
+ // The reorder the pages acording to the listBox list of items
+ // Assumes that only one item has been moved.
+ int droppedItem = listBox->index( i );
+
+ //qDebug( "Moving page %d -> %d", draggedItem, droppedItem );
+ MoveWizardPageCommand *cmd = new MoveWizardPageCommand( tr( "Move page %1 to %2 in %3" ).arg( draggedItem ).arg( droppedItem ).arg( wizard->name() ), formwindow, wizard, draggedItem, droppedItem );
+ commands.append( cmd );
+}
diff --git a/tools/designer/designer/wizardeditorimpl.h b/tools/designer/designer/wizardeditorimpl.h
new file mode 100644
index 0000000..e1207b4
--- /dev/null
+++ b/tools/designer/designer/wizardeditorimpl.h
@@ -0,0 +1,81 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef WIZARDEDITORIMPL_H
+#define WIZARDEDITORIMPL_H
+
+class QWizard;
+class FormWindow;
+
+#include <qptrlist.h>
+
+#include "wizardeditor.h"
+#include "command.h"
+
+class WizardEditor : public WizardEditorBase
+{
+ Q_OBJECT
+
+public:
+ WizardEditor( QWidget *parent, QWizard *wizard, FormWindow *fw );
+ ~WizardEditor();
+
+protected slots:
+ void okClicked();
+ void applyClicked();
+ void cancelClicked();
+ void helpClicked();
+
+ void addClicked();
+ void removeClicked();
+ void upClicked();
+ void downClicked();
+
+ void itemHighlighted( int );
+ void itemSelected( int );
+
+ void itemDragged( QListBoxItem * );
+ void itemDropped( QListBoxItem * );
+
+private:
+ void updateButtons();
+ void fillListBox();
+
+private:
+ FormWindow *formwindow;
+ QWizard *wizard;
+ QPtrList<Command> commands;
+ int draggedItem;
+};
+
+#endif
diff --git a/tools/designer/designer/workspace.cpp b/tools/designer/designer/workspace.cpp
new file mode 100644
index 0000000..41ee23e
--- /dev/null
+++ b/tools/designer/designer/workspace.cpp
@@ -0,0 +1,713 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qvariant.h> // HP-UX compiler needs this here
+#include "workspace.h"
+#include "formwindow.h"
+#include "mainwindow.h"
+#include "globaldefs.h"
+#include "command.h"
+#include "project.h"
+#include "pixmapcollection.h"
+#include "sourcefile.h"
+#include "sourceeditor.h"
+#include "propertyeditor.h"
+
+#include <qheader.h>
+#include <qdragobject.h>
+#include <qfileinfo.h>
+#include <qapplication.h>
+#include <qpainter.h>
+#include <qpen.h>
+#include <qobjectlist.h>
+#include <qworkspace.h>
+#include <qpopupmenu.h>
+#include <qtextstream.h>
+#include "qcompletionedit.h"
+
+WorkspaceItem::WorkspaceItem( QListView *parent, Project* p )
+ : QListViewItem( parent )
+{
+ init();
+ project = p;
+ t = ProjectType;
+ setPixmap( 0, QPixmap::fromMimeSource( "designer_folder.png" ) );
+ setExpandable( FALSE );
+}
+
+WorkspaceItem::WorkspaceItem( QListViewItem *parent, SourceFile* sf )
+ : QListViewItem( parent )
+{
+ init();
+ sourceFile = sf;
+ t = SourceFileType;
+ setPixmap( 0, QPixmap::fromMimeSource( "designer_filenew.png" ) );
+}
+
+WorkspaceItem::WorkspaceItem( QListViewItem *parent, QObject *o, Project *p )
+ : QListViewItem( parent )
+{
+ init();
+ object = o;
+ project = p;
+ t = ObjectType;
+ setPixmap( 0, QPixmap::fromMimeSource( "designer_object.png" ) );
+ QObject::connect( p->fakeFormFileFor( o ), SIGNAL( somethingChanged(FormFile*) ),
+ listView(), SLOT( update() ) );
+}
+
+WorkspaceItem::WorkspaceItem( QListViewItem *parent, FormFile* ff, Type type )
+ : QListViewItem( parent )
+{
+ init();
+ formFile = ff;
+ t = type;
+ if ( type == FormFileType ) {
+ setPixmap( 0, QPixmap::fromMimeSource( "designer_form.png" ) );
+ QObject::connect( ff, SIGNAL( somethingChanged(FormFile*) ), listView(), SLOT( update(FormFile*) ) );
+ if ( formFile->supportsCodeFile() ) {
+ (void) new WorkspaceItem( this, formFile, FormSourceType );
+ }
+ } else if ( type == FormSourceType ) {
+ setPixmap( 0, QPixmap::fromMimeSource( "designer_filenew.png" ) );
+ }
+}
+
+
+void WorkspaceItem::init()
+{
+ autoOpen = FALSE;
+ useOddColor = FALSE;
+ project = 0;
+ sourceFile = 0;
+ formFile = 0;
+}
+
+void WorkspaceItem::paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int align )
+{
+ QColorGroup g( cg );
+ g.setColor( QColorGroup::Base, backgroundColor() );
+ g.setColor( QColorGroup::Foreground, Qt::black );
+
+ if ( type() == FormSourceType &&
+ ( !formFile->hasFormCode() || ( formFile->codeFileState() == FormFile::Deleted && formFile->formWindow() ) ) &&
+ parent() && parent()->parent() && ( (WorkspaceItem*)parent()->parent() )->project &&
+ ( (WorkspaceItem*)parent()->parent() )->project->isCpp() ) {
+ g.setColor( QColorGroup::Text, listView()->palette().disabled().color( QColorGroup::Text) );
+ g.setColor( QColorGroup::HighlightedText, listView()->palette().disabled().color( QColorGroup::Text) );
+ } else {
+ g.setColor( QColorGroup::Text, Qt::black );
+ }
+ p->save();
+
+ if ( isModified() ) {
+ QFont f = p->font();
+ f.setBold( TRUE );
+ p->setFont( f );
+ }
+
+ QListViewItem::paintCell( p, g, column, width, align );
+ p->setPen( QPen( cg.dark(), 1 ) );
+ if ( column == 0 )
+ p->drawLine( 0, 0, 0, height() - 1 );
+ if ( listView()->firstChild() != this ) {
+ if ( nextSibling() != itemBelow() && itemBelow()->depth() < depth() ) {
+ int d = depth() - itemBelow()->depth();
+ p->drawLine( -listView()->treeStepSize() * d, height() - 1, 0, height() - 1 );
+ }
+ }
+ p->drawLine( 0, height() - 1, width, height() - 1 );
+ p->drawLine( width - 1, 0, width - 1, height() );
+ p->restore();
+}
+
+QString WorkspaceItem::text( int column ) const
+{
+ if ( column != 0 )
+ return QListViewItem::text( column );
+ switch( t ) {
+ case ProjectType:
+ if ( project->isDummy() ) {
+ return Project::tr("<No Project>" );
+ } else if ( MainWindow::self->singleProjectMode() ) {
+ return QFileInfo( project->fileName() ).baseName();
+ }
+ return project->makeRelative( project->fileName() );
+ case FormFileType:
+ if ( !MainWindow::self->singleProjectMode() )
+ return formFile->formName() + ": " + formFile->fileName();
+ return formFile->formName();
+ case FormSourceType:
+ if ( !MainWindow::self->singleProjectMode() )
+ return formFile->codeFile();
+ return formFile->formName() + " [Source]";
+ case SourceFileType:
+ return sourceFile->fileName();
+ case ObjectType:
+ if ( !project->hasParentObject( object ) )
+ return object->name();
+ return project->qualifiedName( object );
+ }
+
+ return QString::null; // shut up compiler
+}
+
+void WorkspaceItem::fillCompletionList( QStringList& completion )
+{
+ switch( t ) {
+ case ProjectType:
+ break;
+ case FormFileType:
+ completion += formFile->formName();
+ completion += formFile->fileName();
+ break;
+ case FormSourceType:
+ completion += formFile->codeFile();
+ break;
+ case SourceFileType:
+ completion += sourceFile->fileName();
+ break;
+ case ObjectType:
+ completion += object->name();
+ }
+}
+
+bool WorkspaceItem::checkCompletion( const QString& completion )
+{
+ switch( t ) {
+ case ProjectType:
+ break;
+ case FormFileType:
+ return completion == formFile->formName()
+ || completion == formFile->fileName();
+ case FormSourceType:
+ return completion == formFile->codeFile();
+ case SourceFileType:
+ return completion == sourceFile->fileName();
+ case ObjectType:
+ return completion == object->name();
+ }
+ return FALSE;
+}
+
+
+bool WorkspaceItem::isModified() const
+{
+ switch( t ) {
+ case ProjectType:
+ return project->isModified();
+ case FormFileType:
+ return formFile->isModified( FormFile::WFormWindow );
+ case FormSourceType:
+ return formFile->isModified( FormFile::WFormCode );
+ case SourceFileType:
+ return sourceFile->isModified();
+ case ObjectType:
+ return project->fakeFormFileFor( object )->isModified();
+ break;
+ }
+ return FALSE; // shut up compiler
+}
+
+QString WorkspaceItem::key( int column, bool ) const
+{
+ QString key = text( column );
+ if ( t == FormFileType )
+ key.prepend( "0" );
+ else if ( t == ObjectType )
+ key.prepend( "a" );
+ else
+ key.prepend( "A" );
+ return key;
+}
+
+QColor WorkspaceItem::backgroundColor()
+{
+ bool b = useOddColor;
+ if ( t == FormSourceType && parent() )
+ b = ( ( WorkspaceItem*)parent() )->useOddColor;
+ return b ? *backColor2 : *backColor1;
+}
+
+
+void WorkspaceItem::setOpen( bool b )
+{
+ QListViewItem::setOpen( b );
+ autoOpen = FALSE;
+}
+
+void WorkspaceItem::setAutoOpen( bool b )
+{
+ QListViewItem::setOpen( b );
+ autoOpen = b;
+}
+
+Workspace::Workspace( QWidget *parent, MainWindow *mw )
+ : QListView( parent, 0, WStyle_Customize | WStyle_NormalBorder | WStyle_Title |
+ WStyle_Tool | WStyle_MinMax | WStyle_SysMenu ), mainWindow( mw ),
+ project( 0 ), completionDirty( FALSE )
+{
+ init_colors();
+
+ setDefaultRenameAction( Accept );
+ blockNewForms = FALSE;
+ bufferEdit = 0;
+ header()->setStretchEnabled( TRUE );
+ header()->hide();
+ setSorting( 0 );
+ setResizePolicy( QScrollView::Manual );
+#ifndef Q_WS_MAC
+ QPalette p( palette() );
+ p.setColor( QColorGroup::Base, QColor( *backColor2 ) );
+ (void)*selectedBack; // hack
+ setPalette( p );
+#endif
+ addColumn( tr( "Files" ) );
+ setAllColumnsShowFocus( TRUE );
+ connect( this, SIGNAL( mouseButtonClicked( int, QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( itemClicked( int, QListViewItem *, const QPoint& ) ) ),
+ connect( this, SIGNAL( doubleClicked( QListViewItem * ) ),
+ this, SLOT( itemDoubleClicked( QListViewItem * ) ) ),
+ connect( this, SIGNAL( contextMenuRequested( QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( rmbClicked( QListViewItem *, const QPoint& ) ) ),
+ setHScrollBarMode( AlwaysOff );
+ setVScrollBarMode( AlwaysOn );
+ viewport()->setAcceptDrops( TRUE );
+ setAcceptDrops( TRUE );
+ setColumnWidthMode( 1, Manual );
+}
+
+
+void Workspace::projectDestroyed( QObject* o )
+{
+ if ( o == project ) {
+ project = 0;
+ clear();
+ }
+}
+
+void Workspace::setCurrentProject( Project *pro )
+{
+ if ( project == pro )
+ return;
+ if ( project ) {
+ disconnect( project, SIGNAL( sourceFileAdded(SourceFile*) ), this, SLOT( sourceFileAdded(SourceFile*) ) );
+ disconnect( project, SIGNAL( sourceFileRemoved(SourceFile*) ), this, SLOT( sourceFileRemoved(SourceFile*) ) );
+ disconnect( project, SIGNAL( formFileAdded(FormFile*) ), this, SLOT( formFileAdded(FormFile*) ) );
+ disconnect( project, SIGNAL( formFileRemoved(FormFile*) ), this, SLOT( formFileRemoved(FormFile*) ) );
+ disconnect( project, SIGNAL( objectAdded(QObject*) ), this, SLOT( objectAdded(QObject*) ) );
+ disconnect( project, SIGNAL( objectRemoved(QObject*) ), this, SLOT( objectRemoved(QObject*) ) );
+ disconnect( project, SIGNAL( projectModified() ), this, SLOT( update() ) );
+ }
+ project = pro;
+ connect( project, SIGNAL( sourceFileAdded(SourceFile*) ), this, SLOT( sourceFileAdded(SourceFile*) ) );
+ connect( project, SIGNAL( sourceFileRemoved(SourceFile*) ), this, SLOT( sourceFileRemoved(SourceFile*) ) );
+ connect( project, SIGNAL( formFileAdded(FormFile*) ), this, SLOT( formFileAdded(FormFile*) ) );
+ connect( project, SIGNAL( formFileRemoved(FormFile*) ), this, SLOT( formFileRemoved(FormFile*) ) );
+ connect( project, SIGNAL( destroyed(QObject*) ), this, SLOT( projectDestroyed(QObject*) ) );
+ connect( project, SIGNAL( objectAdded(QObject*) ), this, SLOT( objectAdded(QObject*) ) );
+ connect( project, SIGNAL( objectRemoved(QObject*) ), this, SLOT( objectRemoved(QObject*) ) );
+ connect( project, SIGNAL( projectModified() ), this, SLOT( update() ) );
+ clear();
+
+ if ( bufferEdit )
+ bufferEdit->clear();
+
+ projectItem = new WorkspaceItem( this, project );
+
+ projectItem->setOpen( TRUE );
+
+ for ( QPtrListIterator<SourceFile> sources = project->sourceFiles();
+ sources.current(); ++sources ) {
+ SourceFile* f = sources.current();
+ (void) new WorkspaceItem( projectItem, f );
+ }
+
+ for ( QPtrListIterator<FormFile> forms = project->formFiles();
+ forms.current(); ++forms ) {
+ FormFile* f = forms.current();
+ if ( f->isFake() )
+ continue;
+
+ (void) new WorkspaceItem( projectItem, f );
+ }
+
+ QObjectList l = project->objects();
+ QObjectListIt objs( l );
+ for ( ;objs.current(); ++objs ) {
+ QObject* o = objs.current();
+ (void) new WorkspaceItem( projectItem, o, project );
+ }
+
+ updateColors();
+ completionDirty = TRUE;
+}
+
+void Workspace::sourceFileAdded( SourceFile* sf )
+{
+ (void) new WorkspaceItem( projectItem, sf );
+ updateColors();
+}
+
+void Workspace::sourceFileRemoved( SourceFile* sf )
+{
+ delete findItem( sf );
+ updateColors();
+}
+
+void Workspace::formFileAdded( FormFile* ff )
+{
+ if ( ff->isFake() )
+ return;
+ (void) new WorkspaceItem( projectItem, ff );
+ updateColors();
+}
+
+void Workspace::formFileRemoved( FormFile* ff )
+{
+ delete findItem( ff );
+ updateColors();
+}
+
+void Workspace::objectAdded( QObject *o )
+{
+ (void) new WorkspaceItem( projectItem, o, project );
+ updateColors();
+}
+
+void Workspace::objectRemoved( QObject *o )
+{
+ delete findItem( o );
+ updateColors();
+}
+
+void Workspace::update()
+{
+ completionDirty = TRUE;
+ triggerUpdate();
+}
+
+void Workspace::update( FormFile* ff )
+{
+ QListViewItem* i = findItem( ff );
+ if ( i ) {
+ i->repaint();
+ if ( (i = i->firstChild()) )
+ i->repaint();
+ }
+}
+
+
+void Workspace::activeFormChanged( FormWindow *fw )
+{
+ WorkspaceItem *i = findItem( fw->formFile() );
+ if ( i ) {
+ setCurrentItem( i );
+ setSelected( i, TRUE );
+ if ( !i->isOpen() )
+ i->setAutoOpen( TRUE );
+ }
+
+ closeAutoOpenItems();
+
+}
+
+void Workspace::activeEditorChanged( SourceEditor *se )
+{
+ if ( !se->object() )
+ return;
+
+ if ( se->formWindow() ) {
+ WorkspaceItem *i = findItem( se->formWindow()->formFile() );
+ if ( i && i->firstChild() ) {
+ if ( !i->isOpen() )
+ i->setAutoOpen( TRUE );
+ setCurrentItem( i->firstChild() );
+ setSelected( i->firstChild(), TRUE );
+ }
+ } else {
+ WorkspaceItem *i = findItem( se->sourceFile() );
+ if ( i ) {
+ setCurrentItem( i );
+ setSelected( i, TRUE );
+ }
+ }
+
+ closeAutoOpenItems();
+}
+
+WorkspaceItem *Workspace::findItem( FormFile* ff)
+{
+ QListViewItemIterator it( this );
+ for ( ; it.current(); ++it ) {
+ if ( ( (WorkspaceItem*)it.current() )->formFile == ff )
+ return (WorkspaceItem*)it.current();
+ }
+ return 0;
+}
+
+WorkspaceItem *Workspace::findItem( SourceFile *sf )
+{
+ QListViewItemIterator it( this );
+ for ( ; it.current(); ++it ) {
+ if ( ( (WorkspaceItem*)it.current() )->sourceFile == sf )
+ return (WorkspaceItem*)it.current();
+ }
+ return 0;
+}
+
+WorkspaceItem *Workspace::findItem( QObject *o )
+{
+ QListViewItemIterator it( this );
+ for ( ; it.current(); ++it ) {
+ if ( ( (WorkspaceItem*)it.current() )->object == o )
+ return (WorkspaceItem*)it.current();
+ }
+ return 0;
+}
+
+void Workspace::closeAutoOpenItems()
+{
+ QListViewItemIterator it( this );
+ for ( ; it.current(); ++it ) {
+ WorkspaceItem* i = (WorkspaceItem*) it.current();
+ WorkspaceItem* ip = (WorkspaceItem*) i->parent();
+ if ( i->type() == WorkspaceItem::FormSourceType ) {
+ if ( !i->isSelected() && !ip->isSelected()
+ && ip->isAutoOpen() ) {
+ ip->setAutoOpen( FALSE );
+ }
+ }
+ }
+}
+
+
+void Workspace::closeEvent( QCloseEvent *e )
+{
+ e->accept();
+}
+
+void Workspace::itemDoubleClicked( QListViewItem *i )
+{
+ if ( ( (WorkspaceItem*)i)->type()== WorkspaceItem::ProjectType )
+ i->setOpen( TRUE );
+}
+
+void Workspace::itemClicked( int button, QListViewItem *i, const QPoint& )
+{
+ if ( !i || button != LeftButton )
+ return;
+
+ closeAutoOpenItems();
+
+ WorkspaceItem* wi = (WorkspaceItem*)i;
+ switch( wi->type() ) {
+ case WorkspaceItem::ProjectType:
+ break; // ### TODO
+ case WorkspaceItem::FormFileType:
+ wi->formFile->showFormWindow();
+ break;
+ case WorkspaceItem::FormSourceType:
+ wi->formFile->showEditor( FALSE );
+ break;
+ case WorkspaceItem::SourceFileType:
+ mainWindow->editSource( wi->sourceFile );
+ break;
+ case WorkspaceItem::ObjectType:
+ project->fakeFormFileFor( wi->object )->formWindow()->setFocus();
+ mainWindow->propertyeditor()->setWidget( wi->object,
+ project->fakeFormFileFor( wi->object )->formWindow() );
+ mainWindow->objectHierarchy()->
+ setFormWindow( project->fakeFormFileFor( wi->object )->formWindow(), wi->object );
+ project->fakeFormFileFor( wi->object )->showEditor();
+ break;
+ }
+}
+
+void Workspace::contentsDropEvent( QDropEvent *e )
+{
+ if ( !QUriDrag::canDecode( e ) ) {
+ e->ignore();
+ } else {
+ QStringList files;
+ QUriDrag::decodeLocalFiles( e, files );
+ if ( !files.isEmpty() ) {
+ for ( QStringList::Iterator it = files.begin(); it != files.end(); ++it ) {
+ QString fn = *it;
+ mainWindow->fileOpen( "", "", fn );
+ }
+ }
+ }
+}
+
+void Workspace::contentsDragEnterEvent( QDragEnterEvent *e )
+{
+ if ( !QUriDrag::canDecode( e ) )
+ e->ignore();
+ else
+ e->accept();
+}
+
+void Workspace::contentsDragMoveEvent( QDragMoveEvent *e )
+{
+ if ( !QUriDrag::canDecode( e ) )
+ e->ignore();
+ else
+ e->accept();
+}
+
+void Workspace::rmbClicked( QListViewItem *i, const QPoint& pos )
+{
+ if ( !i )
+ return;
+ WorkspaceItem* wi = (WorkspaceItem*)i;
+ enum { OPEN_SOURCE, REMOVE_SOURCE, OPEN_FORM, REMOVE_FORM,
+ OPEN_FORM_SOURCE, REMOVE_FORM_SOURCE, OPEN_OBJECT_SOURCE };
+ QPopupMenu menu( this );
+ menu.setCheckable( TRUE );
+ switch ( wi->type() ) {
+ case WorkspaceItem::SourceFileType:
+ menu.insertItem( tr( "&Open source file" ), OPEN_SOURCE );
+ menu.insertSeparator();
+ menu.insertItem( QPixmap::fromMimeSource( "designer_editcut.png" ),
+ tr( "&Remove source file from project" ), REMOVE_SOURCE );
+ break;
+ case WorkspaceItem::FormFileType:
+ menu.insertItem( tr( "&Open form" ), OPEN_FORM );
+ menu.insertSeparator();
+ menu.insertItem( QPixmap::fromMimeSource( "designer_editcut.png" ),
+ tr( "&Remove form from project" ), REMOVE_FORM );
+ break;
+ case WorkspaceItem::FormSourceType:
+ menu.insertItem( tr( "&Open form source" ), OPEN_FORM_SOURCE );
+ menu.insertSeparator();
+ if ( project->isCpp() )
+ menu.insertItem( QPixmap::fromMimeSource( "designer_editcut.png" ),
+ tr( "&Remove source file from form" ), REMOVE_FORM_SOURCE );
+ else
+ menu.insertItem( QPixmap::fromMimeSource( "designer_editcut.png" ),
+ tr( "&Remove form from project" ), REMOVE_FORM );
+ break;
+ case WorkspaceItem::ProjectType:
+ MainWindow::self->popupProjectMenu( pos );
+ return;
+ case WorkspaceItem::ObjectType:
+ menu.insertItem( tr( "&Open source" ), OPEN_OBJECT_SOURCE );
+ break;
+ }
+
+ switch ( menu.exec( pos ) ) {
+ case REMOVE_SOURCE:
+ project->removeSourceFile( wi->sourceFile );
+ break;
+ case REMOVE_FORM:
+ project->removeFormFile( wi->formFile );
+ break;
+ case REMOVE_FORM_SOURCE:
+ ( (WorkspaceItem*)i )->formFile->setModified( TRUE );
+ ( (WorkspaceItem*)i )->formFile->setCodeFileState( FormFile::Deleted );
+ delete ( (WorkspaceItem*)i )->formFile->editor();
+ break;
+ case OPEN_OBJECT_SOURCE:
+ case OPEN_SOURCE:
+ case OPEN_FORM:
+ case OPEN_FORM_SOURCE:
+ itemClicked( LeftButton, i, pos );
+ break;
+ }
+}
+
+bool Workspace::eventFilter( QObject *o, QEvent * e )
+{
+ // Reggie, on what type of events do we have to execute updateBufferEdit()
+ if ( o ==bufferEdit && e->type() != QEvent::ChildRemoved )
+ updateBufferEdit();
+ return QListView::eventFilter( o, e );
+}
+
+void Workspace::setBufferEdit( QCompletionEdit *edit )
+{
+ bufferEdit = edit;
+ connect( bufferEdit, SIGNAL( chosen( const QString & ) ),
+ this, SLOT( bufferChosen( const QString & ) ) );
+ bufferEdit->installEventFilter( this );
+}
+
+void Workspace::updateBufferEdit()
+{
+ if ( !bufferEdit || !completionDirty || !MainWindow::self)
+ return;
+ completionDirty = FALSE;
+ QStringList completion = MainWindow::self->projectFileNames();
+ QListViewItemIterator it( this );
+ while ( it.current() ) {
+ ( (WorkspaceItem*)it.current())->fillCompletionList( completion );
+ ++it;
+ }
+ completion.sort();
+ bufferEdit->setCompletionList( completion );
+}
+
+void Workspace::bufferChosen( const QString &buffer )
+{
+ if ( bufferEdit )
+ bufferEdit->setText( "" );
+
+ if ( MainWindow::self->projectFileNames().contains( buffer ) ) {
+ MainWindow::self->setCurrentProjectByFilename( buffer );
+ return;
+ }
+
+ QListViewItemIterator it( this );
+ while ( it.current() ) {
+ if ( ( (WorkspaceItem*)it.current())->checkCompletion( buffer ) ) {
+ itemClicked( LeftButton, it.current(), QPoint() );
+ break;
+ }
+ ++it;
+ }
+}
+
+void Workspace::updateColors()
+{
+ QListViewItem* i = firstChild();
+ if ( i )
+ i = i->firstChild();
+ bool b = TRUE;
+ while ( i ) {
+ WorkspaceItem* wi = ( WorkspaceItem*) i;
+ i = i->nextSibling();
+ wi->useOddColor = b;
+ b = !b;
+ }
+}
diff --git a/tools/designer/designer/workspace.h b/tools/designer/designer/workspace.h
new file mode 100644
index 0000000..46a0bac
--- /dev/null
+++ b/tools/designer/designer/workspace.h
@@ -0,0 +1,158 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef WORKSPACE_H
+#define WORKSPACE_H
+
+#include <qlistview.h>
+
+class FormWindow;
+class QResizeEvent;
+class QCloseEvent;
+class QDropEvent;
+class QDragMoveEvent;
+class QDragEnterEvent;
+class MainWindow;
+class Project;
+class SourceFile;
+class FormFile;
+class QCompletionEdit;
+class SourceEditor;
+
+class WorkspaceItem : public QListViewItem
+{
+public:
+ enum Type { ProjectType, FormFileType, FormSourceType, SourceFileType, ObjectType };
+
+ WorkspaceItem( QListView *parent, Project* p );
+ WorkspaceItem( QListViewItem *parent, SourceFile* sf );
+ WorkspaceItem( QListViewItem *parent, FormFile* ff, Type t = FormFileType );
+ WorkspaceItem( QListViewItem *parent, QObject *o, Project *p );
+
+ void paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int align );
+
+ Type type() const { return t; }
+
+ bool isModified() const;
+
+ QString text( int ) const;
+
+ void fillCompletionList( QStringList& completion );
+ bool checkCompletion( const QString& completion );
+
+ QString key( int, bool ) const; // column sorting key
+
+ Project* project;
+ SourceFile* sourceFile;
+ FormFile* formFile;
+ QObject *object;
+
+ void setOpen( bool );
+
+ void setAutoOpen( bool );
+ bool isAutoOpen() const { return isOpen() && autoOpen; }
+
+ bool useOddColor;
+
+private:
+ void init();
+ bool autoOpen;
+ QColor backgroundColor();
+ Type t;
+};
+
+class Workspace : public QListView
+{
+ Q_OBJECT
+
+public:
+ Workspace( QWidget *parent , MainWindow *mw );
+
+ void setCurrentProject( Project *pro );
+
+ void contentsDropEvent( QDropEvent *e );
+ void contentsDragEnterEvent( QDragEnterEvent *e );
+ void contentsDragMoveEvent( QDragMoveEvent *e );
+
+ void setBufferEdit( QCompletionEdit *edit );
+
+public slots:
+
+ void update();
+ void update( FormFile* );
+
+ void activeFormChanged( FormWindow *fw );
+ void activeEditorChanged( SourceEditor *se );
+
+protected:
+ void closeEvent( QCloseEvent *e );
+ bool eventFilter( QObject *, QEvent * );
+
+
+private slots:
+ void itemClicked( int, QListViewItem *i, const QPoint& pos );
+ void itemDoubleClicked( QListViewItem *i );
+ void rmbClicked( QListViewItem *i, const QPoint& pos );
+ void bufferChosen( const QString &buffer );
+
+ void projectDestroyed( QObject* );
+
+ void sourceFileAdded( SourceFile* );
+ void sourceFileRemoved( SourceFile* );
+
+ void formFileAdded( FormFile* );
+ void formFileRemoved( FormFile* );
+
+ void objectAdded( QObject* );
+ void objectRemoved( QObject * );
+
+private:
+ WorkspaceItem *findItem( FormFile *ff );
+ WorkspaceItem *findItem( SourceFile *sf );
+ WorkspaceItem *findItem( QObject *o );
+
+ void closeAutoOpenItems();
+
+private:
+ MainWindow *mainWindow;
+ Project *project;
+ WorkspaceItem *projectItem;
+ QCompletionEdit *bufferEdit;
+ bool blockNewForms;
+ void updateBufferEdit();
+ bool completionDirty;
+ void updateColors();
+
+};
+
+#endif
diff --git a/tools/designer/editor/arghintwidget.cpp b/tools/designer/editor/arghintwidget.cpp
new file mode 100644
index 0000000..9d600f6
--- /dev/null
+++ b/tools/designer/editor/arghintwidget.cpp
@@ -0,0 +1,239 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "arghintwidget.h"
+#include <qbutton.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+
+static const char * left_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+" ",
+" ",
+" + ",
+" ++ ",
+" +++ ",
+" ++++ ",
+" +++++ ",
+" ++++++ ",
+" ++++++ ",
+" +++++ ",
+" ++++ ",
+" +++ ",
+" ++ ",
+" + ",
+" ",
+" "};
+
+static const char * right_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+" ",
+" ",
+" + ",
+" ++ ",
+" +++ ",
+" ++++ ",
+" +++++ ",
+" ++++++ ",
+" ++++++ ",
+" +++++ ",
+" ++++ ",
+" +++ ",
+" ++ ",
+" + ",
+" ",
+" "};
+
+static const char * left_disabled_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #FFFFFF",
+"+ c darkgray",
+" ",
+" ",
+" + ",
+" ++ ",
+" +++ ",
+" ++++ ",
+" +++++ ",
+" ++++++ ",
+" ++++++ ",
+" +++++ ",
+" ++++ ",
+" +++ ",
+" ++ ",
+" + ",
+" ",
+" "};
+
+static const char * right_disabled_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #FFFFFF",
+"+ c darkgray",
+" ",
+" ",
+" + ",
+" ++ ",
+" +++ ",
+" ++++ ",
+" +++++ ",
+" ++++++ ",
+" ++++++ ",
+" +++++ ",
+" ++++ ",
+" +++ ",
+" ++ ",
+" + ",
+" ",
+" "};
+
+class ArrowButton : public QButton
+{
+ Q_OBJECT
+
+public:
+ enum Dir { Left, Right };
+
+ ArrowButton( QWidget *parent, const char *name, Dir d );
+ void drawButton( QPainter *p );
+
+private:
+ QPixmap pix, pix_disabled;
+
+};
+
+ArrowButton::ArrowButton( QWidget *parent, const char *name, Dir d )
+ : QButton( parent, name )
+{
+ setFixedSize( 16, 16 );
+ if ( d == Left ) {
+ pix = QPixmap( left_xpm );
+ pix_disabled = QPixmap( left_disabled_xpm );
+ } else {
+ pix = QPixmap( right_xpm );
+ pix_disabled = QPixmap( right_disabled_xpm );
+ }
+}
+
+void ArrowButton::drawButton( QPainter *p )
+{
+ if ( isDown() )
+ p->fillRect( 0, 0, width(), height(), darkGray );
+ else
+ p->fillRect( 0, 0, width(), height(), lightGray );
+ if ( isEnabled() )
+ p->drawPixmap( 0, 0, pix );
+ else
+ p->drawPixmap( 0, 0, pix_disabled );
+}
+
+
+ArgHintWidget::ArgHintWidget( QWidget *parent, const char*name )
+ : QFrame( parent, name, WType_Popup ), curFunc( 0 ), numFuncs( 0 )
+{
+ setFrameStyle( QFrame::Box | QFrame::Plain );
+ setLineWidth( 1 );
+ setBackgroundColor( white );
+ QHBoxLayout *hbox = new QHBoxLayout( this );
+ hbox->setMargin( 1 );
+ hbox->addWidget( ( prev = new ArrowButton( this, "editor_left_btn", ArrowButton::Left ) ) );
+ hbox->addWidget( ( funcLabel = new QLabel( this, "editor_func_lbl" ) ) );
+ hbox->addWidget( ( next = new ArrowButton( this, "editor_right_btn", ArrowButton::Right ) ) );
+ funcLabel->setBackgroundColor( white );
+ funcLabel->setAlignment( AlignCenter );
+ connect( prev, SIGNAL( clicked() ), this, SLOT( gotoPrev() ) );
+ connect( next, SIGNAL( clicked() ), this, SLOT( gotoNext() ) );
+ updateState();
+ setFocusPolicy( NoFocus );
+ prev->setFocusPolicy( NoFocus );
+ next->setFocusPolicy( NoFocus );
+ funcLabel->setFocusPolicy( NoFocus );
+}
+
+void ArgHintWidget::setFunctionText( int func, const QString &text )
+{
+ funcs.replace( func, text );
+ if ( func == curFunc ) {
+ funcLabel->clear();
+ funcLabel->setText( text );
+ }
+}
+
+void ArgHintWidget::setNumFunctions( int num )
+{
+ funcs.clear();
+ numFuncs = num;
+ curFunc = 0;
+ updateState();
+}
+
+void ArgHintWidget::gotoPrev()
+{
+ if ( curFunc > 0 ) {
+ curFunc--;
+ funcLabel->setText( funcs[ curFunc ] );
+ updateState();
+ }
+}
+
+void ArgHintWidget::gotoNext()
+{
+ if ( curFunc < numFuncs - 1 ) {
+ curFunc++;
+ funcLabel->setText( funcs[ curFunc ] );
+ updateState();
+ }
+}
+
+void ArgHintWidget::updateState()
+{
+ prev->setEnabled( curFunc > 0 );
+ next->setEnabled( curFunc < numFuncs - 1 );
+}
+
+void ArgHintWidget::relayout()
+{
+ funcLabel->setText( "" );
+ funcLabel->setText( funcs[ curFunc ] );
+}
+
+#include "arghintwidget.moc"
diff --git a/tools/designer/editor/arghintwidget.h b/tools/designer/editor/arghintwidget.h
new file mode 100644
index 0000000..79a4ed6
--- /dev/null
+++ b/tools/designer/editor/arghintwidget.h
@@ -0,0 +1,69 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef ARGHINTWIDGET_H
+#define ARGHINTWIDGET_H
+
+#include <qframe.h>
+
+class QLabel;
+class ArrowButton;
+
+class ArgHintWidget : public QFrame
+{
+ Q_OBJECT
+
+public:
+ ArgHintWidget( QWidget *parent, const char*name );
+
+ void setFunctionText( int func, const QString &text );
+ void setNumFunctions( int num );
+
+public slots:
+ void relayout();
+ void gotoPrev();
+ void gotoNext();
+
+private:
+ void updateState();
+
+private:
+ int curFunc;
+ int numFuncs;
+ QMap<int, QString> funcs;
+ QLabel *funcLabel;
+ ArrowButton *prev, *next;
+
+};
+
+#endif
diff --git a/tools/designer/editor/browser.cpp b/tools/designer/editor/browser.cpp
new file mode 100644
index 0000000..9d8d818
--- /dev/null
+++ b/tools/designer/editor/browser.cpp
@@ -0,0 +1,149 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "browser.h"
+#include "editor.h"
+#include <private/qrichtext_p.h>
+
+
+EditorBrowser::EditorBrowser( Editor *e )
+ : curEditor( e ), oldHighlightedParag( 0 )
+{
+ curEditor = e;
+
+ // ### disabled for now
+// curEditor->viewport()->installEventFilter( this );
+// curEditor->installEventFilter( this );
+
+ QFont fn( curEditor->font() );
+ fn.setUnderline( TRUE );
+ highlightedFormat = new QTextFormat( fn, blue );
+}
+
+EditorBrowser::~EditorBrowser()
+{
+ delete highlightedFormat;
+}
+
+bool EditorBrowser::eventFilter( QObject *o, QEvent *e )
+{
+ if ( ::qt_cast<Editor*>(o->parent()) || ::qt_cast<Editor*>(o) ) {
+ QMouseEvent *me;
+ QKeyEvent *ke;
+ switch ( e->type() ) {
+ case QEvent::MouseMove:
+ me = (QMouseEvent*)e;
+ if ( ( me->state() & ControlButton ) == ControlButton ) {
+ curEditor->viewport()->setCursor( pointingHandCursor );
+ QTextCursor c( curEditor->document() );
+ curEditor->placeCursor( curEditor->viewportToContents( me->pos() ), &c );
+ QTextCursor from, to;
+ if ( oldHighlightedParag ) {
+ oldHighlightedParag->setEndState( -1 );
+ oldHighlightedParag->format();
+ oldHighlightedParag = 0;
+ }
+ if ( findCursor( c, from, to ) && from.paragraph() == to.paragraph() ) {
+ // avoid collision with other selections
+ for ( int i = 0; i < curEditor->document()->numSelections(); ++i )
+ curEditor->document()->removeSelection( i );
+ from.paragraph()->setFormat( from.index(), to.index() - from.index() + 1, highlightedFormat, FALSE );
+ lastWord = from.paragraph()->string()->toString().mid( from.index(), to.index() - from.index() + 1 );
+ oldHighlightedParag = from.paragraph();
+ } else {
+ lastWord = "";
+ }
+ curEditor->repaintChanged();
+ return TRUE;
+ }
+ break;
+ case QEvent::MouseButtonPress: {
+ bool killEvent = !lastWord.isEmpty();
+ if ( !lastWord.isEmpty() )
+ showHelp( lastWord );
+ lastWord = "";
+ curEditor->viewport()->setCursor( ibeamCursor );
+ if ( oldHighlightedParag ) {
+ oldHighlightedParag->setEndState( -1 );
+ oldHighlightedParag->format();
+ curEditor->repaintChanged();
+ oldHighlightedParag = 0;
+ }
+ if ( killEvent )
+ return TRUE;
+ } break;
+ case QEvent::KeyRelease:
+ lastWord = "";
+ ke = (QKeyEvent*)e;
+ if ( ke->key() == Key_Control ) {
+ curEditor->viewport()->setCursor( ibeamCursor );
+ if ( oldHighlightedParag ) {
+ oldHighlightedParag->setEndState( -1 );
+ oldHighlightedParag->format();
+ curEditor->repaintChanged();
+ oldHighlightedParag = 0;
+ }
+ }
+ default:
+ break;
+ }
+ }
+ return FALSE;
+}
+
+void EditorBrowser::setCurrentEdior( Editor *e )
+{
+ curEditor = e;
+ curEditor->installEventFilter( this );
+}
+
+void EditorBrowser::addEditor( Editor *e )
+{
+ e->installEventFilter( this );
+}
+
+bool EditorBrowser::findCursor( const QTextCursor &c, QTextCursor &from, QTextCursor &to )
+{
+ from = c;
+ while ( from.paragraph()->at( from.index() )->c != ' ' && from.paragraph()->at( from.index() )->c != '\t' && from.index() > 0 )
+ from.gotoLeft();
+ if ( from.paragraph()->at( from.index() )->c == ' ' || from.paragraph()->at( from.index() )->c == '\t' )
+ from.gotoRight();
+ to = c;
+ while ( to.paragraph()->at( to.index() )->c != ' ' && to.paragraph()->at( to.index() )->c != '\t' &&
+ to.index() < to.paragraph()->length() - 1 )
+ to.gotoRight();
+ if ( to.paragraph()->at( to.index() )->c == ' ' || to.paragraph()->at( to.index() )->c == '\t' )
+ to.gotoLeft();
+ return TRUE;
+}
diff --git a/tools/designer/editor/browser.h b/tools/designer/editor/browser.h
new file mode 100644
index 0000000..a90a9df
--- /dev/null
+++ b/tools/designer/editor/browser.h
@@ -0,0 +1,66 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef BROWSER_H
+#define BROWSER_H
+
+#include <qobject.h>
+
+class Editor;
+class QTextCursor;
+class QTextParagraph;
+class QTextFormat;
+
+class EditorBrowser : public QObject
+{
+ Q_OBJECT
+
+public:
+ EditorBrowser( Editor *e );
+ ~EditorBrowser();
+
+ bool eventFilter( QObject *o, QEvent *e );
+ virtual void setCurrentEdior( Editor *e );
+ virtual void addEditor( Editor *e );
+ virtual bool findCursor( const QTextCursor &c, QTextCursor &from, QTextCursor &to );
+ virtual void showHelp( const QString & ) {}
+
+protected:
+ Editor *curEditor;
+ QTextParagraph *oldHighlightedParag;
+ QString lastWord;
+ QTextFormat *highlightedFormat;
+
+};
+
+#endif
diff --git a/tools/designer/editor/cindent.cpp b/tools/designer/editor/cindent.cpp
new file mode 100644
index 0000000..545c374
--- /dev/null
+++ b/tools/designer/editor/cindent.cpp
@@ -0,0 +1,163 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "cindent.h"
+#include "qregexp.h"
+
+extern int indentForBottomLine( const QStringList& program, QChar typedIn );
+extern void setTabSize( int s );
+extern void setIndentSize( int s );
+
+CIndent::CIndent()
+ : QTextIndent(), tabSize( 8 ), indentSize( 4 ),
+ autoIndent( TRUE ), keepTabs( TRUE ), lastDoc( 0 )
+{
+}
+
+static int indentation( const QString &s )
+{
+ if ( s.simplifyWhiteSpace().length() == 0 )
+ return 0;
+ int i = 0;
+ int ind = 0;
+ while ( i < (int)s.length() ) {
+ QChar c = s.at( i );
+ if ( c == ' ' )
+ ind++;
+ else if ( c == '\t' )
+ ind += 8;
+ else
+ break;
+ ++i;
+ }
+ return ind;
+}
+
+void CIndent::tabify( QString &s )
+{
+ if ( !keepTabs )
+ return;
+ int i = 0;
+ for ( ;; ) {
+ for ( int j = i; j < (int)s.length(); ++j ) {
+ if ( s[ j ] != ' ' && s[ j ] != '\t' ) {
+ if ( j > i ) {
+ QString t = s.mid( i, j - i );
+ int spaces = 0;
+ for ( int k = 0; k < (int)t.length(); ++k )
+ spaces += ( t[ k ] == ' ' ? 1 : tabSize );
+ s.remove( i, t.length() );
+ int tabs = spaces / tabSize;
+ spaces = spaces - ( tabSize * tabs );
+ QString tmp;
+ tmp.fill( ' ', spaces );
+ if ( spaces > 0 )
+ s.insert( i, tmp );
+ tmp.fill( '\t', tabs );
+ if ( tabs > 0 )
+ s.insert( i, tmp );
+ }
+ break;
+ }
+ }
+ i = s.find( '\n', i );
+ if ( i == -1 )
+ break;
+ ++i;
+ }
+}
+
+void CIndent::indentLine( QTextParagraph *p, int &oldIndent, int &newIndent )
+{
+ QString indentString;
+ indentString.fill( ' ', newIndent );
+ indentString.append( "a" );
+ tabify( indentString );
+ indentString.remove( indentString.length() - 1, 1 );
+ newIndent = indentString.length();
+ oldIndent = 0;
+ while ( p->length() > 0 && ( p->at( 0 )->c == ' ' || p->at( 0 )->c == '\t' ) ) {
+ ++oldIndent;
+ p->remove( 0, 1 );
+ }
+ if ( p->string()->length() == 0 )
+ p->append( " " );
+ if ( !indentString.isEmpty() )
+ p->insert( 0, indentString );
+}
+
+
+void CIndent::indent( QTextDocument *doc, QTextParagraph *p, int *oldIndent, int *newIndent )
+{
+ lastDoc = doc;
+ int oi = indentation( p->string()->toString() );
+ QStringList code;
+ QTextParagraph *parag = doc->firstParagraph();
+ while ( parag ) {
+ code << parag->string()->toString();
+ if ( parag == p )
+ break;
+ parag = parag->next();
+ }
+
+ int ind = indentForBottomLine( code, QChar::null );
+ indentLine( p, oi, ind );
+ if ( oldIndent )
+ *oldIndent = oi;
+ if ( newIndent )
+ *newIndent = ind;
+}
+
+void CIndent::reindent()
+{
+ if ( !lastDoc )
+ return;
+ // #### this is sloooooooow (O(n^2))
+ QTextParagraph *parag = lastDoc->firstParagraph();
+ while ( parag ) {
+ indent( lastDoc, parag, 0, 0 );
+ parag = parag->next();
+ }
+}
+
+void CIndent::setTabSize( int ts )
+{
+ tabSize = ts;
+ ::setTabSize( ts );
+}
+
+void CIndent::setIndentSize( int is )
+{
+ indentSize = is;
+ ::setIndentSize( is );
+}
diff --git a/tools/designer/editor/cindent.h b/tools/designer/editor/cindent.h
new file mode 100644
index 0000000..b184049
--- /dev/null
+++ b/tools/designer/editor/cindent.h
@@ -0,0 +1,63 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef CINDENT_H
+#define CINDENT_H
+
+#include <private/qrichtext_p.h>
+
+class CIndent : public QTextIndent
+{
+public:
+ CIndent();
+ virtual ~CIndent() {}
+ void indent( QTextDocument *doc, QTextParagraph *parag, int *oldIndent, int *newIndent );
+
+ void setTabSize( int ts );
+ void setIndentSize( int is );
+ void setAutoIndent( bool ai ) { autoIndent = ai; reindent(); }
+ void setKeepTabs( bool kt ) { keepTabs = kt; }
+
+private:
+ void reindent();
+ void indentLine( QTextParagraph *p, int &oldIndent, int &newIndent );
+ void tabify( QString &s );
+
+public:
+ int tabSize, indentSize;
+ bool autoIndent, keepTabs;
+ QTextDocument *lastDoc;
+
+};
+
+#endif
diff --git a/tools/designer/editor/completion.cpp b/tools/designer/editor/completion.cpp
new file mode 100644
index 0000000..9ab09fa
--- /dev/null
+++ b/tools/designer/editor/completion.cpp
@@ -0,0 +1,714 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "completion.h"
+#include "paragdata.h"
+#include "editor.h"
+#include <qlistbox.h>
+#include <qvbox.h>
+#include <qmap.h>
+#include <private/qrichtext_p.h>
+#include <qapplication.h>
+#include <qregexp.h>
+#include "arghintwidget.h"
+#include <qsizegrip.h>
+#include <qtimer.h>
+
+static QColor getColor( const QString &type )
+{
+ if ( type == "function" || type == "slot" || type == "package" )
+ return Qt::blue;
+ else if ( type == "variable" || type == "widget" || type == "dir" )
+ return Qt::darkRed;
+ else if ( type == "object" || type == "class" )
+ return Qt::darkBlue;
+ else if ( type == "property" )
+ return Qt::darkGreen;
+ else if ( type == "enum" )
+ return Qt::darkYellow;
+ return Qt::black;
+}
+
+class CompletionItem : public QListBoxItem
+{
+public:
+ CompletionItem( QListBox *lb, const QString &txt, const QString &t, const QString &p,
+ const QString &pre, const QString &p2 )
+ : QListBoxItem( lb ), type( t ), postfix( p ), prefix( pre ), postfix2( p2 ),
+ parag( 0 ), lastState( FALSE ) { setText( txt ); }
+ ~CompletionItem() { delete parag; }
+ void paint( QPainter *painter ) {
+ if ( lastState != isSelected() ) {
+ delete parag;
+ parag = 0;
+ }
+ lastState = isSelected();
+ if ( !parag )
+ setupParagraph();
+ parag->paint( *painter, listBox()->colorGroup() );
+ }
+
+ int height( const QListBox * ) const {
+ if ( !parag )
+ ( (CompletionItem*)this )->setupParagraph();
+ return parag->rect().height();
+ }
+ int width( const QListBox * ) const {
+ if ( !parag )
+ ( (CompletionItem*)this )->setupParagraph();
+ return parag->rect().width() - 2;
+ }
+ QString text() const { return QListBoxItem::text() + postfix; }
+
+private:
+ void setupParagraph();
+ QString type, postfix, prefix, postfix2;
+ QTextParagraph *parag;
+ bool lastState;
+
+};
+
+void CompletionItem::setupParagraph() {
+ if ( !parag ) {
+ QTextFormatter *formatter;
+ formatter = new QTextFormatterBreakWords;
+ formatter->setWrapEnabled( FALSE );
+ parag = new QTextParagraph( 0 );
+ parag->setTabStops( listBox()->fontMetrics().width( "propertyXXXX" ) );
+ parag->pseudoDocument()->pFormatter = formatter;
+ parag->insert( 0, " " + type + ( type.isEmpty() ? " " : "\t" ) + prefix +
+ QListBoxItem::text() + postfix + postfix2 );
+ bool selCol = isSelected() && listBox()->colorGroup().highlightedText() != listBox()->colorGroup().text();
+ QColor sc = selCol ? listBox()->colorGroup().highlightedText() : getColor( type );
+ QTextFormat *f1 = parag->formatCollection()->format( listBox()->font(), sc );
+ QTextFormat *f3 = parag->formatCollection()->format( listBox()->font(), isSelected() ?
+ listBox()->colorGroup().highlightedText() :
+ listBox()->colorGroup().text() );
+ QFont f( listBox()->font() );
+ f.setBold( TRUE );
+ QTextFormat *f2 =
+ parag->formatCollection()->format( f, isSelected() ? listBox()->colorGroup().highlightedText() :
+ listBox()->colorGroup().text() );
+ parag->setFormat( 1, type.length() + 1, f1 );
+ parag->setFormat( type.length() + 2, prefix.length() + QListBoxItem::text().length(), f2 );
+ if ( !postfix.isEmpty() )
+ parag->setFormat( type.length() + 2 + prefix.length() + QListBoxItem::text().length(),
+ postfix.length(), f3 );
+ parag->setFormat( type.length() + 2 + prefix.length() + QListBoxItem::text().length() + postfix.length(),
+ postfix2.length(), f3 );
+ f1->removeRef();
+ f2->removeRef();
+ f3->removeRef();
+ parag->format();
+ }
+}
+
+
+EditorCompletion::EditorCompletion( Editor *e )
+{
+ enabled = TRUE;
+ lastDoc = 0;
+ completionPopup = new QVBox( e->topLevelWidget(), 0, WType_Popup );
+ completionPopup->setFrameStyle( QFrame::Box | QFrame::Plain );
+ completionPopup->setLineWidth( 1 );
+ functionLabel = new ArgHintWidget( e->topLevelWidget(), "editor_function_lbl" );
+ functionLabel->hide();
+ completionListBox = new QListBox( completionPopup, "editor_completion_lb" );
+ completionListBox->setFrameStyle( QFrame::NoFrame );
+ completionListBox->installEventFilter( this );
+ completionListBox->setHScrollBarMode( QScrollView::AlwaysOn );
+ completionListBox->setVScrollBarMode( QScrollView::AlwaysOn );
+ completionListBox->setCornerWidget( new QSizeGrip( completionListBox, "editor_cornerwidget" ) );
+ completionPopup->installEventFilter( this );
+ functionLabel->installEventFilter( this );
+ completionPopup->setFocusProxy( completionListBox );
+ completionOffset = 0;
+ curEditor = e;
+ curEditor->installEventFilter( this );
+}
+
+EditorCompletion::~EditorCompletion()
+{
+ delete completionPopup;
+ delete functionLabel;
+}
+
+void EditorCompletion::addCompletionEntry( const QString &s, QTextDocument *, bool strict )
+{
+ QChar key( s[ 0 ] );
+ QMap<QChar, QStringList>::Iterator it = completionMap.find( key );
+ if ( it == completionMap.end() ) {
+ completionMap.insert( key, QStringList( s ) );
+ } else {
+ if ( strict ) {
+ QStringList::Iterator sit;
+ for ( sit = (*it).begin(); sit != (*it).end(); ) {
+ QStringList::Iterator it2 = sit;
+ ++sit;
+ if ( (*it2).length() > s.length() && (*it2).left( s.length() ) == s ) {
+ if ( (*it2)[ (int)s.length() ].isLetter() && (*it2)[ (int)s.length() ].upper() != (*it2)[ (int)s.length() ] )
+ return;
+ } else if ( s.length() > (*it2).length() && s.left( (*it2).length() ) == *it2 ) {
+ if ( s[ (int)(*it2).length() ].isLetter() && s[ (int)(*it2).length() ].upper() != s[ (int)(*it2).length() ] )
+ (*it).remove( it2 );
+ }
+ }
+ }
+ (*it).append( s );
+ }
+}
+
+QValueList<CompletionEntry> EditorCompletion::completionList( const QString &s, QTextDocument *doc ) const
+{
+ if ( doc )
+ ( (EditorCompletion*)this )->updateCompletionMap( doc );
+
+ QChar key( s[ 0 ] );
+ QMap<QChar, QStringList>::ConstIterator it = completionMap.find( key );
+ if ( it == completionMap.end() )
+ return QValueList<CompletionEntry>();
+ QStringList::ConstIterator it2 = (*it).begin();
+ QValueList<CompletionEntry> lst;
+ int len = s.length();
+ for ( ; it2 != (*it).end(); ++it2 ) {
+ CompletionEntry c;
+ c.type = "";
+ c.text = *it2;
+ c.postfix = "";
+ c.prefix = "";
+ c.postfix2 = "";
+ if ( (int)(*it2).length() > len && (*it2).left( len ) == s && lst.find( c ) == lst.end() )
+ lst << c;
+ }
+
+ return lst;
+}
+
+void EditorCompletion::updateCompletionMap( QTextDocument *doc )
+{
+ bool strict = TRUE;
+ if ( doc != lastDoc )
+ strict = FALSE;
+ lastDoc = doc;
+ QTextParagraph *s = doc->firstParagraph();
+ if ( !s->extraData() )
+ s->setExtraData( new ParagData );
+ while ( s ) {
+ if ( s->length() == ( (ParagData*)s->extraData() )->lastLengthForCompletion ) {
+ s = s->next();
+ continue;
+ }
+
+ QChar c;
+ QString buffer;
+ for ( int i = 0; i < s->length(); ++i ) {
+ c = s->at( i )->c;
+ if ( c.isLetter() || c.isNumber() || c == '_' || c == '#' ) {
+ buffer += c;
+ } else {
+ addCompletionEntry( buffer, doc, strict );
+ buffer = QString::null;
+ }
+ }
+ if ( !buffer.isEmpty() )
+ addCompletionEntry( buffer, doc, strict );
+
+ ( (ParagData*)s->extraData() )->lastLengthForCompletion = s->length();
+ s = s->next();
+ }
+}
+
+bool EditorCompletion::doCompletion()
+{
+ searchString = "";
+ if ( !curEditor )
+ return FALSE;
+
+ QTextCursor *cursor = curEditor->textCursor();
+ QTextDocument *doc = curEditor->document();
+
+ if ( cursor->index() > 0 && cursor->paragraph()->at( cursor->index() - 1 )->c == '.' &&
+ ( cursor->index() == 1 || cursor->paragraph()->at( cursor->index() - 2 )->c != '.' ) )
+ return doObjectCompletion();
+
+ int idx = cursor->index();
+ if ( idx == 0 )
+ return FALSE;
+ QChar c = cursor->paragraph()->at( idx - 1 )->c;
+ if ( !c.isLetter() && !c.isNumber() && c != '_' && c != '#' )
+ return FALSE;
+
+ QString s;
+ idx--;
+ completionOffset = 1;
+ for (;;) {
+ s.prepend( QString( cursor->paragraph()->at( idx )->c ) );
+ idx--;
+ if ( idx < 0 )
+ break;
+ if ( !cursor->paragraph()->at( idx )->c.isLetter() &&
+ !cursor->paragraph()->at( idx )->c.isNumber() &&
+ cursor->paragraph()->at( idx )->c != '_' &&
+ cursor->paragraph()->at( idx )->c != '#' )
+ break;
+ completionOffset++;
+ }
+
+ searchString = s;
+
+ QValueList<CompletionEntry> lst( completionList( s, doc ) );
+ if ( lst.count() > 1 ) {
+ QTextStringChar *chr = cursor->paragraph()->at( cursor->index() );
+ int h = cursor->paragraph()->lineHeightOfChar( cursor->index() );
+ int x = cursor->paragraph()->rect().x() + chr->x;
+ int y, dummy;
+ cursor->paragraph()->lineHeightOfChar( cursor->index(), &dummy, &y );
+ y += cursor->paragraph()->rect().y();
+ completionListBox->clear();
+ for ( QValueList<CompletionEntry>::ConstIterator it = lst.begin(); it != lst.end(); ++it )
+ (void)new CompletionItem( completionListBox, (*it).text, (*it).type, (*it).postfix,
+ (*it).prefix, (*it).postfix2 );
+ cList = lst;
+ completionPopup->resize( completionListBox->sizeHint() +
+ QSize( completionListBox->verticalScrollBar()->width() + 4,
+ completionListBox->horizontalScrollBar()->height() + 4 ) );
+ completionListBox->setCurrentItem( 0 );
+ completionListBox->setFocus();
+ if ( curEditor->mapToGlobal( QPoint( 0, y ) ).y() + h + completionPopup->height() < QApplication::desktop()->height() )
+ completionPopup->move( curEditor->mapToGlobal( curEditor->
+ contentsToViewport( QPoint( x, y + h ) ) ) );
+ else
+ completionPopup->move( curEditor->mapToGlobal( curEditor->
+ contentsToViewport( QPoint( x, y - completionPopup->height() ) ) ) );
+ completionPopup->show();
+ } else if ( lst.count() == 1 ) {
+ curEditor->insert( lst.first().text.mid( completionOffset, 0xFFFFFF ),
+ (uint) ( QTextEdit::RedoIndentation |
+ QTextEdit::CheckNewLines |
+ QTextEdit::RemoveSelected ) );
+ } else {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+bool EditorCompletion::eventFilter( QObject *o, QEvent *e )
+{
+ if ( !enabled )
+ return FALSE;
+ if ( e->type() == QEvent::KeyPress && ::qt_cast<Editor*>(o)) {
+ curEditor = (Editor*)o;
+ QKeyEvent *ke = (QKeyEvent*)e;
+ if ( ke->key() == Key_Tab ) {
+ QString s = curEditor->textCursor()->paragraph()->string()->toString().
+ left( curEditor->textCursor()->index() );
+ if ( curEditor->document()->hasSelection( QTextDocument::Standard ) ||
+ s.simplifyWhiteSpace().isEmpty() ) {
+ if ( curEditor->document()->indent() ) {
+ curEditor->indent();
+ int i = 0;
+ for ( ; i < curEditor->textCursor()->paragraph()->length() - 1; ++i ) {
+ if ( curEditor->textCursor()->paragraph()->at( i )->c != ' ' &&
+ curEditor->textCursor()->paragraph()->at( i )->c != '\t' )
+ break;
+ }
+ curEditor->drawCursor( FALSE );
+ curEditor->textCursor()->setIndex( i );
+ curEditor->drawCursor( TRUE );
+ } else {
+ curEditor->insert( "\t" );
+ }
+ return TRUE;
+ }
+ }
+
+ if ( functionLabel->isVisible() ) {
+ if ( ke->key() == Key_Up && ( ke->state() & ControlButton ) == ControlButton ) {
+ functionLabel->gotoPrev();
+ return TRUE;
+ } else if ( ke->key() == Key_Down && ( ke->state() & ControlButton ) == ControlButton ) {
+ functionLabel->gotoNext();
+ return TRUE;
+ }
+ }
+
+ if ( ke->text().length() && !( ke->state() & AltButton ) &&
+ ( !ke->ascii() || ke->ascii() >= 32 ) ||
+ ( ke->text() == "\t" && !( ke->state() & ControlButton ) ) ) {
+ if ( ke->key() == Key_Tab ) {
+ if ( curEditor->textCursor()->index() == 0 &&
+ curEditor->textCursor()->paragraph()->isListItem() )
+ return FALSE;
+ if ( doCompletion() )
+ return TRUE;
+ } else if ( ke->key() == Key_Period &&
+ ( curEditor->textCursor()->index() == 0 ||
+ curEditor->textCursor()->paragraph()->at( curEditor->textCursor()->index() - 1 )->c != '.' )
+ ||
+ ke->key() == Key_Greater &&
+ curEditor->textCursor()->index() > 0 &&
+ curEditor->textCursor()->paragraph()->at( curEditor->textCursor()->index() - 1 )->c == '-' ) {
+ doObjectCompletion();
+ } else {
+ if ( !doArgumentHint( ke->text() == "(" ) )
+ functionLabel->hide();
+ }
+ }
+ } else if ( o == completionPopup || o == completionListBox ||
+ o == completionListBox->viewport() ) {
+ if ( e->type() == QEvent::KeyPress ) {
+ QKeyEvent *ke = (QKeyEvent*)e;
+ if ( ke->key() == Key_Enter || ke->key() == Key_Return || ke->key() == Key_Tab ) {
+ if ( ke->key() == Key_Tab && completionListBox->count() > 1 &&
+ completionListBox->currentItem() < (int)completionListBox->count() - 1 ) {
+ completionListBox->setCurrentItem( completionListBox->currentItem() + 1 );
+ return TRUE;
+ }
+ completeCompletion();
+ return TRUE;
+ } else if ( ke->key() == Key_Left || ke->key() == Key_Right ||
+ ke->key() == Key_Up || ke->key() == Key_Down ||
+ ke->key() == Key_Home || ke->key() == Key_End ||
+ ke->key() == Key_Prior || ke->key() == Key_Next ) {
+ return FALSE;
+ } else if ( ke->key() != Key_Shift && ke->key() != Key_Control &&
+ ke->key() != Key_Alt ) {
+ int l = searchString.length();
+ if ( ke->key() == Key_Backspace ) {
+ searchString.remove( searchString.length() - 1, 1 );
+ } else {
+ searchString += ke->text();
+ l = 1;
+ }
+ if ( !l || !continueComplete() ) {
+ completionPopup->close();
+ curEditor->setFocus();
+ }
+ QApplication::sendEvent( curEditor, e );
+ return TRUE;
+ }
+ } else if ( e->type() == QEvent::MouseButtonDblClick ) {
+ completeCompletion();
+ return TRUE;
+ }
+ }
+ if ( o == functionLabel || ::qt_cast<Editor*>(o) && functionLabel->isVisible() ) {
+ if ( e->type() == QEvent::KeyPress ) {
+ QKeyEvent *ke = (QKeyEvent*)e;
+ if ( ke->key() == Key_Escape ) {
+ functionLabel->hide();
+ } else {
+ if ( !doArgumentHint( ke->text() == "(" ) )
+ functionLabel->hide();
+ if ( o == functionLabel ) {
+ QApplication::sendEvent( curEditor, e );
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+void EditorCompletion::completeCompletion()
+{
+ int idx = curEditor->textCursor()->index();
+ QString s = completionListBox->currentText().mid( searchString.length() );
+ curEditor->insert( s, (uint) ( QTextEdit::RedoIndentation |
+ QTextEdit::CheckNewLines |
+ QTextEdit::RemoveSelected ) );
+ int i = s.find( '(' );
+ completionPopup->close();
+ curEditor->setFocus();
+ if ( i != -1 && i < (int)s.length() ) {
+ curEditor->setCursorPosition( curEditor->textCursor()->paragraph()->paragId(), idx + i + 1 );
+ doArgumentHint( FALSE );
+ }
+}
+
+void EditorCompletion::setCurrentEdior( Editor *e )
+{
+ curEditor = e;
+ curEditor->installEventFilter( this );
+}
+
+void EditorCompletion::addEditor( Editor *e )
+{
+ e->installEventFilter( this );
+}
+
+bool EditorCompletion::doObjectCompletion()
+{
+ searchString = "";
+ QString object;
+ int i = curEditor->textCursor()->index();
+ i--;
+ QTextParagraph *p = curEditor->textCursor()->paragraph();
+ for (;;) {
+ if ( i < 0 )
+ break;
+ if ( p->at( i )->c == ' ' || p->at( i )->c == '\t' )
+ break;
+ object.prepend( p->at( i )->c );
+ i--;
+ }
+
+ if ( object[ (int)object.length() - 1 ] == '-' )
+ object.remove( object.length() - 1, 1 );
+
+ if ( object.isEmpty() )
+ return FALSE;
+ return doObjectCompletion( object );
+}
+
+bool EditorCompletion::doObjectCompletion( const QString & )
+{
+ return FALSE;
+}
+
+static void strip( QString &txt )
+{
+ int i = txt.find( "(" );
+ if ( i == -1 )
+ return;
+ txt = txt.left( i );
+}
+
+bool EditorCompletion::continueComplete()
+{
+ if ( searchString.isEmpty() ) {
+ completionListBox->clear();
+ for ( QValueList<CompletionEntry>::ConstIterator it = cList.begin(); it != cList.end(); ++it )
+ (void)new CompletionItem( completionListBox, (*it).text, (*it).type,
+ (*it).postfix, (*it).prefix, (*it).postfix2 );
+ completionListBox->setCurrentItem( 0 );
+ completionListBox->setSelected( completionListBox->currentItem(), TRUE );
+ return TRUE;
+ }
+
+ QListBoxItem *i = completionListBox->findItem( searchString );
+ if ( !i )
+ return FALSE;
+
+ QString txt1 = i->text();
+ QString txt2 = searchString;
+ strip( txt1 );
+ strip( txt2 );
+ if ( txt1 == txt2 && !i->next() )
+ return FALSE;
+
+ QValueList<CompletionEntry> res;
+ for ( QValueList<CompletionEntry>::ConstIterator it = cList.begin(); it != cList.end(); ++it ) {
+ if ( (*it).text.left( searchString.length() ) == searchString )
+ res << *it;
+ }
+ if ( res.isEmpty() )
+ return FALSE;
+ completionListBox->clear();
+ for ( QValueList<CompletionEntry>::ConstIterator it2 = res.begin(); it2 != res.end(); ++it2 )
+ (void)new CompletionItem( completionListBox, (*it2).text, (*it2).type,
+ (*it2).postfix, (*it2).prefix, (*it2).postfix2 );
+ completionListBox->setCurrentItem( 0 );
+ completionListBox->setSelected( completionListBox->currentItem(), TRUE );
+ return TRUE;
+}
+
+bool EditorCompletion::doArgumentHint( bool useIndex )
+{
+ QTextCursor *cursor = curEditor->textCursor();
+ int i = cursor->index() ;
+ if ( !useIndex ) {
+ bool foundParen = FALSE;
+ int closeParens = 0;
+ while ( i >= 0 ) {
+ if ( cursor->paragraph()->at( i )->c == ')' && i != cursor->index() )
+ closeParens++;
+ if ( cursor->paragraph()->at( i )->c == '(' ) {
+ closeParens--;
+ if ( closeParens == -1 ) {
+ foundParen = TRUE;
+ break;
+ }
+ }
+ --i;
+ }
+
+ if ( !foundParen )
+ return FALSE;
+ }
+ int j = i - 1;
+ bool foundSpace = FALSE;
+ bool foundNonSpace = FALSE;
+ while ( j >= 0 ) {
+ if ( foundNonSpace && ( cursor->paragraph()->at( j )->c == ' ' || cursor->paragraph()->at( j )->c == ',' ) ) {
+ foundSpace = TRUE;
+ break;
+ }
+ if ( !foundNonSpace && ( cursor->paragraph()->at( j )->c != ' ' || cursor->paragraph()->at( j )->c != ',' ) )
+ foundNonSpace = TRUE;
+ --j;
+ }
+ if ( foundSpace )
+ ++j;
+ j = QMAX( j, 0 );
+ QString function( cursor->paragraph()->string()->toString().mid( j, i - j + 1 ) );
+ QString part = cursor->paragraph()->string()->toString().mid( j, cursor->index() - j + 1 );
+ function = function.simplifyWhiteSpace();
+ for (;;) {
+ if ( function[ (int)function.length() - 1 ] == '(' ) {
+ function.remove( function.length() - 1, 1 );
+ function = function.simplifyWhiteSpace();
+ } else if ( function[ (int)function.length() - 1 ] == ')' ) {
+ function.remove( function.length() - 1, 1 );
+ function = function.simplifyWhiteSpace();
+ } else {
+ break;
+ }
+ }
+
+ QChar sep;
+ QString pre, post;
+ QValueList<QStringList> argl = functionParameters( function, sep, pre, post );
+ if ( argl.isEmpty() )
+ return FALSE;
+
+ QString label;
+ int w = 0;
+ int num = 0;
+ if ( !functionLabel->isVisible() )
+ functionLabel->setNumFunctions( (int)argl.count() );
+ for ( QValueList<QStringList>::Iterator vit = argl.begin(); vit != argl.end(); ++vit, ++num ) {
+ QStringList args = *vit;
+ int argNum = 0;
+ int inParen = 0;
+ for ( int k = 0; k < (int)part.length(); ++k ) {
+ if ( part[ k ] == sep && inParen < 2 )
+ argNum++;
+ if ( part[ k ] == '(' )
+ inParen++;
+ if ( part[ k ] == ')' )
+ inParen--;
+ }
+
+ QString func = function;
+ int pnt = -1;
+ pnt = func.findRev( '.' );
+ if ( pnt == -1 )
+ func.findRev( '>' );
+ if ( pnt != -1 )
+ func = func.mid( pnt + 1 );
+
+ QString s = func + "( ";
+ if ( s[ 0 ] == '\"' )
+ s.remove( (uint)0, 1 );
+ i = 0;
+ for ( QStringList::Iterator it = args.begin(); it != args.end(); ++it, ++i ) {
+ if ( i == argNum )
+ s += "<b>" + *it + "</b>";
+ else
+ s += *it;
+ if ( i < (int)args.count() - 1 )
+ s += ", ";
+ else
+ s += " ";
+ }
+ s += ")";
+ s.prepend( pre );
+ s.append( post );
+ label += "<p>" + s + "</p>";
+ functionLabel->setFunctionText( num, s );
+ w = QMAX( w, functionLabel->fontMetrics().width( s ) + 10 );
+ }
+ w += 16;
+ if ( label.isEmpty() )
+ return FALSE;
+ if ( functionLabel->isVisible() ) {
+ functionLabel->resize( w + 50, QMAX( functionLabel->fontMetrics().height(), 16 ) );
+ } else {
+ QTextStringChar *chr = cursor->paragraph()->at( cursor->index() );
+ int h = cursor->paragraph()->lineHeightOfChar( cursor->index() );
+ int x = cursor->paragraph()->rect().x() + chr->x;
+ int y, dummy;
+ cursor->paragraph()->lineHeightOfChar( cursor->index(), &dummy, &y );
+ y += cursor->paragraph()->rect().y();
+ functionLabel->resize( w + 50, QMAX( functionLabel->fontMetrics().height(), 16 ) );
+ functionLabel->move( curEditor->mapToGlobal( curEditor->contentsToViewport( QPoint( x, y + h ) ) ) );
+ if ( functionLabel->x() + functionLabel->width() > QApplication::desktop()->width() )
+ functionLabel->move( QMAX( 0, QApplication::desktop()->width() - functionLabel->width() ),
+ functionLabel->y() );
+ functionLabel->show();
+ curEditor->setFocus();
+ }
+ QTimer::singleShot( 0, functionLabel, SLOT( relayout() ) );
+
+ return TRUE;
+}
+
+QValueList<QStringList> EditorCompletion::functionParameters( const QString &, QChar &, QString &, QString & )
+{
+ return QValueList<QStringList>();
+}
+
+void EditorCompletion::setContext( QObject * )
+{
+}
+
+void EditorCompletion::showCompletion( const QValueList<CompletionEntry> &lst )
+{
+ QTextCursor *cursor = curEditor->textCursor();
+ QTextStringChar *chr = cursor->paragraph()->at( cursor->index() );
+ int h = cursor->paragraph()->lineHeightOfChar( cursor->index() );
+ int x = cursor->paragraph()->rect().x() + chr->x;
+ int y, dummy;
+ cursor->paragraph()->lineHeightOfChar( cursor->index(), &dummy, &y );
+ y += cursor->paragraph()->rect().y();
+ completionListBox->clear();
+ for ( QValueList<CompletionEntry>::ConstIterator it = lst.begin(); it != lst.end(); ++it )
+ (void)new CompletionItem( completionListBox, (*it).text, (*it).type,
+ (*it).postfix, (*it).prefix, (*it).postfix2 );
+ cList = lst;
+ completionPopup->resize( completionListBox->sizeHint() +
+ QSize( completionListBox->verticalScrollBar()->width() + 4,
+ completionListBox->horizontalScrollBar()->height() + 4 ) );
+ completionListBox->setCurrentItem( 0 );
+ completionListBox->setFocus();
+ if ( curEditor->mapToGlobal( QPoint( 0, y ) ).y() + h + completionPopup->height() < QApplication::desktop()->height() )
+ completionPopup->move( curEditor->mapToGlobal( curEditor->
+ contentsToViewport( QPoint( x, y + h ) ) ) );
+ else
+ completionPopup->move( curEditor->mapToGlobal( curEditor->
+ contentsToViewport( QPoint( x, y - completionPopup->height() ) ) ) );
+
+ completionPopup->show();
+}
diff --git a/tools/designer/editor/completion.h b/tools/designer/editor/completion.h
new file mode 100644
index 0000000..94acf6b
--- /dev/null
+++ b/tools/designer/editor/completion.h
@@ -0,0 +1,110 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef COMPLETION_H
+#define COMPLETION_H
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qobject.h>
+#include <qmap.h>
+
+class QTextDocument;
+class Editor;
+class QVBox;
+class QListBox;
+class ArgHintWidget;
+
+struct CompletionEntry
+{
+ QString type;
+ QString text;
+ QString postfix;
+ QString prefix;
+ QString postfix2;
+
+ bool operator==( const CompletionEntry &c ) const {
+ return ( c.type == type &&
+ c.text == text &&
+ c.postfix == postfix &&
+ c.prefix == prefix &&
+ c.postfix2 == postfix2 );
+ }
+};
+
+class EditorCompletion : public QObject
+{
+ Q_OBJECT
+
+public:
+ EditorCompletion( Editor *e );
+ ~EditorCompletion();
+
+ virtual void addCompletionEntry( const QString &s, QTextDocument *doc, bool strict );
+ virtual QValueList<CompletionEntry> completionList( const QString &s, QTextDocument *doc ) const;
+ virtual void updateCompletionMap( QTextDocument *doc );
+
+ bool eventFilter( QObject *o, QEvent *e );
+ virtual void setCurrentEdior( Editor *e );
+ virtual bool doCompletion();
+ virtual bool doObjectCompletion();
+ virtual bool doObjectCompletion( const QString &object );
+ virtual bool doArgumentHint( bool useIndex );
+
+ virtual void addEditor( Editor *e );
+ virtual QValueList<QStringList> functionParameters( const QString &func, QChar &, QString &prefix, QString &postfix );
+
+ virtual void setContext( QObject *this_ );
+
+ void setEnabled( bool b ) { enabled = b; }
+
+protected:
+ virtual bool continueComplete();
+ virtual void showCompletion( const QValueList<CompletionEntry> &lst );
+ virtual void completeCompletion();
+
+protected:
+ QVBox *completionPopup;
+ QListBox *completionListBox;
+ ArgHintWidget *functionLabel;
+ int completionOffset;
+ Editor *curEditor;
+ QString searchString;
+ QValueList<CompletionEntry> cList;
+ QMap<QChar, QStringList> completionMap;
+ bool enabled;
+ QTextDocument *lastDoc;
+
+};
+
+#endif
diff --git a/tools/designer/editor/conf.cpp b/tools/designer/editor/conf.cpp
new file mode 100644
index 0000000..11e4f0a
--- /dev/null
+++ b/tools/designer/editor/conf.cpp
@@ -0,0 +1,269 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "conf.h"
+#include <qapplication.h>
+#include <qfont.h>
+#include <qcolor.h>
+#include <qsettings.h>
+
+QMap<QString, ConfigStyle> Config::defaultStyles()
+{
+ ConfigStyle s;
+ QMap<QString, ConfigStyle> styles;
+ int normalSize = qApp->font().pointSize();
+ QString normalFamily = qApp->font().family();
+ QString commentFamily = "times";
+ int normalWeight = qApp->font().weight();
+
+ s.font = QFont( normalFamily, normalSize, normalWeight );
+ s.color = Qt::black;
+ styles.insert( "Standard", s );
+
+ s.font = QFont( commentFamily, normalSize, normalWeight, TRUE );
+ s.color = Qt::red;
+ styles.insert( "Comment", s );
+
+ s.font = QFont( normalFamily, normalSize, normalWeight );
+ s.color = Qt::blue;
+ styles.insert( "Number", s );
+
+ s.font = QFont( normalFamily, normalSize, normalWeight );
+ s.color = Qt::darkGreen;
+ styles.insert( "String", s );
+
+ s.font = QFont( normalFamily, normalSize, normalWeight );
+ s.color = Qt::darkMagenta;
+ styles.insert( "Type", s );
+
+ s.font = QFont( normalFamily, normalSize, normalWeight );
+ s.color = Qt::darkYellow;
+ styles.insert( "Keyword", s );
+
+ s.font = QFont( normalFamily, normalSize, normalWeight );
+ s.color = Qt::darkBlue;
+ styles.insert( "Preprocessor", s );
+
+ s.font = QFont( normalFamily, normalSize, normalWeight );
+ s.color = Qt::darkRed;
+ styles.insert( "Label", s );
+
+ return styles;
+}
+
+QMap<QString, ConfigStyle> Config::readStyles( const QString &path )
+{
+ QMap<QString, ConfigStyle> styles;
+ styles = defaultStyles();
+
+ QString family;
+ int size = 10;
+ bool bold = FALSE, italic = FALSE, underline = FALSE;
+ int red = 0, green = 0, blue = 0;
+
+ QString elements[] = {
+ "Comment",
+ "Number",
+ "String",
+ "Type",
+ "Keyword",
+ "Preprocessor",
+ "Label",
+ "Standard",
+ QString::null
+ };
+
+ for ( int i = 0; elements[ i ] != QString::null; ++i ) {
+ QSettings settings;
+ bool ok = TRUE;
+ for (;;) {
+ family = settings.readEntry( path + elements[ i ] + "/family", QString::null, &ok );
+ if ( !ok )
+ break;
+ size = settings.readNumEntry( path + elements[ i ] + "/size", 10, &ok );
+ if ( !ok )
+ break;
+ bold = settings.readBoolEntry( path + elements[ i ] + "/bold", FALSE, &ok );
+ if ( !ok )
+ break;
+ italic = settings.readBoolEntry( path + elements[ i ] + "/italic", FALSE, &ok );
+ if ( !ok )
+ break;
+ underline = settings.readBoolEntry( path + elements[ i ] + "/underline", FALSE, &ok );
+ if ( !ok )
+ break;
+ red = settings.readNumEntry( path + elements[ i ] + "/red", 0, &ok );
+ if ( !ok )
+ break;
+ green = settings.readNumEntry( path + elements[ i ] + "/green", 0, &ok );
+ if ( !ok )
+ break;
+ blue = settings.readNumEntry( path + elements[ i ] + "/blue", 0, &ok );
+ if ( !ok )
+ break;
+ break;
+ }
+ if ( !ok )
+ continue;
+ QFont f( family );
+ f.setPointSize( size );
+ f.setBold( bold );
+ f.setItalic( italic );
+ f.setUnderline( underline );
+ QColor c( red, green, blue );
+ ConfigStyle s;
+ s.font = f;
+ s.color = c;
+ styles.remove( elements[ i ] );
+ styles.insert( elements[ i ], s );
+ }
+ return styles;
+}
+
+void Config::saveStyles( const QMap<QString, ConfigStyle> &styles, const QString &path )
+{
+ QString elements[] = {
+ "Comment",
+ "Number",
+ "String",
+ "Type",
+ "Keyword",
+ "Preprocessor",
+ "Label",
+ "Standard",
+ QString::null
+ };
+
+ QSettings settings;
+ for ( int i = 0; elements[ i ] != QString::null; ++i ) {
+ settings.writeEntry( path + "/" + elements[ i ] + "/family", styles[ elements[ i ] ].font.family() );
+ settings.writeEntry( path + "/" + elements[ i ] + "/size", styles[ elements[ i ] ].font.pointSize() );
+ settings.writeEntry( path + "/" + elements[ i ] + "/bold", styles[ elements[ i ] ].font.bold() );
+ settings.writeEntry( path + "/" + elements[ i ] + "/italic", styles[ elements[ i ] ].font.italic() );
+ settings.writeEntry( path + "/" + elements[ i ] + "/underline", styles[ elements[ i ] ].font.underline() );
+ settings.writeEntry( path + "/" + elements[ i ] + "/red", styles[ elements[ i ] ].color.red() );
+ settings.writeEntry( path + "/" + elements[ i ] + "/green", styles[ elements[ i ] ].color.green() );
+ settings.writeEntry( path + "/" + elements[ i ] + "/blue", styles[ elements[ i ] ].color.blue() );
+ }
+}
+
+bool Config::completion( const QString &path )
+{
+ QSettings settings;
+ bool ret = settings.readBoolEntry( path + "/completion", TRUE );
+ return ret;
+}
+
+bool Config::wordWrap( const QString &path )
+{
+ QSettings settings;
+ bool ret = settings.readBoolEntry( path + "/wordWrap", TRUE );
+ return ret;
+}
+
+bool Config::parenMatching( const QString &path )
+{
+ QSettings settings;
+ bool ret = settings.readBoolEntry( path + "/parenMatching", TRUE );
+ return ret;
+}
+
+int Config::indentTabSize( const QString &path )
+{
+ QSettings settings;
+ int ret = settings.readNumEntry( path + "/indentTabSize", 8 );
+ return ret;
+}
+
+int Config::indentIndentSize( const QString &path )
+{
+ QSettings settings;
+ int ret = settings.readNumEntry( path + "/indentIndentSize", 4 );
+ return ret;
+}
+
+bool Config::indentKeepTabs( const QString &path )
+{
+ QSettings settings;
+ bool ret = settings.readBoolEntry( path + "/indentKeepTabs", TRUE );
+ return ret;
+}
+
+bool Config::indentAutoIndent( const QString &path )
+{
+ QSettings settings;
+ bool ret = settings.readBoolEntry( path + "/indentAutoIndent", TRUE );
+ return ret;
+}
+
+void Config::setCompletion( bool b, const QString &path )
+{
+ QSettings settings;
+ settings.writeEntry( path + "/completion", b );
+}
+
+void Config::setWordWrap( bool b, const QString &path )
+{
+ QSettings settings;
+ settings.writeEntry( path + "/wordWrap", b );
+}
+
+void Config::setParenMatching( bool b,const QString &path )
+{
+ QSettings settings;
+ settings.writeEntry( path + "/parenMatching", b );
+}
+
+void Config::setIndentTabSize( int s, const QString &path )
+{
+ QSettings settings;
+ settings.writeEntry( path + "/indentTabSize", s );
+}
+
+void Config::setIndentIndentSize( int s, const QString &path )
+{
+ QSettings settings;
+ settings.writeEntry( path + "/indentIndentSize", s );
+}
+
+void Config::setIndentKeepTabs( bool b, const QString &path )
+{
+ QSettings settings;
+ settings.writeEntry( path + "/indentKeepTabs", b );
+}
+
+void Config::setIndentAutoIndent( bool b, const QString &path )
+{
+ QSettings settings;
+ settings.writeEntry( path + "/indentAutoIndent", b );
+}
diff --git a/tools/designer/editor/conf.h b/tools/designer/editor/conf.h
new file mode 100644
index 0000000..fe5111f
--- /dev/null
+++ b/tools/designer/editor/conf.h
@@ -0,0 +1,75 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef CONF_H
+#define CONF_H
+
+#include <qfont.h>
+#include <qcolor.h>
+#include <qmap.h>
+
+struct ConfigStyle
+{
+ QFont font;
+ QColor color;
+
+ Q_DUMMY_COMPARISON_OPERATOR( ConfigStyle )
+};
+
+struct Config
+{
+ QMap<QString, ConfigStyle> styles;
+ bool hasCompletion, hasParenMatching, hasWordWrap;
+
+ static QMap<QString, ConfigStyle> defaultStyles();
+ static QMap<QString, ConfigStyle> readStyles( const QString &path );
+ static void saveStyles( const QMap<QString, ConfigStyle> &styles, const QString &path );
+ static bool completion( const QString &path );
+ static bool wordWrap( const QString &path );
+ static bool parenMatching( const QString &path );
+ static int indentTabSize( const QString &path );
+ static int indentIndentSize( const QString &path );
+ static bool indentKeepTabs( const QString &path );
+ static bool indentAutoIndent( const QString &path );
+
+ static void setCompletion( bool b, const QString &path );
+ static void setWordWrap( bool b, const QString &path );
+ static void setParenMatching( bool b,const QString &path );
+ static void setIndentTabSize( int s, const QString &path );
+ static void setIndentIndentSize( int s, const QString &path );
+ static void setIndentKeepTabs( bool b, const QString &path );
+ static void setIndentAutoIndent( bool b, const QString &path );
+
+};
+
+#endif
diff --git a/tools/designer/editor/editor.cpp b/tools/designer/editor/editor.cpp
new file mode 100644
index 0000000..e75f052
--- /dev/null
+++ b/tools/designer/editor/editor.cpp
@@ -0,0 +1,251 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "editor.h"
+#include "parenmatcher.h"
+#include <qfile.h>
+#include <private/qrichtext_p.h>
+#include "conf.h"
+#include <qapplication.h>
+#include <qpopupmenu.h>
+#include <qaccel.h>
+
+Editor::Editor( const QString &fn, QWidget *parent, const char *name )
+ : QTextEdit( parent, name ), hasError( FALSE )
+{
+ document()->setFormatter( new QTextFormatterBreakInWords );
+ if ( !fn.isEmpty() )
+ load( fn );
+ setHScrollBarMode( QScrollView::AlwaysOff );
+ setVScrollBarMode( QScrollView::AlwaysOn );
+ document()->setUseFormatCollection( FALSE );
+ parenMatcher = new ParenMatcher;
+ connect( this, SIGNAL( cursorPositionChanged( QTextCursor * ) ),
+ this, SLOT( cursorPosChanged( QTextCursor * ) ) );
+ cfg = new Config;
+ document()->addSelection( Error );
+ document()->addSelection( Step );
+ document()->setSelectionColor( Error, red );
+ document()->setSelectionColor( Step, yellow );
+ document()->setInvertSelectionText( Error, FALSE );
+ document()->setInvertSelectionText( Step, FALSE );
+ document()->addSelection( ParenMatcher::Match );
+ document()->addSelection( ParenMatcher::Mismatch );
+ document()->setSelectionColor( ParenMatcher::Match, QColor( 204, 232, 195 ) );
+ document()->setSelectionColor( ParenMatcher::Mismatch, Qt::magenta );
+ document()->setInvertSelectionText( ParenMatcher::Match, FALSE );
+ document()->setInvertSelectionText( ParenMatcher::Mismatch, FALSE );
+
+ accelComment = new QAccel( this );
+ accelComment->connectItem( accelComment->insertItem( ALT + Key_C ),
+ this, SLOT( commentSelection() ) );
+ accelUncomment = new QAccel( this );
+ accelUncomment->connectItem( accelUncomment->insertItem( ALT + Key_U ),
+ this, SLOT( uncommentSelection() ) );
+ editable = TRUE;
+}
+
+Editor::~Editor()
+{
+ delete cfg;
+ delete parenMatcher;
+}
+
+void Editor::cursorPosChanged( QTextCursor *c )
+{
+ if ( parenMatcher->match( c ) )
+ repaintChanged();
+ if ( hasError ) {
+ emit clearErrorMarker();
+ hasError = FALSE;
+ }
+}
+
+void Editor::load( const QString &fn )
+{
+ filename = fn;
+ QFile f( filename );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+ QCString txt;
+ txt.resize( f.size() );
+ f.readBlock( txt.data(), f.size() );
+ QString s( QString::fromLatin1( txt ) );
+ setText( s );
+}
+
+void Editor::save( const QString &fn )
+{
+ if ( !filename.isEmpty() )
+ filename = fn;
+}
+
+void Editor::configChanged()
+{
+ document()->invalidate();
+ viewport()->repaint( FALSE );
+}
+
+void Editor::setErrorSelection( int line )
+{
+ QTextParagraph *p = document()->paragAt( line );
+ if ( !p )
+ return;
+ QTextCursor c( document() );
+ c.setParagraph( p );
+ c.setIndex( 0 );
+ document()->removeSelection( Error );
+ document()->setSelectionStart( Error, c );
+ c.gotoLineEnd();
+ document()->setSelectionEnd( Error, c );
+ hasError = TRUE;
+ viewport()->repaint( FALSE );
+}
+
+void Editor::setStepSelection( int line )
+{
+ QTextParagraph *p = document()->paragAt( line );
+ if ( !p )
+ return;
+ QTextCursor c( document() );
+ c.setParagraph( p );
+ c.setIndex( 0 );
+ document()->removeSelection( Step );
+ document()->setSelectionStart( Step, c );
+ c.gotoLineEnd();
+ document()->setSelectionEnd( Step, c );
+ viewport()->repaint( FALSE );
+}
+
+void Editor::clearStepSelection()
+{
+ document()->removeSelection( Step );
+ viewport()->repaint( FALSE );
+}
+
+void Editor::doChangeInterval()
+{
+ emit intervalChanged();
+ QTextEdit::doChangeInterval();
+}
+
+void Editor::commentSelection()
+{
+ QTextParagraph *start = document()->selectionStartCursor( QTextDocument::Standard ).paragraph();
+ QTextParagraph *end = document()->selectionEndCursor( QTextDocument::Standard ).paragraph();
+ if ( !start || !end )
+ start = end = textCursor()->paragraph();
+ while ( start ) {
+ if ( start == end && textCursor()->index() == 0 )
+ break;
+ start->insert( 0, "//" );
+ if ( start == end )
+ break;
+ start = start->next();
+ }
+ document()->removeSelection( QTextDocument::Standard );
+ repaintChanged();
+ setModified( TRUE );
+}
+
+void Editor::uncommentSelection()
+{
+ QTextParagraph *start = document()->selectionStartCursor( QTextDocument::Standard ).paragraph();
+ QTextParagraph *end = document()->selectionEndCursor( QTextDocument::Standard ).paragraph();
+ if ( !start || !end )
+ start = end = textCursor()->paragraph();
+ while ( start ) {
+ if ( start == end && textCursor()->index() == 0 )
+ break;
+ while ( start->at( 0 )->c == '/' )
+ start->remove( 0, 1 );
+ if ( start == end )
+ break;
+ start = start->next();
+ }
+ document()->removeSelection( QTextDocument::Standard );
+ repaintChanged();
+ setModified( TRUE );
+}
+
+QPopupMenu *Editor::createPopupMenu( const QPoint &p )
+{
+ QPopupMenu *menu = QTextEdit::createPopupMenu( p );
+ menu->insertSeparator();
+ menu->insertItem( tr( "C&omment Code\tAlt+C" ), this, SLOT( commentSelection() ) );
+ menu->insertItem( tr( "Unco&mment Code\tAlt+U" ), this, SLOT( uncommentSelection() ) );
+ return menu;
+}
+
+bool Editor::eventFilter( QObject *o, QEvent *e )
+{
+ if ( ( e->type() == QEvent::FocusIn || e->type() == QEvent::FocusOut ) &&
+ ( o == this || o == viewport() ) ) {
+ accelUncomment->setEnabled( e->type() == QEvent::FocusIn );
+ accelComment->setEnabled( e->type() == QEvent::FocusIn );
+ }
+ return QTextEdit::eventFilter( o, e );
+}
+
+void Editor::doKeyboardAction( KeyboardAction action )
+{
+ if ( !editable )
+ return;
+ QTextEdit::doKeyboardAction( action );
+}
+
+void Editor::keyPressEvent( QKeyEvent *e )
+{
+ if ( editable ) {
+ QTextEdit::keyPressEvent( e );
+ return;
+ }
+
+ switch ( e->key() ) {
+ case Key_Left:
+ case Key_Right:
+ case Key_Up:
+ case Key_Down:
+ case Key_Home:
+ case Key_End:
+ case Key_Prior:
+ case Key_Next:
+ case Key_Direction_L:
+ case Key_Direction_R:
+ QTextEdit::keyPressEvent( e );
+ break;
+ default:
+ e->accept();
+ break;
+ }
+}
diff --git a/tools/designer/editor/editor.h b/tools/designer/editor/editor.h
new file mode 100644
index 0000000..1364bbb
--- /dev/null
+++ b/tools/designer/editor/editor.h
@@ -0,0 +1,111 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef EDITOR_H
+#define EDITOR_H
+
+#include <qtextedit.h>
+
+struct Config;
+class ParenMatcher;
+class EditorCompletion;
+class EditorBrowser;
+class QAccel;
+
+class Editor : public QTextEdit
+{
+ Q_OBJECT
+
+public:
+ enum Selection {
+ Error = 3,
+ Step = 4
+ };
+
+ Editor( const QString &fn, QWidget *parent, const char *name );
+ ~Editor();
+ virtual void load( const QString &fn );
+ virtual void save( const QString &fn );
+ QTextDocument *document() const { return QTextEdit::document(); }
+ void placeCursor( const QPoint &p, QTextCursor *c ) { QTextEdit::placeCursor( p, c ); }
+ void setDocument( QTextDocument *doc ) { QTextEdit::setDocument( doc ); }
+ QTextCursor *textCursor() const { return QTextEdit::textCursor(); }
+ void repaintChanged() { QTextEdit::repaintChanged(); }
+
+ virtual EditorCompletion *completionManager() { return 0; }
+ virtual EditorBrowser *browserManager() { return 0; }
+ virtual void configChanged();
+
+ Config *config() { return cfg; }
+
+ void setErrorSelection( int line );
+ void setStepSelection( int line );
+ void clearStepSelection();
+ void clearSelections();
+
+ virtual bool supportsErrors() const { return TRUE; }
+ virtual bool supportsBreakPoints() const { return TRUE; }
+ virtual void makeFunctionVisible( QTextParagraph * ) {}
+
+ void drawCursor( bool b ) { QTextEdit::drawCursor( b ); }
+
+ QPopupMenu *createPopupMenu( const QPoint &p );
+ bool eventFilter( QObject *o, QEvent *e );
+
+ void setEditable( bool b ) { editable = b; }
+
+protected:
+ void doKeyboardAction( KeyboardAction action );
+ void keyPressEvent( QKeyEvent *e );
+
+signals:
+ void clearErrorMarker();
+ void intervalChanged();
+
+private slots:
+ void cursorPosChanged( QTextCursor *c );
+ void doChangeInterval();
+ void commentSelection();
+ void uncommentSelection();
+
+protected:
+ ParenMatcher *parenMatcher;
+ QString filename;
+ Config *cfg;
+ bool hasError;
+ QAccel *accelComment, *accelUncomment;
+ bool editable;
+
+};
+
+#endif
diff --git a/tools/designer/editor/editor.pro b/tools/designer/editor/editor.pro
new file mode 100644
index 0000000..dc9235f
--- /dev/null
+++ b/tools/designer/editor/editor.pro
@@ -0,0 +1,40 @@
+TEMPLATE = lib
+CONFIG += qt warn_on staticlib
+CONFIG -= dll
+HEADERS = editor.h \
+ parenmatcher.h \
+ completion.h \
+ viewmanager.h \
+ markerwidget.h\
+ conf.h \
+ browser.h \
+ arghintwidget.h \
+ cindent.h
+
+SOURCES = editor.cpp \
+ parenmatcher.cpp \
+ completion.cpp \
+ viewmanager.cpp \
+ markerwidget.cpp \
+ conf.cpp \
+ browser.cpp \
+ arghintwidget.cpp \
+ cindent.cpp \
+ yyindent.cpp
+
+FORMS = preferences.ui
+
+TARGET = editor
+DESTDIR = ../../../lib
+VERSION = 1.0.0
+
+INCLUDEPATH += $$QT_SOURCE_TREE/tools/designer/interfaces
+
+target.path=$$libs.path
+
+INSTALLS += target
+
+unix {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_SHLIB
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_SHLIB
+}
diff --git a/tools/designer/editor/markerwidget.cpp b/tools/designer/editor/markerwidget.cpp
new file mode 100644
index 0000000..cabe39a
--- /dev/null
+++ b/tools/designer/editor/markerwidget.cpp
@@ -0,0 +1,491 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "markerwidget.h"
+#include "viewmanager.h"
+#include <private/qrichtext_p.h>
+#include "editor.h"
+#include <qpainter.h>
+#include <qpopupmenu.h>
+#include "paragdata.h"
+
+static const char * error_xpm[] = {
+"15 15 35 1",
+" c None",
+". c #FF0000",
+"+ c #F50F0F",
+"@ c #BF5F5F",
+"# c #FF1010",
+"$ c #FF7878",
+"% c #FF0A0A",
+"& c #FF0606",
+"* c #FF1414",
+"= c #FFFFFF",
+"- c #FFA3A3",
+"; c #FF0707",
+"> c #FF0202",
+", c #FF9898",
+"' c #FF8888",
+") c #D04747",
+"! c #FFA7A7",
+"~ c #FF9D9D",
+"{ c #FFB1B1",
+"] c #FF0C0C",
+"^ c #F90A0A",
+"/ c #FFB5B5",
+"( c #FF0909",
+"_ c #A08F8F",
+": c #FFACAC",
+"< c #FF0303",
+"[ c #9F8F8F",
+"} c #FB0606",
+"| c #9F9090",
+"1 c #CE4949",
+"2 c #999999",
+"3 c #FF1919",
+"4 c #F70C0C",
+"5 c #A38A8A",
+"6 c #B37272",
+" .... ",
+" ........ ",
+" .........+@ ",
+" ..#$%..&$*.+ ",
+" ..$=-;>,='..) ",
+"...%-=!~={]..^ ",
+"....;!==/(...._",
+"....>~==:<....[",
+"...&,=/:=!;..}|",
+" ..$={(<!='..12",
+" ..*']..;'3.45 ",
+" +........462 ",
+" @+......462 ",
+" )^..}152 ",
+" _[|2 "};
+
+static const char * breakpoint_xpm[] = {
+"15 15 3 1",
+" c None",
+". c #8B0000",
+"+ c #FFFFFF",
+" ....... ",
+" ......... ",
+" ........... ",
+" ............. ",
+"..+.+++.+..++..",
+".+.+.+.+.+.+.+.",
+".+...+.+.+.+.+.",
+"..+..+.+.+.++..",
+"...+.+.+.+.+...",
+".+.+.+.+.+.+...",
+"..+..+..+..+...",
+" ............. ",
+" ........... ",
+" ......... ",
+" ....... " };
+
+static const char * step_xpm[] = {
+"16 16 128 2",
+" c None",
+". c #B4B6BF",
+"+ c #7893D8",
+"@ c #8D95BF",
+"# c #B8BFC1",
+"$ c #B6D1E6",
+"% c #7193E6",
+"& c #8893C2",
+"* c #B3BDC4",
+"= c #AAD2EC",
+"- c #9AD0FF",
+"; c #6690EF",
+"> c #8894C8",
+", c #AFBAC4",
+"' c #95BFEC",
+") c #99CBFF",
+"! c #8EC3FF",
+"~ c #6D95F0",
+"{ c #8792CA",
+"] c #9DA7C3",
+"^ c #8BA2E3",
+"/ c #809AE0",
+"( c #8398D1",
+"_ c #93A0CC",
+": c #ACB3CB",
+"< c #B4B9C4",
+"[ c #B6BAC4",
+"} c #93A4CC",
+"| c #82B0F5",
+"1 c #8BBCFF",
+"2 c #8EC0FF",
+"3 c #8FC1FF",
+"4 c #6594F4",
+"5 c #7381CC",
+"6 c #81A7E9",
+"7 c #D0F5FF",
+"8 c #C1EBFF",
+"9 c #AEDAFF",
+"0 c #A2D1FC",
+"a c #A3C8F3",
+"b c #AACAE6",
+"c c #B4CFE9",
+"d c #ADCCF9",
+"e c #84B2FF",
+"f c #82B4FF",
+"g c #86B7FF",
+"h c #88B7FF",
+"i c #83B4FF",
+"j c #5F8AF3",
+"k c #7585C8",
+"l c #77A4F3",
+"m c #ABDFFF",
+"n c #9CCAFF",
+"o c #96C7FF",
+"p c #97C8FF",
+"q c #95C5FF",
+"r c #9DCCFF",
+"s c #A0CDFF",
+"t c #90C0FF",
+"u c #82AFFF",
+"v c #7FAFFF",
+"w c #7DAEFF",
+"x c #79AAFF",
+"y c #6C9EFF",
+"z c #4366EB",
+"A c #6894F2",
+"B c #93C6FF",
+"C c #82B3FF",
+"D c #7AABFF",
+"E c #73A5FF",
+"F c #71A3FF",
+"G c #6C9DFF",
+"H c #699BFF",
+"I c #76A8FF",
+"J c #7EB0FF",
+"K c #7BADFF",
+"L c #74A5FF",
+"M c #608BFF",
+"N c #3462FF",
+"O c #2444E5",
+"P c #577AE0",
+"Q c #5D90FF",
+"R c #4C7AFF",
+"S c #3B66FF",
+"T c #335CF9",
+"U c #365AF1",
+"V c #3858E5",
+"W c #3959E0",
+"X c #416CF9",
+"Y c #75A5FF",
+"Z c #78A9FF",
+"` c #74A4FF",
+" . c #6191FF",
+".. c #3059FF",
+"+. c #1B37F1",
+"@. c #6A75C7",
+"#. c #828BC1",
+"$. c #4358D8",
+"%. c #374BDA",
+"&. c #4759CA",
+"*. c #636CC4",
+"=. c #8489C0",
+"-. c #9DA1C1",
+";. c #A3A6BF",
+">. c #7486CB",
+",. c #6E98F5",
+"'. c #719EFF",
+"). c #608DFF",
+"!. c #315EFF",
+"~. c #1432F4",
+"{. c #5C63C8",
+"]. c #B1B4B9",
+"^. c #B3BABB",
+"/. c #ABB4C3",
+"(. c #7299E9",
+"_. c #5486FF",
+":. c #224EFF",
+"<. c #1733F2",
+"[. c #7079C5",
+"}. c #5C7DE9",
+"|. c #2450FF",
+"1. c #1B39EC",
+"2. c #7077C5",
+"3. c #3A54E1",
+"4. c #1E36EA",
+"5. c #858CBF",
+"6. c #525FCB",
+"7. c #727CBC",
+" ",
+" . + @ ",
+" # $ % & ",
+" * = - ; > ",
+" , ' ) ! ~ { ",
+"] ^ / ( _ : < [ } | 1 2 3 4 5 ",
+"6 7 8 9 0 a b c d e f g h i j k ",
+"l m n o p q r s t u v u w x y z ",
+"A B C D E F G H I J K D L M N O ",
+"P Q R S T U V W X Y Z ` ...+.@.",
+"#.$.%.&.*.=.-.;.>.,.'.).!.~.{. ",
+" ].^. /.(._.:.<.[. ",
+" }.|.1.2. ",
+" 3.4.5. ",
+" 6.7. ",
+" "};
+
+static const char *stack_frame_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #00c000",
+"................",
+".###............",
+".#####..........",
+".#######........",
+".#########......",
+".###########....",
+".#############..",
+".##############.",
+".##############.",
+".#############..",
+".###########....",
+".#########......",
+".#######........",
+".#####..........",
+".###............",
+"................"};
+
+static QPixmap *errorPixmap = 0;
+static QPixmap *breakpointPixmap = 0;
+static QPixmap *stepPixmap = 0;
+static QPixmap *stackFrame = 0;
+
+MarkerWidget::MarkerWidget( ViewManager *parent, const char*name )
+ : QWidget( parent, name, WRepaintNoErase | WStaticContents | WResizeNoErase ), viewManager( parent )
+{
+ if ( !errorPixmap ) {
+ errorPixmap = new QPixmap( error_xpm );
+ breakpointPixmap = new QPixmap( breakpoint_xpm );
+ stepPixmap = new QPixmap( step_xpm );
+ stackFrame = new QPixmap( stack_frame_xpm );
+ }
+}
+
+void MarkerWidget::paintEvent( QPaintEvent * )
+{
+ buffer.fill( backgroundColor() );
+
+ QTextParagraph *p = ( (Editor*)viewManager->currentView() )->document()->firstParagraph();
+ QPainter painter( &buffer );
+ int yOffset = ( (Editor*)viewManager->currentView() )->contentsY();
+ while ( p ) {
+ if ( !p->isVisible() ) {
+ p = p->next();
+ continue;
+ }
+ if ( p->rect().y() + p->rect().height() - yOffset < 0 ) {
+ p = p->next();
+ continue;
+ }
+ if ( p->rect().y() - yOffset > height() )
+ break;
+ if ( !((p->paragId() + 1) % 10) ) {
+ painter.save();
+ painter.setPen( colorGroup().dark() );
+ painter.drawText( 0, p->rect().y() - yOffset, width() - 20, p->rect().height(),
+ Qt::AlignRight | Qt::AlignTop, QString::number( p->paragId() + 1 ) );
+ painter.restore();
+ }
+ ParagData *paragData = (ParagData*)p->extraData();
+ if ( paragData ) {
+ switch ( paragData->marker ) {
+ case ParagData::Error:
+ painter.drawPixmap( 3, p->rect().y() +
+ ( p->rect().height() - errorPixmap->height() ) / 2 -
+ yOffset, *errorPixmap );
+ break;
+ case ParagData::Breakpoint:
+ painter.drawPixmap( 3, p->rect().y() +
+ ( p->rect().height() - breakpointPixmap->height() ) / 2 -
+ yOffset, *breakpointPixmap );
+ break;
+ default:
+ break;
+ }
+ switch ( paragData->lineState ) {
+ case ParagData::FunctionStart:
+ painter.setPen( colorGroup().foreground() );
+ painter.setBrush( colorGroup().base() );
+ painter.drawLine( width() - 11, p->rect().y() - yOffset,
+ width() - 11, p->rect().y() + p->rect().height() - yOffset );
+ painter.drawRect( width() - 15, p->rect().y() + ( p->rect().height() - 9 ) / 2 - yOffset, 9, 9 );
+ painter.drawLine( width() - 13, p->rect().y() + ( p->rect().height() - 9 ) / 2 - yOffset + 4,
+ width() - 9, p->rect().y() +
+ ( p->rect().height() - 9 ) / 2 - yOffset + 4 );
+ if ( !paragData->functionOpen )
+ painter.drawLine( width() - 11,
+ p->rect().y() + ( p->rect().height() - 9 ) / 2 - yOffset + 2,
+ width() - 11,
+ p->rect().y() +
+ ( p->rect().height() - 9 ) / 2 - yOffset + 6 );
+ break;
+ case ParagData::InFunction:
+ painter.setPen( colorGroup().foreground() );
+ painter.drawLine( width() - 11, p->rect().y() - yOffset,
+ width() - 11, p->rect().y() + p->rect().height() - yOffset );
+ break;
+ case ParagData::FunctionEnd:
+ painter.setPen( colorGroup().foreground() );
+ painter.drawLine( width() - 11, p->rect().y() - yOffset,
+ width() - 11, p->rect().y() + p->rect().height() - yOffset );
+ painter.drawLine( width() - 11, p->rect().y() + p->rect().height() - yOffset,
+ width() - 7, p->rect().y() + p->rect().height() - yOffset );
+ break;
+ default:
+ break;
+ }
+ if ( paragData->step )
+ painter.drawPixmap( 3, p->rect().y() +
+ ( p->rect().height() - stepPixmap->height() ) / 2 -
+ yOffset, *stepPixmap );
+ if ( paragData->stackFrame )
+ painter.drawPixmap( 3, p->rect().y() +
+ ( p->rect().height() - stackFrame->height() ) / 2 -
+ yOffset, *stackFrame );
+ }
+ p = p->next();
+ }
+ painter.end();
+
+ bitBlt( this, 0, 0, &buffer );
+}
+
+void MarkerWidget::resizeEvent( QResizeEvent *e )
+{
+ buffer.resize( e->size() );
+ QWidget::resizeEvent( e );
+}
+
+void MarkerWidget::mousePressEvent( QMouseEvent *e )
+{
+ if ( e->button() != LeftButton )
+ return;
+ bool supports = ( (Editor*)viewManager->currentView() )->supportsBreakPoints();
+ QTextParagraph *p = ( (Editor*)viewManager->currentView() )->document()->firstParagraph();
+ int yOffset = ( (Editor*)viewManager->currentView() )->contentsY();
+ while ( p ) {
+ if ( e->y() >= p->rect().y() - yOffset && e->y() <= p->rect().y() + p->rect().height() - yOffset ) {
+ QTextParagraphData *d = p->extraData();
+ if ( !d )
+ return;
+ ParagData *data = (ParagData*)d;
+ if ( supports && ( e->x() < width() - 15 ) ) {
+ if ( data->marker == ParagData::Breakpoint ) {
+ data->marker = ParagData::NoMarker;
+ } else {
+ bool ok = TRUE;
+ isBreakpointPossible( ok, ( (Editor*)viewManager->currentView() )->text(), p->paragId() );
+ if ( ok )
+ data->marker = ParagData::Breakpoint;
+ else
+ emit showMessage( tr( "<font color=red>Can't set breakpoint here!</font>" ) );
+ }
+ } else {
+ if ( data->lineState == ParagData::FunctionStart ) {
+ if ( data->functionOpen )
+ emit collapseFunction( p );
+ else
+ emit expandFunction( p );
+ }
+ }
+ break;
+ }
+ p = p->next();
+ }
+ doRepaint();
+ emit markersChanged();
+}
+
+void MarkerWidget::contextMenuEvent( QContextMenuEvent *e )
+{
+ QPopupMenu m( 0, "editor_breakpointsmenu" );
+
+ int toggleBreakPoint = 0;
+// int editBreakpoints = 0;
+
+ QTextParagraph *p = ( (Editor*)viewManager->currentView() )->document()->firstParagraph();
+ int yOffset = ( (Editor*)viewManager->currentView() )->contentsY();
+ bool supports = ( (Editor*)viewManager->currentView() )->supportsBreakPoints();
+ while ( p && supports ) {
+ if ( e->y() >= p->rect().y() - yOffset && e->y() <= p->rect().y() + p->rect().height() - yOffset ) {
+ if ( ( (ParagData*)p->extraData() )->marker == ParagData::Breakpoint )
+ toggleBreakPoint = m.insertItem( tr( "Clear Breakpoint\tF9" ) );
+ else
+ toggleBreakPoint = m.insertItem( tr( "Set Breakpoint\tF9" ) );
+// editBreakpoints = m.insertItem( tr( "Edit Breakpoints..." ) );
+ m.insertSeparator();
+ break;
+ }
+ p = p->next();
+ }
+
+ const int collapseAll = m.insertItem( tr( "Collapse All" ) );
+ const int expandAll = m.insertItem( tr( "Expand All" ) );
+ const int collapseFunctions = m.insertItem( tr( "Collapse all Functions" ) );
+ const int expandFunctions = m.insertItem( tr( "Expand all Functions" ) );
+
+ int res = m.exec( e->globalPos() );
+ if ( res == -1)
+ return;
+
+ if ( res == collapseAll ) {
+ emit collapse( TRUE );
+ } else if ( res == collapseFunctions ) {
+ emit collapse( FALSE );
+ } else if ( res == expandAll ) {
+ emit expand( TRUE );
+ } else if ( res == expandFunctions ) {
+ emit expand( FALSE );
+ } else if ( res == toggleBreakPoint ) {
+ if ( ( (ParagData*)p->extraData() )->marker == ParagData::Breakpoint ) {
+ ( (ParagData*)p->extraData() )->marker = ParagData::NoMarker;
+ } else {
+ bool ok;
+ isBreakpointPossible( ok, ( (Editor*)viewManager->currentView() )->text(), p->paragId() );
+ if ( ok )
+ ( (ParagData*)p->extraData() )->marker = ParagData::Breakpoint;
+ else
+ emit showMessage( tr( "<font color=red>Can't set breakpoint here!</font>" ) );
+ }
+// } else if ( res == editBreakpoints ) {
+// emit editBreakPoints();
+ }
+ doRepaint();
+ emit markersChanged();
+}
diff --git a/tools/designer/editor/markerwidget.h b/tools/designer/editor/markerwidget.h
new file mode 100644
index 0000000..f1d406e
--- /dev/null
+++ b/tools/designer/editor/markerwidget.h
@@ -0,0 +1,75 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef MARKERWIDGET_H
+#define MARKERWIDGET_H
+
+#include <qwidget.h>
+#include <qpixmap.h>
+
+class ViewManager;
+class QTextParagraph;
+
+class MarkerWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ MarkerWidget( ViewManager *parent, const char*name );
+
+signals:
+ void markersChanged();
+ void expandFunction( QTextParagraph *p );
+ void collapseFunction( QTextParagraph *p );
+ void collapse( bool all /*else only functions*/ );
+ void expand( bool all /*else only functions*/ );
+ void editBreakPoints();
+ void isBreakpointPossible( bool &possible, const QString &code, int line );
+ void showMessage( const QString &msg );
+
+public slots:
+ void doRepaint() { repaint( FALSE ); }
+
+protected:
+ void paintEvent( QPaintEvent *e );
+ void resizeEvent( QResizeEvent *e );
+ void mousePressEvent( QMouseEvent *e );
+ void contextMenuEvent( QContextMenuEvent *e );
+
+private:
+ QPixmap buffer;
+ ViewManager *viewManager;
+
+};
+
+#endif
diff --git a/tools/designer/editor/paragdata.h b/tools/designer/editor/paragdata.h
new file mode 100644
index 0000000..64bb050
--- /dev/null
+++ b/tools/designer/editor/paragdata.h
@@ -0,0 +1,65 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PARAGDATA_H
+#define PARAGDATA_H
+
+#include "parenmatcher.h"
+#include <private/qrichtext_p.h>
+
+struct ParagData : public QTextParagraphData
+{
+public:
+ enum MarkerType { NoMarker, Error, Breakpoint };
+ enum LineState { FunctionStart, InFunction, FunctionEnd, Invalid };
+
+ ParagData() : lastLengthForCompletion( -1 ), marker( NoMarker ),
+ lineState( Invalid ), functionOpen( TRUE ), step( FALSE ), stackFrame( FALSE ) {}
+ ~ParagData() {}
+ void join( QTextParagraphData *data ) {
+ ParagData *d = (ParagData*)data;
+ if ( marker == NoMarker )
+ marker = d->marker;
+ lineState = d->lineState;
+ }
+ ParenList parenList;
+ int lastLengthForCompletion;
+ MarkerType marker;
+ LineState lineState;
+ bool functionOpen;
+ bool step;
+ bool stackFrame;
+
+};
+
+#endif
diff --git a/tools/designer/editor/parenmatcher.cpp b/tools/designer/editor/parenmatcher.cpp
new file mode 100644
index 0000000..ae7a3b5
--- /dev/null
+++ b/tools/designer/editor/parenmatcher.cpp
@@ -0,0 +1,215 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "parenmatcher.h"
+#include "paragdata.h"
+
+#include "qtextedit.h"
+#include <private/qrichtext_p.h>
+#include <qapplication.h>
+
+ParenMatcher::ParenMatcher()
+{
+ enabled = TRUE;
+}
+
+bool ParenMatcher::match( QTextCursor *cursor )
+{
+ if ( !enabled )
+ return FALSE;
+ bool ret = FALSE;
+
+ QChar c( cursor->paragraph()->at( cursor->index() )->c );
+ bool ok1 = FALSE;
+ bool ok2 = FALSE;
+ if ( c == '{' || c == '(' || c == '[' ) {
+ ok1 = checkOpenParen( cursor );
+ ret = ok1 || ret;
+ } else if ( cursor->index() > 0 ) {
+ c = cursor->paragraph()->at( cursor->index() - 1 )->c;
+ if ( c == '}' || c == ')' || c == ']' ) {
+ ok2 = checkClosedParen( cursor );
+ ret = ok2 || ret;
+ }
+ }
+
+ return ret;
+}
+
+bool ParenMatcher::checkOpenParen( QTextCursor *cursor )
+{
+ if ( !cursor->paragraph()->extraData() )
+ return FALSE;
+ ParenList parenList = ( (ParagData*)cursor->paragraph()->extraData() )->parenList;
+
+ Paren openParen, closedParen;
+ QTextParagraph *closedParenParag = cursor->paragraph();
+
+ int i = 0;
+ int ignore = 0;
+ bool foundOpen = FALSE;
+ QChar c = cursor->paragraph()->at( cursor->index() )->c;
+ for (;;) {
+ if ( !foundOpen ) {
+ if ( i >= (int)parenList.count() )
+ goto bye;
+ openParen = parenList[ i ];
+ if ( openParen.pos != cursor->index() ) {
+ ++i;
+ continue;
+ } else {
+ foundOpen = TRUE;
+ ++i;
+ }
+ }
+
+ if ( i >= (int)parenList.count() ) {
+ for (;;) {
+ closedParenParag = closedParenParag->next();
+ if ( !closedParenParag )
+ goto bye;
+ if ( closedParenParag->extraData() &&
+ ( (ParagData*)closedParenParag->extraData() )->parenList.count() > 0 ) {
+ parenList = ( (ParagData*)closedParenParag->extraData() )->parenList;
+ break;
+ }
+ }
+ i = 0;
+ }
+
+ closedParen = parenList[ i ];
+ if ( closedParen.type == Paren::Open ) {
+ ignore++;
+ ++i;
+ continue;
+ } else {
+ if ( ignore > 0 ) {
+ ignore--;
+ ++i;
+ continue;
+ }
+
+ int id = Match;
+ if ( c == '{' && closedParen.chr != '}' ||
+ c == '(' && closedParen.chr != ')' ||
+ c == '[' && closedParen.chr != ']' )
+ id = Mismatch;
+ cursor->document()->setSelectionStart( id, *cursor );
+ int tidx = cursor->index();
+ QTextParagraph *tstring = cursor->paragraph();
+ cursor->setParagraph( closedParenParag );
+ cursor->setIndex( closedParen.pos + 1 );
+ cursor->document()->setSelectionEnd( id, *cursor );
+ cursor->setParagraph( tstring );
+ cursor->setIndex( tidx );
+ return TRUE;
+ }
+ }
+
+ bye:
+ return FALSE;
+}
+
+bool ParenMatcher::checkClosedParen( QTextCursor *cursor )
+{
+ if ( !cursor->paragraph()->extraData() )
+ return FALSE;
+ ParenList parenList = ( (ParagData*)cursor->paragraph()->extraData() )->parenList;
+
+ Paren openParen, closedParen;
+ QTextParagraph *openParenParag = cursor->paragraph();
+
+ int i = (int)parenList.count() - 1;
+ int ignore = 0;
+ bool foundClosed = FALSE;
+ QChar c = cursor->paragraph()->at( cursor->index() - 1 )->c;
+ for (;;) {
+ if ( !foundClosed ) {
+ if ( i < 0 )
+ goto bye;
+ closedParen = parenList[ i ];
+ if ( closedParen.pos != cursor->index() - 1 ) {
+ --i;
+ continue;
+ } else {
+ foundClosed = TRUE;
+ --i;
+ }
+ }
+
+ if ( i < 0 ) {
+ for (;;) {
+ openParenParag = openParenParag->prev();
+ if ( !openParenParag )
+ goto bye;
+ if ( openParenParag->extraData() &&
+ ( (ParagData*)openParenParag->extraData() )->parenList.count() > 0 ) {
+ parenList = ( (ParagData*)openParenParag->extraData() )->parenList;
+ break;
+ }
+ }
+ i = (int)parenList.count() - 1;
+ }
+
+ openParen = parenList[ i ];
+ if ( openParen.type == Paren::Closed ) {
+ ignore++;
+ --i;
+ continue;
+ } else {
+ if ( ignore > 0 ) {
+ ignore--;
+ --i;
+ continue;
+ }
+
+ int id = Match;
+ if ( c == '}' && openParen.chr != '{' ||
+ c == ')' && openParen.chr != '(' ||
+ c == ']' && openParen.chr != '[' )
+ id = Mismatch;
+ cursor->document()->setSelectionStart( id, *cursor );
+ int tidx = cursor->index();
+ QTextParagraph *tstring = cursor->paragraph();
+ cursor->setParagraph( openParenParag );
+ cursor->setIndex( openParen.pos );
+ cursor->document()->setSelectionEnd( id, *cursor );
+ cursor->setParagraph( tstring );
+ cursor->setIndex( tidx );
+ return TRUE;
+ }
+ }
+
+ bye:
+ return FALSE;
+}
diff --git a/tools/designer/editor/parenmatcher.h b/tools/designer/editor/parenmatcher.h
new file mode 100644
index 0000000..9bb2568
--- /dev/null
+++ b/tools/designer/editor/parenmatcher.h
@@ -0,0 +1,78 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PARENMATCHER_H
+#define PARENMATCHER_H
+
+#include <qstring.h>
+#include <qvaluelist.h>
+
+class QTextCursor;
+
+struct Paren
+{
+ Paren() : type( Open ), chr( ' ' ), pos( -1 ) {}
+ Paren( int t, const QChar &c, int p ) : type( (Type)t ), chr( c ), pos( p ) {}
+ enum Type { Open, Closed };
+ Type type;
+ QChar chr;
+ int pos;
+
+ Q_DUMMY_COMPARISON_OPERATOR( Paren )
+};
+
+typedef QValueList<Paren> ParenList;
+
+class ParenMatcher
+{
+public:
+ enum Selection {
+ Match = 1,
+ Mismatch
+ };
+
+ ParenMatcher();
+
+ virtual bool match( QTextCursor *c );
+
+ void setEnabled( bool b ) { enabled = b; }
+
+private:
+ bool checkOpenParen( QTextCursor *c );
+ bool checkClosedParen( QTextCursor *c );
+
+ bool enabled;
+
+};
+
+#endif
diff --git a/tools/designer/editor/preferences.ui b/tools/designer/editor/preferences.ui
new file mode 100644
index 0000000..5dc1d53
--- /dev/null
+++ b/tools/designer/editor/preferences.ui
@@ -0,0 +1,510 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>PreferencesBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>PreferencesBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>362</width>
+ <height>396</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form1</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>6</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QGroupBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="title">
+ <string>S&amp;yntax Highlighting</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Element:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>listElements</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>checkBold</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Bold</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="5" column="1">
+ <property name="name">
+ <cstring>buttonColor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>comboFamily</cstring>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Family:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboFamily</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>checkUnderline</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Underline</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>spinSize</cstring>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>checkItalic</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Italic</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Change co&amp;lor:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>buttonColor</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Size:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spinSize</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QListBox" row="1" column="0">
+ <item>
+ <property name="text">
+ <string>Comment</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Number</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>String</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Type</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Keyword</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Preprocessor</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Label</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Standard</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>listElements</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Preview:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editPreview</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="0">
+ <property name="name">
+ <cstring>editPreview</cstring>
+ </property>
+ <property name="text">
+ <string>Some Text</string>
+ </property>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>GroupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Optio&amp;ns</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkWordWrap</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Word Wrap</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkCompletion</cstring>
+ </property>
+ <property name="text">
+ <string>Comple&amp;tion</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkParenMatching</cstring>
+ </property>
+ <property name="text">
+ <string>Parentheses &amp;Matching</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="1" column="1">
+ <property name="name">
+ <cstring>GroupBox3_2</cstring>
+ </property>
+ <property name="title">
+ <string>Indentation</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>spinTabSize</cstring>
+ </property>
+ <property name="value">
+ <number>8</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Tab Size:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>spinIndentSize</cstring>
+ </property>
+ <property name="value">
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel2_3</cstring>
+ </property>
+ <property name="text">
+ <string>Indent Size:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkKeepTabs</cstring>
+ </property>
+ <property name="text">
+ <string>Keep Tabs</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkAutoIndent</cstring>
+ </property>
+ <property name="text">
+ <string>Auto Indent</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>spinSize</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>PreferencesBase</receiver>
+ <slot>sizeChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>checkBold</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PreferencesBase</receiver>
+ <slot>boldChanged(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkItalic</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PreferencesBase</receiver>
+ <slot>italicChanged(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkUnderline</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PreferencesBase</receiver>
+ <slot>underlineChanged(bool)</slot>
+ </connection>
+ <connection>
+ <sender>buttonColor</sender>
+ <signal>clicked()</signal>
+ <receiver>PreferencesBase</receiver>
+ <slot>colorClicked()</slot>
+ </connection>
+ <connection>
+ <sender>comboFamily</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>PreferencesBase</receiver>
+ <slot>familyChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>listElements</sender>
+ <signal>highlighted(const QString&amp;)</signal>
+ <receiver>PreferencesBase</receiver>
+ <slot>elementChanged(const QString&amp;)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>listElements</tabstop>
+ <tabstop>editPreview</tabstop>
+ <tabstop>comboFamily</tabstop>
+ <tabstop>spinSize</tabstop>
+ <tabstop>checkBold</tabstop>
+ <tabstop>checkItalic</tabstop>
+ <tabstop>checkUnderline</tabstop>
+ <tabstop>checkWordWrap</tabstop>
+ <tabstop>checkCompletion</tabstop>
+ <tabstop>checkParenMatching</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">qmap.h</include>
+ <include location="local" impldecl="in declaration">conf.h</include>
+ <include location="global" impldecl="in implementation">qpalette.h</include>
+ <include location="global" impldecl="in implementation">qlineedit.h</include>
+ <include location="global" impldecl="in implementation">qpixmap.h</include>
+ <include location="global" impldecl="in implementation">qcombobox.h</include>
+ <include location="global" impldecl="in implementation">qfontdatabase.h</include>
+ <include location="local" impldecl="in implementation">editor.h</include>
+ <include location="global" impldecl="in implementation">qpushbutton.h</include>
+ <include location="global" impldecl="in implementation">qcheckbox.h</include>
+ <include location="global" impldecl="in implementation">qcolordialog.h</include>
+ <include location="global" impldecl="in implementation">qsettings.h</include>
+ <include location="local" impldecl="in implementation">preferences.ui.h</include>
+</includes>
+<variables>
+ <variable>QString path;</variable>
+ <variable>QMap&lt;QString, ConfigStyle&gt; styles;</variable>
+ <variable>ConfigStyle currentStyle;</variable>
+ <variable>QString currentElement;</variable>
+</variables>
+<slots>
+ <slot>init()</slot>
+ <slot>destroy()</slot>
+ <slot>colorClicked()</slot>
+ <slot>reInit()</slot>
+ <slot>save()</slot>
+ <slot>updatePreview()</slot>
+ <slot>boldChanged( bool b )</slot>
+ <slot>elementChanged( const QString &amp; element )</slot>
+ <slot>familyChanged( const QString &amp; f )</slot>
+ <slot>italicChanged( bool b )</slot>
+ <slot>setColorPixmap( const QColor &amp; c )</slot>
+ <slot>setPath( const QString &amp; p )</slot>
+ <slot>sizeChanged( int s )</slot>
+ <slot>underlineChanged( bool b )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/editor/preferences.ui.h b/tools/designer/editor/preferences.ui.h
new file mode 100644
index 0000000..b175ca8
--- /dev/null
+++ b/tools/designer/editor/preferences.ui.h
@@ -0,0 +1,181 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+void PreferencesBase::init()
+{
+ QFontDatabase fdb;
+ comboFamily->insertStringList( fdb.families() );
+ listElements->setCurrentItem( listElements->firstItem() );
+ currentElement = "";
+}
+
+void PreferencesBase::destroy()
+{
+
+}
+
+void PreferencesBase::colorClicked()
+{
+ QColor c = QColorDialog::getColor( currentStyle.color, this, "editor_getcolor_dlg" );
+ if ( c.isValid() ) {
+ currentStyle.color = c;
+ setColorPixmap( c );
+ }
+}
+
+void PreferencesBase::reInit()
+{
+ styles = Config::readStyles( path );
+ currentElement = "";
+ elementChanged( "Comment" );
+ for ( int i = 0; i < comboFamily->count(); ++i ) {
+ if ( listElements->text( i ) == "Comment" ) {
+ listElements->setCurrentItem( i );
+ break;
+ }
+ }
+ checkWordWrap->setChecked( Config::wordWrap( path ) );
+ checkCompletion->setChecked( Config::completion( path ) );
+ checkParenMatching->setChecked( Config::parenMatching( path ) );
+ spinTabSize->setValue( Config::indentTabSize( path ) );
+ spinIndentSize->setValue( Config::indentIndentSize( path ) );
+ checkKeepTabs->setChecked( Config::indentKeepTabs( path ) );
+ checkAutoIndent->setChecked( Config::indentAutoIndent( path ) );
+}
+
+void PreferencesBase::save()
+{
+ if ( !currentElement.isEmpty() ) {
+ styles.remove( currentElement );
+ styles.insert( currentElement, currentStyle );
+ currentElement = "";
+ }
+
+ QSettings settings;
+ Config::saveStyles( styles, path );
+ Config::setWordWrap( checkWordWrap->isChecked(), path );
+ Config::setCompletion( checkCompletion->isChecked(), path );
+ Config::setParenMatching( checkParenMatching->isChecked(), path );
+ Config::setIndentTabSize( spinTabSize->value(), path );
+ Config::setIndentIndentSize( spinIndentSize->value(), path );
+ Config::setIndentKeepTabs( checkKeepTabs->isChecked(), path );
+ Config::setIndentAutoIndent( checkAutoIndent->isChecked(), path );
+}
+
+void PreferencesBase::updatePreview()
+{
+ editPreview->setFont( currentStyle.font );
+ QPalette pal = editPreview->palette();
+ pal.setColor( QPalette::Active, QColorGroup::Text, currentStyle.color );
+ pal.setColor( QPalette::Active, QColorGroup::Foreground, currentStyle.color );
+ editPreview->setPalette( pal );
+}
+
+void PreferencesBase::boldChanged( bool b )
+{
+ currentStyle.font.setBold( b );
+ updatePreview();
+}
+
+void PreferencesBase::elementChanged( const QString &element )
+{
+ if ( !currentElement.isEmpty() ) {
+ styles.remove( currentElement );
+ styles.insert( currentElement, currentStyle );
+ currentElement = "";
+ }
+ QMap<QString, ConfigStyle>::Iterator it = styles.find( element );
+ if ( it == styles.end() )
+ return;
+ ConfigStyle s = *it;
+ currentStyle = s;
+ comboFamily->lineEdit()->setText( s.font.family() );
+ spinSize->setValue( s.font.pointSize() );
+ checkBold->setChecked( s.font.bold() );
+ checkItalic->setChecked( s.font.italic() );
+ checkUnderline->setChecked( s.font.underline() );
+ setColorPixmap( s.color );
+ currentElement = element;
+ updatePreview();
+}
+
+void PreferencesBase::familyChanged( const QString &f )
+{
+ QString oldFamily = currentStyle.font.family();
+ currentStyle.font.setFamily( f );
+ if ( currentElement == "Standard" ) {
+ for ( QMap<QString, ConfigStyle>::Iterator it = styles.begin(); it != styles.end(); ++it ) {
+ if ( (*it).font.family() == oldFamily )
+ (*it).font.setFamily( f );
+ }
+ }
+ updatePreview();
+}
+
+void PreferencesBase::italicChanged( bool b )
+{
+ currentStyle.font.setItalic( b );
+ updatePreview();
+}
+
+void PreferencesBase::setColorPixmap( const QColor &c )
+{
+ QPixmap pm( 20, 20 );
+ pm.fill( c );
+ buttonColor->setPixmap( pm );
+ updatePreview();
+}
+
+void PreferencesBase::setPath( const QString &p )
+{
+ path = p;
+}
+
+void PreferencesBase::sizeChanged( int s )
+{
+ int oldSize = currentStyle.font.pointSize();
+ currentStyle.font.setPointSize( s );
+ if ( currentElement == "Standard" ) {
+ for ( QMap<QString, ConfigStyle>::Iterator it = styles.begin(); it != styles.end(); ++it ) {
+ if ( (*it).font.pointSize() == oldSize )
+ (*it).font.setPointSize( s );
+ }
+ }
+ updatePreview();
+}
+
+void PreferencesBase::underlineChanged( bool b )
+{
+ currentStyle.font.setUnderline( b );
+ updatePreview();
+}
diff --git a/tools/designer/editor/viewmanager.cpp b/tools/designer/editor/viewmanager.cpp
new file mode 100644
index 0000000..cc6f634
--- /dev/null
+++ b/tools/designer/editor/viewmanager.cpp
@@ -0,0 +1,276 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "viewmanager.h"
+#include "editor.h"
+#include "markerwidget.h"
+#include <qlayout.h>
+#include <private/qrichtext_p.h>
+#include "paragdata.h"
+#include <qobjectlist.h>
+#include <qlabel.h>
+#include <qtimer.h>
+
+ViewManager::ViewManager( QWidget *parent, const char *name )
+ : QWidget( parent, name ), curView( 0 )
+{
+ QHBoxLayout *l = new QHBoxLayout( this );
+ markerWidget = new MarkerWidget( this, "editor_markerwidget" );
+ connect( markerWidget, SIGNAL( markersChanged() ),
+ this, SIGNAL( markersChanged() ) );
+ connect( markerWidget, SIGNAL( collapseFunction( QTextParagraph * ) ),
+ this, SIGNAL( collapseFunction( QTextParagraph * ) ) );
+ connect( markerWidget, SIGNAL( expandFunction( QTextParagraph * ) ),
+ this, SIGNAL( expandFunction( QTextParagraph * ) ) );
+ connect( markerWidget, SIGNAL( collapse( bool ) ),
+ this, SIGNAL( collapse( bool ) ) );
+ connect( markerWidget, SIGNAL( expand( bool ) ),
+ this, SIGNAL( expand( bool ) ) );
+ connect( markerWidget, SIGNAL( editBreakPoints() ),
+ this, SIGNAL( editBreakPoints() ) );
+ connect( markerWidget, SIGNAL( isBreakpointPossible( bool&, const QString &, int ) ),
+ this, SIGNAL( isBreakpointPossible( bool&, const QString &, int ) ) );
+ connect( markerWidget, SIGNAL( showMessage( const QString & ) ),
+ this, SLOT( showMessage( const QString & ) ) );
+ messageTimer = new QTimer( this );
+ connect( messageTimer, SIGNAL( timeout() ), this, SLOT( clearStatusBar() ) );
+ markerWidget->setFixedWidth( fontMetrics().width( "0000" ) + 20 );
+ l->addWidget( markerWidget );
+ layout = new QVBoxLayout( l );
+}
+
+void ViewManager::addView( QWidget *view )
+{
+ layout->addWidget( view );
+ curView = view;
+ connect( ( (Editor*)curView )->verticalScrollBar(), SIGNAL( valueChanged( int ) ),
+ markerWidget, SLOT( doRepaint() ) );
+ connect( (Editor*)curView, SIGNAL( textChanged() ),
+ markerWidget, SLOT( doRepaint() ) );
+ connect( (Editor*)curView, SIGNAL( clearErrorMarker() ),
+ this, SLOT( clearErrorMarker() ) );
+ posLabel = new QLabel( this, "editor_poslabel" );
+ posLabel->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
+ posLabel->setText( " Line: 1 Col: 1" );
+ posLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel );
+ posLabel->setLineWidth( 1 );
+ posLabel->setFixedHeight( posLabel->fontMetrics().height() );
+ layout->addWidget( posLabel );
+ connect( curView, SIGNAL( cursorPositionChanged( int, int ) ),
+ this, SLOT( cursorPositionChanged( int, int ) ) );
+}
+
+QWidget *ViewManager::currentView() const
+{
+ return curView;
+}
+
+void ViewManager::childEvent( QChildEvent *e )
+{
+ if ( e->type() == QEvent::ChildInserted && ::qt_cast<Editor*>(e->child()) )
+ addView( (QWidget*)e->child() );
+ QWidget::childEvent( e );
+}
+
+void ViewManager::setError( int line )
+{
+ QTextParagraph *p = ( (Editor*)curView )->document()->paragAt( line );
+ if ( p ) {
+ ( (Editor*)curView )->setErrorSelection( line );
+ ( (Editor*)curView )->setCursorPosition( line, 0 );
+ ( (Editor*)curView )->viewport()->setFocus();
+ ( (Editor*)curView )->makeFunctionVisible( p );
+ ParagData *paragData = (ParagData*)p->extraData();
+ if ( !paragData )
+ paragData = new ParagData;
+ paragData->marker = ParagData::Error;
+ p->setExtraData( paragData );
+ markerWidget->doRepaint();
+ }
+}
+
+void ViewManager::setStep( int line )
+{
+ QTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph();
+ while ( p ) {
+ if ( p->extraData() )
+ ( (ParagData*)p->extraData() )->step = FALSE;
+ p = p->next();
+ }
+ p = ( (Editor*)curView )->document()->paragAt( line );
+ if ( p ) {
+ ( (Editor*)curView )->setStepSelection( line );
+ ( (Editor*)curView )->setCursorPosition( line, 0 );
+ ( (Editor*)curView )->viewport()->setFocus();
+ ( (Editor*)curView )->makeFunctionVisible( p );
+ ParagData *paragData = (ParagData*)p->extraData();
+ if ( !paragData )
+ paragData = new ParagData;
+ paragData->step = TRUE;
+ p->setExtraData( paragData );
+ markerWidget->doRepaint();
+ }
+}
+
+void ViewManager::clearStep()
+{
+ ( (Editor*)curView )->clearStepSelection();
+ QTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph();
+ while ( p ) {
+ if ( p->extraData() )
+ ( (ParagData*)p->extraData() )->step = FALSE;
+ p = p->next();
+ }
+ markerWidget->doRepaint();
+}
+
+void ViewManager::setStackFrame( int line )
+{
+ QTextParagraph *p = ( (Editor*)curView )->document()->paragAt( line );
+ if ( p ) {
+ ( (Editor*)curView )->sync();
+ ( (Editor*)curView )->setCursorPosition( line, 0 );
+ ( (Editor*)curView )->ensureCursorVisible();
+ ( (Editor*)curView )->viewport()->setFocus();
+ ( (Editor*)curView )->makeFunctionVisible( p );
+ ParagData *paragData = (ParagData*)p->extraData();
+ if ( !paragData )
+ paragData = new ParagData;
+ paragData->stackFrame = TRUE;
+ p->setExtraData( paragData );
+ markerWidget->doRepaint();
+ }
+}
+
+void ViewManager::clearStackFrame()
+{
+ QTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph();
+ while ( p ) {
+ if ( p->extraData() ) {
+ ( (ParagData*)p->extraData() )->stackFrame = FALSE;
+ if ( ( (ParagData*)p->extraData() )->marker == ParagData::Error )
+ ( (ParagData*)p->extraData() )->marker = ParagData::NoMarker;
+ }
+ p = p->next();
+ }
+ markerWidget->doRepaint();
+}
+
+void ViewManager::resizeEvent( QResizeEvent *e )
+{
+ QWidget::resizeEvent( e );
+ markerWidget->doRepaint();
+}
+
+void ViewManager::clearErrorMarker()
+{
+ QTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph();
+ while ( p ) {
+ if ( p->extraData() )
+ ( (ParagData*)p->extraData() )->marker = ParagData::NoMarker;
+ p = p->next();
+ }
+ markerWidget->doRepaint();
+}
+
+void ViewManager::setBreakPoints( const QValueList<uint> &l )
+{
+ QTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph();
+ int i = 0;
+ while ( p ) {
+ if ( l.find( i ) != l.end() ) {
+ if ( !p->extraData() ) {
+ ParagData *data = new ParagData;
+ p->setExtraData( data );
+ }
+ ParagData *data = (ParagData*)p->extraData();
+ data->marker = ParagData::Breakpoint;
+ } else if ( p->extraData() ) {
+ ParagData *data = (ParagData*)p->extraData();
+ data->marker = ParagData::NoMarker;
+ }
+ p = p->next();
+ ++i;
+ }
+ markerWidget->doRepaint();
+}
+
+QValueList<uint> ViewManager::breakPoints() const
+{
+ QValueList<uint> l;
+ int i = 0;
+ QTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph();
+ while ( p ) {
+ if ( p->extraData() &&
+ ( (ParagData*)p->extraData() )->marker == ParagData::Breakpoint )
+ l << i;
+ p = p->next();
+ ++i;
+ }
+ return l;
+}
+
+void ViewManager::showMarkerWidget( bool b )
+{
+ if ( b )
+ markerWidget->show();
+ else
+ markerWidget->hide();
+}
+
+void ViewManager::emitMarkersChanged()
+{
+ emit markersChanged();
+}
+
+void ViewManager::cursorPositionChanged( int row, int col )
+{
+ posLabel->setText( QString( " Line: %1 Col: %2" ).arg( row + 1 ).arg( col + 1 ) );
+}
+
+void ViewManager::showMessage( const QString &msg )
+{
+ int row;
+ int col;
+ ( (QTextEdit*)currentView() )->getCursorPosition( &row, &col );
+ posLabel->setText( msg );
+ messageTimer->start( 1000, TRUE );
+}
+
+void ViewManager::clearStatusBar()
+{
+ int row;
+ int col;
+ ( (QTextEdit*)currentView() )->getCursorPosition( &row, &col );
+ posLabel->setText( QString( " Line: %1 Col: %2" ).arg( row + 1 ).arg( col + 1 ) );
+}
diff --git a/tools/designer/editor/viewmanager.h b/tools/designer/editor/viewmanager.h
new file mode 100644
index 0000000..72d9859
--- /dev/null
+++ b/tools/designer/editor/viewmanager.h
@@ -0,0 +1,100 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef VIEWMANAGER_H
+#define VIEWMANAGER_H
+
+#include <qwidget.h>
+#include <qvaluelist.h>
+
+class QChildEvent;
+class MarkerWidget;
+class QVBoxLayout;
+class QDockArea;
+class QTextParagraph;
+class QLabel;
+class QTimer;
+
+class ViewManager : public QWidget
+{
+ Q_OBJECT
+
+public:
+ ViewManager( QWidget *parent, const char *name );
+
+ void addView( QWidget *view );
+ QWidget *currentView() const;
+ void showMarkerWidget( bool );
+
+ void setError( int line );
+ void setStep( int line );
+ void setStackFrame( int line );
+ void clearStep();
+ void clearStackFrame();
+ void setBreakPoints( const QValueList<uint> &l );
+ QValueList<uint> breakPoints() const;
+
+ void emitMarkersChanged();
+ MarkerWidget *marker_widget() const { return markerWidget; }
+
+signals:
+ void markersChanged();
+ void expandFunction( QTextParagraph *p );
+ void collapseFunction( QTextParagraph *p );
+ void collapse( bool all /*else only functions*/ );
+ void expand( bool all /*else only functions*/ );
+ void editBreakPoints();
+ void isBreakpointPossible( bool &possible, const QString &code, int line );
+
+protected slots:
+ void clearErrorMarker();
+ void cursorPositionChanged( int row, int col );
+ void showMessage( const QString &msg );
+ void clearStatusBar();
+
+protected:
+ void childEvent( QChildEvent *e );
+ void resizeEvent( QResizeEvent *e );
+
+private:
+ QWidget *curView;
+ MarkerWidget *markerWidget;
+ QVBoxLayout *layout;
+ QDockArea *dockArea;
+ QLabel *posLabel;
+ QString extraText;
+ QTimer *messageTimer;
+
+};
+
+#endif
diff --git a/tools/designer/editor/yyindent.cpp b/tools/designer/editor/yyindent.cpp
new file mode 100644
index 0000000..df9a78f
--- /dev/null
+++ b/tools/designer/editor/yyindent.cpp
@@ -0,0 +1,1170 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+/*
+ This file is a self-contained interactive indenter for C++ and Qt
+ Script.
+
+ The general problem of indenting a C++ program is ill posed. On the
+ one hand, an indenter has to analyze programs written in a
+ free-form formal language that is best described in terms of
+ tokens, not characters, not lines. On the other hand, indentation
+ applies to lines and white space characters matter, and otherwise
+ the programs to indent are formally invalid in general, as they are
+ begin edited.
+
+ The approach taken here works line by line. We receive a program
+ consisting of N lines or more, and we want to compute the
+ indentation appropriate for the Nth line. Lines beyond the Nth
+ lines are of no concern to us, so for simplicity we pretend the
+ program has exactly N lines and we call the Nth line the "bottom
+ line". Typically, we have to indent the bottom line when it's still
+ empty, so we concentrate our analysis on the N - 1 lines that
+ precede.
+
+ By inspecting the (N - 1)-th line, the (N - 2)-th line, ...
+ backwards, we determine the kind of the bottom line and indent it
+ accordingly.
+
+ * The bottom line is a comment line. See
+ bottomLineStartsInCComment() and
+ indentWhenBottomLineStartsInCComment().
+ * The bottom line is a continuation line. See isContinuationLine()
+ and indentForContinuationLine().
+ * The bottom line is a standalone line. See
+ indentForStandaloneLine().
+
+ Certain tokens that influence the indentation, notably braces, are
+ looked for in the lines. This is done by simple string comparison,
+ without a real tokenizer. Confusing constructs such as comments and
+ string literals are removed beforehand.
+*/
+
+#include <qregexp.h>
+
+/* qmake ignore Q_OBJECT */
+
+/*
+ The indenter avoids getting stuck in almost infinite loops by
+ imposing arbitrary limits on the number of lines it analyzes when
+ looking for a construct.
+
+ For example, the indenter never considers more than BigRoof lines
+ backwards when looking for the start of a C-style comment.
+*/
+static const int SmallRoof = 40;
+static const int BigRoof = 400;
+
+/*
+ The indenter supports a few parameters:
+
+ * ppHardwareTabSize is the size of a '\t' in your favorite editor.
+ * ppIndentSize is the size of an indentation, or software tab
+ size.
+ * ppContinuationIndentSize is the extra indent for a continuation
+ line, when there is nothing to align against on the previous
+ line.
+ * ppCommentOffset is the indentation within a C-style comment,
+ when it cannot be picked up.
+*/
+
+static int ppHardwareTabSize = 8;
+static int ppIndentSize = 4;
+static int ppContinuationIndentSize = 8;
+
+static const int ppCommentOffset = 2;
+
+void setTabSize( int size )
+{
+ ppHardwareTabSize = size;
+}
+
+void setIndentSize( int size )
+{
+ ppIndentSize = size;
+ ppContinuationIndentSize = 2 * size;
+}
+
+static QRegExp *literal = 0;
+static QRegExp *label = 0;
+static QRegExp *inlineCComment = 0;
+static QRegExp *braceX = 0;
+static QRegExp *iflikeKeyword = 0;
+
+/*
+ Returns the first non-space character in the string t, or
+ QChar::null if the string is made only of white space.
+*/
+static QChar firstNonWhiteSpace( const QString& t )
+{
+ int i = 0;
+ while ( i < (int) t.length() ) {
+ if ( !t[i].isSpace() )
+ return t[i];
+ i++;
+ }
+ return QChar::null;
+}
+
+/*
+ Returns TRUE if string t is made only of white space; otherwise
+ returns FALSE.
+*/
+static bool isOnlyWhiteSpace( const QString& t )
+{
+ return firstNonWhiteSpace( t ).isNull();
+}
+
+/*
+ Assuming string t is a line, returns the column number of a given
+ index. Column numbers and index are identical for strings that don't
+ contain '\t's.
+*/
+int columnForIndex( const QString& t, int index )
+{
+ int col = 0;
+ if ( index > (int) t.length() )
+ index = t.length();
+
+ for ( int i = 0; i < index; i++ ) {
+ if ( t[i] == QChar('\t') ) {
+ col = ( (col / ppHardwareTabSize) + 1 ) * ppHardwareTabSize;
+ } else {
+ col++;
+ }
+ }
+ return col;
+}
+
+/*
+ Returns the indentation size of string t.
+*/
+int indentOfLine( const QString& t )
+{
+ return columnForIndex( t, t.find(firstNonWhiteSpace(t)) );
+}
+
+/*
+ Replaces t[k] by ch, unless t[k] is '\t'. Tab characters are better
+ left alone since they break the "index equals column" rule. No
+ provisions are taken against '\n' or '\r', which shouldn't occur in
+ t anyway.
+*/
+static inline void eraseChar( QString& t, int k, QChar ch )
+{
+ if ( t[k] != '\t' )
+ t[k] = ch;
+}
+
+/*
+ Removes some nefast constructs from a code line and returns the
+ resulting line.
+*/
+static QString trimmedCodeLine( const QString& t )
+{
+ QString trimmed = t;
+ int k;
+
+ /*
+ Replace character and string literals by X's, since they may
+ contain confusing characters (such as '{' and ';'). "Hello!" is
+ replaced by XXXXXXXX. The literals are rigourously of the same
+ length before and after; otherwise, we would break alignment of
+ continuation lines.
+ */
+ k = 0;
+ while ( (k = trimmed.find(*literal, k)) != -1 ) {
+ for ( int i = 0; i < literal->matchedLength(); i++ )
+ eraseChar( trimmed, k + i, 'X' );
+ k += literal->matchedLength();
+ }
+
+ /*
+ Replace inline C-style comments by spaces. Other comments are
+ handled elsewhere.
+ */
+ k = 0;
+ while ( (k = trimmed.find(*inlineCComment, k)) != -1 ) {
+ for ( int i = 0; i < inlineCComment->matchedLength(); i++ )
+ eraseChar( trimmed, k + i, ' ' );
+ k += inlineCComment->matchedLength();
+ }
+
+ /*
+ Replace goto and switch labels by whitespace, but be careful
+ with this case:
+
+ foo1: bar1;
+ bar2;
+ */
+ while ( trimmed.findRev(':') != -1 && trimmed.find(*label) != -1 ) {
+ QString cap1 = label->cap( 1 );
+ int pos1 = label->pos( 1 );
+ int stop = cap1.length();
+
+ if ( pos1 + stop < (int) trimmed.length() && ppIndentSize < stop )
+ stop = ppIndentSize;
+
+ int i = 0;
+ while ( i < stop ) {
+ eraseChar( trimmed, pos1 + i, ' ' );
+ i++;
+ }
+ while ( i < (int) cap1.length() ) {
+ eraseChar( trimmed, pos1 + i, ';' );
+ i++;
+ }
+ }
+
+ /*
+ Remove C++-style comments.
+ */
+ k = trimmed.find( "//" );
+ if ( k != -1 )
+ trimmed.truncate( k );
+
+ return trimmed;
+}
+
+/*
+ Returns '(' if the last parenthesis is opening, ')' if it is
+ closing, and QChar::null if there are no parentheses in t.
+*/
+static inline QChar lastParen( const QString& t )
+{
+ int i = t.length();
+ while ( i > 0 ) {
+ i--;
+ if ( t[i] == QChar('(') || t[i] == QChar(')') )
+ return t[i];
+ }
+ return QChar::null;
+}
+
+/*
+ Returns TRUE if typedIn the same as okayCh or is null; otherwise
+ returns FALSE.
+*/
+static inline bool okay( QChar typedIn, QChar okayCh )
+{
+ return typedIn == QChar::null || typedIn == okayCh;
+}
+
+/*
+ The "linizer" is a group of functions and variables to iterate
+ through the source code of the program to indent. The program is
+ given as a list of strings, with the bottom line being the line to
+ indent. The actual program might contain extra lines, but those are
+ uninteresting and not passed over to us.
+*/
+
+struct LinizerState
+{
+ QString line;
+ int braceDepth;
+ bool leftBraceFollows;
+
+ QStringList::ConstIterator iter;
+ bool inCComment;
+ bool pendingRightBrace;
+};
+
+static QStringList *yyProgram = 0;
+static LinizerState *yyLinizerState = 0;
+
+// shorthands
+static const QString *yyLine = 0;
+static const int *yyBraceDepth = 0;
+static const bool *yyLeftBraceFollows = 0;
+
+/*
+ Saves and restores the state of the global linizer. This enables
+ backtracking.
+*/
+#define YY_SAVE() \
+ LinizerState savedState = *yyLinizerState
+#define YY_RESTORE() \
+ *yyLinizerState = savedState
+
+/*
+ Advances to the previous line in yyProgram and update yyLine
+ accordingly. yyLine is cleaned from comments and other damageable
+ constructs. Empty lines are skipped.
+*/
+static bool readLine()
+{
+ int k;
+
+ yyLinizerState->leftBraceFollows =
+ ( firstNonWhiteSpace(yyLinizerState->line) == QChar('{') );
+
+ do {
+ if ( yyLinizerState->iter == yyProgram->begin() ) {
+ yyLinizerState->line = QString::null;
+ return FALSE;
+ }
+
+ --yyLinizerState->iter;
+ yyLinizerState->line = *yyLinizerState->iter;
+
+ yyLinizerState->line = trimmedCodeLine( yyLinizerState->line );
+
+ /*
+ Remove C-style comments that span multiple lines. If the
+ bottom line starts in a C-style comment, we are not aware
+ of that and eventually yyLine will contain a slash-aster.
+
+ Notice that both if's can be executed, since
+ yyLinizerState->inCComment is potentially set to FALSE in
+ the first if. The order of the if's is also important.
+ */
+
+ if ( yyLinizerState->inCComment ) {
+ QString slashAster( "/*" );
+
+ k = yyLinizerState->line.find( slashAster );
+ if ( k == -1 ) {
+ yyLinizerState->line = QString::null;
+ } else {
+ yyLinizerState->line.truncate( k );
+ yyLinizerState->inCComment = FALSE;
+ }
+ }
+
+ if ( !yyLinizerState->inCComment ) {
+ QString asterSlash( "*/" );
+
+ k = yyLinizerState->line.find( asterSlash );
+ if ( k != -1 ) {
+ for ( int i = 0; i < k + 2; i++ )
+ eraseChar( yyLinizerState->line, i, ' ' );
+ yyLinizerState->inCComment = TRUE;
+ }
+ }
+
+ /*
+ Remove preprocessor directives.
+ */
+ k = 0;
+ while ( k < (int) yyLinizerState->line.length() ) {
+ QChar ch = yyLinizerState->line[k];
+ if ( ch == QChar('#') ) {
+ yyLinizerState->line = QString::null;
+ } else if ( !ch.isSpace() ) {
+ break;
+ }
+ k++;
+ }
+
+ /*
+ Remove trailing spaces.
+ */
+ k = yyLinizerState->line.length();
+ while ( k > 0 && yyLinizerState->line[k - 1].isSpace() )
+ k--;
+ yyLinizerState->line.truncate( k );
+
+ /*
+ '}' increment the brace depth and '{' decrements it and not
+ the other way around, as we are parsing backwards.
+ */
+ yyLinizerState->braceDepth +=
+ yyLinizerState->line.contains( '}' ) -
+ yyLinizerState->line.contains( '{' );
+
+ /*
+ We use a dirty trick for
+
+ } else ...
+
+ We don't count the '}' yet, so that it's more or less
+ equivalent to the friendly construct
+
+ }
+ else ...
+ */
+ if ( yyLinizerState->pendingRightBrace )
+ yyLinizerState->braceDepth++;
+ yyLinizerState->pendingRightBrace =
+ ( yyLinizerState->line.find(*braceX) == 0 );
+ if ( yyLinizerState->pendingRightBrace )
+ yyLinizerState->braceDepth--;
+ } while ( yyLinizerState->line.isEmpty() );
+
+ return TRUE;
+}
+
+/*
+ Resets the linizer to its initial state, with yyLine containing the
+ line above the bottom line of the program.
+*/
+static void startLinizer()
+{
+ yyLinizerState->braceDepth = 0;
+ yyLinizerState->inCComment = FALSE;
+ yyLinizerState->pendingRightBrace = FALSE;
+
+ yyLine = &yyLinizerState->line;
+ yyBraceDepth = &yyLinizerState->braceDepth;
+ yyLeftBraceFollows = &yyLinizerState->leftBraceFollows;
+
+ yyLinizerState->iter = yyProgram->end();
+ --yyLinizerState->iter;
+ yyLinizerState->line = *yyLinizerState->iter;
+ readLine();
+}
+
+/*
+ Returns TRUE if the start of the bottom line of yyProgram (and
+ potentially the whole line) is part of a C-style comment; otherwise
+ returns FALSE.
+*/
+static bool bottomLineStartsInCComment()
+{
+ QString slashAster( "/*" );
+ QString asterSlash( "*/" );
+
+ /*
+ We could use the linizer here, but that would slow us down
+ terribly. We are better to trim only the code lines we need.
+ */
+ QStringList::ConstIterator p = yyProgram->end();
+ --p; // skip bottom line
+
+ for ( int i = 0; i < BigRoof; i++ ) {
+ if ( p == yyProgram->begin() )
+ return FALSE;
+ --p;
+
+ if ( (*p).find(slashAster) != -1 || (*p).find(asterSlash) != -1 ) {
+ QString trimmed = trimmedCodeLine( *p );
+
+ if ( trimmed.find(slashAster) != -1 ) {
+ return TRUE;
+ } else if ( trimmed.find(asterSlash) != -1 ) {
+ return FALSE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*
+ Returns the recommended indent for the bottom line of yyProgram
+ assuming that it starts in a C-style comment, a condition that is
+ tested elsewhere.
+
+ Essentially, we're trying to align against some text on the previous
+ line.
+*/
+static int indentWhenBottomLineStartsInCComment()
+{
+ int k = yyLine->findRev( "/*" );
+ if ( k == -1 ) {
+ /*
+ We found a normal text line in a comment. Align the
+ bottom line with the text on this line.
+ */
+ return indentOfLine( *yyLine );
+ } else {
+ /*
+ The C-style comment starts on this line. If there is
+ text on the same line, align with it. Otherwise, align
+ with the slash-aster plus a given offset.
+ */
+ int indent = columnForIndex( *yyLine, k );
+ k += 2;
+ while ( k < (int) yyLine->length() ) {
+ if ( !(*yyLine)[k].isSpace() )
+ return columnForIndex( *yyLine, k );
+ k++;
+ }
+ return indent + ppCommentOffset;
+ }
+}
+
+/*
+ A function called match...() modifies the linizer state. If it
+ returns TRUE, yyLine is the top line of the matched construct;
+ otherwise, the linizer is left in an unknown state.
+
+ A function called is...() keeps the linizer state intact.
+*/
+
+/*
+ Returns TRUE if the current line (and upwards) forms a braceless
+ control statement; otherwise returns FALSE.
+
+ The first line of the following example is a "braceless control
+ statement":
+
+ if ( x )
+ y;
+*/
+static bool matchBracelessControlStatement()
+{
+ int delimDepth = 0;
+
+ if ( yyLine->endsWith("else") )
+ return TRUE;
+
+ if ( !yyLine->endsWith(")") )
+ return FALSE;
+
+ for ( int i = 0; i < SmallRoof; i++ ) {
+ int j = yyLine->length();
+ while ( j > 0 ) {
+ j--;
+ QChar ch = (*yyLine)[j];
+
+ switch ( ch.unicode() ) {
+ case ')':
+ delimDepth++;
+ break;
+ case '(':
+ delimDepth--;
+ if ( delimDepth == 0 ) {
+ if ( yyLine->find(*iflikeKeyword) != -1 ) {
+ /*
+ We have
+
+ if ( x )
+ y
+
+ "if ( x )" is not part of the statement
+ "y".
+ */
+ return TRUE;
+ }
+ }
+ if ( delimDepth == -1 ) {
+ /*
+ We have
+
+ if ( (1 +
+ 2)
+
+ and not
+
+ if ( 1 +
+ 2 )
+ */
+ return FALSE;
+ }
+ break;
+ case '{':
+ case '}':
+ case ';':
+ /*
+ We met a statement separator, but not where we
+ expected it. What follows is probably a weird
+ continuation line. Be careful with ';' in for,
+ though.
+ */
+ if ( ch != QChar(';') || delimDepth == 0 )
+ return FALSE;
+ }
+ }
+
+ if ( !readLine() )
+ break;
+ }
+ return FALSE;
+}
+
+/*
+ Returns TRUE if yyLine is an unfinished line; otherwise returns
+ FALSE.
+
+ In many places we'll use the terms "standalone line", "unfinished
+ line" and "continuation line". The meaning of these should be
+ evident from this code example:
+
+ a = b; // standalone line
+ c = d + // unfinished line
+ e + // unfinished continuation line
+ f + // unfinished continuation line
+ g; // continuation line
+*/
+static bool isUnfinishedLine()
+{
+ bool unf = FALSE;
+
+ YY_SAVE();
+
+ if ( yyLine->isEmpty() )
+ return FALSE;
+
+ QChar lastCh = (*yyLine)[(int) yyLine->length() - 1];
+ if ( QString("{};").find(lastCh) == -1 && !yyLine->endsWith("...") ) {
+ /*
+ It doesn't end with ';' or similar. If it's neither
+ "Q_OBJECT" nor "if ( x )", it must be an unfinished line.
+ */
+ unf = ( yyLine->contains("Q_OBJECT") == 0 &&
+ !matchBracelessControlStatement() );
+ } else if ( lastCh == QChar(';') ) {
+ if ( lastParen(*yyLine) == QChar('(') ) {
+ /*
+ Exception:
+
+ for ( int i = 1; i < 10;
+ */
+ unf = TRUE;
+ } else if ( readLine() && yyLine->endsWith(";") &&
+ lastParen(*yyLine) == QChar('(') ) {
+ /*
+ Exception:
+
+ for ( int i = 1;
+ i < 10;
+ */
+ unf = TRUE;
+ }
+ }
+
+ YY_RESTORE();
+ return unf;
+}
+
+/*
+ Returns TRUE if yyLine is a continuation line; otherwise returns
+ FALSE.
+*/
+static bool isContinuationLine()
+{
+ bool cont = FALSE;
+
+ YY_SAVE();
+ if ( readLine() )
+ cont = isUnfinishedLine();
+ YY_RESTORE();
+ return cont;
+}
+
+/*
+ Returns the recommended indent for the bottom line of yyProgram,
+ assuming it's a continuation line.
+
+ We're trying to align the continuation line against some parenthesis
+ or other bracked left opened on a previous line, or some interesting
+ operator such as '='.
+*/
+static int indentForContinuationLine()
+{
+ int braceDepth = 0;
+ int delimDepth = 0;
+
+ bool leftBraceFollowed = *yyLeftBraceFollows;
+
+ for ( int i = 0; i < SmallRoof; i++ ) {
+ int hook = -1;
+
+ int j = yyLine->length();
+ while ( j > 0 && hook < 0 ) {
+ j--;
+ QChar ch = (*yyLine)[j];
+
+ switch ( ch.unicode() ) {
+ case ')':
+ case ']':
+ delimDepth++;
+ break;
+ case '}':
+ braceDepth++;
+ break;
+ case '(':
+ case '[':
+ delimDepth--;
+ /*
+ An unclosed delimiter is a good place to align at,
+ at least for some styles (including Trolltech's).
+ */
+ if ( delimDepth == -1 )
+ hook = j;
+ break;
+ case '{':
+ braceDepth--;
+ /*
+ A left brace followed by other stuff on the same
+ line is typically for an enum or an initializer.
+ Such a brace must be treated just like the other
+ delimiters.
+ */
+ if ( braceDepth == -1 ) {
+ if ( j < (int) yyLine->length() - 1 ) {
+ hook = j;
+ } else {
+ return 0; // shouldn't happen
+ }
+ }
+ break;
+ case '=':
+ /*
+ An equal sign is a very natural alignment hook
+ because it's usually the operator with the lowest
+ precedence in statements it appears in. Case in
+ point:
+
+ int x = 1 +
+ 2;
+
+ However, we have to beware of constructs such as
+ default arguments and explicit enum constant
+ values:
+
+ void foo( int x = 0,
+ int y = 0 );
+
+ And not
+
+ void foo( int x = 0,
+ int y = 0 );
+
+ These constructs are caracterized by a ',' at the
+ end of the unfinished lines or by unbalanced
+ parentheses.
+ */
+ if ( QString("!=<>").find((*yyLine)[j - 1]) == -1 &&
+ (*yyLine)[j + 1] != '=' ) {
+ if ( braceDepth == 0 && delimDepth == 0 &&
+ j < (int) yyLine->length() - 1 &&
+ !yyLine->endsWith(",") &&
+ (yyLine->contains('(') == yyLine->contains(')')) )
+ hook = j;
+ }
+ }
+ }
+
+ if ( hook >= 0 ) {
+ /*
+ Yes, we have a delimiter or an operator to align
+ against! We don't really align against it, but rather
+ against the following token, if any. In this example,
+ the following token is "11":
+
+ int x = ( 11 +
+ 2 );
+
+ If there is no such token, we use a continuation indent:
+
+ static QRegExp foo( QString(
+ "foo foo foo foo foo foo foo foo foo") );
+ */
+ hook++;
+ while ( hook < (int) yyLine->length() ) {
+ if ( !(*yyLine)[hook].isSpace() )
+ return columnForIndex( *yyLine, hook );
+ hook++;
+ }
+ return indentOfLine( *yyLine ) + ppContinuationIndentSize;
+ }
+
+ if ( braceDepth != 0 )
+ break;
+
+ /*
+ The line's delimiters are balanced. It looks like a
+ continuation line or something.
+ */
+ if ( delimDepth == 0 ) {
+ if ( leftBraceFollowed ) {
+ /*
+ We have
+
+ int main()
+ {
+
+ or
+
+ Bar::Bar()
+ : Foo( x )
+ {
+
+ The "{" should be flush left.
+ */
+ if ( !isContinuationLine() )
+ return indentOfLine( *yyLine );
+ } else if ( isContinuationLine() || yyLine->endsWith(",") ) {
+ /*
+ We have
+
+ x = a +
+ b +
+ c;
+
+ or
+
+ int t[] = {
+ 1, 2, 3,
+ 4, 5, 6
+
+ The "c;" should fall right under the "b +", and the
+ "4, 5, 6" right under the "1, 2, 3,".
+ */
+ return indentOfLine( *yyLine );
+ } else {
+ /*
+ We have
+
+ stream << 1 +
+ 2;
+
+ We could, but we don't, try to analyze which
+ operator has precedence over which and so on, to
+ obtain the excellent result
+
+ stream << 1 +
+ 2;
+
+ We do have a special trick above for the assignment
+ operator above, though.
+ */
+ return indentOfLine( *yyLine ) + ppContinuationIndentSize;
+ }
+ }
+
+ if ( !readLine() )
+ break;
+ }
+ return 0;
+}
+
+/*
+ Returns the recommended indent for the bottom line of yyProgram if
+ that line is standalone (or should be indented likewise).
+
+ Indenting a standalone line is tricky, mostly because of braceless
+ control statements. Grossly, we are looking backwards for a special
+ line, a "hook line", that we can use as a starting point to indent,
+ and then modify the indentation level according to the braces met
+ along the way to that hook.
+
+ Let's consider a few examples. In all cases, we want to indent the
+ bottom line.
+
+ Example 1:
+
+ x = 1;
+ y = 2;
+
+ The hook line is "x = 1;". We met 0 opening braces and 0 closing
+ braces. Therefore, "y = 2;" inherits the indent of "x = 1;".
+
+ Example 2:
+
+ if ( x ) {
+ y;
+
+ The hook line is "if ( x ) {". No matter what precedes it, "y;" has
+ to be indented one level deeper than the hook line, since we met one
+ opening brace along the way.
+
+ Example 3:
+
+ if ( a )
+ while ( b ) {
+ c;
+ }
+ d;
+
+ To indent "d;" correctly, we have to go as far as the "if ( a )".
+ Compare with
+
+ if ( a ) {
+ while ( b ) {
+ c;
+ }
+ d;
+
+ Still, we're striving to go back as little as possible to accomodate
+ people with irregular indentation schemes. A hook line near at hand
+ is much more reliable than a remote one.
+*/
+static int indentForStandaloneLine()
+{
+ for ( int i = 0; i < SmallRoof; i++ ) {
+ if ( !*yyLeftBraceFollows ) {
+ YY_SAVE();
+
+ if ( matchBracelessControlStatement() ) {
+ /*
+ The situation is this, and we want to indent "z;":
+
+ if ( x &&
+ y )
+ z;
+
+ yyLine is "if ( x &&".
+ */
+ return indentOfLine( *yyLine ) + ppIndentSize;
+ }
+ YY_RESTORE();
+ }
+
+ if ( yyLine->endsWith(";") || yyLine->contains('{') > 0 ) {
+ /*
+ The situation is possibly this, and we want to indent
+ "z;":
+
+ while ( x )
+ y;
+ z;
+
+ We return the indent of "while ( x )". In place of "y;",
+ any arbitrarily complex compound statement can appear.
+ */
+
+ if ( *yyBraceDepth > 0 ) {
+ do {
+ if ( !readLine() )
+ break;
+ } while ( *yyBraceDepth > 0 );
+ }
+
+ LinizerState hookState;
+
+ while ( isContinuationLine() )
+ readLine();
+ hookState = *yyLinizerState;
+
+ readLine();
+ if ( *yyBraceDepth <= 0 ) {
+ do {
+ if ( !matchBracelessControlStatement() )
+ break;
+ hookState = *yyLinizerState;
+ } while ( readLine() );
+ }
+
+ *yyLinizerState = hookState;
+
+ while ( isContinuationLine() )
+ readLine();
+
+ /*
+ Never trust lines containing only '{' or '}', as some
+ people (Richard M. Stallman) format them weirdly.
+ */
+ if ( yyLine->stripWhiteSpace().length() > 1 )
+ return indentOfLine( *yyLine ) - *yyBraceDepth * ppIndentSize;
+ }
+
+ if ( !readLine() )
+ return -*yyBraceDepth * ppIndentSize;
+ }
+ return 0;
+}
+
+/*
+ Constructs global variables used by the indenter.
+*/
+static void initializeIndenter()
+{
+ literal = new QRegExp( "([\"'])(?:\\\\.|[^\\\\])*\\1" );
+ literal->setMinimal( TRUE );
+ label = new QRegExp(
+ "^\\s*((?:case\\b([^:]|::)+|[a-zA-Z_0-9]+)(?:\\s+slots)?:)(?!:)" );
+ inlineCComment = new QRegExp( "/\\*.*\\*/" );
+ inlineCComment->setMinimal( TRUE );
+ braceX = new QRegExp( "^\\s*\\}\\s*(?:else|catch)\\b" );
+ iflikeKeyword = new QRegExp( "\\b(?:catch|do|for|if|while)\\b" );
+
+ yyLinizerState = new LinizerState;
+}
+
+/*
+ Destroys global variables used by the indenter.
+*/
+static void terminateIndenter()
+{
+ delete literal;
+ delete label;
+ delete inlineCComment;
+ delete braceX;
+ delete iflikeKeyword;
+ delete yyLinizerState;
+}
+
+/*
+ Returns the recommended indent for the bottom line of program.
+ Unless null, typedIn stores the character of yyProgram that
+ triggered reindentation.
+
+ This function works better if typedIn is set properly; it is
+ slightly more conservative if typedIn is completely wild, and
+ slighly more liberal if typedIn is always null. The user might be
+ annoyed by the liberal behavior.
+*/
+int indentForBottomLine( const QStringList& program, QChar typedIn )
+{
+ if ( program.isEmpty() )
+ return 0;
+
+ initializeIndenter();
+
+ yyProgram = new QStringList( program );
+ startLinizer();
+
+ const QString& bottomLine = program.last();
+ QChar firstCh = firstNonWhiteSpace( bottomLine );
+ int indent;
+
+ if ( bottomLineStartsInCComment() ) {
+ /*
+ The bottom line starts in a C-style comment. Indent it
+ smartly, unless the user has already played around with it,
+ in which case it's better to leave her stuff alone.
+ */
+ if ( isOnlyWhiteSpace(bottomLine) ) {
+ indent = indentWhenBottomLineStartsInCComment();
+ } else {
+ indent = indentOfLine( bottomLine );
+ }
+ } else if ( okay(typedIn, '#') && firstCh == QChar('#') ) {
+ /*
+ Preprocessor directives go flush left.
+ */
+ indent = 0;
+ } else {
+ if ( isUnfinishedLine() ) {
+ indent = indentForContinuationLine();
+ } else {
+ indent = indentForStandaloneLine();
+ }
+
+ if ( okay(typedIn, '}') && firstCh == QChar('}') ) {
+ /*
+ A closing brace is one level more to the left than the
+ code it follows.
+ */
+ indent -= ppIndentSize;
+ } else if ( okay(typedIn, ':') ) {
+ QRegExp caseLabel(
+ "\\s*(?:case\\b(?:[^:]|::)+"
+ "|(?:public|protected|private|signals|default)(?:\\s+slots)?\\s*"
+ ")?:.*" );
+
+ if ( caseLabel.exactMatch(bottomLine) ) {
+ /*
+ Move a case label (or the ':' in front of a
+ constructor initialization list) one level to the
+ left, but only if the user did not play around with
+ it yet. Some users have exotic tastes in the
+ matter, and most users probably are not patient
+ enough to wait for the final ':' to format their
+ code properly.
+
+ We don't attempt the same for goto labels, as the
+ user is probably the middle of "foo::bar". (Who
+ uses goto, anyway?)
+ */
+ if ( indentOfLine(bottomLine) <= indent )
+ indent -= ppIndentSize;
+ else
+ indent = indentOfLine( bottomLine );
+ }
+ }
+ }
+ delete yyProgram;
+ terminateIndenter();
+ return QMAX( 0, indent );
+}
+
+#ifdef Q_TEST_YYINDENT
+/*
+ Test driver.
+*/
+
+#include <qfile.h>
+#include <qtextstream.h>
+
+#include <errno.h>
+
+static QString fileContents( const QString& fileName )
+{
+ QFile f( fileName );
+ if ( !f.open(IO_ReadOnly) ) {
+ qWarning( "yyindent error: Cannot open file '%s' for reading: %s",
+ fileName.latin1(), strerror(errno) );
+ return QString::null;
+ }
+
+ QTextStream t( &f );
+ QString contents = t.read();
+ f.close();
+ if ( contents.isEmpty() )
+ qWarning( "yyindent error: File '%s' is empty", fileName.latin1() );
+ return contents;
+}
+
+int main( int argc, char **argv )
+{
+ if ( argc != 2 ) {
+ qWarning( "usage: yyindent file.cpp" );
+ return 1;
+ }
+
+ QString code = fileContents( argv[1] );
+ QStringList program = QStringList::split( '\n', code, TRUE );
+ QStringList p;
+ QString out;
+
+ while ( !program.isEmpty() && program.last().stripWhiteSpace().isEmpty() )
+ program.remove( program.fromLast() );
+
+ QStringList::ConstIterator line = program.begin();
+ while ( line != program.end() ) {
+ p.push_back( *line );
+ QChar typedIn = firstNonWhiteSpace( *line );
+ if ( p.last().endsWith(":") )
+ typedIn = ':';
+
+ int indent = indentForBottomLine( p, typedIn );
+
+ if ( !(*line).stripWhiteSpace().isEmpty() ) {
+ for ( int j = 0; j < indent; j++ )
+ out += " ";
+ out += (*line).stripWhiteSpace();
+ }
+ out += "\n";
+ ++line;
+ }
+
+ while ( out.endsWith("\n") )
+ out.truncate( out.length() - 1 );
+
+ printf( "%s\n", out.latin1() );
+ return 0;
+}
+#endif
diff --git a/tools/designer/examples/addressbook/addressbook.pro b/tools/designer/examples/addressbook/addressbook.pro
new file mode 100644
index 0000000..70b805a
--- /dev/null
+++ b/tools/designer/examples/addressbook/addressbook.pro
@@ -0,0 +1,14 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+unix {
+ UI_DIR = .ui
+ MOC_DIR = .moc
+ OBJECTS_DIR = .obj
+}
+
+SOURCES += main.cpp
+FORMS = addressbook.ui addressdetails.ui search.ui
+IMAGES = images/filenew.png images/fileopen.png images/filesave.png images/searchfind.png images/editcut.png
+DBFILE = addressbook.db
diff --git a/tools/designer/examples/addressbook/addressbook.ui b/tools/designer/examples/addressbook/addressbook.ui
new file mode 100644
index 0000000..54a4303
--- /dev/null
+++ b/tools/designer/examples/addressbook/addressbook.ui
@@ -0,0 +1,324 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>AddressBook</class>
+<widget class="QMainWindow">
+ <property name="name">
+ <cstring>AddressBook</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Address Book</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Last Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>First Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Phone Number</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Street </string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>City</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Country</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Zip Code</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>addressView</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>Extended</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+</widget>
+<menubar>
+ <property name="name">
+ <cstring>menubar</cstring>
+ </property>
+ <item text="&amp;File" name="fileMenu">
+ <action name="fileNewAction"/>
+ <action name="fileOpenAction"/>
+ <action name="fileSaveAction"/>
+ <action name="fileSaveAsAction"/>
+ <separator/>
+ <action name="fileExitAction"/>
+ </item>
+ <item text="&amp;Edit" name="editMenu">
+ <action name="actionDeleteAddress"/>
+ <separator/>
+ <action name="editFindAction"/>
+ </item>
+</menubar>
+<toolbars>
+ <toolbar dock="2">
+ <property name="name">
+ <cstring>toolBar</cstring>
+ </property>
+ <property name="label">
+ <string>Tools</string>
+ </property>
+ <action name="fileNewAction"/>
+ <action name="fileOpenAction"/>
+ <action name="fileSaveAction"/>
+ <separator/>
+ <action name="actionDeleteAddress"/>
+ <action name="editFindAction"/>
+ </toolbar>
+</toolbars>
+<actions>
+ <action>
+ <property name="name">
+ <cstring>fileNewAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>filenew.png</iconset>
+ </property>
+ <property name="text">
+ <string>New</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;New</string>
+ </property>
+ <property name="accel">
+ <number>4194382</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileOpenAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="text">
+ <string>Open</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Open...</string>
+ </property>
+ <property name="accel">
+ <number>4194383</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>filesave.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Save</string>
+ </property>
+ <property name="accel">
+ <number>4194387</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveAsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Save As</string>
+ </property>
+ <property name="menuText">
+ <string>Save &amp;As...</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileExitAction</cstring>
+ </property>
+ <property name="text">
+ <string>Exit</string>
+ </property>
+ <property name="menuText">
+ <string>E&amp;xit</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editFindAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>searchfind.png</iconset>
+ </property>
+ <property name="text">
+ <string>Find</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Find...</string>
+ </property>
+ <property name="accel">
+ <number>4194374</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>actionDeleteAddress</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>editcut.png</iconset>
+ </property>
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ </action>
+</actions>
+<connections>
+ <connection>
+ <sender>fileNewAction</sender>
+ <signal>activated()</signal>
+ <receiver>AddressBook</receiver>
+ <slot>fileNew()</slot>
+ </connection>
+ <connection>
+ <sender>fileOpenAction</sender>
+ <signal>activated()</signal>
+ <receiver>AddressBook</receiver>
+ <slot>fileOpen()</slot>
+ </connection>
+ <connection>
+ <sender>fileSaveAction</sender>
+ <signal>activated()</signal>
+ <receiver>AddressBook</receiver>
+ <slot>fileSave()</slot>
+ </connection>
+ <connection>
+ <sender>fileSaveAsAction</sender>
+ <signal>activated()</signal>
+ <receiver>AddressBook</receiver>
+ <slot>fileSaveAs()</slot>
+ </connection>
+ <connection>
+ <sender>fileExitAction</sender>
+ <signal>activated()</signal>
+ <receiver>AddressBook</receiver>
+ <slot>fileExit()</slot>
+ </connection>
+ <connection>
+ <sender>editFindAction</sender>
+ <signal>activated()</signal>
+ <receiver>AddressBook</receiver>
+ <slot>editFind()</slot>
+ </connection>
+ <connection>
+ <sender>actionDeleteAddress</sender>
+ <signal>activated()</signal>
+ <receiver>AddressBook</receiver>
+ <slot>deleteAddress()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">addressbook.ui.h</include>
+</includes>
+<variables>
+ <variable>QString currentFileName;</variable>
+</variables>
+<slots>
+ <slot>fileNew()</slot>
+ <slot>insertAddress( const QString &amp; firstName, const QString &amp; lastName, const QString &amp; phoneNumber, const QString &amp; street, const QString &amp; city, const QString &amp; country, const QString &amp; zipCode )</slot>
+ <slot>deleteAddress()</slot>
+ <slot>fileOpen()</slot>
+ <slot>fileSave()</slot>
+ <slot>fileSaveAs()</slot>
+ <slot>fileExit()</slot>
+ <slot>editFind()</slot>
+ <slot>searchAddress( const QString &amp; expr )</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/examples/addressbook/addressbook.ui.h b/tools/designer/examples/addressbook/addressbook.ui.h
new file mode 100644
index 0000000..0d4bd88
--- /dev/null
+++ b/tools/designer/examples/addressbook/addressbook.ui.h
@@ -0,0 +1,137 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+#include "addressdetails.h"
+#include "search.h"
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qfiledialog.h>
+#include <qapplication.h>
+
+void AddressBook::fileNew()
+{
+ AddressDetails dia( this, 0, TRUE );
+ connect( &dia, SIGNAL( newAddress( const QString &,
+ const QString &,
+ const QString &,
+ const QString &,
+ const QString &,
+ const QString &,
+ const QString & ) ),
+ this, SLOT( insertAddress( const QString &,
+ const QString &,
+ const QString &,
+ const QString &,
+ const QString &,
+ const QString &,
+ const QString & ) ) );
+ dia.exec();
+}
+
+void AddressBook::insertAddress( const QString &firstName,
+ const QString &lastName,
+ const QString &phoneNumber,
+ const QString &street,
+ const QString &city,
+ const QString &country,
+ const QString &zipCode )
+{
+ QListViewItem *i = new QListViewItem( addressView );
+ i->setText( 0, firstName );
+ i->setText( 1, lastName );
+ i->setText( 2, phoneNumber );
+ i->setText( 3, street );
+ i->setText( 4, city );
+ i->setText( 5, country );
+ i->setText( 6, zipCode );
+}
+
+void AddressBook::deleteAddress()
+{
+ QListViewItemIterator it( addressView );
+ while ( it.current() ) {
+ QListViewItem *i = it.current();
+ ++it;
+ if ( i->isSelected() )
+ delete i;
+ }
+}
+
+void AddressBook::fileOpen()
+{
+ addressView->clear();
+ QString fn = QFileDialog::getOpenFileName();
+ if ( fn.isEmpty() )
+ return;
+ currentFileName = fn;
+ QFile f( currentFileName );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+ QTextStream ts( &f );
+
+ while ( !ts.eof() ) {
+ QListViewItem *item = new QListViewItem( addressView );
+ for ( int i = 0; i < 7; ++i )
+ item->setText( i, ts.readLine() );
+ }
+
+}
+
+void AddressBook::fileSave()
+{
+ if ( currentFileName.isEmpty() )
+ fileSaveAs();
+ QFile f( currentFileName );
+ if ( !f.open( IO_WriteOnly ) )
+ return;
+ QTextStream ts( &f );
+
+ QListViewItemIterator it( addressView );
+ while ( it.current() ) {
+ for ( int i = 0; i < 7; ++i )
+ ts << it.current()->text( i ) << endl;
+ ++it;
+ }
+
+ f.close();
+}
+
+void AddressBook::fileSaveAs()
+{
+ QString fn = QFileDialog::getSaveFileName();
+ if ( fn.isEmpty() )
+ return;
+ currentFileName = fn;
+ fileSave();
+}
+
+void AddressBook::fileExit()
+{
+ qApp->exit();
+}
+
+void AddressBook::editFind()
+{
+ SearchDialog dia( this, 0, TRUE );
+ connect( &dia, SIGNAL( searchAddress( const QString & ) ),
+ this, SLOT( searchAddress( const QString & ) ) );
+ dia.exec();
+}
+
+void AddressBook::searchAddress( const QString &expr )
+{
+ addressView->clearSelection();
+ QListViewItemIterator it( addressView );
+ while ( it.current() ) {
+ for ( int i = 0; i < 7; ++i ) {
+ if ( it.current()->text( i ).find( expr ) != -1 )
+ addressView->setSelected( it.current(), TRUE );
+ }
+ ++it;
+ }
+} \ No newline at end of file
diff --git a/tools/designer/examples/addressbook/addressdetails.ui b/tools/designer/examples/addressbook/addressdetails.ui
new file mode 100644
index 0000000..d321a0c
--- /dev/null
+++ b/tools/designer/examples/addressbook/addressdetails.ui
@@ -0,0 +1,243 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>AddressDetails</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AddressDetails</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>216</width>
+ <height>252</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Enter Address</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>TextLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>Street</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>editStreet</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>editPhoneNumber</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>TextLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>City</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Last Name</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Phone Number</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="5" column="1">
+ <property name="name">
+ <cstring>editCountry</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="6" column="0">
+ <property name="name">
+ <cstring>TextLabel10</cstring>
+ </property>
+ <property name="text">
+ <string>Zip Code</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>editLastName</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="6" column="1">
+ <property name="name">
+ <cstring>editZipCode</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>First Name</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>editCity</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>TextLabel9</cstring>
+ </property>
+ <property name="text">
+ <string>Country</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>editFirstName</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>AddressDetails</receiver>
+ <slot>okClicked()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton3</sender>
+ <signal>clicked()</signal>
+ <receiver>AddressDetails</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>editLastName</tabstop>
+ <tabstop>editFirstName</tabstop>
+ <tabstop>editPhoneNumber</tabstop>
+ <tabstop>editStreet</tabstop>
+ <tabstop>editCity</tabstop>
+ <tabstop>editCountry</tabstop>
+ <tabstop>editZipCode</tabstop>
+ <tabstop>PushButton2</tabstop>
+ <tabstop>PushButton3</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">addressdetails.ui.h</include>
+</includes>
+<signals>
+ <signal>newAddress( const QString &amp;, const QString &amp;, const QString &amp;, const QString &amp;, const QString &amp;, const QString &amp;, const QString &amp; );</signal>
+</signals>
+<slots>
+ <slot>init()</slot>
+ <slot>okClicked()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/examples/addressbook/addressdetails.ui.h b/tools/designer/examples/addressbook/addressdetails.ui.h
new file mode 100644
index 0000000..e6c1ff5
--- /dev/null
+++ b/tools/designer/examples/addressbook/addressdetails.ui.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+void AddressDetails::init()
+{
+ editLastName->setFocus();
+}
+
+void AddressDetails::okClicked()
+{
+ emit newAddress( editLastName->text(),
+ editFirstName->text(),
+ editPhoneNumber->text(),
+ editStreet->text(),
+ editCity->text(),
+ editCountry->text(),
+ editZipCode->text() );
+ close();
+} \ No newline at end of file
diff --git a/tools/designer/examples/addressbook/images/editcut.png b/tools/designer/examples/addressbook/images/editcut.png
new file mode 100644
index 0000000..9c7fb3c
--- /dev/null
+++ b/tools/designer/examples/addressbook/images/editcut.png
Binary files differ
diff --git a/tools/designer/examples/addressbook/images/filenew.png b/tools/designer/examples/addressbook/images/filenew.png
new file mode 100644
index 0000000..d898107
--- /dev/null
+++ b/tools/designer/examples/addressbook/images/filenew.png
Binary files differ
diff --git a/tools/designer/examples/addressbook/images/fileopen.png b/tools/designer/examples/addressbook/images/fileopen.png
new file mode 100644
index 0000000..7e49adb
--- /dev/null
+++ b/tools/designer/examples/addressbook/images/fileopen.png
Binary files differ
diff --git a/tools/designer/examples/addressbook/images/filesave.png b/tools/designer/examples/addressbook/images/filesave.png
new file mode 100644
index 0000000..77d9f50
--- /dev/null
+++ b/tools/designer/examples/addressbook/images/filesave.png
Binary files differ
diff --git a/tools/designer/examples/addressbook/images/searchfind.png b/tools/designer/examples/addressbook/images/searchfind.png
new file mode 100644
index 0000000..f18b029
--- /dev/null
+++ b/tools/designer/examples/addressbook/images/searchfind.png
Binary files differ
diff --git a/tools/designer/examples/addressbook/main.cpp b/tools/designer/examples/addressbook/main.cpp
new file mode 100644
index 0000000..9a58f60
--- /dev/null
+++ b/tools/designer/examples/addressbook/main.cpp
@@ -0,0 +1,11 @@
+#include <qapplication.h>
+#include "addressbook.h"
+
+int main( int argc, char ** argv )
+{
+ QApplication a( argc, argv );
+ AddressBook *w = new AddressBook;
+ w->show();
+ a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
+ return a.exec();
+}
diff --git a/tools/designer/examples/addressbook/search.ui b/tools/designer/examples/addressbook/search.ui
new file mode 100644
index 0000000..4329048
--- /dev/null
+++ b/tools/designer/examples/addressbook/search.ui
@@ -0,0 +1,136 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>SearchDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SearchDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>216</width>
+ <height>76</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Search</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel12</cstring>
+ </property>
+ <property name="text">
+ <string>Search</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>editSearch</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton4</cstring>
+ </property>
+ <property name="text">
+ <string>Search</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton5</cstring>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton5</sender>
+ <signal>clicked()</signal>
+ <receiver>SearchDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton4</sender>
+ <signal>clicked()</signal>
+ <receiver>SearchDialog</receiver>
+ <slot>search()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">search.ui.h</include>
+</includes>
+<signals>
+ <signal>searchAddress( const QString &amp; )</signal>
+</signals>
+<slots>
+ <slot>search()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/examples/addressbook/search.ui.h b/tools/designer/examples/addressbook/search.ui.h
new file mode 100644
index 0000000..8b3a8d5
--- /dev/null
+++ b/tools/designer/examples/addressbook/search.ui.h
@@ -0,0 +1,13 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+void SearchDialog::search()
+{
+ emit searchAddress( editSearch->text() );
+ close();
+} \ No newline at end of file
diff --git a/tools/designer/examples/book/book.sql b/tools/designer/examples/book/book.sql
new file mode 100644
index 0000000..417ef43
--- /dev/null
+++ b/tools/designer/examples/book/book.sql
@@ -0,0 +1,42 @@
+-- The following SQL generates the database
+-- used by the 'book' example programs
+-- Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+--
+-- This file is part of an example program for Qt. This example
+-- program may be used, distributed and modified without limitation.
+
+DROP TABLE author;
+DROP TABLE book;
+DROP TABLE sequence;
+
+CREATE TABLE author
+( id integer primary key,
+forename varchar(40),
+surname varchar(40) );
+
+CREATE TABLE book
+( id integer primary key,
+title varchar(40),
+price numeric(10,2),
+authorid integer,
+notes varchar(255) );
+
+create index book_authorid_idx on book( authorid );
+
+CREATE TABLE sequence
+( tablename varchar(10),
+sequence numeric);
+
+INSERT INTO author VALUES ( 0, 'Philip K', 'Dick' );
+INSERT INTO author VALUES ( 1, 'Robert', 'Heinlein' );
+INSERT INTO author VALUES ( 2, 'Sarah', 'Paretsky' );
+
+INSERT INTO book VALUES ( 0, 'The Man Who Japed', 6.99, 0, 'A good book' );
+INSERT INTO book VALUES ( 1, 'The Man in the High Castle', 9.99, 0, 'Worth reading' );
+INSERT INTO book VALUES ( 2, 'The Number of the Beast', 8.99, 1, 'Get this!' );
+INSERT INTO book VALUES ( 3, 'Indemnity Only', 9.99, 2, 'Cool' );
+INSERT INTO book VALUES ( 4, 'Burn Marks', 9.99, 2, 'Need to make notes' );
+INSERT INTO book VALUES ( 5, 'Deadlock', 9.99, 2, 'Hmmm..' );
+
+INSERT INTO sequence VALUES ( 'author', 2 );
+INSERT INTO sequence VALUES ( 'book', 5 );
diff --git a/tools/designer/examples/book/book1/book.ui b/tools/designer/examples/book/book1/book.ui
new file mode 100644
index 0000000..615b3d5
--- /dev/null
+++ b/tools/designer/examples/book/book1/book.ui
@@ -0,0 +1,71 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>BookForm</class>
+<include location="local" implDecl="in declaration">book.ui.h</include>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>584</width>
+ <height>472</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Book</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Surname</string>
+ </property>
+ <property name="field">
+ <string>surname</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Forename</string>
+ </property>
+ <property name="field">
+ <string>forename</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>AuthorcDataTable</cstring>
+ </property>
+ <property name="confirmDelete">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>surname ASC</string>
+ <string>forename ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>author</string>
+ </stringlist>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertAuthor( QSqlRecord * )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/book/book1/book.ui.h b/tools/designer/examples/book/book1/book.ui.h
new file mode 100644
index 0000000..e658278
--- /dev/null
+++ b/tools/designer/examples/book/book1/book.ui.h
@@ -0,0 +1,5 @@
+void BookForm::primeInsertAuthor( QSqlRecord * )
+{
+
+}
+
diff --git a/tools/designer/examples/book/book1/book1.pro b/tools/designer/examples/book/book1/book1.pro
new file mode 100644
index 0000000..a7e1f7b
--- /dev/null
+++ b/tools/designer/examples/book/book1/book1.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+
+SOURCES += main.cpp ../connection.cpp
+FORMS = book.ui
+DBFILE = book.db
diff --git a/tools/designer/examples/book/book1/main.cpp b/tools/designer/examples/book/book1/main.cpp
new file mode 100644
index 0000000..464ed42
--- /dev/null
+++ b/tools/designer/examples/book/book1/main.cpp
@@ -0,0 +1,27 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include "book.h"
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ if ( ! createConnections() )
+ return 1;
+
+ BookForm bookForm;
+ app.setMainWidget( &bookForm );
+ bookForm.show();
+
+ return app.exec();
+}
diff --git a/tools/designer/examples/book/book2/book.ui b/tools/designer/examples/book/book2/book.ui
new file mode 100644
index 0000000..c66dfae
--- /dev/null
+++ b/tools/designer/examples/book/book2/book.ui
@@ -0,0 +1,77 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>BookForm</class>
+<include location="local" implDecl="in declaration">book.ui.h</include>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>576</width>
+ <height>468</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Book</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Surname</string>
+ </property>
+ <property name="field">
+ <string>surname</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Forename</string>
+ </property>
+ <property name="field">
+ <string>forename</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>AuthorcDataTable</cstring>
+ </property>
+ <property name="confirmDelete">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>surname ASC</string>
+ <string>forename ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>author</string>
+ </stringlist>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>AuthorcDataTable</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>primeInsertAuthor(QSqlRecord*)</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertAuthor( QSqlRecord * buffer )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/book/book2/book.ui.h b/tools/designer/examples/book/book2/book.ui.h
new file mode 100644
index 0000000..40b1143
--- /dev/null
+++ b/tools/designer/examples/book/book2/book.ui.h
@@ -0,0 +1,10 @@
+void BookForm::primeInsertAuthor( QSqlRecord * buffer )
+{
+ QSqlQuery query;
+ query.exec( "UPDATE sequence SET sequence = sequence + 1 WHERE tablename='author';" );
+ query.exec( "SELECT sequence FROM sequence WHERE tablename='author';" );
+ if ( query.next() ) {
+ buffer->setValue( "id", query.value( 0 ) );
+ }
+}
+
diff --git a/tools/designer/examples/book/book2/book2.pro b/tools/designer/examples/book/book2/book2.pro
new file mode 100644
index 0000000..a7e1f7b
--- /dev/null
+++ b/tools/designer/examples/book/book2/book2.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+
+SOURCES += main.cpp ../connection.cpp
+FORMS = book.ui
+DBFILE = book.db
diff --git a/tools/designer/examples/book/book2/main.cpp b/tools/designer/examples/book/book2/main.cpp
new file mode 100644
index 0000000..464ed42
--- /dev/null
+++ b/tools/designer/examples/book/book2/main.cpp
@@ -0,0 +1,27 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include "book.h"
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ if ( ! createConnections() )
+ return 1;
+
+ BookForm bookForm;
+ app.setMainWidget( &bookForm );
+ bookForm.show();
+
+ return app.exec();
+}
diff --git a/tools/designer/examples/book/book3/book.ui b/tools/designer/examples/book/book3/book.ui
new file mode 100644
index 0000000..91e2c04
--- /dev/null
+++ b/tools/designer/examples/book/book3/book.ui
@@ -0,0 +1,141 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>BookForm</class>
+<include location="local" implDecl="in declaration">book.ui.h</include>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>566</width>
+ <height>464</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Book</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>Splitter1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>MShape</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>MShadow</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Surname</string>
+ </property>
+ <property name="field">
+ <string>surname</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Forename</string>
+ </property>
+ <property name="field">
+ <string>forename</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>AuthorDataTable</cstring>
+ </property>
+ <property name="confirmDelete">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>surname ASC</string>
+ <string>forename ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>author</string>
+ </stringlist>
+ </property>
+ </widget>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ <property name="field">
+ <string>title</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Price</string>
+ </property>
+ <property name="field">
+ <string>price</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Notes</string>
+ </property>
+ <property name="field">
+ <string>notes</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>BookDataTable</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>title ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ </stringlist>
+ </property>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>currentChanged(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>newCurrentAuthor(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>primeInsertAuthor(QSqlRecord*)</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">newCurrentAuthor( QSqlRecord * author )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertAuthor( QSqlRecord * buffer )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/book/book3/book.ui.h b/tools/designer/examples/book/book3/book.ui.h
new file mode 100644
index 0000000..b027d01
--- /dev/null
+++ b/tools/designer/examples/book/book3/book.ui.h
@@ -0,0 +1,16 @@
+void BookForm::newCurrentAuthor( QSqlRecord *author )
+{
+ BookDataTable->setFilter( "authorid=" + author->value( "id" ).toString() );
+ BookDataTable->refresh();
+}
+
+void BookForm::primeInsertAuthor( QSqlRecord *buffer )
+{
+ QSqlQuery query;
+ query.exec( "UPDATE sequence SET sequence = sequence + 1 WHERE tablename='author';" );
+ query.exec( "SELECT sequence FROM sequence WHERE tablename='author';" );
+ if ( query.next() ) {
+ buffer->setValue( "id", query.value( 0 ) );
+ }
+}
+
diff --git a/tools/designer/examples/book/book3/book3.pro b/tools/designer/examples/book/book3/book3.pro
new file mode 100644
index 0000000..a7e1f7b
--- /dev/null
+++ b/tools/designer/examples/book/book3/book3.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+
+SOURCES += main.cpp ../connection.cpp
+FORMS = book.ui
+DBFILE = book.db
diff --git a/tools/designer/examples/book/book3/main.cpp b/tools/designer/examples/book/book3/main.cpp
new file mode 100644
index 0000000..89911b1
--- /dev/null
+++ b/tools/designer/examples/book/book3/main.cpp
@@ -0,0 +1,27 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include "book.h"
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ if ( ! createConnections() )
+ return 1;
+
+ BookForm bookForm;
+ app.setMainWidget( &bookForm );
+ bookForm.show();
+
+ return app.exec();
+}
diff --git a/tools/designer/examples/book/book4/book.ui b/tools/designer/examples/book/book4/book.ui
new file mode 100644
index 0000000..f24818c
--- /dev/null
+++ b/tools/designer/examples/book/book4/book.ui
@@ -0,0 +1,179 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>BookForm</class>
+<include location="local" implDecl="in declaration">book.ui.h</include>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>546</width>
+ <height>532</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Book</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>Splitter1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>MShape</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>MShadow</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Surname</string>
+ </property>
+ <property name="field">
+ <string>surname</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Forename</string>
+ </property>
+ <property name="field">
+ <string>forename</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>AuthorDataTable</cstring>
+ </property>
+ <property name="confirmDelete">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>surname ASC</string>
+ <string>forename ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>author</string>
+ </stringlist>
+ </property>
+ </widget>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ <property name="field">
+ <string>title</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Price</string>
+ </property>
+ <property name="field">
+ <string>price</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Notes</string>
+ </property>
+ <property name="field">
+ <string>notes</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>BookDataTable</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>title ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ </stringlist>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>EditPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Edit Books</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>QuitPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>currentChanged(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>newCurrentAuthor(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>primeInsertAuthor(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>QuitPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BookForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">newCurrentAuthor( QSqlRecord * author )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertAuthor( QSqlRecord * buffer )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/book/book4/book.ui.h b/tools/designer/examples/book/book4/book.ui.h
new file mode 100644
index 0000000..a8754e9
--- /dev/null
+++ b/tools/designer/examples/book/book4/book.ui.h
@@ -0,0 +1,16 @@
+void BookForm::newCurrentAuthor( QSqlRecord * author )
+{
+ BookDataTable->setFilter( "authorid=" + author->value( "id" ).toString() );
+ BookDataTable->refresh();
+}
+
+void BookForm::primeInsertAuthor( QSqlRecord * buffer )
+{
+ QSqlQuery query;
+ query.exec( "UPDATE sequence SET sequence = sequence + 1 WHERE tablename='author';" );
+ query.exec( "SELECT sequence FROM sequence WHERE tablename='author';" );
+ if ( query.next() ) {
+ buffer->setValue( "id", query.value( 0 ) );
+ }
+}
+
diff --git a/tools/designer/examples/book/book4/book4.pro b/tools/designer/examples/book/book4/book4.pro
new file mode 100644
index 0000000..a7e1f7b
--- /dev/null
+++ b/tools/designer/examples/book/book4/book4.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+
+SOURCES += main.cpp ../connection.cpp
+FORMS = book.ui
+DBFILE = book.db
diff --git a/tools/designer/examples/book/book4/main.cpp b/tools/designer/examples/book/book4/main.cpp
new file mode 100644
index 0000000..2688b18
--- /dev/null
+++ b/tools/designer/examples/book/book4/main.cpp
@@ -0,0 +1,29 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include "book.h"
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ if ( ! createConnections() )
+ return 1;
+
+ BookForm bookForm;
+ app.setMainWidget( &bookForm );
+ bookForm.show();
+
+ return app.exec();
+}
+
+
diff --git a/tools/designer/examples/book/book5/book.ui b/tools/designer/examples/book/book5/book.ui
new file mode 100644
index 0000000..b27cb94
--- /dev/null
+++ b/tools/designer/examples/book/book5/book.ui
@@ -0,0 +1,188 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>BookForm</class>
+<include location="local" impldecl="in declaration">qdatabrowser.h</include>
+<include location="local" impldecl="in declaration">editbook.h</include>
+<include location="local" implDecl="in declaration">book.ui.h</include>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>530</width>
+ <height>524</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Book</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>Splitter1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>MShape</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>MShadow</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Surname</string>
+ </property>
+ <property name="field">
+ <string>surname</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Forename</string>
+ </property>
+ <property name="field">
+ <string>forename</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>AuthorDataTable</cstring>
+ </property>
+ <property name="confirmDelete">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>surname ASC</string>
+ <string>forename ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>author</string>
+ </stringlist>
+ </property>
+ </widget>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ <property name="field">
+ <string>title</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Price</string>
+ </property>
+ <property name="field">
+ <string>price</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Notes</string>
+ </property>
+ <property name="field">
+ <string>notes</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>BookDataTable</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>title ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ </stringlist>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>EditPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Edit Books</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>QuitPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>QuitPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BookForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>EditPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BookForm</receiver>
+ <slot>editClicked()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>primeInsertAuthor(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>currentChanged(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>newCurrentAuthor(QSqlRecord*)</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">editClicked()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">newCurrentAuthor( QSqlRecord * author )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertAuthor( QSqlRecord * buffer )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/book/book5/book.ui.h b/tools/designer/examples/book/book5/book.ui.h
new file mode 100644
index 0000000..576af61
--- /dev/null
+++ b/tools/designer/examples/book/book5/book.ui.h
@@ -0,0 +1,23 @@
+void BookForm::editClicked()
+{
+ EditBookForm *dialog = new EditBookForm( this, "Edit Book Form", TRUE );
+ dialog->exec();
+ delete dialog;
+}
+
+void BookForm::newCurrentAuthor( QSqlRecord *author )
+{
+ BookDataTable->setFilter( "authorid=" + author->value( "id" ).toString() );
+ BookDataTable->refresh();
+}
+
+void BookForm::primeInsertAuthor( QSqlRecord *buffer )
+{
+ QSqlQuery query;
+ query.exec( "UPDATE sequence SET sequence = sequence + 1 WHERE tablename='author';" );
+ query.exec( "SELECT sequence FROM sequence WHERE tablename='author';" );
+ if ( query.next() ) {
+ buffer->setValue( "id", query.value( 0 ) );
+ }
+}
+
diff --git a/tools/designer/examples/book/book5/book5.pro b/tools/designer/examples/book/book5/book5.pro
new file mode 100644
index 0000000..030db5f
--- /dev/null
+++ b/tools/designer/examples/book/book5/book5.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+
+SOURCES += main.cpp ../connection.cpp
+FORMS = book.ui editbook.ui
+DBFILE = book.db
diff --git a/tools/designer/examples/book/book5/editbook.ui b/tools/designer/examples/book/book5/editbook.ui
new file mode 100644
index 0000000..088b3a3
--- /dev/null
+++ b/tools/designer/examples/book/book5/editbook.ui
@@ -0,0 +1,291 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>EditBookForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>EditBookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>568</width>
+ <height>301</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Books</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QDataBrowser">
+ <property name="name">
+ <cstring>BookDataBrowser</cstring>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>title ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ </stringlist>
+ </property>
+ <property name="frameworkCode" stdset="0">
+ <bool>false</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>labelPrice</cstring>
+ </property>
+ <property name="text">
+ <string>Price</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>labelTitle</cstring>
+ </property>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>QLineEditTitle</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ <string>title</string>
+ </stringlist>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>QLineEditPrice</cstring>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ <string>price</string>
+ </stringlist>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonFirst</cstring>
+ </property>
+ <property name="text">
+ <string>|&lt; &amp;First</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonPrev</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;&lt; &amp;Prev</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonNext</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Next &gt;&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonLast</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Last &gt;|</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonInsert</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Insert</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonUpdate</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Update</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonDelete</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonClose</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButtonFirst</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>first()</slot>
+ </connection>
+ <connection>
+ <sender>BookDataBrowser</sender>
+ <signal>firstRecordAvailable( bool )</signal>
+ <receiver>PushButtonFirst</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>PushButtonPrev</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>prev()</slot>
+ </connection>
+ <connection>
+ <sender>BookDataBrowser</sender>
+ <signal>prevRecordAvailable( bool )</signal>
+ <receiver>PushButtonPrev</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>PushButtonNext</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>next()</slot>
+ </connection>
+ <connection>
+ <sender>BookDataBrowser</sender>
+ <signal>nextRecordAvailable( bool )</signal>
+ <receiver>PushButtonNext</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>PushButtonLast</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>last()</slot>
+ </connection>
+ <connection>
+ <sender>BookDataBrowser</sender>
+ <signal>lastRecordAvailable( bool )</signal>
+ <receiver>PushButtonLast</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>PushButtonInsert</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>insert()</slot>
+ </connection>
+ <connection>
+ <sender>PushButtonUpdate</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>update()</slot>
+ </connection>
+ <connection>
+ <sender>PushButtonDelete</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>del()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">editbook.ui.h</include>
+</includes>
+<slots>
+ <slot>init()</slot>
+ <slot>destroy()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/examples/book/book5/editbook.ui.h b/tools/designer/examples/book/book5/editbook.ui.h
new file mode 100644
index 0000000..4a8a636
--- /dev/null
+++ b/tools/designer/examples/book/book5/editbook.ui.h
@@ -0,0 +1,10 @@
+void EditBookForm::init()
+{
+
+}
+
+void EditBookForm::destroy()
+{
+
+}
+
diff --git a/tools/designer/examples/book/book5/main.cpp b/tools/designer/examples/book/book5/main.cpp
new file mode 100644
index 0000000..464ed42
--- /dev/null
+++ b/tools/designer/examples/book/book5/main.cpp
@@ -0,0 +1,27 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include "book.h"
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ if ( ! createConnections() )
+ return 1;
+
+ BookForm bookForm;
+ app.setMainWidget( &bookForm );
+ bookForm.show();
+
+ return app.exec();
+}
diff --git a/tools/designer/examples/book/book6/book.ui b/tools/designer/examples/book/book6/book.ui
new file mode 100644
index 0000000..e3ede50
--- /dev/null
+++ b/tools/designer/examples/book/book6/book.ui
@@ -0,0 +1,189 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>BookForm</class>
+<include location="global" impldecl="in declaration">qsqlrecord.h</include>
+<include location="local" impldecl="in declaration">editbook.h</include>
+<include location="global" impldecl="in declaration">qdatabrowser.h</include>
+<include location="local" implDecl="in declaration">book.ui.h</include>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>494</width>
+ <height>506</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Book</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>Splitter1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>MShape</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>MShadow</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Surname</string>
+ </property>
+ <property name="field">
+ <string>surname</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Forename</string>
+ </property>
+ <property name="field">
+ <string>forename</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>AuthorDataTable</cstring>
+ </property>
+ <property name="confirmDelete">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>surname ASC</string>
+ <string>forename ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>author</string>
+ </stringlist>
+ </property>
+ </widget>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ <property name="field">
+ <string>title</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Price</string>
+ </property>
+ <property name="field">
+ <string>price</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Notes</string>
+ </property>
+ <property name="field">
+ <string>notes</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>BookDataTable</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>title ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ </stringlist>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>EditPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Edit Books</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>QuitPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>QuitPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BookForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>EditPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BookForm</receiver>
+ <slot>editClicked()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>primeInsertAuthor(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>currentChanged(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>newCurrentAuthor(QSqlRecord*)</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">editClicked()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">newCurrentAuthor( QSqlRecord * author )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertAuthor( QSqlRecord * buffer )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/book/book6/book.ui.h b/tools/designer/examples/book/book6/book.ui.h
new file mode 100644
index 0000000..f41103d
--- /dev/null
+++ b/tools/designer/examples/book/book6/book.ui.h
@@ -0,0 +1,33 @@
+void BookForm::editClicked()
+{
+ EditBookForm *dialog = new EditBookForm( this, "Edit Book Form", TRUE );
+ QSqlCursor cur( "book" );
+ dialog->BookDataBrowser->setSqlCursor( &cur );
+ dialog->BookDataBrowser->setFilter( BookDataTable->filter() );
+ dialog->BookDataBrowser->setSort(QSqlIndex::fromStringList(
+ BookDataTable->sort(), &cur ) );
+ dialog->BookDataBrowser->refresh();
+ int i = BookDataTable->currentRow();
+ if ( i == -1 ) i = 0; // Always use the first row
+ dialog->BookDataBrowser->seek( i );
+ dialog->exec();
+ delete dialog;
+ BookDataTable->refresh();
+}
+
+void BookForm::newCurrentAuthor( QSqlRecord * author )
+{
+ BookDataTable->setFilter( "authorid=" + author->value( "id" ).toString() );
+ BookDataTable->refresh();
+}
+
+void BookForm::primeInsertAuthor( QSqlRecord * buffer )
+{
+ QSqlQuery query;
+ query.exec( "UPDATE sequence SET sequence = sequence + 1 WHERE tablename='author';" );
+ query.exec( "SELECT sequence FROM sequence WHERE tablename='author';" );
+ if ( query.next() ) {
+ buffer->setValue( "id", query.value( 0 ) );
+ }
+}
+
diff --git a/tools/designer/examples/book/book6/book6.pro b/tools/designer/examples/book/book6/book6.pro
new file mode 100644
index 0000000..030db5f
--- /dev/null
+++ b/tools/designer/examples/book/book6/book6.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+
+SOURCES += main.cpp ../connection.cpp
+FORMS = book.ui editbook.ui
+DBFILE = book.db
diff --git a/tools/designer/examples/book/book6/editbook.ui b/tools/designer/examples/book/book6/editbook.ui
new file mode 100644
index 0000000..2f7acd1
--- /dev/null
+++ b/tools/designer/examples/book/book6/editbook.ui
@@ -0,0 +1,300 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>EditBookForm</class>
+<include location="global" impldecl="in declaration">qsqlrecord.h</include>
+<include location="local" implDecl="in declaration">editbook.ui.h</include>
+<forward>class QSqlRecord;</forward>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>EditBookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>536</width>
+ <height>285</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Books</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QDataBrowser">
+ <property name="name">
+ <cstring>BookDataBrowser</cstring>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>title ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ </stringlist>
+ </property>
+ <property name="frameworkCode" stdset="0">
+ <bool>false</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>labelPrice</cstring>
+ </property>
+ <property name="text">
+ <string>Price</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>labelTitle</cstring>
+ </property>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>QLineEditTitle</cstring>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ <string>title</string>
+ </stringlist>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>QLineEditPrice</cstring>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ <string>price</string>
+ </stringlist>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonFirst</cstring>
+ </property>
+ <property name="text">
+ <string>|&lt; &amp;First</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonPrev</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;&lt; &amp;Prev</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonNext</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Next &gt;&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonLast</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Last &gt;|</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonInsert</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Insert</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonUpdate</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Update</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonDelete</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonClose</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>PushButtonFirst</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>first()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>firstRecordAvailable( bool )</signal>
+ <receiver>PushButtonFirst</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonPrev</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>prev()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>prevRecordAvailable( bool )</signal>
+ <receiver>PushButtonPrev</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonNext</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>next()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>nextRecordAvailable( bool )</signal>
+ <receiver>PushButtonNext</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonLast</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>last()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>lastRecordAvailable( bool )</signal>
+ <receiver>PushButtonLast</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonInsert</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>insert()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonUpdate</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>update()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonDelete</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>del()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>primeInsertBook(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonClose</sender>
+ <signal>clicked()</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertBook( QSqlRecord * buffer )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/book/book6/editbook.ui.h b/tools/designer/examples/book/book6/editbook.ui.h
new file mode 100644
index 0000000..eb76ac3
--- /dev/null
+++ b/tools/designer/examples/book/book6/editbook.ui.h
@@ -0,0 +1,10 @@
+void EditBookForm::primeInsertBook( QSqlRecord * buffer )
+{
+ QSqlQuery query;
+ query.exec( "UPDATE sequence SET sequence = sequence + 1 WHERE tablename='book';" );
+ query.exec( "SELECT sequence FROM sequence WHERE tablename='book';" );
+ if ( query.next() ) {
+ buffer->setValue( "id", query.value( 0 ) );
+ }
+}
+
diff --git a/tools/designer/examples/book/book6/main.cpp b/tools/designer/examples/book/book6/main.cpp
new file mode 100644
index 0000000..464ed42
--- /dev/null
+++ b/tools/designer/examples/book/book6/main.cpp
@@ -0,0 +1,27 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include "book.h"
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ if ( ! createConnections() )
+ return 1;
+
+ BookForm bookForm;
+ app.setMainWidget( &bookForm );
+ bookForm.show();
+
+ return app.exec();
+}
diff --git a/tools/designer/examples/book/book7/book.ui b/tools/designer/examples/book/book7/book.ui
new file mode 100644
index 0000000..b3c2869
--- /dev/null
+++ b/tools/designer/examples/book/book7/book.ui
@@ -0,0 +1,189 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>BookForm</class>
+<include location="global" impldecl="in declaration">qsqlrecord.h</include>
+<include location="local" impldecl="in declaration">editbook.h</include>
+<include location="global" impldecl="in declaration">qdatabrowser.h</include>
+<include location="local" implDecl="in declaration">book.ui.h</include>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>490</width>
+ <height>504</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Book</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>Splitter1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>MShape</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>MShadow</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Surname</string>
+ </property>
+ <property name="field">
+ <string>surname</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Forename</string>
+ </property>
+ <property name="field">
+ <string>forename</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>AuthorDataTable</cstring>
+ </property>
+ <property name="confirmDelete">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>surname ASC</string>
+ <string>forename ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>author</string>
+ </stringlist>
+ </property>
+ </widget>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ <property name="field">
+ <string>title</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Price</string>
+ </property>
+ <property name="field">
+ <string>price</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Notes</string>
+ </property>
+ <property name="field">
+ <string>notes</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>BookDataTable</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>title ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ </stringlist>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>EditPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Edit Books</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>QuitPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>QuitPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BookForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>EditPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BookForm</receiver>
+ <slot>editClicked()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>primeInsertAuthor(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>currentChanged(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>newCurrentAuthor(QSqlRecord*)</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">editClicked()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">newCurrentAuthor( QSqlRecord * author )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertAuthor( QSqlRecord * buffer )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/book/book7/book.ui.h b/tools/designer/examples/book/book7/book.ui.h
new file mode 100644
index 0000000..de754b1
--- /dev/null
+++ b/tools/designer/examples/book/book7/book.ui.h
@@ -0,0 +1,33 @@
+void BookForm::editClicked()
+{
+ EditBookForm *dialog = new EditBookForm( this, "Edit Book Form", TRUE );
+ QSqlCursor cur( "book" );
+ dialog->BookDataBrowser->setSqlCursor( &cur );
+ dialog->BookDataBrowser->setFilter( BookDataTable->filter() );
+ dialog->BookDataBrowser->setSort(QSqlIndex::fromStringList(
+ BookDataTable->sort(), &cur ) );
+ dialog->BookDataBrowser->refresh();
+ int i = BookDataTable->currentRow();
+ if ( i == -1 ) i = 0; // Always use the first row
+ dialog->BookDataBrowser->seek( i );
+ dialog->exec();
+ delete dialog;
+ BookDataTable->refresh();
+}
+
+void BookForm::newCurrentAuthor( QSqlRecord *author )
+{
+ BookDataTable->setFilter( "authorid=" + author->value( "id" ).toString() );
+ BookDataTable->refresh();
+}
+
+void BookForm::primeInsertAuthor( QSqlRecord *buffer )
+{
+ QSqlQuery query;
+ query.exec( "UPDATE sequence SET sequence = sequence + 1 WHERE tablename='author';" );
+ query.exec( "SELECT sequence FROM sequence WHERE tablename='author';" );
+ if ( query.next() ) {
+ buffer->setValue( "id", query.value( 0 ) );
+ }
+}
+
diff --git a/tools/designer/examples/book/book7/book7.pro b/tools/designer/examples/book/book7/book7.pro
new file mode 100644
index 0000000..22c7e9b
--- /dev/null
+++ b/tools/designer/examples/book/book7/book7.pro
@@ -0,0 +1,7 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+SOURCES += main.cpp ../connection.cpp
+FORMS = book.ui editbook.ui
+DBFILE = book.db
diff --git a/tools/designer/examples/book/book7/editbook.ui b/tools/designer/examples/book/book7/editbook.ui
new file mode 100644
index 0000000..85df2ba
--- /dev/null
+++ b/tools/designer/examples/book/book7/editbook.ui
@@ -0,0 +1,384 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>EditBookForm</class>
+<include location="global" impldecl="in declaration">qsqlrecord.h</include>
+<include location="local" implDecl="in declaration">editbook.ui.h</include>
+<forward>class QSqlRecord;</forward>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>EditBookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>528</width>
+ <height>305</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Books</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QDataBrowser">
+ <property name="name">
+ <cstring>BookDataBrowser</cstring>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>title ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ </stringlist>
+ </property>
+ <property name="frameworkCode" stdset="0">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>labelPrice</cstring>
+ </property>
+ <property name="text">
+ <string>Price</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>labelTitle</cstring>
+ </property>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>QLineEditTitle</cstring>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ <string>title</string>
+ </stringlist>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>QLineEditPrice</cstring>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ <string>price</string>
+ </stringlist>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonInsert</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Insert</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonUpdate</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Update</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonDelete</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonClose</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonFirst</cstring>
+ </property>
+ <property name="text">
+ <string>|&lt; &amp;First</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonPrev</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;&lt; &amp;Prev</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonNext</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Next &gt;&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonLast</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Last &gt;|</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Author</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>ComboBoxAuthor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>author_view</string>
+ <string>name</string>
+ </stringlist>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>PushButtonFirst</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>first()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>firstRecordAvailable( bool )</signal>
+ <receiver>PushButtonFirst</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonPrev</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>prev()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>prevRecordAvailable( bool )</signal>
+ <receiver>PushButtonPrev</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonNext</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>next()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>nextRecordAvailable( bool )</signal>
+ <receiver>PushButtonNext</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonLast</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>last()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>lastRecordAvailable( bool )</signal>
+ <receiver>PushButtonLast</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonInsert</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>insert()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonUpdate</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>update()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonDelete</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>del()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonClose</sender>
+ <signal>clicked()</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>primeUpdate(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>primeUpdateBook(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>beforeUpdate(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>beforeUpdateBook(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>beforeInsert(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>beforeUpdateBook(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>primeInsertBook(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>primeInsertBook(QSqlRecord*)</slot>
+ </connection>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">init()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">beforeUpdateBook( QSqlRecord * buffer )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertBook( QSqlRecord * buffer )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeUpdateBook( QSqlRecord * buffer )</slot>
+</connections>
+<tabstops>
+ <tabstop>QLineEditTitle</tabstop>
+ <tabstop>QLineEditPrice</tabstop>
+ <tabstop>ComboBoxAuthor</tabstop>
+ <tabstop>PushButtonFirst</tabstop>
+ <tabstop>PushButtonPrev</tabstop>
+ <tabstop>PushButtonNext</tabstop>
+ <tabstop>PushButtonLast</tabstop>
+ <tabstop>PushButtonInsert</tabstop>
+ <tabstop>PushButtonUpdate</tabstop>
+ <tabstop>PushButtonDelete</tabstop>
+ <tabstop>PushButtonClose</tabstop>
+</tabstops>
+</UI>
diff --git a/tools/designer/examples/book/book7/editbook.ui.h b/tools/designer/examples/book/book7/editbook.ui.h
new file mode 100644
index 0000000..f955312
--- /dev/null
+++ b/tools/designer/examples/book/book7/editbook.ui.h
@@ -0,0 +1,42 @@
+void EditBookForm::init()
+{
+ QSqlQuery query( "SELECT surname FROM author ORDER BY surname;" );
+ while ( query.next() )
+ ComboBoxAuthor->insertItem( query.value( 0 ).toString());
+}
+
+void EditBookForm::beforeUpdateBook( QSqlRecord * buffer )
+{
+ QSqlQuery query( "SELECT id FROM author WHERE surname ='" +
+ ComboBoxAuthor->currentText() + "';" );
+ if ( query.next() )
+ buffer->setValue( "authorid", query.value( 0 ) );
+}
+
+void EditBookForm::primeInsertBook( QSqlRecord * buffer )
+{
+ QSqlQuery query;
+ query.exec( "UPDATE sequence SET sequence = sequence + 1 WHERE tablename='book';" );
+ query.exec( "SELECT sequence FROM sequence WHERE tablename='book';" );
+ if ( query.next() ) {
+ buffer->setValue( "id", query.value( 0 ) );
+ }
+}
+
+void EditBookForm::primeUpdateBook( QSqlRecord * buffer )
+{
+ // Who is this book's author?
+ QSqlQuery query( "SELECT surname FROM author WHERE id='" +
+ buffer->value( "authorid" ).toString() + "';" );
+ QString author = "";
+ if ( query.next() )
+ author = query.value( 0 ).toString();
+ // Set the ComboBox to the right author
+ for ( int i = 0; i < ComboBoxAuthor->count(); i++ ) {
+ if ( ComboBoxAuthor->text( i ) == author ) {
+ ComboBoxAuthor->setCurrentItem( i ) ;
+ break;
+ }
+ }
+}
+
diff --git a/tools/designer/examples/book/book7/main.cpp b/tools/designer/examples/book/book7/main.cpp
new file mode 100644
index 0000000..464ed42
--- /dev/null
+++ b/tools/designer/examples/book/book7/main.cpp
@@ -0,0 +1,27 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include "book.h"
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ if ( ! createConnections() )
+ return 1;
+
+ BookForm bookForm;
+ app.setMainWidget( &bookForm );
+ bookForm.show();
+
+ return app.exec();
+}
diff --git a/tools/designer/examples/book/book8/book.ui b/tools/designer/examples/book/book8/book.ui
new file mode 100644
index 0000000..b3c2869
--- /dev/null
+++ b/tools/designer/examples/book/book8/book.ui
@@ -0,0 +1,189 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>BookForm</class>
+<include location="global" impldecl="in declaration">qsqlrecord.h</include>
+<include location="local" impldecl="in declaration">editbook.h</include>
+<include location="global" impldecl="in declaration">qdatabrowser.h</include>
+<include location="local" implDecl="in declaration">book.ui.h</include>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>490</width>
+ <height>504</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Book</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>Splitter1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>MShape</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>MShadow</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Surname</string>
+ </property>
+ <property name="field">
+ <string>surname</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Forename</string>
+ </property>
+ <property name="field">
+ <string>forename</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>AuthorDataTable</cstring>
+ </property>
+ <property name="confirmDelete">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>surname ASC</string>
+ <string>forename ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>author</string>
+ </stringlist>
+ </property>
+ </widget>
+ <widget class="QDataTable">
+ <column>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ <property name="field">
+ <string>title</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Price</string>
+ </property>
+ <property name="field">
+ <string>price</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Notes</string>
+ </property>
+ <property name="field">
+ <string>notes</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>BookDataTable</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>title ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ </stringlist>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>EditPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Edit Books</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>QuitPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>QuitPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BookForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>EditPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BookForm</receiver>
+ <slot>editClicked()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>primeInsertAuthor(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>AuthorDataTable</sender>
+ <signal>currentChanged(QSqlRecord*)</signal>
+ <receiver>BookForm</receiver>
+ <slot>newCurrentAuthor(QSqlRecord*)</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">editClicked()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">newCurrentAuthor( QSqlRecord * author )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertAuthor( QSqlRecord * buffer )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/book/book8/book.ui.h b/tools/designer/examples/book/book8/book.ui.h
new file mode 100644
index 0000000..6c8a2b5
--- /dev/null
+++ b/tools/designer/examples/book/book8/book.ui.h
@@ -0,0 +1,33 @@
+void BookForm::editClicked()
+{
+ EditBookForm *dialog = new EditBookForm( this, "Edit Book Form", TRUE );
+ QSqlCursor cur( "book" );
+ dialog->BookDataBrowser->setSqlCursor( &cur );
+ dialog->BookDataBrowser->setFilter( BookDataTable->filter() );
+ dialog->BookDataBrowser->setSort(QSqlIndex::fromStringList(
+ BookDataTable->sort(), &cur ) );
+ dialog->BookDataBrowser->refresh();
+ int i = BookDataTable->currentRow();
+ if ( i == -1 ) i = 0; // Always use the first row
+ dialog->BookDataBrowser->seek( i );
+ dialog->exec();
+ delete dialog;
+ BookDataTable->refresh();
+}
+
+void BookForm::newCurrentAuthor( QSqlRecord *author )
+{
+ BookDataTable->setFilter( "authorid=" + author->value( "id" ).toString() );
+ BookDataTable->refresh();
+}
+
+void BookForm::primeInsertAuthor( QSqlRecord *buffer )
+{
+ QSqlQuery q;
+ q.exec( "UPDATE sequence SET sequence = sequence + 1 WHERE tablename='author';" );
+ q.exec( "SELECT sequence FROM sequence WHERE tablename='author';" );
+ if ( q.next() ) {
+ buffer->setValue( "id", q.value( 0 ) );
+ }
+}
+
diff --git a/tools/designer/examples/book/book8/book8.pro b/tools/designer/examples/book/book8/book8.pro
new file mode 100644
index 0000000..e4bdf75
--- /dev/null
+++ b/tools/designer/examples/book/book8/book8.pro
@@ -0,0 +1,7 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+SOURCES += main.cpp ../connection.cpp
+FORMS = book.ui editbook.ui
+CONFIG += qt warn_on release
+DBFILE = book.db
diff --git a/tools/designer/examples/book/book8/editbook.ui b/tools/designer/examples/book/book8/editbook.ui
new file mode 100644
index 0000000..17d378b
--- /dev/null
+++ b/tools/designer/examples/book/book8/editbook.ui
@@ -0,0 +1,386 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>EditBookForm</class>
+<include location="global" impldecl="in declaration">qsqlrecord.h</include>
+<include location="local" implDecl="in declaration">editbook.ui.h</include>
+<forward>class QSqlRecord;</forward>
+<variable>QMap&lt;QString,int&gt; authorMap;</variable>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>EditBookForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>520</width>
+ <height>369</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Books</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QDataBrowser">
+ <property name="name">
+ <cstring>BookDataBrowser</cstring>
+ </property>
+ <property name="sort">
+ <stringlist>
+ <string>title ASC</string>
+ </stringlist>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ </stringlist>
+ </property>
+ <property name="frameworkCode" stdset="0">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>labelPrice</cstring>
+ </property>
+ <property name="text">
+ <string>Price</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>labelTitle</cstring>
+ </property>
+ <property name="text">
+ <string>Title</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>QLineEditTitle</cstring>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ <string>title</string>
+ </stringlist>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>QLineEditPrice</cstring>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>book</string>
+ <string>price</string>
+ </stringlist>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonInsert</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Insert</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonUpdate</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Update</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonDelete</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonClose</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonFirst</cstring>
+ </property>
+ <property name="text">
+ <string>|&lt; &amp;First</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonPrev</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;&lt; &amp;Prev</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonNext</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Next &gt;&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButtonLast</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Last &gt;|</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Author</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>ComboBoxAuthor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="database" stdset="0">
+ <stringlist>
+ <string>(default)</string>
+ <string>author_view</string>
+ <string>name</string>
+ </stringlist>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>PushButtonFirst</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>first()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>firstRecordAvailable( bool )</signal>
+ <receiver>PushButtonFirst</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonPrev</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>prev()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>prevRecordAvailable( bool )</signal>
+ <receiver>PushButtonPrev</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonNext</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>next()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>nextRecordAvailable( bool )</signal>
+ <receiver>PushButtonNext</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonLast</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>last()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>lastRecordAvailable( bool )</signal>
+ <receiver>PushButtonLast</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonInsert</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>insert()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonUpdate</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>update()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonDelete</sender>
+ <signal>clicked()</signal>
+ <receiver>BookDataBrowser</receiver>
+ <slot>del()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>PushButtonClose</sender>
+ <signal>clicked()</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>primeUpdate(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>primeUpdateBook(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>beforeUpdate(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>beforeUpdateBook(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>beforeInsert(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>beforeUpdateBook(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>primeInsertBook(QSqlRecord*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>BookDataBrowser</sender>
+ <signal>primeInsert(QSqlRecord*)</signal>
+ <receiver>EditBookForm</receiver>
+ <slot>primeInsertBook(QSqlRecord*)</slot>
+ </connection>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">init()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">beforeUpdateBook( QSqlRecord * buffer )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">mapAuthor( const QString &amp; name, int &amp; id, bool populate )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeInsertBook( QSqlRecord * buffer )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">primeUpdateBook( QSqlRecord * buffer )</slot>
+</connections>
+<tabstops>
+ <tabstop>QLineEditTitle</tabstop>
+ <tabstop>QLineEditPrice</tabstop>
+ <tabstop>ComboBoxAuthor</tabstop>
+ <tabstop>PushButtonFirst</tabstop>
+ <tabstop>PushButtonPrev</tabstop>
+ <tabstop>PushButtonNext</tabstop>
+ <tabstop>PushButtonLast</tabstop>
+ <tabstop>PushButtonInsert</tabstop>
+ <tabstop>PushButtonUpdate</tabstop>
+ <tabstop>PushButtonDelete</tabstop>
+ <tabstop>PushButtonClose</tabstop>
+</tabstops>
+</UI>
diff --git a/tools/designer/examples/book/book8/editbook.ui.h b/tools/designer/examples/book/book8/editbook.ui.h
new file mode 100644
index 0000000..1bac1a8
--- /dev/null
+++ b/tools/designer/examples/book/book8/editbook.ui.h
@@ -0,0 +1,47 @@
+void EditBookForm::init()
+{
+ QSqlQuery query( "SELECT surname, id FROM author ORDER BY surname;" );
+ while ( query.next() ) {
+ ComboBoxAuthor->insertItem( query.value( 0 ).toString() );
+ int id = query.value( 1 ).toInt();
+ mapAuthor( query.value( 0 ).toString(), id, TRUE );
+ }
+}
+
+void EditBookForm::beforeUpdateBook( QSqlRecord * buffer )
+{
+ int id;
+ mapAuthor( ComboBoxAuthor->currentText(), id, FALSE );
+ buffer->setValue( "authorid", id );
+}
+
+void EditBookForm::mapAuthor( const QString & name, int & id, bool populate )
+{
+ if ( populate )
+ authorMap[ name ] = id;
+ else
+ id = authorMap[ name ];
+}
+
+void EditBookForm::primeInsertBook( QSqlRecord * buffer )
+{
+ QSqlQuery q;
+ q.exec( "UPDATE sequence SET sequence = sequence + 1 WHERE tablename='book';" );
+ q.exec( "SELECT sequence FROM sequence WHERE tablename='book';" );
+ if ( q.next() ) {
+ buffer->setValue( "id", q.value( 0 ) );
+ }
+}
+
+void EditBookForm::primeUpdateBook( QSqlRecord * buffer )
+{
+ int id = buffer->value( "authorid" ).toInt();
+ for ( int i = 0; i < ComboBoxAuthor->count(); i++ ) {
+ QString author = ComboBoxAuthor->text( i );
+ if ( authorMap.contains( author ) && authorMap[author] == id ) {
+ ComboBoxAuthor->setCurrentItem( i ) ;
+ break;
+ }
+ }
+}
+
diff --git a/tools/designer/examples/book/book8/main.cpp b/tools/designer/examples/book/book8/main.cpp
new file mode 100644
index 0000000..464ed42
--- /dev/null
+++ b/tools/designer/examples/book/book8/main.cpp
@@ -0,0 +1,27 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include "book.h"
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ if ( ! createConnections() )
+ return 1;
+
+ BookForm bookForm;
+ app.setMainWidget( &bookForm );
+ bookForm.show();
+
+ return app.exec();
+}
diff --git a/tools/designer/examples/book/connection.cpp b/tools/designer/examples/book/connection.cpp
new file mode 100644
index 0000000..710f50c
--- /dev/null
+++ b/tools/designer/examples/book/connection.cpp
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+#include <qsqldatabase.h>
+#include "connection.h"
+
+bool createConnections()
+{
+ // create the default database connection
+ QSqlDatabase *defaultDB = QSqlDatabase::addDatabase( DB_BOOKS_DRIVER );
+ defaultDB->setDatabaseName( DB_BOOKS );
+ defaultDB->setUserName( DB_BOOKS_USER );
+ defaultDB->setPassword( DB_BOOKS_PASSWD );
+ defaultDB->setHostName( DB_BOOKS_HOST );
+ if ( ! defaultDB->open() ) {
+ qWarning( "Failed to open books database: " +
+ defaultDB->lastError().driverText() );
+ qWarning( defaultDB->lastError().databaseText() );
+ return FALSE;
+ }
+
+ QSqlQuery q(QString::null, defaultDB);
+ q.exec("CREATE TABLE author ( id integer primary key, "
+ "forename varchar(40), surname varchar(40) )");
+ q.exec("CREATE TABLE book ( id integer primary key, "
+ "title varchar(40), price numeric(10,2), authorid integer, notes varchar(255) )");
+
+ q.exec("CREATE TABLE sequence ( tablename varchar(10), sequence numeric)");
+
+ q.exec("INSERT INTO author VALUES ( 0, 'Philip K', 'Dick' )");
+ q.exec("INSERT INTO author VALUES ( 1, 'Robert', 'Heinlein' )");
+ q.exec("INSERT INTO author VALUES ( 2, 'Sarah', 'Paretsky' )");
+
+ q.exec("INSERT INTO book VALUES (0, 'The Man Who Japed', 6.99, 0, 'A good book' )");
+ q.exec("INSERT INTO book VALUES (1, 'The Man in the High Castle', 9.99, 0, 'Worth reading' )");
+ q.exec("INSERT INTO book VALUES ( 2, 'The Number of the Beast', 8.99, 1, 'Get this!' )");
+ q.exec("INSERT INTO book VALUES ( 3, 'Indemnity Only', 9.99, 2, 'Cool' )");
+ q.exec("INSERT INTO book VALUES ( 4, 'Burn Marks', 9.99, 2, 'Need to make notes' )");
+ q.exec("INSERT INTO book VALUES ( 5, 'Deadlock', 9.99, 2, 'Hmmm..' )");
+
+ q.exec("INSERT INTO sequence VALUES ( 'author', 2 )");
+ q.exec("INSERT INTO sequence VALUES ( 'book', 5 )");
+
+ return TRUE;
+}
+
+
diff --git a/tools/designer/examples/book/connection.h b/tools/designer/examples/book/connection.h
new file mode 100644
index 0000000..9768c73
--- /dev/null
+++ b/tools/designer/examples/book/connection.h
@@ -0,0 +1,18 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+// Add your own connection parameters here
+#define DB_BOOKS_DRIVER "QSQLITE"
+#define DB_BOOKS ":memory:"
+#define DB_BOOKS_USER ""
+#define DB_BOOKS_PASSWD ""
+#define DB_BOOKS_HOST ""
+
+bool createConnections();
+
diff --git a/tools/designer/examples/colortool/colornameform.ui b/tools/designer/examples/colortool/colornameform.ui
new file mode 100644
index 0000000..566cd8d
--- /dev/null
+++ b/tools/designer/examples/colortool/colornameform.ui
@@ -0,0 +1,168 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ColorNameForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ColorNameForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>348</width>
+ <height>105</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Color Tool -- Color Name</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>colorLabel</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>editraise.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Name</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>colorLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>colorLineEdit</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>11</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorNameForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ColorNameForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">colornameform.ui.h</include>
+</includes>
+<slots>
+ <slot>validate()</slot>
+</slots>
+<functions>
+ <function>setColors( const QMap&lt;QString, QColor&gt; &amp; colors )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/examples/colortool/colornameform.ui.h b/tools/designer/examples/colortool/colornameform.ui.h
new file mode 100644
index 0000000..24c9d71
--- /dev/null
+++ b/tools/designer/examples/colortool/colornameform.ui.h
@@ -0,0 +1,27 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions use Qt Designer which will
+** update this file, preserving your code. Create an init() function in place
+** of a constructor, and a destroy() function in place of a destructor.
+*****************************************************************************/
+#include <qcolor.h>
+#include <qmap.h>
+#include <qstring.h>
+
+QMap<QString,QColor> m_colors;
+
+void ColorNameForm::setColors( const QMap<QString,QColor>& colors )
+{
+ m_colors = colors;
+}
+
+void ColorNameForm::validate()
+{
+ QString name = colorLineEdit->text();
+ if ( ! name.isEmpty() &&
+ ( m_colors.isEmpty() || ! m_colors.contains( name ) ) )
+ accept();
+ else
+ colorLineEdit->selectAll();
+}
diff --git a/tools/designer/examples/colortool/colortool.pro b/tools/designer/examples/colortool/colortool.pro
new file mode 100644
index 0000000..af22965
--- /dev/null
+++ b/tools/designer/examples/colortool/colortool.pro
@@ -0,0 +1,27 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+SOURCES += main.cpp
+unix {
+ UI_DIR = .ui
+ MOC_DIR = .moc
+ OBJECTS_DIR = .obj
+}
+FORMS = mainform.ui \
+ colornameform.ui \
+ findform.ui \
+ optionsform.ui
+IMAGES = images/filenew.png \
+ images/fileopen.png \
+ images/filesave.png \
+ images/editcut.png \
+ images/editcopy.png \
+ images/searchfind.png \
+ images/tabwidget.png \
+ images/table.png \
+ images/iconview.png \
+ images/richtextedit.png \
+ images/widgetstack.png \
+ images/editraise.png
+CONFIG += qt warn_on release
+DBFILE = colortool.db
diff --git a/tools/designer/examples/colortool/findform.ui b/tools/designer/examples/colortool/findform.ui
new file mode 100644
index 0000000..aaf7ca9
--- /dev/null
+++ b/tools/designer/examples/colortool/findform.ui
@@ -0,0 +1,141 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>FindForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>FindForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>301</width>
+ <height>99</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Color Tool -- Find Color</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Look for</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>findLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>findLineEdit</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout10</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>9</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>findPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Find</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>closePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>closePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FindForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>findPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>FindForm</receiver>
+ <slot>find()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">findform.ui.h</include>
+</includes>
+<signals>
+ <signal>lookfor(const QString&amp;)</signal>
+</signals>
+<slots>
+ <slot>find()</slot>
+</slots>
+<functions>
+ <function>notfound()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/examples/colortool/findform.ui.h b/tools/designer/examples/colortool/findform.ui.h
new file mode 100644
index 0000000..87eafae
--- /dev/null
+++ b/tools/designer/examples/colortool/findform.ui.h
@@ -0,0 +1,18 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions use Qt Designer which will
+** update this file, preserving your code. Create an init() function in place
+** of a constructor, and a destroy() function in place of a destructor.
+*****************************************************************************/
+
+
+void FindForm::find()
+{
+ emit lookfor( findLineEdit->text() );
+}
+
+void FindForm::notfound()
+{
+ findLineEdit->selectAll();
+}
diff --git a/tools/designer/examples/colortool/images/editcopy.png b/tools/designer/examples/colortool/images/editcopy.png
new file mode 100644
index 0000000..abfe86e
--- /dev/null
+++ b/tools/designer/examples/colortool/images/editcopy.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/editcut.png b/tools/designer/examples/colortool/images/editcut.png
new file mode 100644
index 0000000..2d179bc
--- /dev/null
+++ b/tools/designer/examples/colortool/images/editcut.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/editraise.png b/tools/designer/examples/colortool/images/editraise.png
new file mode 100644
index 0000000..0241568
--- /dev/null
+++ b/tools/designer/examples/colortool/images/editraise.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/filenew.png b/tools/designer/examples/colortool/images/filenew.png
new file mode 100644
index 0000000..9853d97
--- /dev/null
+++ b/tools/designer/examples/colortool/images/filenew.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/fileopen.png b/tools/designer/examples/colortool/images/fileopen.png
new file mode 100644
index 0000000..85dab43
--- /dev/null
+++ b/tools/designer/examples/colortool/images/fileopen.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/filesave.png b/tools/designer/examples/colortool/images/filesave.png
new file mode 100644
index 0000000..21309aa
--- /dev/null
+++ b/tools/designer/examples/colortool/images/filesave.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/iconview.png b/tools/designer/examples/colortool/images/iconview.png
new file mode 100644
index 0000000..d755399
--- /dev/null
+++ b/tools/designer/examples/colortool/images/iconview.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/richtextedit.png b/tools/designer/examples/colortool/images/richtextedit.png
new file mode 100644
index 0000000..9f75c25
--- /dev/null
+++ b/tools/designer/examples/colortool/images/richtextedit.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/searchfind.png b/tools/designer/examples/colortool/images/searchfind.png
new file mode 100644
index 0000000..8f7d8ad
--- /dev/null
+++ b/tools/designer/examples/colortool/images/searchfind.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/table.png b/tools/designer/examples/colortool/images/table.png
new file mode 100644
index 0000000..4491b6e
--- /dev/null
+++ b/tools/designer/examples/colortool/images/table.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/tabwidget.png b/tools/designer/examples/colortool/images/tabwidget.png
new file mode 100644
index 0000000..3a16044
--- /dev/null
+++ b/tools/designer/examples/colortool/images/tabwidget.png
Binary files differ
diff --git a/tools/designer/examples/colortool/images/widgetstack.png b/tools/designer/examples/colortool/images/widgetstack.png
new file mode 100644
index 0000000..7b5f234
--- /dev/null
+++ b/tools/designer/examples/colortool/images/widgetstack.png
Binary files differ
diff --git a/tools/designer/examples/colortool/main.cpp b/tools/designer/examples/colortool/main.cpp
new file mode 100644
index 0000000..31b2586
--- /dev/null
+++ b/tools/designer/examples/colortool/main.cpp
@@ -0,0 +1,10 @@
+#include <qapplication.h>
+#include "mainform.h"
+
+int main( int argc, char ** argv )
+{
+ QApplication a( argc, argv );
+ MainForm *w = new MainForm;
+ w->show();
+ return a.exec();
+}
diff --git a/tools/designer/examples/colortool/mainform.ui b/tools/designer/examples/colortool/mainform.ui
new file mode 100644
index 0000000..6c89bac
--- /dev/null
+++ b/tools/designer/examples/colortool/mainform.ui
@@ -0,0 +1,601 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>MainForm</class>
+<widget class="QMainWindow">
+ <property name="name">
+ <cstring>MainForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Color Tool</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QWidgetStack">
+ <property name="name">
+ <cstring>colorWidgetStack</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tablePage</cstring>
+ </property>
+ <attribute name="id">
+ <number>0</number>
+ </attribute>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTable">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Hex</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Web</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>colorTable</cstring>
+ </property>
+ <property name="numRows">
+ <number>0</number>
+ </property>
+ <property name="numCols">
+ <number>3</number>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>iconsPage</cstring>
+ </property>
+ <attribute name="id">
+ <number>1</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QIconView">
+ <property name="name">
+ <cstring>colorIconView</cstring>
+ </property>
+ <property name="gridX">
+ <number>100</number>
+ </property>
+ <property name="resizeMode">
+ <enum>Adjust</enum>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </hbox>
+</widget>
+<menubar>
+ <property name="name">
+ <cstring>menubar</cstring>
+ </property>
+ <item text="&amp;File" name="fileMenu">
+ <action name="fileNewAction"/>
+ <action name="fileOpenAction"/>
+ <action name="fileSaveAction"/>
+ <action name="fileSaveAsAction"/>
+ <separator/>
+ <action name="fileExitAction"/>
+ </item>
+ <item text="&amp;Edit" name="editMenu">
+ <action name="editAddAction"/>
+ <action name="editCutAction"/>
+ <action name="editCopyAction"/>
+ <separator/>
+ <action name="editFindAction"/>
+ <separator/>
+ <action name="optionsAction"/>
+ </item>
+ <item text="&amp;View" name="viewMenu">
+ <action name="viewTableAction"/>
+ <action name="viewIconsAction"/>
+ </item>
+ <item text="&amp;Help" name="helpMenu">
+ <action name="helpContentsAction"/>
+ <action name="helpIndexAction"/>
+ <separator/>
+ <action name="helpAboutAction"/>
+ </item>
+</menubar>
+<toolbars>
+ <toolbar dock="2">
+ <property name="name">
+ <cstring>toolBar</cstring>
+ </property>
+ <property name="label">
+ <string>Tools</string>
+ </property>
+ <action name="fileNewAction"/>
+ <action name="fileOpenAction"/>
+ <action name="fileSaveAction"/>
+ <separator/>
+ <action name="editAddAction"/>
+ <action name="editCutAction"/>
+ <action name="editCopyAction"/>
+ <action name="editFindAction"/>
+ <separator/>
+ <action name="optionsAction"/>
+ <separator/>
+ <action name="viewTableAction"/>
+ <action name="viewIconsAction"/>
+ </toolbar>
+</toolbars>
+<actions>
+ <action>
+ <property name="name">
+ <cstring>fileNewAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>filenew.png</iconset>
+ </property>
+ <property name="text">
+ <string>New</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;New</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+N</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileOpenAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="text">
+ <string>Open</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Open...</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+O</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>filesave.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Save</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+S</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveAsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Save As</string>
+ </property>
+ <property name="menuText">
+ <string>Save &amp;As...</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileExitAction</cstring>
+ </property>
+ <property name="text">
+ <string>Exit</string>
+ </property>
+ <property name="menuText">
+ <string>E&amp;xit</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editCutAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>editcut.png</iconset>
+ </property>
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Delete</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+X</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editCopyAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>editcopy.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Copy</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+C</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editFindAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>searchfind.png</iconset>
+ </property>
+ <property name="text">
+ <string>Find</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Find...</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+F</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpContentsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Contents</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Contents...</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpIndexAction</cstring>
+ </property>
+ <property name="text">
+ <string>Index</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Index...</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpAboutAction</cstring>
+ </property>
+ <property name="text">
+ <string>About</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;About</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>optionsAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>tabwidget.png</iconset>
+ </property>
+ <property name="text">
+ <string>Options</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Options...</string>
+ </property>
+ </action>
+ <actiongroup>
+ <property name="name">
+ <cstring>viewActionGroup</cstring>
+ </property>
+ <property name="text">
+ <string>View</string>
+ </property>
+ <property name="menuText">
+ <string>View</string>
+ </property>
+ <property name="usesDropDown">
+ <bool>false</bool>
+ </property>
+ <action>
+ <property name="name">
+ <cstring>viewTableAction</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="on">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>table.png</iconset>
+ </property>
+ <property name="text">
+ <string>View Table</string>
+ </property>
+ <property name="menuText">
+ <string>View &amp;Table</string>
+ </property>
+ <property name="toolTip">
+ <string>View Table (Ctrl+T)</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+T</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>viewIconsAction</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>iconview.png</iconset>
+ </property>
+ <property name="text">
+ <string>View Icons</string>
+ </property>
+ <property name="menuText">
+ <string>View &amp;Icons</string>
+ </property>
+ <property name="toolTip">
+ <string>View Icons (Ctrl+I)</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+I</string>
+ </property>
+ </action>
+ </actiongroup>
+ <action>
+ <property name="name">
+ <cstring>editAddAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>widgetstack.png</iconset>
+ </property>
+ <property name="text">
+ <string>Add</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Add...</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+A</string>
+ </property>
+ </action>
+</actions>
+<connections>
+ <connection>
+ <sender>fileNewAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>fileNew()</slot>
+ </connection>
+ <connection>
+ <sender>fileOpenAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>fileOpen()</slot>
+ </connection>
+ <connection>
+ <sender>fileSaveAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>fileSave()</slot>
+ </connection>
+ <connection>
+ <sender>fileSaveAsAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>fileSaveAs()</slot>
+ </connection>
+ <connection>
+ <sender>fileExitAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>fileExit()</slot>
+ </connection>
+ <connection>
+ <sender>editCutAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>editCut()</slot>
+ </connection>
+ <connection>
+ <sender>editCopyAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>editCopy()</slot>
+ </connection>
+ <connection>
+ <sender>editFindAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>editFind()</slot>
+ </connection>
+ <connection>
+ <sender>helpIndexAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>helpIndex()</slot>
+ </connection>
+ <connection>
+ <sender>helpContentsAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>helpContents()</slot>
+ </connection>
+ <connection>
+ <sender>helpAboutAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>helpAbout()</slot>
+ </connection>
+ <connection>
+ <sender>colorTable</sender>
+ <signal>currentChanged(int,int)</signal>
+ <receiver>MainForm</receiver>
+ <slot>changedTableColor(int,int)</slot>
+ </connection>
+ <connection>
+ <sender>colorIconView</sender>
+ <signal>currentChanged(QIconViewItem*)</signal>
+ <receiver>MainForm</receiver>
+ <slot>changedIconColor(QIconViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>viewActionGroup</sender>
+ <signal>selected(QAction*)</signal>
+ <receiver>MainForm</receiver>
+ <slot>changeView(QAction*)</slot>
+ </connection>
+ <connection>
+ <sender>editAddAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>editAdd()</slot>
+ </connection>
+ <connection>
+ <sender>optionsAction</sender>
+ <signal>activated()</signal>
+ <receiver>MainForm</receiver>
+ <slot>editOptions()</slot>
+ </connection>
+ <connection>
+ <sender>colorWidgetStack</sender>
+ <signal>aboutToShow(int)</signal>
+ <receiver>MainForm</receiver>
+ <slot>aboutToShow()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in declaration">findform.h</include>
+ <include location="local" impldecl="in implementation">qsettings.h</include>
+ <include location="local" impldecl="in implementation">qradiobutton.h</include>
+ <include location="local" impldecl="in implementation">qcheckbox.h</include>
+ <include location="local" impldecl="in implementation">colornameform.h</include>
+ <include location="local" impldecl="in implementation">qcolordialog.h</include>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">qfile.h</include>
+ <include location="local" impldecl="in implementation">qfiledialog.h</include>
+ <include location="local" impldecl="in implementation">qapplication.h</include>
+ <include location="local" impldecl="in implementation">qcolor.h</include>
+ <include location="local" impldecl="in implementation">qstring.h</include>
+ <include location="local" impldecl="in implementation">qpainter.h</include>
+ <include location="local" impldecl="in implementation">qstatusbar.h</include>
+ <include location="local" impldecl="in implementation">qmessagebox.h</include>
+ <include location="local" impldecl="in implementation">qclipboard.h</include>
+ <include location="local" impldecl="in implementation">qlabel.h</include>
+ <include location="local" impldecl="in implementation">qlineedit.h</include>
+ <include location="local" impldecl="in implementation">optionsform.h</include>
+ <include location="local" impldecl="in implementation">mainform.ui.h</include>
+</includes>
+<forwards>
+ <forward>class QString;</forward>
+ <forward>class QColor;</forward>
+</forwards>
+<variables>
+ <variable>QStringList m_comments;</variable>
+ <variable>QString m_filename;</variable>
+ <variable>bool m_changed;</variable>
+ <variable>bool m_table_dirty;</variable>
+ <variable>bool m_icons_dirty;</variable>
+ <variable>int m_clip_as;</variable>
+ <variable>bool m_show_web;</variable>
+ <variable>QClipboard *clipboard;</variable>
+ <variable>FindForm *findForm;</variable>
+ <variable>QMap&lt;QString,QColor&gt; m_colors;</variable>
+</variables>
+<slots>
+ <slot>fileNew()</slot>
+ <slot>fileOpen()</slot>
+ <slot>fileSave()</slot>
+ <slot>fileSaveAs()</slot>
+ <slot>closeEvent( QCloseEvent * )</slot>
+ <slot>fileExit()</slot>
+ <slot>editCut()</slot>
+ <slot>editCopy()</slot>
+ <slot>editFind()</slot>
+ <slot>lookfor( const QString &amp; text )</slot>
+ <slot>helpIndex()</slot>
+ <slot>helpContents()</slot>
+ <slot>helpAbout()</slot>
+ <slot>changedTableColor( int row, int )</slot>
+ <slot>changedIconColor( QIconViewItem * item )</slot>
+ <slot>changeView( QAction * action )</slot>
+ <slot>editAdd()</slot>
+ <slot>editOptions()</slot>
+ <slot>aboutToShow()</slot>
+</slots>
+<functions>
+ <function access="private">init()</function>
+ <function>clearData( bool fillWithDefaults )</function>
+ <function>populate()</function>
+ <function returnType="QPixmap">colorSwatch( const QColor color )</function>
+ <function>load( const QString &amp; filename )</function>
+ <function returnType="bool">okToClear()</function>
+ <function>changedColor( const QString &amp; name )</function>
+ <function returnType="bool">isWebColor( QColor color )</function>
+ <function>loadSettings()</function>
+ <function>saveSettings()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/examples/colortool/mainform.ui.h b/tools/designer/examples/colortool/mainform.ui.h
new file mode 100644
index 0000000..1ed2622
--- /dev/null
+++ b/tools/designer/examples/colortool/mainform.ui.h
@@ -0,0 +1,585 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions use Qt Designer which will
+** update this file, preserving your code. Create an init() function in place
+** of a constructor, and a destroy() function in place of a destructor.
+*****************************************************************************/
+
+
+const int CLIP_AS_HEX = 0;
+const int CLIP_AS_NAME = 1;
+const int CLIP_AS_RGB = 2;
+const int COL_NAME = 0;
+const int COL_HEX = 1;
+const int COL_WEB = 2;
+const QString WINDOWS_REGISTRY = "/QtExamples";
+const QString APP_KEY = "/ColorTool/";
+
+void MainForm::init()
+{
+ clipboard = QApplication::clipboard();
+ if ( clipboard->supportsSelection() )
+ clipboard->setSelectionMode( TRUE );
+
+ findForm = 0;
+ loadSettings();
+ m_filename = "";
+ m_changed = FALSE;
+ m_table_dirty = TRUE;
+ m_icons_dirty = TRUE;
+ clearData( TRUE );
+}
+
+void MainForm::clearData( bool fillWithDefaults )
+{
+ setCaption( "Color Tool" );
+
+ m_colors.clear();
+ m_comments.clear();
+
+ if ( fillWithDefaults ) {
+ m_colors["black"] = Qt::black;
+ m_colors["blue"] = Qt::blue;
+ m_colors["cyan"] = Qt::cyan;
+ m_colors["darkblue"] = Qt::darkBlue;
+ m_colors["darkcyan"] = Qt::darkCyan;
+ m_colors["darkgray"] = Qt::darkGray;
+ m_colors["darkgreen"] = Qt::darkGreen;
+ m_colors["darkmagenta"] = Qt::darkMagenta;
+ m_colors["darkred"] = Qt::darkRed;
+ m_colors["darkyellow"] = Qt::darkYellow;
+ m_colors["gray"] = Qt::gray;
+ m_colors["green"] = Qt::green;
+ m_colors["lightgray"] = Qt::lightGray;
+ m_colors["magenta"] = Qt::magenta;
+ m_colors["red"] = Qt::red;
+ m_colors["white"] = Qt::white;
+ m_colors["yellow"] = Qt::yellow;
+ }
+
+ populate();
+}
+
+void MainForm::populate()
+{
+ if ( m_table_dirty ) {
+ for ( int r = 0; r < colorTable->numRows(); ++r ) {
+ for ( int c = 0; c < colorTable->numCols(); ++c ) {
+ colorTable->clearCell( r, c );
+ }
+ }
+
+ colorTable->setNumRows( m_colors.count() );
+ if ( ! m_colors.isEmpty() ) {
+ QPixmap pixmap( 22, 22 );
+ int row = 0;
+ QMap<QString,QColor>::ConstIterator it;
+ for ( it = m_colors.constBegin(); it != m_colors.constEnd(); ++it ) {
+ QColor color = it.data();
+ pixmap.fill( color );
+ colorTable->setText( row, COL_NAME, it.key() );
+ colorTable->setPixmap( row, COL_NAME, pixmap );
+ colorTable->setText( row, COL_HEX, color.name().upper() );
+ if ( m_show_web ) {
+ QCheckTableItem *item = new QCheckTableItem( colorTable, "" );
+ item->setChecked( isWebColor( color ) );
+ colorTable->setItem( row, COL_WEB, item );
+ }
+ row++;
+ }
+ colorTable->setCurrentCell( 0, 0 );
+ }
+ colorTable->adjustColumn( COL_NAME );
+ colorTable->adjustColumn( COL_HEX );
+ if ( m_show_web ) {
+ colorTable->showColumn( COL_WEB );
+ colorTable->adjustColumn( COL_WEB );
+ }
+ else
+ colorTable->hideColumn( COL_WEB );
+ m_table_dirty = FALSE;
+ }
+
+ if ( m_icons_dirty ) {
+ colorIconView->clear();
+
+ QMap<QString,QColor>::ConstIterator it;
+ for ( it = m_colors.constBegin(); it != m_colors.constEnd(); ++it )
+ (void) new QIconViewItem( colorIconView, it.key(),
+ colorSwatch( it.data() ) );
+ m_icons_dirty = FALSE;
+ }
+}
+
+QPixmap MainForm::colorSwatch( const QColor color )
+{
+ QPixmap pixmap( 80, 80 );
+ pixmap.fill( white );
+ QPainter painter;
+ painter.begin( &pixmap );
+ painter.setPen( NoPen );
+ painter.setBrush( color );
+ painter.drawEllipse( 0, 0, 80, 80 );
+ painter.end();
+ return pixmap;
+}
+
+void MainForm::fileNew()
+{
+ if ( okToClear() ) {
+ m_filename = "";
+ m_changed = FALSE;
+ m_table_dirty = TRUE;
+ m_icons_dirty = TRUE;
+ clearData( FALSE );
+ }
+}
+
+void MainForm::fileOpen()
+{
+ if ( ! okToClear() )
+ return;
+
+ QString filename = QFileDialog::getOpenFileName(
+ QString::null, "Colors (*.txt)", this,
+ "file open", "Color Tool -- File Open" );
+ if ( ! filename.isEmpty() )
+ load( filename );
+ else
+ statusBar()->message( "File Open abandoned", 2000 );
+}
+
+void MainForm::fileSave()
+{
+ if ( m_filename.isEmpty() ) {
+ fileSaveAs();
+ return;
+ }
+
+ QFile file( m_filename );
+ if ( file.open( IO_WriteOnly ) ) {
+ QTextStream stream( &file );
+ if ( ! m_comments.isEmpty() )
+ stream << m_comments.join( "\n" ) << "\n";
+ QMap<QString,QColor>::ConstIterator it;
+ for ( it = m_colors.constBegin(); it != m_colors.constEnd(); ++it ) {
+ QColor color = it.data();
+ stream << QString( "%1 %2 %3\t\t%4" ).
+ arg( color.red(), 3 ).
+ arg( color.green(), 3 ).
+ arg( color.blue(), 3 ).
+ arg( it.key() ) << "\n";
+ }
+ file.close();
+ setCaption( QString( "Color Tool -- %1" ).arg( m_filename ) );
+ statusBar()->message( QString( "Saved %1 colors to '%2'" ).
+ arg( m_colors.count() ).
+ arg( m_filename ), 3000 );
+ m_changed = FALSE;
+ }
+ else
+ statusBar()->message( QString( "Failed to save '%1'" ).
+ arg( m_filename ), 3000 );
+
+}
+
+void MainForm::fileSaveAs()
+{
+ QString filename = QFileDialog::getSaveFileName(
+ QString::null, "Colors (*.txt)", this,
+ "file save as", "Color Tool -- File Save As" );
+ if ( ! filename.isEmpty() ) {
+ int ans = 0;
+ if ( QFile::exists( filename ) )
+ ans = QMessageBox::warning(
+ this, "Color Tool -- Overwrite File",
+ QString( "Overwrite\n'%1'?" ).
+ arg( filename ),
+ "&Yes", "&No", QString::null, 1, 1 );
+ if ( ans == 0 ) {
+ m_filename = filename;
+ fileSave();
+ return;
+ }
+ }
+ statusBar()->message( "Saving abandoned", 2000 );
+}
+
+void MainForm::load( const QString& filename )
+{
+ clearData( FALSE );
+ m_filename = filename;
+ QRegExp regex( "^\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\S+.*)$" );
+ QFile file( filename );
+ if ( file.open( IO_ReadOnly ) ) {
+ statusBar()->message( QString( "Loading '%1'..." ).
+ arg( filename ) );
+ QTextStream stream( &file );
+ QString line;
+ while ( ! stream.eof() ) {
+ line = stream.readLine();
+ if ( regex.search( line ) == -1 )
+ m_comments += line;
+ else
+ m_colors[regex.cap( 4 )] = QColor(
+ regex.cap( 1 ).toInt(),
+ regex.cap( 2 ).toInt(),
+ regex.cap( 3 ).toInt() );
+ }
+ file.close();
+ m_filename = filename;
+ setCaption( QString( "Color Tool -- %1" ).arg( m_filename ) );
+ statusBar()->message( QString( "Loaded '%1'" ).
+ arg( m_filename ), 3000 );
+ QWidget *visible = colorWidgetStack->visibleWidget();
+ m_icons_dirty = ! ( m_table_dirty = ( visible == tablePage ) );
+ populate();
+ m_icons_dirty = ! ( m_table_dirty = ( visible != tablePage ) );
+ m_changed = FALSE;
+ }
+ else
+ statusBar()->message( QString( "Failed to load '%1'" ).
+ arg( m_filename ), 3000 );
+}
+
+
+bool MainForm::okToClear()
+{
+ if ( m_changed ) {
+ QString msg;
+ if ( m_filename.isEmpty() )
+ msg = "Unnamed colors ";
+ else
+ msg = QString( "Colors '%1'\n" ).arg( m_filename );
+ msg += QString( "has been changed." );
+ int ans = QMessageBox::information(
+ this,
+ "Color Tool -- Unsaved Changes",
+ msg, "&Save", "Cancel", "&Abandon",
+ 0, 1 );
+ if ( ans == 0 )
+ fileSave();
+ else if ( ans == 1 )
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void MainForm::closeEvent( QCloseEvent * )
+{
+ fileExit();
+}
+
+void MainForm::fileExit()
+{
+ if ( okToClear() ) {
+ saveSettings();
+ QApplication::exit( 0 );
+ }
+}
+
+void MainForm::editCut()
+{
+ QString name;
+ QWidget *visible = colorWidgetStack->visibleWidget();
+ statusBar()->message( QString( "Deleting '%1'" ).arg( name ) );
+
+ if ( visible == tablePage && colorTable->numRows() ) {
+ int row = colorTable->currentRow();
+ name = colorTable->text( row, 0 );
+ colorTable->removeRow( colorTable->currentRow() );
+ if ( row < colorTable->numRows() )
+ colorTable->setCurrentCell( row, 0 );
+ else if ( colorTable->numRows() )
+ colorTable->setCurrentCell( colorTable->numRows() - 1, 0 );
+ m_icons_dirty = TRUE;
+ }
+ else if ( visible == iconsPage && colorIconView->currentItem() ) {
+ QIconViewItem *item = colorIconView->currentItem();
+ name = item->text();
+ if ( colorIconView->count() == 1 )
+ colorIconView->clear();
+ else {
+ QIconViewItem *current = item->nextItem();
+ if ( ! current )
+ current = item->prevItem();
+ delete item;
+ if ( current )
+ colorIconView->setCurrentItem( current );
+ colorIconView->arrangeItemsInGrid();
+ }
+ m_table_dirty = TRUE;
+ }
+
+ if ( ! name.isNull() ) {
+ m_colors.remove( name );
+ m_changed = TRUE;
+ statusBar()->message( QString( "Deleted '%1'" ).arg( name ), 5000 );
+ }
+ else
+ statusBar()->message( QString( "Failed to delete '%1'" ).arg( name ), 5000 );
+}
+
+void MainForm::editCopy()
+{
+ QString text;
+ QWidget *visible = colorWidgetStack->visibleWidget();
+
+ if ( visible == tablePage && colorTable->numRows() ) {
+ int row = colorTable->currentRow();
+ text = colorTable->text( row, 0 );
+ }
+ else if ( visible == iconsPage && colorIconView->currentItem() ) {
+ QIconViewItem *item = colorIconView->currentItem();
+ text = item->text();
+ }
+ if ( ! text.isNull() ) {
+ QColor color = m_colors[text];
+ switch ( m_clip_as ) {
+ case CLIP_AS_HEX: text = color.name(); break;
+ case CLIP_AS_NAME: break;
+ case CLIP_AS_RGB:
+ text = QString( "%1,%2,%3" ).
+ arg( color.red() ).
+ arg( color.green() ).
+ arg( color.blue() );
+ break;
+ }
+ clipboard->setText( text );
+ statusBar()->message( "Copied '" + text + "' to the clipboard" );
+ }
+}
+
+void MainForm::editFind()
+{
+ if ( ! findForm ) {
+ findForm = new FindForm( this );
+ connect( findForm, SIGNAL( lookfor(const QString&) ),
+ this, SLOT( lookfor(const QString&) ) );
+ }
+ findForm->show();
+}
+
+void MainForm::lookfor( const QString& text )
+{
+ if ( text.isEmpty() )
+ return;
+ QString ltext = text.lower();
+ QWidget *visible = colorWidgetStack->visibleWidget();
+ bool found = FALSE;
+
+ if ( visible == tablePage && colorTable->numRows() ) {
+ int row = colorTable->currentRow();
+ for ( int i = row + 1; i < colorTable->numRows(); ++i )
+ if ( colorTable->text( i, 0 ).lower().contains( ltext ) ) {
+ colorTable->setCurrentCell( i, 0 );
+ colorTable->clearSelection();
+ colorTable->selectRow( i );
+ found = TRUE;
+ break;
+ }
+ if ( ! found )
+ colorTable->setCurrentCell( row, 0 );
+
+ }
+ else if ( visible == iconsPage ) {
+ QIconViewItem *start = colorIconView->currentItem();
+ for ( QIconViewItem *item = start->nextItem(); item; item = item->nextItem() )
+ if ( item->text().lower().contains( ltext ) ) {
+ colorIconView->setCurrentItem( item );
+ colorIconView->ensureItemVisible( item );
+ found = TRUE;
+ break;
+ }
+ if ( ! found && start )
+ colorIconView->setCurrentItem( start );
+ }
+ if ( ! found ) {
+ statusBar()->message( QString( "Could not find '%1' after here" ).
+ arg( text ) );
+ findForm->notfound();
+ }
+}
+
+
+
+void MainForm::helpIndex()
+{
+
+}
+
+void MainForm::helpContents()
+{
+
+}
+
+void MainForm::helpAbout()
+{
+
+}
+
+
+void MainForm::changedTableColor( int row, int )
+{
+ changedColor( colorTable->text( row, COL_NAME ) );
+}
+
+void MainForm::changedIconColor( QIconViewItem *item )
+{
+ changedColor( item->text() );
+}
+
+void MainForm::changedColor( const QString& name )
+{
+ QColor color = m_colors[name];
+ int r = color.red();
+ int g = color.green();
+ int b = color.blue();
+ statusBar()->message( QString( "%1 \"%2\" (%3,%4,%5)%6 {%7 %8 %9}" ).
+ arg( name ).
+ arg( color.name().upper() ).
+ arg( r ).arg( g ).arg( b ).
+ arg( isWebColor( color ) ? " web" : "" ).
+ arg( r / 255.0, 1, 'f', 3 ).
+ arg( g / 255.0, 1, 'f', 3 ).
+ arg( b / 255.0, 1, 'f', 3 )
+ );
+}
+
+
+void MainForm::changeView(QAction* action)
+{
+ if ( action == viewTableAction )
+ colorWidgetStack->raiseWidget( tablePage );
+ else
+ colorWidgetStack->raiseWidget( iconsPage );
+}
+
+bool MainForm::isWebColor( QColor color )
+{
+ int r = color.red();
+ int g = color.green();
+ int b = color.blue();
+
+ return ( ( r == 0 || r == 51 || r == 102 ||
+ r == 153 || r == 204 || r == 255 ) &&
+ ( g == 0 || g == 51 || g == 102 ||
+ g == 153 || g == 204 || g == 255 ) &&
+ ( b == 0 || b == 51 || b == 102 ||
+ b == 153 || b == 204 || b == 255 ) );
+}
+
+
+void MainForm::editAdd()
+{
+ QColor color = white;
+ if ( ! m_colors.isEmpty() ) {
+ QWidget *visible = colorWidgetStack->visibleWidget();
+ if ( visible == tablePage )
+ color = colorTable->text( colorTable->currentRow(),
+ colorTable->currentColumn() );
+ else
+ color = colorIconView->currentItem()->text();
+ }
+ color = QColorDialog::getColor( color, this );
+ if ( color.isValid() ) {
+ QPixmap pixmap( 80, 10 );
+ pixmap.fill( color );
+ ColorNameForm *colorForm = new ColorNameForm( this, "color", TRUE );
+ colorForm->setColors( m_colors );
+ colorForm->colorLabel->setPixmap( pixmap );
+ if ( colorForm->exec() ) {
+ QString name = colorForm->colorLineEdit->text();
+ m_colors[name] = color;
+ QPixmap pixmap( 22, 22 );
+ pixmap.fill( color );
+ int row = colorTable->currentRow();
+ colorTable->insertRows( row, 1 );
+ colorTable->setText( row, COL_NAME, name );
+ colorTable->setPixmap( row, COL_NAME, pixmap );
+ colorTable->setText( row, COL_HEX, color.name().upper() );
+ if ( m_show_web ) {
+ QCheckTableItem *item = new QCheckTableItem( colorTable, "" );
+ item->setChecked( isWebColor( color ) );
+ colorTable->setItem( row, COL_WEB, item );
+ }
+ colorTable->setCurrentCell( row, 0 );
+
+ (void) new QIconViewItem( colorIconView, name,
+ colorSwatch( color ) );
+ m_changed = TRUE;
+ }
+ }
+}
+
+void MainForm::editOptions()
+{
+ OptionsForm *options = new OptionsForm( this, "options", TRUE );
+ switch ( m_clip_as ) {
+ case CLIP_AS_HEX:
+ options->hexRadioButton->setChecked( TRUE );
+ break;
+ case CLIP_AS_NAME:
+ options->nameRadioButton->setChecked( TRUE );
+ break;
+ case CLIP_AS_RGB:
+ options->rgbRadioButton->setChecked( TRUE );
+ break;
+ }
+ options->webCheckBox->setChecked( m_show_web );
+
+ if ( options->exec() ) {
+ if ( options->hexRadioButton->isChecked() )
+ m_clip_as = CLIP_AS_HEX;
+ else if ( options->nameRadioButton->isChecked() )
+ m_clip_as = CLIP_AS_NAME;
+ else if ( options->rgbRadioButton->isChecked() )
+ m_clip_as = CLIP_AS_RGB;
+ m_table_dirty = m_show_web !=
+ options->webCheckBox->isChecked();
+ m_show_web = options->webCheckBox->isChecked();
+
+ populate();
+ }
+}
+
+void MainForm::loadSettings()
+{
+ QSettings settings;
+ settings.insertSearchPath( QSettings::Windows, WINDOWS_REGISTRY );
+ int windowWidth = settings.readNumEntry( APP_KEY + "WindowWidth", 550 );
+ int windowHeight = settings.readNumEntry( APP_KEY + "WindowHeight", 500 );
+ int windowX = settings.readNumEntry( APP_KEY + "WindowX", 0 );
+ int windowY = settings.readNumEntry( APP_KEY + "WindowY", 0 );
+ m_clip_as = settings.readNumEntry( APP_KEY + "ClipAs", CLIP_AS_HEX );
+ m_show_web = settings.readBoolEntry( APP_KEY + "ShowWeb", TRUE );
+ if ( ! settings.readBoolEntry( APP_KEY + "View", TRUE ) ) {
+ colorWidgetStack->raiseWidget( iconsPage );
+ viewIconsAction->setOn( TRUE );
+ }
+
+ resize( windowWidth, windowHeight );
+ move( windowX, windowY );
+}
+
+void MainForm::saveSettings()
+{
+ QSettings settings;
+ settings.insertSearchPath( QSettings::Windows, WINDOWS_REGISTRY );
+ settings.writeEntry( APP_KEY + "WindowWidth", width() );
+ settings.writeEntry( APP_KEY + "WindowHeight", height() );
+ settings.writeEntry( APP_KEY + "WindowX", x() );
+ settings.writeEntry( APP_KEY + "WindowY", y() );
+ settings.writeEntry( APP_KEY + "ClipAs", m_clip_as );
+ settings.writeEntry( APP_KEY + "ShowWeb", m_show_web );
+ settings.writeEntry( APP_KEY + "View",
+ colorWidgetStack->visibleWidget() == tablePage );
+}
+
+
+void MainForm::aboutToShow()
+{
+ populate();
+}
diff --git a/tools/designer/examples/colortool/optionsform.ui b/tools/designer/examples/colortool/optionsform.ui
new file mode 100644
index 0000000..96d74dc
--- /dev/null
+++ b/tools/designer/examples/colortool/optionsform.ui
@@ -0,0 +1,153 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>OptionsForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>OptionsForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>306</width>
+ <height>226</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Color Tool -- Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Table View</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>webCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Indicate &amp;Web Colors</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Copy to Clipboard As</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>hexRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Hex, e.g. #AB347F</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>nameRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Name, e.g. light blue</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rgbRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;RGB, e.g. 51,255,102</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>10</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>OptionsForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>OptionsForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">optionsform.ui.h</include>
+</includes>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/examples/colortool/optionsform.ui.h b/tools/designer/examples/colortool/optionsform.ui.h
new file mode 100644
index 0000000..f17a035
--- /dev/null
+++ b/tools/designer/examples/colortool/optionsform.ui.h
@@ -0,0 +1,7 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions use Qt Designer which will
+** update this file, preserving your code. Create an init() function in place
+** of a constructor, and a destroy() function in place of a destructor.
+*****************************************************************************/
diff --git a/tools/designer/examples/credit/credit.pro b/tools/designer/examples/credit/credit.pro
new file mode 100644
index 0000000..4dc246d
--- /dev/null
+++ b/tools/designer/examples/credit/credit.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+LANGUAGE = C++
+TARGET = credit
+
+SOURCES += main.cpp
+HEADERS += creditform.h
+SOURCES += creditform.cpp
+FORMS = creditformbase.ui
+CONFIG += qt warn_on release
+DBFILE = credit.db
+IMAGEFILE = images.cpp
diff --git a/tools/designer/examples/credit/creditform.cpp b/tools/designer/examples/credit/creditform.cpp
new file mode 100644
index 0000000..e49fafb
--- /dev/null
+++ b/tools/designer/examples/credit/creditform.cpp
@@ -0,0 +1,20 @@
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include "creditform.h"
+
+CreditForm::CreditForm( QWidget* parent, const char* name,
+ bool modal, WFlags fl )
+ : CreditFormBase( parent, name, modal, fl )
+{
+ setAmount();
+}
+
+CreditForm::~CreditForm() { /* NOOP */ }
+
+void CreditForm::setAmount()
+{
+ if ( stdRadioButton->isChecked() )
+ amountSpinBox->setValue( amountSpinBox->maxValue() / 2 );
+ else if ( noneRadioButton->isChecked() )
+ amountSpinBox->setValue( amountSpinBox->minValue() );
+}
diff --git a/tools/designer/examples/credit/creditform.h b/tools/designer/examples/credit/creditform.h
new file mode 100644
index 0000000..ffcec14
--- /dev/null
+++ b/tools/designer/examples/credit/creditform.h
@@ -0,0 +1,12 @@
+#include "creditformbase.h"
+
+class CreditForm : public CreditFormBase
+{
+ Q_OBJECT
+public:
+ CreditForm( QWidget* parent = 0, const char* name = 0,
+ bool modal = FALSE, WFlags fl = 0 );
+ ~CreditForm();
+public slots:
+ void setAmount();
+};
diff --git a/tools/designer/examples/credit/creditformbase.cpp b/tools/designer/examples/credit/creditformbase.cpp
new file mode 100644
index 0000000..46d5adc
--- /dev/null
+++ b/tools/designer/examples/credit/creditformbase.cpp
@@ -0,0 +1,122 @@
+/****************************************************************************
+** Form implementation generated from reading ui file 'creditformbase.ui'
+**
+** Created: Fri Aug 10 09:48:16 2001
+** by: The User Interface Compiler (uic)
+**
+** WARNING! All changes made in this file will be lost!
+****************************************************************************/
+#include "creditformbase.h"
+
+#include <qvariant.h> // first for gcc 2.7.2
+#include <qbuttongroup.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <qmime.h>
+#include <qdragobject.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include "creditformbase.ui.h"
+#include <qimage.h>
+#include <qpixmap.h>
+
+static QPixmap uic_load_pixmap_CreditFormBase( const QString &name )
+{
+ const QMimeSource *m = QMimeSourceFactory::defaultFactory()->data( name );
+ if ( !m )
+ return QPixmap();
+ QPixmap pix;
+ QImageDrag::decode( m, pix );
+ return pix;
+}
+/*
+ * Constructs a CreditFormBase which is a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'.
+ *
+ * The dialog will by default be modeless, unless you set 'modal' to
+ * TRUE to construct a modal dialog.
+ */
+CreditFormBase::CreditFormBase( QWidget* parent, const char* name, bool modal, WFlags fl )
+ : QDialog( parent, name, modal, fl )
+{
+ if ( !name )
+ setName( "CreditFormBase" );
+ resize( 276, 224 );
+ setCaption( trUtf8( "Credit Rating", "" ) );
+ CreditFormBaseLayout = new QVBoxLayout( this );
+ CreditFormBaseLayout->setSpacing( 6 );
+ CreditFormBaseLayout->setMargin( 11 );
+
+ creditButtonGroup = new QButtonGroup( this, "creditButtonGroup" );
+ creditButtonGroup->setTitle( trUtf8( "Credit Rating", "" ) );
+ creditButtonGroup->setColumnLayout(0, Qt::Vertical );
+ creditButtonGroup->layout()->setSpacing( 0 );
+ creditButtonGroup->layout()->setMargin( 0 );
+ creditButtonGroupLayout = new QVBoxLayout( creditButtonGroup->layout() );
+ creditButtonGroupLayout->setAlignment( Qt::AlignTop );
+ creditButtonGroupLayout->setSpacing( 6 );
+ creditButtonGroupLayout->setMargin( 11 );
+
+ stdRadioButton = new QRadioButton( creditButtonGroup, "stdRadioButton" );
+ stdRadioButton->setText( trUtf8( "&Standard", "" ) );
+ stdRadioButton->setChecked( TRUE );
+ creditButtonGroupLayout->addWidget( stdRadioButton );
+
+ noneRadioButton = new QRadioButton( creditButtonGroup, "noneRadioButton" );
+ noneRadioButton->setText( trUtf8( "&None", "" ) );
+ creditButtonGroupLayout->addWidget( noneRadioButton );
+
+ specialRadioButton = new QRadioButton( creditButtonGroup, "specialRadioButton" );
+ specialRadioButton->setText( trUtf8( "Sp&ecial", "" ) );
+ creditButtonGroupLayout->addWidget( specialRadioButton );
+ CreditFormBaseLayout->addWidget( creditButtonGroup );
+
+ amountSpinBox = new QSpinBox( this, "amountSpinBox" );
+ amountSpinBox->setEnabled( FALSE );
+ amountSpinBox->setPrefix( trUtf8( "$ ", "" ) );
+ amountSpinBox->setButtonSymbols( QSpinBox::UpDownArrows );
+ amountSpinBox->setMaxValue( 100000 );
+ amountSpinBox->setLineStep( 10000 );
+ CreditFormBaseLayout->addWidget( amountSpinBox );
+
+ Layout4 = new QHBoxLayout;
+ Layout4->setSpacing( 6 );
+ Layout4->setMargin( 0 );
+ QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
+ Layout4->addItem( spacer );
+
+ okPushButton = new QPushButton( this, "okPushButton" );
+ okPushButton->setText( trUtf8( "OK", "" ) );
+ okPushButton->setDefault( TRUE );
+ Layout4->addWidget( okPushButton );
+ QSpacerItem* spacer_2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
+ Layout4->addItem( spacer_2 );
+
+ cancelPushButton = new QPushButton( this, "cancelPushButton" );
+ cancelPushButton->setText( trUtf8( "Cancel", "" ) );
+ Layout4->addWidget( cancelPushButton );
+ QSpacerItem* spacer_3 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
+ Layout4->addItem( spacer_3 );
+ CreditFormBaseLayout->addLayout( Layout4 );
+
+
+
+
+
+ // signals and slots connections
+ connect( okPushButton, SIGNAL( clicked() ), this, SLOT( accept() ) );
+ connect( cancelPushButton, SIGNAL( clicked() ), this, SLOT( reject() ) );
+ connect( creditButtonGroup, SIGNAL( clicked(int) ), this, SLOT( setAmount() ) );
+ connect( specialRadioButton, SIGNAL( toggled(bool) ), amountSpinBox, SLOT( setEnabled(bool) ) );
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+CreditFormBase::~CreditFormBase()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
diff --git a/tools/designer/examples/credit/creditformbase.h b/tools/designer/examples/credit/creditformbase.h
new file mode 100644
index 0000000..6d5e934
--- /dev/null
+++ b/tools/designer/examples/credit/creditformbase.h
@@ -0,0 +1,48 @@
+/****************************************************************************
+** Form interface generated from reading ui file 'creditformbase.ui'
+**
+** Created: Fri Aug 10 09:48:10 2001
+** by: The User Interface Compiler (uic)
+**
+** WARNING! All changes made in this file will be lost!
+****************************************************************************/
+#ifndef CREDITFORMBASE_H
+#define CREDITFORMBASE_H
+
+#include <qvariant.h>
+#include <qdialog.h>
+class QVBoxLayout;
+class QHBoxLayout;
+class QGridLayout;
+class QButtonGroup;
+class QPushButton;
+class QRadioButton;
+class QSpinBox;
+
+class CreditFormBase : public QDialog
+{
+ Q_OBJECT
+
+public:
+ CreditFormBase( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~CreditFormBase();
+
+ QButtonGroup* creditButtonGroup;
+ QRadioButton* stdRadioButton;
+ QRadioButton* noneRadioButton;
+ QRadioButton* specialRadioButton;
+ QSpinBox* amountSpinBox;
+ QPushButton* okPushButton;
+ QPushButton* cancelPushButton;
+
+
+public slots:
+ virtual void setAmount();
+
+protected:
+ QVBoxLayout* CreditFormBaseLayout;
+ QVBoxLayout* creditButtonGroupLayout;
+ QHBoxLayout* Layout4;
+};
+
+#endif // CREDITFORMBASE_H
diff --git a/tools/designer/examples/credit/creditformbase.ui b/tools/designer/examples/credit/creditformbase.ui
new file mode 100644
index 0000000..4421885
--- /dev/null
+++ b/tools/designer/examples/credit/creditformbase.ui
@@ -0,0 +1,212 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>CreditFormBase</class>
+<include location="local" implDecl="in declaration">creditformbase.ui.h</include>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CreditFormBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>276</width>
+ <height>224</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Credit Rating</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>creditButtonGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Credit Rating</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>stdRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Standard</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>noneRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;None</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>specialRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>Sp&amp;ecial</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>amountSpinBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="prefix">
+ <string>$ </string>
+ </property>
+ <property name="buttonSymbols">
+ <enum>UpDownArrows</enum>
+ </property>
+ <property name="maxValue">
+ <number>100000</number>
+ </property>
+ <property name="lineStep">
+ <number>10000</number>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>CreditFormBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>CreditFormBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>creditButtonGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>CreditFormBase</receiver>
+ <slot>setAmount()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>specialRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>amountSpinBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">setAmount()</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/credit/creditformbase.ui.h b/tools/designer/examples/credit/creditformbase.ui.h
new file mode 100644
index 0000000..6cf4faa
--- /dev/null
+++ b/tools/designer/examples/credit/creditformbase.ui.h
@@ -0,0 +1,5 @@
+void CreditFormBase::setAmount()
+{
+
+}
+
diff --git a/tools/designer/examples/credit/main.cpp b/tools/designer/examples/credit/main.cpp
new file mode 100644
index 0000000..dde1daa
--- /dev/null
+++ b/tools/designer/examples/credit/main.cpp
@@ -0,0 +1,25 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "creditform.h"
+
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ CreditForm creditForm;
+ app.setMainWidget( &creditForm );
+ creditForm.show();
+
+ return app.exec();
+}
+
+
diff --git a/tools/designer/examples/filechooser/plugin/plugin.cpp b/tools/designer/examples/filechooser/plugin/plugin.cpp
new file mode 100644
index 0000000..9408cac
--- /dev/null
+++ b/tools/designer/examples/filechooser/plugin/plugin.cpp
@@ -0,0 +1,95 @@
+#include "plugin.h"
+#include "../widget/filechooser.h"
+
+static const char *filechooser_pixmap[] = {
+ "22 22 8 1",
+ " c Gray100",
+ ". c Gray97",
+ "X c #4f504f",
+ "o c #00007f",
+ "O c Gray0",
+ "+ c none",
+ "@ c Gray0",
+ "# c Gray0",
+ "++++++++++++++++++++++",
+ "++++++++++++++++++++++",
+ "++++++++++++++++++++++",
+ "++++++++++++++++++++++",
+ "+OOOOOOOOOOOOOOOOOOOO+",
+ "OOXXXXXXXXXXXXXXXXXXOO",
+ "OXX. OO OO O",
+ "OX. oo O O",
+ "OX. oo O .O",
+ "OX ooo oooo O O",
+ "OX oo oo oo O O",
+ "OX oooo oo oo O O",
+ "OX oo oo oo oo O O",
+ "OX oo oo oo oo O O",
+ "OX oooo oooo O O",
+ "OX OO OO O",
+ "OO..................OO",
+ "+OOOOOOOOOOOOOOOOOOOO+",
+ "++++++++++++++++++++++",
+ "++++++++++++++++++++++",
+ "++++++++++++++++++++++",
+ "++++++++++++++++++++++"
+};
+
+CustomWidgetPlugin::CustomWidgetPlugin()
+{
+}
+
+QStringList CustomWidgetPlugin::keys() const
+{
+ QStringList list;
+ list << "FileChooser";
+ return list;
+}
+
+QWidget* CustomWidgetPlugin::create( const QString &key, QWidget* parent, const char* name )
+{
+ if ( key == "FileChooser" )
+ return new FileChooser( parent, name );
+ return 0;
+}
+
+QString CustomWidgetPlugin::group( const QString& feature ) const
+{
+ if ( feature == "FileChooser" )
+ return "Input";
+ return QString::null;
+}
+
+QIconSet CustomWidgetPlugin::iconSet( const QString& ) const
+{
+ return QIconSet( QPixmap( filechooser_pixmap ) );
+}
+
+QString CustomWidgetPlugin::includeFile( const QString& feature ) const
+{
+ if ( feature == "FileChooser" )
+ return "filechooser.h";
+ return QString::null;
+}
+
+QString CustomWidgetPlugin::toolTip( const QString& feature ) const
+{
+ if ( feature == "FileChooser" )
+ return "File Chooser Widget";
+ return QString::null;
+}
+
+QString CustomWidgetPlugin::whatsThis( const QString& feature ) const
+{
+ if ( feature == "FileChooser" )
+ return "A widget to choose a file or directory";
+ return QString::null;
+}
+
+bool CustomWidgetPlugin::isContainer( const QString& ) const
+{
+ return FALSE;
+}
+
+
+Q_EXPORT_PLUGIN( CustomWidgetPlugin )
diff --git a/tools/designer/examples/filechooser/plugin/plugin.h b/tools/designer/examples/filechooser/plugin/plugin.h
new file mode 100644
index 0000000..a465c29
--- /dev/null
+++ b/tools/designer/examples/filechooser/plugin/plugin.h
@@ -0,0 +1,16 @@
+#include <qwidgetplugin.h>
+
+class CustomWidgetPlugin : public QWidgetPlugin
+{
+public:
+ CustomWidgetPlugin();
+
+ QStringList keys() const;
+ QWidget* create( const QString &classname, QWidget* parent = 0, const char* name = 0 );
+ QString group( const QString& ) const;
+ QIconSet iconSet( const QString& ) const;
+ QString includeFile( const QString& ) const;
+ QString toolTip( const QString& ) const;
+ QString whatsThis( const QString& ) const;
+ bool isContainer( const QString& ) const;
+};
diff --git a/tools/designer/examples/filechooser/plugin/plugin.pro b/tools/designer/examples/filechooser/plugin/plugin.pro
new file mode 100644
index 0000000..012f185
--- /dev/null
+++ b/tools/designer/examples/filechooser/plugin/plugin.pro
@@ -0,0 +1,14 @@
+TEMPLATE = lib
+LANGUAGE = C++
+TARGET = filechooser
+
+SOURCES += plugin.cpp ../widget/filechooser.cpp
+HEADERS += plugin.h ../widget/filechooser.h
+DESTDIR = ../../../../../plugins/designer
+
+target.path=$$plugins.path
+
+INSTALLS += target
+CONFIG += qt warn_on release plugin
+INCLUDEPATH += $$QT_SOURCE_TREE/tools/designer/interfaces
+DBFILE = plugin.db
diff --git a/tools/designer/examples/filechooser/widget/filechooser.cpp b/tools/designer/examples/filechooser/widget/filechooser.cpp
new file mode 100644
index 0000000..4575bd4
--- /dev/null
+++ b/tools/designer/examples/filechooser/widget/filechooser.cpp
@@ -0,0 +1,62 @@
+#include "filechooser.h"
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qfiledialog.h>
+#include <qlayout.h>
+
+FileChooser::FileChooser( QWidget *parent, const char *name )
+ : QWidget( parent, name ), md( File )
+{
+ QHBoxLayout *layout = new QHBoxLayout( this );
+ layout->setMargin( 0 );
+
+ lineEdit = new QLineEdit( this, "filechooser_lineedit" );
+ layout->addWidget( lineEdit );
+
+ connect( lineEdit, SIGNAL( textChanged( const QString & ) ),
+ this, SIGNAL( fileNameChanged( const QString & ) ) );
+
+ button = new QPushButton( "...", this, "filechooser_button" );
+ button->setFixedWidth( button->fontMetrics().width( " ... " ) );
+ layout->addWidget( button );
+
+ connect( button, SIGNAL( clicked() ),
+ this, SLOT( chooseFile() ) );
+
+ setFocusProxy( lineEdit );
+}
+
+void FileChooser::setMode( Mode m )
+{
+ md = m;
+}
+
+FileChooser::Mode FileChooser::mode() const
+{
+ return md;
+}
+
+void FileChooser::setFileName( const QString &fn )
+{
+ lineEdit->setText( fn );
+}
+
+QString FileChooser::fileName() const
+{
+ return lineEdit->text();
+}
+
+void FileChooser::chooseFile()
+{
+ QString fn;
+ if ( mode() == File )
+ fn = QFileDialog::getOpenFileName( lineEdit->text(), QString::null, this );
+ else
+ fn = QFileDialog::getExistingDirectory( lineEdit->text(),this );
+
+ if ( !fn.isEmpty() ) {
+ lineEdit->setText( fn );
+ emit fileNameChanged( fn );
+ }
+}
+
diff --git a/tools/designer/examples/filechooser/widget/filechooser.h b/tools/designer/examples/filechooser/widget/filechooser.h
new file mode 100644
index 0000000..23272c0
--- /dev/null
+++ b/tools/designer/examples/filechooser/widget/filechooser.h
@@ -0,0 +1,48 @@
+#ifndef FILECHOOSER_H
+#define FILECHOOSER_H
+
+#include <qwidget.h>
+#include <qwidgetplugin.h>
+
+class QLineEdit;
+class QPushButton;
+
+#ifdef FILECHOOSER_IS_WIDGET
+#undef QT_WIDGET_PLUGIN_EXPORT
+#define QT_WIDGET_PLUGIN_EXPORT
+#endif
+
+class QT_WIDGET_PLUGIN_EXPORT FileChooser : public QWidget
+{
+ Q_OBJECT
+
+ Q_ENUMS( Mode )
+ Q_PROPERTY( Mode mode READ mode WRITE setMode )
+ Q_PROPERTY( QString fileName READ fileName WRITE setFileName )
+
+public:
+ FileChooser( QWidget *parent = 0, const char *name = 0);
+
+ enum Mode { File, Directory };
+
+ QString fileName() const;
+ Mode mode() const;
+
+public slots:
+ void setFileName( const QString &fn );
+ void setMode( Mode m );
+
+signals:
+ void fileNameChanged( const QString & );
+
+private slots:
+ void chooseFile();
+
+private:
+ QLineEdit *lineEdit;
+ QPushButton *button;
+ Mode md;
+
+};
+
+#endif
diff --git a/tools/designer/examples/filechooser/widget/filechooser.pro b/tools/designer/examples/filechooser/widget/filechooser.pro
new file mode 100644
index 0000000..20ea787
--- /dev/null
+++ b/tools/designer/examples/filechooser/widget/filechooser.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+LANGUAGE = C++
+TARGET = filechooser
+
+SOURCES += filechooser.cpp main.cpp
+HEADERS += filechooser.h
+CONFIG += qt warn_on release
+DBFILE = filechooser.db
+DEFINES += FILECHOOSER_IS_WIDGET
diff --git a/tools/designer/examples/filechooser/widget/main.cpp b/tools/designer/examples/filechooser/widget/main.cpp
new file mode 100644
index 0000000..cc39053
--- /dev/null
+++ b/tools/designer/examples/filechooser/widget/main.cpp
@@ -0,0 +1,10 @@
+#include <qapplication.h>
+#include "filechooser.h"
+
+int main( int argc, char ** argv )
+{
+ QApplication a( argc, argv );
+ FileChooser *fc = new FileChooser;
+ fc->show();
+ return a.exec();
+}
diff --git a/tools/designer/examples/metric/main.cpp b/tools/designer/examples/metric/main.cpp
new file mode 100644
index 0000000..6490b58
--- /dev/null
+++ b/tools/designer/examples/metric/main.cpp
@@ -0,0 +1,12 @@
+#include <qapplication.h>
+#include "metric.h"
+
+int main( int argc, char ** argv )
+{
+ QApplication a( argc, argv );
+ ConversionForm *w = new ConversionForm;
+ w->show();
+ a.setMainWidget( w );
+ a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
+ return a.exec();
+}
diff --git a/tools/designer/examples/metric/metric.pro b/tools/designer/examples/metric/metric.pro
new file mode 100644
index 0000000..3dfc3fd
--- /dev/null
+++ b/tools/designer/examples/metric/metric.pro
@@ -0,0 +1,12 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+SOURCES += main.cpp
+unix {
+ UI_DIR = .ui
+ MOC_DIR = .moc
+ OBJECTS_DIR = .obj
+}
+FORMS = metric.ui
+CONFIG += qt warn_on release
+DBFILE = metric.db
diff --git a/tools/designer/examples/metric/metric.ui b/tools/designer/examples/metric/metric.ui
new file mode 100644
index 0000000..b0c9166
--- /dev/null
+++ b/tools/designer/examples/metric/metric.ui
@@ -0,0 +1,366 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ConversionForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ConversionForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>320</width>
+ <height>217</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Metric Conversion</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="4" column="1">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>decimalsSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>6</number>
+ </property>
+ <property name="value">
+ <number>3</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <item>
+ <property name="text">
+ <string>Kilometers</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Meters</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Centimeters</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Millimeters</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>fromComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Result:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Convert &amp;From:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fromComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Convert &amp;To:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>toComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Decimals:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>decimalsSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Enter &amp;Number:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>numberLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="1">
+ <property name="name">
+ <cstring>resultLineEdit</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>0</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>WinPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>numberLineEdit</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="alignment">
+ <set>AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <item>
+ <property name="text">
+ <string>Miles</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Yards</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Feet</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Inches</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>toComboBox</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>clearButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Clear</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>calculateButton</cstring>
+ </property>
+ <property name="text">
+ <string>Calculate</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer27</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>quitButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>clearButton</sender>
+ <signal>clicked()</signal>
+ <receiver>numberLineEdit</receiver>
+ <slot>clear()</slot>
+ </connection>
+ <connection>
+ <sender>quitButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ConversionForm</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>calculateButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ConversionForm</receiver>
+ <slot>convert()</slot>
+ </connection>
+ <connection>
+ <sender>clearButton</sender>
+ <signal>clicked()</signal>
+ <receiver>resultLineEdit</receiver>
+ <slot>clear()</slot>
+ </connection>
+ <connection>
+ <sender>decimalsSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>ConversionForm</receiver>
+ <slot>convert()</slot>
+ </connection>
+ <connection>
+ <sender>fromComboBox</sender>
+ <signal>activated(int)</signal>
+ <receiver>ConversionForm</receiver>
+ <slot>convert()</slot>
+ </connection>
+ <connection>
+ <sender>toComboBox</sender>
+ <signal>activated(int)</signal>
+ <receiver>ConversionForm</receiver>
+ <slot>convert()</slot>
+ </connection>
+ <connection>
+ <sender>clearButton</sender>
+ <signal>released()</signal>
+ <receiver>numberLineEdit</receiver>
+ <slot>setFocus()</slot>
+ </connection>
+ <connection>
+ <sender>calculateButton</sender>
+ <signal>clicked()</signal>
+ <receiver>numberLineEdit</receiver>
+ <slot>setFocus()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>numberLineEdit</tabstop>
+ <tabstop>fromComboBox</tabstop>
+ <tabstop>toComboBox</tabstop>
+ <tabstop>decimalsSpinBox</tabstop>
+ <tabstop>clearButton</tabstop>
+ <tabstop>calculateButton</tabstop>
+ <tabstop>quitButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">metric.ui.h</include>
+</includes>
+<slots>
+ <slot>convert()</slot>
+</slots>
+<functions>
+ <function access="private">init()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/examples/metric/metric.ui.h b/tools/designer/examples/metric/metric.ui.h
new file mode 100644
index 0000000..ba66022
--- /dev/null
+++ b/tools/designer/examples/metric/metric.ui.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions respectively slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+
+#include <qvalidator.h>
+
+void ConversionForm::init()
+{
+ numberLineEdit->setValidator( new QDoubleValidator( numberLineEdit ) );
+ numberLineEdit->setText( "10" );
+ convert();
+ numberLineEdit->selectAll();
+}
+
+void ConversionForm::convert()
+{
+ enum MetricUnits {
+ Kilometers,
+ Meters,
+ Centimeters,
+ Millimeters
+ };
+ enum OldUnits {
+ Miles,
+ Yards,
+ Feet,
+ Inches
+ };
+
+ // Retrieve the input
+ double input = numberLineEdit->text().toDouble();
+ double scaledInput = input;
+
+ // internally convert the input to millimeters
+ switch ( fromComboBox->currentItem() ) {
+ case Kilometers:
+ scaledInput *= 1000000;
+ break;
+ case Meters:
+ scaledInput *= 1000;
+ break;
+ case Centimeters:
+ scaledInput *= 10;
+ break;
+ }
+
+ //convert to inches
+ double result = scaledInput * 0.0393701;
+
+ switch ( toComboBox->currentItem() ) {
+ case Miles:
+ result /= 63360;
+ break;
+ case Yards:
+ result /= 36;
+ break;
+ case Feet:
+ result /= 12;
+ break;
+ }
+
+ // set the result
+ int decimals = decimalsSpinBox->value();
+ resultLineEdit->setText( QString::number( result, 'f', decimals ) );
+ numberLineEdit->setText( QString::number( input, 'f', decimals ) );
+}
+
diff --git a/tools/designer/examples/multiclip/main.cpp b/tools/designer/examples/multiclip/main.cpp
new file mode 100644
index 0000000..7f3aeb1
--- /dev/null
+++ b/tools/designer/examples/multiclip/main.cpp
@@ -0,0 +1,25 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "multiclip.h"
+
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ MulticlipForm clippingForm;
+ app.setMainWidget( &clippingForm );
+ clippingForm.show();
+
+ return app.exec();
+}
+
+
diff --git a/tools/designer/examples/multiclip/multiclip.pro b/tools/designer/examples/multiclip/multiclip.pro
new file mode 100644
index 0000000..f9391cb
--- /dev/null
+++ b/tools/designer/examples/multiclip/multiclip.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+LANGUAGE = C++
+TARGET = multiclip
+
+SOURCES += main.cpp
+FORMS = multiclip.ui
+CONFIG += qt warn_on release
+DBFILE = multiclip.db
+IMAGEFILE = images.cpp
diff --git a/tools/designer/examples/multiclip/multiclip.ui b/tools/designer/examples/multiclip/multiclip.ui
new file mode 100644
index 0000000..47bbd2f
--- /dev/null
+++ b/tools/designer/examples/multiclip/multiclip.ui
@@ -0,0 +1,206 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MulticlipForm</class>
+<include location="global" impldecl="in declaration">qclipboard.h</include>
+<include location="global" impldecl="in implementation">qapplication.h</include>
+<include location="local" implDecl="in declaration">multiclip.ui.h</include>
+<variable>QClipboard *cb;</variable>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>MulticlipForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>585</width>
+ <height>472</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Multiclip</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Current Clipping</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>currentLineEdit</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout19</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>addPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add Clipping</string>
+ </property>
+ </widget>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="7" column="1">
+ <property name="name">
+ <cstring>quitPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Length</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Previous Clippings</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="1">
+ <property name="name">
+ <cstring>autoCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>A&amp;uto Add Clippings</string>
+ </property>
+ </widget>
+ <widget class="QLCDNumber" row="1" column="1">
+ <property name="name">
+ <cstring>lengthLCDNumber</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="6" column="1">
+ <property name="name">
+ <cstring>deletePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Clipping</string>
+ </property>
+ </widget>
+ <widget class="QListBox" row="1" column="0" rowspan="7" colspan="1">
+ <property name="name">
+ <cstring>clippingsListBox</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="1">
+ <property name="name">
+ <cstring>copyPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Copy Previous</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>quitPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MulticlipForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>addPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MulticlipForm</receiver>
+ <slot>addClipping()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>copyPushButton</sender>
+ <signal>pressed()</signal>
+ <receiver>MulticlipForm</receiver>
+ <slot>copyPrevious()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>deletePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MulticlipForm</receiver>
+ <slot>deleteClipping()</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">addClipping()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">dataChanged()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">deleteClipping()</slot>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">init()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">selectionChanged()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">copyPrevious()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">clippingChanged( const QString &amp; clipping )</slot>
+</connections>
+<tabstops>
+ <tabstop>currentLineEdit</tabstop>
+ <tabstop>clippingsListBox</tabstop>
+ <tabstop>autoCheckBox</tabstop>
+ <tabstop>addPushButton</tabstop>
+ <tabstop>copyPushButton</tabstop>
+ <tabstop>deletePushButton</tabstop>
+ <tabstop>quitPushButton</tabstop>
+</tabstops>
+</UI>
diff --git a/tools/designer/examples/multiclip/multiclip.ui.h b/tools/designer/examples/multiclip/multiclip.ui.h
new file mode 100644
index 0000000..e4d7fc1
--- /dev/null
+++ b/tools/designer/examples/multiclip/multiclip.ui.h
@@ -0,0 +1,70 @@
+void MulticlipForm::addClipping()
+{
+ QString text = currentLineEdit->text();
+ if ( ! text.isEmpty() ) {
+ lengthLCDNumber->display( (int)text.length() );
+ int i = 0;
+ for ( ; i < (int)clippingsListBox->count(); i++ ) {
+ if ( clippingsListBox->text( i ) == text ) {
+ i = -1; // Do not add duplicates
+ break;
+ }
+ }
+ if ( i != -1 )
+ clippingsListBox->insertItem( text, 0 );
+ }
+}
+
+void MulticlipForm::dataChanged()
+{
+ QString text;
+ text = cb->text();
+ clippingChanged( text );
+ if ( autoCheckBox->isChecked() )
+ addClipping();
+}
+
+void MulticlipForm::deleteClipping()
+{
+ clippingChanged( "" );
+ clippingsListBox->removeItem( clippingsListBox->currentItem() );
+}
+
+void MulticlipForm::init()
+{
+ lengthLCDNumber->setBackgroundColor( darkBlue );
+ currentLineEdit->setFocus();
+
+ cb = qApp->clipboard();
+ connect( cb, SIGNAL( dataChanged() ), SLOT( dataChanged() ) );
+ if ( cb->supportsSelection() )
+ connect( cb, SIGNAL( selectionChanged() ), SLOT( selectionChanged() ) );
+
+ dataChanged();
+}
+
+void MulticlipForm::selectionChanged()
+{
+ cb->setSelectionMode( TRUE );
+ dataChanged();
+ cb->setSelectionMode( FALSE );
+}
+
+void MulticlipForm::copyPrevious()
+{
+ if ( clippingsListBox->currentItem() != -1 ) {
+ cb->setText( clippingsListBox->currentText() );
+ if ( cb->supportsSelection() ) {
+ cb->setSelectionMode( TRUE );
+ cb->setText( clippingsListBox->currentText() );
+ cb->setSelectionMode( FALSE );
+ }
+ }
+}
+
+void MulticlipForm::clippingChanged( const QString & clipping )
+{
+ currentLineEdit->setText( clipping );
+ lengthLCDNumber->display( (int)clipping.length() );
+}
+
diff --git a/tools/designer/examples/opengl/glwidget.cpp b/tools/designer/examples/opengl/glwidget.cpp
new file mode 100644
index 0000000..72692a3
--- /dev/null
+++ b/tools/designer/examples/opengl/glwidget.cpp
@@ -0,0 +1,170 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "glwidget.h"
+
+/*!
+ Create a GLWidget widget
+*/
+
+GLWidget::GLWidget( QWidget* parent, const char* name )
+ : QGLWidget( parent, name )
+{
+ xrot = yrot = zrot = 25; // default object rotation
+ scale_ = 1.25; // default object scale
+ object = 0;
+}
+
+/*!
+ Release allocated resources
+*/
+
+GLWidget::~GLWidget()
+{
+ glDeleteLists( object, 1 );
+}
+
+
+/*!
+ Paint the box. The actual openGL commands for drawing the box are
+ performed here.
+*/
+
+void GLWidget::paintGL()
+{
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -10.0 );
+ glScalef( scale_, scale_, scale_ );
+
+ glRotatef( xrot, 1.0, 0.0, 0.0 );
+ glRotatef( yrot, 0.0, 1.0, 0.0 );
+ glRotatef( zrot, 0.0, 0.0, 1.0 );
+
+ glCallList( object );
+}
+
+/*!
+ Set up the OpenGL rendering state, and define display list
+*/
+
+void GLWidget::initializeGL()
+{
+ qglClearColor( black ); // Let OpenGL clear to black
+ object = makeObject(); // Generate an OpenGL display list
+ glShadeModel( GL_FLAT );
+}
+
+
+
+/*!
+ Set up the OpenGL view port, matrix mode, etc.
+*/
+
+void GLWidget::resizeGL( int w, int h )
+{
+ glViewport( 0, 0, (GLint)w, (GLint)h );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
+ glMatrixMode( GL_MODELVIEW );
+}
+
+
+/*!
+ Generate an OpenGL display list for the object to be shown, i.e. the box
+*/
+
+GLuint GLWidget::makeObject()
+{
+ GLuint list;
+
+ list = glGenLists( 1 );
+
+ glNewList( list, GL_COMPILE );
+
+ qglColor( white ); // Shorthand for glColor3f or glIndex
+
+ glLineWidth( 2.0 );
+
+ glBegin( GL_LINE_LOOP );
+ glVertex3f( 1.0f, 0.5f, -0.4f );
+ glVertex3f( 1.0f, -0.5f, -0.4f );
+ glVertex3f( -1.0f, -0.5f, -0.4f );
+ glVertex3f( -1.0f, 0.5f, -0.4f );
+ glEnd();
+
+ glBegin( GL_LINE_LOOP );
+ glVertex3f( 1.0f, 0.5f, 0.4f );
+ glVertex3f( 1.0f, -0.5f, 0.4f );
+ glVertex3f( -1.0f, -0.5f, 0.4f );
+ glVertex3f( -1.0f, 0.5f, 0.4f );
+ glEnd();
+
+ glBegin( GL_LINES );
+ glVertex3f( 1.0f, 0.5f, -0.4f ); glVertex3f( 1.0f, 0.5f, 0.4f );
+ glVertex3f( 1.0f, -0.5f, -0.4f ); glVertex3f( 1.0f, -0.5f, 0.4f );
+ glVertex3f( -1.0f, -0.5f, -0.4f ); glVertex3f( -1.0f, -0.5f, 0.4f );
+ glVertex3f( -1.0f, 0.5f, -0.4f ); glVertex3f( -1.0f, 0.5f, 0.4f );
+ glEnd();
+
+ glEndList();
+
+ return list;
+}
+
+void GLWidget::setXRot( double x )
+{
+ xrot = x;
+ update();
+}
+
+void GLWidget::setYRot( double y )
+{
+ yrot = y;
+ update();
+}
+
+void GLWidget::setZRot( double z )
+{
+ zrot = z;
+ update();
+}
+
+void GLWidget::setScale( double s )
+{
+ scale_ = s;
+ update();
+}
diff --git a/tools/designer/examples/opengl/glwidget.h b/tools/designer/examples/opengl/glwidget.h
new file mode 100644
index 0000000..fd34d4a
--- /dev/null
+++ b/tools/designer/examples/opengl/glwidget.h
@@ -0,0 +1,75 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef GLWIDGET_H
+#define GLWIDGET_H
+
+#include <qgl.h>
+
+class GLWidget : public QGLWidget
+{
+ Q_OBJECT
+ Q_PROPERTY( double xRot READ xRot WRITE setXRot )
+ Q_PROPERTY( double yRot READ yRot WRITE setYRot )
+ Q_PROPERTY( double zRot READ zRot WRITE setZRot )
+ Q_PROPERTY( double scale READ scale WRITE setScale )
+
+public:
+ GLWidget( QWidget* parent, const char* name );
+ ~GLWidget();
+
+ double xRot() const { return xrot; }
+ double yRot() const { return yrot; }
+ double zRot() const { return zrot; }
+ double scale() const { return scale_; }
+
+public slots:
+ void setXRot( double );
+ void setYRot( double );
+ void setZRot( double );
+ void setScale( double );
+
+protected:
+ void initializeGL();
+ void paintGL();
+ void resizeGL( int w, int h );
+
+ virtual GLuint makeObject();
+
+private:
+ GLuint object;
+ GLfloat xrot, yrot, zrot, scale_;
+};
+
+#endif
diff --git a/tools/designer/examples/opengl/main.cpp b/tools/designer/examples/opengl/main.cpp
new file mode 100644
index 0000000..3b6bd29
--- /dev/null
+++ b/tools/designer/examples/opengl/main.cpp
@@ -0,0 +1,305 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <widgetinterface.h>
+
+#include <qobjectcleanuphandler.h>
+#include <qpixmap.h>
+
+#include "glwidget.h"
+
+/* XPM */
+static char * cube_xmp[] = {
+"48 48 104 2",
+" c None",
+". c #30C230C22081",
+"X c #30C230C230C2",
+"o c #30C2410330C2",
+"O c #410330C24103",
+"+ c #410341034103",
+"@ c #514451445144",
+"# c #514461855144",
+"$ c #618551446185",
+"% c #618561856185",
+"& c #71C671C671C6",
+"* c #71C6820771C6",
+"= c #965882078617",
+"- c #861792488617",
+"; c #965892489658",
+": c #9658A2899658",
+"> c #9E79A2899E79",
+", c #AEBAAEBA9E79",
+"< c #AEBAAEBAAEBA",
+"1 c #AEBABEFBAEBA",
+"2 c #BEFBBEFBBEFB",
+"3 c #CF3CBEFBCF3C",
+"4 c #CF3CCF3CCF3C",
+"5 c #DF7DCF3CCF3C",
+"6 c #DF7DDF7DCF3C",
+"7 c #DF7DDF7DDF7D",
+"8 c #EFBEDF7DDF7D",
+"9 c #DF7DEFBEDF7D",
+"0 c #EFBEDF7DEFBE",
+"q c #EFBEEFBEDF7D",
+"w c #208130C22081",
+"e c #410351445144",
+"r c #514451446185",
+"t c #71C6618571C6",
+"y c #861771C68617",
+"u c #9E7992489E79",
+"i c #9E79AEBA9E79",
+"p c #BEFBAEBABEFB",
+"a c #BEFBCF3CBEFB",
+"s c #BEFBCF3CCF3C",
+"d c #CF3CCF3CDF7D",
+"f c #CF3CDF7DCF3C",
+"g c #DF7DDF7DEFBE",
+"h c #208120812081",
+"j c #30C2208130C2",
+"k c #410330C230C2",
+"l c #4103410330C2",
+"z c #410351444103",
+"x c #618551445144",
+"c c #618561855144",
+"v c #618571C66185",
+"b c #861771C671C6",
+"n c #8617820771C6",
+"m c #965882079658",
+"M c #9E7992489658",
+"N c #AEBAA289AEBA",
+"B c #BEFBAEBAAEBA",
+"V c #DF7DCF3CDF7D",
+"C c #CF3CDF7DDF7D",
+"Z c #208120811040",
+"A c #965892488617",
+"S c #104020812081",
+"D c #861782078617",
+"F c #861792489658",
+"G c #965892489E79",
+"H c #104020811040",
+"J c #208110402081",
+"K c #30C220812081",
+"L c #BEFBBEFBCF3C",
+"P c #104010401040",
+"I c #208110401040",
+"U c #618571C671C6",
+"Y c #71C671C68617",
+"T c #71C682078617",
+"R c #CF3CBEFBBEFB",
+"E c #CF3CCF3CBEFB",
+"W c #000010401040",
+"Q c #104010402081",
+"! c #9E79AEBAAEBA",
+"~ c #104010400000",
+"^ c #AEBAA2899E79",
+"/ c #71C671C66185",
+"( c #000010400000",
+") c #000000000000",
+"_ c #104000001040",
+"` c #2081208130C2",
+"' c #9658A2899E79",
+"] c #104000000000",
+"[ c #000000001040",
+"{ c #30C241034103",
+"} c #9E79A289AEBA",
+"| c #AEBABEFBBEFB",
+" . c #514461856185",
+".. c #9E79A2899658",
+"X. c #71C661856185",
+"o. c #30C230C24103",
+"O. c #514441035144",
+"+. c #514451444103",
+"@. c #410341035144",
+"#. c #AEBAAEBABEFB",
+"$. c #208130C230C2",
+"%. c #6185618571C6",
+"&. c #514441034103",
+"*. c #861782079658",
+" . X o O + @ # $ % & * = - ; : > , < 1 2 2 3 4 5 6 7 7 8 9 0 q ",
+" w X X O + @ e r % t & y - ; : u i < < p a 3 s d f 7 7 g 9 0 9 ; ",
+" h j X k l + z x c t v b n m ; M > N < B 2 2 a 3 4 V 6 7 7 0 9 m ; ",
+" h h w X f d f d f V f V f 7 f 7 C 7 f V f V f d f V f 7 9 g 9 m ; ; ",
+" Z h w j - 4 4 5 4 5 4 5 4 V f V 6 V f V f V 4 5 4 5 4 V 7 7 7 m A ; ; ",
+" S h h j - D s 4 4 4 4 4 4 4 4 d f V f d f d 4 d 4 4 4 V C 7 7 m - ; F G ",
+" H J Z K * D D m ; M 5 4 V 7 = D m - ; ; ",
+" H h S h * y D L F ; : 4 f V C D D m a ; ; G ",
+" P I H J & b n 2 2 m A M 3 4 5 f y D = 2 2 A ; ; ",
+" P P H J U Y & p 1 2 - ; : 4 4 d f y T D 1 p 1 ; F G ",
+" P P H J % t & < < < m ; u R E 4 f b * y B < < A ; ; ",
+" W P P Q % t v < ! < - ; : L a 4 4 & * y < < ! ; ; G ",
+" ~ P ~ I c $ % > ^ > m ; M 2 2 3 4 t / b ^ i ^ ; M ; ",
+" ( P W P # $ % > > > F ; : p a 3 s t U & > > > ; ; G ",
+" ) _ ( _ @ $ # M ; u m ; u p 2 2 a % v t M ; u ; M ; ",
+" ( _ ( P P P H h h ` w X o : ; F F ; : & * D - G ' > i < 1 2 a % v t : ; F ; : u ",
+" ) ] ( _ ~ P P I Z h w j X O m - m ; ; M & y - m ; > i N < 2 2 $ c % m - m ; M : ",
+") [ ( _ W P P Q H h h j X O { D D - F G : y T m ; u > } < p | r .% D D - G : u ",
+"V f 5 4 5 f V f V f V f V f V y * y m ; u f 5 f V f 5 4 V f x @ $ y * y : u ..",
+"4 d f 4 f d f d 4 d f V f V f U & U F G : d f d f d f 4 4 d @ r # U & U G : > ",
+"3 4 3 E 4 E 4 4 3 4 4 4 5 4 5 t v X.; ; u 4 4 4 4 E 4 E 3 4 @ @ x t v X.; u ..",
+"a 4 a o.{ + .% v ; G > 3 a 4 e @ # .% v u ' > ",
+"3 2 3 X O o $ # $ ; ; u 2 3 2 O.+.@ $ # $ : u > ",
+"a 2 a X o + @ @ @ ; u ' 2 2 2 z @ @ @ @ @ u > } ",
+"p < p X k l O.z O.; : u 1 p < O.+.@ O.z O...> i ",
+"1 < 1 o.o + @.z @.; G > #.1 < z O.@ + @.z > > } ",
+"N , N X O o l + o ; ; u 1 1 1 O.+.@ O l + : u > ",
+"i } i o.o + O o o.; u o + z @ # % v } i } e @ @ } < #.| L a 4 f V o o.o G ' > ",
+"> ..u o O + . X . ; o O + O.@ $ % & u u ..@ @ x , < 1 2 2 3 4 5 6 X . X ; u ..",
+"' u : O + + j $.j $.o.{ O.e r % %.U G : u @ r # < < p 2 3 s d f 7 $.j $.u : u ",
+"; A M l + + h j . K h j h K h h h h ; ; A x @ $ h h h h h K h j 6 7 7 0 : u ..",
+"- m - + { @. h h w %.w h h h h h S h S m - m # r # h S h S h h h f 7 9 g F G : ",
+"y D D l + + Z h h t % h Z J Z J Z J Z J D y D x # $ H J Z J Z J f V 7 7 - M ; ",
+"* y * + z O. S h h & U t y * y @ $ . 4 d C 7 - m ; ",
+"& / b l + + P J Z y & t & & / x c $ E 5 4 V n = D ",
+"v %.v + z O. H J H D * & & v %.# % . a 4 f V * D - ",
+"X.% % + &.z P P H D n y c $ % $ c $ a 3 4 V * y D ",
+"# $ # + z @ P P H J m - D $ # $ # $ % 2 3 4 d * y T ",
+"@ @ x + + z W P P Q m D m @ @ @ $ c % 2 R E 4 & b * ",
+"z O.e + z @ P ~ I ; ; *. @ z O. .% % L s 4 U & * ",
+"&.+ &.l &.+.W P M ; m + &.+ $ c X.2 3 v t & ",
+"{ + { @.z O._ u ' ; + { + .$ % 3 v t & ",
+"O o k + O.P P P H h h ` w X o l + z @ c X./ b n m ; u o O o $ % % % t v ",
+"$.X $.@._ ~ P P I Z h w j X O + + @ # % v & * D - ; : X $.X .% v %.v ",
+"j . j _ W P P Q H h h j X O { + &.@ $ c t & y D m ; > . j . % c X.% ",
+"w j w ` w j w ` w ` h ` h h S h h h h ` h ` w ` w j w ` w j .% % ",
+"h h K h h h h h h h J h J H J Z J H J h h h h h h h J h h h $ % ",
+"S h h h H h S h S h S h H Q H J H Q H h H h S h S h S h S h . "};
+
+
+class OpenGLWidgetInterface : public WidgetInterface
+{
+public:
+ OpenGLWidgetInterface();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface ** );
+ Q_REFCOUNT;
+
+ QStringList featureList() const;
+
+ QWidget* create( const QString &classname, QWidget* parent = 0, const char* name = 0 );
+ QString group( const QString& ) const;
+ QIconSet iconSet( const QString& ) const;
+ QString includeFile( const QString& ) const;
+ QString toolTip( const QString& ) const;
+ QString whatsThis( const QString& ) const;
+ bool isContainer( const QString& ) const;
+
+private:
+ QObjectCleanupHandler objects;
+};
+
+OpenGLWidgetInterface::OpenGLWidgetInterface()
+{
+}
+
+QStringList OpenGLWidgetInterface::featureList() const
+{
+ QStringList list;
+
+ list << "GLWidget";
+
+ return list;
+}
+
+QWidget* OpenGLWidgetInterface::create( const QString &description, QWidget* parent, const char* name )
+{
+ QWidget* w = 0;
+
+ if ( description == "GLWidget" )
+ w = new GLWidget( parent, name );
+
+ objects.add( w );
+ return w;
+}
+
+QString OpenGLWidgetInterface::group( const QString &description ) const
+{
+ if ( description == "GLWidget" )
+ return "Views";
+ return QString::null;
+}
+
+QIconSet OpenGLWidgetInterface::iconSet( const QString &description ) const
+{
+ if ( description == "GLWidget" )
+ return QIconSet( (const char**)cube_xmp );
+ return QIconSet();
+}
+
+QString OpenGLWidgetInterface::includeFile( const QString &description ) const
+{
+ if ( description == "GLWidget" )
+ return "glwidget.h";
+ return QString::null;
+}
+
+QString OpenGLWidgetInterface::toolTip( const QString &description ) const
+{
+ if ( description == "GLWidget" )
+ return QT_TR_NOOP("OpenGL Widget");
+ return QString::null;
+}
+
+QString OpenGLWidgetInterface::whatsThis( const QString &description ) const
+{
+ if ( description == "GLWidget" )
+ return "A widget for OpenGL rendering";
+ return QString::null;
+}
+
+bool OpenGLWidgetInterface::isContainer( const QString& ) const
+{
+ return FALSE;
+}
+
+QRESULT OpenGLWidgetInterface::queryInterface( const QUuid& uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)this;
+ else if ( uuid == IID_QFeatureList )
+ *iface = (QFeatureListInterface*)this;
+ else if ( uuid == IID_Widget )
+ *iface = (WidgetInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+Q_EXPORT_COMPONENT()
+{
+ Q_CREATE_INSTANCE( OpenGLWidgetInterface );
+}
diff --git a/tools/designer/examples/opengl/opengl.pro b/tools/designer/examples/opengl/opengl.pro
new file mode 100644
index 0000000..d28eb32
--- /dev/null
+++ b/tools/designer/examples/opengl/opengl.pro
@@ -0,0 +1,11 @@
+TEMPLATE = lib
+CONFIG += qt warn_on release plugin
+HEADERS = glwidget.h
+SOURCES = main.cpp \
+ glwidget.cpp
+DESTDIR = ../../../../plugins/designer
+INCLUDEPATH += ../../interfaces
+
+TARGET = glwidget
+target.path += $$plugins.path/designer
+INSTALLS += target
diff --git a/tools/designer/examples/receiver1/main.cpp b/tools/designer/examples/receiver1/main.cpp
new file mode 100644
index 0000000..fd2cf20
--- /dev/null
+++ b/tools/designer/examples/receiver1/main.cpp
@@ -0,0 +1,24 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "mainform.h"
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ MainForm *mainForm = new MainForm;
+ app.setMainWidget( mainForm );
+ mainForm->show();
+
+ return app.exec();
+}
+
+
diff --git a/tools/designer/examples/receiver1/mainform.ui b/tools/designer/examples/receiver1/mainform.ui
new file mode 100644
index 0000000..abe714f
--- /dev/null
+++ b/tools/designer/examples/receiver1/mainform.ui
@@ -0,0 +1,87 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MainForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>MainForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>389</width>
+ <height>115</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Main Form</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>quitPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="0">
+ <property name="name">
+ <cstring>creditPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Credit Dialog</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Credit Rating</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>ratingTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Unrated</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>creditPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MainForm</receiver>
+ <slot>creditDialog()</slot>
+ </connection>
+ <connection>
+ <sender>quitPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MainForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">qspinbox.h</include>
+ <include location="global" impldecl="in implementation">qwidgetfactory.h</include>
+ <include location="local" impldecl="in implementation">mainform.ui.h</include>
+</includes>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot>creditDialog()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/examples/receiver1/mainform.ui.h b/tools/designer/examples/receiver1/mainform.ui.h
new file mode 100644
index 0000000..5318e2e
--- /dev/null
+++ b/tools/designer/examples/receiver1/mainform.ui.h
@@ -0,0 +1,25 @@
+void MainForm::init()
+{
+
+}
+
+void MainForm::destroy()
+{
+
+}
+
+void MainForm::creditDialog()
+{
+ QDialog *creditForm = (QDialog *)
+ QWidgetFactory::create( "../credit/creditformbase.ui" );
+ // Set up the dynamic dialog here
+
+ if ( creditForm->exec() ) {
+ // The user accepted, act accordingly
+ QSpinBox *amount = (QSpinBox *) creditForm->child( "amountSpinBox", "QSpinBox" );
+ if ( amount )
+ ratingTextLabel->setText( amount->text() );
+ }
+ delete creditForm;
+}
+
diff --git a/tools/designer/examples/receiver1/receiver.pro b/tools/designer/examples/receiver1/receiver.pro
new file mode 100644
index 0000000..0758559
--- /dev/null
+++ b/tools/designer/examples/receiver1/receiver.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+LANGUAGE = C++
+TARGET = receiver
+
+CONFIG += qt warn_on release
+INCLUDEPATH += $$QT_SOURCE_TREE/tools/designer/uilib
+LIBS += -lqui
+SOURCES += main.cpp
+IMAGEFILE = images.cpp
+FORMS = mainform.ui
+DBFILE = receiver.db
diff --git a/tools/designer/examples/receiver2/main.cpp b/tools/designer/examples/receiver2/main.cpp
new file mode 100644
index 0000000..8c76ef2
--- /dev/null
+++ b/tools/designer/examples/receiver2/main.cpp
@@ -0,0 +1,25 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "mainform.h"
+
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ MainForm *mainForm = new MainForm;
+ app.setMainWidget( mainForm );
+ mainForm->show();
+
+ return app.exec();
+}
+
+
diff --git a/tools/designer/examples/receiver2/mainform.ui b/tools/designer/examples/receiver2/mainform.ui
new file mode 100644
index 0000000..690f185
--- /dev/null
+++ b/tools/designer/examples/receiver2/mainform.ui
@@ -0,0 +1,82 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MainForm</class>
+<include location="global" impldecl="in implementation">qwidgetfactory.h</include>
+<include location="global" impldecl="in implementation">qspinbox.h</include>
+<include location="local" impldecl="in implementation">receiver.h</include>
+<include location="local" implDecl="in declaration">mainform.ui.h</include>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>MainForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>373</width>
+ <height>107</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Main Form</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>quitPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="0">
+ <property name="name">
+ <cstring>creditPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Credit Dialog</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Credit Rating</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>ratingTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Unrated</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>creditPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MainForm</receiver>
+ <slot>creditDialog()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>quitPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MainForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">creditDialog()</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/receiver2/mainform.ui.h b/tools/designer/examples/receiver2/mainform.ui.h
new file mode 100644
index 0000000..3cc3b69
--- /dev/null
+++ b/tools/designer/examples/receiver2/mainform.ui.h
@@ -0,0 +1,20 @@
+void MainForm::creditDialog()
+{
+ Receiver *receiver = new Receiver;
+ QDialog *creditForm = (QDialog *)
+ QWidgetFactory::create( "../credit/creditformbase.ui", receiver );
+ receiver->setParent( creditForm );
+
+ // Set up the dynamic dialog here
+
+ if ( creditForm->exec() ) {
+ // The user accepted, act accordingly
+ QSpinBox *amount = (QSpinBox *) creditForm->child( "amountSpinBox", "QSpinBox" );
+ if ( amount )
+ ratingTextLabel->setText( amount->text() );
+ }
+
+ delete receiver;
+ delete creditForm;
+}
+
diff --git a/tools/designer/examples/receiver2/receiver.cpp b/tools/designer/examples/receiver2/receiver.cpp
new file mode 100644
index 0000000..1f66d0b
--- /dev/null
+++ b/tools/designer/examples/receiver2/receiver.cpp
@@ -0,0 +1,29 @@
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include "receiver.h"
+
+void Receiver::setParent( QDialog *parent )
+{
+ p = parent;
+ setAmount();
+}
+
+void Receiver::setAmount()
+{
+ QSpinBox *amount =
+ (QSpinBox *) p->child( "amountSpinBox", "QSpinBox" );
+
+ QRadioButton *radio =
+ (QRadioButton *) p->child( "stdRadioButton", "QRadioButton" );
+ if ( radio && radio->isChecked() ) {
+ if ( amount )
+ amount->setValue( amount->maxValue() / 2 );
+ return;
+ }
+
+ radio =
+ (QRadioButton *) p->child( "noneRadioButton", "QRadioButton" );
+ if ( radio && radio->isChecked() )
+ if ( amount )
+ amount->setValue( amount->minValue() );
+}
diff --git a/tools/designer/examples/receiver2/receiver.h b/tools/designer/examples/receiver2/receiver.h
new file mode 100644
index 0000000..34b80e9
--- /dev/null
+++ b/tools/designer/examples/receiver2/receiver.h
@@ -0,0 +1,13 @@
+#include <qobject.h>
+#include <qdialog.h>
+
+class Receiver : public QObject
+{
+ Q_OBJECT
+public:
+ void setParent( QDialog *parent );
+public slots:
+ void setAmount();
+private:
+ QDialog *p;
+};
diff --git a/tools/designer/examples/receiver2/receiver.pro b/tools/designer/examples/receiver2/receiver.pro
new file mode 100644
index 0000000..5c7bf79
--- /dev/null
+++ b/tools/designer/examples/receiver2/receiver.pro
@@ -0,0 +1,12 @@
+TEMPLATE = app
+LANGUAGE = C++
+TARGET = receiver
+
+CONFIG += qt warn_on release
+INCLUDEPATH += $$QT_SOURCE_TREE/tools/designer/uilib
+LIBS += -lqui
+SOURCES += main.cpp receiver.cpp
+HEADERS += receiver.h
+FORMS = mainform.ui
+DBFILE = receiver.db
+IMAGEFILE = images.cpp
diff --git a/tools/designer/examples/richedit/images/editcopy.png b/tools/designer/examples/richedit/images/editcopy.png
new file mode 100644
index 0000000..abfe86e
--- /dev/null
+++ b/tools/designer/examples/richedit/images/editcopy.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/editcut.png b/tools/designer/examples/richedit/images/editcut.png
new file mode 100644
index 0000000..2d179bc
--- /dev/null
+++ b/tools/designer/examples/richedit/images/editcut.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/editpaste.png b/tools/designer/examples/richedit/images/editpaste.png
new file mode 100644
index 0000000..356ee55
--- /dev/null
+++ b/tools/designer/examples/richedit/images/editpaste.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/filenew.png b/tools/designer/examples/richedit/images/filenew.png
new file mode 100644
index 0000000..9853d97
--- /dev/null
+++ b/tools/designer/examples/richedit/images/filenew.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/fileopen.png b/tools/designer/examples/richedit/images/fileopen.png
new file mode 100644
index 0000000..85dab43
--- /dev/null
+++ b/tools/designer/examples/richedit/images/fileopen.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/filesave.png b/tools/designer/examples/richedit/images/filesave.png
new file mode 100644
index 0000000..21309aa
--- /dev/null
+++ b/tools/designer/examples/richedit/images/filesave.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/redo.png b/tools/designer/examples/richedit/images/redo.png
new file mode 100644
index 0000000..857d093
--- /dev/null
+++ b/tools/designer/examples/richedit/images/redo.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/textbold.png b/tools/designer/examples/richedit/images/textbold.png
new file mode 100644
index 0000000..c51e5c0
--- /dev/null
+++ b/tools/designer/examples/richedit/images/textbold.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/textcenter.png b/tools/designer/examples/richedit/images/textcenter.png
new file mode 100644
index 0000000..032a9bb
--- /dev/null
+++ b/tools/designer/examples/richedit/images/textcenter.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/textitalic.png b/tools/designer/examples/richedit/images/textitalic.png
new file mode 100644
index 0000000..b725b43
--- /dev/null
+++ b/tools/designer/examples/richedit/images/textitalic.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/textleft.png b/tools/designer/examples/richedit/images/textleft.png
new file mode 100644
index 0000000..4ef081f
--- /dev/null
+++ b/tools/designer/examples/richedit/images/textleft.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/textright.png b/tools/designer/examples/richedit/images/textright.png
new file mode 100644
index 0000000..a9b2b55
--- /dev/null
+++ b/tools/designer/examples/richedit/images/textright.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/textunder.png b/tools/designer/examples/richedit/images/textunder.png
new file mode 100644
index 0000000..5093509
--- /dev/null
+++ b/tools/designer/examples/richedit/images/textunder.png
Binary files differ
diff --git a/tools/designer/examples/richedit/images/undo.png b/tools/designer/examples/richedit/images/undo.png
new file mode 100644
index 0000000..9346c6c
--- /dev/null
+++ b/tools/designer/examples/richedit/images/undo.png
Binary files differ
diff --git a/tools/designer/examples/richedit/main.cpp b/tools/designer/examples/richedit/main.cpp
new file mode 100644
index 0000000..a5a0d6d
--- /dev/null
+++ b/tools/designer/examples/richedit/main.cpp
@@ -0,0 +1,25 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "richedit.h"
+
+
+int main( int argc, char *argv[] )
+{
+ QApplication app( argc, argv );
+
+ EditorForm richeditForm;
+ app.setMainWidget( &richeditForm );
+ richeditForm.show();
+
+ return app.exec();
+}
+
+
diff --git a/tools/designer/examples/richedit/richedit.pro b/tools/designer/examples/richedit/richedit.pro
new file mode 100644
index 0000000..bcc3d4d
--- /dev/null
+++ b/tools/designer/examples/richedit/richedit.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = richedit
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+SOURCES += main.cpp
+IMAGEFILE = images.cpp
+FORMS = richedit.ui
+IMAGES = images/editcopy.png images/editcut.png images/editpaste.png images/filenew.png images/fileopen.png images/filesave.png images/redo.png images/textbold.png images/textcenter.png images/textitalic.png images/textleft.png images/textright.png images/textunder.png images/undo.png
+DBFILE = richedit.db
diff --git a/tools/designer/examples/richedit/richedit.ui b/tools/designer/examples/richedit/richedit.ui
new file mode 100644
index 0000000..2ae033f
--- /dev/null
+++ b/tools/designer/examples/richedit/richedit.ui
@@ -0,0 +1,612 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>EditorForm</class>
+<include location="global" impldecl="in implementation">qfile.h</include>
+<include location="global" impldecl="in implementation">qfontdatabase.h</include>
+<include location="global" impldecl="in implementation">qmessagebox.h</include>
+<include location="global" impldecl="in implementation">qapplication.h</include>
+<include location="global" impldecl="in implementation">qfiledialog.h</include>
+<include location="global" impldecl="in implementation">qtextstream.h</include>
+<include location="local" implDecl="in declaration">richedit.ui.h</include>
+<variable>QString fileName;</variable>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QMainWindow">
+ <property name="name">
+ <cstring>EditorForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>646</width>
+ <height>436</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Rich Edit</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>textEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="textFormat">
+ <enum>RichText</enum>
+ </property>
+ </widget>
+ </hbox>
+</widget>
+<menubar>
+ <property name="name">
+ <cstring>menubar</cstring>
+ </property>
+ <item text="&amp;File" name="fileMenu">
+ <action name="fileNewAction"/>
+ <action name="fileOpenAction"/>
+ <action name="fileSaveAction"/>
+ <action name="fileSaveAsAction"/>
+ <separator/>
+ <action name="fileExitAction"/>
+ </item>
+ <item text="&amp;Edit" name="editMenu">
+ <action name="editUndoAction"/>
+ <action name="editRedoAction"/>
+ <separator/>
+ <action name="editCutAction"/>
+ <action name="editCopyAction"/>
+ <action name="editPasteAction"/>
+ </item>
+ <item text="F&amp;ormat" name="PopupMenu_2">
+ <action name="leftAlignAction"/>
+ <action name="rightAlignAction"/>
+ <action name="centerAlignAction"/>
+ <separator/>
+ <action name="boldAction"/>
+ <action name="italicAction"/>
+ <action name="underlineAction"/>
+ </item>
+ <item text="&amp;Help" name="helpMenu">
+ <action name="helpContentsAction"/>
+ <action name="helpIndexAction"/>
+ <separator/>
+ <action name="helpAboutAction"/>
+ </item>
+</menubar>
+<toolbars>
+ <toolbar dock="2">
+ <property name="name">
+ <cstring>toolBar</cstring>
+ </property>
+ <property name="label">
+ <string>Tools</string>
+ </property>
+ <action name="fileNewAction"/>
+ <action name="fileOpenAction"/>
+ <action name="fileSaveAction"/>
+ <separator/>
+ <action name="editUndoAction"/>
+ <action name="editRedoAction"/>
+ <action name="editCutAction"/>
+ <action name="editCopyAction"/>
+ <action name="editPasteAction"/>
+ </toolbar>
+ <toolbar dock="2">
+ <property name="name">
+ <cstring>Toolbar</cstring>
+ </property>
+ <property name="label">
+ <string>Toolbar</string>
+ </property>
+ <action name="leftAlignAction"/>
+ <action name="centerAlignAction"/>
+ <action name="rightAlignAction"/>
+ <separator/>
+ <action name="boldAction"/>
+ <action name="italicAction"/>
+ <action name="underlineAction"/>
+ <separator/>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>fontComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>SpinBox2</cstring>
+ </property>
+ <property name="minValue">
+ <number>6</number>
+ </property>
+ <property name="value">
+ <number>10</number>
+ </property>
+ </widget>
+ </toolbar>
+</toolbars>
+<actions>
+ <action>
+ <property name="name">
+ <cstring>fileNewAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>filenew.png</iconset>
+ </property>
+ <property name="text">
+ <string>New</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;New</string>
+ </property>
+ <property name="accel">
+ <number>4194382</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileOpenAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="text">
+ <string>Open</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Open...</string>
+ </property>
+ <property name="accel">
+ <number>4194383</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>filesave.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Save</string>
+ </property>
+ <property name="accel">
+ <number>4194387</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveAsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Save As</string>
+ </property>
+ <property name="menuText">
+ <string>Save &amp;As...</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileExitAction</cstring>
+ </property>
+ <property name="text">
+ <string>Exit</string>
+ </property>
+ <property name="menuText">
+ <string>E&amp;xit</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editUndoAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>undo.png</iconset>
+ </property>
+ <property name="text">
+ <string>Undo</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Undo</string>
+ </property>
+ <property name="accel">
+ <number>4194394</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editRedoAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>redo.png</iconset>
+ </property>
+ <property name="text">
+ <string>Redo</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Redo</string>
+ </property>
+ <property name="accel">
+ <number>4194393</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editCutAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>editcut.png</iconset>
+ </property>
+ <property name="text">
+ <string>Cut</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Cut</string>
+ </property>
+ <property name="accel">
+ <number>4194392</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editCopyAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>editcopy.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy</string>
+ </property>
+ <property name="menuText">
+ <string>C&amp;opy</string>
+ </property>
+ <property name="accel">
+ <number>4194371</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editPasteAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>editpaste.png</iconset>
+ </property>
+ <property name="text">
+ <string>Paste</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Paste</string>
+ </property>
+ <property name="accel">
+ <number>4194390</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpContentsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Contents</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Contents...</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpIndexAction</cstring>
+ </property>
+ <property name="text">
+ <string>Index</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Index...</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpAboutAction</cstring>
+ </property>
+ <property name="text">
+ <string>About</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;About</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>boldAction</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>textbold.png</iconset>
+ </property>
+ <property name="text">
+ <string>bold</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Bold</string>
+ </property>
+ <property name="accel">
+ <number>272629826</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>italicAction</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>textitalic.png</iconset>
+ </property>
+ <property name="text">
+ <string>italic</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Italic</string>
+ </property>
+ <property name="accel">
+ <number>272629833</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>underlineAction</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>textunder.png</iconset>
+ </property>
+ <property name="text">
+ <string>underline</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Underline</string>
+ </property>
+ <property name="accel">
+ <number>272629845</number>
+ </property>
+ </action>
+ <actiongroup>
+ <property name="name">
+ <cstring>alignActionGroup</cstring>
+ </property>
+ <property name="text">
+ <string>align</string>
+ </property>
+ <property name="usesDropDown">
+ <bool>false</bool>
+ </property>
+ <action>
+ <property name="name">
+ <cstring>leftAlignAction</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>textleft.png</iconset>
+ </property>
+ <property name="text">
+ <string>left</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Left</string>
+ </property>
+ <property name="accel">
+ <number>272629836</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>rightAlignAction</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>textright.png</iconset>
+ </property>
+ <property name="text">
+ <string>right</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Right</string>
+ </property>
+ <property name="accel">
+ <number>272629842</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>centerAlignAction</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>textcenter.png</iconset>
+ </property>
+ <property name="text">
+ <string>center</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Center</string>
+ </property>
+ </action>
+ </actiongroup>
+</actions>
+<connections>
+ <connection language="C++">
+ <sender>fileNewAction</sender>
+ <signal>activated()</signal>
+ <receiver>EditorForm</receiver>
+ <slot>fileNew()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>fileOpenAction</sender>
+ <signal>activated()</signal>
+ <receiver>EditorForm</receiver>
+ <slot>fileOpen()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>fileSaveAction</sender>
+ <signal>activated()</signal>
+ <receiver>EditorForm</receiver>
+ <slot>fileSave()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>fileSaveAsAction</sender>
+ <signal>activated()</signal>
+ <receiver>EditorForm</receiver>
+ <slot>fileSaveAs()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>fileExitAction</sender>
+ <signal>activated()</signal>
+ <receiver>EditorForm</receiver>
+ <slot>fileExit()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>helpIndexAction</sender>
+ <signal>activated()</signal>
+ <receiver>EditorForm</receiver>
+ <slot>helpIndex()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>helpContentsAction</sender>
+ <signal>activated()</signal>
+ <receiver>EditorForm</receiver>
+ <slot>helpContents()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>helpAboutAction</sender>
+ <signal>activated()</signal>
+ <receiver>EditorForm</receiver>
+ <slot>helpAbout()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>SpinBox2</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>textEdit</receiver>
+ <slot>setPointSize(int)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>editCutAction</sender>
+ <signal>activated()</signal>
+ <receiver>textEdit</receiver>
+ <slot>cut()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>editPasteAction</sender>
+ <signal>activated()</signal>
+ <receiver>textEdit</receiver>
+ <slot>paste()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>editCopyAction</sender>
+ <signal>activated()</signal>
+ <receiver>textEdit</receiver>
+ <slot>copy()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>editRedoAction</sender>
+ <signal>activated()</signal>
+ <receiver>textEdit</receiver>
+ <slot>redo()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>editUndoAction</sender>
+ <signal>activated()</signal>
+ <receiver>textEdit</receiver>
+ <slot>undo()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>alignActionGroup</sender>
+ <signal>selected(QAction*)</signal>
+ <receiver>EditorForm</receiver>
+ <slot>changeAlignment(QAction*)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>underlineAction</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textEdit</receiver>
+ <slot>setUnderline(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>italicAction</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textEdit</receiver>
+ <slot>setItalic(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>boldAction</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textEdit</receiver>
+ <slot>setBold(bool)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>fontComboBox</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>textEdit</receiver>
+ <slot>setFamily(const QString&amp;)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>fontComboBox</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>textEdit</receiver>
+ <slot>setFocus()</slot>
+ </connection>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">init()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">fileExit()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">fileNew()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">fileOpen()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">fileSave()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">fileSaveAs()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">helpAbout()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">helpContents()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">helpIndex()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">changeAlignment( QAction * align )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="int">saveAndContinue( const QString &amp; action )</slot>
+</connections>
+</UI>
diff --git a/tools/designer/examples/richedit/richedit.ui.h b/tools/designer/examples/richedit/richedit.ui.h
new file mode 100644
index 0000000..761848e
--- /dev/null
+++ b/tools/designer/examples/richedit/richedit.ui.h
@@ -0,0 +1,120 @@
+void EditorForm::init()
+{
+ textEdit->setFocus();
+
+ QFontDatabase fonts;
+ fontComboBox->insertStringList( fonts.families() );
+ QString font = textEdit->family();
+ font = font.lower();
+ for ( int i = 0 ; i < fontComboBox->count(); i++ ) {
+ if ( font == fontComboBox->text( i ) ) {
+ fontComboBox->setCurrentItem( i );
+ break;
+ }
+ }
+}
+
+void EditorForm::fileExit()
+{
+ if ( saveAndContinue( "Exit" ) )
+ qApp->exit();
+}
+
+void EditorForm::fileNew()
+{
+ if ( saveAndContinue( "New" ) )
+ textEdit->clear();
+}
+
+void EditorForm::fileOpen()
+{
+ if ( saveAndContinue( "Open" ) ) {
+ QString fn( QFileDialog::getOpenFileName(
+ QString::null,
+ "Rich Text Files (*.htm*)", this ) );
+ if ( !fn.isEmpty() ) {
+ fileName = fn;
+ QFile file( fileName );
+ if ( file.open( IO_ReadOnly ) ) {
+ QTextStream ts( &file );
+ textEdit->setText( ts.read() );
+ }
+ }
+ }
+}
+
+void EditorForm::fileSave()
+{
+ if ( fileName.isEmpty() ) {
+ fileSaveAs();
+ } else {
+ QFile f( fileName );
+ if ( f.open( IO_WriteOnly ) ) {
+ QTextStream ts( &f );
+ ts << textEdit->text();
+ textEdit->setModified( FALSE );
+ }
+ }
+}
+
+void EditorForm::fileSaveAs()
+{
+ QString fn = QFileDialog::getSaveFileName(
+ "", "Rich Text Files (*.htm*)", this );
+ if ( !fn.isEmpty() ) {
+ fileName = fn;
+ fileSave();
+ }
+}
+
+void EditorForm::helpAbout()
+{
+
+}
+
+void EditorForm::helpContents()
+{
+
+}
+
+void EditorForm::helpIndex()
+{
+
+}
+
+void EditorForm::changeAlignment(QAction * align)
+{
+ if ( align == leftAlignAction )
+ textEdit->setAlignment( Qt::AlignLeft );
+ else if ( align == rightAlignAction )
+ textEdit->setAlignment( Qt::AlignRight );
+ else if ( align == centerAlignAction )
+ textEdit->setAlignment( Qt::AlignCenter );
+}
+
+int EditorForm::saveAndContinue(const QString & action)
+{
+ int continueAction = 1;
+
+ if ( textEdit->isModified() ) {
+ switch( QMessageBox::information(
+ this, "Rich Edit",
+ "The document contains unsaved changes.\n"
+ "Do you want to save the changes?",
+ "&Save", "&Don't Save", "&Cancel " + action,
+ 0, // Enter == button 0
+ 2 ) ) { // Escape == button 2
+ case 0: // Save; continue
+ fileSave();
+ break;
+ case 1: // Do not save; continue
+ break;
+ case 2: // Cancel
+ continueAction = 0;
+ break;
+ }
+ }
+
+ return continueAction;
+}
+
diff --git a/tools/designer/examples/sizeaware/main.cpp b/tools/designer/examples/sizeaware/main.cpp
new file mode 100644
index 0000000..f8cd6ac
--- /dev/null
+++ b/tools/designer/examples/sizeaware/main.cpp
@@ -0,0 +1,11 @@
+#include <qapplication.h>
+#include "sizeaware.h"
+
+int main( int argc, char ** argv )
+{
+ QApplication app( argc, argv );
+ SizeAware *sizeaware = new SizeAware( 0, 0, TRUE );
+ sizeaware->exec();
+ sizeaware->destroy();
+ return 0;
+}
diff --git a/tools/designer/examples/sizeaware/sizeaware.cpp b/tools/designer/examples/sizeaware/sizeaware.cpp
new file mode 100644
index 0000000..1510a15
--- /dev/null
+++ b/tools/designer/examples/sizeaware/sizeaware.cpp
@@ -0,0 +1,38 @@
+#include "sizeaware.h"
+#include <qsettings.h>
+
+
+SizeAware::SizeAware( QDialog *parent, const char *name, bool modal )
+ : QDialog( parent, name, modal )
+{
+ if ( company().isEmpty() )
+ setCompany( "UnknownCompany" );
+ if ( settingsFile().isEmpty() )
+ setSettingsFile( "UnknownFile" );
+
+ QSettings settings;
+ settings.insertSearchPath( QSettings::Windows, "/" + company() );
+ settings.insertSearchPath( QSettings::Unix, "/Opt/" + company() + "/share" );
+ int width = settings.readNumEntry( "/" + settingsFile() + "/width", 640 );
+ int height = settings.readNumEntry( "/" + settingsFile() + "/height", 480 );
+ resize( width, height );
+}
+
+
+SizeAware::~SizeAware()
+{
+ // NOOP
+}
+
+void SizeAware::destroy()
+{
+ QSettings settings;
+ settings.insertSearchPath( QSettings::Windows, "/" + company() );
+ settings.insertSearchPath( QSettings::Unix, "/Opt/" + company() + "/share" );
+ settings.writeEntry( "/" + settingsFile() + "/width", width() );
+ settings.writeEntry( "/" + settingsFile() + "/height", height() );
+ close( TRUE );
+}
+
+
+
diff --git a/tools/designer/examples/sizeaware/sizeaware.h b/tools/designer/examples/sizeaware/sizeaware.h
new file mode 100644
index 0000000..efa9357
--- /dev/null
+++ b/tools/designer/examples/sizeaware/sizeaware.h
@@ -0,0 +1,23 @@
+#ifndef SIZEAWARE_H
+#define SIZEAWARE_H
+#include <qdialog.h>
+
+class SizeAware : public QDialog
+{
+ Q_OBJECT
+ Q_PROPERTY( QString company READ company WRITE setCompany )
+ Q_PROPERTY( QString settingsFile READ settingsFile WRITE setSettingsFile )
+public:
+ SizeAware( QDialog *parent = 0, const char *name = 0, bool modal = FALSE );
+ ~SizeAware();
+ void setCompany( QString company ) { m_company = company; }
+ QString company() const { return m_company; }
+ void setSettingsFile( QString settingsFile ) { m_settingsFile = settingsFile; }
+ QString settingsFile() const { return m_settingsFile; }
+public slots:
+ void destroy();
+private:
+ QString m_company;
+ QString m_settingsFile;
+};
+#endif
diff --git a/tools/designer/examples/sizeaware/sizeaware.pro b/tools/designer/examples/sizeaware/sizeaware.pro
new file mode 100644
index 0000000..c223ed7
--- /dev/null
+++ b/tools/designer/examples/sizeaware/sizeaware.pro
@@ -0,0 +1,6 @@
+TEMPLATE = app
+TARGET = sizeaware
+
+CONFIG += qt warn_on release
+SOURCES += sizeaware.cpp main.cpp
+HEADERS += sizeaware.h
diff --git a/tools/designer/examples/vcr/main.cpp b/tools/designer/examples/vcr/main.cpp
new file mode 100644
index 0000000..a848328
--- /dev/null
+++ b/tools/designer/examples/vcr/main.cpp
@@ -0,0 +1,10 @@
+#include <qapplication.h>
+#include "vcr.h"
+
+int main( int argc, char ** argv )
+{
+ QApplication app( argc, argv );
+ Vcr *vcr = new Vcr;
+ vcr->show();
+ return app.exec();
+}
diff --git a/tools/designer/examples/vcr/play.xpm b/tools/designer/examples/vcr/play.xpm
new file mode 100644
index 0000000..8102ed1
--- /dev/null
+++ b/tools/designer/examples/vcr/play.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char * play_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+"................",
+".++.............",
+".++++...........",
+".++++++.........",
+".++++++++.......",
+".++++++++++.....",
+".++++++++++++...",
+".+++++++++++++..",
+".+++++++++++++..",
+".++++++++++++...",
+".++++++++++.....",
+".++++++++.......",
+".++++++.........",
+".++++...........",
+".+++............",
+"................"};
+
diff --git a/tools/designer/examples/vcr/vcr.cpp b/tools/designer/examples/vcr/vcr.cpp
new file mode 100644
index 0000000..1b2bccf
--- /dev/null
+++ b/tools/designer/examples/vcr/vcr.cpp
@@ -0,0 +1,117 @@
+#include "vcr.h"
+#include <qpushbutton.h>
+#include <qlayout.h>
+
+static const char * rewind_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+"................",
+".++..........++.",
+".++........++++.",
+".++......++++++.",
+".++....++++++++.",
+".++..++++++++++.",
+".++++++++++++++.",
+".++++++++++++++.",
+".++++++++++++++.",
+".++++++++++++++.",
+".++..++++++++++.",
+".++....++++++++.",
+".++......++++++.",
+".++........++++.",
+".++.........+++.",
+"................"};
+
+static const char * play_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+"................",
+".++.............",
+".++++...........",
+".++++++.........",
+".++++++++.......",
+".++++++++++.....",
+".++++++++++++...",
+".+++++++++++++..",
+".+++++++++++++..",
+".++++++++++++...",
+".++++++++++.....",
+".++++++++.......",
+".++++++.........",
+".++++...........",
+".+++............",
+"................"};
+
+static const char * next_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+"................",
+".++.....+.......",
+".+++....++......",
+".++++...+++.....",
+".+++++..++++....",
+".++++++.+++++...",
+".+++++++++++++..",
+".++++++++++++++.",
+".++++++++++++++.",
+".+++++++++++++..",
+".++++++.+++++...",
+".+++++..++++....",
+".++++...+++.....",
+".+++....++......",
+".++.....+.......",
+"................"};
+
+static const char * stop_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+"................",
+".++++++++++++++.",
+".++++++++++++++.",
+".++++++++++++++.",
+".+++........+++.",
+".+++........+++.",
+".+++........+++.",
+".+++........+++.",
+".+++........+++.",
+".+++........+++.",
+".+++........+++.",
+".+++........+++.",
+".++++++++++++++.",
+".++++++++++++++.",
+".++++++++++++++.",
+"................"};
+
+
+Vcr::Vcr( QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ QHBoxLayout *layout = new QHBoxLayout( this );
+ layout->setMargin( 0 );
+
+ QPushButton *rewind = new QPushButton( QPixmap( rewind_xpm ), 0, this, "vcr_rewind" );
+ layout->addWidget( rewind );
+ connect( rewind, SIGNAL(clicked()), SIGNAL(rewind()) );
+
+ QPushButton *play = new QPushButton( QPixmap( play_xpm ), 0, this, "vcr_play" );
+ layout->addWidget( play );
+ connect( play, SIGNAL(clicked()), SIGNAL(play()) );
+
+ QPushButton *next = new QPushButton( QPixmap( next_xpm ), 0, this, "vcr_next" );
+ layout->addWidget( next );
+ connect( next, SIGNAL(clicked()), SIGNAL(next()) );
+
+ QPushButton *stop = new QPushButton( QPixmap( stop_xpm ), 0, this, "vcr_stop" );
+ layout->addWidget( stop );
+ connect( stop, SIGNAL(clicked()), SIGNAL(stop()) );
+}
+
+
diff --git a/tools/designer/examples/vcr/vcr.h b/tools/designer/examples/vcr/vcr.h
new file mode 100644
index 0000000..c24086e
--- /dev/null
+++ b/tools/designer/examples/vcr/vcr.h
@@ -0,0 +1,17 @@
+#ifndef VCR_H
+#define VCR_H
+#include <qwidget.h>
+
+class Vcr : public QWidget
+{
+ Q_OBJECT
+public:
+ Vcr( QWidget *parent = 0, const char *name = 0 );
+ ~Vcr() {}
+signals:
+ void rewind();
+ void play();
+ void next();
+ void stop();
+};
+#endif
diff --git a/tools/designer/examples/vcr/vcr.pro b/tools/designer/examples/vcr/vcr.pro
new file mode 100644
index 0000000..8bda690
--- /dev/null
+++ b/tools/designer/examples/vcr/vcr.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+LANGUAGE = C++
+TARGET = vcr
+
+CONFIG += qt warn_on release
+SOURCES += vcr.cpp main.cpp
+HEADERS += vcr.h
+DBFILE = vcr.db
diff --git a/tools/designer/integration/designer.el b/tools/designer/integration/designer.el
new file mode 100644
index 0000000..4b3c38d
--- /dev/null
+++ b/tools/designer/integration/designer.el
@@ -0,0 +1,19 @@
+(defvar designer-exec "/usr/bin/designer")
+
+(defun designer-open-ui-file ()
+ (interactive)
+ (defvar procname "designer")
+ (start-process procname nil designer-exec "-client" buffer-file-name)
+)
+
+(defun designer-create-ui-file (&optional arg)
+ (interactive "FNew UI-File: ")
+ (find-file arg)
+ (insert "<UI></UI>")
+ (save-buffer)
+ (designer-open-ui-file)
+)
+
+;(global-set-key [f7] 'designer-open-ui-file)
+;(global-set-key [f8] 'designer-create-ui-file)
+
diff --git a/tools/designer/interfaces/actioninterface.h b/tools/designer/interfaces/actioninterface.h
new file mode 100644
index 0000000..fc203b1
--- /dev/null
+++ b/tools/designer/interfaces/actioninterface.h
@@ -0,0 +1,85 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef ACTIONINTERFACE_H
+#define ACTIONINTERFACE_H
+
+#include <private/qcom_p.h>
+
+class QAction;
+class QObject;
+
+// {bb206e09-84e5-4777-9fce-706babfab931}
+#ifndef IID_Action
+#define IID_Action QUuid( 0xbb206e09, 0x84e5, 0x4777, 0x9f, 0xce, 0x70, 0x6b, 0xab, 0xfa, 0xb9, 0x31 )
+#endif
+
+/*! To add actions to the Qt Designer menubars and toolbars, implement
+ this interface. You have to implement the create(), group() and
+ connectTo() functions.
+
+ You also have to implement the function featureList() (\sa
+ QFeatureListInterface) to return the names of all actions
+ which this interface provides.
+*/
+
+class ActionInterface : public QFeatureListInterface
+{
+public:
+ enum Location {
+ Toolbar,
+ Menu
+ };
+
+ /*! This functions is called to create the action with the name \a
+ name. \a parent should be used as parent of the action.
+
+ In the implementation return the QAction object for the action
+ \a name.
+ */
+ virtual QAction* create( const QString &name, QObject* parent = 0 ) = 0;
+
+ /*! In the implementation of the interface return the name of the
+ group of the action \a name.
+ */
+ virtual QString group( const QString &name ) const = 0;
+
+ /*! In the implementation of the interface return whether the
+ action \a name should appear in the location \a l */
+ virtual bool location( const QString &name, Location l ) const = 0;
+
+ /*! \internal */
+ virtual void connectTo( QUnknownInterface *appInterface ) = 0;
+};
+
+#endif
diff --git a/tools/designer/interfaces/classbrowserinterface.h b/tools/designer/interfaces/classbrowserinterface.h
new file mode 100644
index 0000000..b97f2b9
--- /dev/null
+++ b/tools/designer/interfaces/classbrowserinterface.h
@@ -0,0 +1,70 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef CLASSBROWSERINTERFACE_H
+#define CLASSBROWSERINTERFACE_H
+
+//
+// W A R N I N G -- PRIVATE INTERFACES
+// --------------------------------------
+//
+// This file and the interfaces declared in the file are not
+// public. It exists for internal purpose. This header file and
+// interfaces may change from version to version (even binary
+// incompatible) without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#include <private/qcom_p.h>
+#include <qobject.h>
+class QListView;
+
+// {4ede3c32-ae96-4b7a-9e38-9f1d93592391}
+#ifndef IID_ClassBrowser
+#define IID_ClassBrowser QUuid( 0x4ede3c32, 0xae96, 0x4b7a, 0x9e, 0x38, 0x9f, 0x1d, 0x93, 0x59, 0x23, 0x91 )
+#endif
+
+struct ClassBrowserInterface : public QUnknownInterface
+{
+ enum Type { Class, Function };
+
+ virtual QListView *createClassBrowser( QWidget *parent ) const = 0;
+ virtual void update( const QString &code ) const = 0;
+ virtual void clear() const = 0;
+
+ virtual void onClick( QObject *receiver, const char *slot ) = 0;
+};
+
+#endif
diff --git a/tools/designer/interfaces/designerinterface.h b/tools/designer/interfaces/designerinterface.h
new file mode 100644
index 0000000..8988da0
--- /dev/null
+++ b/tools/designer/interfaces/designerinterface.h
@@ -0,0 +1,268 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef DESIGNERINTERFACE_H
+#define DESIGNERINTERFACE_H
+
+//
+// W A R N I N G -- PRIVATE INTERFACES
+// --------------------------------------
+//
+// This file and the interfaces declared in the file are not
+// public. It exists for internal purpose. This header file and
+// interfaces may change from version to version (even binary
+// incompatible) without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#include <private/qcom_p.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qmap.h>
+#include <qstringlist.h>
+#include <qwidgetlist.h>
+#include <qobjectlist.h>
+
+struct DesignerProject;
+struct DesignerDatabase;
+struct DesignerFormWindow;
+struct DesignerDock;
+struct DesignerOutputDock;
+struct DesignerOutput;
+struct DesignerOutputError;
+struct DesignerPixmapCollection;
+struct DesignerSourceFile;
+
+class QDockWindow;
+class QWidget;
+class QObject;
+class QAction;
+class QIconSet;
+class QSqlDatabase;
+
+// {0e661da-f45c-4830-af47-03ec53eb1633}
+#ifndef IID_Designer
+#define IID_Designer QUuid( 0xa0e661da, 0xf45c, 0x4830, 0xaf, 0x47, 0x3, 0xec, 0x53, 0xeb, 0x16, 0x33 )
+#endif
+
+/*! These are the interfaces implemented by the Qt Designer which should
+ be used by plugins to access and use functionality of the Qt Designer.
+*/
+
+struct DesignerInterface : public QUnknownInterface
+{
+ virtual DesignerProject *currentProject() const = 0;
+ virtual DesignerFormWindow *currentForm() const = 0;
+ virtual DesignerSourceFile *currentSourceFile() const = 0;
+ virtual QPtrList<DesignerProject> projectList() const = 0;
+ virtual void showStatusMessage( const QString &, int ms = 0 ) const = 0;
+ virtual DesignerDock *createDock() const = 0;
+ virtual DesignerOutputDock *outputDock() const = 0;
+ virtual void setModified( bool b, QWidget *window ) = 0;
+ virtual void updateFunctionList() = 0;
+
+ virtual void onProjectChange( QObject *receiver, const char *slot ) = 0;
+ virtual void onFormChange( QObject *receiver, const char *slot ) = 0;
+
+ virtual bool singleProjectMode() const = 0;
+ virtual void showError( QWidget *widget, int line, const QString &message ) = 0;
+ virtual void runFinished() = 0;
+ virtual void showStackFrame( QWidget *w, int line ) = 0;
+ virtual void showDebugStep( QWidget *w, int line ) = 0;
+ virtual void runProjectPrecondition() = 0;
+ virtual void runProjectPostcondition( QObjectList *l ) = 0;
+
+ };
+
+struct DesignerProject
+{
+ virtual QPtrList<DesignerFormWindow> formList() const = 0;
+ virtual QStringList formNames() const = 0;
+ virtual QString formFileName( const QString &form ) const = 0;
+ virtual void addForm( DesignerFormWindow * ) = 0;
+ virtual void removeForm( DesignerFormWindow * ) = 0;
+ virtual QString fileName() const = 0;
+ virtual void setFileName( const QString & ) = 0;
+ virtual QString projectName() const = 0;
+ virtual void setProjectName( const QString & ) = 0;
+ virtual QString databaseFile() const = 0;
+ virtual void setDatabaseFile( const QString & ) = 0;
+ virtual void setupDatabases() const = 0;
+ virtual QPtrList<DesignerDatabase> databaseConnections() const = 0;
+ virtual void addDatabase( DesignerDatabase * ) = 0;
+ virtual void removeDatabase( DesignerDatabase * ) = 0;
+ virtual void save() const = 0;
+ virtual void setLanguage( const QString & ) = 0;
+ virtual QString language() const = 0;
+ virtual void setCustomSetting( const QString &key, const QString &value ) = 0;
+ virtual QString customSetting( const QString &key ) const = 0;
+ virtual DesignerPixmapCollection *pixmapCollection() const = 0;
+ virtual void breakPoints( QMap<QString, QValueList<uint> > &bps ) const = 0;
+ virtual QString breakPointCondition( QObject *o, int line ) const = 0;
+ virtual void setBreakPointCondition( QObject *o, int line, const QString &condition ) = 0;
+ virtual void clearAllBreakpoints() const = 0;
+ virtual void setIncludePath( const QString &platform, const QString &path ) = 0;
+ virtual void setLibs( const QString &platform, const QString &path ) = 0;
+ virtual void setDefines( const QString &platform, const QString &path ) = 0;
+ virtual void setConfig( const QString &platform, const QString &config ) = 0;
+ virtual void setTemplate( const QString &t ) = 0;
+ virtual QString config( const QString &platform ) const = 0;
+ virtual QString libs( const QString &platform ) const = 0;
+ virtual QString defines( const QString &platform ) const = 0;
+ virtual QString includePath( const QString &platform ) const = 0;
+ virtual QString templte() const = 0;
+ virtual bool isGenericObject( QObject *o ) const = 0;
+
+};
+
+struct DesignerDatabase
+{
+ virtual QString name() const = 0;
+ virtual void setName( const QString & ) = 0;
+ virtual QString driver() const = 0;
+ virtual void setDriver( const QString & ) = 0;
+ virtual QString database() const = 0;
+ virtual void setDatabase( const QString & ) = 0;
+ virtual QString userName() const = 0;
+ virtual void setUserName( const QString & ) = 0;
+ virtual QString password() const = 0;
+ virtual void setPassword( const QString & ) = 0;
+ virtual QString hostName() const = 0;
+ virtual void setHostName( const QString & ) = 0;
+ virtual QStringList tables() const = 0;
+ virtual void setTables( const QStringList & ) = 0;
+ virtual QMap<QString, QStringList> fields() const = 0;
+ virtual void setFields( const QMap<QString, QStringList> & ) = 0;
+ virtual void open( bool suppressDialog = FALSE ) const = 0;
+ virtual void close() const = 0;
+ virtual QSqlDatabase* connection() = 0;
+
+};
+
+struct DesignerPixmapCollection
+{
+ virtual void addPixmap( const QPixmap &p, const QString &name, bool force ) = 0;
+ virtual QPixmap pixmap( const QString &name ) const = 0;
+};
+
+struct DesignerFormWindow
+{
+ virtual QString name() const = 0;
+ virtual void setName( const QString &n ) = 0;
+ virtual QString fileName() const = 0;
+ virtual void setFileName( const QString & ) = 0;
+ virtual void save() const = 0;
+ virtual bool isModified() const = 0;
+ virtual void insertWidget( QWidget * ) = 0;
+ virtual void removeWidget( QWidget * ) = 0;
+ virtual QWidget *create( const char *className, QWidget *parent, const char *name ) = 0;
+ virtual QWidgetList widgets() const = 0;
+ virtual void undo() = 0;
+ virtual void redo() = 0;
+ virtual void cut() = 0;
+ virtual void copy() = 0;
+ virtual void paste() = 0;
+ virtual void adjustSize() = 0;
+ virtual void editConnections() = 0;
+ virtual void checkAccels() = 0;
+ virtual void layoutH() = 0;
+ virtual void layoutV() = 0;
+ virtual void layoutHSplit() = 0;
+ virtual void layoutVSplit() = 0;
+ virtual void layoutG() = 0;
+ virtual void layoutHContainer( QWidget* w ) = 0;
+ virtual void layoutVContainer( QWidget* w ) = 0;
+ virtual void layoutGContainer( QWidget* w ) = 0;
+ virtual void breakLayout() = 0;
+ virtual void selectWidget( QWidget * w ) = 0;
+ virtual void selectAll() = 0;
+ virtual void clearSelection() = 0;
+ virtual bool isWidgetSelected( QWidget * ) const = 0;
+ virtual QWidgetList selectedWidgets() const = 0;
+ virtual QWidget *currentWidget() const = 0;
+ virtual QWidget *form() const = 0;
+ virtual void setCurrentWidget( QWidget * ) = 0;
+ virtual QPtrList<QAction> actionList() const = 0;
+ virtual QAction *createAction( const QString& text, const QIconSet& icon, const QString& menuText, int accel,
+ QObject* parent, const char* name = 0, bool toggle = FALSE ) = 0;
+ virtual void addAction( QAction * ) = 0;
+ virtual void removeAction( QAction * ) = 0;
+ virtual void preview() const = 0;
+ virtual void addFunction( const QCString &slot, const QString &specifier, const QString &access,
+ const QString &type, const QString &language, const QString &returnType ) = 0;
+ virtual void addConnection( QObject *sender, const char *signal, QObject *receiver, const char *slot ) = 0;
+ virtual void setProperty( QObject *o, const char *property, const QVariant &value ) = 0;
+ virtual QVariant property( QObject *o, const char *property ) const = 0;
+ virtual void setPropertyChanged( QObject *o, const char *property, bool changed ) = 0;
+ virtual bool isPropertyChanged( QObject *o, const char *property ) const = 0;
+ virtual void setColumnFields( QObject *o, const QMap<QString, QString> & ) = 0;
+ virtual QStringList implementationIncludes() const = 0;
+ virtual QStringList declarationIncludes() const = 0;
+ virtual void setImplementationIncludes( const QStringList &lst ) = 0;
+ virtual void setDeclarationIncludes( const QStringList &lst ) = 0;
+ virtual QStringList forwardDeclarations() const = 0;
+ virtual void setForwardDeclarations( const QStringList &lst ) = 0;
+ virtual QStringList signalList() const = 0;
+ virtual void setSignalList( const QStringList &lst ) = 0;
+ virtual void addMenu( const QString &text, const QString &name ) = 0;
+ virtual void addMenuAction( const QString &menu, QAction *a ) = 0;
+ virtual void addMenuSeparator( const QString &menu ) = 0;
+ virtual void addToolBar( const QString &text, const QString &name ) = 0;
+ virtual void addToolBarAction( const QString &tb, QAction *a ) = 0;
+ virtual void addToolBarSeparator( const QString &tb ) = 0;
+
+ virtual void onModificationChange( QObject *receiver, const char *slot ) = 0;
+};
+
+struct DesignerSourceFile
+{
+ virtual QString fileName() const = 0;
+};
+
+struct DesignerDock
+{
+ virtual QDockWindow *dockWindow() const = 0;
+};
+
+struct DesignerOutputDock
+{
+ virtual QWidget *addView( const QString &pageName ) = 0;
+ virtual void appendDebug( const QString & ) = 0;
+ virtual void clearDebug() = 0;
+ virtual void appendError( const QString &, int ) = 0;
+ virtual void clearError() = 0;
+};
+
+#endif
diff --git a/tools/designer/interfaces/editorinterface.h b/tools/designer/interfaces/editorinterface.h
new file mode 100644
index 0000000..4c3cb7d
--- /dev/null
+++ b/tools/designer/interfaces/editorinterface.h
@@ -0,0 +1,109 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef EDITORINTERFACE_H
+#define EDITORINTERFACE_H
+
+//
+// W A R N I N G -- PRIVATE INTERFACES
+// --------------------------------------
+//
+// This file and the interfaces declared in the file are not
+// public. It exists for internal purpose. This header file and
+// interfaces may change from version to version (even binary
+// incompatible) without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#include <private/qcom_p.h>
+#include <qmap.h>
+#include <qvaluelist.h>
+
+class QWidget;
+class QObjectList;
+class QObject;
+
+// {8668161a-6037-4220-86b6-ccaa20127df8}
+#ifndef IID_Editor
+#define IID_Editor QUuid( 0x8668161a, 0x6037, 0x4220, 0x86, 0xb6, 0xcc, 0xaa, 0x20, 0x12, 0x7d, 0xf8 )
+#endif
+
+struct EditorInterface : public QUnknownInterface
+{
+ enum Mode
+ {
+ Editing,
+ Debugging
+ };
+
+ virtual QWidget *editor( bool readOnly,
+ QWidget *parent,
+ QUnknownInterface *designerIface ) = 0;
+
+ virtual void setText( const QString &txt ) = 0;
+ virtual QString text() const = 0;
+ virtual bool isUndoAvailable() const = 0;
+ virtual bool isRedoAvailable() const = 0;
+ virtual void undo() = 0;
+ virtual void redo() = 0;
+ virtual void cut() = 0;
+ virtual void copy() = 0;
+ virtual void paste() = 0;
+ virtual void selectAll() = 0;
+ virtual bool find( const QString &expr, bool cs, bool wo, bool forward, bool startAtCursor ) = 0;
+ virtual bool replace( const QString &find, const QString &replace, bool cs, bool wo, bool forward, bool startAtCursor, bool replaceAll ) = 0;
+ virtual void gotoLine( int line ) = 0;
+ virtual void indent() = 0;
+ virtual void scrollTo( const QString &txt, const QString &first ) = 0;
+ virtual void splitView() = 0;
+ virtual void setContext( QObject *this_ ) = 0;
+ virtual void setError( int line ) = 0;
+ virtual void setStep( int line ) = 0;
+ virtual void setStackFrame( int line ) = 0;
+ virtual void clearStep() = 0;
+ virtual void clearStackFrame() = 0;
+ virtual void readSettings() = 0;
+ virtual void setModified( bool m ) = 0;
+ virtual bool isModified() const = 0;
+ virtual int numLines() const = 0;
+ virtual void breakPoints( QValueList<uint> &l ) const = 0;
+ virtual void setBreakPoints( const QValueList<uint> &l ) = 0;
+ virtual void setMode( Mode m ) = 0;
+
+ virtual void onBreakPointChange( QObject *receiver, const char *slot ) = 0;
+
+};
+
+#endif
diff --git a/tools/designer/interfaces/filterinterface.h b/tools/designer/interfaces/filterinterface.h
new file mode 100644
index 0000000..8c7ab2e
--- /dev/null
+++ b/tools/designer/interfaces/filterinterface.h
@@ -0,0 +1,75 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef FILTERINTERFACE_H
+#define FILTERINTERFACE_H
+
+#include <private/qcom_p.h>
+
+// {ea8cb381-59b5-44a8-bae5-9bea8295762a}
+#ifndef IID_ImportFilter
+#define IID_ImportFilter QUuid( 0xea8cb381, 0x59b5, 0x44a8, 0xba, 0xe5, 0x9b, 0xea, 0x82, 0x95, 0x76, 0x2a )
+#endif
+
+/*! If you write a filter plugin to import dialogs or other user
+ interfaces from a different format than .ui into the Qt Designer,
+ implement this interface in that plugin.
+
+ You also have to implement the function featureList() (\sa
+ QFeatureListInterface) and return there all filters (names of it)
+ which this interface provides.
+*/
+
+struct ImportFilterInterface : public QFeatureListInterface
+{
+ /*! This function is called by Qt Designer to open the file \a
+ filename using the filter \a filter. Qt Designer expects to get
+ back one or more .ui files, which it can open then. In the
+ implementation of the interface you have to return these
+ filenames, which the filter created, in this function.*/
+ virtual QStringList import( const QString &filter, const QString &filename ) = 0;
+};
+
+// *************** INTERNAL *************************
+
+// {c32a07e0-b006-471e-afca-d227457a1280}
+#ifndef IID_ExportFilterInterface
+#define IID_ExportFilterInterface QUuid( 0xc32a07e0, 0xb006, 0x471e, 0xaf, 0xca, 0xd2, 0x27, 0x45, 0x7a, 0x12, 0x80 )
+#endif
+
+struct ExportFilterInterface : public QFeatureListInterface
+{
+// virtual QStringList export( const QString& filter, const QString& filename ) = 0;
+};
+
+#endif
diff --git a/tools/designer/interfaces/interpreterinterface.h b/tools/designer/interfaces/interpreterinterface.h
new file mode 100644
index 0000000..dbda2f0
--- /dev/null
+++ b/tools/designer/interfaces/interpreterinterface.h
@@ -0,0 +1,66 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef INTERPRETERINTERFACE_H
+#define INTERPRETERINTERFACE_H
+
+//
+// W A R N I N G -- PRIVATE INTERFACES
+// --------------------------------------
+//
+// This file and the interfaces declared in the file are not
+// public. It exists for internal purpose. This header file and
+// interfaces may change from version to version (even binary
+// incompatible) without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#include <private/qcom_p.h>
+
+class QObject;
+
+// {11cad9ec-4e3c-418b-8e90-e1b8c0c1f48f}
+#ifndef IID_Interpreter
+#define IID_Interpreter QUuid( 0x11cad9ec, 0x4e3c, 0x418b, 0x8e, 0x90, 0xe1, 0xb8, 0xc0, 0xc1, 0xf4, 0x8f )
+#endif
+
+struct InterpreterInterface : public QUnknownInterface
+{
+ virtual void setBreakPoints( QObject *obj, const QValueList<uint> &lst ) = 0;
+};
+
+
+
+#endif
diff --git a/tools/designer/interfaces/languageinterface.h b/tools/designer/interfaces/languageinterface.h
new file mode 100644
index 0000000..acb5e89
--- /dev/null
+++ b/tools/designer/interfaces/languageinterface.h
@@ -0,0 +1,138 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef LANGUAGEINTERFACE_H
+#define LANGUAGEINTERFACE_H
+
+//
+// W A R N I N G -- PRIVATE INTERFACES
+// --------------------------------------
+//
+// This file and the interfaces declared in the file are not
+// public. It exists for internal purpose. This header file and
+// interfaces may change from version to version (even binary
+// incompatible) without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#include <private/qcom_p.h>
+#include <qvaluelist.h>
+#include <qstringlist.h>
+#include <qmap.h>
+#include <qstrlist.h>
+
+// {f208499a-6f69-4883-9219-6e936e55a330}
+#ifndef IID_Language
+#define IID_Language QUuid( 0xf208499a, 0x6f69, 0x4883, 0x92, 0x19, 0x6e, 0x93, 0x6e, 0x55, 0xa3, 0x30 )
+#endif
+
+struct LanguageInterface : public QUnknownInterface
+{
+ struct Function
+ {
+ QString name;
+ QString body;
+ QString returnType;
+ QString comments;
+ int start;
+ int end;
+ QString access;
+ bool operator==( const Function &f ) const {
+ return ( name == f.name &&
+ body == f.body &&
+ returnType == f.returnType &&
+ comments == f.comments );
+ }
+ };
+
+ struct Connection
+ {
+ QString sender;
+ QString signal;
+ QString slot;
+ bool operator==( const Connection &c ) const {
+ return ( sender == c.sender &&
+ signal == c.signal &&
+ slot == c.slot );
+ }
+ };
+
+ enum Support
+ {
+ ReturnType,
+ ConnectionsToCustomSlots,
+ CompressProject
+ };
+
+ virtual void functions( const QString &code, QValueList<Function> *funcs ) const = 0;
+ virtual void connections( const QString &code, QValueList<Connection> *connections ) const = 0;
+ virtual QString createFunctionStart( const QString &className, const QString &func,
+ const QString &returnType, const QString &access ) = 0;
+ virtual QString createArguments( const QString &cpp_signature ) = 0;
+ virtual QString createEmptyFunction() = 0;
+ virtual QStringList definitions() const = 0;
+ virtual QStringList definitionEntries( const QString &definition, QUnknownInterface *designerIface ) const = 0;
+ virtual void setDefinitionEntries( const QString &definition, const QStringList &entries, QUnknownInterface *designerIface ) = 0;
+ virtual bool supports( Support s ) const = 0;
+ virtual QStringList fileFilterList() const = 0;
+ virtual QStringList fileExtensionList() const = 0;
+ virtual void preferedExtensions( QMap<QString, QString> &extensionMap ) const = 0;
+ virtual QString projectKeyForExtension( const QString &extension ) const = 0;
+ virtual void sourceProjectKeys( QStringList &keys ) const = 0;
+ virtual QString cleanSignature( const QString &sig ) = 0;
+ virtual void loadFormCode( const QString &form, const QString &filename,
+ QValueList<Function> &functions,
+ QStringList &vars,
+ QValueList<Connection> &connections ) = 0;
+ virtual QString formCodeExtension() const = 0;
+
+ virtual bool canConnect( const QString &signal, const QString &slot ) = 0;
+
+ virtual void compressProject( const QString &projectFile, const QString &compressedFile,
+ bool withWarning ) = 0;
+ virtual QString uncompressProject( const QString &projectFile, const QString &destDir ) = 0;
+ virtual QString aboutText() const = 0;
+
+ virtual void addConnection( const QString &sender, const QString &signal,
+ const QString &receiver, const QString &slot,
+ QString *code ) = 0;
+ virtual void removeConnection( const QString &sender, const QString &signal,
+ const QString &receiver, const QString &slot,
+ QString *code ) = 0;
+ virtual QStrList signalNames( QObject *obj ) const = 0;
+
+};
+
+#endif
diff --git a/tools/designer/interfaces/preferenceinterface.h b/tools/designer/interfaces/preferenceinterface.h
new file mode 100644
index 0000000..aa8b84e
--- /dev/null
+++ b/tools/designer/interfaces/preferenceinterface.h
@@ -0,0 +1,75 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PREFERENCEINTERFACE_H
+#define PREFERENCEINTERFACE_H
+
+//
+// W A R N I N G -- PRIVATE INTERFACES
+// --------------------------------------
+//
+// This file and the interfaces declared in the file are not
+// public. It exists for internal purpose. This header file and
+// interfaces may change from version to version (even binary
+// incompatible) without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#include <private/qcom_p.h>
+#include <qwidgetlist.h>
+#include <qcstring.h>
+
+// {5c168ee7-4bee-469f-9995-6afdb04ce5a2}
+#ifndef IID_Preference
+#define IID_Preference QUuid( 0x5c168ee7, 0x4bee, 0x469f, 0x99, 0x95, 0x6a, 0xfd, 0xb0, 0x4c, 0xe5, 0xa2 )
+#endif
+
+struct PreferenceInterface : public QUnknownInterface
+{
+ struct Preference
+ {
+ QWidget *tab;
+ QString title;
+ QObject *receiver;
+ const char *init_slot;
+ const char *accept_slot;
+ };
+
+ virtual Preference *preference() = 0;
+ virtual void connectTo( QUnknownInterface *appInterface ) = 0;
+ virtual void deletePreferenceObject( Preference * ) = 0;
+};
+
+#endif
diff --git a/tools/designer/interfaces/projectsettingsiface.h b/tools/designer/interfaces/projectsettingsiface.h
new file mode 100644
index 0000000..5e814c6
--- /dev/null
+++ b/tools/designer/interfaces/projectsettingsiface.h
@@ -0,0 +1,76 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PROJECTSETTINGSIFACE_H
+#define PROJECTSETTINGSIFACE_H
+
+//
+// W A R N I N G -- PRIVATE INTERFACES
+// --------------------------------------
+//
+// This file and the interfaces declared in the file are not
+// public. It exists for internal purpose. This header file and
+// interfaces may change from version to version (even binary
+// incompatible) without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#include <private/qcom_p.h>
+#include <qwidgetlist.h>
+#include <qcstring.h>
+
+// {d332785d-17fb-4894-84fe-50dbd0ad9512}
+#ifndef IID_ProjectSettings
+#define IID_ProjectSettings QUuid( 0xd332785d, 0x17fb, 0x4894, 0x84, 0xfe, 0x50, 0xdb, 0xd0, 0xad, 0x95, 0x12 )
+#endif
+
+struct ProjectSettingsInterface : public QUnknownInterface
+{
+ struct ProjectSettings
+ {
+ QWidget *tab;
+ QString title;
+ QObject *receiver;
+ const char *init_slot;
+ const char *accept_slot;
+ };
+
+ virtual ProjectSettings *projectSetting() = 0;
+ virtual QStringList projectSettings() const = 0;
+ virtual void connectTo( QUnknownInterface *appInterface ) = 0;
+ virtual void deleteProjectSettingsObject( ProjectSettings * ) = 0;
+};
+
+#endif
diff --git a/tools/designer/interfaces/sourcetemplateiface.h b/tools/designer/interfaces/sourcetemplateiface.h
new file mode 100644
index 0000000..01a5e75
--- /dev/null
+++ b/tools/designer/interfaces/sourcetemplateiface.h
@@ -0,0 +1,72 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef SOURCETEMPLATEIFACE_H
+#define SOURCETEMPLATEIFACE_H
+
+//
+// W A R N I N G -- PRIVATE INTERFACES
+// --------------------------------------
+//
+// This file and the interfaces declared in the file are not
+// public. It exists for internal purpose. This header file and
+// interfaces may change from version to version (even binary
+// incompatible) without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#include <private/qcom_p.h>
+#include <qstring.h>
+
+// {1b3446a4-1c71-424b-8789-1f34eb5697d8}
+#ifndef IID_SourceTemplate
+#define IID_SourceTemplate QUuid( 0x1b3446a4, 0x1c71, 0x424b, 0x87, 0x89, 0x1f, 0x34, 0xeb, 0x56, 0x97, 0xd8 )
+#endif
+
+struct SourceTemplateInterface : public QFeatureListInterface
+{
+ struct Source
+ {
+ QString code;
+ enum Type { FileName, Unnamed, Invalid } type;
+ QString filename;
+ QString extension;
+ };
+ virtual Source create( const QString &templ, QUnknownInterface *appIface ) = 0;
+ virtual QString language( const QString &templ ) const = 0;
+
+};
+
+#endif
diff --git a/tools/designer/interfaces/templatewizardiface.h b/tools/designer/interfaces/templatewizardiface.h
new file mode 100644
index 0000000..5a89293
--- /dev/null
+++ b/tools/designer/interfaces/templatewizardiface.h
@@ -0,0 +1,67 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef TEMPLATEWIZARDIFACE_H
+#define TEMPLATEWIZARDIFACE_H
+
+//
+// W A R N I N G -- PRIVATE INTERFACES
+// --------------------------------------
+//
+// This file and the interfaces declared in the file are not
+// public. It exists for internal purpose. This header file and
+// interfaces may change from version to version (even binary
+// incompatible) without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#include <private/qcom_p.h>
+
+class QWidget;
+struct DesignerFormWindow;
+
+// {983d3eab-fea3-49cc-97ad-d8cc89b7c17b}
+#ifndef IID_TemplateWizard
+#define IID_TemplateWizard QUuid( 0x983d3eab, 0xfea3, 0x49cc, 0x97, 0xad, 0xd8, 0xcc, 0x89, 0xb7, 0xc1, 0x7b )
+#endif
+
+class TemplateWizardInterface : public QFeatureListInterface
+{
+public:
+ virtual void setup( const QString &templ, QWidget *widget, DesignerFormWindow *fw, QUnknownInterface *appIface ) = 0;
+
+};
+
+#endif
diff --git a/tools/designer/interfaces/widgetinterface.h b/tools/designer/interfaces/widgetinterface.h
new file mode 100644
index 0000000..9a0682a
--- /dev/null
+++ b/tools/designer/interfaces/widgetinterface.h
@@ -0,0 +1,42 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef WIDGETINTERFACE_H
+#define WIDGETINTERFACE_H
+
+#include <private/qwidgetinterface_p.h>
+
+#define WidgetInterface QWidgetFactoryInterface
+#define IID_Widget IID_QWidgetFactory
+
+#endif
diff --git a/tools/designer/plugins/cppeditor/common.cpp b/tools/designer/plugins/cppeditor/common.cpp
new file mode 100644
index 0000000..07b52df
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/common.cpp
@@ -0,0 +1,111 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "editorinterfaceimpl.h"
+#include "languageinterfaceimpl.h"
+#include "preferenceinterfaceimpl.h"
+#include "projectsettingsinterfaceimpl.h"
+#include "sourcetemplateinterfaceimpl.h"
+
+class CommonInterface : public QComponentInformationInterface
+{
+public:
+ CommonInterface();
+ virtual ~CommonInterface();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+ Q_REFCOUNT;
+
+ QString name() const { return "C++"; }
+ QString description() const { return "C++ Integration"; }
+ QString version() const { return "0.1"; }
+ QString author() const { return "Trolltech AS"; }
+
+private:
+ LanguageInterfaceImpl *langIface;
+ PreferenceInterfaceImpl *prefIface;
+ ProjectSettingsInterfaceImpl *proIface;
+ SourceTemplateInterfaceImpl *srcIface;
+
+};
+
+CommonInterface::CommonInterface()
+{
+ langIface = new LanguageInterfaceImpl( this );
+ langIface->addRef();
+ prefIface = new PreferenceInterfaceImpl( this );
+ prefIface->addRef();
+ proIface = new ProjectSettingsInterfaceImpl( this );
+ proIface->addRef();
+ srcIface = new SourceTemplateInterfaceImpl;
+ srcIface->addRef();
+}
+
+CommonInterface::~CommonInterface()
+{
+ langIface->release();
+ prefIface->release();
+ proIface->release();
+ srcIface->release();
+}
+
+QRESULT CommonInterface::queryInterface( const QUuid &uuid, QUnknownInterface** iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)this;
+ else if ( uuid == IID_QComponentInformation )
+ *iface = (QComponentInformationInterface*)this;
+ else if ( uuid == IID_Editor )
+ *iface = new EditorInterfaceImpl;
+ else if ( uuid == IID_Language )
+ *iface = langIface;
+ else if ( uuid == IID_Preference )
+ *iface = prefIface;
+ else if ( uuid == IID_ProjectSettings )
+ *iface = proIface;
+ else if ( uuid == IID_SourceTemplate )
+ *iface = srcIface;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+
+Q_EXPORT_COMPONENT()
+{
+ Q_CREATE_INSTANCE( CommonInterface )
+}
diff --git a/tools/designer/plugins/cppeditor/cppbrowser.cpp b/tools/designer/plugins/cppeditor/cppbrowser.cpp
new file mode 100644
index 0000000..3d004b5
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/cppbrowser.cpp
@@ -0,0 +1,78 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "cppbrowser.h"
+#include <private/qrichtext_p.h>
+#include <qprocess.h>
+#include <qmainwindow.h>
+#include <qstatusbar.h>
+#include <editor.h>
+
+CppEditorBrowser::CppEditorBrowser( Editor *e )
+ : EditorBrowser( e )
+{
+}
+
+void CppEditorBrowser::showHelp( const QString &w )
+{
+ QString word( w );
+ if ( word[ 0 ] == 'Q' ) {
+ if ( word[ (int)word.length() - 1 ] == '&' ||
+ word[ (int)word.length() - 1 ] == '*' )
+ word.remove( word.length() - 1, 1 );
+ word = word.lower() + ".html";
+ QStringList lst;
+ lst << "assistant" << "-file" << word;
+ QProcess proc( lst );
+ proc.start();
+ return;
+ }
+
+ if ( word.find( '(' ) != -1 ) {
+ QString txt = "::" + word.left( word.find( '(' ) );
+ QTextDocument *doc = curEditor->document();
+ QTextParagraph *p = doc->firstParagraph();
+ while ( p ) {
+ if ( p->string()->toString().find( txt ) != -1 ) {
+ curEditor->setCursorPosition( p->paragId(), 0 );
+ return;
+ }
+ p = p->next();
+ }
+ }
+
+ QMainWindow *mw = ::qt_cast<QMainWindow*>(curEditor->topLevelWidget());
+ if ( mw )
+ mw->statusBar()->message( tr( "Nothing available for '%1'" ).arg( w ), 1500 );
+}
diff --git a/tools/designer/plugins/cppeditor/cppbrowser.h b/tools/designer/plugins/cppeditor/cppbrowser.h
new file mode 100644
index 0000000..92f07b9
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/cppbrowser.h
@@ -0,0 +1,50 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef CPPBROWSER_H
+#define CPPBROWSER_H
+
+#include <browser.h>
+
+class CppEditorBrowser : public EditorBrowser
+{
+ Q_OBJECT
+
+public:
+ CppEditorBrowser( Editor *e );
+ void showHelp( const QString &word );
+
+};
+
+#endif
diff --git a/tools/designer/plugins/cppeditor/cppcompletion.cpp b/tools/designer/plugins/cppeditor/cppcompletion.cpp
new file mode 100644
index 0000000..464aedb
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/cppcompletion.cpp
@@ -0,0 +1,220 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "cppcompletion.h"
+#include <qobject.h>
+#include <qmetaobject.h>
+#include <qobjectlist.h>
+#include <qregexp.h>
+
+CppEditorCompletion::CppEditorCompletion( Editor *e )
+ : EditorCompletion( e )
+{
+}
+
+bool CppEditorCompletion::doObjectCompletion( const QString &objName )
+{
+ if ( !ths )
+ return FALSE;
+ QString object( objName );
+ int i = -1;
+ if ( ( i = object.findRev( "->" ) ) != -1 )
+ object = object.mid( i + 2 );
+ if ( ( i = object.findRev( "." ) ) != -1 )
+ object = object.mid( i + 1 );
+ object = object.simplifyWhiteSpace();
+ QObject *obj = 0;
+ if ( ths->name() == object || object == "this" ) {
+ obj = ths;
+ } else {
+ obj = ths->child( object );
+ }
+
+ if ( !obj )
+ return FALSE;
+
+ QValueList<CompletionEntry> lst;
+
+ if ( obj->children() ) {
+ for ( QObjectListIt cit( *obj->children() ); cit.current(); ++cit ) {
+ QString s( cit.current()->name() );
+ if ( s.find( " " ) == -1 && s.find( "qt_" ) == -1 && s.find( "unnamed" ) == -1 ) {
+ CompletionEntry c;
+ c.type = "variable";
+ c.text = s;
+ c.prefix = "";
+ lst << c;
+ }
+ }
+ }
+
+ QStrList props = obj->metaObject()->propertyNames( TRUE );
+ for ( QPtrListIterator<char> pit( props ); pit.current(); ++pit ) {
+ QString f( pit.current() );
+ QChar c = f[ 0 ];
+ f.remove( (uint)0, 1 );
+ f.prepend( c.upper() );
+ f.prepend( "set" );
+
+ CompletionEntry ce;
+ ce.type = "property";
+ ce.text = f;
+ ce.postfix = "()";
+
+ if ( lst.find( ce ) == lst.end() )
+ lst << ce;
+ }
+
+ QStrList slts = obj->metaObject()->slotNames( TRUE );
+ for ( QPtrListIterator<char> sit( slts ); sit.current(); ++sit ) {
+ QString f( sit.current() );
+ f = f.left( f.find( "(" ) );
+ CompletionEntry c;
+ c.type = "slot";
+ c.text = f;
+ c.postfix = "()";
+ if ( lst.find( c ) == lst.end() )
+ lst << c;
+ }
+
+ if ( lst.isEmpty() )
+ return FALSE;
+
+ showCompletion( lst );
+ return TRUE;
+}
+
+QValueList<QStringList> CppEditorCompletion::functionParameters( const QString &expr, QChar &separator,
+ QString &prefix, QString &postfix )
+{
+ Q_UNUSED( prefix );
+ Q_UNUSED( postfix );
+ separator = ',';
+ if ( !ths )
+ return QValueList<QStringList>();
+ QString func;
+ QString objName;
+ int i = -1;
+
+ i = expr.findRev( "->" );
+ if ( i == -1 )
+ i = expr.findRev( "." );
+ else
+ ++i;
+ if ( i == -1 ) {
+ i = expr.findRev( " " );
+
+ if ( i == -1 )
+ i = expr.findRev( "\t" );
+ else
+ objName = ths->name();
+
+ if ( i == -1 && expr[ 0 ] != ' ' && expr[ 0 ] != '\t' )
+ objName = ths->name();
+ }
+
+ if ( !objName.isEmpty() ) {
+ func = expr.mid( i + 1 );
+ func = func.simplifyWhiteSpace();
+ } else {
+ func = expr.mid( i + 1 );
+ func = func.simplifyWhiteSpace();
+ QString ex( expr );
+ ex.remove( i, 0xFFFFFF );
+ if ( ex[ (int)ex.length() - 1 ] == '-' )
+ ex.remove( ex.length() - 1, 1 );
+ int j = -1;
+ j = ex.findRev( "->" );
+ if ( j == -1 )
+ j = ex.findRev( "." );
+ else
+ ++j;
+ if ( j == -1 ) {
+ j = ex.findRev( " " );
+
+ if ( j == -1 )
+ j = ex.findRev( "\t" );
+ else
+ objName = ths->name();
+
+ if ( j == -1 )
+ objName = ths->name();
+ }
+ objName = ex.mid( j + 1 );
+ objName = objName.simplifyWhiteSpace();
+ }
+
+ QObject *obj = 0;
+ if ( ths->name() == objName || objName == "this" ) {
+ obj = ths;
+ } else {
+ obj = ths->child( objName );
+ }
+
+ if ( !obj )
+ return QValueList<QStringList>();
+
+ QStrList slts = obj->metaObject()->slotNames( TRUE );
+ for ( QPtrListIterator<char> sit( slts ); sit.current(); ++sit ) {
+ QString f( sit.current() );
+ f = f.left( f.find( "(" ) );
+ if ( f == func ) {
+ f = QString( sit.current() );
+ f.remove( (uint)0, f.find( "(" ) + 1 );
+ f = f.left( f.find( ")" ) );
+ QStringList lst = QStringList::split( ',', f );
+ if ( !lst.isEmpty() ) {
+ QValueList<QStringList> l;
+ l << lst;
+ return l;
+ }
+ }
+ }
+
+ const QMetaProperty *prop =
+ obj->metaObject()->
+ property( obj->metaObject()->findProperty( func[ 3 ].lower() + func.mid( 4 ), TRUE ), TRUE );
+ if ( prop ) {
+ QValueList<QStringList> l;
+ l << QStringList( prop->type() );
+ return l;
+ }
+
+ return QValueList<QStringList>();
+}
+
+void CppEditorCompletion::setContext( QObject *this_ )
+{
+ ths = this_;
+}
diff --git a/tools/designer/plugins/cppeditor/cppcompletion.h b/tools/designer/plugins/cppeditor/cppcompletion.h
new file mode 100644
index 0000000..170c850
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/cppcompletion.h
@@ -0,0 +1,60 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef CPPCOMPLETION_H
+#define CPPCOMPLETION_H
+
+#include <completion.h>
+#include <qguardedptr.h>
+
+class CppEditorCompletion : public EditorCompletion
+{
+ Q_OBJECT
+
+public:
+ CppEditorCompletion( Editor *e );
+
+#if defined(Q_USING)
+ using EditorCompletion::doObjectCompletion;
+#endif
+ bool doObjectCompletion( const QString &object );
+ QValueList<QStringList> functionParameters( const QString &func, QChar &, QString &prefix, QString &postfix );
+ void setContext( QObject *this_ );
+
+private:
+ QGuardedPtr<QObject> ths;
+
+};
+
+#endif
diff --git a/tools/designer/plugins/cppeditor/cppeditor.cpp b/tools/designer/plugins/cppeditor/cppeditor.cpp
new file mode 100644
index 0000000..37aa9cc
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/cppeditor.cpp
@@ -0,0 +1,168 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "cppeditor.h"
+#include "syntaxhighliter_cpp.h"
+#include <cindent.h>
+#include "cppcompletion.h"
+#include "cppbrowser.h"
+#include <parenmatcher.h>
+#include <qsettings.h>
+#include <qpopupmenu.h>
+#include <qinputdialog.h>
+#include <designerinterface.h>
+
+CppEditor::CppEditor( const QString &fn, QWidget *parent, const char *name, DesignerInterface *i )
+ : Editor( fn, parent, name ), dIface( i )
+{
+ if ( dIface )
+ dIface->addRef();
+ document()->setPreProcessor( new SyntaxHighlighter_CPP );
+ document()->setIndent( (indent = new CIndent) );
+ completion = new CppEditorCompletion( this );
+ browser = new CppEditorBrowser( this );
+ int j = 0;
+ while ( SyntaxHighlighter_CPP::keywords[ j ] != QString::null )
+ completion->addCompletionEntry( SyntaxHighlighter_CPP::keywords[ j++ ], 0, FALSE );
+ configChanged();
+}
+
+CppEditor::~CppEditor()
+{
+ delete completion;
+ if ( dIface )
+ dIface->release();
+}
+
+void CppEditor::configChanged()
+{
+ QString path = "/Trolltech/CppEditor/";
+ QMap<QString, ConfigStyle> styles = Config::readStyles( path );
+ config()->styles = styles;
+ ( (SyntaxHighlighter_CPP*)document()->preProcessor() )->updateStyles( config()->styles );
+
+ completion->setEnabled( Config::completion( path ) );
+ parenMatcher->setEnabled( Config::parenMatching( path ) );
+ if ( Config::wordWrap( path ) ) {
+ if ( hScrollBarMode() != AlwaysOff ) {
+ document()->setFormatter( new QTextFormatterBreakInWords );
+ setHScrollBarMode( AlwaysOff );
+ }
+ } else {
+ if ( hScrollBarMode() != AlwaysOn ) {
+ QTextFormatterBreakWords *f = new QTextFormatterBreakWords;
+ f->setWrapEnabled( FALSE );
+ document()->setFormatter( f );
+ setHScrollBarMode( AlwaysOn );
+ }
+ }
+
+ setFont( ( (SyntaxHighlighter_CPP*)document()->preProcessor() )->format( 0 )->font() );
+
+ indent->setTabSize( Config::indentTabSize( path ) );
+ indent->setIndentSize( Config::indentIndentSize( path ) );
+ indent->setKeepTabs( Config::indentKeepTabs( path ) );
+ indent->setAutoIndent( Config::indentAutoIndent( path ) );
+ if ( !Config::indentAutoIndent( path ) )
+ document()->setIndent( 0 );
+ else
+ document()->setIndent( indent );
+
+ document()->setTabStops( ( (SyntaxHighlighter_CPP*)document()->preProcessor() )->format( QTextPreProcessor::Standard )->width( 'x' ) * Config::indentTabSize( path ) );
+
+ Editor::configChanged();
+}
+
+QPopupMenu *CppEditor::createPopupMenu( const QPoint &p )
+{
+ QPopupMenu *m = Editor::createPopupMenu( p );
+ m->insertSeparator();
+ int adddeclid = m->insertItem( tr( "Add Include File (in Declaration)..." ), this, SLOT( addInclDecl() ) );
+ int addimplid = m->insertItem( tr( "Add Include File (in Implementation)..." ), this, SLOT( addInclImpl() ) );
+ int addforid = m->insertItem( tr( "Add Forward Declaration..." ), this, SLOT( addForward() ) );
+ if ( !dIface->currentForm() ) {
+ m->setItemEnabled( adddeclid, FALSE );
+ m->setItemEnabled( addimplid, FALSE );
+ m->setItemEnabled( addforid, FALSE );
+ }
+ return m;
+}
+
+void CppEditor::addInclDecl()
+{
+ if ( !dIface )
+ return;
+ QString s = QInputDialog::getText( tr( "Add Include File (In Declaration)" ),
+ tr( "Input this using the format <b>&lt;include.h&gt;</b> or <b>\"include.h\"</b>" ) );
+ if ( s.isEmpty() )
+ return;
+ DesignerFormWindow *form = dIface->currentForm();
+ QStringList lst = form->declarationIncludes();
+ lst << s;
+ form->setDeclarationIncludes( lst );
+}
+
+void CppEditor::addInclImpl()
+{
+ if ( !dIface )
+ return;
+ QString s = QInputDialog::getText( tr( "Add Include File (In Implementation)" ),
+ tr( "Input this using the format <b>&lt;include.h&gt;</b> or <b>\"include.h\"</b>" ) );
+ if ( s.isEmpty() )
+ return;
+ DesignerFormWindow *form = dIface->currentForm();
+ QStringList lst = form->implementationIncludes();
+ lst << s;
+ form->setImplementationIncludes( lst );
+}
+
+void CppEditor::addForward()
+{
+ if ( !dIface )
+ return;
+ QString s = QInputDialog::getText( tr( "Add Forward Declaration" ),
+ tr( "Input this using the format <b>ClassName;</b>" ) );
+ if ( s.isEmpty() )
+ return;
+ DesignerFormWindow *form = dIface->currentForm();
+ QStringList lst = form->forwardDeclarations();
+ lst << s;
+ form->setForwardDeclarations( lst );
+}
+
+void CppEditor::paste()
+{
+ Editor::paste();
+ emit intervalChanged();
+}
diff --git a/tools/designer/plugins/cppeditor/cppeditor.h b/tools/designer/plugins/cppeditor/cppeditor.h
new file mode 100644
index 0000000..05d7930
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/cppeditor.h
@@ -0,0 +1,78 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef CPPEDITOR_H
+#define CPPEDITOR_H
+
+#include <editor.h>
+
+class EditorCompletion;
+class EditorBrowser;
+struct DesignerInterface;
+class CIndent;
+
+class CppEditor : public Editor
+{
+ Q_OBJECT
+
+public:
+ CppEditor( const QString &fn, QWidget *parent, const char *name, DesignerInterface *i );
+ ~CppEditor();
+
+ virtual EditorCompletion *completionManager() { return completion; }
+ virtual EditorBrowser *browserManager() { return browser; }
+ void configChanged();
+
+ bool supportsBreakPoints() const { return FALSE; }
+#if defined(Q_USING)
+ using QTextEdit::createPopupMenu;
+#endif
+ QPopupMenu *createPopupMenu( const QPoint &p );
+
+ void paste();
+
+private slots:
+ void addInclDecl();
+ void addInclImpl();
+ void addForward();
+
+protected:
+ EditorCompletion *completion;
+ EditorBrowser *browser;
+ DesignerInterface *dIface;
+ CIndent *indent;
+
+};
+
+#endif
diff --git a/tools/designer/plugins/cppeditor/cppeditor.pro b/tools/designer/plugins/cppeditor/cppeditor.pro
new file mode 100644
index 0000000..391c1d7
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/cppeditor.pro
@@ -0,0 +1,21 @@
+TEMPLATE = lib
+CONFIG += qt warn_on plugin
+
+SOURCES += cppeditor.cpp syntaxhighliter_cpp.cpp cppcompletion.cpp editorinterfaceimpl.cpp languageinterfaceimpl.cpp common.cpp preferenceinterfaceimpl.cpp yyreg.cpp cppbrowser.cpp projectsettingsinterfaceimpl.cpp sourcetemplateinterfaceimpl.cpp
+HEADERS += cppeditor.h syntaxhighliter_cpp.h cppcompletion.h editorinterfaceimpl.h languageinterfaceimpl.h preferenceinterfaceimpl.h yyreg.h cppbrowser.h projectsettingsinterfaceimpl.h sourcetemplateinterfaceimpl.h
+FORMS = projectsettings.ui mainfilesettings.ui
+
+TARGET = cppeditor
+DESTDIR = ../../../../plugins/designer
+VERSION = 1.0.0
+
+INCLUDEPATH += ../../interfaces ../../editor $$QT_BUILD_TREE/tools/designer/editor
+
+hpux-* {
+ LIBS += $$QT_BUILD_TREE/lib/libeditor.a
+} else {
+ LIBS += -L$$QT_BUILD_TREE/lib -leditor
+}
+
+target.path += $$plugins.path/designer
+INSTALLS += target
diff --git a/tools/designer/plugins/cppeditor/editorinterfaceimpl.cpp b/tools/designer/plugins/cppeditor/editorinterfaceimpl.cpp
new file mode 100644
index 0000000..d396720
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/editorinterfaceimpl.cpp
@@ -0,0 +1,338 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "editorinterfaceimpl.h"
+#include <viewmanager.h>
+#include "cppeditor.h"
+#include <private/qrichtext_p.h>
+#include <qapplication.h>
+#include "completion.h"
+#include <designerinterface.h>
+#include <qtimer.h>
+
+EditorInterfaceImpl::EditorInterfaceImpl()
+ : EditorInterface(), viewManager( 0 ), dIface( 0 )
+{
+ updateTimer = new QTimer( this );
+ connect( updateTimer, SIGNAL( timeout() ),
+ this, SLOT( update() ) );
+}
+
+EditorInterfaceImpl::~EditorInterfaceImpl()
+{
+ updateTimer->stop();
+ delete (ViewManager*)viewManager;
+ if ( dIface )
+ dIface->release();
+}
+
+QRESULT EditorInterfaceImpl::queryInterface( const QUuid &uuid, QUnknownInterface** iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)this;
+ else if ( uuid == IID_Editor )
+ *iface = (EditorInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+QWidget *EditorInterfaceImpl::editor( bool readonly,
+ QWidget *parent, QUnknownInterface *iface )
+{
+ if ( !viewManager ) {
+ ( (EditorInterfaceImpl*)this )->viewManager = new ViewManager( parent, 0 );
+ ( (EditorInterfaceImpl*)this )->viewManager->showMarkerWidget( FALSE );
+ if ( iface )
+ iface->queryInterface( IID_Designer, (QUnknownInterface**) &dIface );
+ CppEditor *e = new CppEditor( QString::null, viewManager, "editor", dIface );
+ e->setEditable( !readonly );
+ e->installEventFilter( this );
+ connect( e, SIGNAL( intervalChanged() ), this, SLOT( intervalChanged() ) );
+ QApplication::sendPostedEvents( viewManager, QEvent::ChildInserted );
+ }
+ return viewManager->currentView();
+}
+
+void EditorInterfaceImpl::setText( const QString &txt )
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ CppEditor *e = (CppEditor*)viewManager->currentView();
+ disconnect( e, SIGNAL( modificationChanged( bool ) ), this, SLOT( modificationChanged( bool ) ) );
+ e->setText( txt );
+ e->setModified( FALSE );
+ connect( e, SIGNAL( modificationChanged( bool ) ), this, SLOT( modificationChanged( bool ) ) );
+}
+
+QString EditorInterfaceImpl::text() const
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return QString::null;
+ QString txt = ( (CppEditor*)viewManager->currentView() )->text();
+ if ( !txt.isEmpty() && !txt.endsWith("\n") )
+ txt += "\n";
+ return txt;
+}
+
+bool EditorInterfaceImpl::isUndoAvailable() const
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return FALSE;
+ return ( (CppEditor*)viewManager->currentView() )->isUndoAvailable();
+}
+
+bool EditorInterfaceImpl::isRedoAvailable() const
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return FALSE;
+ return ( (CppEditor*)viewManager->currentView() )->isRedoAvailable();
+}
+
+void EditorInterfaceImpl::undo()
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->undo();
+}
+
+void EditorInterfaceImpl::redo()
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->redo();
+}
+
+void EditorInterfaceImpl::cut()
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->cut();
+}
+
+void EditorInterfaceImpl::copy()
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->copy();
+}
+
+void EditorInterfaceImpl::paste()
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->paste();
+}
+
+void EditorInterfaceImpl::selectAll()
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->selectAll();
+}
+
+bool EditorInterfaceImpl::find( const QString &expr, bool cs, bool wo, bool forward, bool startAtCursor )
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return FALSE;
+ CppEditor *e = (CppEditor*)viewManager->currentView();
+ if ( startAtCursor )
+ return e->find( expr, cs, wo, forward );
+ int dummy = 0;
+ return e->find( expr, cs, wo, forward, &dummy, &dummy );
+}
+
+bool EditorInterfaceImpl::replace( const QString &find, const QString &replace, bool cs, bool wo,
+ bool forward, bool startAtCursor, bool replaceAll )
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return FALSE;
+ CppEditor *e = (CppEditor*)viewManager->currentView();
+ bool ok = FALSE;
+ if ( startAtCursor ) {
+ ok = e->find( find, cs, wo, forward );
+ } else {
+ int dummy = 0;
+ ok = e->find( find, cs, wo, forward, &dummy, &dummy );
+ }
+
+ if ( ok ) {
+ e->removeSelectedText();
+ e->insert( replace, FALSE, FALSE );
+ }
+
+ if ( !replaceAll || !ok ) {
+ if ( ok )
+ e->setSelection( e->textCursor()->paragraph()->paragId(),
+ e->textCursor()->index() - replace.length(),
+ e->textCursor()->paragraph()->paragId(),
+ e->textCursor()->index() );
+ return ok;
+ }
+
+ bool ok2 = TRUE;
+ while ( ok2 ) {
+ ok2 = e->find( find, cs, wo, forward );
+ if ( ok2 ) {
+ e->removeSelectedText();
+ e->insert( replace, FALSE, FALSE );
+ }
+ }
+
+ return TRUE;
+}
+
+void EditorInterfaceImpl::gotoLine( int line )
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->setCursorPosition( line, 0 );
+}
+
+void EditorInterfaceImpl::indent()
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->QTextEdit::indent();
+}
+
+void EditorInterfaceImpl::splitView()
+{
+#if 0
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ QTextDocument *doc = ( (CppEditor*)viewManager->currentView() )->document();
+ CppEditor *editor = new CppEditor( QString::null, viewManager, "editor" );
+ editor->setDocument( doc );
+#endif
+}
+
+void EditorInterfaceImpl::scrollTo( const QString &txt, const QString & )
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->sync();
+ QTextDocument *doc = ( (CppEditor*)viewManager->currentView() )->document();
+ QTextParagraph *p = doc->firstParagraph();
+ while ( p ) {
+ if ( p->string()->toString().find( txt ) != -1 ) {
+ ( (CppEditor*)viewManager->currentView() )->setCursorPosition( p->paragId() + 2, 0 );
+ break;
+ }
+ p = p->next();
+ }
+ ( (CppEditor*)viewManager->currentView() )->setFocus();
+}
+
+void EditorInterfaceImpl::setContext( QObject *this_ )
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->completionManager()->setContext( this_ );
+}
+
+void EditorInterfaceImpl::setError( int line )
+{
+ if ( !viewManager )
+ return;
+ viewManager->setError( line );
+}
+
+void EditorInterfaceImpl::readSettings()
+{
+ if ( !viewManager )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->configChanged();
+}
+
+void EditorInterfaceImpl::modificationChanged( bool m )
+{
+ if ( viewManager && dIface )
+ dIface->setModified( m, viewManager->currentView() );
+}
+
+void EditorInterfaceImpl::setModified( bool m )
+{
+ if ( !viewManager )
+ return;
+ ( (CppEditor*)viewManager->currentView() )->setModified( m );
+}
+
+bool EditorInterfaceImpl::isModified() const
+{
+ if ( !viewManager )
+ return FALSE;
+ return ( (CppEditor*)viewManager->currentView() )->isModified();
+}
+
+bool EditorInterfaceImpl::eventFilter( QObject *o, QEvent *e )
+{
+ if ( e->type() == QEvent::KeyPress )
+ updateTimer->stop();
+ else if ( e->type() == QEvent::FocusOut )
+ update();
+
+ return QObject::eventFilter( o, e );
+}
+
+int EditorInterfaceImpl::numLines() const
+{
+ if ( !viewManager || !viewManager->currentView() )
+ return 0;
+ return ( (CppEditor*)viewManager->currentView() )->paragraphs();
+}
+
+void EditorInterfaceImpl::intervalChanged()
+{
+ if ( !dIface )
+ return;
+ updateTimer->start( 2000, TRUE );
+}
+
+void EditorInterfaceImpl::update()
+{
+ if ( !dIface )
+ return;
+ dIface->updateFunctionList();
+}
+
+void EditorInterfaceImpl::onBreakPointChange( QObject *receiver, const char *slot )
+{
+ if ( !viewManager )
+ return;
+ connect( viewManager, SIGNAL( markersChanged() ), receiver, slot );
+}
diff --git a/tools/designer/plugins/cppeditor/editorinterfaceimpl.h b/tools/designer/plugins/cppeditor/editorinterfaceimpl.h
new file mode 100644
index 0000000..06b3d2a
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/editorinterfaceimpl.h
@@ -0,0 +1,107 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef EDITORINTERFACEIMPL_H
+#define EDITORINTERFACEIMPL_H
+
+#include <editorinterface.h>
+#include <qobject.h>
+#include <qguardedptr.h>
+
+class QTimer;
+class ViewManager;
+struct DesignerInterface;
+
+class EditorInterfaceImpl : public QObject, public EditorInterface
+{
+ Q_OBJECT
+
+public:
+ EditorInterfaceImpl();
+ virtual ~EditorInterfaceImpl();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+ Q_REFCOUNT;
+
+ QWidget *editor( bool readonly, QWidget *parent, QUnknownInterface *designerIface );
+
+ void setText( const QString &txt );
+ QString text() const;
+ bool isUndoAvailable() const;
+ bool isRedoAvailable() const;
+ void undo();
+ void redo();
+ void cut();
+ void copy();
+ void paste();
+ void selectAll();
+ bool find( const QString &expr, bool cs, bool wo, bool forward, bool startAtCursor );
+ bool replace( const QString &find, const QString &replace, bool cs, bool wo, bool forward, bool startAtCursor, bool replaceAll );
+ void gotoLine( int line );
+ void indent();
+ void scrollTo( const QString &txt, const QString &first );
+ void splitView();
+ void setContext( QObject *this_ );
+ void readSettings();
+
+ void setError( int line );
+ void setStep( int ) {}
+ void clearStep() {}
+ void setModified( bool m );
+ bool isModified() const;
+ void setMode( Mode ) {}
+
+ int numLines() const;
+ void breakPoints( QValueList<uint> & ) const {}
+ void setBreakPoints( const QValueList<uint> & ) {}
+ void onBreakPointChange( QObject *receiver, const char *slot );
+ void clearStackFrame() {}
+ void setStackFrame( int ) {}
+
+protected:
+ bool eventFilter( QObject*, QEvent* );
+
+private slots:
+ void modificationChanged( bool m );
+ void intervalChanged();
+ void update();
+
+private:
+ QGuardedPtr<ViewManager> viewManager;
+ DesignerInterface *dIface;
+ QTimer *updateTimer;
+
+};
+
+#endif
diff --git a/tools/designer/plugins/cppeditor/languageinterfaceimpl.cpp b/tools/designer/plugins/cppeditor/languageinterfaceimpl.cpp
new file mode 100644
index 0000000..124be70
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/languageinterfaceimpl.cpp
@@ -0,0 +1,249 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "languageinterfaceimpl.h"
+#include <qobject.h>
+#include <designerinterface.h>
+#include <qfile.h>
+#include "yyreg.h"
+#include <qmetaobject.h>
+
+LanguageInterfaceImpl::LanguageInterfaceImpl( QUnknownInterface *outer )
+ : parent( outer ), ref( 0 )
+{
+}
+
+ulong LanguageInterfaceImpl::addRef()
+{
+ return parent ? parent->addRef() : ref++;
+}
+
+ulong LanguageInterfaceImpl::release()
+{
+ if ( parent )
+ return parent->release();
+ if ( !--ref ) {
+ delete this;
+ return 0;
+ }
+ return ref;
+}
+
+QRESULT LanguageInterfaceImpl::queryInterface( const QUuid &uuid, QUnknownInterface** iface )
+{
+ if ( parent )
+ return parent->queryInterface( uuid, iface );
+
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)this;
+ else if ( uuid == IID_Language )
+ *iface = (LanguageInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+
+class NormalizeObject : public QObject
+{
+public:
+ NormalizeObject() : QObject() {}
+ static QCString normalizeSignalSlot( const char *signalSlot ) { return QObject::normalizeSignalSlot( signalSlot ); }
+};
+
+void LanguageInterfaceImpl::functions( const QString &code, QValueList<Function> *functionMap ) const
+{
+ QValueList<CppFunction> l;
+ extractCppFunctions( code, &l );
+ for ( QValueList<CppFunction>::Iterator it = l.begin(); it != l.end(); ++it ) {
+ Function func;
+ func.name = (*it).prototype();
+ func.name.remove( 0, (*it).returnType().length() );
+ if ( func.name.find( "::" ) == -1 )
+ continue;
+ func.name.remove( (uint)0, func.name.find( "::" ) + 2 );
+ func.body = (*it).body();
+ func.returnType = (*it).returnType();
+ func.start = (*it).functionStartLineNum();
+ func.end = (*it).closingBraceLineNum();
+ functionMap->append( func );
+ }
+}
+
+QString LanguageInterfaceImpl::createFunctionStart( const QString &className, const QString &func,
+ const QString &returnType,
+ const QString & )
+{
+ return returnType + " " + className + "::" + func;
+}
+
+QStringList LanguageInterfaceImpl::definitions() const
+{
+ QStringList lst;
+ lst << "Includes (in Implementation)" << "Includes (in Declaration)" << "Forward Declarations" << "Signals";
+ return lst;
+}
+
+QStringList LanguageInterfaceImpl::definitionEntries( const QString &definition, QUnknownInterface *designerIface ) const
+{
+ DesignerInterface *iface = 0;
+ designerIface->queryInterface( IID_Designer, (QUnknownInterface**) &iface );
+ if ( !iface )
+ return QStringList();
+ DesignerFormWindow *fw = iface->currentForm();
+ if ( !fw )
+ return QStringList();
+ QStringList lst;
+ if ( definition == "Includes (in Implementation)" ) {
+ lst = fw->implementationIncludes();
+ } else if ( definition == "Includes (in Declaration)" ) {
+ lst = fw->declarationIncludes();
+ } else if ( definition == "Forward Declarations" ) {
+ lst = fw->forwardDeclarations();
+ } else if ( definition == "Signals" ) {
+ lst = fw->signalList();
+ }
+ iface->release();
+ return lst;
+}
+
+void LanguageInterfaceImpl::setDefinitionEntries( const QString &definition, const QStringList &entries, QUnknownInterface *designerIface )
+{
+ DesignerInterface *iface = 0;
+ designerIface->queryInterface( IID_Designer, (QUnknownInterface**) &iface );
+ if ( !iface )
+ return;
+ DesignerFormWindow *fw = iface->currentForm();
+ if ( !fw )
+ return;
+ if ( definition == "Includes (in Implementation)" ) {
+ fw->setImplementationIncludes( entries );
+ } else if ( definition == "Includes (in Declaration)" ) {
+ fw->setDeclarationIncludes( entries );
+ } else if ( definition == "Forward Declarations" ) {
+ fw->setForwardDeclarations( entries );
+ } else if ( definition == "Signals" ) {
+ fw->setSignalList( entries );
+ }
+ iface->release();
+}
+
+QString LanguageInterfaceImpl::createEmptyFunction()
+{
+ return "{\n\n}\n";
+}
+
+bool LanguageInterfaceImpl::supports( Support s ) const
+{
+ if ( s == ReturnType )
+ return TRUE;
+ if ( s == ConnectionsToCustomSlots )
+ return TRUE;
+ return FALSE;
+}
+
+QStringList LanguageInterfaceImpl::fileFilterList() const
+{
+ QStringList f;
+ f << "C++ Files (*.cpp *.C *.cxx *.c++ *.c *.h *.H *.hpp *.hxx)";
+ return f;
+
+}
+QStringList LanguageInterfaceImpl::fileExtensionList() const
+{
+ QStringList f;
+ f << "cpp" << "C" << "cxx" << "c++" << "c" <<"h" << "H" << "hpp" << "hxx";
+ return f;
+}
+
+QString LanguageInterfaceImpl::projectKeyForExtension( const QString &extension ) const
+{
+ // also handle something like foo.ut.cpp
+ QString ext = extension;
+ int i = ext.findRev('.');
+ if ( i > -1 && i < (int)(ext.length()-1) )
+ ext = ext.mid( i + 1 );
+ if ( ext[ 0 ] == 'c' || ext[ 0 ] == 'C' )
+ return "SOURCES";
+ return "HEADERS";
+}
+
+void LanguageInterfaceImpl::sourceProjectKeys( QStringList &keys ) const
+{
+ keys << "HEADERS" << "SOURCES";
+}
+
+ class CheckObject : public QObject
+{
+public:
+ CheckObject() {}
+ bool checkConnectArgs( const char *signal, const char *member ) { return QObject::checkConnectArgs( signal, 0, member ); }
+
+};
+
+bool LanguageInterfaceImpl::canConnect( const QString &signal, const QString &slot )
+{
+ CheckObject o;
+ return o.checkConnectArgs( signal.latin1(), slot.latin1() );
+}
+
+void LanguageInterfaceImpl::loadFormCode( const QString &, const QString &filename,
+ QValueList<Function> &functions,
+ QStringList &,
+ QValueList<Connection> & )
+{
+ QFile f( filename );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+ QTextStream ts( &f );
+ QString code( ts.read() );
+ this->functions( code, &functions );
+}
+
+void LanguageInterfaceImpl::preferedExtensions( QMap<QString, QString> &extensionMap ) const
+{
+ extensionMap.insert( "cpp", "C++ Source File" );
+ extensionMap.insert( "h", "C++ Header File" );
+}
+
+QStrList LanguageInterfaceImpl::signalNames( QObject *obj ) const
+{
+ QStrList sigs;
+ sigs = obj->metaObject()->signalNames( TRUE );
+ sigs.remove( "destroyed()" );
+ return sigs;
+}
diff --git a/tools/designer/plugins/cppeditor/languageinterfaceimpl.h b/tools/designer/plugins/cppeditor/languageinterfaceimpl.h
new file mode 100644
index 0000000..55781e7
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/languageinterfaceimpl.h
@@ -0,0 +1,90 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef LANGUAGEINTERFACEIMPL_H
+#define LANGUAGEINTERFACEIMPL_H
+
+#include <languageinterface.h>
+
+class LanguageInterfaceImpl : public LanguageInterface
+{
+public:
+ LanguageInterfaceImpl( QUnknownInterface *outer = 0 );
+
+ ulong addRef();
+ ulong release();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+
+ void functions( const QString &code, QValueList<Function> *funcs ) const;
+ void connections( const QString &, QValueList<Connection> * ) const {};
+ QString createFunctionStart( const QString &className, const QString &func,
+ const QString &returnType, const QString &access );
+ QStringList definitions() const;
+ QStringList definitionEntries( const QString &definition, QUnknownInterface *designerIface ) const;
+ void setDefinitionEntries( const QString &definition, const QStringList &entries, QUnknownInterface *designerIface );
+ QString createArguments( const QString & ) { return QString::null; }
+ QString createEmptyFunction();
+ bool supports( Support s ) const;
+ QStringList fileFilterList() const;
+ QStringList fileExtensionList() const;
+ void preferedExtensions( QMap<QString, QString> &extensionMap ) const;
+ void sourceProjectKeys( QStringList &keys ) const;
+ QString projectKeyForExtension( const QString &extension ) const;
+ QString cleanSignature( const QString &sig ) { return sig; } // #### implement me
+ void loadFormCode( const QString &, const QString &,
+ QValueList<Function> &,
+ QStringList &,
+ QValueList<Connection> & );
+ QString formCodeExtension() const { return ".h"; }
+ bool canConnect( const QString &signal, const QString &slot );
+ void compressProject( const QString &, const QString &, bool ) {}
+ QString uncompressProject( const QString &, const QString & ) { return QString::null; }
+ QString aboutText() const { return ""; }
+
+ void addConnection( const QString &, const QString &,
+ const QString &, const QString &,
+ QString * ) {}
+ void removeConnection( const QString &, const QString &,
+ const QString &, const QString &,
+ QString * ) {}
+ QStrList signalNames( QObject *obj ) const;
+
+private:
+ QUnknownInterface *parent;
+ ulong ref;
+
+};
+
+#endif
diff --git a/tools/designer/plugins/cppeditor/mainfilesettings.ui b/tools/designer/plugins/cppeditor/mainfilesettings.ui
new file mode 100644
index 0000000..2816cda
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/mainfilesettings.ui
@@ -0,0 +1,211 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>CppMainFile</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CppMainFile</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>308</width>
+ <height>283</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Configure Main-File</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Filename:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>editFileName</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Main-Form:</string>
+ </property>
+ </widget>
+ <widget class="QListBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>listForms</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>Help</string>
+ </property>
+ <property name="accel">
+ <number>4144</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>CppMainFile</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>CppMainFile</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>listForms</sender>
+ <signal>selectionChanged()</signal>
+ <receiver>CppMainFile</receiver>
+ <slot>updateOkButton()</slot>
+ </connection>
+ <connection>
+ <sender>listForms</sender>
+ <signal>currentChanged(QListBoxItem*)</signal>
+ <receiver>CppMainFile</receiver>
+ <slot>updateOkButton()</slot>
+ </connection>
+ <connection>
+ <sender>editFileName</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppMainFile</receiver>
+ <slot>updateOkButton()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">mainfilesettings.ui.h</include>
+</includes>
+<forwards>
+ <forward>struct QUnknownInterface;</forward>
+</forwards>
+<slots>
+ <slot>init()</slot>
+ <slot>setup( QUnknownInterface * appIface )</slot>
+ <slot>updateOkButton()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/plugins/cppeditor/mainfilesettings.ui.h b/tools/designer/plugins/cppeditor/mainfilesettings.ui.h
new file mode 100644
index 0000000..ea79101
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/mainfilesettings.ui.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+#include <designerinterface.h>
+
+void CppMainFile::init()
+{
+}
+
+void CppMainFile::setup( QUnknownInterface *appIface )
+{
+ DesignerInterface *dIface = 0;
+ appIface->queryInterface( IID_Designer, (QUnknownInterface**)&dIface );
+ if ( !dIface )
+ return;
+ QStringList l = dIface->currentProject()->formNames();
+ editFileName->setText( "main.cpp" );
+ listForms->clear();
+ listForms->insertStringList( l );
+ listForms->setCurrentItem( 0 );
+ updateOkButton();
+ editFileName->setFocus();
+ editFileName->selectAll();
+}
+
+void CppMainFile::updateOkButton()
+{
+ buttonOk->setEnabled( editFileName->text().length() > 0 && listForms->currentItem() != -1 );
+}
+
+
diff --git a/tools/designer/plugins/cppeditor/preferenceinterfaceimpl.cpp b/tools/designer/plugins/cppeditor/preferenceinterfaceimpl.cpp
new file mode 100644
index 0000000..b6dd10c
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/preferenceinterfaceimpl.cpp
@@ -0,0 +1,102 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "preferenceinterfaceimpl.h"
+#include <preferences.h>
+
+PreferenceInterfaceImpl::PreferenceInterfaceImpl( QUnknownInterface *outer )
+ : parent( outer ),
+ ref( 0 ),
+ cppEditorSyntax( 0 )
+{
+}
+
+PreferenceInterfaceImpl::~PreferenceInterfaceImpl()
+{
+}
+
+ulong PreferenceInterfaceImpl::addRef()
+{
+ return parent ? parent->addRef() : ref++;
+}
+
+ulong PreferenceInterfaceImpl::release()
+{
+ if ( parent )
+ return parent->release();
+ if ( !--ref ) {
+ delete this;
+ return 0;
+ }
+ return ref;
+}
+
+QRESULT PreferenceInterfaceImpl::queryInterface( const QUuid &uuid, QUnknownInterface** iface )
+{
+ if ( parent )
+ return parent->queryInterface( uuid, iface );
+
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)this;
+ else if ( uuid == IID_Preference )
+ *iface = (PreferenceInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+PreferenceInterface::Preference *PreferenceInterfaceImpl::preference()
+{
+ if ( !cppEditorSyntax ) {
+ cppEditorSyntax = new PreferencesBase( 0, "cppeditor_syntax" );
+ ( (PreferencesBase*)cppEditorSyntax )->setPath( "/Trolltech/CppEditor/" );
+ cppEditorSyntax->hide();
+ }
+ Preference *pf = 0;
+ pf = new Preference;
+ pf->tab = cppEditorSyntax;
+ pf->title = "C++ Editor";
+ pf->receiver = pf->tab;
+ pf->init_slot = SLOT( reInit() );
+ pf->accept_slot = SLOT( save() );
+ return pf;
+}
+
+void PreferenceInterfaceImpl::deletePreferenceObject( Preference *p )
+{
+ delete p;
+}
diff --git a/tools/designer/plugins/cppeditor/preferenceinterfaceimpl.h b/tools/designer/plugins/cppeditor/preferenceinterfaceimpl.h
new file mode 100644
index 0000000..e1225fc
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/preferenceinterfaceimpl.h
@@ -0,0 +1,64 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PREFERENCEINTERFACEIMPL_H
+#define PREFERENCEINTERFACEIMPL_H
+
+#include <preferenceinterface.h>
+class QWidget;
+
+class PreferenceInterfaceImpl : public PreferenceInterface
+{
+public:
+ PreferenceInterfaceImpl( QUnknownInterface *outer = 0 );
+ virtual ~PreferenceInterfaceImpl();
+
+ ulong addRef();
+ ulong release();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+
+ Preference *preference();
+ void connectTo( QUnknownInterface * ) {}
+ void deletePreferenceObject( Preference * );
+
+private:
+ QUnknownInterface *parent;
+ int ref;
+ QWidget *cppEditorSyntax;
+
+};
+
+#endif
+
diff --git a/tools/designer/plugins/cppeditor/projectsettings.ui b/tools/designer/plugins/cppeditor/projectsettings.ui
new file mode 100644
index 0000000..d5d9d87
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/projectsettings.ui
@@ -0,0 +1,347 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>CppProjectSettings</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<include location="local" implDecl="in declaration">projectsettings.ui.h</include>
+<forward>struct QUnknownInterface;</forward>
+<variable>QMap&lt;QString, QString&gt; config, libs, defines, includes;</variable>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>CppProjectSettings</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>373</width>
+ <height>191</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Project Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Config:</string>
+ </property>
+ </widget>
+ <spacer row="5" column="2">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Defines:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="2">
+ <property name="name">
+ <cstring>editDefines</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Libs:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>TextLabel2_3</cstring>
+ </property>
+ <property name="text">
+ <string>Includepath:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="1">
+ <item>
+ <property name="text">
+ <string>(all)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>unix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>win32</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>mac</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>comboDefines</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="4" column="1">
+ <item>
+ <property name="text">
+ <string>(all)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>unix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>win32</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>mac</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>comboInclude</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="2">
+ <property name="name">
+ <cstring>editInclude</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="2">
+ <property name="name">
+ <cstring>editLibs</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="2">
+ <property name="name">
+ <cstring>editConfig</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <item>
+ <property name="text">
+ <string>(all)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>unix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>win32</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>mac</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>comboLibs</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <item>
+ <property name="text">
+ <string>(all)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>unix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>win32</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>mac</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>comboConfig</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Template:</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>app</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>lib</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>comboTemplate</cstring>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>comboConfig</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>CppProjectSettings</receiver>
+ <slot>configPlatformChanged(const QString&amp;)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>comboLibs</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>CppProjectSettings</receiver>
+ <slot>libsPlatformChanged(const QString&amp;)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>comboDefines</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>CppProjectSettings</receiver>
+ <slot>definesPlatformChanged(const QString&amp;)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>editConfig</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppProjectSettings</receiver>
+ <slot>configChanged(const QString&amp;)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>editLibs</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppProjectSettings</receiver>
+ <slot>libsChanged(const QString&amp;)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>editDefines</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppProjectSettings</receiver>
+ <slot>definesChanged(const QString&amp;)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>editInclude</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>CppProjectSettings</receiver>
+ <slot>includesChanged(const QString&amp;)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>comboInclude</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>CppProjectSettings</receiver>
+ <slot>includesPlatformChanged(const QString&amp;)</slot>
+ </connection>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">reInit( QUnknownInterface * iface )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">save( QUnknownInterface * iface )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">configChanged( const QString &amp; str )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">libsChanged( const QString &amp; str )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">definesChanged( const QString &amp; str )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">includesChanged( const QString &amp; str )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">configPlatformChanged( const QString &amp; plat )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">libsPlatformChanged( const QString &amp; plat )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">definesPlatformChanged( const QString &amp; plat )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">includesPlatformChanged( const QString &amp; plat )</slot>
+</connections>
+<tabstops>
+ <tabstop>comboTemplate</tabstop>
+ <tabstop>comboConfig</tabstop>
+ <tabstop>editConfig</tabstop>
+ <tabstop>comboLibs</tabstop>
+ <tabstop>editLibs</tabstop>
+ <tabstop>comboDefines</tabstop>
+ <tabstop>editDefines</tabstop>
+ <tabstop>comboInclude</tabstop>
+ <tabstop>editInclude</tabstop>
+</tabstops>
+</UI>
diff --git a/tools/designer/plugins/cppeditor/projectsettings.ui.h b/tools/designer/plugins/cppeditor/projectsettings.ui.h
new file mode 100644
index 0000000..f5de0b7
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/projectsettings.ui.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** Add custom slot implementations here. Use a slot init() for
+** initialization code called during construction, and a slot destroy()
+** for cleanup code called during destruction.
+**
+** This file gets modified by Qt Designer whenever you add, rename or
+** remove custom slots. Implementation code does not get lost.
+*****************************************************************************/
+
+#include <designerinterface.h>
+
+void CppProjectSettings::reInit( QUnknownInterface *iface )
+{
+ comboConfig->setCurrentItem( 0 );
+ comboLibs->setCurrentItem( 0 );
+ comboDefines->setCurrentItem( 0 );
+ comboInclude->setCurrentItem( 0 );
+
+ DesignerInterface *dIface = 0;
+ iface->queryInterface( IID_Designer, (QUnknownInterface**)&dIface );
+ if ( !dIface )
+ return;
+ DesignerProject *project = dIface->currentProject();
+ if ( project->templte() == "app" )
+ comboTemplate->setCurrentItem( 0 );
+ else
+ comboTemplate->setCurrentItem( 1 );
+
+ config.clear();
+ defines.clear();
+ libs.clear();
+ defines.clear();
+ includes.clear();
+
+ const QString platforms[] = { "(all)", "win32", "unix", "mac", QString::null };
+ for ( int i = 0; platforms[ i ] != QString::null; ++i ) {
+ config.replace( platforms[ i ], project->config( platforms[ i ] ) );
+ libs.replace( platforms[ i ], project->libs( platforms[ i ] ) );
+ defines.replace( platforms[ i ], project->defines( platforms[ i ] ) );
+ includes.replace( platforms[ i ], project->includePath( platforms[ i ] ) );
+ }
+ editConfig->setText( config[ "(all)" ] );
+ editLibs->setText( libs[ "(all)" ] );
+ editDefines->setText( defines[ "(all)" ] );
+ editInclude->setText( includes[ "(all)" ] );
+}
+
+void CppProjectSettings::save( QUnknownInterface *iface )
+{
+ DesignerInterface *dIface = 0;
+ iface->queryInterface( IID_Designer, (QUnknownInterface**)&dIface );
+ if ( !dIface )
+ return;
+ DesignerProject *project = dIface->currentProject();
+
+ project->setTemplate( comboTemplate->currentText() );
+ const QString platforms[] = { "(all)", "win32", "unix", "mac", QString::null };
+ for ( int i = 0; platforms[ i ] != QString::null; ++i ) {
+ project->setConfig( platforms[ i ], config[ platforms[ i ] ] );
+ project->setLibs( platforms[ i ], libs[ platforms[ i ] ] );
+ project->setDefines( platforms[ i ], defines[ platforms[ i ] ] );
+ project->setIncludePath( platforms[ i ], includes[ platforms[ i ] ] );
+ }
+}
+
+void CppProjectSettings::configChanged( const QString &str )
+{
+ config.replace( comboConfig->currentText(), str );
+}
+
+void CppProjectSettings::libsChanged( const QString &str )
+{
+ libs.replace( comboLibs->currentText(), str );
+}
+
+void CppProjectSettings::definesChanged( const QString &str )
+{
+ defines.replace( comboDefines->currentText(), str );
+}
+
+void CppProjectSettings::includesChanged( const QString &str )
+{
+ includes.replace( comboInclude->currentText(), str );
+}
+
+void CppProjectSettings::configPlatformChanged( const QString &plat )
+{
+ editConfig->setText( config[ plat ] );
+}
+
+void CppProjectSettings::libsPlatformChanged( const QString &plat )
+{
+ editLibs->setText( libs[ plat ] );
+}
+
+void CppProjectSettings::definesPlatformChanged( const QString &plat )
+{
+ editDefines->setText( defines[ plat ] );
+}
+
+void CppProjectSettings::includesPlatformChanged( const QString &plat )
+{
+ editInclude->setText( includes[ plat ] );
+}
diff --git a/tools/designer/plugins/cppeditor/projectsettingsinterfaceimpl.cpp b/tools/designer/plugins/cppeditor/projectsettingsinterfaceimpl.cpp
new file mode 100644
index 0000000..9bb5d51
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/projectsettingsinterfaceimpl.cpp
@@ -0,0 +1,106 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "projectsettingsinterfaceimpl.h"
+#include "projectsettings.h"
+
+ProjectSettingsInterfaceImpl::ProjectSettingsInterfaceImpl( QUnknownInterface *outer )
+ : parent( outer ),
+ ref( 0 ),
+ settingsTab( 0 )
+{
+}
+
+ulong ProjectSettingsInterfaceImpl::addRef()
+{
+ return parent ? parent->addRef() : ref++;
+}
+
+ulong ProjectSettingsInterfaceImpl::release()
+{
+ if ( parent )
+ return parent->release();
+ if ( !--ref ) {
+ delete this;
+ return 0;
+ }
+ return ref;
+}
+
+ProjectSettingsInterface::ProjectSettings *ProjectSettingsInterfaceImpl::projectSetting()
+{
+ if ( !settingsTab ) {
+ settingsTab = new CppProjectSettings( 0 );
+ settingsTab->hide();
+ }
+ ProjectSettings *pf = 0;
+ pf = new ProjectSettings;
+ pf->tab = settingsTab;
+ pf->title = "C++";
+ pf->receiver = pf->tab;
+ pf->init_slot = SLOT( reInit( QUnknownInterface * ) );
+ pf->accept_slot = SLOT( save( QUnknownInterface * ) );
+ return pf;
+}
+
+QStringList ProjectSettingsInterfaceImpl::projectSettings() const
+{
+ return QStringList();
+}
+
+void ProjectSettingsInterfaceImpl::connectTo( QUnknownInterface * )
+{
+}
+
+void ProjectSettingsInterfaceImpl::deleteProjectSettingsObject( ProjectSettings *pf )
+{
+ delete pf;
+}
+
+QRESULT ProjectSettingsInterfaceImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ if ( parent )
+ return parent->queryInterface( uuid, iface );
+
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)this;
+ else if ( uuid == IID_ProjectSettings )
+ *iface = (ProjectSettingsInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
diff --git a/tools/designer/plugins/cppeditor/projectsettingsinterfaceimpl.h b/tools/designer/plugins/cppeditor/projectsettingsinterfaceimpl.h
new file mode 100644
index 0000000..0cd0f45
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/projectsettingsinterfaceimpl.h
@@ -0,0 +1,62 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PROJECTSETTINGSINTERFACEIMPL_H
+#define PROJECTSETTINGSINTERFACEIMPL_H
+
+#include <projectsettingsiface.h>
+
+class CppProjectSettings;
+
+class ProjectSettingsInterfaceImpl : public ProjectSettingsInterface
+{
+public:
+ ProjectSettingsInterfaceImpl( QUnknownInterface *outer = 0 );
+
+ ulong addRef();
+ ulong release();
+
+ ProjectSettings *projectSetting();
+ QStringList projectSettings() const;
+ void connectTo( QUnknownInterface *appInterface );
+ void deleteProjectSettingsObject( ProjectSettings * );
+ QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface );
+
+private:
+ QUnknownInterface *parent;
+ int ref;
+ CppProjectSettings *settingsTab;
+};
+
+#endif
diff --git a/tools/designer/plugins/cppeditor/sourcetemplateinterfaceimpl.cpp b/tools/designer/plugins/cppeditor/sourcetemplateinterfaceimpl.cpp
new file mode 100644
index 0000000..a158e81
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/sourcetemplateinterfaceimpl.cpp
@@ -0,0 +1,117 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "sourcetemplateinterfaceimpl.h"
+#include <designerinterface.h>
+#include "mainfilesettings.h"
+#include <qlineedit.h>
+#include <qlistbox.h>
+
+SourceTemplateInterfaceImpl::SourceTemplateInterfaceImpl()
+{
+}
+
+QRESULT SourceTemplateInterfaceImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)this;
+ else if ( uuid == IID_QFeatureList )
+ *iface = (QFeatureListInterface*)this;
+ else if ( uuid == IID_SourceTemplate )
+ *iface = (SourceTemplateInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+QStringList SourceTemplateInterfaceImpl::featureList() const
+{
+ QStringList l;
+ l << "C++ Main-File (main.cpp)";
+ return l;
+}
+
+static QString generateMainCppCode( const QString &formname, const QString &include )
+{
+ QString code;
+ code += "#include <qapplication.h>\n";
+ code += "#include \"" + include + "\"\n";
+ code += "\n";
+ code += "int main( int argc, char ** argv )\n";
+ code += "{\n";
+ code += " QApplication a( argc, argv );\n";
+ code += " " + formname + " w;\n";
+ code += " w.show();\n";
+ code += " a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );\n";
+ code += " return a.exec();\n";
+ code += "}\n";
+ return code;
+}
+
+SourceTemplateInterface::Source SourceTemplateInterfaceImpl::create( const QString &templ,
+ QUnknownInterface *appIface )
+{
+ SourceTemplateInterface::Source src;
+ src.type = SourceTemplateInterface::Source::Invalid;
+ if ( templ == "C++ Main-File (main.cpp)" ) {
+ CppMainFile dia( 0, 0, TRUE );
+ dia.setup( appIface );
+ if ( dia.exec() == QDialog::Accepted ) {
+ DesignerInterface *dIface = 0;
+ appIface->queryInterface( IID_Designer, (QUnknownInterface**)&dIface );
+ if ( dIface ) {
+ src.type = SourceTemplateInterface::Source::FileName;
+ src.filename = dia.editFileName->text();
+ QString include = dIface->currentProject()->
+ formFileName( dia.listForms->text( dia.listForms->currentItem() ) );
+ include.remove( include.length() - 2, 2 );
+ include += "h";
+ int slashFind = include.findRev('/');
+ if (slashFind != -1)
+ include = include.mid(slashFind+1);
+ src.code = generateMainCppCode( dia.listForms->text( dia.listForms->currentItem() ),
+ include );
+ }
+ }
+ }
+ return src;
+}
+
+QString SourceTemplateInterfaceImpl::language( const QString & ) const
+{
+ return "C++";
+}
diff --git a/tools/designer/plugins/cppeditor/sourcetemplateinterfaceimpl.h b/tools/designer/plugins/cppeditor/sourcetemplateinterfaceimpl.h
new file mode 100644
index 0000000..52ae2d6
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/sourcetemplateinterfaceimpl.h
@@ -0,0 +1,54 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef SOURCETEMPLATEINTERFACEIMPL_H
+#define SOURCETEMPLATEINTERFACEIMPL_H
+
+#include <sourcetemplateiface.h>
+
+class SourceTemplateInterfaceImpl : public SourceTemplateInterface
+{
+public:
+ SourceTemplateInterfaceImpl();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+ QStringList featureList() const;
+ Source create( const QString &templ, QUnknownInterface *appIface );
+ QString language( const QString &templ ) const;
+
+ Q_REFCOUNT
+};
+
+
+#endif
diff --git a/tools/designer/plugins/cppeditor/syntaxhighliter_cpp.cpp b/tools/designer/plugins/cppeditor/syntaxhighliter_cpp.cpp
new file mode 100644
index 0000000..1b0a617
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/syntaxhighliter_cpp.cpp
@@ -0,0 +1,550 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "syntaxhighliter_cpp.h"
+#include "paragdata.h"
+#include "qstring.h"
+#include "qstringlist.h"
+#include "qmap.h"
+#include "qapplication.h"
+#include "qregexp.h"
+
+const char * const SyntaxHighlighter_CPP::keywords[] = {
+ // C++ keywords
+ "and",
+ "and_eq",
+ "asm",
+ "auto",
+ "bitand",
+ "bitor",
+ "bool",
+ "break",
+ "case",
+ "catch",
+ "char",
+ "class",
+ "compl",
+ "const",
+ "const_cast",
+ "continue",
+ "default",
+ "delete",
+ "do",
+ "double",
+ "dynamic_cast",
+ "else",
+ "enum",
+ "explicit",
+ "export",
+ "extern",
+ "false",
+ "FALSE",
+ "float",
+ "for",
+ "friend",
+ "goto",
+ "if",
+ "inline",
+ "int",
+ "long",
+ "mutable",
+ "namespace",
+ "new",
+ "not",
+ "not_eq",
+ "operator",
+ "or",
+ "or_eq",
+ "private",
+ "protected",
+ "public",
+ "register",
+ "reinterpret_cast",
+ "return",
+ "short",
+ "signed",
+ "sizeof",
+ "static",
+ "static_cast",
+ "struct",
+ "switch",
+ "template",
+ "this",
+ "throw",
+ "true",
+ "TRUE",
+ "try",
+ "typedef",
+ "typeid",
+ "typename",
+ "union",
+ "unsigned",
+ "using",
+ "virtual",
+ "void",
+ "volatile",
+ "wchar_t",
+ "while",
+ "xor",
+ "xor_eq",
+ // additional "keywords" intoduced by Qt
+ "slots",
+ "signals",
+ "uint",
+ "ushort",
+ "ulong",
+ "emit",
+ // end of array
+ 0
+};
+
+static QMap<int, QMap<QString, int > > *wordMap = 0;
+
+SyntaxHighlighter_CPP::SyntaxHighlighter_CPP()
+ : QTextPreProcessor(), lastFormat( 0 ), lastFormatId( -1 )
+{
+ QFont f( qApp->font() );
+
+ addFormat( Standard, new QTextFormat( f, Qt::black ) );
+ addFormat( Number, new QTextFormat( f, Qt::darkBlue ) );
+ addFormat( String, new QTextFormat( f, Qt::darkGreen ) );
+ addFormat( Type, new QTextFormat( f, Qt::darkMagenta ) );
+ addFormat( Keyword, new QTextFormat( f, Qt::darkYellow ) );
+ addFormat( PreProcessor, new QTextFormat( f, Qt::darkBlue ) );
+ addFormat( Label, new QTextFormat( f, Qt::darkRed ) );
+ f.setFamily( "times" );
+ addFormat( Comment, new QTextFormat( f, Qt::red ) );
+
+ if ( wordMap )
+ return;
+
+ wordMap = new QMap<int, QMap<QString, int> >;
+ int len;
+ for ( int i = 0; keywords[ i ]; ++i ) {
+ len = (int)strlen( keywords[ i ] );
+ if ( !wordMap->contains( len ) )
+ wordMap->insert( len, QMap<QString, int >() );
+ QMap<QString, int> &map = wordMap->operator[]( len );
+ map[ keywords[ i ] ] = Keyword;
+ }
+}
+
+SyntaxHighlighter_CPP::~SyntaxHighlighter_CPP()
+{
+}
+
+static int string2Id( const QString &s )
+{
+ if ( s == "Standard" )
+ return SyntaxHighlighter_CPP::Standard;
+ if ( s == "Comment" )
+ return SyntaxHighlighter_CPP::Comment;
+ if ( s == "Number" )
+ return SyntaxHighlighter_CPP::Number;
+ if ( s == "String" )
+ return SyntaxHighlighter_CPP::String;
+ if ( s == "Type" )
+ return SyntaxHighlighter_CPP::Type;
+ if ( s == "Preprocessor" )
+ return SyntaxHighlighter_CPP::PreProcessor;
+ if ( s == "Label" )
+ return SyntaxHighlighter_CPP::Label;
+ if ( s == "Keyword" )
+ return SyntaxHighlighter_CPP::Keyword;
+ return SyntaxHighlighter_CPP::Standard;
+}
+
+void SyntaxHighlighter_CPP::updateStyles( const QMap<QString, ConfigStyle> &styles )
+{
+ for ( QMap<QString, ConfigStyle>::ConstIterator it = styles.begin(); it != styles.end(); ++it ) {
+ int id = string2Id( it.key() );
+ QTextFormat *f = format( id );
+ if ( !f )
+ continue;
+ f->setFont( (*it).font );
+ f->setColor( (*it).color );
+ }
+}
+
+void SyntaxHighlighter_CPP::process( QTextDocument *doc, QTextParagraph *string, int, bool invalidate )
+{
+
+ QTextFormat *formatStandard = format( Standard );
+ QTextFormat *formatComment = format( Comment );
+ QTextFormat *formatNumber = format( Number );
+ QTextFormat *formatString = format( String );
+ QTextFormat *formatType = format( Type );
+ QTextFormat *formatPreProcessor = format( PreProcessor );
+ QTextFormat *formatLabel = format( Label );
+
+ // states
+ const int StateStandard = 0;
+ const int StateCommentStart1 = 1;
+ const int StateCCommentStart2 = 2;
+ const int StateCppCommentStart2 = 3;
+ const int StateCComment = 4;
+ const int StateCppComment = 5;
+ const int StateCCommentEnd1 = 6;
+ const int StateCCommentEnd2 = 7;
+ const int StateStringStart = 8;
+ const int StateString = 9;
+ const int StateStringEnd = 10;
+ const int StateString2Start = 11;
+ const int StateString2 = 12;
+ const int StateString2End = 13;
+ const int StateNumber = 14;
+ const int StatePreProcessor = 15;
+
+ // tokens
+ const int InputAlpha = 0;
+ const int InputNumber = 1;
+ const int InputAsterix = 2;
+ const int InputSlash = 3;
+ const int InputParen = 4;
+ const int InputSpace = 5;
+ const int InputHash = 6;
+ const int InputQuotation = 7;
+ const int InputApostrophe = 8;
+ const int InputSep = 9;
+
+ static uchar table[ 16 ][ 10 ] = {
+ { StateStandard, StateNumber, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateStandard
+ { StateStandard, StateNumber, StateCCommentStart2, StateCppCommentStart2, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateCommentStart1
+ { StateCComment, StateCComment, StateCCommentEnd1, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment }, // StateCCommentStart2
+ { StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment }, // CppCommentStart2
+ { StateCComment, StateCComment, StateCCommentEnd1, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment }, // StateCComment
+ { StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment, StateCppComment }, // StateCppComment
+ { StateCComment, StateCComment, StateCCommentEnd1, StateCCommentEnd2, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment, StateCComment }, // StateCCommentEnd1
+ { StateStandard, StateNumber, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateCCommentEnd2
+ { StateString, StateString, StateString, StateString, StateString, StateString, StateString, StateStringEnd, StateString, StateString }, // StateStringStart
+ { StateString, StateString, StateString, StateString, StateString, StateString, StateString, StateStringEnd, StateString, StateString }, // StateString
+ { StateStandard, StateStandard, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateStringEnd
+ { StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2End, StateString2 }, // StateString2Start
+ { StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2, StateString2End, StateString2 }, // StateString2
+ { StateStandard, StateStandard, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateString2End
+ { StateNumber, StateNumber, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateNumber
+ { StatePreProcessor, StateStandard, StateStandard, StateCommentStart1, StateStandard, StateStandard, StatePreProcessor, StateStringStart, StateString2Start, StateStandard } // StatePreProcessor
+ };
+
+ QString buffer;
+
+ int state = StateStandard;
+ if ( string->prev() ) {
+ if ( string->prev()->endState() == -1 )
+ process( doc, string->prev(), 0, FALSE );
+ state = string->prev()->endState();
+ }
+ int input = -1;
+ int i = 0;
+ bool lastWasBackSlash = FALSE;
+ bool makeLastStandard = FALSE;
+
+ ParagData *paragData = (ParagData*)string->extraData();
+ if ( paragData )
+ paragData->parenList.clear();
+ else
+ paragData = new ParagData;
+
+ QString alphabeth = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ QString mathChars = "xXeE";
+ QString numbers = "0123456789";
+ bool questionMark = FALSE;
+ QChar lastChar;
+ for (;;) {
+ QChar c = string->at( i )->c;
+
+ if ( lastWasBackSlash ) {
+ input = InputSep;
+ } else {
+ switch ( c ) {
+ case '*':
+ input = InputAsterix;
+ break;
+ case '/':
+ input = InputSlash;
+ break;
+ case '(': case '[': case '{':
+ input = InputParen;
+ if ( state == StateStandard ||
+ state == StateNumber ||
+ state == StatePreProcessor ||
+ state == StateCCommentEnd2 ||
+ state == StateCCommentEnd1 ||
+ state == StateString2End ||
+ state == StateStringEnd )
+ paragData->parenList << Paren( Paren::Open, c, i );
+ break;
+ case ')': case ']': case '}':
+ input = InputParen;
+ if ( state == StateStandard ||
+ state == StateNumber ||
+ state == StatePreProcessor ||
+ state == StateCCommentEnd2 ||
+ state == StateCCommentEnd1 ||
+ state == StateString2End ||
+ state == StateStringEnd )
+ paragData->parenList << Paren( Paren::Closed, c, i );
+ break;
+ case '#':
+ input = InputHash;
+ break;
+ case '"':
+ input = InputQuotation;
+ break;
+ case '\'':
+ input = InputApostrophe;
+ break;
+ case ' ':
+ input = InputSpace;
+ break;
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9': case '0':
+ if ( alphabeth.find( lastChar ) != -1 &&
+ ( mathChars.find( lastChar ) == -1 || numbers.find( string->at( i - 1 )->c ) == -1 ) ) {
+ input = InputAlpha;
+ } else {
+ if ( input == InputAlpha && numbers.find( lastChar ) != -1 )
+ input = InputAlpha;
+ else
+ input = InputNumber;
+ }
+ break;
+ case ':': {
+ input = InputAlpha;
+ QChar nextChar = ' ';
+ if ( i < string->length() - 1 )
+ nextChar = string->at( i + 1 )->c;
+ if ( state == StateStandard && !questionMark && lastChar != ':' && nextChar != ':' ) {
+ for ( int j = 0; j < i; ++j ) {
+ if ( string->at( j )->format() == formatStandard )
+ string->setFormat( j, 1, formatLabel, FALSE );
+ }
+ }
+ } break;
+ default: {
+ if ( !questionMark && c == '?' )
+ questionMark = TRUE;
+ if ( c.isLetter() || c == '_' )
+ input = InputAlpha;
+ else
+ input = InputSep;
+ } break;
+ }
+ }
+
+ lastWasBackSlash = !lastWasBackSlash && c == '\\';
+
+ if ( input == InputAlpha )
+ buffer += c;
+
+ state = table[ state ][ input ];
+
+ switch ( state ) {
+ case StateStandard: {
+ int len = buffer.length();
+ string->setFormat( i, 1, formatStandard, FALSE );
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ if ( buffer.length() > 0 && input != InputAlpha ) {
+ if ( buffer[ 0 ] == 'Q' ) {
+ string->setFormat( i - buffer.length(), buffer.length(), formatType, FALSE );
+ } else {
+ QMap<int, QMap<QString, int > >::Iterator it = wordMap->find( len );
+ if ( it != wordMap->end() ) {
+ QMap<QString, int >::Iterator it2 = ( *it ).find( buffer );
+ if ( it2 != ( *it ).end() )
+ string->setFormat( i - buffer.length(), buffer.length(), format( ( *it2 ) ), FALSE );
+ }
+ }
+ buffer = QString::null;
+ }
+ } break;
+ case StateCommentStart1:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = TRUE;
+ buffer = QString::null;
+ break;
+ case StateCCommentStart2:
+ string->setFormat( i - 1, 2, formatComment, FALSE );
+ makeLastStandard = FALSE;
+ buffer = QString::null;
+ break;
+ case StateCppCommentStart2:
+ string->setFormat( i - 1, 2, formatComment, FALSE );
+ makeLastStandard = FALSE;
+ buffer = QString::null;
+ break;
+ case StateCComment:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatComment, FALSE );
+ buffer = QString::null;
+ break;
+ case StateCppComment:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatComment, FALSE );
+ buffer = QString::null;
+ break;
+ case StateCCommentEnd1:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatComment, FALSE );
+ buffer = QString::null;
+ break;
+ case StateCCommentEnd2:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatComment, FALSE );
+ buffer = QString::null;
+ break;
+ case StateStringStart:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatStandard, FALSE );
+ buffer = QString::null;
+ break;
+ case StateString:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatString, FALSE );
+ buffer = QString::null;
+ break;
+ case StateStringEnd:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatStandard, FALSE );
+ buffer = QString::null;
+ break;
+ case StateString2Start:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatStandard, FALSE );
+ buffer = QString::null;
+ break;
+ case StateString2:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatString, FALSE );
+ buffer = QString::null;
+ break;
+ case StateString2End:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatStandard, FALSE );
+ buffer = QString::null;
+ break;
+ case StateNumber:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatNumber, FALSE );
+ buffer = QString::null;
+ break;
+ case StatePreProcessor:
+ if ( makeLastStandard )
+ string->setFormat( i - 1, 1, formatStandard, FALSE );
+ makeLastStandard = FALSE;
+ string->setFormat( i, 1, formatPreProcessor, FALSE );
+ buffer = QString::null;
+ break;
+ }
+
+ lastChar = c;
+ i++;
+ if ( i >= string->length() )
+ break;
+ }
+
+ string->setExtraData( paragData );
+
+ int oldEndState = string->endState();
+ if ( state == StateCComment ||
+ state == StateCCommentEnd1 ) {
+ string->setEndState( StateCComment );
+ } else if ( state == StateString ) {
+ string->setEndState( StateString );
+ } else if ( state == StateString2 ) {
+ string->setEndState( StateString2 );
+ } else {
+ string->setEndState( StateStandard );
+ }
+
+ string->setFirstPreProcess( FALSE );
+
+ QTextParagraph *p = string->next();
+ if ( (!!oldEndState || !!string->endState()) && oldEndState != string->endState() &&
+ invalidate && p && !p->firstPreProcess() && p->endState() != -1 ) {
+ while ( p ) {
+ if ( p->endState() == -1 )
+ return;
+ p->setEndState( -1 );
+ p = p->next();
+ }
+ }
+}
+
+QTextFormat *SyntaxHighlighter_CPP::format( int id )
+{
+ if ( lastFormatId == id && lastFormat )
+ return lastFormat;
+
+ QTextFormat *f = formats[ id ];
+ lastFormat = f ? f : formats[ 0 ];
+ lastFormatId = id;
+ return lastFormat;
+}
+
+void SyntaxHighlighter_CPP::addFormat( int id, QTextFormat *f )
+{
+ formats.insert( id, f );
+}
+
+void SyntaxHighlighter_CPP::removeFormat( int id )
+{
+ formats.remove( id );
+}
+
diff --git a/tools/designer/plugins/cppeditor/syntaxhighliter_cpp.h b/tools/designer/plugins/cppeditor/syntaxhighliter_cpp.h
new file mode 100644
index 0000000..ea973d9
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/syntaxhighliter_cpp.h
@@ -0,0 +1,73 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef QCPPSYNTAXHIGHLIGHTER_H
+#define QCPPSYNTAXHIGHLIGHTER_H
+
+#include <private/qrichtext_p.h>
+#include <conf.h>
+
+class SyntaxHighlighter_CPP : public QTextPreProcessor
+{
+public:
+ enum CppIds {
+ Comment = 1,
+ Number,
+ String,
+ Type,
+ Keyword,
+ PreProcessor,
+ Label
+ };
+
+ SyntaxHighlighter_CPP();
+ virtual ~SyntaxHighlighter_CPP();
+ void process( QTextDocument *doc, QTextParagraph *string, int start, bool invalidate = TRUE );
+ void updateStyles( const QMap<QString, ConfigStyle> &styles );
+
+ static const char * const keywords[];
+
+ QTextFormat *format( int id );
+
+private:
+ void addFormat( int id, QTextFormat *f );
+ void removeFormat( int id );
+
+ QTextFormat *lastFormat;
+ int lastFormatId;
+ QIntDict<QTextFormat> formats;
+
+};
+
+#endif
diff --git a/tools/designer/plugins/cppeditor/yyreg.cpp b/tools/designer/plugins/cppeditor/yyreg.cpp
new file mode 100644
index 0000000..144c99f
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/yyreg.cpp
@@ -0,0 +1,800 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qregexp.h>
+
+#include <ctype.h>
+#include <stdio.h>
+
+#include "yyreg.h"
+
+/*
+ First comes the tokenizer. We don't need something that knows much
+ about C++. However, we need something that gives tokens from the
+ end of the file to the start, which is tricky.
+
+ If you are not familiar with hand-written tokenizers and parsers,
+ you might want to read other simpler parsers written in the same
+ style:
+
+ $(QTDIR)/src/tools/qregexp.cpp
+ $(QTDIR)/tools/inspector/cppparser.cpp
+
+ You might also want to read Section 2 in the Dragon Book.
+*/
+
+/*
+ Those are the tokens we are interested in. Tok_Something represents
+ any C++ token that does not interest us, but it's dangerous to
+ ignore tokens completely.
+*/
+enum { Tok_Boi, Tok_Ampersand, Tok_Aster, Tok_LeftParen, Tok_RightParen,
+ Tok_Equal, Tok_LeftBrace, Tok_RightBrace, Tok_Semicolon, Tok_Colon,
+ Tok_LeftAngle, Tok_RightAngle, Tok_Comma, Tok_Ellipsis, Tok_Gulbrandsen,
+ Tok_LeftBracket, Tok_RightBracket, Tok_Tilde, Tok_Something, Tok_Comment,
+ Tok_Ident,
+
+ Tok_char, Tok_const, Tok_double, Tok_int, Tok_long, Tok_operator,
+ Tok_short, Tok_signed, Tok_unsigned };
+
+/*
+ The following variables store the lexical analyzer state. The best way
+ to understand them is to implement a function myGetToken() that calls
+ getToken(), to add some qDebug() statements in there and then to
+ #define getToken() myGetToken().
+*/
+static QString *yyIn; // the input stream
+static int yyPos; // the position of the current token in yyIn
+static int yyCurPos; // the position of the next lookahead character
+static char *yyLexBuf; // the lexeme buffer
+static const int YYLexBufSize = 65536; // big enough for long comments
+static char *yyLex; // the lexeme itself (a pointer into yyLexBuf)
+static int yyCh; // the lookbehind character
+
+/*
+ Moves back to the previous character in the input stream and
+ updates the tokenizer state. This function is to be used only by
+ getToken(), which provides the right abstraction.
+*/
+static inline void readChar()
+{
+ if ( yyCh == EOF )
+ return;
+
+ if ( yyLex > yyLexBuf )
+ *--yyLex = (char) yyCh;
+
+ if ( yyCurPos < 0 )
+ yyCh = EOF;
+ else
+ yyCh = (*yyIn)[yyCurPos].unicode();
+ yyCurPos--;
+}
+
+/*
+ Sets up the tokenizer.
+*/
+static void startTokenizer( const QString& in )
+{
+ yyIn = new QString;
+ *yyIn = in;
+ yyPos = yyIn->length() - 1;
+ yyCurPos = yyPos;
+ yyLexBuf = new char[YYLexBufSize];
+ yyLex = yyLexBuf + YYLexBufSize - 1;
+ *yyLex = '\0';
+ yyCh = '\0';
+ readChar();
+}
+
+/*
+ Frees resources allocated by the tokenizer.
+*/
+static void stopTokenizer()
+{
+ delete yyIn;
+ delete[] yyLexBuf;
+ yyLexBuf = 0;
+}
+
+/*
+ These two macros implement quick-and-dirty hashing for telling
+ apart keywords fast.
+*/
+#define HASH( ch, len ) ( (ch) | ((len) << 8) )
+#define CHECK( target ) \
+ if ( strcmp((target), yyLex) != 0 ) \
+ break;
+
+/*
+ Returns the previous token in the abstract token stream. The parser
+ deals only with tokens, not with characters.
+*/
+static int getToken()
+{
+ // why "+ 2"? try putting some qDebug()'s and see
+ yyPos = yyCurPos + 2;
+
+ for ( ;; ) {
+ /*
+ See if the previous token is interesting. If it isn't, we
+ will loop anyway an go to the token before the previous
+ token, and so on.
+ */
+
+ yyLex = yyLexBuf + YYLexBufSize - 1;
+ *yyLex = '\0';
+
+ if ( yyCh == EOF ) {
+ break;
+ } else if ( isspace(yyCh) ) {
+ bool metNL = FALSE;
+ do {
+ metNL = ( metNL || yyCh == '\n' );
+ readChar();
+ } while ( isspace(yyCh) );
+
+ if ( metNL ) {
+ /*
+ C++ style comments are tricky. In left-to-right
+ thinking, C++ comments start with "//" and end with
+ '\n'. In right-to-left thinking, they start with a
+ '\n'; but of course not every '\n' starts a comment.
+
+ When we meet the '\n', we look behind, on the same
+ line, for a "//", and if there is one we mess
+ around with the tokenizer state to effectively
+ ignore the comment. Beware of off-by-one and
+ off-by-two bugs when you modify this code by adding
+ qDebug()'s here and there.
+ */
+ if ( yyCurPos >= 0 ) {
+ int lineStart = yyIn->findRev( QChar('\n'), yyCurPos ) + 1;
+ QString line = yyIn->mid( lineStart,
+ yyCurPos - lineStart + 2 );
+ int commentStart = line.find( QString("//") );
+ if ( commentStart != -1 ) {
+ yyCurPos = lineStart + commentStart - 1;
+ yyPos = yyCurPos + 2;
+ readChar();
+ }
+ }
+ }
+ } else if ( isalnum(yyCh) || yyCh == '_' ) {
+ do {
+ readChar();
+ } while ( isalnum(yyCh) || yyCh == '_' );
+
+ switch ( HASH(yyLex[0], strlen(yyLex)) ) {
+ case HASH( 'c', 4 ):
+ CHECK( "char" );
+ return Tok_char;
+ case HASH( 'c', 5 ):
+ CHECK( "const" );
+ return Tok_const;
+ case HASH( 'd', 6 ):
+ CHECK( "double" );
+ return Tok_double;
+ case HASH( 'i', 3 ):
+ CHECK( "int" );
+ return Tok_int;
+ case HASH( 'l', 4 ):
+ CHECK( "long" );
+ return Tok_long;
+ case HASH( 'o', 8 ):
+ CHECK( "operator" );
+ return Tok_operator;
+ case HASH( 's', 5 ):
+ CHECK( "short" );
+ return Tok_short;
+ case HASH( 's', 6 ):
+ CHECK( "signed" );
+ return Tok_signed;
+ case HASH( 'u', 8 ):
+ CHECK( "unsigned" );
+ return Tok_unsigned;
+ }
+ if ( isdigit(*yyLex) )
+ return Tok_Something;
+ else
+ return Tok_Ident;
+ } else {
+ int quote;
+
+ switch ( yyCh ) {
+ case '!':
+ case '%':
+ case '^':
+ case '+':
+ case '-':
+ case '?':
+ case '|':
+ readChar();
+ return Tok_Something;
+ case '"':
+ case '\'':
+ quote = yyCh;
+ readChar();
+
+ while ( yyCh != EOF && yyCh != '\n' ) {
+ if ( yyCh == quote ) {
+ readChar();
+ if ( yyCh != '\\' )
+ break;
+ } else {
+ readChar();
+ }
+ }
+ return Tok_Something;
+ case '&':
+ readChar();
+ if ( yyCh == '&' ) {
+ readChar();
+ return Tok_Something;
+ } else {
+ return Tok_Ampersand;
+ }
+ case '(':
+ readChar();
+ return Tok_LeftParen;
+ case ')':
+ readChar();
+ return Tok_RightParen;
+ case '*':
+ readChar();
+ return Tok_Aster;
+ case ',':
+ readChar();
+ return Tok_Comma;
+ case '.':
+ readChar();
+ if ( yyCh == '.' ) {
+ do {
+ readChar();
+ } while ( yyCh == '.' );
+ return Tok_Ellipsis;
+ } else {
+ return Tok_Something;
+ }
+ case '/':
+ /*
+ C-style comments are symmetric. C++-style comments
+ are handled elsewhere.
+ */
+ readChar();
+ if ( yyCh == '*' ) {
+ bool metAster = FALSE;
+ bool metAsterSlash = FALSE;
+
+ readChar();
+
+ while ( !metAsterSlash ) {
+ if ( yyCh == EOF )
+ break;
+
+ if ( yyCh == '*' )
+ metAster = TRUE;
+ else if ( metAster && yyCh == '/' )
+ metAsterSlash = TRUE;
+ else
+ metAster = FALSE;
+ readChar();
+ }
+ break;
+ // return Tok_Comment;
+ } else {
+ return Tok_Something;
+ }
+ case ':':
+ readChar();
+ if ( yyCh == ':' ) {
+ readChar();
+ return Tok_Gulbrandsen;
+ } else {
+ return Tok_Colon;
+ }
+ case ';':
+ readChar();
+ return Tok_Semicolon;
+ case '<':
+ readChar();
+ return Tok_LeftAngle;
+ case '=':
+ readChar();
+ return Tok_Equal;
+ case '>':
+ readChar();
+ return Tok_RightAngle;
+ case '[':
+ readChar();
+ return Tok_LeftBracket;
+ case ']':
+ readChar();
+ return Tok_RightBracket;
+ case '{':
+ readChar();
+ return Tok_LeftBrace;
+ case '}':
+ readChar();
+ return Tok_RightBrace;
+ case '~':
+ readChar();
+ return Tok_Tilde;
+ default:
+ readChar();
+ }
+ }
+ }
+ return Tok_Boi;
+}
+
+/*
+ Follow the member function(s) of CppFunction.
+*/
+
+/*
+ Returns the prototype for the C++ function, without the semicolon.
+*/
+QString CppFunction::prototype() const
+{
+ QString proto;
+
+ if ( !returnType().isEmpty() )
+ proto = returnType() + QChar( ' ' );
+ proto += scopedName();
+ proto += QChar( '(' );
+ if ( !parameterList().isEmpty() ) {
+ QStringList::ConstIterator p = parameterList().begin();
+ proto += *p;
+ ++p;
+ while ( p != parameterList().end() ) {
+ proto += QString( ", " );
+ proto += *p;
+ ++p;
+ }
+ }
+ proto += QChar( ')' );
+ if ( isConst() )
+ proto += QString( " const" );
+ return proto;
+}
+
+/*
+ The parser follows. We are not really parsing C++, just trying to
+ find the start and end of function definitions.
+
+ One important pitfall is that the parsed code needs not be valid.
+ Parsing from right to left helps cope with that, as explained in
+ comments below.
+
+ In the examples, we will use the symbol @ to stand for the position
+ in the token stream. In "int @ x ;", the lookahead token (yyTok) is
+ 'int'.
+*/
+
+static int yyTok; // the current token
+
+/*
+ Returns TRUE if thingy is a constructor or a destructor; otherwise
+ returns FALSE.
+*/
+static bool isCtorOrDtor( const QString& thingy )
+{
+ // e.g., Alpha<a>::Beta<Bar<b, c> >::~Beta
+ QRegExp xtor( QString(
+ "(?:([A-Z_a-z][0-9A-Z_a-z]*)" // class name
+ "(?:<(?:[^>]|<[^>]*>)*>)*" // template arguments
+ "::)+" // many in a row
+ "~?" // ctor or dtor?
+ "\\1") ); // function has same name as class
+ return xtor.exactMatch( thingy );
+}
+
+/*
+ Skips over any template arguments with balanced angle brackets, and
+ returns the skipped material as a string.
+
+ Before: QMap < QString , QValueList < QString > > @ m ;
+ After: QMap @ < QString , QValueList < QString > > m ;
+*/
+static QString matchTemplateAngles()
+{
+ QString t;
+
+ if ( yyTok == Tok_RightAngle ) {
+ int depth = 0;
+ do {
+ if ( yyTok == Tok_RightAngle )
+ depth++;
+ else if ( yyTok == Tok_LeftAngle )
+ depth--;
+ t.prepend( yyLex );
+ yyTok = getToken();
+ } while ( depth > 0 && yyTok != Tok_Boi && yyTok != Tok_LeftBrace );
+ }
+ return t;
+}
+
+/*
+ Similar to matchTemplateAngles(), but for array brackets in parameter
+ data types (as in "int *argv[]").
+*/
+static QString matchArrayBrackets()
+{
+ QString t;
+
+ while ( yyTok == Tok_RightBracket ) {
+ t.prepend( yyLex );
+ yyTok = getToken();
+ if ( yyTok == Tok_Something ) {
+ t.prepend( yyLex );
+ yyTok = getToken();
+ }
+ if ( yyTok != Tok_LeftBracket )
+ return QString::null;
+ t.prepend( yyLex );
+ yyTok = getToken();
+ }
+ return t;
+}
+
+/*
+ Prepends prefix to *type. This operation is in theory trivial, but
+ for the spacing to look good, we have to do something. The original
+ spacing is lost as the input is tokenized.
+*/
+static void prependToType( QString *type, const QString& prefix )
+{
+ if ( !type->isEmpty() && !prefix.isEmpty() ) {
+ QChar left = prefix[(int) prefix.length() - 1];
+ QChar right = (*type)[0];
+
+ if ( left.isLetter() &&
+ (right.isLetter() || right == QChar('*') || right == QChar('&')) )
+ type->prepend( QChar(' ') );
+ }
+ type->prepend( prefix );
+}
+
+static bool isModifier( int tok )
+{
+ return ( tok == Tok_signed || tok == Tok_unsigned ||
+ tok == Tok_short || tok == Tok_long );
+}
+
+/*
+ Parses a data type (backwards as usual) and returns a textual
+ representation of it.
+*/
+static QString matchDataType()
+{
+ QString type;
+
+ while ( yyTok == Tok_Ampersand || yyTok == Tok_Aster ||
+ yyTok == Tok_const ) {
+ prependToType( &type, yyLex );
+ yyTok = getToken();
+ }
+
+ /*
+ This code is really hard to follow... sorry. The loop matches
+ Alpha::Beta::Gamma::...::Omega.
+ */
+ for ( ;; ) {
+ bool modifierMet = FALSE;
+
+ prependToType( &type, matchTemplateAngles() );
+
+ if ( yyTok != Tok_Ident ) {
+ /*
+ People may write 'const unsigned short' or
+ 'short unsigned const' or any other permutation.
+ */
+ while ( yyTok == Tok_const || isModifier(yyTok) ) {
+ prependToType( &type, yyLex );
+ yyTok = getToken();
+ if ( yyTok != Tok_const )
+ modifierMet = TRUE;
+ }
+
+ if ( yyTok == Tok_Tilde ) {
+ prependToType( &type, yyLex );
+ yyTok = getToken();
+ }
+ }
+
+ if ( !modifierMet ) {
+ if ( yyTok == Tok_Ellipsis || yyTok == Tok_Ident ||
+ yyTok == Tok_char || yyTok == Tok_int ||
+ yyTok == Tok_double ) {
+ prependToType( &type, yyLex );
+ yyTok = getToken();
+ } else {
+ return QString::null;
+ }
+ } else if ( yyTok == Tok_int || yyTok == Tok_char ||
+ yyTok == Tok_double ) {
+ prependToType( &type, yyLex );
+ yyTok = getToken();
+ }
+
+ while ( yyTok == Tok_const || isModifier(yyTok) ) {
+ prependToType( &type, yyLex );
+ yyTok = getToken();
+ }
+
+ if ( yyTok == Tok_Gulbrandsen ) {
+ prependToType( &type, yyLex );
+ yyTok = getToken();
+ } else {
+ break;
+ }
+ }
+ return type;
+}
+
+/*
+ Parses a function prototype (without the semicolon) and returns an
+ object that stores information about this function.
+*/
+static CppFunction matchFunctionPrototype( bool stripParamNames )
+{
+ CppFunction func;
+#if 0
+ QString documentation;
+#endif
+ QString returnType;
+ QString scopedName;
+ QStringList params;
+ QString qualifier;
+ bool cnst = FALSE;
+
+ if ( yyTok == Tok_const ) {
+ cnst = TRUE;
+ yyTok = getToken();
+ }
+
+ if ( yyTok != Tok_RightParen )
+ return func;
+ yyTok = getToken();
+
+ if ( yyTok != Tok_LeftParen ) {
+ for ( ;; ) {
+ QString brackets = matchArrayBrackets();
+ QString name;
+ if ( yyTok == Tok_Ident ) {
+ name = yyLex;
+ yyTok = getToken();
+ }
+ QString type = matchDataType();
+
+ if ( type.isEmpty() ) {
+ if ( name.isEmpty() )
+ return func;
+ type = name;
+ name = QString::null;
+ }
+ if ( stripParamNames )
+ name = QString::null;
+
+ QString param = type + QChar( ' ' ) + name + brackets;
+ params.prepend( param.stripWhiteSpace() );
+
+ if ( yyTok != Tok_Comma )
+ break;
+ yyTok = getToken();
+ }
+ if ( yyTok != Tok_LeftParen )
+ return func;
+ }
+ yyTok = getToken();
+
+ for ( ;; ) {
+ scopedName.prepend( matchTemplateAngles() );
+
+ if ( yyTok != Tok_Ident ) {
+ // the operator keyword should be close
+ int i = 0;
+ while ( i < 4 && yyTok != Tok_operator ) {
+ scopedName.prepend( yyLex );
+ i++;
+ }
+ if ( yyTok != Tok_operator )
+ return func;
+ }
+ scopedName.prepend( yyLex );
+ yyTok = getToken();
+
+ if ( yyTok != Tok_Gulbrandsen )
+ break;
+ scopedName.prepend( yyLex );
+ yyTok = getToken();
+ }
+
+ if ( !isCtorOrDtor(scopedName) ) {
+ returnType = matchDataType();
+ if ( returnType.isEmpty() )
+ return func;
+ }
+
+ /*
+ The documentation feature is unused so far, since we cannot
+ really distinguist between a normal comment between two
+ functions and one that relates to the following function. One
+ good heuristic is to assume that a comment immediately followed
+ by a function with no blank line in between relates to the
+ function, but there's no easy way to find that out with a
+ tokenizer.
+ */
+#if 0
+ if ( yyTok == Tok_Comment ) {
+ documentation = yyLex;
+ yyTok = getToken();
+ }
+
+ func.setDocumentation( documentation );
+#endif
+ func.setReturnType( returnType );
+ func.setScopedName( scopedName );
+ func.setParameterList( params );
+ func.setConst( cnst );
+ return func;
+}
+
+/*
+ Try to set the body. It's not sufficient to call
+ func->setBody(somewhatBody), as the somewhatBody might be too large.
+ Case in point:
+
+ void foo()
+ {
+ printf( "Hello" );
+ }
+
+ int n;
+
+ void bar()
+ {
+ printf( " world!\n" );
+ }
+
+ The parser first finds bar(). Then it finds "void foo() {" and
+ naively expects the body to extend up to "void bar()". This
+ function's job is to count braces and make sure "int n;" is not
+ counted as part of the body.
+
+ Cases where the closing brace of the body is missing require no
+ special processing.
+*/
+static void setBody( CppFunction *func, const QString& somewhatBody )
+{
+ QString body = somewhatBody;
+
+ int braceDepth = 0;
+ int i = 0;
+ while ( i < (int) body.length() ) {
+ if ( body[i] == QChar('{') ) {
+ braceDepth++;
+ } else if ( body[i] == QChar('}') ) {
+ braceDepth--;
+ if ( braceDepth == 0 ) {
+ body.truncate( i + 1 );
+ break;
+ }
+ }
+ i++;
+ }
+
+ func->setBody( body );
+}
+
+/*
+ Parses a whole C++ file, looking for function definitions. Case in
+ point:
+
+ void foo()
+ {
+ printf( "Hello" );
+
+ void bar()
+ {
+ printf( " world!\n" );
+ }
+
+ The parser looks for left braces and tries to parse a function
+ prototype backwards. First it finds "void bar() {". Then it works
+ up and finds "void foo() {".
+*/
+static void matchTranslationUnit( QValueList<CppFunction> *flist )
+{
+ int endBody = -1;
+ int startBody;
+
+ for ( ;; ) {
+ if ( endBody == -1 )
+ endBody = yyPos;
+
+ while ( yyTok != Tok_Boi && yyTok != Tok_LeftBrace )
+ yyTok = getToken();
+ if ( yyTok == Tok_Boi )
+ break;
+
+ // found a left brace
+ yyTok = getToken();
+ startBody = yyPos;
+ CppFunction func = matchFunctionPrototype( FALSE );
+ if ( !func.scopedName().isEmpty() ) {
+ QString body = yyIn->mid( startBody, endBody - startBody );
+ setBody( &func, body );
+ body = func.body(); // setBody() can change the body
+
+ /*
+ Compute important line numbers.
+ */
+ int functionStartLineNo = 1 + QConstString( yyIn->unicode(), yyPos )
+ .string().contains( QChar('\n') );
+ int startLineNo = functionStartLineNo +
+ QConstString( yyIn->unicode() + yyPos, startBody - yyPos )
+ .string().contains( QChar('\n') );
+ int endLineNo = startLineNo + body.contains( QChar('\n') );
+
+ func.setLineNums( functionStartLineNo, startLineNo, endLineNo );
+ flist->prepend( func );
+ endBody = -1;
+ }
+ }
+}
+
+/*
+ Extracts C++ function from source code and put them in a list.
+*/
+void extractCppFunctions( const QString& code, QValueList<CppFunction> *flist )
+{
+ startTokenizer( code );
+ yyTok = getToken();
+ matchTranslationUnit( flist );
+ stopTokenizer();
+}
+
+/*
+ Returns the prototype with the parameter names removed.
+*/
+QString canonicalCppProto( const QString& proto )
+{
+ startTokenizer( proto );
+ yyTok = getToken();
+ CppFunction func = matchFunctionPrototype( TRUE );
+ stopTokenizer();
+ return func.prototype();
+}
diff --git a/tools/designer/plugins/cppeditor/yyreg.h b/tools/designer/plugins/cppeditor/yyreg.h
new file mode 100644
index 0000000..f75c948
--- /dev/null
+++ b/tools/designer/plugins/cppeditor/yyreg.h
@@ -0,0 +1,88 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef YYREG_H
+#define YYREG_H
+
+#include <qstringlist.h>
+#include <qvaluelist.h>
+
+class CppFunction
+{
+public:
+ CppFunction() : cnst( FALSE ), lineno1( 0 ), lineno2( 0 ) { }
+
+ void setReturnType( const QString& r ) { ret = r; }
+ void setScopedName( const QString& n ) { nam = n; }
+ void setParameterList( const QStringList& p ) { params = p; }
+ void setConst( bool c ) { cnst = c; }
+ void setBody( const QString& b ) { bod = b; }
+ void setDocumentation( const QString& d ) { doc = d; }
+ void setLineNums( int functionStart, int openingBrace, int closingBrace ) {
+ lineno0 = functionStart;
+ lineno1 = openingBrace;
+ lineno2 = closingBrace;
+ }
+
+ const QString& returnType() const { return ret; }
+ const QString& scopedName() const { return nam; }
+ const QStringList& parameterList() const { return params; }
+ bool isConst() const { return cnst; }
+ QString prototype() const;
+ const QString& body() const { return bod; }
+ const QString& documentation() const { return doc; }
+ int functionStartLineNum() const { return lineno0; }
+ int openingBraceLineNum() const { return lineno1; }
+ int closingBraceLineNum() const { return lineno2; }
+
+#if defined(Q_FULL_TEMPLATE_INSTANTIATION)
+ bool operator==( const CppFunction& ) const { return FALSE; }
+#endif
+
+private:
+ QString ret;
+ QString nam;
+ QStringList params;
+ bool cnst;
+ QString bod;
+ QString doc;
+ int lineno0;
+ int lineno1;
+ int lineno2;
+};
+
+void extractCppFunctions( const QString& code, QValueList<CppFunction> *flist );
+QString canonicalCppProto( const QString& proto );
+
+#endif
diff --git a/tools/designer/plugins/dlg/dlg.pro b/tools/designer/plugins/dlg/dlg.pro
new file mode 100644
index 0000000..ee93cb9
--- /dev/null
+++ b/tools/designer/plugins/dlg/dlg.pro
@@ -0,0 +1,13 @@
+TEMPLATE = lib
+CONFIG += qt warn_on release plugin
+HEADERS = dlg2ui.h
+SOURCES = main.cpp dlg2ui.cpp
+DESTDIR = ../../../../plugins/designer
+DEFINES += QT_INTERNAL_XML
+include( ../../../../src/qt_professional.pri )
+TARGET = dlgplugin
+INCLUDEPATH += ../../interfaces
+
+
+target.path += $$plugins.path/designer
+INSTALLS += target
diff --git a/tools/designer/plugins/dlg/dlg2ui.cpp b/tools/designer/plugins/dlg/dlg2ui.cpp
new file mode 100644
index 0000000..c309eb2
--- /dev/null
+++ b/tools/designer/plugins/dlg/dlg2ui.cpp
@@ -0,0 +1,1632 @@
+/**********************************************************************
+**
+** Converts a Qt Architect 2.1+ .dlg file into a .ui file.
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "dlg2ui.h"
+#include <qfile.h>
+#include <qframe.h>
+#include <qmessagebox.h>
+#include <qregexp.h>
+#include <qtextstream.h>
+
+/*
+ Possible improvements:
+
+ 1. Convert layout stretch factors to size policy stretches, now
+ that Qt Designer supports the latter.
+*/
+
+/*
+ These big tables could be more or less eliminated by using Qt's
+ QMetaObject and QMetaProperty classes. However, the interface of
+ these classes is unwieldy for an otherwise non-GUI program like this
+ one, as we would have to create one dummy object for most QObject
+ subclasses in Qt. Let's take the safe road.
+*/
+
+static const char *widgetTypes[] = {
+ "Button", "ButtonGroup", "CheckBox", "ComboBox", "Dial", "DlgWidget",
+ "Frame", "Grid", "GroupBox", "HBox", "HButtonGroup", "HGroupBox",
+ "IconView", "LCDNumber", "Label", "LineEdit", "ListBox", "ListView",
+ "MenuBar", "MultiLineEdit", "ProgressBar", "PushButton", "RadioButton",
+ "ScrollBar", "ScrollView", "Slider", "SpinBox", "Splitter", "TabBar",
+ "TextBrowser", "TextView", "User", "VBox", "VButtonGroup", "VGroupBox", 0
+};
+
+/*
+ This table maps Qt Architect properties to Qt Designer properties.
+ If there is no corresponding Qt Designer property, qtName is 0 and
+ the property can be handled explicitly.
+*/
+static const struct {
+ const char *widgetName;
+ const char *architectName;
+ const char *qtName;
+ const char *type;
+} propertyDefs[] = {
+ { "Button", "AutoRepeat", "autoRepeat", "boolean" },
+ { "Button", "AutoResize", 0, 0 },
+ { "Button", "Text", "text", "qstring" },
+ { "ButtonGroup", "Exclusive", "exclusive", "boolean" },
+ { "ButtonGroup", "RadioButtonExclusive", "radioButtonExclusive",
+ "boolean" },
+ { "CheckBox", "Checked", "checked", "boolean" },
+ { "ComboBox", "AutoCompletion", "autoCompletion", "boolean" },
+ { "ComboBox", "AutoResize", 0, 0 },
+ { "ComboBox", "DuplicatesEnabled", "duplicatesEnabled", "boolean" },
+ { "ComboBox", "MaxCount", "maxCount", "integer" },
+ { "ComboBox", "Policy", "insertionPolicy", "enum" },
+ { "ComboBox", "SizeLimit", "sizeLimit", "integer" },
+ { "ComboBox", "Style", 0, 0 },
+ { "Dial", "Initial", "value", "integer" },
+ { "Dial", "LineStep", "lineStep", "integer" },
+ { "Dial", "MaxValue", "maxValue", "integer" },
+ { "Dial", "MinValue", "minValue", "integer" },
+ { "Dial", "NotchTarget", "notchTarget", "double" },
+ { "Dial", "PageStep", "pageStep", "integer" },
+ { "Dial", "ShowNotches", "notchesVisible", "boolean" },
+ { "Dial", "Tracking", "tracking", "boolean" },
+ { "Dial", "Wrapping", "wrapping", "boolean" },
+ { "DlgWidget", "AdjustSize", 0, 0 },
+ { "DlgWidget", "BackgroundMode", "backgroundMode", "enum" },
+ { "DlgWidget", "BackgroundOrigin", "backgroundOrigin", "enum" },
+ { "DlgWidget", "BackgroundPixmap", "backgroundPixmap", "qpixmap" },
+ { "DlgWidget", "DataLenName", 0, 0 },
+ { "DlgWidget", "DataVarName", 0, 0 },
+ { "DlgWidget", "Enabled", "enabled", "boolean" },
+ { "DlgWidget", "FocusPolicy", "focusPolicy", "enum" },
+ { "DlgWidget", "Font", "font", "qfont" },
+ { "DlgWidget", "FontPropagation", 0, 0 },
+ { "DlgWidget", "MaximumSize", "maximumSize", "qsize" },
+ { "DlgWidget", "MinimumSize", "minimumSize", "qsize" },
+ { "DlgWidget", "Name", 0, 0 },
+ { "DlgWidget", "Palette", "palette", "qpalette" },
+ { "DlgWidget", "PalettePropagation", 0, 0 },
+ { "DlgWidget", "ReadPixmapFromData", 0, 0 },
+ { "DlgWidget", "Rect", 0, 0 },
+ { "DlgWidget", "SignalConnection", 0, 0 },
+ { "DlgWidget", "UseBackgroudPixmap", 0, 0 },
+ { "DlgWidget", "Variable", 0, 0 },
+ { "Frame", "FrameMargin", "margin", "integer" },
+ { "Frame", "LineWidth", "lineWidth", "integer" },
+ { "Frame", "MidLineWidth", "midLineWidth", "integer" },
+ { "Frame", "Style", 0, 0 },
+ { "GroupBox", "Title", "title", "qstring" },
+ { "IconView", "AlignMode", 0, 0 },
+ { "IconView", "Aligning", 0, 0 },
+ { "IconView", "Arrangement", "arrangement", "enum" },
+ { "IconView", "AutoArrange", "autoArrange", "boolean" },
+ { "IconView", "EnableMoveItems", "itemsMovable", "boolean" },
+ { "IconView", "GridX", "gridX", "integer" },
+ { "IconView", "GridY", "gridY", "integer" },
+ { "IconView", "ItemTextPos", "itemTextPos", "enum" },
+ { "IconView", "ItemsMovable", "itemsMovable", "boolean" },
+ { "IconView", "MaxItemTextLength", "maxItemTextLength", "integer" },
+ { "IconView", "MaxItemWidth", "maxItemWidth", "integer" },
+ { "IconView", "ResizeMode", "resizeMode", "enum" },
+ { "IconView", "SelectionMode", "selectionMode", "enum" },
+ { "IconView", "ShowToolTips", "showToolTips", "boolean" },
+ { "IconView", "SortAscending", "sortDirection", "bool" },
+ { "IconView", "Spacing", "spacing", "integer" },
+ { "IconView", "WordWrapIconText", "wordWrapIconText", "boolean" },
+ { "LCDNumber", "Digits", "numDigits", "integer" },
+ { "LCDNumber", "Mode", "mode", "enum" },
+ { "LCDNumber", "SegmentStyle", "segmentStyle", "enum" },
+ { "LCDNumber", "SmallDecimalPoint", "smallDecimalPoint", "boolean" },
+ { "LCDNumber", "Value", 0, 0 },
+ { "Label", "AutoResize", 0, 0 },
+ { "Label", "Indent", "indent", "integer" },
+ { "Label", "Text", "text", "qstring" },
+ { "Label", "TextFormat", "textFormat", "enum" },
+ { "LineEdit", "EchoMode", "echoMode", "enum" },
+ { "LineEdit", "FrameShown", "frame", "boolean" },
+ { "LineEdit", "MaxLength", "maxLength", "integer" },
+ { "LineEdit", "Text", "text", "qstring" },
+ { "ListBox", "AutoScroll", 0, 0 },
+ { "ListBox", "AutoUpdate", 0, 0 },
+ { "ListBox", "ColumnMode", "columnMode", "enum" },
+ { "ListBox", "DragSelect", 0, 0 },
+ { "ListBox", "RowMode", "rowMode", "enum" },
+ { "ListBox", "SelectionMode", "selectionMode", "enum" },
+ { "ListBox", "SmoothScrolling", 0, 0 },
+ { "ListView", "AllColumnsShowFocus", "allColumnsShowFocus", "boolean" },
+ { "ListView", "HeaderInformation", 0, 0 },
+ { "ListView", "ItemMargin", "itemMargin", "integer" },
+ { "ListView", "MultiSelection", "multiSelection", "boolean" },
+ { "ListView", "RootIsDecorated", "rootIsDecorated", "boolean" },
+ { "ListView", "TreeStepSize", "treeStepSize", "boolean" },
+ { "MultiLineEdit", "AutoUpdate", 0, 0 },
+ { "MultiLineEdit", "EchoMode", 0, 0 },
+ { "MultiLineEdit", "HorizontalMargin", 0, 0 },
+ { "MultiLineEdit", "MaxLength", 0, 0 },
+ { "MultiLineEdit", "MaxLineLength", 0, 0 },
+ { "MultiLineEdit", "MaxLines", 0, 0 },
+ { "MultiLineEdit", "OverwriteMode", 0, 0 },
+ { "MultiLineEdit", "ReadOnly", 0, 0 },
+ { "MultiLineEdit", "Text", 0, 0 },
+ { "MultiLineEdit", "UndoDepth", "undoDepth", "integer" },
+ { "MultiLineEdit", "UndoEnabled", 0, 0 },
+ { "MultiLineEdit", "WordWrap", 0, 0 },
+ { "MultiLineEdit", "WrapColumnOrWidth", 0, 0 },
+ { "MultiLineEdit", "WrapPolicy", 0, 0 },
+ { "ProgressBar", "CenterIndicator", "centerIndicator", "boolean" },
+ { "ProgressBar", "IndicatorFollowsStyle", "indicatorFollowsStyle",
+ "boolean" },
+ { "ProgressBar", "Progress", "progress", "integer" },
+ { "ProgressBar", "TotalSteps", "totalSteps", "integer" },
+ { "PushButton", "AutoDefault", "autoDefault", "boolean" },
+ { "PushButton", "Default", "default", "boolean" },
+ { "PushButton", "IsMenuButton", 0, 0 },
+ { "PushButton", "ToggleButton", "toggleButton", "boolean" },
+ { "RadioButton", "Checked", "checked", "boolean" },
+ { "ScrollBar", "Initial", "value", "integer" },
+ { "ScrollBar", "LineStep", "lineStep", "integer" },
+ { "ScrollBar", "MaxValue", "maxValue", "integer" },
+ { "ScrollBar", "MinValue", "minValue", "integer" },
+ { "ScrollBar", "Orientation", "orientation", "enum" },
+ { "ScrollBar", "PageStep", "pageStep", "integer" },
+ { "ScrollBar", "Tracking", "tracking", "boolean" },
+ { "ScrollView", "DragAutoScroll", "dragAutoScroll", "boolean" },
+ { "ScrollView", "HScrollBarMode", "hScrollBarMode", "enum" },
+ { "ScrollView", "ResizePolicy", "resizePolicy", "enum" },
+ { "ScrollView", "VScrollBarMode", "vScrollBarMode", "enum" },
+ { "Slider", "Initial", "value", "integer" },
+ { "Slider", "LineStep", "lineStep", "integer" },
+ { "Slider", "MaxValue", "maxValue", "integer" },
+ { "Slider", "MinValue", "minValue", "integer" },
+ { "Slider", "Orientation", "orientation", "enum" },
+ { "Slider", "PageStep", "pageStep", "integer" },
+ { "Slider", "TickInterval", "tickInterval", "integer" },
+ { "Slider", "Tickmarks", "tickmarks", "enum" },
+ { "Slider", "Tracking", "tracking", "boolean" },
+ { "SpinBox", "ButtonSymbols", "buttonSymbols", "enum" },
+ { "SpinBox", "MaxValue", "maxValue", "integer" },
+ { "SpinBox", "MinValue", "minValue", "integer" },
+ { "SpinBox", "Prefix", "prefix", "qstring" },
+ { "SpinBox", "SpecialValue", "specialValueText", "qstring" },
+ { "SpinBox", "Step", "lineStep", "integer" },
+ { "SpinBox", "Suffix", "suffix", "qstring" },
+ { "SpinBox", "Wrapping", "wrapping", "boolean" },
+ { "Splitter", "OpaqueResize", 0, 0 },
+ { "Splitter", "Orientation", "orientation", "enum" },
+ { "TabBar", "Shape", "shape", "enum" },
+ { "TabBar", "TabNames", 0, 0 },
+ { "TextView", "Context", 0, 0 },
+ { "TextView", "LinkUnderline", "linkUnderline", "boolean" },
+ { "TextView", "Text", "text", "qstring" },
+ { "TextView", "TextFormat", "textFormat", "enum" },
+ { "User", "UserClassHeader", 0, 0 },
+ { "User", "UserClassName", 0, 0 },
+ { 0, 0, 0, 0 }
+};
+
+/*
+ This is the number of supported color groups in a palette, and
+ supported color roles in a color group. Changing these constants is
+ dangerous.
+*/
+static const int NumColorRoles = 14;
+
+static bool isTrue( const QString& val )
+{
+ return val.lower() == QString( "true" );
+}
+
+static AttributeMap attribute( const QString& name, const QString& val )
+{
+ AttributeMap attr;
+ attr.insert( name, val );
+ return attr;
+}
+
+static QString entitize( const QString& str )
+{
+ QString t = str;
+ t.replace( '&', QString("&amp;") );
+ t.replace( '>', QString("&gt;") );
+ t.replace( '<', QString("&lt;") );
+ t.replace( '"', QString("&quot;") );
+ t.replace( '\'', QString("&apos;") );
+ return t;
+}
+
+QString Dlg2Ui::alias( const QString& name ) const
+{
+ if ( yyAliasMap.contains(name) )
+ return yyAliasMap[name];
+ else
+ return name;
+}
+
+QString Dlg2Ui::opening( const QString& tag, const AttributeMap& attr )
+{
+ QString t = QChar( '<' ) + tag;
+ AttributeMap::ConstIterator a = attr.begin();
+ while ( a != attr.end() ) {
+ t += QChar( ' ' ) + a.key() + QString( "=\"" ) + entitize( *a ) +
+ QChar( '"' );
+ ++a;
+ }
+ t += QChar( '>' );
+ return t;
+}
+
+QString Dlg2Ui::closing( const QString& tag )
+{
+ return opening( QChar('/') + tag );
+}
+
+void Dlg2Ui::error( const QString& message )
+{
+ if ( numErrors++ == 0 )
+ QMessageBox::warning( 0, yyFileName, message );
+}
+
+void Dlg2Ui::syntaxError()
+{
+ error( QString("Sorry, I met a random syntax error. I did what I could, but"
+ " that was not enough."
+ "<p>You might want to write to"
+ " <tt>qt-bugs@trolltech.com</tt> about this incident.") );
+}
+
+QString Dlg2Ui::getTextValue( const QDomNode& node )
+{
+ if ( node.childNodes().count() > 1 ) {
+ syntaxError();
+ return QString::null;
+ }
+
+ if ( node.childNodes().count() == 0 )
+ return QString::null;
+
+ QDomText child = node.firstChild().toText();
+ if ( child.isNull() ) {
+ syntaxError();
+ return QString::null;
+ }
+ QString t = child.data().stripWhiteSpace();
+ t.replace( "\\\\", "\\" );
+ t.replace( "\\n", "\n" );
+ return t;
+}
+
+QVariant Dlg2Ui::getValue( const QDomNodeList& children, const QString& tagName,
+ const QString& type )
+{
+ for ( int i = 0; i < (int) children.count(); i++ ) {
+ QDomNode n = children.item( i );
+ if ( n.toElement().tagName() == tagName )
+ return getValue( n.toElement(), tagName, type );
+ }
+ return QVariant();
+}
+
+void Dlg2Ui::emitHeader()
+{
+ yyOut += QString( "<!DOCTYPE UI><UI version=\"3.0\" stdsetdef=\"1\">\n" );
+}
+
+void Dlg2Ui::emitFooter()
+{
+ yyOut += QString( "</UI>\n" );
+}
+
+void Dlg2Ui::emitSimpleValue( const QString& tag, const QString& value,
+ const AttributeMap& attr )
+{
+ yyOut += yyIndentStr + opening( tag, attr ) + entitize( value ) +
+ closing( tag ) + QChar( '\n' );
+}
+
+void Dlg2Ui::emitOpening( const QString& tag, const AttributeMap& attr )
+{
+ yyOut += yyIndentStr + opening( tag, attr ) + QChar( '\n' );
+ yyIndentStr += QString( " " );
+}
+
+void Dlg2Ui::emitClosing( const QString& tag )
+{
+ yyIndentStr.truncate( yyIndentStr.length() - 4 );
+ yyOut += yyIndentStr + closing( tag ) + QChar( '\n' );
+}
+
+void Dlg2Ui::emitOpeningWidget( const QString& className )
+{
+ AttributeMap attr = attribute( QString("class"), className );
+ if ( yyGridColumn >= 0 ) {
+ attr.insert( QString("row"), QString::number(yyGridRow) );
+ attr.insert( QString("column"), QString::number(yyGridColumn) );
+ yyGridColumn = -1;
+ }
+ emitOpening( QString("widget"), attr );
+}
+
+QString Dlg2Ui::widgetClassName( const QDomElement& e )
+{
+ if ( e.tagName() == QString("User") ) {
+ return getValue( e.childNodes(), QString("UserClassName") )
+ .toString();
+ } else if ( e.tagName() == QString("DlgWidget") ) {
+ return QString( "QWidget" );
+ } else {
+ return QChar( 'Q' ) + e.tagName();
+ }
+}
+
+void Dlg2Ui::emitColor( const QColor& color )
+{
+ emitOpening( QString("color") );
+ emitSimpleValue( QString("red"), QString::number(color.red()) );
+ emitSimpleValue( QString("green"), QString::number(color.green()) );
+ emitSimpleValue( QString("blue"), QString::number(color.blue()) );
+ emitClosing( QString("color") );
+}
+
+void Dlg2Ui::emitColorGroup( const QString& name, const QColorGroup& group )
+{
+ emitOpening( name );
+ for ( int i = 0; i < NumColorRoles; i++ )
+ emitColor( group.color((QColorGroup::ColorRole) i) );
+ emitClosing( name );
+}
+
+void Dlg2Ui::emitVariant( const QVariant& val, const QString& stringType )
+{
+ if ( val.isValid() ) {
+ switch ( val.type() ) {
+ case QVariant::String:
+ emitSimpleValue( stringType, val.toString() );
+ break;
+ case QVariant::CString:
+ emitSimpleValue( QString("cstring"), val.toString() );
+ break;
+ case QVariant::Bool:
+ emitSimpleValue( QString("bool"),
+ QString(val.toBool() ? "true" : "false") );
+ break;
+ case QVariant::Int:
+ case QVariant::UInt:
+ emitSimpleValue( QString("number"), val.toString() );
+ break;
+ case QVariant::Rect:
+ emitOpening( QString("rect") );
+ emitSimpleValue( QString("x"), QString::number(val.toRect().x()) );
+ emitSimpleValue( QString("y"), QString::number(val.toRect().y()) );
+ emitSimpleValue( QString("width"),
+ QString::number(val.toRect().width()) );
+ emitSimpleValue( QString("height"),
+ QString::number(val.toRect().height()) );
+ emitClosing( QString("rect") );
+ break;
+ case QVariant::Point:
+ emitOpening( QString("point") );
+ emitSimpleValue( QString("x"), QString::number(val.toPoint().x()) );
+ emitSimpleValue( QString("y"), QString::number(val.toPoint().y()) );
+ emitClosing( QString("point") );
+ break;
+ case QVariant::Size:
+ emitOpening( QString("size") );
+ emitSimpleValue( QString("width"),
+ QString::number(val.toSize().width()) );
+ emitSimpleValue( QString("height"),
+ QString::number(val.toSize().height()) );
+ emitClosing( QString("size") );
+ break;
+ case QVariant::Color:
+ emitColor( val.toColor() );
+ break;
+ case QVariant::Font:
+ emitOpening( QString("font") );
+ emitSimpleValue( QString("family"), val.toFont().family() );
+ emitSimpleValue( QString("pointsize"),
+ QString::number(val.toFont().pointSize()) );
+ if ( val.toFont().bold() )
+ emitSimpleValue( QString("bold"), QChar('1') );
+ if ( val.toFont().italic() )
+ emitSimpleValue( QString("italic"), QChar('1') );
+ if ( val.toFont().underline() )
+ emitSimpleValue( QString("underline"), QChar('1') );
+ if ( val.toFont().strikeOut() )
+ emitSimpleValue( QString("strikeout"), QChar('1') );
+ emitClosing( QString("font") );
+ break;
+ case QVariant::Palette:
+ emitOpening( QString("palette") );
+ emitColorGroup( QString("active"), val.toPalette().active() );
+ emitColorGroup( QString("disabled"), val.toPalette().disabled() );
+ emitColorGroup( QString("inactive"), val.toPalette().inactive() );
+ emitClosing( QString("palette") );
+ break;
+ default:
+ emitSimpleValue( QString("fnord"), QString::null );
+ }
+ }
+}
+
+void Dlg2Ui::emitProperty( const QString& prop, const QVariant& val,
+ const QString& stringType )
+{
+ emitOpening( QString("property"), attribute(QString("name"), prop) );
+ emitVariant( val, stringType );
+ emitClosing( QString("property") );
+}
+
+void Dlg2Ui::emitAttribute( const QString& attr, const QVariant& val,
+ const QString& stringType )
+{
+ emitOpening( QString("attribute"), attribute(QString("name"), attr) );
+ emitVariant( val, stringType );
+ emitClosing( QString("attribute") );
+}
+
+void Dlg2Ui::emitOpeningLayout( bool needsWidget, const QString& layoutKind,
+ const QString& name, int border,
+ int autoBorder )
+{
+ QString namex = name;
+
+ if ( namex.isEmpty() )
+ namex = QString( "Layout%1" ).arg( uniqueLayout++ );
+
+ if ( needsWidget ) {
+ emitOpeningWidget( QString("QLayoutWidget") );
+ emitProperty( QString("name"), namex.latin1() );
+ }
+ emitOpening( layoutKind );
+ if ( !needsWidget )
+ emitProperty( QString("name"), namex.latin1() );
+ if ( border != 5 )
+ emitProperty( QString("margin"), border );
+ if ( autoBorder != 5 )
+ emitProperty( QString("spacing"), autoBorder );
+ yyLayoutDepth++;
+}
+
+void Dlg2Ui::flushWidgets()
+{
+ QRegExp widgetForLayout( QString("Q(?:[HV]Box|Grid)") );
+
+ while ( !yyWidgetMap.isEmpty() ) {
+ QString className = widgetClassName( *yyWidgetMap.begin() );
+ if ( !widgetForLayout.exactMatch(className) ) {
+ emitOpeningWidget( className );
+ emitWidgetBody( *yyWidgetMap.begin(), FALSE );
+ emitClosing( QString("widget") );
+ }
+ yyWidgetMap.remove( yyWidgetMap.begin() );
+ }
+}
+
+void Dlg2Ui::emitClosingLayout( bool needsWidget, const QString& layoutKind )
+{
+ yyLayoutDepth--;
+ /*
+ Qt Designer can deal with layouted widgets and with
+ fixed-position widgets, but not both at the same time. If such a
+ thing happens, we arbitrarily put the fixed-position widgets in
+ the layout so that they at least show up in Qt Designer.
+ */
+ if ( yyLayoutDepth == 0 )
+ flushWidgets();
+
+ emitClosing( layoutKind );
+ if ( needsWidget )
+ emitClosing( QString("widget") );
+}
+
+bool Dlg2Ui::isWidgetType( const QDomElement& e )
+{
+ return yyWidgetTypeSet.contains( e.tagName() );
+}
+
+void Dlg2Ui::emitSpacer( int spacing, int stretch )
+{
+ QString orientationStr;
+ QSize sizeHint;
+ QString sizeType = QString( "Fixed" );
+
+ if ( yyBoxKind == QString("hbox") ) {
+ orientationStr = QString( "Horizontal" );
+ sizeHint = QSize( spacing, 20 );
+ } else {
+ orientationStr = QString( "Vertical" );
+ sizeHint = QSize( 20, spacing );
+ }
+ if ( stretch > 0 )
+ sizeType = QString( "Expanding" );
+
+ emitOpening( QString("spacer") );
+ emitProperty( QString("name"),
+ QString("Spacer%1").arg(uniqueSpacer++).latin1() );
+ emitProperty( QString("orientation"), orientationStr, QString("enum") );
+ if ( spacing > 0 )
+ emitProperty( QString("sizeHint"), sizeHint, QString("qsize") );
+ emitProperty( QString("sizeType"), sizeType, QString("enum") );
+ emitClosing( QString("spacer") );
+}
+
+QString Dlg2Ui::filteredFlags( const QString& flags, const QRegExp& filter )
+{
+ QRegExp evil( QString("[^0-9A-Z_a-z|]") );
+
+ QString f = flags;
+ f.replace( evil, QString::null );
+ QStringList splitted = QStringList::split( QChar('|'), f );
+ return splitted.grep( filter ).join( QChar('|') );
+}
+
+void Dlg2Ui::emitFrameStyleProperty( int style )
+{
+ QString shape;
+ QString shadow;
+
+ switch ( style & QFrame::MShape ) {
+ case QFrame::Box:
+ shape = QString( "Box" );
+ break;
+ case QFrame::Panel:
+ shape = QString( "Panel" );
+ break;
+ case QFrame::WinPanel:
+ shape = QString( "WinPanel" );
+ break;
+ case QFrame::HLine:
+ shape = QString( "HLine" );
+ break;
+ case QFrame::VLine:
+ shape = QString( "VLine" );
+ break;
+ case QFrame::StyledPanel:
+ shape = QString( "StyledPanel" );
+ break;
+ case QFrame::PopupPanel:
+ shape = QString( "PopupPanel" );
+ break;
+ case QFrame::MenuBarPanel:
+ shape = QString( "MenuBarPanel" );
+ break;
+ case QFrame::ToolBarPanel:
+ shape = QString( "ToolBarPanel" );
+ break;
+ case QFrame::LineEditPanel:
+ shape = QString( "LineEditPanel" );
+ break;
+ case QFrame::TabWidgetPanel:
+ shape = QString( "TabWidgetPanel" );
+ break;
+ case QFrame::GroupBoxPanel:
+ shape = QString( "GroupBoxPanel" );
+ break;
+ default:
+ shape = QString( "NoFrame" );
+ }
+
+ switch ( style & QFrame::MShadow ) {
+ case QFrame::Raised:
+ shadow = QString( "Raised" );
+ break;
+ case QFrame::Sunken:
+ shadow = QString( "Sunken" );
+ break;
+ default:
+ shadow = QString( "Plain" );
+ }
+
+ emitProperty( QString("frameShape"), shape, QString("enum") );
+ emitProperty( QString("frameShadow"), shadow, QString("enum") );
+}
+
+void Dlg2Ui::emitWidgetBody( const QDomElement& e, bool layouted )
+{
+ QRegExp align( QString("^(?:Align|WordBreak$)") );
+ QRegExp frameShape( QString(
+ "^(?:NoFrame|Box|(?:Win|Styled|Popup|(?:Menu|Tool)Bar)?Panel|"
+ "[HV]Line)$") );
+ QRegExp frameShadow( QString( "^(?:Plain|Raised|Sunken)$") );
+ QRegExp numeric( QString("[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+") );
+ QRegExp connex( QString(
+ "\\s*\\[(BaseClass|P(?:ublic|rotected))\\]\\s*([0-9A-Z_a-z]+)\\s*"
+ "-->\\s*([0-9A-Z_a-z]+)\\s*(\\([^()]*\\))\\s*") );
+ QRegExp qdialogSlots( QString(
+ "done\\(\\s*int\\s*\\)|(?:accept|reject)\\(\\s*\\)") );
+
+ QString userClassHeader;
+ QString userClassName;
+ QString parentTagName;
+ QString name;
+ QString variableName;
+ QMap<QString, int> pp;
+
+ QDomNode n = e;
+ while ( !n.isNull() ) {
+ if ( isWidgetType(n.toElement()) ) {
+ parentTagName = n.toElement().tagName();
+ pp = yyPropertyMap[parentTagName];
+ n = n.firstChild();
+ } else {
+ QString tagName = n.toElement().tagName();
+
+ QMap<QString, int>::ConstIterator p = pp.find( tagName );
+ if ( p == pp.end() ) {
+ /*
+ These properties are not in the propertyDefs table,
+ since they are found in many classes anyway and need
+ to be treated the same in each case.
+ */
+ if ( tagName == QString("Alignement") ||
+ tagName == QString("Alignment") ) {
+ QString flags = getValue( n.toElement(), tagName )
+ .toString();
+ flags = filteredFlags( flags, align );
+ if ( !flags.isEmpty() )
+ emitProperty( QString("alignment"), flags,
+ QString("set") );
+ } else if ( tagName == QString("ItemList") ) {
+ QDomNode child = n.firstChild();
+ while ( !child.isNull() ) {
+ if ( child.toElement().tagName() == QString("Item") ) {
+ QString text = getTextValue( child );
+ emitOpening( QString("item") );
+ emitProperty( QString("text"), text );
+ emitClosing( QString("item") );
+ }
+ child = child.nextSibling();
+ }
+ }
+ } else {
+ QString propertyName( propertyDefs[*p].qtName );
+
+ if ( propertyName.isEmpty() ) {
+ /*
+ These properties are in the propertyDefs table,
+ but they have no direct Qt equivalent.
+ */
+ if ( parentTagName == QString("ComboBox") ) {
+ if ( tagName == QString("Style") ) {
+ if ( getTextValue(n) == QString("ReadWrite") )
+ emitProperty( QString("editable"),
+ QVariant(TRUE, 0) );
+ }
+ } else if ( parentTagName == QString("DlgWidget") ) {
+ if ( tagName == QString("Name") ) {
+ name = getTextValue( n );
+ } else if ( tagName == QString("Rect") ) {
+ QRect rect = getValue( n.toElement(), tagName,
+ QString("qrect") )
+ .toRect();
+ if ( !layouted )
+ emitProperty( QString("geometry"), rect,
+ QString("qrect") );
+ } else if ( tagName == QString("SignalConnection") ) {
+ QDomNode child = n.firstChild();
+ while ( !child.isNull() ) {
+ if ( child.toElement().tagName() ==
+ QString("Signal") ) {
+ QString text = getTextValue( child );
+ if ( connex.exactMatch(text) ) {
+ DlgConnection c;
+ c.sender = getValue(
+ n.parentNode().childNodes(),
+ QString("Name") ).toString();
+ c.signal = connex.cap( 2 ) +
+ connex.cap( 4 );
+ c.slot = connex.cap( 3 ) +
+ connex.cap( 4 );
+ yyConnections.append( c );
+
+ if ( connex.cap(1) !=
+ QString("BaseClass") &&
+ !qdialogSlots.exactMatch(c.slot) )
+ yySlots.insert( c.slot,
+ connex.cap(1) );
+ }
+ }
+ child = child.nextSibling();
+ }
+ } else if ( tagName == QString("Variable") ) {
+ variableName = getTextValue( n );
+ }
+ } else if ( parentTagName == QString("Frame") ) {
+ if ( tagName == QString("Style") ) {
+ int style = getValue( n.toElement(), tagName,
+ QString("integer") ).toInt();
+ emitFrameStyleProperty( style );
+ }
+ } else if ( parentTagName == QString("LCDNumber") ) {
+ if ( tagName == QString("Value") ) {
+ QString text = getValue( n.toElement(), tagName )
+ .toString();
+ if ( numeric.exactMatch(text) )
+ emitProperty( QString("value"),
+ text.toDouble() );
+ }
+ } else if ( parentTagName == QString("ListView") ) {
+ if ( tagName == QString("HeaderInformation") ) {
+ int columnNo = 1;
+ QDomNode child = n.firstChild();
+ while ( !child.isNull() ) {
+ if ( child.toElement().tagName() ==
+ QString("Header") ) {
+ QString text = getValue( child.childNodes(),
+ QString("Text") )
+ .toString();
+ if ( text.isEmpty() )
+ text = QString( "Column %1" )
+ .arg( columnNo );
+ emitOpening( QString("column") );
+ emitProperty( QString("text"), text );
+ emitClosing( QString("column") );
+ }
+ child = child.nextSibling();
+ columnNo++;
+ }
+ }
+ } else if ( parentTagName == QString("TabBar") ) {
+ if ( tagName == QString("TabNames") ) {
+ QDomNode child = n.firstChild();
+ while ( !child.isNull() ) {
+ if ( child.toElement().tagName() ==
+ QString("Tab") ) {
+ QString text = getTextValue( child );
+ emitOpeningWidget( QString("QWidget") );
+ emitProperty( QString("name"), "tab" );
+ emitAttribute( QString("title"), text );
+ emitClosing( QString("widget") );
+ }
+ child = child.nextSibling();
+ }
+ }
+ } else if ( parentTagName == QString("User") ) {
+ if ( tagName == QString("UserClassHeader") ) {
+ userClassHeader = getTextValue( n );
+ } else if ( tagName == QString("UserClassName") ) {
+ userClassName = getTextValue( n );
+ }
+ }
+ } else {
+ /*
+ These properties are in the propertyDefs table;
+ they have a direct Qt equivalent.
+ */
+ QString type( propertyDefs[*p].type );
+ QVariant val = getValue( n.toElement(), tagName, type );
+
+ if ( type == QString("qstring") )
+ type = QString( "string" );
+
+ bool omit = FALSE;
+ if ( propertyName == QString("backgroundOrigin") &&
+ val.toString() == QString("WidgetOrigin") )
+ omit = TRUE;
+ if ( propertyName == QString("enabled") && val.toBool() )
+ omit = TRUE;
+ if ( propertyName == QString("minimumSize") &&
+ val.toSize() == QSize(-1, -1) )
+ omit = TRUE;
+ if ( propertyName == QString("maximumSize") &&
+ val.toSize() == QSize(32767, 32767) )
+ omit = TRUE;
+
+ if ( !omit )
+ emitProperty( propertyName, val, type );
+ }
+ }
+ n = n.nextSibling();
+ }
+ }
+
+ if ( !variableName.isEmpty() ) {
+ yyAliasMap.insert( name, variableName );
+ name = variableName;
+ }
+ if ( !name.isEmpty() )
+ emitProperty( QString("name"), name.latin1() );
+
+ if ( !userClassName.isEmpty() )
+ yyCustomWidgets.insert( userClassName, userClassHeader );
+}
+
+bool Dlg2Ui::checkTagName( const QDomElement& e, const QString& tagName )
+{
+ bool ok = ( e.tagName() == tagName );
+ if ( !ok )
+ syntaxError();
+ return ok;
+}
+
+QString Dlg2Ui::normalizeType( const QString& type )
+{
+ QString t = type;
+ if ( t.isEmpty() || t == QString("enum") || t == QString( "qcstring" ) ||
+ t == QString("set") )
+ t = QString( "qstring" );
+ return t;
+}
+
+QVariant Dlg2Ui::getValue( const QDomElement& e, const QString& tagName,
+ const QString& type )
+{
+ QVariant val;
+
+ if ( e.tagName() != tagName )
+ return val;
+
+ QString t = e.attributes().namedItem( "type" ).toAttr().value();
+ if ( normalizeType(t) != normalizeType(type) )
+ return val;
+
+ if ( type == QString("integer") ) {
+ return getTextValue( e ).toInt();
+ } else if ( type == QString("boolean") ) {
+ return QVariant( isTrue(getTextValue(e)), 0 );
+ } else if ( type == QString("double") ) {
+ return getTextValue( e ).toDouble();
+ } else if ( type == QString("qcstring") ) {
+ return getTextValue( e ).latin1();
+ } else if ( type == QString("enum") || type == QString("qstring") ||
+ type == QString("set") ) {
+ return getTextValue( e );
+ } else {
+ QDomNodeList children = e.childNodes();
+
+ if ( type == QString("qsize") ) {
+ int width = getValue( children, QString("Width"),
+ QString("integer") ).toInt();
+ int height = getValue( children, QString("Height"),
+ QString("integer") ).toInt();
+ return QSize( width, height );
+ } else if ( type == QString("qrect") ) {
+ int x = getValue( children, QString("X"), QString("integer") )
+ .toInt();
+ int y = getValue( children, QString("Y"), QString("integer") )
+ .toInt();
+ int width = getValue( children, QString("Width"),
+ QString("integer") ).toInt();
+ int height = getValue( children, QString("Height"),
+ QString("integer") ).toInt();
+ return QRect( x, y, width, height );
+ } else if ( type == QString("qpoint") ) {
+ int x = getValue( children, QString("X"), QString("integer") )
+ .toInt();
+ int y = getValue( children, QString("Y"), QString("integer") )
+ .toInt();
+ return QPoint( x, y );
+ } else if ( type == QString("qpalette") ) {
+ QColorGroup active = getValue( children, QString("Active"),
+ QString("qcolorgroup") )
+ .toColorGroup();
+ QColorGroup disabled = getValue( children, QString("Disabled"),
+ QString("qcolorgroup") )
+ .toColorGroup();
+ QColorGroup inactive = getValue( children, QString("Inactive"),
+ QString("qcolorgroup") )
+ .toColorGroup();
+ return QPalette( active, disabled, inactive );
+ } else if ( type == QString("qfont") ) {
+ QString family = getValue( children, QString("Family"),
+ QString("qstring") ).toString();
+ int pointSize = getValue( children, QString("PointSize"),
+ QString("integer") ).toInt();
+ int weight = getValue( children, QString("weight"),
+ QString("integer") ).toInt();
+ bool italic = getValue( children, QString("Italic"),
+ QString("boolean") ).toBool();
+ bool underline = getValue( children, QString("Underline"),
+ QString("boolean") ).toBool();
+ bool strikeOut = getValue( children, QString("StrikeOut"),
+ QString("boolean") ).toBool();
+ int styleHint = getValue( children, QString("StyleHint"),
+ QString("integer") ).toInt();
+
+ QFont f;
+ if ( !family.isEmpty() )
+ f.setFamily( family );
+ if ( pointSize != 0 )
+ f.setPointSize( pointSize );
+ if ( weight != 0 )
+ f.setWeight( weight );
+ f.setItalic( italic );
+ f.setUnderline( underline );
+ f.setStrikeOut( strikeOut );
+ if ( styleHint != 0 )
+ f.setStyleHint( (QFont::StyleHint) styleHint );
+ return f;
+ } else if ( type == QString("qcolor") ) {
+ // if any component missing, zero is to be assumed
+ int red = getValue( children, QString("Red"), QString("integer") )
+ .toInt();
+ int green = getValue( children, QString("Green"),
+ QString("integer") ).toInt();
+ int blue = getValue( children, QString("Blue"), QString("integer") )
+ .toInt();
+ return QColor( red, green, blue );
+ } else if ( type == QString("qcolorgroup") ) {
+ static const QColorGroup::ColorRole roles[NumColorRoles] = {
+ QColorGroup::Foreground, QColorGroup::Button,
+ QColorGroup::Light, QColorGroup::Midlight, QColorGroup::Dark,
+ QColorGroup::Mid, QColorGroup::Text, QColorGroup::BrightText,
+ QColorGroup::ButtonText, QColorGroup::Base,
+ QColorGroup::Background, QColorGroup::Shadow,
+ QColorGroup::Highlight, QColorGroup::HighlightedText
+ };
+ static const char * const roleNames[NumColorRoles] = {
+ "Foreground", "Button", "Light", "MidLight", "Dark", "Mid",
+ "Text", "BrightText", "ButtonText", "Base", "Background",
+ "Shadow", "HighLighted", "HighLightedText"
+ };
+ QColorGroup group;
+
+ for ( int i = 0; i < NumColorRoles; i++ )
+ group.setColor( roles[i],
+ getValue(children, QString(roleNames[i]),
+ QString("qcolor")).toColor() );
+ return group;
+ } else {
+ syntaxError();
+ }
+ }
+ return val;
+}
+
+void Dlg2Ui::matchDialogCommon( const QDomElement& dialogCommon )
+{
+ if ( !checkTagName(dialogCommon, QString("DialogCommon")) )
+ return;
+
+ QString sourceDir;
+ QString classHeader;
+ QString classSource;
+ QString dataHeader;
+ QString dataSource;
+ QString dataName;
+ QString windowBaseClass( "QDialog" );
+ bool isCustom = FALSE;
+ QString customBaseHeader;
+ QString windowCaption;
+
+ yyClassName = "Form1";
+
+ QDomNode n = dialogCommon.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ QString val = getTextValue( n );
+
+ if ( tagName == QString("SourceDir") ) {
+ sourceDir = val;
+ } else if ( tagName == QString("ClassHeader") ) {
+ classHeader = val;
+ } else if ( tagName == QString("ClassSource") ) {
+ classSource = val;
+ } else if ( tagName == QString("ClassName") ) {
+ yyClassName = val;
+ } else if ( tagName == QString("DataHeader") ) {
+ dataHeader = val;
+ } else if ( tagName == QString("DataSource") ) {
+ dataSource = val;
+ } else if ( tagName == QString("DataName") ) {
+ dataName = val;
+ } else if ( tagName == QString("WindowBaseClass") ) {
+ if ( val == QString("Custom") )
+ isCustom = TRUE;
+ else
+ windowBaseClass = val;
+ } else if ( tagName == QString("IsModal") ) {
+ } else if ( tagName == QString("CustomBase") ) {
+ windowBaseClass = val;
+ } else if ( tagName == QString("CustomBaseHeader") ) {
+ customBaseHeader = val;
+ } else if ( tagName == QString("WindowCaption") ) {
+ windowCaption = val;
+ }
+ n = n.nextSibling();
+ }
+
+ emitSimpleValue( QString("class"), yyClassName );
+ emitOpeningWidget( windowBaseClass );
+
+ if ( windowCaption.isEmpty() )
+ windowCaption = yyClassName;
+ emitProperty( QString("name"), yyClassName.latin1() );
+ emitProperty( QString("caption"), windowCaption );
+
+ if ( isCustom )
+ yyCustomWidgets.insert( windowBaseClass, customBaseHeader );
+}
+
+bool Dlg2Ui::needsQLayoutWidget( const QDomElement& e )
+{
+ QRegExp widgetExists( QString("WidgetLayout|Layout_Widget") );
+
+ // we should also check that the widget is not a QHBox, QVBox, or QGrid
+ QString grandpa = e.parentNode().parentNode().toElement().tagName();
+ return !widgetExists.exactMatch( grandpa );
+}
+
+void Dlg2Ui::matchBoxLayout( const QDomElement& boxLayout )
+{
+ QString directionStr;
+ QString prevBoxKind = yyBoxKind;
+ int border = 5;
+ int autoBorder = 5;
+ QString name;
+ bool needsWidget = needsQLayoutWidget( boxLayout );
+ bool opened = FALSE;
+
+ QDomNode n = boxLayout.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+
+ if ( tagName == QString("Children") ) {
+ if ( !opened ) {
+ emitOpeningLayout( needsWidget, yyBoxKind, name, border,
+ autoBorder );
+ if ( !directionStr.isEmpty() )
+ emitProperty( QString("direction"), directionStr,
+ QString("enum") );
+ opened = TRUE;
+ }
+ matchLayout( n.toElement() );
+ } else {
+ QString val = getTextValue( n );
+
+ if ( tagName == QString("Direction") ) {
+ if ( val == QString("LeftToRight") ) {
+ yyBoxKind = QString( "hbox" );
+ } else if ( val == QString("RightToLeft") ) {
+ directionStr = val;
+ yyBoxKind = QString( "hbox" );
+ } else if ( val == QString("TopToBottom") ) {
+ yyBoxKind = QString( "vbox" );
+ } else if ( val == QString("BottomToTop") ) {
+ directionStr = val;
+ yyBoxKind = QString( "vbox" );
+ } else {
+ syntaxError();
+ }
+ } else if ( tagName == QString("Border") ) {
+ border = val.toInt();
+ } else if ( tagName == QString("AutoBorder") ) {
+ autoBorder = val.toInt();
+ } else if ( tagName == QString("Name") ) {
+ name = val;
+ }
+ }
+
+ n = n.nextSibling();
+ }
+ if ( opened ) {
+ emitClosingLayout( needsWidget, yyBoxKind );
+ yyBoxKind = prevBoxKind;
+ }
+}
+
+void Dlg2Ui::matchBoxSpacing( const QDomElement& boxSpacing )
+{
+ int spacing = 7;
+
+ QDomNode n = boxSpacing.firstChild();
+ while ( !n.isNull() ) {
+ QString val = getTextValue( n );
+
+ if ( n.toElement().tagName() == QString("Spacing") )
+ spacing = val.toInt();
+ n = n.nextSibling();
+ }
+ emitSpacer( spacing, 0 );
+}
+
+void Dlg2Ui::matchBoxStretch( const QDomElement& boxStretch )
+{
+ int stretch = 1;
+
+ QDomNode n = boxStretch.firstChild();
+ while ( !n.isNull() ) {
+ QString val = getTextValue( n );
+
+ if ( n.toElement().tagName() == QString("Stretch") )
+ stretch = val.toInt();
+ n = n.nextSibling();
+ }
+ emitSpacer( 0, stretch );
+}
+
+void Dlg2Ui::matchGridLayout( const QDomElement& gridLayout )
+{
+ int oldGridRow = yyGridRow;
+ int oldGridColumn = yyGridColumn;
+ int border = 5;
+ int autoBorder = 5;
+ QString name;
+ QString menu;
+ bool needsWidget = needsQLayoutWidget( gridLayout );
+ bool opened = FALSE;
+
+ QDomNode n = gridLayout.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+
+ if ( tagName == QString("Children") ) {
+ if ( !opened ) {
+ emitOpeningLayout( needsWidget, QString("grid"), name, border,
+ autoBorder );
+ yyGridRow = -1;
+ yyGridColumn = -1;
+ opened = TRUE;
+ }
+ matchLayout( n.toElement() );
+ } else {
+ if ( tagName == QString("Border") ) {
+ border = getTextValue( n ).toInt();
+ } else if ( tagName == QString("AutoBorder") ) {
+ autoBorder = getTextValue( n ).toInt();
+ } else if ( tagName == QString("Name") ) {
+ name = getTextValue( n );
+ } else if ( tagName == QString("Menu") ) {
+ menu = getTextValue( n );
+ }
+ }
+ n = n.nextSibling();
+ }
+ if ( opened )
+ emitClosingLayout( needsWidget, QString("grid") );
+ yyGridRow = oldGridRow;
+ yyGridColumn = oldGridColumn;
+}
+
+void Dlg2Ui::matchGridRow( const QDomElement& gridRow )
+{
+ yyGridRow++;
+
+ QDomNode n = gridRow.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+
+ if ( tagName == QString("Children") ) {
+ yyGridColumn = 0;
+ matchLayout( n.toElement() );
+ }
+ n = n.nextSibling();
+ }
+}
+
+void Dlg2Ui::matchGridSpacer( const QDomElement& gridSpacer )
+{
+ if ( !gridSpacer.firstChild().isNull() )
+ syntaxError();
+}
+
+void Dlg2Ui::matchLayoutWidget( const QDomElement& layoutWidget )
+{
+ QDomElement children;
+ QString widget;
+
+ QDomNode n = layoutWidget.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+
+ if ( tagName == QString("Children") )
+ children = n.toElement();
+ else if ( tagName == QString("Widget") )
+ widget = getTextValue( n );
+ n = n.nextSibling();
+ }
+
+ if ( !widget.isEmpty() ) {
+ QMap<QString, QDomElement>::Iterator w = yyWidgetMap.find( widget );
+ if ( w == yyWidgetMap.end() ) {
+ syntaxError();
+ } else {
+ QString className = widgetClassName( *w );
+ if ( className == QString("QHBox") ||
+ className == QString("QVBox") ) {
+ bool needsWidget = needsQLayoutWidget( layoutWidget );
+
+ QString prevBoxKind = yyBoxKind;
+ yyBoxKind = className.mid( 1 ).lower();
+
+ int spacing = getValue( (*w).childNodes(), QString("Spacing"),
+ QString("integer") ).toInt();
+ if ( spacing < 1 )
+ spacing = 5;
+
+ emitOpeningLayout( needsWidget, yyBoxKind, widget, 0, spacing );
+ if ( !children.isNull() )
+ matchLayout( children );
+ emitClosingLayout( needsWidget, yyBoxKind );
+ yyBoxKind = prevBoxKind;
+ } else if ( className == QString("QGrid") ) {
+ bool needsWidget = needsQLayoutWidget( layoutWidget );
+ int n = 0;
+
+ QString direction = getValue( (*w).childNodes(),
+ QString("Direction") ).toString();
+ int rowsCols = getValue( (*w).childNodes(), QString("RowCols"),
+ QString("integer") ).toInt();
+ if ( rowsCols == 0 )
+ rowsCols = getValue( (*w).childNodes(),
+ QString("RowsCols"),
+ QString("integer") ).toInt();
+ if ( rowsCols < 1 )
+ rowsCols = 5;
+ int spacing = getValue( (*w).childNodes(), QString("Spacing"),
+ QString("integer") ).toInt();
+ if ( spacing < 1 )
+ spacing = 5;
+
+ emitOpeningLayout( needsWidget, QString("grid"), widget, 0,
+ spacing );
+
+ QDomNode child = children.firstChild();
+ while ( !child.isNull() ) {
+ if ( direction == QString("Vertical") ) {
+ yyGridColumn = n / rowsCols;
+ yyGridRow = n % rowsCols;
+ } else {
+ yyGridColumn = n % rowsCols;
+ yyGridRow = n / rowsCols;
+ }
+ matchBox( child.toElement() );
+ n++;
+ child = child.nextSibling();
+ }
+ yyGridColumn = -1;
+ yyGridRow = -1;
+ emitClosingLayout( needsWidget, QString("grid") );
+ } else {
+ emitOpeningWidget( widgetClassName(*w) );
+ emitWidgetBody( *w, TRUE );
+ if ( !children.isNull() )
+ matchLayout( children );
+ emitClosing( QString("widget") );
+ }
+ yyWidgetMap.remove( w );
+ }
+ }
+}
+
+void Dlg2Ui::matchBox( const QDomElement& box )
+{
+ /*
+ What is this jump table doing in here?
+ */
+ static const struct {
+ const char *tagName;
+ void (Dlg2Ui::*matchFunc)( const QDomElement& );
+ } jumpTable[] = {
+ { "Box_Layout", &Dlg2Ui::matchBoxLayout },
+ { "Box_Spacing", &Dlg2Ui::matchBoxSpacing },
+ { "Box_Stretch", &Dlg2Ui::matchBoxStretch },
+ { "Grid_Layout", &Dlg2Ui::matchGridLayout },
+ { "Grid_Row", &Dlg2Ui::matchGridRow },
+ { "Grid_Spacer", &Dlg2Ui::matchGridSpacer },
+ { "Layout_Widget", &Dlg2Ui::matchLayoutWidget },
+ { 0, 0 }
+ };
+
+ int i = 0;
+ while ( jumpTable[i].tagName != 0 ) {
+ if ( QString(jumpTable[i].tagName) == box.tagName() ) {
+ (this->*jumpTable[i].matchFunc)( box );
+ break;
+ }
+ i++;
+ }
+ if ( jumpTable[i].tagName == 0 )
+ syntaxError();
+}
+
+void Dlg2Ui::matchLayout( const QDomElement& layout )
+{
+ int column = yyGridColumn;
+
+ QDomNode n = layout.firstChild();
+ while ( !n.isNull() ) {
+ if ( column != -1 )
+ yyGridColumn = column++;
+ matchBox( n.toElement() );
+ n = n.nextSibling();
+ }
+}
+
+void Dlg2Ui::matchWidgetLayoutCommon( const QDomElement& widgetLayoutCommon )
+{
+ QDomNodeList children = widgetLayoutCommon.childNodes();
+
+ /*
+ Since we do not respect the spacing and margins specified in
+ the .dlg file, the specified geometry is slightly wrong (too
+ small). It still seems to be better to take it in.
+ */
+#if 1
+ QPoint initialPos = getValue( children, QString("InitialPos"),
+ QString("qpoint") ).toPoint();
+ QSize size = getValue( children, QString("Size"), QString("qsize") )
+ .toSize();
+#endif
+ QSize minSize = getValue( children, QString("MinSize"), QString("qsize") )
+ .toSize();
+ QSize maxSize = getValue( children, QString("MaxSize"), QString("qsize") )
+ .toSize();
+
+#if 1
+ if ( initialPos == QPoint(-1, -1) )
+ initialPos = QPoint( 0, 0 );
+
+ emitProperty( QString("geometry"), QRect(initialPos, size) );
+#endif
+ if ( minSize != QSize(-1, -1) )
+ emitProperty( QString("minimumSize"), minSize );
+ if ( maxSize != QSize(32767, 32767) )
+ emitProperty( QString("maximumSize"), maxSize );
+}
+
+void Dlg2Ui::matchWidget( const QDomElement& widget )
+{
+ QString name;
+
+ QDomNode n = widget;
+ while ( !n.isNull() ) {
+ if ( isWidgetType(n.toElement()) ) {
+ n = n.firstChild();
+ } else {
+ if ( n.toElement().tagName() == QString("Name") ) {
+ name = getTextValue( n );
+ break;
+ }
+ n = n.nextSibling();
+ }
+ }
+ if ( name.isEmpty() )
+ name = QString( "Widget%1" ).arg( uniqueWidget++ );
+
+ if ( yyWidgetMap.contains(name) )
+ syntaxError();
+ yyWidgetMap.insert( name, widget );
+}
+
+void Dlg2Ui::matchWidgets( const QDomElement& widgets )
+{
+ QDomNode n = widgets.firstChild();
+ while ( !n.isNull() ) {
+ matchWidget( n.toElement() );
+ n = n.nextSibling();
+ }
+}
+
+void Dlg2Ui::matchTabOrder( const QDomElement& tabOrder )
+{
+ QDomNode n = tabOrder.firstChild();
+ while ( !n.isNull() ) {
+ if ( n.toElement().tagName() == QString("Widget") )
+ yyTabStops.append( getTextValue(n.toElement()) );
+ n = n.nextSibling();
+ }
+}
+
+void Dlg2Ui::matchWidgetLayout( const QDomElement& widgetLayout )
+{
+ if ( !checkTagName(widgetLayout, QString("WidgetLayout")) )
+ return;
+
+ QDomNode n = widgetLayout.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+
+ if ( tagName == QString("WidgetLayoutCommon") ) {
+ matchWidgetLayoutCommon( n.toElement() );
+ } else if ( tagName == QString("Widgets") ) {
+ matchWidgets( n.toElement() );
+ } else if ( tagName == QString("TabOrder") ) {
+ matchTabOrder( n.toElement() );
+ } else if ( tagName == QString("Layout") ) {
+ matchLayout( n.toElement() );
+ }
+ n = n.nextSibling();
+ }
+}
+
+void Dlg2Ui::matchDialog( const QDomElement& dialog )
+{
+ if ( !checkTagName(dialog, QString("Dialog")) )
+ return;
+
+ QDomNodeList nodes = dialog.childNodes();
+ if ( nodes.count() == 2 ) {
+ matchDialogCommon( nodes.item(0).toElement() );
+ matchWidgetLayout( nodes.item(1).toElement() );
+ flushWidgets();
+ emitClosing( QString("widget") );
+
+ if ( !yyCustomWidgets.isEmpty() ) {
+ emitOpening( QString("customwidgets") );
+
+ QMap<QString, QString>::Iterator w = yyCustomWidgets.begin();
+ while ( w != yyCustomWidgets.end() ) {
+ emitOpening( QString("customwidget") );
+ emitSimpleValue( QString("class"), w.key() );
+ if ( !(*w).isEmpty() )
+ emitSimpleValue( QString("header"), *w,
+ attribute(QString("location"),
+ QString("local")) );
+ emitClosing( QString("customwidget") );
+ ++w;
+ }
+ emitClosing( QString("customwidgets") );
+ }
+
+ if ( yyConnections.count() + yySlots.count() > 0 ) {
+ emitOpening( QString("connections") );
+
+ QValueList<DlgConnection>::Iterator c = yyConnections.begin();
+ while ( c != yyConnections.end() ) {
+ emitOpening( QString("connection") );
+ emitSimpleValue( QString("sender"), alias((*c).sender) );
+ emitSimpleValue( QString("signal"), (*c).signal );
+ emitSimpleValue( QString("receiver"), yyClassName );
+ emitSimpleValue( QString("slot"), (*c).slot );
+ emitClosing( QString("connection") );
+ ++c;
+ }
+
+ QMap<QString, QString>::Iterator s = yySlots.begin();
+ while ( s != yySlots.end() ) {
+ AttributeMap attr;
+ attr.insert( QString("access"), *s );
+ attr.insert( QString("language"), QString("C++") );
+ attr.insert( QString("returntype"), QString("void") );
+ emitSimpleValue( QString("slot"), s.key(), attr );
+ ++s;
+ }
+ emitClosing( QString("connections") );
+ }
+
+ if ( !yyTabStops.isEmpty() ) {
+ emitOpening( QString("tabstops") );
+ QStringList::ConstIterator t = yyTabStops.begin();
+ while ( t != yyTabStops.end() ) {
+ emitSimpleValue( QString("tabstop"), alias(*t) );
+ ++t;
+ }
+ emitClosing( QString("tabstops") );
+ }
+ }
+}
+
+QStringList Dlg2Ui::convertQtArchitectDlgFile( const QString& fileName )
+{
+ int i;
+
+ yyFileName = fileName;
+ yyLayoutDepth = 0;
+ yyGridRow = -1;
+ yyGridColumn = -1;
+
+ numErrors = 0;
+ uniqueLayout = 1;
+ uniqueSpacer = 1;
+ uniqueWidget = 1;
+
+ i = 0;
+ while ( widgetTypes[i] != 0 ) {
+ yyWidgetTypeSet.insert( QString(widgetTypes[i]), 0 );
+ i++;
+ }
+
+ i = 0;
+ while ( propertyDefs[i].widgetName != 0 ) {
+ yyPropertyMap[QString(propertyDefs[i].widgetName)]
+ .insert( QString(propertyDefs[i].architectName), i );
+ i++;
+ }
+
+ QDomDocument doc( QString("QtArch") );
+ QFile f( fileName );
+ if ( !f.open(IO_ReadOnly) ) {
+ return QStringList();
+ }
+ if ( !doc.setContent(&f) ) {
+ QString firstLine;
+ f.at( 0 );
+ f.readLine( firstLine, 128 );
+ firstLine = firstLine.stripWhiteSpace();
+ if ( firstLine.startsWith(QString("DlgEdit:v1")) ) {
+ error( QString("This file is a Qt Architect 1.x file. Qt Designer"
+ " can only read XML dialog files, as generated by Qt"
+ " Architect 2.1 or above."
+ "<p>To convert this file to the right format,"
+ " first install Qt Architect 2.1 (available at"
+ " <tt>http://qtarch.sourceforge.net/</tt>). Use the"
+ " <i>update20.pl</i> Perl script to update the file"
+ " to the 2.0 format. Load that file in Qt"
+ " Architect and save it. The file should now be in"
+ " XML format and loadable in Qt Designer.") );
+ } else if ( firstLine.startsWith(QString("DlgEdit::v2")) ) {
+ error( QString("This file is a Qt Architect 2.0 file. Qt Designer"
+ " can only read XML dialog files, as generated by Qt"
+ " Architect 2.1 or above."
+ "<p>To convert this file to the right format,"
+ " first install Qt Architect 2.1 (available at"
+ " <tt>http://qtarch.sourceforge.net/</tt>). Load the"
+ " 2.0 file in Qt Architect and save it. The file"
+ " should now be in XML format and loadable in Qt"
+ " Designer.") );
+ } else {
+ error( QString("The file you gave me is not an XML file, as far as"
+ " I can tell.") );
+ }
+
+ f.close();
+ return QStringList();
+ }
+ f.close();
+
+ QDomElement root = doc.documentElement();
+ if ( root.tagName() != QString("QtArch") ||
+ root.attributeNode("type").value() != QString("Dialog") ) {
+ error( QString("The file you gave me is not a Qt Architect dialog"
+ " file.") );
+ return QStringList();
+ }
+
+ emitHeader();
+
+ QDomNode n = root.firstChild();
+ while ( !n.isNull() ) {
+ // there should be only one
+ matchDialog( n.toElement() );
+ n = n.nextSibling();
+ }
+
+ emitFooter();
+
+ QFile outf;
+ QString outFileName = yyClassName + QString( ".ui" );
+
+ outf.setName( outFileName );
+ if ( !outf.open(IO_WriteOnly) ) {
+ qWarning( "dlg2ui: Could not open output file '%s'",
+ outFileName.latin1() );
+ return QStringList();
+ }
+
+ QTextStream out;
+ out.setEncoding( QTextStream::Latin1 );
+ out.setDevice( &outf );
+ out << yyOut;
+ outf.close();
+
+ return QStringList( outFileName );
+}
diff --git a/tools/designer/plugins/dlg/dlg2ui.h b/tools/designer/plugins/dlg/dlg2ui.h
new file mode 100644
index 0000000..9fb206a
--- /dev/null
+++ b/tools/designer/plugins/dlg/dlg2ui.h
@@ -0,0 +1,144 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef DLG2UI_H
+#define DLG2UI_H
+
+#include <qdom.h>
+#include <qmap.h>
+#include <qstring.h>
+#include <qvariant.h>
+
+typedef QMap<QString, QString> AttributeMap;
+
+struct DlgConnection
+{
+ QString sender;
+ QString signal;
+ QString slot;
+
+#if defined(Q_FULL_TEMPLATE_INSTANTIATION)
+ bool operator==( const DlgConnection& ) const {
+ return sender == sender && signal == signal && slot == slot;
+ }
+#endif
+};
+
+class Dlg2Ui
+{
+public:
+ QStringList convertQtArchitectDlgFile( const QString& fileName );
+
+private:
+ QString alias( const QString& name ) const;
+ QString opening( const QString& tag,
+ const AttributeMap& attr = AttributeMap() );
+ QString closing( const QString& tag );
+ void error( const QString& message );
+ void syntaxError();
+ QString getTextValue( const QDomNode& node );
+ QVariant getValue( const QDomNodeList& children, const QString& tagName,
+ const QString& type = "qstring" );
+ void emitHeader();
+ void emitFooter();
+ void emitSimpleValue( const QString& tag, const QString& value,
+ const AttributeMap& attr = AttributeMap() );
+ void emitOpening( const QString& tag,
+ const AttributeMap& attr = AttributeMap() );
+ void emitClosing( const QString& tag );
+ void emitOpeningWidget( const QString& className );
+ QString widgetClassName( const QDomElement& e );
+ void emitColor( const QColor& color );
+ void emitColorGroup( const QString& name, const QColorGroup& group );
+ void emitVariant( const QVariant& val,
+ const QString& stringType = "string" );
+ void emitProperty( const QString& prop, const QVariant& val,
+ const QString& stringType = "string" );
+ void emitAttribute( const QString& attr, const QVariant& val,
+ const QString& stringType = "string" );
+ void emitOpeningLayout( bool needsWidget, const QString& layoutKind,
+ const QString& name, int border, int autoBorder );
+ void flushWidgets();
+ void emitClosingLayout( bool needsWidget, const QString& layoutKind );
+ bool isWidgetType( const QDomElement& e );
+ void emitSpacer( int spacing, int stretch );
+ QString filteredFlags( const QString& flags, const QRegExp& filter );
+ void emitFrameStyleProperty( int style );
+ void emitWidgetBody( const QDomElement& e, bool layouted );
+ bool checkTagName( const QDomElement& e, const QString& tagName );
+ QString normalizeType( const QString& type );
+ QVariant getValue( const QDomElement& e, const QString& tagName,
+ const QString& type = "qstring" );
+ void matchDialogCommon( const QDomElement& dialogCommon );
+ bool needsQLayoutWidget( const QDomElement& e );
+ void matchBoxLayout( const QDomElement& boxLayout );
+ void matchBoxSpacing( const QDomElement& boxSpacing );
+ void matchBoxStretch( const QDomElement& boxStretch );
+ void matchGridLayout( const QDomElement& gridLayout );
+ void matchGridRow( const QDomElement& gridRow );
+ void matchGridSpacer( const QDomElement& gridSpacer );
+ void matchLayoutWidget( const QDomElement& layoutWidget );
+ void matchBox( const QDomElement& box );
+ void matchLayout( const QDomElement& layout );
+ void matchWidgetLayoutCommon( const QDomElement& widgetLayoutCommon );
+ void matchWidget( const QDomElement& widget );
+ void matchWidgets( const QDomElement& widgets );
+ void matchTabOrder( const QDomElement& tabOrder );
+ void matchWidgetLayout( const QDomElement& widgetLayout );
+ void matchDialog( const QDomElement& dialog );
+
+ QString yyOut;
+ QString yyIndentStr;
+ QString yyFileName;
+ QString yyClassName;
+ QMap<QString, int> yyWidgetTypeSet;
+ QMap<QString, QMap<QString, int> > yyPropertyMap;
+ QMap<QString, QDomElement> yyWidgetMap;
+ QMap<QString, QString> yyCustomWidgets;
+ QValueList<DlgConnection> yyConnections;
+ QMap<QString, QString> yySlots;
+ QMap<QString, QString> yyAliasMap;
+ QStringList yyTabStops;
+ QString yyBoxKind;
+ int yyLayoutDepth;
+ int yyGridRow;
+ int yyGridColumn;
+
+ int numErrors;
+ int uniqueLayout;
+ int uniqueSpacer;
+ int uniqueWidget;
+};
+
+#endif
diff --git a/tools/designer/plugins/dlg/main.cpp b/tools/designer/plugins/dlg/main.cpp
new file mode 100644
index 0000000..b698bad
--- /dev/null
+++ b/tools/designer/plugins/dlg/main.cpp
@@ -0,0 +1,108 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <filterinterface.h>
+#include <qapplication.h>
+
+#include "dlg2ui.h"
+
+class DlgFilter : public ImportFilterInterface, public QLibraryInterface
+{
+public:
+ DlgFilter();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface **iface );
+ Q_REFCOUNT;
+
+ QStringList featureList() const;
+ QStringList import( const QString& filter, const QString& filename );
+
+ bool init();
+ void cleanup();
+ bool canUnload() const;
+};
+
+DlgFilter::DlgFilter()
+{
+}
+
+QRESULT DlgFilter::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)(ImportFilterInterface*)this;
+ else if ( uuid == IID_QFeatureList )
+ *iface = (QFeatureListInterface*)this;
+ else if ( uuid == IID_ImportFilter )
+ *iface = (ImportFilterInterface*)this;
+ else if ( uuid == IID_QLibrary )
+ *iface = (QLibraryInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+QStringList DlgFilter::featureList() const
+{
+ QStringList list;
+ list << "Qt Architect Dialog Files (*.dlg)" ;
+ return list;
+}
+
+QStringList DlgFilter::import( const QString &, const QString& filename )
+{
+ Dlg2Ui d;
+ return d.convertQtArchitectDlgFile( filename );
+}
+
+bool DlgFilter::init()
+{
+ return TRUE;
+}
+
+void DlgFilter::cleanup()
+{
+}
+
+bool DlgFilter::canUnload() const
+{
+ return TRUE;
+}
+
+Q_EXPORT_COMPONENT()
+{
+ Q_CREATE_INSTANCE( DlgFilter )
+}
diff --git a/tools/designer/plugins/glade/glade.pro b/tools/designer/plugins/glade/glade.pro
new file mode 100644
index 0000000..c1be0c5
--- /dev/null
+++ b/tools/designer/plugins/glade/glade.pro
@@ -0,0 +1,13 @@
+TEMPLATE = lib
+CONFIG += qt warn_on release plugin
+HEADERS = glade2ui.h
+SOURCES = main.cpp glade2ui.cpp
+DESTDIR = ../../../../plugins/designer
+DEFINES += QT_INTERNAL_XML
+include( ../../../../src/qt_professional.pri )
+TARGET = gladeplugin
+INCLUDEPATH += ../../interfaces
+
+
+target.path += $$plugins.path/designer
+INSTALLS += target
diff --git a/tools/designer/plugins/glade/glade2ui.cpp b/tools/designer/plugins/glade/glade2ui.cpp
new file mode 100644
index 0000000..39ff5e8
--- /dev/null
+++ b/tools/designer/plugins/glade/glade2ui.cpp
@@ -0,0 +1,2203 @@
+/**********************************************************************
+**
+** Converts a Glade .glade file into a .ui file.
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "glade2ui.h"
+
+#include <qapplication.h>
+#include <qfile.h>
+#include <qimage.h>
+#include <qprogressdialog.h>
+#include <qmessagebox.h>
+#include <qrect.h>
+#include <qregexp.h>
+#include <qsizepolicy.h>
+
+#include <ctype.h>
+
+static const struct {
+ const char *gtkName;
+ const char *qtName;
+} classNames[] = {
+ { "Custom", "Custom" },
+ { "GnomeAbout", "QDialog" },
+ { "GnomeApp", "QMainWindow" },
+ { "GnomeCanvas", "QLabel" },
+ { "GnomeColorPicker", "QComboBox" },
+ { "GnomeDateEdit", "QDateTimeEdit" },
+ { "GnomeDialog", "QDialog" },
+ { "GnomeFontPicker", "QComboBox" },
+ { "GnomeIconSelection", "QIconView" },
+ { "GnomePixmap", "QLabel" },
+ { "GnomePropertyBox", "QDialog" },
+ { "GtkAccelLabel", "QLabel" },
+ { "GtkAspectFrame", "QFrame" },
+ { "GtkButton", "QPushButton" },
+ { "GtkCList", "QListView" },
+ { "GtkCTree", "QListView" },
+ { "GtkCheckButton", "QCheckBox" },
+ { "GtkCombo", "QComboBox" },
+ { "GtkDial", "QDial" },
+ { "GtkDialog", "QDialog" },
+ { "GtkEntry", "QLineEdit" },
+ { "GtkFixed", "QLayoutWidget" },
+ { "GtkFrame", "QFrame" },
+ { "GtkHPaned", "QSplitter" },
+ { "GtkHScale", "QSlider" },
+ { "GtkHScrollbar", "QScrollBar" },
+ { "GtkHSeparator", "Line" },
+ { "GtkHandleBox", "QFrame" },
+ { "GtkImage", "QLabel" },
+ { "GtkLabel", "QLabel" },
+ { "GtkList", "QListBox" },
+ { "GtkNotebook", "QTabWidget" },
+ { "GtkOptionMenu", "QComboBox" },
+ { "GtkPixmap", "QLabel" },
+ { "GtkPreview", "QLabel" },
+ { "GtkProgressBar", "QProgressBar" },
+ { "GtkRadioButton", "QRadioButton" },
+ { "GtkSpinButton", "QSpinBox" },
+ { "GtkStatusbar", "QStatusBar" },
+ { "GtkText", "QTextEdit" },
+ { "GtkToggleButton", "QPushButton" },
+ { "GtkTree", "QListView" },
+ { "GtkVPaned", "QSplitter" },
+ { "GtkVScale", "QSlider" },
+ { "GtkVScrollbar", "QScrollBar" },
+ { "GtkVSeparator", "Line" },
+ { "Placeholder", "QLabel" },
+ { 0, 0 }
+};
+
+static const struct {
+ const char *name;
+ const char *menuText;
+} stockMenuItems[] = {
+ { "ABOUT", "&About" },
+ { "CLEAR", "C&lear" },
+ { "CLOSE", "&Close" },
+ { "CLOSE_WINDOW", "&Close This Window" },
+ { "COPY", "&Copy" },
+ { "CUT", "C&ut" },
+ { "END_GAME", "&End Game" },
+ { "EXIT", "E&xit" },
+ { "FIND", "&Find..." },
+ { "FIND_AGAIN", "Find &Again" },
+ { "HINT", "&Hint" },
+ { "NEW", "&New" },
+ { "NEW_GAME", "&New Game" },
+ { "NEW_WINDOW", "Create New &Window" },
+ { "OPEN", "&Open..." },
+ { "PASTE", "&Paste" },
+ { "PAUSE_GAME", "&Pause Game" },
+ { "PREFERENCES", "&Preferences..." },
+ { "PRINT", "&Print" },
+ { "PRINT_SETUP", "Print S&etup..." },
+ { "PROPERTIES", "&Properties..." },
+ { "REDO", "&Redo" },
+ { "REDO_MOVE", "&Redo Move" },
+ { "REPLACE", "&Replace..." },
+ { "RESTART_GAME", "&Restart Game" },
+ { "REVERT", "&Revert" },
+ { "SAVE", "&Save" },
+ { "SAVE_AS", "Save &As..." },
+ { "SCORES", "&Scores..." },
+ { "SELECT_ALL", "&Select All" },
+ { "UNDO", "&Undo" },
+ { "UNDO_MOVE", "&Undo Move" },
+ { 0, 0 }
+};
+
+static const struct {
+ const char *gtkName;
+ int qtValue;
+} keys[] = {
+ { "BackSpace", Qt::Key_BackSpace },
+ { "Delete", Qt::Key_Delete },
+ { "Down", Qt::Key_Down },
+ { "End", Qt::Key_End },
+ { "Escape", Qt::Key_Escape },
+ { "F1", Qt::Key_F1 },
+ { "F10", Qt::Key_F10 },
+ { "F11", Qt::Key_F11 },
+ { "F12", Qt::Key_F12 },
+ { "F2", Qt::Key_F2 },
+ { "F3", Qt::Key_F3 },
+ { "F4", Qt::Key_F4 },
+ { "F5", Qt::Key_F5 },
+ { "F6", Qt::Key_F6 },
+ { "F7", Qt::Key_F7 },
+ { "F8", Qt::Key_F8 },
+ { "F9", Qt::Key_F9 },
+ { "Home", Qt::Key_Home },
+ { "Insert", Qt::Key_Insert },
+ { "KP_Enter", Qt::Key_Enter },
+ { "Left", Qt::Key_Left },
+ { "Page_Down", Qt::Key_PageDown },
+ { "Page_Up", Qt::Key_PageUp },
+ { "Return", Qt::Key_Return },
+ { "Right", Qt::Key_Right },
+ { "Tab", Qt::Key_Tab },
+ { "Up", Qt::Key_Up },
+ { "space", Qt::Key_Space },
+ { 0, 0 }
+};
+
+static QString nonMenuText( const QString& menuText )
+{
+ QString t;
+ int len = (int) menuText.length();
+ if ( menuText.endsWith(QString("...")) )
+ len -= 3;
+ for ( int i = 0; i < len; i++ ) {
+ if ( menuText[i] != QChar('&') )
+ t += menuText[i];
+ }
+ return t;
+}
+
+/*
+ Some GTK dialog use hyphens in variable names. Let's take no chance.
+*/
+static QString fixedName( const QString& name )
+{
+ const char *latin1 = name.latin1();
+ QString fixed;
+
+ int i = 0;
+ while ( latin1 != 0 && latin1[i] != '\0' ) {
+ if ( isalnum(latin1[i]) )
+ fixed += name[i];
+ else
+ fixed += QChar( '_' );
+ i++;
+ }
+ return fixed;
+}
+
+/*
+ Returns an hexadecimal rendering of a block of memory.
+*/
+static QString hexed( const char *data, int length )
+{
+ QString t;
+ for ( int i = 0; i < length; i++ ) {
+ QString x;
+ x.sprintf( "%.2x", (uchar) data[i] );
+ t += x;
+ }
+ return t;
+}
+
+static bool isTrue( const QString& val )
+{
+ return val.lower() == QString( "true" );
+}
+
+static AttributeMap attribute( const QString& name, const QString& val )
+{
+ AttributeMap attr;
+ attr.insert( name, val );
+ return attr;
+}
+
+static QString entitize( const QString& str )
+{
+ QString t = str;
+ t.replace( '&', QString("&amp;") );
+ t.replace( '>', QString("&gt;") );
+ t.replace( '<', QString("&lt;") );
+ t.replace( '"', QString("&quot;") );
+ t.replace( '\'', QString("&apos;") );
+ return t;
+}
+
+Glade2Ui::Glade2Ui()
+{
+ int i = 0;
+ while ( classNames[i].gtkName != 0 ) {
+ yyClassNameMap.insert( QString(classNames[i].gtkName),
+ QString(classNames[i].qtName) );
+ i++;
+ }
+
+ i = 0;
+ while ( stockMenuItems[i].name != 0 ) {
+ yyStockMap.insert( QString(stockMenuItems[i].name),
+ QString(stockMenuItems[i].menuText) );
+ i++;
+ }
+
+ i = 0;
+ while ( keys[i].gtkName != 0 ) {
+ yyKeyMap.insert( QString(keys[i].gtkName), keys[i].qtValue );
+ i++;
+ }
+}
+
+QString Glade2Ui::imageName( const QString& fileName )
+{
+ return *yyImages.insert( fileName, QString("image%1").arg(yyImages.count()),
+ FALSE );
+}
+
+QString Glade2Ui::opening( const QString& tag, const AttributeMap& attr )
+{
+ QString t = QChar( '<' ) + tag;
+ AttributeMap::ConstIterator a = attr.begin();
+ while ( a != attr.end() ) {
+ t += QChar( ' ' ) + a.key() + QString( "=\"" ) + entitize( *a ) +
+ QChar( '"' );
+ ++a;
+ }
+ t += QChar( '>' );
+ return t;
+}
+
+QString Glade2Ui::closing( const QString& tag )
+{
+ return opening( QChar('/') + tag );
+}
+
+QString Glade2Ui::atom( const QString& tag, const AttributeMap& attr )
+{
+ QString t = opening( tag, attr );
+ t.insert( t.length() - 1, QChar('/') );
+ return t;
+}
+
+void Glade2Ui::error( const QString& message )
+{
+ if ( numErrors++ == 0 )
+ QMessageBox::warning( 0, yyFileName, message );
+}
+
+void Glade2Ui::syntaxError()
+{
+ error( QString("Sorry, I met a random syntax error. I did what I could, but"
+ " that was not enough."
+ "<p>You might want to write to"
+ " <tt>qt-bugs@trolltech.com</tt> about this incident.") );
+}
+
+QString Glade2Ui::getTextValue( const QDomNode& node )
+{
+ if ( node.childNodes().count() > 1 ) {
+ syntaxError();
+ return QString::null;
+ }
+
+ if ( node.childNodes().count() == 0 )
+ return QString::null;
+
+ QDomText t = node.firstChild().toText();
+ if ( t.isNull() ) {
+ syntaxError();
+ return QString::null;
+ }
+ return t.data().stripWhiteSpace();
+}
+
+void Glade2Ui::emitHeader()
+{
+ yyOut += QString( "<!DOCTYPE UI><UI version=\"3.0\" stdsetdef=\"1\">\n" );
+}
+
+void Glade2Ui::emitFooter()
+{
+ yyOut += QString( "</UI>\n" );
+}
+
+void Glade2Ui::emitSimpleValue( const QString& tag, const QString& value,
+ const AttributeMap& attr )
+{
+ yyOut += yyIndentStr + opening( tag, attr ) + entitize( value ) +
+ closing( tag ) + QChar( '\n' );
+}
+
+void Glade2Ui::emitOpening( const QString& tag, const AttributeMap& attr )
+{
+ yyOut += yyIndentStr + opening( tag, attr ) + QChar( '\n' );
+ yyIndentStr += QString( " " );
+}
+
+void Glade2Ui::emitClosing( const QString& tag )
+{
+ yyIndentStr.truncate( yyIndentStr.length() - 4 );
+ yyOut += yyIndentStr + closing( tag ) + QChar( '\n' );
+}
+
+void Glade2Ui::emitAtom( const QString& tag, const AttributeMap& attr )
+{
+ yyOut += yyIndentStr + atom( tag, attr ) + QChar( '\n' );
+}
+
+void Glade2Ui::emitVariant( const QVariant& val, const QString& stringType )
+{
+ if ( val.isValid() ) {
+ switch ( val.type() ) {
+ case QVariant::String:
+ emitSimpleValue( stringType, val.toString() );
+ break;
+ case QVariant::CString:
+ emitSimpleValue( QString("cstring"), val.toString() );
+ break;
+ case QVariant::Bool:
+ emitSimpleValue( QString("bool"),
+ QString(val.toBool() ? "true" : "false") );
+ break;
+ case QVariant::Int:
+ case QVariant::UInt:
+ emitSimpleValue( QString("number"), val.toString() );
+ break;
+ case QVariant::Rect:
+ emitOpening( QString("rect") );
+ emitSimpleValue( QString("x"), QString::number(val.toRect().x()) );
+ emitSimpleValue( QString("y"), QString::number(val.toRect().y()) );
+ emitSimpleValue( QString("width"),
+ QString::number(val.toRect().width()) );
+ emitSimpleValue( QString("height"),
+ QString::number(val.toRect().height()) );
+ emitClosing( QString("rect") );
+ break;
+ case QVariant::Size:
+ emitOpening( QString("size") );
+ emitSimpleValue( QString("width"),
+ QString::number(val.toSize().width()) );
+ emitSimpleValue( QString("height"),
+ QString::number(val.toSize().height()) );
+ emitClosing( QString("size") );
+ break;
+ case QVariant::SizePolicy:
+ emitOpening( QString("sizepolicy") );
+ emitSimpleValue( QString("hsizetype"),
+ QString::number((int) val.toSizePolicy()
+ .horData()) );
+ emitSimpleValue( QString("vsizetype"),
+ QString::number((int) val.toSizePolicy()
+ .verData()) );
+ emitClosing( QString("sizepolicy") );
+ break;
+ default:
+ emitSimpleValue( QString("fnord"), QString::null );
+ }
+ }
+}
+
+void Glade2Ui::emitProperty( const QString& prop, const QVariant& val,
+ const QString& stringType )
+{
+ emitOpening( QString("property"), attribute(QString("name"), prop) );
+ emitVariant( val, stringType );
+ emitClosing( QString("property") );
+}
+
+void Glade2Ui::emitFontProperty( const QString& prop, int pointSize, bool bold )
+{
+ emitOpening( QString("property"), attribute(QString("name"), prop) );
+ emitOpening( QString("font") );
+ emitSimpleValue( QString("pointsize"), QString::number(pointSize) );
+ if ( bold )
+ emitSimpleValue( QString("bold"), QString("1") );
+ emitClosing( QString("font") );
+ emitClosing( QString("property") );
+}
+
+void Glade2Ui::emitAttribute( const QString& prop, const QVariant& val,
+ const QString& stringType )
+{
+ emitOpening( QString("attribute"), attribute(QString("name"), prop) );
+ emitVariant( val, stringType );
+ emitClosing( QString("attribute") );
+}
+
+static QString accelerate( const QString& gtkLabel )
+{
+ QString qtLabel = gtkLabel;
+ qtLabel.replace( '&', QString("&&") );
+ // close but not quite right
+ qtLabel.replace( QChar('_'), QChar('&') );
+ return qtLabel;
+}
+
+static QString decelerate( const QString& gtkLabel )
+{
+ QString qtLabel = gtkLabel;
+ // ditto
+ qtLabel.replace( '_', QString::null );
+ return qtLabel;
+}
+
+/*
+ Converting a GTK widget to a corresponding Qt widget is sometimes
+ hard. For example, a GtkScrolledWindow should sometimes be converted
+ into a QTextView, a QTextEdit, a QListView or whatever. What we do
+ is pretty hackish, but it mostly works.
+*/
+QString Glade2Ui::gtk2qtClass( const QString& gtkClass,
+ const QValueList<QDomElement>& childWidgets )
+{
+ QRegExp gnomeXEntry( QString("Gnome(File|Number|Pixmap)?Entry") );
+
+ QString qtClass;
+
+ if ( gtkClass == QString("GtkScrolledWindow") ) {
+ if ( childWidgets.count() == 1 ) {
+ QString g;
+ bool editable = FALSE;
+ bool showTitles = TRUE;
+
+ QDomNode n = childWidgets.first().firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("class") ) {
+ g = getTextValue( n );
+ } else if ( tagName == QString("editable") ) {
+ editable = isTrue( getTextValue(n) );
+ } else if ( tagName.startsWith(QString("show_tit")) ) {
+ showTitles = isTrue( getTextValue(n) );
+ }
+ n = n.nextSibling();
+ }
+
+ if ( g == QString("GnomeCanvas") ||
+ g == QString("GtkDrawingArea") ) {
+ qtClass = QString( "QLabel" );
+ } else if ( g == QString("GnomeIconList") ) {
+ qtClass = QString( "QIconView" );
+ } else if ( g == QString("GtkCList") ) {
+ if ( showTitles )
+ qtClass = QString( "QListView" );
+ else
+ qtClass = QString( "QListBox" );
+ } else if ( g == QString("GtkCTree") ) {
+ qtClass = QString( "QListView" );
+ } else if ( g == QString("GtkList") ) {
+ qtClass = QString( "QListBox" );
+ } else if ( g == QString("GtkText") ) {
+ if ( editable )
+ qtClass = QString( "QTextEdit" );
+ else
+ qtClass = QString( "QTextView" );
+ } else if ( g == QString("GtkTree") ) {
+ qtClass = QString( "QListView" );
+ }
+ // else too bad (qtClass is empty)
+ }
+ } else if ( gtkClass == QString("GtkWindow") ) {
+ qtClass = QString( "QDialog" );
+ if ( childWidgets.count() == 1 ) {
+ QString g;
+
+ QDomNode n = childWidgets.first().firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("class") )
+ g = getTextValue( n );
+ n = n.nextSibling();
+ }
+ if ( g == QString("GnomeDruid") )
+ qtClass = QString( "QWizard" );
+ }
+ /*
+ GnomeEntry and friends are a wrapper around a GtkEntry. We only
+ want the GtkEntry child.
+ */
+ } else if ( !gnomeXEntry.exactMatch(gtkClass) &&
+ gtkClass != QString("GtkAlignment") &&
+ gtkClass != QString("GtkEventBox") ) {
+ qtClass = yyClassNameMap[gtkClass];
+ if ( qtClass.isEmpty() )
+ qtClass = QString( "Unknown" );
+ }
+ return qtClass;
+}
+
+static QString gtk2qtScrollBarMode( const QString& scrollbarPolicy )
+{
+ if ( scrollbarPolicy.endsWith(QString("_NEVER")) ) {
+ return QString( "AlwaysOff" );
+ } else if ( scrollbarPolicy.endsWith(QString("_ALWAYS")) ) {
+ return QString( "AlwaysOn" );
+ } else {
+ return QString( "Auto" );
+ }
+}
+
+static QString gtk2qtSelectionMode( const QString& selectionMode )
+{
+ if ( selectionMode.endsWith(QString("_MULTIPLE")) )
+ return QString( "Multi" );
+ else if ( selectionMode.endsWith(QString("_EXTENDED")) )
+ return QString( "Extended" );
+ else
+ return QString( "Single" );
+}
+
+int Glade2Ui::matchAccelOnActivate( const QDomElement& accel )
+{
+ QString key;
+ QString modifiers;
+
+ QDomNode n = accel.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("key") ) {
+ key = getTextValue( n );
+ if ( !key.startsWith(QString("GDK_")) )
+ return 0;
+ } else if ( tagName == QString("modifiers") ) {
+ modifiers = getTextValue( n );
+ } else if ( tagName == QString("signal") ) {
+ if ( getTextValue(n) != QString("activate") )
+ return 0;
+ }
+ n = n.nextSibling();
+ }
+
+ int flags = 0;
+
+ if ( key.length() == 5 ) {
+ flags = key[4].upper().latin1();
+ } else if ( yyKeyMap.contains(key.mid(4)) ) {
+ flags = yyKeyMap[key.mid(4)];
+ } else {
+ return 0;
+ }
+
+ if ( modifiers.contains(QString("_CONTROL_")) )
+ flags |= Qt::CTRL;
+ if ( modifiers.contains(QString("_SHIFT_")) )
+ flags |= Qt::SHIFT;
+ if ( modifiers.contains(QString("_MOD1_")) )
+ flags |= Qt::ALT;
+ return flags;
+}
+
+void Glade2Ui::emitGtkMenu( const QDomElement& menu )
+{
+ QRegExp gnomeuiinfoMenuXItem( QString("GNOMEUIINFO_MENU_(.+)_ITEM") );
+
+ QDomNode n = menu.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("widget") ) {
+ QString activateHandler;
+ QString gtkClass;
+ QString icon;
+ QString label;
+ QString name;
+ QString stockItem;
+ QString tooltip;
+ int qtAccel = 0;
+
+ QDomNode child = n.firstChild();
+ while ( !child.isNull() ) {
+ QString childTagName = child.toElement().tagName();
+ if ( childTagName == QString("accelerator") ) {
+ qtAccel = matchAccelOnActivate( child.toElement() );
+ } else if ( childTagName == QString("class") ) {
+ gtkClass = getTextValue( child );
+ } else if ( childTagName == QString("icon") ) {
+ icon = getTextValue( child );
+ } else if ( childTagName == QString("label") ) {
+ label = getTextValue( child );
+ } else if ( childTagName == QString("name") ) {
+ name = getTextValue( child );
+ } else if ( childTagName == QString("signal") ) {
+ QString signalName;
+ QString signalHandler;
+
+ QDomNode grandchild = child.firstChild();
+ while ( !grandchild.isNull() ) {
+ QString grandchildTagName =
+ grandchild.toElement().tagName();
+ if ( grandchildTagName == QString("handler") ) {
+ signalHandler = getTextValue( grandchild );
+ } else if ( grandchildTagName == QString("name") ) {
+ signalName = getTextValue( grandchild );
+ }
+ grandchild = grandchild.nextSibling();
+ }
+ if ( signalName == QString("activate") )
+ activateHandler = signalHandler;
+ } else if ( childTagName == QString("stock_item") ) {
+ stockItem = getTextValue( child );
+ } else if ( childTagName == QString("tooltip") ) {
+ tooltip = getTextValue( child );
+ }
+ child = child.nextSibling();
+ }
+
+ if ( label.length() + stockItem.length() == 0 ) {
+ emitAtom( QString("separator") );
+ } else {
+ if ( name.isEmpty() )
+ name = QString( "action%1" ).arg( uniqueAction++ );
+ emitAtom( QString("action"), attribute(QString("name"), name) );
+
+ if ( !activateHandler.isEmpty() ) {
+ QString slot = activateHandler + QString( "()" );
+ GladeConnection c;
+ c.sender = name;
+ c.signal = QString( "activated()" );
+ c.slot = slot;
+ yyConnections.push_back( c );
+ yySlots.insert( slot, QString("public") );
+ }
+
+ QString x;
+ GladeAction a;
+
+ if ( gnomeuiinfoMenuXItem.exactMatch(stockItem) ) {
+ x = gnomeuiinfoMenuXItem.cap( 1 );
+ a.menuText = yyStockMap[x];
+ if ( x == QString("EXIT") && qtAccel == 0 )
+ qtAccel = Qt::CTRL + Qt::Key_Q;
+ } else {
+ a.menuText = accelerate( label );
+ }
+ a.text = nonMenuText( a.menuText );
+ a.toolTip = tooltip;
+ a.accel = qtAccel;
+ a.iconSet = icon;
+ yyActions.insert( name, a );
+ if ( !x.isEmpty() )
+ yyStockItemActions.insert( x, name );
+ }
+ }
+ n = n.nextSibling();
+ }
+}
+
+void Glade2Ui::emitGtkMenuBarChildWidgets(
+ const QValueList<QDomElement>& childWidgets )
+{
+ QRegExp gnomeuiinfoMenuXTree( QString("GNOMEUIINFO_MENU_(.+)_TREE") );
+
+ emitOpening( QString("menubar") );
+ emitProperty( QString("name"),
+ QString("MenuBar%1").arg(uniqueMenuBar++).latin1() );
+
+ QValueList<QDomElement>::ConstIterator c = childWidgets.begin();
+ while ( c != childWidgets.end() ) {
+ QValueList<QDomElement> grandchildWidgets;
+ QString gtkClass;
+ QString label;
+ QString name;
+ QString stockItem;
+
+ QDomNode n = (*c).firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("class") ) {
+ gtkClass = getTextValue( n );
+ } else if ( tagName == QString("label") ) {
+ label = getTextValue( n );
+ } else if ( tagName == QString("name") ) {
+ name = getTextValue( n );
+ } else if ( tagName == QString("stock_item") ) {
+ stockItem = getTextValue( n );
+ } else if ( tagName == QString("widget") ) {
+ grandchildWidgets.push_back( n.toElement() );
+ }
+ n = n.nextSibling();
+ }
+
+ if ( gtkClass == QString("GtkMenuItem") &&
+ grandchildWidgets.count() == 1 ) {
+ QString text;
+ if ( gnomeuiinfoMenuXTree.exactMatch(stockItem) ) {
+ text = gnomeuiinfoMenuXTree.cap( 1 );
+ if ( text == QString("Files") )
+ text = QString( "Fi&les" );
+ else
+ text = QChar( '&' ) + text.left( 1 ) +
+ text.mid( 1 ).lower();
+ } else {
+ text = accelerate( label );
+ }
+
+ AttributeMap attr;
+ attr.insert( QString("name"), name );
+ attr.insert( QString("text"), text );
+
+ emitOpening( QString("item"), attr );
+ emitGtkMenu( grandchildWidgets.first() );
+ emitClosing( QString("item") );
+ }
+ ++c;
+ }
+ emitClosing( QString("menubar") );
+}
+
+void Glade2Ui::emitGtkToolbarChildWidgets(
+ const QValueList<QDomElement>& childWidgets )
+{
+ QRegExp gnomeStockPixmapX( QString("GNOME_STOCK_PIXMAP_(.+)") );
+
+ emitOpening( QString("toolbar"), attribute(QString("dock"), QString("2")) );
+ emitProperty( QString("name"),
+ QString("ToolBar%1").arg(uniqueToolBar++).latin1() );
+
+ QValueList<QDomElement>::ConstIterator c = childWidgets.begin();
+ while ( c != childWidgets.end() ) {
+ QString childName;
+ QString icon;
+ QString label;
+ QString name;
+ QString stockPixmap;
+ QString tooltip;
+
+ QDomNode n = (*c).firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("child_name") ) {
+ childName = getTextValue( n );
+ } else if ( tagName == QString("icon") ) {
+ icon = getTextValue( n );
+ } else if ( tagName == QString("label") ) {
+ label = getTextValue( n );
+ } else if ( tagName == QString("name") ) {
+ name = getTextValue( n );
+ } else if ( tagName == QString("stock_pixmap") ) {
+ stockPixmap = getTextValue( n );
+ } else if ( tagName == QString("tooltip") ) {
+ tooltip = getTextValue( n );
+ }
+ n = n.nextSibling();
+ }
+
+ if ( childName == QString("Toolbar:button") ) {
+ QString actionName;
+ GladeAction a;
+ a.menuText = label;
+ a.text = label;
+ a.accel = 0;
+ a.iconSet = icon;
+
+ if ( gnomeStockPixmapX.exactMatch(stockPixmap) ) {
+ QString x = gnomeStockPixmapX.cap( 1 );
+ actionName = yyStockItemActions[x];
+ }
+ if ( actionName.isEmpty() ) {
+ if ( name.isEmpty() )
+ actionName = QString( "action%1" ).arg( uniqueAction++ );
+ else
+ actionName = QString( "action_%1" ).arg( name );
+ yyActions.insert( actionName, a );
+ }
+ if ( !tooltip.isEmpty() )
+ yyActions[actionName].toolTip = tooltip;
+
+ emitAtom( QString("action"), attribute(QString("name"),
+ actionName) );
+ } else {
+ emitAtom( QString("separator") );
+ }
+ ++c;
+ }
+ emitClosing( QString("toolbar") );
+}
+
+void Glade2Ui::emitPushButton( const QString& text, const QString& name )
+{
+ emitOpening( QString("widget"),
+ attribute(QString("class"), QString("QPushButton")) );
+ emitProperty( QString("name"), name.latin1() );
+ emitProperty( QString("text"), text );
+ if ( name.contains(QString("ok")) > 0 ) {
+ emitProperty( QString("default"), QVariant(TRUE, 0) );
+ } else if ( name.contains(QString("help")) > 0 ) {
+ emitProperty( QString("accel"), (int) Qt::Key_F1 );
+ }
+ emitClosing( QString("widget") );
+}
+
+void Glade2Ui::attach( AttributeMap *attr, int leftAttach, int rightAttach,
+ int topAttach, int bottomAttach )
+{
+ if ( leftAttach >= 0 ) {
+ attr->insert( QString("row"), QString::number(topAttach) );
+ attr->insert( QString("column"), QString::number(leftAttach) );
+ if ( bottomAttach - topAttach != 1 )
+ attr->insert( QString("rowspan"),
+ QString::number(bottomAttach - topAttach) );
+ if ( rightAttach - leftAttach != 1 )
+ attr->insert( QString("colspan"),
+ QString::number(rightAttach - leftAttach) );
+ }
+}
+
+void Glade2Ui::emitSpacer( const QString& orientation, int leftAttach,
+ int rightAttach, int topAttach, int bottomAttach )
+{
+ AttributeMap attr;
+ attach( &attr, leftAttach, rightAttach, topAttach, bottomAttach );
+ emitOpening( QString("spacer"), attr );
+ emitProperty( QString("name"),
+ QString("Spacer%1").arg(uniqueSpacer++).latin1() );
+ emitProperty( QString("orientation"), orientation, QString("enum") );
+ emitProperty( QString("sizeType"), QString("Expanding"),
+ QString("enum") );
+ emitClosing( QString("spacer") );
+}
+
+void Glade2Ui::emitPixmap( const QString& imageName, int leftAttach,
+ int rightAttach, int topAttach, int bottomAttach )
+{
+ emitOpeningWidget( QString("QLabel"), leftAttach, rightAttach, topAttach,
+ bottomAttach );
+ emitProperty( QString("sizePolicy"),
+ QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed) );
+ emitProperty( QString("pixmap"), imageName, QString("pixmap") );
+ emitClosing( QString("widget") );
+}
+
+void Glade2Ui::emitGnomeAbout( QString copyright, QString authors,
+ QString comments )
+{
+ QString prog = yyProgramName;
+ if ( prog.isEmpty() )
+ prog = QString( "Gnomovision 1.69" );
+ if ( copyright.isEmpty() )
+ copyright = QString( "(C) 2001 Jasmin Blanchette" );
+ if ( authors.isEmpty() )
+ authors = QString( "Jasmin Blanchette <jasmin@troll.no>" );
+ if ( comments.isEmpty() )
+ comments = QString( "Gnomovision is the official GNU application." );
+
+ emitOpening( QString("hbox") );
+ emitSpacer( QString("Horizontal") );
+ emitOpeningWidget( QString("QLayoutWidget") );
+ emitOpening( QString("vbox") );
+ emitProperty( QString("spacing"), 17 );
+
+ /*
+ Emit the application name.
+ */
+ emitOpeningWidget( QString("QLabel") );
+ emitFontProperty( QString("font"), 24, TRUE );
+ emitProperty( QString("text"), prog );
+ emitProperty( QString("alignment"), QString("AlignAuto|AlignCenter"),
+ QString("set") );
+ emitClosing( QString("widget") );
+
+ /*
+ Emit the copyright notice.
+ */
+ emitOpeningWidget( QString("QLabel") );
+ emitFontProperty( QString("font"), 12, TRUE );
+ emitProperty( QString("text"), copyright );
+ emitClosing( QString("widget") );
+
+ /*
+ Emit the authors' names.
+ */
+ emitOpeningWidget( QString("QLayoutWidget") );
+ emitOpening( QString("hbox") );
+
+ emitOpeningWidget( QString("QLabel") );
+ emitFontProperty( QString("font"), 12, TRUE );
+ emitProperty( QString("text"), QString("Authors:") );
+ emitProperty( QString("alignment"), QString("AlignAuto|AlignTop"),
+ QString("set") );
+ emitClosing( QString("widget") );
+
+ emitOpeningWidget( QString("QLabel") );
+ emitFontProperty( QString("font"), 12, FALSE );
+ emitProperty( QString("text"), authors );
+ emitProperty( QString("alignment"), QString("AlignAuto|AlignTop"),
+ QString("set") );
+ emitClosing( QString("widget") );
+
+ emitSpacer( QString("Horizontal") );
+
+ emitClosing( QString("hbox") );
+ emitClosing( QString("widget") );
+
+ /*
+ Emit the comments.
+ */
+ emitOpeningWidget( QString("QLabel") );
+ emitFontProperty( QString("font"), 10, FALSE );
+ emitProperty( QString("text"), comments );
+ emitProperty( QString("alignment"), QString("AlignAuto|AlignTop"),
+ QString("set") );
+ emitClosing( QString("widget") );
+
+ /*
+ Emit the spacer and the OK button.
+ */
+ emitSpacer( QString("Vertical") );
+
+ emitOpeningWidget( QString("QLayoutWidget") );
+ emitOpening( QString("hbox") );
+ emitSpacer( QString("Horizontal") );
+
+ emitPushButton( QString("&OK"), QString("okButton") );
+
+ emitSpacer( QString("Horizontal") );
+ emitClosing( QString("hbox") );
+ emitClosing( QString("widget") );
+
+ emitClosing( QString("vbox") );
+ emitClosing( QString("widget") );
+ emitSpacer( QString("Horizontal") );
+ emitClosing( QString("hbox") );
+}
+
+/*
+ GnomeApps are emitted in two passes, because some information goes
+ into the <widget> section, whereas other information goes into the
+ <toolbars> section.
+*/
+void Glade2Ui::emitGnomeAppChildWidgetsPass1(
+ const QValueList<QDomElement>& childWidgets )
+{
+ QValueList<QDomElement>::ConstIterator c = childWidgets.begin();
+ while ( c != childWidgets.end() ) {
+ QValueList<QDomElement> grandchildWidgets;
+ QString childName;
+
+ QDomNode n = (*c).firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("child_name") ) {
+ childName = getTextValue( n );
+ } else if ( tagName == QString("widget") ) {
+ grandchildWidgets.push_back( n.toElement() );
+ }
+ n = n.nextSibling();
+ }
+
+ if ( childName == QString("GnomeDock:contents") ) {
+ emitWidget( *c, FALSE );
+ } else {
+ emitGnomeAppChildWidgetsPass1( grandchildWidgets );
+ }
+ ++c;
+ }
+}
+
+void Glade2Ui::doPass2( const QValueList<QDomElement>& childWidgets,
+ QValueList<QDomElement> *menuBar,
+ QValueList<QValueList<QDomElement> > *toolBars )
+{
+ QValueList<QDomElement>::ConstIterator c = childWidgets.begin();
+ while ( c != childWidgets.end() ) {
+ QValueList<QDomElement> grandchildWidgets;
+ QString childName;
+ QString gtkClass;
+
+ QDomNode n = (*c).firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("child_name") ) {
+ childName = getTextValue( n );
+ } else if ( tagName == QString("class") ) {
+ gtkClass = getTextValue( n );
+ } else if ( tagName == QString("widget") ) {
+ grandchildWidgets.push_back( n.toElement() );
+ }
+ n = n.nextSibling();
+ }
+
+ if ( gtkClass == QString("GtkMenuBar") ) {
+ *menuBar = grandchildWidgets;
+ } else if ( gtkClass == QString("GtkToolbar") ) {
+ toolBars->push_back( grandchildWidgets );
+ } else if ( childName != QString("GnomeDock:contents") ) {
+ doPass2( grandchildWidgets, menuBar, toolBars );
+ }
+ ++c;
+ }
+}
+
+void Glade2Ui::emitGnomeAppChildWidgetsPass2(
+ const QValueList<QDomElement>& childWidgets )
+{
+ QValueList<QDomElement> menuBar;
+ QValueList<QValueList<QDomElement> > toolBars;
+
+ doPass2( childWidgets, &menuBar, &toolBars );
+
+ emitGtkMenuBarChildWidgets( menuBar );
+ if ( !toolBars.isEmpty() ) {
+ emitOpening( QString("toolbars") );
+ while ( !toolBars.isEmpty() ) {
+ emitGtkToolbarChildWidgets( toolBars.first() );
+ toolBars.remove( toolBars.begin() );
+ }
+ emitClosing( QString("toolbars") );
+ }
+}
+
+void Glade2Ui::emitGtkButtonChildWidgets( QValueList<QDomElement> childWidgets )
+{
+ QValueList<QDomElement>::ConstIterator c = childWidgets.begin();
+ while ( c != childWidgets.end() ) {
+ QString label;
+
+ QDomNode n = (*c).firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("label") ) {
+ label = getTextValue( n );
+ } else if ( tagName == QString("widget") ) {
+ childWidgets.push_back( n.toElement() );
+ }
+ n = n.nextSibling();
+ }
+
+ if ( !label.isEmpty() ) {
+ emitProperty( QString("text"), accelerate(label) );
+ break;
+ }
+ ++c;
+ }
+}
+
+void Glade2Ui::emitGtkComboChildWidgets(
+ const QValueList<QDomElement>& childWidgets, const QStringList& items )
+{
+ QString text;
+
+ // there should be exactly one child, of type GtkEntry
+ if ( childWidgets.count() == 1 ) {
+ QDomNode n = childWidgets.first().firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("name") ) {
+ // grep 'elsewhere'
+ emitProperty( QString("name"),
+ fixedName(getTextValue(n).latin1()) );
+ } else if ( tagName == QString("text") ) {
+ text = getTextValue( n );
+ }
+ n = n.nextSibling();
+ }
+ }
+
+ int n = 0;
+ QStringList::ConstIterator s = items.begin();
+ while ( s != items.end() ) {
+ if ( !text.isEmpty() && *s == text )
+ emitProperty( QString("currentItem"), n );
+ n++;
+ ++s;
+ }
+
+}
+
+void Glade2Ui::emitGtkNotebookChildWidgets(
+ const QValueList<QDomElement>& childWidgets )
+{
+ QStringList tabNames;
+ QStringList tabLabels;
+
+ for ( int i = 0; i < (int) childWidgets.count(); i++ ) {
+ tabNames.push_back( QString("tab%1").arg(i + 1) );
+ tabLabels.push_back( QString("Tab %1").arg(i + 1) );
+ }
+
+ QValueList<QDomElement>::ConstIterator c;
+ c = childWidgets.begin();
+
+ QStringList::Iterator nam = tabNames.begin();
+ QStringList::Iterator lab = tabLabels.begin();
+
+ while ( c != childWidgets.end() ) {
+ QString childName;
+ QString name;
+ QString label;
+
+ QDomNode n = (*c).firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("child_name") ) {
+ childName = getTextValue( n );
+ } else if ( tagName == QString("name") ) {
+ name = getTextValue( n );
+ } else if ( tagName == QString("label") ) {
+ label = getTextValue( n );
+ }
+ n = n.nextSibling();
+ }
+
+ if ( childName == QString("Notebook:tab") ) {
+ if ( !name.isEmpty() )
+ *nam = name;
+ if ( !label.isEmpty() )
+ *lab = label;
+ ++nam;
+ ++lab;
+ }
+ ++c;
+ }
+
+ c = childWidgets.begin();
+ while ( c != childWidgets.end() ) {
+ QString childName;
+ QString name;
+ QString label;
+
+ QDomNode n = (*c).firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("child_name") )
+ childName = getTextValue( n );
+ n = n.nextSibling();
+ }
+
+ if ( childName != QString("Notebook:tab") ) {
+ emitOpeningWidget( QString("QWidget") );
+ emitProperty( QString("name"), tabNames.first().latin1() );
+ tabNames.remove( tabNames.begin() );
+ emitAttribute( QString("title"), accelerate(tabLabels.first()) );
+ tabLabels.remove( tabLabels.begin() );
+ emitWidget( *c, FALSE );
+ emitClosing( QString("widget") );
+ }
+ ++c;
+ }
+}
+
+void Glade2Ui::emitQListViewColumns( const QDomElement& qlistview )
+{
+ QDomNode n = qlistview.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("widget") ) {
+ QDomNode child = n.firstChild();
+ while ( !child.isNull() ) {
+ QString tagName = child.toElement().tagName();
+ if ( tagName == QString("label") ) {
+ emitOpening( QString("column") );
+ emitProperty( QString("text"),
+ decelerate(getTextValue(child)) );
+ emitClosing( QString("column") );
+ }
+ child = child.nextSibling();
+ }
+ } else if ( tagName == QString("class") ) {
+ QString gtkClass = getTextValue( n );
+ if ( gtkClass.endsWith(QString("Tree")) )
+ emitProperty( QString("rootIsDecorated"), QVariant(TRUE, 0) );
+ } else if ( tagName == QString("selection_mode") ) {
+ emitProperty( QString("selectionMode"),
+ gtk2qtSelectionMode(getTextValue(n)) );
+ }
+ n = n.nextSibling();
+ }
+}
+
+void Glade2Ui::emitGtkScrolledWindowChildWidgets(
+ const QValueList<QDomElement>& childWidgets, const QString& qtClass )
+{
+ if ( childWidgets.count() == 1 ) {
+ if ( qtClass == QString("QIconView") ||
+ qtClass == QString("QListBox") ||
+ qtClass == QString("QListView") ) {
+ QDomNode n = childWidgets.first().firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("selection_mode") ) {
+ emitProperty( QString("selectionMode"),
+ gtk2qtSelectionMode(getTextValue(n)) );
+ }
+ n = n.nextSibling();
+ }
+ }
+
+ if ( qtClass == QString("QListView") ) {
+ emitQListViewColumns( childWidgets.first() );
+ } else if ( qtClass == QString("QTextEdit") ||
+ qtClass == QString("QTextView") ) {
+ QDomNode n = childWidgets.first().firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("text") )
+ emitProperty( QString("text"), getTextValue(n) );
+ n = n.nextSibling();
+ }
+ }
+ }
+}
+
+void Glade2Ui::emitGnomeDruidPage( const QDomElement& druidPage )
+{
+ QValueList<QDomElement> childWidgets;
+ QString gtkClass;
+ QString logoImage;
+ QString name;
+ QString text;
+ QString title;
+ QString watermarkImage;
+
+ emitOpeningWidget( QString("QWidget") );
+
+ QDomNode n = druidPage.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("class") ) {
+ gtkClass = getTextValue( n );
+ } else if ( tagName == QString("logo_image") ) {
+ logoImage = getTextValue( n );
+ } else if ( tagName == QString("name") ) {
+ name = getTextValue( n );
+ } else if ( tagName == QString("text") ) {
+ text = getTextValue( n );
+ } else if ( tagName == QString("title") ) {
+ title = getTextValue( n );
+ } else if ( tagName == QString("watermark_image") ) {
+ watermarkImage = getTextValue( n );
+ } else if ( tagName == QString("widget") ) {
+ childWidgets.push_back( n.toElement() );
+ }
+ n = n.nextSibling();
+ }
+
+ if ( !name.isEmpty() )
+ emitProperty( QString("name"), fixedName(name).latin1() );
+ if ( title.isEmpty() )
+ title = QString( "Page" );
+ emitAttribute( QString("title"), title );
+
+ /*
+ We're striving to get the logoImage and/or the watermarkImage at
+ the right places with a grid layout.
+ */
+ int leftAttach = 0;
+ int rightAttach = 0;
+ int topAttach = 0;
+ int bottomAttach = 0;
+
+ int numImages = 0;
+ if ( !logoImage.isEmpty() ) {
+ topAttach = 1;
+ numImages++;
+ }
+ if ( !watermarkImage.isEmpty() ) {
+ leftAttach = 1;
+ numImages++;
+ }
+ rightAttach = leftAttach + numImages;
+ bottomAttach = topAttach + numImages;
+
+ bool layouted = ( numImages > 0 );
+ if ( layouted ) {
+ emitOpening( QString("grid") );
+ if ( !logoImage.isEmpty() )
+ emitPixmap( imageName(logoImage), numImages, numImages + 1, 0, 1 );
+ if ( !watermarkImage.isEmpty() )
+ emitPixmap( imageName(watermarkImage), 0, 1, numImages,
+ numImages + 1 );
+ } else {
+ leftAttach = -1;
+ rightAttach = -1;
+ topAttach = -1;
+ bottomAttach = -1;
+ }
+
+ if ( gtkClass.endsWith(QString("Standard")) ) {
+ emitChildWidgets( childWidgets, layouted, leftAttach, rightAttach,
+ topAttach, bottomAttach );
+ } else if ( !text.isEmpty() ) {
+ if ( layouted )
+ emitOpeningWidget( QString("QLayoutWidget"), leftAttach,
+ rightAttach, topAttach, bottomAttach );
+ emitOpening( QString("hbox") );
+ emitSpacer( QString("Horizontal") );
+ emitOpeningWidget( QString("QLabel") );
+ emitProperty( QString("text"), text );
+ emitClosing( QString("widget") );
+ emitSpacer( QString("Horizontal") );
+ emitClosing( QString("hbox") );
+ if ( layouted )
+ emitClosing( QString("widget") );
+ }
+
+ if ( layouted )
+ emitClosing( QString("grid") );
+ emitClosing( QString("widget") );
+}
+
+void Glade2Ui::emitGtkWindowChildWidgets(
+ const QValueList<QDomElement>& childWidgets, const QString& qtClass )
+{
+ if ( childWidgets.count() == 1 && qtClass == QString("QWizard") ) {
+ emitFontProperty( QString("titleFont"), 18, FALSE );
+
+ QDomNode n = childWidgets.first().firstChild();
+ while ( !n.isNull() ) {
+ if ( n.toElement().tagName() == QString("widget") )
+ emitGnomeDruidPage( n.toElement() );
+ n = n.nextSibling();
+ }
+ } else {
+ emitChildWidgets( childWidgets, FALSE );
+ }
+}
+
+bool Glade2Ui::packEnd( const QDomElement& widget )
+{
+ QDomNode n = widget.firstChild();
+ while ( !n.isNull() ) {
+ if ( n.toElement().tagName() == QString("child") ) {
+ QDomNode child = n.firstChild();
+ while ( !child.isNull() ) {
+ if ( child.toElement().tagName() == QString("pack") ) {
+ QString pack = getTextValue( child );
+ return pack.endsWith( QString("_END") );
+ }
+ child = child.nextSibling();
+ }
+ }
+ n = n.nextSibling();
+ }
+ return FALSE;
+}
+
+void Glade2Ui::emitChildWidgets( const QValueList<QDomElement>& childWidgets,
+ bool layouted, int leftAttach, int rightAttach,
+ int topAttach, int bottomAttach )
+{
+ QValueList<QDomElement> start;
+ QValueList<QDomElement> end;
+ QValueList<QDomElement>::ConstIterator e;
+
+ if ( layouted ) {
+ e = childWidgets.begin();
+ while ( e != childWidgets.end() ) {
+ if ( packEnd(*e) )
+ end.push_front( *e );
+ else
+ start.push_back( *e );
+ ++e;
+ }
+ } else {
+ start = childWidgets;
+ }
+
+ e = start.begin();
+ while ( e != start.end() ) {
+ emitWidget( *e, layouted, leftAttach, rightAttach, topAttach,
+ bottomAttach );
+ ++e;
+ }
+ e = end.begin();
+ while ( e != end.end() ) {
+ emitWidget( *e, layouted, leftAttach, rightAttach, topAttach,
+ bottomAttach );
+ ++e;
+ }
+}
+
+void Glade2Ui::emitOpeningWidget( const QString& qtClass, int leftAttach,
+ int rightAttach, int topAttach,
+ int bottomAttach )
+{
+ AttributeMap attr = attribute( QString("class"), qtClass );
+ attach( &attr, leftAttach, rightAttach, topAttach, bottomAttach );
+ emitOpening( QString("widget"), attr );
+}
+
+/*
+ Returns TRUE if the vbox containing childWidgets should have a
+ spacer at the end to prevent it from looking bad, otherwise returns
+ FALSE.
+
+ The algorithm is very experimental.
+*/
+bool Glade2Ui::shouldPullup( const QValueList<QDomElement>& childWidgets )
+{
+ QRegExp gtkSmallWidget( QString(
+ "G.*(?:Button|Combo|Dial|Entry|Label|OptionMenu|Picker|ProgressBar"
+ "|Separator|Statusbar|Toolbar|VBox)") );
+
+ QValueList<QDomElement>::ConstIterator c = childWidgets.begin();
+ while ( c != childWidgets.end() ) {
+ QValueList<QDomElement> grandchildWidgets;
+ QString gtkClass;
+
+ QDomNode n = (*c).firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( tagName == QString("class") ) {
+ gtkClass = getTextValue( n );
+ } else if ( tagName == QString("widget") ) {
+ grandchildWidgets.push_back( n.toElement() );
+ }
+ n = n.nextSibling();
+ }
+
+ if ( !gtkSmallWidget.exactMatch(gtkClass) ||
+ !shouldPullup(grandchildWidgets) )
+ return FALSE;
+ ++c;
+ }
+ return TRUE;
+}
+
+QString Glade2Ui::emitWidget( const QDomElement& widget, bool layouted,
+ int leftAttach, int rightAttach, int topAttach,
+ int bottomAttach )
+{
+ QRegExp gtkLayoutWidget( QString(
+ "Gtk(?:Packer|Table|Toolbar|[HV](?:(?:Button)?Box))") );
+ QRegExp gtkOrientedWidget( QString(
+ "Gtk([HV])(?:Paned|Scale|Scrollbar|Separator)") );
+
+ QValueList<QDomElement> childWidgets;
+ QString gtkClass;
+ QString name;
+ QString title;
+ int x = 0;
+ int y = 0;
+ int width = 0;
+ int height = 0;
+ int numRows = 0;
+ int numColumns = 0;
+
+ bool active = FALSE;
+ QString authors;
+ QString childName;
+ QString comments;
+ QString copyright;
+ QString creationFunction;
+ bool editable = TRUE;
+ QString filename;
+ QString focusTarget;
+ QString hscrollbarPolicy;
+ QString icon;
+ int initialChoice = 0;
+ QStringList items;
+ QString justify;
+ QString label;
+ QString logoImage;
+ int lower = -123456789;
+ int page = 10;
+ int pageSize = 10;
+ QString selectionMode;
+ QString shadowType( "GTK_SHADOW_NONE" );
+ bool showText = TRUE;
+ bool showTitles = TRUE;
+ int step = 1;
+ QString tabPos;
+ QString text;
+ int textMaxLength = 0;
+ bool textVisible = TRUE;
+ QString tooltip;
+ QString type;
+ int upper = 123456789;
+ int value = 123456789;
+ bool valueInList = TRUE;
+ QString vscrollbarPolicy;
+ QString watermarkImage;
+ bool wrap = FALSE;
+
+ bool topLevel = yyFormName.isEmpty();
+ if ( topLevel )
+ name = QString( "Form%1" ).arg( uniqueForm++ );
+
+ QDomNode n = widget.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+ if ( !tagName.isEmpty() ) {
+ /*
+ Recognize the properties and stores them in variables.
+ This step is a bit silly, and if this function were to
+ be rewritten, almost everything would just be stored, as
+ strings, in a giant map, and looked up for when emitting
+ the properties.
+ */
+ switch ( (uchar) tagName[0].cell() ) {
+ case 'a':
+ if ( tagName == QString("active") ) {
+ active = isTrue( getTextValue(n) );
+ } else if ( tagName == QString("authors") ) {
+ authors = getTextValue( n );
+ }
+ break;
+ case 'c':
+ if ( tagName == QString("child") ) {
+ QDomNode child = n.firstChild();
+ while ( !child.isNull() ) {
+ QString childTagName = child.toElement().tagName();
+ if ( childTagName == QString("left_attach") ) {
+ leftAttach = getTextValue( child ).toInt();
+ } else if ( childTagName == QString("right_attach") ) {
+ rightAttach = getTextValue( child ).toInt();
+ } else if ( childTagName == QString("top_attach") ) {
+ topAttach = getTextValue( child ).toInt();
+ } else if ( childTagName == QString("bottom_attach") ) {
+ bottomAttach = getTextValue( child ).toInt();
+ }
+ child = child.nextSibling();
+ }
+ } else if ( tagName == QString("child_name") ) {
+ childName = getTextValue( n );
+ } else if ( tagName == QString("class") ) {
+ gtkClass = getTextValue( n );
+ } else if ( tagName == QString("climb_rate") ) {
+ step = getTextValue( n ).toInt();
+ } else if ( tagName == QString("columns") ) {
+ numColumns = getTextValue( n ).toInt();
+ } else if ( tagName == QString("comments") ) {
+ comments = getTextValue( n );
+ } else if ( tagName == QString("copyright") ) {
+ copyright = getTextValue( n );
+ } else if ( tagName == QString("creation_function") ) {
+ creationFunction = getTextValue( n );
+ }
+ break;
+ case 'd':
+ if ( tagName == QString("default_focus_target") ) {
+ if ( focusTarget.isEmpty() )
+ focusTarget = getTextValue( n );
+ }
+ break;
+ case 'e':
+ if ( tagName == QString("editable") )
+ editable = isTrue( getTextValue(n) );
+ break;
+ case 'f':
+ if ( tagName == QString("filename") ) {
+ filename = getTextValue( n );
+ } else if ( tagName == QString("focus_target") ) {
+ focusTarget = getTextValue( n );
+ }
+ break;
+ case 'h':
+ if ( tagName == QString("height") ) {
+ height = getTextValue( n ).toInt();
+ } else if ( tagName == QString("hscrollbar_policy") ) {
+ hscrollbarPolicy = getTextValue( n );
+ }
+ break;
+ case 'i':
+ if ( tagName == QString("icon") ) {
+ icon = getTextValue( n );
+ } else if ( tagName == QString("initial_choice") ) {
+ initialChoice = getTextValue( n ).toInt();
+ } else if ( tagName == QString("items") ) {
+ items = QStringList::split( QChar('\n'), getTextValue(n) );
+ }
+ break;
+ case 'j':
+ if ( tagName == QString("justify") )
+ justify = getTextValue( n );
+ break;
+ case 'l':
+ if ( tagName == QString("label") ) {
+ label = getTextValue( n );
+ } else if ( tagName == QString("logo_image") ) {
+ logoImage = getTextValue( n );
+ } else if ( tagName == QString("lower") ) {
+ lower = getTextValue( n ).toInt();
+ }
+ break;
+ case 'n':
+ if ( tagName == QString("name") )
+ name = getTextValue( n );
+ break;
+ case 'p':
+ if ( tagName == QString("page") ) {
+ page = getTextValue( n ).toInt();
+ } else if ( tagName == QString("page_size") ) {
+ pageSize = getTextValue( n ).toInt();
+ }
+ break;
+ case 'r':
+ if ( tagName == QString("rows") )
+ numRows = getTextValue( n ).toInt();
+ break;
+ case 's':
+ if ( tagName == QString("selection_mode") ) {
+ selectionMode = getTextValue( n );
+ } else if ( tagName == QString("shadow_type") ) {
+ shadowType = getTextValue( n );
+ } else if ( tagName == QString("show_text") ) {
+ showText = isTrue( getTextValue(n) );
+ } else if ( tagName == QString(QString("show_titles")) ) {
+ showTitles = isTrue( getTextValue(n) );
+ } else if ( tagName == QString("step") ) {
+ step = getTextValue( n ).toInt();
+ } else if ( tagName == QString("stock_button") ) {
+ /*
+ Let's cheat: We convert the symbolic name into a
+ button label.
+ */
+ label = getTextValue( n );
+ int k = label.findRev( QChar('_') );
+ if ( k != -1 )
+ label = label.mid( k + 1 );
+ if ( !label.isEmpty() && label != QString("OK") )
+ label = label.left( 1 ) + label.mid( 1 ).lower();
+ }
+ break;
+ case 't':
+ if ( tagName == QString("tab_pos") ) {
+ tabPos = getTextValue( n );
+ } else if ( tagName == QString("text") ) {
+ text = getTextValue( n );
+ } else if ( tagName == QString("textMaxLength") ) {
+ textMaxLength = getTextValue( n ).toInt();
+ } else if ( tagName == QString("textVisible") ) {
+ textVisible = isTrue( getTextValue(n) );
+ } else if ( tagName == QString("title") ) {
+ title = getTextValue( n );
+ } else if ( tagName == QString("tooltip") ) {
+ tooltip = getTextValue( n );
+ } else if ( tagName == QString("type") ) {
+ type = getTextValue( n );
+ }
+ break;
+ case 'u':
+ if ( tagName == QString("upper") )
+ upper = getTextValue( n ).toInt();
+ break;
+ case 'v':
+ if ( tagName == QString("value") ) {
+ value = getTextValue( n ).toInt();
+ } else if ( tagName == QString("value_in_list") ) {
+ valueInList = isTrue( getTextValue(n) );
+ } else if ( tagName == QString("vscrollbar_policy") ) {
+ vscrollbarPolicy = getTextValue( n );
+ }
+ break;
+ case 'w':
+ if ( tagName == QString("watermark_image") ) {
+ watermarkImage = getTextValue( n );
+ } else if ( tagName == QString("widget") )
+ childWidgets.push_back( n.toElement() );
+ else if ( tagName == QString("width") )
+ width = getTextValue( n ).toInt();
+ else if ( tagName == QString("wrap") )
+ wrap = isTrue( getTextValue(n) );
+ break;
+ case 'x':
+ if ( tagName == QString("x") )
+ x = getTextValue( n ).toInt();
+ break;
+ case 'y':
+ if ( tagName == QString("y") )
+ y = getTextValue( n ).toInt();
+ }
+ }
+ n = n.nextSibling();
+ }
+
+ if ( topLevel ) {
+ yyFormName = name;
+ emitSimpleValue( QString("class"), yyFormName );
+ }
+
+ if ( gtkLayoutWidget.exactMatch(gtkClass) ) {
+ QString boxKind;
+ QString orientation;
+
+ if ( gtkClass.startsWith(QString("GtkH")) ||
+ gtkClass == QString(QString("GtkToolbar")) ) {
+ /*
+ GtkToolbar, right. Toolbars may appear anywhere in a
+ widget, but then they really are just a row of buttons.
+ */
+ boxKind = QString( "hbox" );
+ orientation = QString( "Horizontal" );
+ } else if ( gtkClass.startsWith(QString("GtkV")) ||
+ gtkClass == QString("GtkPacker") ) {
+ /*
+ We don't support the GtkPacker, whose trails lead to
+ destruction.
+ */
+ boxKind = QString( "vbox" );
+ orientation = QString( "Vertical" );
+ } else {
+ boxKind = QString( "grid" );
+ }
+
+ if ( layouted )
+ emitOpeningWidget( QString("QLayoutWidget"), leftAttach,
+ rightAttach, topAttach, bottomAttach );
+ emitOpening( boxKind );
+ emitProperty( QString("name"), fixedName(name).latin1() );
+ if ( gtkClass == QString("GtkHButtonBox") ||
+ childName == QString("Dialog:action_area") )
+ emitSpacer( orientation );
+ emitChildWidgets( childWidgets, TRUE );
+
+ if ( gtkClass == QString("GtkVButtonBox") ||
+ childName == QString("Dialog:action_area") ||
+ (boxKind == QString("vbox") && shouldPullup(childWidgets)) ) {
+ emitSpacer( orientation );
+ } else if ( boxKind == QString("grid") && shouldPullup(childWidgets) ) {
+ emitSpacer( QString("Vertical"), 0, numColumns, numRows,
+ numRows + 1 );
+ }
+
+ emitClosing( boxKind );
+ if ( layouted )
+ emitClosing( QString("widget") );
+ } else if ( gtkClass == QString("GtkFixed") && !layouted ) {
+ emitChildWidgets( childWidgets, FALSE );
+ /*
+ Placeholders in a grid are typically needless.
+ */
+ } else if ( !(leftAttach >= 0 && gtkClass == QString("Placeholder")) ) {
+ bool needFakeLayout = ( !layouted && !topLevel && x == 0 && y == 0 &&
+ width == 0 && height == 0 );
+ QString qtClass = gtk2qtClass( gtkClass, childWidgets );
+ bool unknown = FALSE;
+
+ if ( qtClass == QString("QFrame") && !label.isEmpty() ) {
+ qtClass = QString( "QButtonGroup" );
+ } else if ( qtClass == QString("QListView") && !showTitles &&
+ gtkClass.endsWith(QString("List")) ) {
+ qtClass = QString( "QListBox" );
+ } else if ( qtClass == QString("Custom") ) {
+ qtClass = creationFunction;
+ yyCustomWidgets.insert( qtClass, QString::null );
+ } else if ( qtClass == QString("Unknown") ) {
+ qtClass = QString( "QLabel" );
+ unknown = TRUE;
+ }
+
+ if ( qtClass.isEmpty() ) {
+ emitChildWidgets( childWidgets, layouted, leftAttach, rightAttach,
+ topAttach, bottomAttach );
+ } else {
+ if ( needFakeLayout ) {
+ emitOpening( QString("vbox") );
+ emitProperty( QString("margin"), 11 );
+ }
+ emitOpeningWidget( qtClass, leftAttach, rightAttach, topAttach,
+ bottomAttach );
+
+ // grep 'elsewhere'
+ if ( gtkClass != QString("GtkCombo") )
+ emitProperty( QString("name"), fixedName(name).latin1() );
+ if ( !title.isEmpty() )
+ emitProperty( QString("caption"), title );
+ if ( !layouted && (x != 0 || y != 0 || width != 0 || height != 0) )
+ emitProperty( QString("geometry"), QRect(x, y, width, height) );
+ if ( gtkClass == QString("GtkToggleButton") ) {
+ emitProperty( QString("toggleButton"), QVariant(TRUE, 0) );
+ if ( active )
+ emitProperty( QString("on"), QVariant(TRUE, 0) );
+ } else {
+ if ( active )
+ emitProperty( QString("checked"), QVariant(TRUE, 0) );
+ }
+
+ if ( !editable )
+ emitProperty( QString("readOnly"), QVariant(TRUE, 0) );
+ if ( !focusTarget.isEmpty() )
+ emitProperty( QString("buddy"),
+ fixedName(focusTarget).latin1() );
+ if ( !hscrollbarPolicy.isEmpty() )
+ emitProperty( QString("hScrollBarMode"),
+ gtk2qtScrollBarMode(hscrollbarPolicy),
+ QString("enum") );
+ if ( !vscrollbarPolicy.isEmpty() )
+ emitProperty( QString("vScrollBarMode"),
+ gtk2qtScrollBarMode(vscrollbarPolicy),
+ QString("enum") );
+ if ( !justify.isEmpty() ||
+ (wrap && gtkClass != QString("GtkSpinButton")) ) {
+ QStringList flags;
+ if ( wrap )
+ flags.push_back( QString("WordBreak") );
+
+ if ( justify.endsWith(QString("_CENTER")) ) {
+ flags.push_back( QString("AlignCenter") );
+ } else {
+ if ( justify.endsWith(QString("_RIGHT")) )
+ flags.push_back( QString("AlignRight") );
+ flags.push_back( QString("AlignVCenter") );
+ }
+
+ if ( !flags.isEmpty() )
+ emitProperty( QString("alignment"), flags.join(QChar('|')),
+ QString("set") );
+ }
+ if ( !label.isEmpty() ) {
+ if ( gtkClass.endsWith(QString("Frame")) ) {
+ emitProperty( QString("title"), label );
+ } else {
+ emitProperty( QString("text"), accelerate(label) );
+ }
+ }
+ if ( lower != -123456789 )
+ emitProperty( QString("minValue"), lower );
+ if ( upper != 123456789 )
+ emitProperty( QString("maxValue"), upper );
+ if ( value != 123456789 ) {
+ if ( gtkClass == QString("GtkProgressBar") ) {
+ emitProperty( QString("progress"), value );
+ } else {
+ emitProperty( QString("value"), value );
+ }
+ }
+ if ( QMAX(page, pageSize) != 10 &&
+ gtkClass.endsWith(QString("Scrollbar")) )
+ emitProperty( QString("pageStep"), QMAX(page, pageSize) );
+ if ( !selectionMode.isEmpty() )
+ emitProperty( QString("selectionMode"),
+ gtk2qtSelectionMode(selectionMode),
+ QString("enum") );
+ if ( !shadowType.endsWith(QString("_NONE")) ) {
+ QString shape = shadowType.contains( QString("_ETCHED_") ) > 0 ?
+ QString( "Box" ) : QString( "WinPanel" );
+ QString shadow = shadowType.endsWith( QString("_IN") ) ?
+ QString( "Sunken" ) : QString( "Raised" );
+ emitProperty( QString("frameShape"), shape, QString("enum") );
+ emitProperty( QString("frameShadow"), shadow, QString("enum") );
+ }
+ if ( !showText )
+ emitProperty( QString("percentageVisible"),
+ QVariant(FALSE, 0) );
+ if ( step != 1 )
+ emitProperty( QString("lineStep"), step );
+ if ( tabPos.endsWith(QString("_BOTTOM")) ||
+ tabPos.endsWith(QString("_RIGHT")) )
+ emitProperty( QString("tabPosition"), QString("Bottom") );
+ if ( !text.isEmpty() )
+ emitProperty( QString("text"), text );
+ if ( textMaxLength != 0 )
+ emitProperty( QString("maxLength"), textMaxLength );
+ if ( !textVisible )
+ emitProperty( QString("echoMode"), QString("Password"),
+ QString("enum") );
+ if ( !tooltip.isEmpty() )
+ emitProperty( QString("toolTip"), tooltip );
+ if ( !valueInList )
+ emitProperty( QString("editable"), QVariant(TRUE, 0) );
+ if ( wrap && gtkClass == QString("GtkSpinButton") )
+ emitProperty( QString("wrapping"), QVariant(TRUE, 0) );
+
+ if ( gtkClass.endsWith(QString("Tree")) ) {
+ emitProperty( QString("rootIsDecorated"), QVariant(TRUE, 0) );
+ } else if ( gtkOrientedWidget.exactMatch(gtkClass) ) {
+ QString s = ( gtkOrientedWidget.cap(1) == QChar('H') ) ?
+ QString( "Horizontal" ) : QString( "Vertical" );
+ emitProperty( QString("orientation"), s, QString("enum") );
+ }
+
+ if ( qtClass == QString("QListView") )
+ emitProperty( QString("resizeMode"), QString("AllColumns"),
+ QString("enum") );
+
+ while ( !items.isEmpty() ) {
+ emitOpening( QString("item") );
+ emitProperty( QString("text"), items.first() );
+ emitClosing( QString("item") );
+ items.remove( items.begin() );
+ }
+ if ( initialChoice != 0 )
+ emitProperty( QString("currentItem"), initialChoice );
+
+ if ( !icon.isEmpty() )
+ emitProperty( QString("pixmap"), imageName(icon),
+ QString("pixmap") );
+
+ if ( gtkClass == QString("GnomeAbout") ) {
+ emitGnomeAbout( copyright, authors, comments );
+ } else if ( gtkClass == QString("GnomeApp") ) {
+ emitGnomeAppChildWidgetsPass1( childWidgets );
+ } else if ( gtkClass == QString("GnomePropertyBox") ) {
+ emitOpening( QString("vbox") );
+ emitChildWidgets( childWidgets, TRUE );
+ emitOpeningWidget( QString("QLayoutWidget") );
+ emitOpening( QString("hbox") );
+ emitPushButton( QString("&Help"), QString("helpButton") );
+ emitSpacer( QString("Horizontal") );
+ emitPushButton( QString("&OK"), QString("okButton") );
+ emitPushButton( QString("&Apply"), QString("applyButton") );
+ emitPushButton( QString("&Close"), QString("closeButton") );
+ emitClosing( QString("hbox") );
+ emitClosing( QString("widget") );
+ emitClosing( QString("vbox") );
+ } else if ( gtkClass.endsWith(QString("Button")) ) {
+ if ( label.isEmpty() )
+ emitGtkButtonChildWidgets( childWidgets );
+ } else if ( gtkClass == QString("GtkCombo") ) {
+ emitGtkComboChildWidgets( childWidgets, items );
+ } else if ( gtkClass == QString("GtkNotebook") ) {
+ emitGtkNotebookChildWidgets( childWidgets );
+ } else if ( gtkClass == QString("GtkWindow") ) {
+ emitGtkWindowChildWidgets( childWidgets, qtClass );
+ } else if ( gtkClass == QString("GtkScrolledWindow") ) {
+ emitGtkScrolledWindowChildWidgets( childWidgets, qtClass );
+ } else if ( qtClass == QString("QListView") ) {
+ emitQListViewColumns( widget );
+ } else if ( unknown || gtkClass == QString("Placeholder") ) {
+ QString prefix;
+ if ( unknown )
+ prefix = gtkClass;
+ emitProperty( QString("text"),
+ QString("<font color=\"red\">%1<b>?</b></font>")
+ .arg(prefix) );
+ emitProperty( QString("alignment"),
+ QString("AlignAuto|AlignCenter"),
+ QString("set") );
+ } else if ( qtClass != QString("QListBox") ) {
+ emitChildWidgets( childWidgets, FALSE );
+ }
+
+ emitClosing( QString("widget") );
+ if ( needFakeLayout )
+ emitClosing( QString("vbox") );
+ if ( gtkClass == QString("GnomeApp") )
+ emitGnomeAppChildWidgetsPass2( childWidgets );
+ }
+ }
+ return name;
+}
+
+QStringList Glade2Ui::convertGladeFile( const QString& fileName )
+{
+ QStringList outFileNames;
+
+ yyFileName = fileName;
+
+ QDomDocument doc( QString("GTK-Interface") );
+ QFile f( fileName );
+ if ( !f.open(IO_ReadOnly) ) {
+ error( QString("Cannot open file for reading.") );
+ return QStringList();
+ }
+ if ( !doc.setContent(&f) ) {
+ error( QString("File is not an XML file.") );
+ f.close();
+ return QStringList();
+ }
+ f.close();
+
+ QDomElement root = doc.documentElement();
+ if ( root.tagName() != QString("GTK-Interface") ) {
+ error( QString("File is not a Glade XML file.") );
+ return QStringList();
+ }
+
+ int widgetNo = 0;
+ int numWidgets = 0;
+ QDomNode n = root.firstChild();
+ while ( !n.isNull() ) {
+ if ( n.toElement().tagName() == QString("widget") )
+ numWidgets++;
+ n = n.nextSibling();
+ }
+
+ QProgressDialog fremskritt( QString("Converting Glade files..."),
+ QString("Abort Conversion"), numWidgets, 0,
+ "fremskritt", TRUE );
+
+ n = root.firstChild();
+ while ( !n.isNull() ) {
+ QString tagName = n.toElement().tagName();
+
+ if ( tagName == QString("project") ) {
+ QDomNode child = n.firstChild();
+ while ( !child.isNull() ) {
+ QString childTagName = child.toElement().tagName();
+ if ( childTagName == QString("pixmaps_directory") ) {
+ yyPixmapDirectory = getTextValue( child );
+ } else if ( childTagName == QString("program_name") ) {
+ yyProgramName = getTextValue( child );
+ }
+ child = child.nextSibling();
+ }
+ } else if ( tagName == QString("widget") ) {
+ yyOut = QString::null;
+ yyCustomWidgets.clear();
+ yyStockItemActions.clear();
+ yyActions.clear();
+ yyConnections.clear();
+ yySlots.clear();
+ yyFormName = QString::null;
+ yyImages.clear();
+
+ uniqueAction = 1;
+ uniqueForm = 1;
+ uniqueMenuBar = 1;
+ uniqueSpacer = 1;
+ uniqueToolBar = 1;
+
+ emitHeader();
+ QString name = emitWidget( n.toElement(), FALSE );
+
+ if ( !yyCustomWidgets.isEmpty() ) {
+ emitOpening( QString("customwidgets") );
+
+ QMap<QString, QString>::Iterator c = yyCustomWidgets.begin();
+ while ( c != yyCustomWidgets.end() ) {
+ emitOpening( QString("customwidget") );
+ emitSimpleValue( QString("class"), c.key() );
+ if ( !(*c).isEmpty() )
+ emitSimpleValue( QString("header"), *c,
+ attribute(QString("location"),
+ QString("local")) );
+ emitClosing( QString("customwidget") );
+ ++c;
+ }
+ emitClosing( QString("customwidgets") );
+ }
+
+ if ( !yyActions.isEmpty() ) {
+ emitOpening( QString("actions") );
+
+ QMap<QString, GladeAction>::Iterator a = yyActions.begin();
+ while ( a != yyActions.end() ) {
+ emitOpening( QString("action") );
+ emitProperty( QString("name"),
+ fixedName(a.key()).latin1() );
+ emitProperty( QString("text"), (*a).text );
+ emitProperty( QString("menuText"), (*a).menuText );
+ if ( (*a).toolTip )
+ emitProperty( QString("toolTip"), (*a).toolTip );
+ if ( (*a).accel != 0 )
+ emitProperty( QString("accel"), (*a).accel );
+ if ( !(*a).iconSet.isEmpty() )
+ emitProperty( QString("iconSet"),
+ imageName((*a).iconSet),
+ QString("iconset") );
+ emitClosing( QString("action") );
+ ++a;
+ }
+ emitClosing( QString("actions") );
+ }
+
+ if ( !yyImages.isEmpty() ) {
+ uint maxLength = 524288;
+ char *data = new char[maxLength];
+
+ QString dir = yyFileName;
+ dir.truncate( dir.findRev(QChar('/')) + 1 );
+ dir += yyPixmapDirectory;
+
+ emitOpening( QString("images") );
+
+ QMap<QString, QString>::ConstIterator im = yyImages.begin();
+ while ( im != yyImages.end() ) {
+ uint length = 0;
+ const char *format = 0;
+
+ QString fn = dir + QChar( '/' ) + im.key();
+ QFile f( fn );
+ if ( !f.open(IO_ReadOnly) ) {
+ error( QString("Cannot open image '%1' for reading.")
+ .arg(fn) );
+ } else {
+ length = f.readBlock( data, maxLength );
+ f.at( 0 );
+ format = QImageIO::imageFormat( &f );
+ f.close();
+ }
+ if ( format == 0 )
+ format = "XPM";
+
+ AttributeMap attr;
+ attr.insert( QString("format"), QString(format) );
+ attr.insert( QString("length"), QString::number(length) );
+
+ emitOpening( QString("image"),
+ attribute(QString("name"), *im) );
+ emitSimpleValue( QString("data"), hexed(data, length),
+ attr );
+ emitClosing( QString("image") );
+ ++im;
+ }
+ emitClosing( QString("images") );
+ delete[] data;
+ }
+
+ if ( yyConnections.count() + yySlots.count() > 0 ) {
+ emitOpening( QString("connections") );
+
+ QValueList<GladeConnection>::Iterator c = yyConnections.begin();
+ while ( c != yyConnections.end() ) {
+ emitOpening( QString("connection") );
+ emitSimpleValue( QString("sender"), (*c).sender );
+ emitSimpleValue( QString("signal"), (*c).signal );
+ emitSimpleValue( QString("receiver"), yyFormName );
+ emitSimpleValue( QString("slot"), (*c).slot );
+ emitClosing( QString("connection") );
+ ++c;
+ }
+
+ QMap<QString, QString>::Iterator s = yySlots.begin();
+ while ( s != yySlots.end() ) {
+ AttributeMap attr;
+ attr.insert( QString("access"), *s );
+ attr.insert( QString("language"), QString("C++") );
+ attr.insert( QString("returntype"), QString("void") );
+ emitSimpleValue( QString("slot"), s.key(), attr );
+ ++s;
+ }
+ emitClosing( QString("connections") );
+ }
+ emitFooter();
+
+ QString outFileName = fileName;
+ int k = outFileName.findRev( "." );
+ if ( k != -1 )
+ outFileName.truncate( k );
+ if ( widgetNo != 0 )
+ outFileName += QString::number( widgetNo + 1 );
+ outFileName += QString( ".ui" );
+ FILE *out = fopen( outFileName.latin1(), "w" );
+ if ( out == 0 ) {
+ qWarning( "glade2ui: Could not open file '%s'",
+ outFileName.latin1() );
+ } else {
+ if ( !yyOut.isEmpty() )
+ fprintf( out, "%s", yyOut.latin1() );
+ fclose( out );
+ outFileNames.push_back( outFileName );
+ }
+ yyOut = QString::null;
+ widgetNo++;
+
+ qApp->processEvents();
+ if ( fremskritt.wasCancelled() )
+ break;
+ fremskritt.setProgress( widgetNo );
+ }
+ n = n.nextSibling();
+ }
+ return outFileNames;
+}
diff --git a/tools/designer/plugins/glade/glade2ui.h b/tools/designer/plugins/glade/glade2ui.h
new file mode 100644
index 0000000..e688428
--- /dev/null
+++ b/tools/designer/plugins/glade/glade2ui.h
@@ -0,0 +1,169 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef GLADE2UI_H
+#define GLADE2UI_H
+
+#include <qdom.h>
+#include <qmap.h>
+#include <qstring.h>
+#include <qvariant.h>
+
+typedef QMap<QString, QString> AttributeMap;
+
+struct GladeAction
+{
+ QString text;
+ QString menuText;
+ QString toolTip;
+ int accel;
+ QString iconSet;
+};
+
+struct GladeConnection
+{
+ QString sender;
+ QString signal;
+ QString slot;
+};
+
+class Glade2Ui
+{
+public:
+ Glade2Ui();
+
+ QStringList convertGladeFile( const QString& fileName );
+
+private:
+ QString imageName( const QString& fileName );
+ QString opening( const QString& tag,
+ const AttributeMap& attr = AttributeMap() );
+ QString closing( const QString& tag );
+ QString atom( const QString& tag,
+ const AttributeMap& attr = AttributeMap() );
+ void error( const QString& message );
+ void syntaxError();
+ QString getTextValue( const QDomNode& node );
+ void emitHeader();
+ void emitFooter();
+ void emitSimpleValue( const QString& tag, const QString& value,
+ const AttributeMap& attr = AttributeMap() );
+ void emitOpening( const QString& tag,
+ const AttributeMap& attr = AttributeMap() );
+ void emitClosing( const QString& tag );
+ void emitAtom( const QString& tag,
+ const AttributeMap& attr = AttributeMap() );
+ void emitVariant( const QVariant& val,
+ const QString& stringType = "string" );
+ void emitProperty( const QString& prop, const QVariant& val,
+ const QString& stringType = "string" );
+ void emitFontProperty( const QString& prop, int pointSize, bool bold );
+ void emitAttribute( const QString& prop, const QVariant& val,
+ const QString& stringType = "string" );
+ QString gtk2qtClass( const QString& gtkClass,
+ const QValueList<QDomElement>& childWidgets );
+
+ int matchAccelOnActivate( const QDomElement& accel );
+ void emitGtkMenu( const QDomElement& menu );
+ void emitGtkMenuBarChildWidgets(
+ const QValueList<QDomElement>& childWidgets );
+ void emitGtkToolbarChildWidgets(
+ const QValueList<QDomElement>& childWidgets );
+ void emitPushButton( const QString& text, const QString& name );
+ void attach( AttributeMap *attr, int leftAttach, int rightAttach,
+ int topAttach, int bottomAttach );
+ void emitSpacer( const QString& orientation, int leftAttach = -1,
+ int rightAttach = -1, int topAttach = -1,
+ int bottomAttach = -1 );
+ void emitPixmap( const QString& imageName, int leftAttach = -1,
+ int rightAttach = -1, int topAttach = -1,
+ int bottomAttach = -1 );
+ void emitGnomeAbout( QString copyright, QString authors, QString comments );
+ void emitGnomeAppChildWidgetsPass1(
+ const QValueList<QDomElement>& childWidgets );
+ void doPass2( const QValueList<QDomElement>& childWidgets,
+ QValueList<QDomElement> *menuBar,
+ QValueList<QValueList<QDomElement> > *toolBars );
+ void emitGnomeAppChildWidgetsPass2(
+ const QValueList<QDomElement>& childWidgets );
+ void emitGtkButtonChildWidgets( QValueList<QDomElement> childWidgets );
+ void emitGtkComboChildWidgets( const QValueList<QDomElement>& childWidgets,
+ const QStringList& items );
+ void emitGtkNotebookChildWidgets(
+ const QValueList<QDomElement>& childWidgets );
+ void emitQListViewColumns( const QDomElement& qlistview );
+ void emitGtkScrolledWindowChildWidgets(
+ const QValueList<QDomElement>& childWidgets,
+ const QString& qtClass );
+ void emitGnomeDruidPage( const QDomElement& druidPage );
+ void emitGtkWindowChildWidgets( const QValueList<QDomElement>& childWidgets,
+ const QString& qtClass );
+ bool packEnd( const QDomElement& widget );
+ void emitChildWidgets( const QValueList<QDomElement>& childWidgets,
+ bool layouted, int leftAttach = -1,
+ int rightAttach = -1, int topAttach = -1,
+ int bottomAttach = -1 );
+ void emitOpeningWidget( const QString& qtClass, int leftAttach = -1,
+ int rightAttach = -1, int topAttach = -1,
+ int bottomAttach = -1 );
+ bool shouldPullup( const QValueList<QDomElement>& childWidgets );
+ QString emitWidget( const QDomElement& widget, bool layouted,
+ int leftAttach = -1, int rightAttach = -1,
+ int topAttach = -1, int bottomAttach = -1 );
+
+ QString yyOut;
+ QString yyIndentStr;
+ QString yyFileName;
+ QString yyProgramName;
+ QString yyPixmapDirectory;
+ QMap<QString, QString> yyClassNameMap;
+ QMap<QString, QString> yyStockMap;
+ QMap<QString, int> yyKeyMap;
+ QMap<QString, QString> yyCustomWidgets;
+ QMap<QString, QString> yyStockItemActions;
+ QMap<QString, GladeAction> yyActions;
+ QValueList<GladeConnection> yyConnections;
+ QMap<QString, QString> yySlots;
+ QString yyFormName;
+ QMap<QString, QString> yyImages;
+
+ int numErrors;
+ int uniqueAction;
+ int uniqueForm;
+ int uniqueMenuBar;
+ int uniqueSpacer;
+ int uniqueToolBar;
+};
+
+#endif
diff --git a/tools/designer/plugins/glade/main.cpp b/tools/designer/plugins/glade/main.cpp
new file mode 100644
index 0000000..7ed71bb
--- /dev/null
+++ b/tools/designer/plugins/glade/main.cpp
@@ -0,0 +1,109 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <filterinterface.h>
+#include <qapplication.h>
+
+#include "glade2ui.h"
+
+class GladeFilter : public ImportFilterInterface, public QLibraryInterface
+{
+public:
+ GladeFilter();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface **iface );
+ Q_REFCOUNT;
+
+ QStringList featureList() const;
+ QStringList import( const QString& filter, const QString& filename );
+
+ bool init();
+ void cleanup();
+ bool canUnload() const;
+
+};
+
+GladeFilter::GladeFilter()
+{
+}
+
+QRESULT GladeFilter::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)(ImportFilterInterface*)this;
+ else if ( uuid == IID_QFeatureList )
+ *iface = (QFeatureListInterface*)this;
+ else if ( uuid == IID_ImportFilter )
+ *iface = (ImportFilterInterface*)this;
+ else if ( uuid == IID_QLibrary )
+ *iface = (QLibraryInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+QStringList GladeFilter::featureList() const
+{
+ QStringList list;
+ list << "Glade Files (*.glade)" ;
+ return list;
+}
+
+QStringList GladeFilter::import( const QString &, const QString& filename )
+{
+ Glade2Ui g;
+ return g.convertGladeFile( filename );
+}
+
+bool GladeFilter::init()
+{
+ return TRUE;
+}
+
+void GladeFilter::cleanup()
+{
+}
+
+bool GladeFilter::canUnload() const
+{
+ return TRUE;
+}
+
+Q_EXPORT_COMPONENT()
+{
+ Q_CREATE_INSTANCE( GladeFilter )
+}
diff --git a/tools/designer/plugins/kdevdlg/kdevdlg.pro b/tools/designer/plugins/kdevdlg/kdevdlg.pro
new file mode 100644
index 0000000..d90d646
--- /dev/null
+++ b/tools/designer/plugins/kdevdlg/kdevdlg.pro
@@ -0,0 +1,11 @@
+TEMPLATE = lib
+CONFIG += qt warn_on release plugin
+HEADERS = kdevdlg2ui.h
+SOURCES = main.cpp kdevdlg2ui.cpp
+DESTDIR = ../../../../plugins/designer
+TARGET = kdevdlgplugin
+INCLUDEPATH += ../../interfaces
+
+
+target.path += $$plugins.path/designer
+INSTALLS += target
diff --git a/tools/designer/plugins/kdevdlg/kdevdlg2ui.cpp b/tools/designer/plugins/kdevdlg/kdevdlg2ui.cpp
new file mode 100644
index 0000000..bce7fb2
--- /dev/null
+++ b/tools/designer/plugins/kdevdlg/kdevdlg2ui.cpp
@@ -0,0 +1,524 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "kdevdlg2ui.h"
+#include <qdir.h>
+#include <qstring.h>
+#include <qptrstack.h>
+
+/// some little helpers ///
+
+void KDEVDLG2UI::wi()
+{
+ for ( int i = 0; i < indentation; i++ )
+ *out << " ";
+}
+
+void KDEVDLG2UI::indent()
+{
+ indentation++;
+}
+
+void KDEVDLG2UI::undent()
+{
+ indentation--;
+}
+
+void KDEVDLG2UI::writeClass( const QString& name )
+{
+ wi(); *out << "<class>" << name << "</class>" << endl;
+}
+
+void KDEVDLG2UI::writeWidgetStart( const QString& qclass )
+{
+ wi(); *out << "<widget class=\"" << qclass << "\">" << endl;
+}
+
+void KDEVDLG2UI::writeWidgetEnd()
+{
+ wi(); *out << "</widget>" << endl;
+}
+
+void KDEVDLG2UI::writeCString( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<cstring>" << value << "</cstring>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void KDEVDLG2UI::writeString( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<string>" << value << "</string>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void KDEVDLG2UI::writeRect( const QString& name, int x, int y, int w, int h )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<rect>" << endl; indent();
+ wi(); *out << "<x>" << x << "</x>" << endl;
+ wi(); *out << "<y>" << y << "</y>" << endl;
+ wi(); *out << "<width>" << w << "</width>" << endl;
+ wi(); *out << "<height>" << h << "</height>" << endl; undent();
+ wi(); *out << "</rect>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void KDEVDLG2UI::writeFont( const QString& family, int pointsize )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>font</name>" << endl;
+ wi(); *out << "<font>" << endl; indent();
+ wi(); *out << "<family>" << family << "</family>" << endl;
+ wi(); *out << "<pointsize>" << pointsize << "</pointsize>" << endl; undent();
+ wi(); *out << "</font>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void KDEVDLG2UI::writeBool( const QString& name, bool value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<bool>" << (value ? "true" : "false") << "</bool>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void KDEVDLG2UI::writeNumber( const QString& name, int value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<number>" << value << "</number>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void KDEVDLG2UI::writeEnum( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<enum>" << value << "</enum>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void KDEVDLG2UI::writeSet( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<set>" << value << "</set>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void KDEVDLG2UI::writeItem( const QString& name, const QString& value )
+{
+ wi(); *out << "<item>" << endl; indent();
+ writeString( name, value ); undent();
+ wi(); *out << "</item>" << endl;
+}
+
+void KDEVDLG2UI::writeColumn( const QString& name, const QString& value )
+{
+ wi(); *out << "<column>" << endl; indent();
+ writeString( name, value ); undent();
+ wi(); *out << "</column>" << endl;
+}
+
+void KDEVDLG2UI::writeColor( const QString& name, const QString& value )
+{
+ int color = value.toInt();
+
+ int r = color & 0x00ff0000 >> 16;
+ int g = color & 0x0000ff00 >> 8;
+ int b = color & 0x000000ff;
+
+ wi(); *out << "<property>" << endl; indent(); //###FIX
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<color>" << endl; indent();
+ wi(); *out << "<red>" << r << "</red>" << endl;
+ wi(); *out << "<green>" << g << "</green>" << endl;
+ wi(); *out << "<blue>" << b << "</blue>" << endl; undent();
+ wi(); *out << "</color>" << endl;
+ wi(); *out << "</property>" << endl;
+}
+
+void KDEVDLG2UI::writeStyles( const QStringList styles, bool isFrame )
+{
+ if ( isFrame ) {
+ bool defineFrame = FALSE;
+ QString shadow = "NoFrame";
+ QString shape = "StyledPanel";
+ int width = 2;
+ if ( styles.contains( "WS_EX_STATICEDGE" ) ) {
+ shadow = "Plain";
+ width = 1;
+ defineFrame = TRUE;
+ }
+ if ( styles.contains( "WS_EX_CLIENTEDGE" ) ) {
+ shadow = "Sunken";
+ defineFrame = TRUE;
+ }
+ if ( styles.contains( "WS_EX_DLGMODALFRAME" ) ) {
+ shadow = "Raised";
+ defineFrame = TRUE;
+ }
+ if ( !styles.contains( "WS_BORDER" ) ) {
+ shape = "NoFrame";
+ defineFrame = TRUE;
+ }
+
+ if ( defineFrame ) {
+ writeEnum( "frameShape", "StyledPanel" );
+ writeEnum( "frameShadow", shadow );
+ writeNumber( "lineWidth", width );
+ }
+ }
+
+ if ( styles.contains("WS_DISABLED") )
+ writeBool("enabled", FALSE );
+ if ( styles.contains("WS_EX_ACCEPTFILES") )
+ writeBool("acceptDrops", TRUE );
+ if ( styles.contains("WS_EX_TRANSPARENT") )
+ writeBool("autoMask", TRUE );
+ if ( !styles.contains("WS_TABSTOP") )
+ writeEnum("focusPolicy", "NoFocus");
+}
+
+/*!
+ Constructs a KDEVDLG2UI object
+*/
+
+KDEVDLG2UI::KDEVDLG2UI( QTextStream* input, const QString& name )
+{
+ className = name;
+ writeToFile = TRUE;
+ in = input;
+ indentation = 0;
+ out = 0;
+}
+
+/*!
+ Destructs the KDEVDLG2UI object
+*/
+
+KDEVDLG2UI::~KDEVDLG2UI()
+{
+}
+
+/*!
+ Parses the input stream and writes the output to files.
+*/
+
+bool KDEVDLG2UI::parse()
+{
+ QFile fileOut;
+ QString buffer;
+
+ if ( writeToFile ) {
+
+ QString outputFile = QString( className ) + ".ui";
+ fileOut.setName( outputFile );
+ if (!fileOut.open( IO_WriteOnly ) )
+ qFatal( "kdevdlg2ui: Could not open output file '%s'", outputFile.latin1() );
+ out = new QTextStream( &fileOut );
+ targetFiles.append( outputFile );
+ } else {
+ out = new QTextStream( &buffer, IO_WriteOnly );
+ }
+
+ writeDialog( className );
+
+ delete out;
+ out = 0;
+
+ return TRUE;
+}
+
+/*!
+ Parses the input stream and writes the output in \a get.
+*/
+bool KDEVDLG2UI::parse( QStringList& get )
+{
+ writeToFile = FALSE;
+ bool result = parse();
+ get = target;
+ return result;
+}
+
+/*!
+ Replaces characters like '&', '<' and '>' with the proper encoding.
+*/
+void KDEVDLG2UI::cleanString( QString * text )
+{
+ if ( !text ) return;
+ text->replace( "\\n", "\n" );
+ text->replace( "\\t", "\t" );
+ text->replace( "&", "&amp;" );
+ text->replace( "<", "&lt;" );
+ text->replace( ">", "&gt;" );
+}
+
+/*!
+ Builds a number of UI dialog out of the current input stream
+*/
+bool KDEVDLG2UI::writeDialog( const QString& name )
+{
+ *out << "<!DOCTYPE UI><UI>" << endl;
+ writeClass( name );
+
+ while ( !in->eof() ) {
+
+ line = in->readLine().simplifyWhiteSpace();
+
+ if ( line.left( 4 ) == "data" ) {
+ // ignore data section
+ while ( line.left( 1 ) != "}" && !in->eof() ) {
+ line = in->readLine();
+ }
+ } else if ( line.left( 4 ) == "item" ) {
+ writeWidgetStart( line.section( "//", 0, 0 ).section( " ", 1, 1 ) );
+ } else if ( line.left( 1 ) == "{" ) {
+ indent();
+ } else if ( line.left( 1 ) == "}" ) {
+ undent();
+ writeWidgetEnd();
+ } else if ( line.left( 4 ) == "Name" ) {
+ QString name = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ writeString( "name", name );
+ } else if ( line.left( 4 ) == "Font" ) {
+ QString font = line.section( "//", 0, 0 ).section( "\"", 1 );
+ QString family = font.section("\"", 1, 1 );
+ int pointSize = font.section("\"", 3, 3 ).toInt();
+ //int weight = font.section("\"", 5, 5 ).toInt();
+ //bool italic = ( font.section("\"", 7, 7 ) == "TRUE" );
+ writeFont( family, pointSize ); // weight, italic ?
+ } else if ( line.left( 9 ) == "IsEnabled" ) {
+ bool isEnabled =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "enabled", isEnabled );
+ } else if ( line.left( 12 ) == "AcceptsDrops" ) {
+ bool acceptDrops =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "acceptDrops", acceptDrops );
+ } else if ( line.left( 12 ) == "isAutoResize" ) {
+ bool isAutoResize =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "autoResize", isAutoResize ); //###FIX: obsolete
+ } else if ( line.left( 12 ) == "isAutoRepeat" ) {
+ bool isAutoRepeat =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "autoRepeat", isAutoRepeat );
+ } else if ( line.left( 9 ) == "isDefault" ) {
+ bool isDefault =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "default", isDefault );
+ } else if ( line.left( 13 ) == "isAutoDefault" ) {
+ bool isAutoDefault =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "autoDefault", isAutoDefault );
+ } else if ( line.left( 14 ) == "isToggleButton" ) {
+ bool isToggleButton =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "toggleButton", isToggleButton );
+ } else if ( line.left( 11 ) == "isToggledOn" ) {
+ bool isToggledOn =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "on", isToggledOn );
+ } else if ( line.left( 8 ) == "hasFrame" ) {
+ bool hasFrame =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "frame", hasFrame );
+ } else if ( line.left( 10 ) == "isReadOnly" ) {
+ bool isReadOnly =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "readOnly", isReadOnly );
+ } else if ( line.left( 9 ) == "isChecked" ) {
+ bool isChecked =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "checked", isChecked );
+ } else if ( line.left( 16 ) == "isAutoCompletion" ) {
+ bool isAutoCompl =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "autoCompletion", isAutoCompl );
+ } else if ( line.left( 8 ) == "EditText" ) {
+ bool editText =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "editable", editText );
+ } else if ( line.left( 10 ) == "isTracking" ) {
+ bool isTracking =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "tracking", isTracking );
+ } else if ( line.left( 16 ) == "isMultiSelection" ) {
+ bool isMultiSel =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "multiSelection", isMultiSel );
+ } else if ( line.left( 21 ) == "isAllColumnsShowFocus" ) {
+ bool isAllColsShowFocus =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "allColumnsShowFocus", isAllColsShowFocus );
+ } else if ( line.left( 16 ) == "isRootDecorated" ) {
+ bool isRootDec =
+ ( line.section( "//", 0, 0 ).section("\"", 1, 1 ) == "true" );
+ writeBool( "rootIsDecorated", isRootDec );
+ } else if ( line.left( 1 ) == "X" ) {
+ int x = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ line = in->readLine().stripWhiteSpace();
+ int y = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ line = in->readLine().stripWhiteSpace();
+ int w = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ line = in->readLine().stripWhiteSpace();
+ int h = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeRect( "geometry", x, y, w, h );
+ } else if ( line.left( 8 ) == "MinWidth" ) {
+ int minw = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "minimumWidth", minw );
+ } else if ( line.left( 9 ) == "MinHeight" ) {
+ int minh = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "minimumHeight", minh );
+ } else if ( line.left( 8 ) == "MaxWidth" ) {
+ int maxw = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "maximumWidth", maxw );
+ } else if ( line.left( 9 ) == "MaxHeight" ) {
+ int maxh = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "maximumHeight", maxh );
+ } else if ( line.left( 4 ) == "Text" ) {
+ QString text = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & text );
+ writeString( "text", text );
+ } else if ( line.left( 5 ) == "Title" ) {
+ QString title = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & title );
+ writeString( "title", title );
+ } else if ( line.left( 5 ) == "Buddy" ) {
+ QString buddy = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ writeString( "buddy", buddy );
+ } else if ( line.left( 14 ) == "SpecialValText" ) {
+ QString text = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ writeString( "specialValueText", text );
+ } else if ( line.left( 6 ) == "Prefix" ) {
+ QString text = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ writeString( "prefix", text );
+ } else if ( line.left( 6 ) == "Suffix" ) {
+ QString text = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ writeString( "suffix", text );
+ } else if ( line.left( 5 ) == "Value" ) {
+ int v = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "value", v );
+ } else if ( line.left( 8 ) == "MinValue" ) {
+ int minv = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "minValue", minv );
+ } else if ( line.left( 8 ) == "MaxValue" ) {
+ int maxv = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "maxValue", maxv );
+ } else if ( line.left( 9 ) == "SizeLimit" ) {
+ int limit = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "sizeLimit", limit );
+ } else if ( line.left( 9 ) == "MaxLength" ) {
+ int maxl = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "maxLength", maxl );
+ } else if ( line.left( 8 ) == "MaxCount" ) {
+ int maxc = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "maxCount", maxc );
+ } else if ( line.left( 14 ) == "CursorPosition" ) {
+ int pos = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "cursorPosition", pos );
+ } else if ( line.left( 9 ) == "NumDigits" ) {
+ int digits = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "numDigits", digits );
+ } else if ( line.left( 10 ) == "TotalSteps" ) {
+ int steps = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "totalSteps", steps );
+ } else if ( line.left( 12 ) == "TreeStepSize" ) {
+ int stepSize = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "treeStepSize", stepSize );
+ } else if ( line.left( 10 ) == "ItemMargin" ) {
+ int margin = line.section( "//", 0, 0 ).section("\"", 1, 1 ).toInt();
+ writeNumber( "itemMargin", margin );
+ } else if ( line.left( 7 ) == "ToolTip" ) {
+ QString text = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ writeString( "toolTip", text );
+ } else if ( line.left( 9 ) == "QuickHelp" ) {
+ QString text = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & text );
+ writeString( "whatsThis", text );
+ } else if ( line.left( 15 ) == "InsertionPolicy" ) {
+ QString policy = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & policy );
+ writeEnum( "insertionPolicy", policy ); //###FIX: QComboBox::
+ } else if ( line.left( 11 ) == "Orientation" ) {
+ QString orientation =
+ line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & orientation );
+ if ( orientation == "V" )
+ writeEnum( "orientation", "Qt::Vertical" );
+ else if ( orientation == "H" )
+ writeEnum( "orientation", "Qt::Horizontal" );
+ } else if ( line.left( 14 ) == "vScrollBarMode" ) {
+ QString mode = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & mode );
+ writeEnum( "vScrollBarMode", mode );
+ } else if ( line.left( 14 ) == "hScrollBarMode" ) {
+ QString mode = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & mode );
+ writeEnum( "hScrollBarMode", mode );
+ } else if ( line.left( 7 ) == "Entries" ) {
+ QString entries = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & entries );
+ QStringList l = QStringList::split( '\n', entries );
+ for ( QStringList::Iterator it = l.begin(); it != l.end(); ++it )
+ writeItem( "text", *it );
+ } else if ( line.left( 7 ) == "Columns" ) {
+ QString columns = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & columns );
+ QStringList l = QStringList::split( '\n', columns );
+ for ( QStringList::Iterator it = l.begin(); it != l.end(); ++it )
+ writeColumn( "text", *it );
+ } else if ( line.left( 6 ) == "BgMode" ) {
+ QString mode = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & mode );
+ writeString( "backgroundMode", mode ); //###FIX: QWidget:::
+ } else if ( line.left( 10 ) == "BgPalColor" ) {
+ QString color = line.section( "//", 0, 0 ).section("\"", 1, 1 );
+ cleanString( & color );
+ writeColor( "paletteBackgroundColor", color );
+ } //else {
+ //if ( line.length() )
+ //qDebug( "IGNORED: %s", line.latin1() );
+ //}
+ }
+ *out << "</UI>" << endl;
+ return TRUE;
+}
+
diff --git a/tools/designer/plugins/kdevdlg/kdevdlg2ui.h b/tools/designer/plugins/kdevdlg/kdevdlg2ui.h
new file mode 100644
index 0000000..448e850
--- /dev/null
+++ b/tools/designer/plugins/kdevdlg/kdevdlg2ui.h
@@ -0,0 +1,90 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef KDEVDLG2UI_H
+#define KDEVDLG2UI_H
+
+#include <qtextstream.h>
+#include <qfile.h>
+#include <qstringlist.h>
+
+class KDEVDLG2UI
+{
+public:
+ KDEVDLG2UI( QTextStream* input, const QString& name = "dialog" );
+ ~KDEVDLG2UI();
+
+ bool parse();
+ bool parse ( QStringList& get );
+
+ QStringList targetFiles;
+
+protected:
+
+ bool writeDialog( const QString& name );
+
+ QString className;
+ QString line;
+ QTextStream *in;
+ QStringList target;
+
+ void cleanString( QString* text );
+
+ void indent();
+ void undent();
+ void wi();
+
+ void writeClass( const QString& name );
+ void writeCString( const QString& name, const QString& value );
+ void writeString( const QString& name, const QString& value );
+ void writeRect( const QString& name, int x, int y, int w, int h );
+ void writeFont( const QString& family, int pointsize );
+ void writeBool( const QString& name, bool value );
+ void writeNumber( const QString& name, int value );
+ void writeEnum( const QString& name, const QString& value );
+ void writeSet( const QString& name, const QString& value );
+ void writeItem( const QString& name, const QString& value );
+ void writeColumn( const QString& name, const QString& value );
+ void writeColor( const QString& name, const QString& value );
+ void writeStyles( const QStringList styles, bool isFrame );
+ void writeWidgetStart( const QString& qclass );
+ void writeWidgetEnd();
+
+private:
+ int indentation;
+ bool writeToFile;
+ QTextStream* out;
+};
+
+#endif
diff --git a/tools/designer/plugins/kdevdlg/main.cpp b/tools/designer/plugins/kdevdlg/main.cpp
new file mode 100644
index 0000000..1247f3d
--- /dev/null
+++ b/tools/designer/plugins/kdevdlg/main.cpp
@@ -0,0 +1,120 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <filterinterface.h>
+
+#include <qapplication.h>
+#include <qstring.h>
+#include <qdir.h>
+
+#include "kdevdlg2ui.h"
+
+class KDevDlgFilter : public ImportFilterInterface, public QLibraryInterface
+{
+public:
+ KDevDlgFilter();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface **iface );
+ Q_REFCOUNT;
+
+ QStringList featureList() const;
+ QStringList import( const QString& filter, const QString& filename );
+
+ bool init();
+ void cleanup();
+ bool canUnload() const;
+};
+
+KDevDlgFilter::KDevDlgFilter()
+{
+}
+
+QRESULT KDevDlgFilter::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)(ImportFilterInterface*)this;
+ else if ( uuid == IID_QFeatureList )
+ *iface = (QFeatureListInterface*)this;
+ else if ( uuid == IID_ImportFilter )
+ *iface = (ImportFilterInterface*)this;
+ else if ( uuid == IID_QLibrary )
+ *iface = (QLibraryInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+QStringList KDevDlgFilter::featureList() const
+{
+ QStringList list;
+ list << "KDevelop Dialog Files (*.kdevdlg)" ;
+ return list;
+}
+
+QStringList KDevDlgFilter::import( const QString &, const QString& filename )
+{
+ QFile file( filename );
+ if ( !file.open( IO_ReadOnly ) )
+ qWarning( "uic: Could not open file '%s' ", filename.latin1() );
+ QTextStream in;
+ in.setDevice( &file );
+
+ QString name = filename.right( filename.length() - filename.findRev( QDir::separator() ) - 1 ).section( ".", 0, 0 );
+ KDEVDLG2UI c( &in, name );
+ QStringList files;
+ c.parse();
+ return c.targetFiles;
+}
+
+bool KDevDlgFilter::init()
+{
+ return TRUE;
+}
+
+void KDevDlgFilter::cleanup()
+{
+}
+
+bool KDevDlgFilter::canUnload() const
+{
+ return TRUE;
+}
+
+Q_EXPORT_COMPONENT()
+{
+ Q_CREATE_INSTANCE( KDevDlgFilter )
+}
diff --git a/tools/designer/plugins/plugins.pro b/tools/designer/plugins/plugins.pro
new file mode 100644
index 0000000..355f5d0
--- /dev/null
+++ b/tools/designer/plugins/plugins.pro
@@ -0,0 +1,9 @@
+TEMPLATE = subdirs
+PLUGIN_DIRS = wizards \
+ cppeditor \
+ dlg \
+ glade \
+ rc \
+ kdevdlg
+shared:SUBDIRS *= $$PLUGIN_DIRS
+dll:SUBDIRS *= $$PLUGIN_DIRS
diff --git a/tools/designer/plugins/rc/main.cpp b/tools/designer/plugins/rc/main.cpp
new file mode 100644
index 0000000..f2e9abb
--- /dev/null
+++ b/tools/designer/plugins/rc/main.cpp
@@ -0,0 +1,117 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <filterinterface.h>
+
+#include <qapplication.h>
+
+#include "rc2ui.h"
+
+class RCFilter : public ImportFilterInterface, public QLibraryInterface
+{
+public:
+ RCFilter();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface **iface );
+ Q_REFCOUNT;
+
+ QStringList featureList() const;
+ QStringList import( const QString& filter, const QString& filename );
+
+ bool init();
+ void cleanup();
+ bool canUnload() const;
+};
+
+RCFilter::RCFilter()
+{
+}
+
+QRESULT RCFilter::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)(ImportFilterInterface*)this;
+ else if ( uuid == IID_QFeatureList )
+ *iface = (QFeatureListInterface*)this;
+ else if ( uuid == IID_ImportFilter )
+ *iface = (ImportFilterInterface*)this;
+ else if ( uuid == IID_QLibrary )
+ *iface = (QLibraryInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+QStringList RCFilter::featureList() const
+{
+ QStringList list;
+ list << "Microsoft Resource Files (*.rc)" ;
+ return list;
+}
+
+QStringList RCFilter::import( const QString &, const QString& filename )
+{
+ QFile file( filename );
+ if ( !file.open( IO_ReadOnly ) )
+ qWarning( "uic: Could not open file '%s' ", filename.latin1() );
+ QTextStream in;
+ in.setDevice( &file );
+
+ RC2UI c( &in );
+ QStringList files;
+ c.parse();
+ return c.targetFiles;
+}
+
+bool RCFilter::init()
+{
+ return TRUE;
+}
+
+void RCFilter::cleanup()
+{
+}
+
+bool RCFilter::canUnload() const
+{
+ return TRUE;
+}
+
+Q_EXPORT_COMPONENT()
+{
+ Q_CREATE_INSTANCE( RCFilter )
+}
diff --git a/tools/designer/plugins/rc/rc.pro b/tools/designer/plugins/rc/rc.pro
new file mode 100644
index 0000000..27ad444
--- /dev/null
+++ b/tools/designer/plugins/rc/rc.pro
@@ -0,0 +1,11 @@
+TEMPLATE = lib
+CONFIG += qt warn_on release plugin
+HEADERS = rc2ui.h
+SOURCES = main.cpp rc2ui.cpp
+DESTDIR = ../../../../plugins/designer
+TARGET = rcplugin
+INCLUDEPATH += ../../interfaces
+
+
+target.path += $$plugins.path/designer
+INSTALLS += target
diff --git a/tools/designer/plugins/rc/rc2ui.cpp b/tools/designer/plugins/rc/rc2ui.cpp
new file mode 100644
index 0000000..b3e48dd
--- /dev/null
+++ b/tools/designer/plugins/rc/rc2ui.cpp
@@ -0,0 +1,888 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "rc2ui.h"
+#include <qdir.h>
+
+/// some little helpers ///
+
+void RC2UI::wi()
+{
+ for ( int i = 0; i < indentation; i++ )
+ *out << " ";
+}
+
+void RC2UI::indent()
+{
+ indentation++;
+}
+
+void RC2UI::undent()
+{
+ indentation--;
+}
+
+QString RC2UI::stripQM( const QString& string )
+{
+ return string.mid( 1, string.length()-2 );
+}
+
+QStringList RC2UI::splitStyles( const QString& styles, char sep )
+{
+ QString s = styles;
+ QString style;
+ QStringList l;
+ while ( s.find( sep ) > -1 ) {
+ style = s.left( s.find( sep ) );
+ l << style.stripWhiteSpace();
+ s = s.right( s.length() - style.length() -1 );
+ }
+ if ( !s.isEmpty() )
+ l << s.stripWhiteSpace();
+ return l;
+}
+
+QString RC2UI::parseNext( QString& arg, char sep )
+{
+ QString next = arg.left( arg.find(sep) );
+ arg = arg.right( arg.length() - next.length() - 1 );
+ return next;
+}
+
+void RC2UI::writeClass( const QString& name )
+{
+ wi(); *out << "<class>" << name << "</class>" << endl;
+}
+
+void RC2UI::writeCString( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<cstring>" << value << "</cstring>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeString( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<string>" << value << "</string>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeRect( const QString& name, int x, int y, int w, int h )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<rect>" << endl; indent();
+ wi(); *out << "<x>" << int(double(x)*1.5) << "</x>" << endl;
+ wi(); *out << "<y>" << int(double(y)*1.65) << "</y>" << endl;
+ wi(); *out << "<width>" << int(double(w)*1.5) << "</width>" << endl;
+ wi(); *out << "<height>" << int(double(h)*1.65) << "</height>" << endl; undent();
+ wi(); *out << "</rect>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeFont( const QString& family, int pointsize )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>font</name>" << endl;
+ wi(); *out << "<font>" << endl; indent();
+ wi(); *out << "<family>" << family << "</family>" << endl;
+ wi(); *out << "<pointsize>" << pointsize << "</pointsize>" << endl; undent();
+ wi(); *out << "</font>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeBool( const QString& name, bool value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<bool>" << (value ? "true" : "false") << "</bool>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeNumber( const QString& name, int value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<number>" << value << "</number>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeEnum( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<enum>" << value << "</enum>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeSet( const QString& name, const QString& value )
+{
+ wi(); *out << "<property>" << endl; indent();
+ wi(); *out << "<name>" << name << "</name>" << endl;
+ wi(); *out << "<set>" << value << "</set>" << endl; undent();
+ wi(); *out << "</property>" << endl;
+}
+
+void RC2UI::writeStyles( const QStringList styles, bool isFrame )
+{
+ if ( isFrame ) {
+ bool defineFrame = FALSE;
+ QString shadow = "NoFrame";
+ QString shape = "StyledPanel";
+ int width = 2;
+ if ( styles.contains( "WS_EX_STATICEDGE" ) ) {
+ shadow = "Plain";
+ width = 1;
+ defineFrame = TRUE;
+ }
+ if ( styles.contains( "WS_EX_CLIENTEDGE" ) ) {
+ shadow = "Sunken";
+ defineFrame = TRUE;
+ }
+ if ( styles.contains( "WS_EX_DLGMODALFRAME" ) ) {
+ shadow = "Raised";
+ defineFrame = TRUE;
+ }
+ if ( !styles.contains( "WS_BORDER" ) ) {
+ shape = "NoFrame";
+ defineFrame = TRUE;
+ }
+
+ if ( defineFrame ) {
+ writeEnum( "frameShape", "StyledPanel" );
+ writeEnum( "frameShadow", shadow );
+ writeNumber( "lineWidth", width );
+ }
+ }
+
+ if ( styles.contains("WS_DISABLED") )
+ writeBool("enabled", FALSE );
+ if ( styles.contains("WS_EX_ACCEPTFILES") )
+ writeBool("acceptDrops", TRUE );
+ if ( styles.contains("WS_EX_TRANSPARENT") )
+ writeBool("autoMask", TRUE );
+ if ( !styles.contains("WS_TABSTOP") )
+ writeEnum("focusPolicy", "NoFocus");
+}
+
+/*!
+ Constructs a RC2UI object
+*/
+
+RC2UI::RC2UI( QTextStream* input )
+: blockStart1( "/////////////////////////////////////////////////////////////////////////////" ),
+ blockStart2( "//" )
+{
+ writeToFile = TRUE;
+ in = input;
+ indentation = 0;
+ out = 0;
+}
+
+/*!
+ Destructs the RC2UI object
+*/
+
+RC2UI::~RC2UI()
+{
+}
+
+/*!
+ Parses the input stream and writes the output to files.
+*/
+
+bool RC2UI::parse()
+{
+ while ( !in->eof() ) {
+ while ( line != blockStart1 && !in->eof() )
+ line = in->readLine();
+ if ( in->eof() )
+ return FALSE;
+ while ( line != blockStart2 && !in->eof() )
+ line = in->readLine();
+ if ( in->eof() )
+ return FALSE;
+
+ line = in->readLine();
+
+ if ( line.left(3) == "// " && !in->eof() ) {
+ QString type = line.right( line.length() - 3 );
+ if ( in->readLine() == "//" && in->readLine().isEmpty() && !in->eof() ) {
+ if ( type == "Dialog" ) {
+ if ( !makeDialog() )
+ return FALSE;
+ }
+/*
+ else if ( type == "Bitmap" ) {
+ if ( !makeBitmap() )
+ return FALSE;
+ } else if ( type == "String Table" ) {
+ if ( !makeStringTable() )
+ return FALSE;
+ } else if ( type == "Accelerator" ) {
+ if ( !makeAccelerator() )
+ return FALSE;
+ } else if ( type == "Cursor" ) {
+ if ( !makeCursor() )
+ return FALSE;
+ } else if ( type == "HTML" ) {
+ if ( !makeHTML() )
+ return FALSE;
+ } else if ( type == "Icon" ) {
+ if ( !makeIcon() )
+ return FALSE;
+ } else if ( type == "Version" ) {
+ if ( !makeVersion() )
+ return FALSE;
+ }
+*/
+ }
+ } else
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/*!
+ Parses the input stream and writes the output in \a get.
+*/
+
+bool RC2UI::parse( QStringList& get )
+{
+ writeToFile = FALSE;
+ bool result = parse();
+ get = target;
+ return result;
+}
+
+/*!
+ Retrieves a unique name starting with \a start
+*/
+QString RC2UI::useName( const QString& start )
+{
+ QString name = start;
+ int id = 1;
+
+ while ( usedNames.contains( name ) ) {
+ name = start + QString( "%1" ).arg( id );
+ id++;
+ }
+
+ usedNames.append(name);
+
+ return name;
+}
+
+
+/*!
+ Builds a number of UI dialog out of the current input stream
+*/
+
+bool RC2UI::makeDialog()
+{
+ line = in->readLine();
+ do {
+ QFile fileOut;
+ QString buffer;
+ int count;
+ QCString className;
+ uint x, y, w, h;
+ uint endDesc;
+ bool space = FALSE;
+ for ( endDesc = 0; endDesc < line.length() ; endDesc++ ) {
+ char c = (QChar)line.at(endDesc);
+ if ( space && (c >= '0') && (c <= '9') )
+ break;
+ space = c==' ';
+ }
+
+ QString desc = line.left(endDesc-1);
+ line = line.right( line.length() - endDesc );
+
+ className = parseNext( desc, ' ' );
+
+ count = sscanf( line, "%u, %u, %u, %u", &x, &y, &w, &h );
+
+ if ( !count && count == EOF )
+ return FALSE;
+
+ char property[256];
+ QStringList styles;
+ QStringList extendedStyles;
+ QString caption = "";
+ QString baseClass = "";
+ QString widgetType;
+ QString widgetName;
+ QString arguments;
+ int pointsize = 10;
+ QString fontname;
+ do {
+ line = "";
+ do {
+ if ( in->eof() )
+ return TRUE;
+ line += in->readLine();
+ } while ( line[(int)line.length()-1] == '|' ||
+ line[(int)line.length()-1] == ',' );
+ count = sscanf( line, "%s", property );
+ line = line.right( line.length() - line.find(" ") -1 );
+ if ( QString(property) == "STYLE" ) {
+ styles = splitStyles(line);
+ if ( styles.contains( "WS_CAPTION" ) )
+ baseClass = "QDialog";
+ else
+ baseClass = "QWidget";
+ } else if ( QString(property) == "CAPTION" ) {
+ caption = stripQM( line );
+ } else if ( QString(property) == "FONT" ) {
+ QString pt = line.left( line.find(",") );
+ pointsize = pt.toInt();
+ fontname = stripQM(line.right( line.length() - line.find(",") - 2 ));
+ }
+ } while ( line != "BEGIN" );
+
+ if ( writeToFile ) {
+
+ QString outputFile = QString(className) + ".ui";
+ fileOut.setName( outputFile );
+ if (!fileOut.open( IO_WriteOnly ) )
+ qFatal( "rc2ui: Could not open output file '%s'", outputFile.latin1() );
+ out = new QTextStream( &fileOut );
+ targetFiles.append( outputFile );
+ } else {
+ out = new QTextStream( &buffer, IO_WriteOnly );
+ }
+
+ *out << "<!DOCTYPE UI><UI>" << endl;
+ writeClass( className );
+ wi(); *out << "<widget>"<< endl; indent();
+ writeClass( baseClass );
+ writeCString( "name", className );
+ writeRect( "geometry", x, y, w, h );
+ writeString( "caption", caption );
+ writeFont( fontname, pointsize );
+
+ do {
+ if ( in->eof() )
+ return TRUE;
+
+ line = in->readLine().stripWhiteSpace();
+ if ( line == "END" )
+ continue;
+
+ widgetType = parseNext(line, ' ');
+ arguments = line.stripWhiteSpace();
+ while ( arguments[(int)arguments.length()-1] == ',' ||
+ arguments[(int)arguments.length()-1] == '|' )
+ arguments += " "+in->readLine().stripWhiteSpace();
+
+ wi(); *out << "<widget>" << endl; indent();
+
+ WidgetType ID = IDUnknown;
+ QString controlType;
+ QString widgetID;
+ QString widgetText;
+ bool hasText = FALSE;
+ bool isControl = FALSE;
+ bool isFrame = FALSE;
+
+ if ( widgetType == "PUSHBUTTON" ) {
+ ID = IDPushButton;
+ hasText = TRUE;
+ } else if ( widgetType == "DEFPUSHBUTTON" ) {
+ ID = IDPushButton;
+ hasText = TRUE;
+ } else if ( widgetType == "LTEXT" ) {
+ ID = IDLabel;
+ hasText = TRUE;
+ } else if ( widgetType == "CTEXT" ) {
+ ID = IDLabel;
+ hasText = TRUE;
+ } else if ( widgetType == "RTEXT" ) {
+ ID = IDLabel;
+ hasText = TRUE;
+ } else if ( widgetType == "EDITTEXT" ) {
+ ID = IDLineEdit;
+ } else if ( widgetType == "GROUPBOX" ) {
+ ID = IDGroupBox;
+ hasText = TRUE;
+ } else if ( widgetType == "COMBOBOX" ) {
+ ID = IDComboBox;
+ } else if ( widgetType == "LISTBOX" ) {
+ ID = IDListBox;
+ } else if ( widgetType == "SCROLLBAR" ) {
+ ID = IDScrollBar;
+ } else if ( widgetType == "CHECKBOX" ) {
+ ID = IDCheckBox;
+ hasText = TRUE;
+ } else if ( widgetType == "RADIOBUTTON" ) {
+ ID = IDRadioButton;
+ hasText = TRUE;
+ } else if ( widgetType == "CONTROL" ) {
+ isControl = TRUE;
+ widgetText = stripQM(parseNext( arguments ));
+ widgetID = parseNext( arguments );
+ controlType = stripQM(parseNext( arguments ));
+ styles = splitStyles(parseNext( arguments ));
+
+ if ( controlType == "Static" ) {
+ ID = IDLabel;
+ } else if ( controlType == "Button" ) {
+ if ( styles.contains("BS_AUTOCHECKBOX") ||
+ styles.contains("BS_3STATE") )
+ ID = IDCheckBox;
+ else if ( styles.contains("BS_AUTORADIOBUTTON") )
+ ID = IDRadioButton;
+ } else if ( controlType == "msctls_updown32" ) {
+ ID = IDSpinBox;
+ } else if ( controlType == "msctls_progress32" ) {
+ ID = IDProgressBar;
+ } else if ( controlType == "msctls_trackbar32" ) {
+ ID = IDSlider;
+ } else if ( controlType == "SysListView32" ) {
+ ID = IDIconView;
+ } else if ( controlType == "SysTreeView32" ) {
+ ID = IDListView;
+ } else if ( controlType == "SysTabControl32" ) {
+ ID = IDTabWidget;
+ } else if ( controlType == "SysAnimate32" ) {
+ ID = IDLabel;
+ } else if ( controlType == "RICHEDIT" ) {
+ ID = IDMultiLineEdit;
+ } else if ( controlType == "ComboBoxEx32" ) {
+ ID = IDComboBox;
+ } else if ( controlType == "" ) {
+ ID = IDCustom;
+ } else {
+ ID = IDUnknown;
+ }
+ } else
+ ID = IDUnknown;
+
+ if ( hasText )
+ widgetText = stripQM(parseNext( arguments ));
+
+ if ( isControl ) {
+ x = parseNext( arguments ).toInt();
+ y = parseNext( arguments ).toInt();
+ w = parseNext( arguments ).toInt();
+ h = parseNext( arguments ).toInt();
+ } else {
+ widgetID = parseNext( arguments );
+ x = parseNext( arguments ).toInt();
+ y = parseNext( arguments ).toInt();
+ w = parseNext( arguments ).toInt();
+ h = parseNext( arguments ).toInt();
+ styles.clear();
+ }
+
+ do {
+ extendedStyles = splitStyles(parseNext( arguments ));
+ for ( uint i = 0; i < extendedStyles.count(); i++ )
+ styles << (*extendedStyles.at(i));
+ } while ( arguments.find(',') > -1 );
+
+ switch ( ID ) {
+ case IDWidget:
+ break;
+ case IDPushButton:
+ {
+ writeClass("QPushButton");
+ writeCString( "name", useName("PushButton_"+widgetID) );
+ writeRect( "geometry", x, y, w, h );
+ writeString( "text", widgetText );
+ if ( widgetType == "DEFPUSHBUTTON" )
+ writeBool( "default", TRUE );
+ }
+ break;
+ case IDLabel:
+ {
+ isFrame = TRUE,
+ writeClass("QLabel");
+ writeCString( "name", useName("Label_"+widgetID) );
+ writeRect( "geometry", x,y,w,h );
+ writeString( "text", widgetText );
+ QString align;
+ if ( !styles.contains("SS_CENTERIMAGE") )
+ align += "|AlignTop";
+ else
+ align += "|AlignVCenter";
+ if ( widgetType == "LTEXT" ) {
+ align += "|AlignLeft";
+ } else if ( widgetType == "CTEXT") {
+ align += "|AlignHCenter";
+ } else if ( widgetType == "RTEXT") {
+ align += "|AlignRight";
+ }
+ writeSet("alignment", align );
+ }
+ break;
+ case IDCheckBox:
+ {
+ writeClass("QCheckBox");
+ writeCString("name", useName("CheckBox_"+widgetID) );
+ writeRect("geometry", x,y,w,h);
+ writeString("text", widgetText );
+ if ( styles.contains( "BS_3STATE" ) )
+ writeBool( "tristate", TRUE );
+ }
+ break;
+ case IDRadioButton:
+ {
+ writeClass("QRadioButton");
+ writeCString("name", useName("RadioButton_"+widgetID) );
+ writeRect("geometry", x,y,w,h);
+ writeString("text", widgetText );
+ }
+ break;
+ case IDGroupBox:
+ {
+ isFrame = TRUE;
+ writeClass("QGroupBox");
+ writeCString( "name", useName("GroupBox_"+widgetID) );
+ writeRect( "geometry", x,y,w,h );
+ writeString( "title", widgetText );
+ if ( !styles.contains( "WS_BORDER" ) )
+ styles.append( "WS_BORDER" );
+ }
+ break;
+ case IDLineEdit:
+ {
+ if ( !styles.contains("ES_MULTILINE") ) {
+ writeClass("QLineEdit");
+ writeCString( "name", useName("LineEdit_"+widgetID) );
+ } else {
+ writeClass("QMultiLineEdit");
+ writeCString( "name", useName("MultiLineEdit_"+widgetID) );
+ }
+ writeRect( "geometry", x,y,w,h );
+ QString align = "AlignTop";
+ if ( styles.contains("ES_CENTER") )
+ align+="|AlignHCenter";
+ else if ( styles.contains("ES_RIGHT") )
+ align+="|AlignRight";
+ else
+ align+="|AlignLeft";
+ writeSet("alignment", align);
+ }
+ break;
+ case IDMultiLineEdit:
+ {
+ writeClass("QMultiLineEdit");
+ writeCString("name", useName("MultiLineEdit_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ }
+ break;
+ case IDIconView:
+ {
+ isFrame = TRUE;
+ writeClass("QIconView");
+ writeCString("name", useName("IconView_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ if ( !styles.contains( "LVS_SINGLESEL" ) )
+ writeEnum( "selectionMode", "Extended" );
+ if ( styles.contains( "LVS_NOLABELWRAP" ) )
+ writeBool("wordWrapIconText", FALSE );
+ }
+ break;
+ case IDListView:
+ {
+ isFrame = TRUE;
+ writeClass("QListView");
+ writeCString("name", useName("ListView_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ if ( styles.contains( "TVS_LINESATROOT" ) )
+ writeBool( "rootIsDecorated", TRUE );
+ if ( styles.contains( "TVS_FULLROWSELECT" ) )
+ writeBool( "allColumnsShowFocus", TRUE );
+ }
+ break;
+ case IDProgressBar:
+ {
+ isFrame = TRUE;
+ writeClass("QProgressBar");
+ writeCString("name", useName("ProgressBar_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ if ( styles.contains("TBS_VERT") )
+ writeEnum("orientation", "Vertical");
+ else
+ writeEnum("orientation", "Horizontal");
+ }
+ break;
+ case IDTabWidget:
+ {
+ writeClass("QTabWidget");
+ writeCString("name", useName("TabWidget_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ wi(); *out << "<widget>" << endl; indent();
+ writeClass("QWidget");
+ wi(); *out << "<attribute>" << endl; indent();
+ wi(); *out << "<name>title</name>" << endl;
+ wi(); *out << "<string>Tab1</string>" << endl; undent();
+ wi(); *out << "</attribute>" << endl; undent();
+ wi(); *out << "</widget>" << endl;
+ }
+ break;
+ case IDSpinBox:
+ {
+ isFrame = TRUE;
+ writeClass("QSpinBox");
+ writeCString("name", useName("SpinBox_"+widgetID) );
+ writeRect("geometry", x,y,w,h);
+ }
+ break;
+ case IDSlider:
+ {
+ writeClass("QSlider");
+ writeCString("name", useName("Slider_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ if ( styles.contains("TBS_VERT") )
+ writeEnum("orientation", "Vertical");
+ else
+ writeEnum("orientation", "Horizontal");
+ if ( !styles.contains("TBS_NOTICKS") )
+ writeEnum("tickmarks", "Left" );
+ }
+ break;
+ case IDComboBox:
+ {
+ writeClass("QComboBox");
+ writeCString("name", useName("ComboBox_"+widgetID) );
+ if ( isControl )
+ writeRect( "geometry", x,y,w,14 );
+ else
+ writeRect( "geometry", x,y,w,h );
+ }
+ break;
+ case IDListBox:
+ {
+ isFrame = TRUE;
+ writeClass("QListBox");
+ writeCString("name", useName("ListBox_"+widgetID) );
+ writeRect( "geometry", x,y,w,h );
+ if ( styles.contains("WS_HSCROLL") )
+ writeEnum("hScrollBarMode", "Auto");
+ else
+ writeEnum("hScrollBarMode", "AlwaysOff");
+ if ( styles.contains("WS_VSCROLL") )
+ writeEnum("vScrollBarMode", "Auto");
+ else
+ writeEnum("vScrollBarMode", "AlwaysOff");
+ if ( styles.contains("LBS_EXTENDEDSEL") )
+ writeEnum("selectionMode", "Extended");
+ else if ( styles.contains("LBS_MULTIPLESEL") )
+ writeEnum("selectionMode", "Multi");
+ else if ( styles.contains("LBS_NOSEL") )
+ writeEnum("selectionMode", "NoSelection");
+ else
+ writeEnum("selectionMode", "Single");
+ if ( !styles.contains( "NO WS_BORDER" ) )
+ styles.append( "WS_BORDER" );
+ }
+ break;
+ case IDScrollBar:
+ {
+ writeClass("QScrollBar");
+ writeCString("name", useName("ScrollBar_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ if ( styles.contains("SBS_VERT") )
+ writeEnum("orientation", "Vertical");
+ else
+ writeEnum("orientation", "Horizontal");
+ }
+ break;
+ case IDCustom:
+ {
+ writeClass("QLabel");
+ writeCString("name", useName("Custom_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ writeString("text", "Create a custom widget and place it here." );
+ }
+ default:
+ {
+ writeClass("QLabel");
+ writeCString("name", useName("Unknown_"+widgetID) );
+ writeRect("geometry", x,y,w,h );
+ writeString("text", QString("No support for %1.").arg(controlType) );
+ }
+ break;
+ }
+
+ writeStyles( styles, isFrame );
+
+ styles.clear();
+
+ undent();
+ wi(); *out << "</widget>" << endl;
+ } while ( line != "END" );
+
+ undent();
+ wi(); *out << "</widget>" << endl;
+ *out << "</UI>" << endl;
+
+ do {
+ line = in->readLine();
+ } while ( line.isEmpty() );
+
+ if ( !writeToFile )
+ target.append( buffer.copy() );
+
+ if (out) {
+ delete out;
+ out = 0;
+ }
+ fileOut.close();
+
+ } while ( line != blockStart1 );
+
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeBitmap()
+{
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeAccelerator()
+{
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeCursor()
+{
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeHTML()
+{
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeIcon()
+{
+ return TRUE;
+}
+
+/*!
+ Writes a stringtable from the input stream to a c++ header file.
+ All strings are assigned using QT_TR_NOOP to enable easy translation.
+*/
+
+bool RC2UI::makeStringTable()
+{
+ if ( !writeToFile )
+ return TRUE;
+
+ QFile fileOut;
+ line = in->readLine();
+ do {
+ char stringtable[256];
+ char discard[12];
+ sscanf( line, "%s %s", stringtable, discard );
+ if ( QString(stringtable) != "STRINGTABLE" )
+ return TRUE;
+ do {
+ line = in->readLine();
+ } while ( line != "BEGIN" );
+
+ QString outputFile = QString(stringtable).lower() + ".h";
+ if (outputFile ) {
+ fileOut.setName( outputFile );
+ if (!fileOut.open( IO_WriteOnly ) )
+ qFatal( "rc2ui: Could not open output file '%s'", outputFile.latin1() );
+ out = new QTextStream( &fileOut );
+ }
+
+ *out << "#ifndef STRINGTABLE_H" << endl;
+ *out << "#define STRINGTABLE_H" << endl;
+ *out << endl;
+ *out << "#include <qstring.h>" << endl;
+ *out << "#include <qobject.h>" << endl;
+ *out << endl;
+
+ QString ID;
+ QString value;
+ do {
+ line = in->readLine().stripWhiteSpace();
+ if ( line == "END" )
+ continue;
+
+ ID = parseNext(line, ' ');
+ value = parseNext(line).stripWhiteSpace();
+
+ *out << "static const QString " << ID << "= QT_TR_NOOP(" << value << ");" << endl;
+
+ } while ( line != "END" );
+
+ *out << endl;
+ *out << "#endif // STRINGTABLE_H" << endl;
+
+ do {
+ line = in->readLine();
+ } while ( line.isEmpty() );
+
+ if ( out ) {
+ delete out;
+ out = 0;
+ }
+ } while ( line != blockStart1 );
+
+ return TRUE;
+}
+
+/*! Not yet implemented
+*/
+
+bool RC2UI::makeVersion()
+{
+ return TRUE;
+}
diff --git a/tools/designer/plugins/rc/rc2ui.h b/tools/designer/plugins/rc/rc2ui.h
new file mode 100644
index 0000000..8f3b1c6
--- /dev/null
+++ b/tools/designer/plugins/rc/rc2ui.h
@@ -0,0 +1,103 @@
+/**********************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef RC2UI_H
+#define RC2UI_H
+
+#include <qtextstream.h>
+#include <qfile.h>
+#include <qstringlist.h>
+
+class RC2UI
+{
+public:
+ RC2UI( QTextStream* input );
+ ~RC2UI();
+
+ bool parse();
+ bool parse ( QStringList& get );
+
+ QStringList targetFiles;
+
+protected:
+ enum WidgetType { IDWidget, IDPushButton, IDLabel, IDCheckBox, IDRadioButton,
+ IDGroupBox, IDLineEdit, IDMultiLineEdit, IDIconView, IDListView,
+ IDProgressBar, IDTabWidget, IDSpinBox, IDSlider, IDComboBox,
+ IDListBox, IDScrollBar, IDCustom, IDUnknown = 0x0100 };
+ bool makeDialog();
+ bool makeBitmap();
+ bool makeStringTable();
+ bool makeAccelerator();
+ bool makeCursor();
+ bool makeHTML();
+ bool makeIcon();
+ bool makeVersion();
+
+ QString line;
+ QTextStream *in;
+ QStringList target;
+
+ void indent();
+ void undent();
+
+ QString stripQM( const QString& string );
+ QString parseNext( QString& arg, char sep = ',' );
+ QStringList splitStyles( const QString& styles, char sep = '|' );
+ void wi();
+
+ void writeClass( const QString& name );
+ void writeCString( const QString& name, const QString& value );
+ void writeString( const QString& name, const QString& value );
+ void writeRect( const QString& name, int x, int y, int w, int h );
+ void writeFont( const QString& family, int pointsize );
+ void writeBool( const QString& name, bool value );
+ void writeNumber( const QString& name, int value );
+ void writeEnum( const QString& name, const QString& value );
+ void writeSet( const QString& name, const QString& value );
+
+ void writeStyles( const QStringList styles, bool isFrame );
+private:
+ int indentation;
+ bool writeToFile;
+ QTextStream* out;
+
+ QString useName( const QString& );
+
+ QStringList usedNames;
+
+ const QString blockStart1;
+ const QString blockStart2;
+};
+
+#endif
diff --git a/tools/designer/plugins/wizards/images/qtwizards_menu_1.png b/tools/designer/plugins/wizards/images/qtwizards_menu_1.png
new file mode 100644
index 0000000..9a62ab9
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/qtwizards_menu_1.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/qtwizards_menu_2.png b/tools/designer/plugins/wizards/images/qtwizards_menu_2.png
new file mode 100644
index 0000000..fd52607
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/qtwizards_menu_2.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/qtwizards_menu_3.png b/tools/designer/plugins/wizards/images/qtwizards_menu_3.png
new file mode 100644
index 0000000..7cf15ac
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/qtwizards_menu_3.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/qtwizards_table_1.png b/tools/designer/plugins/wizards/images/qtwizards_table_1.png
new file mode 100644
index 0000000..425b133
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/qtwizards_table_1.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/qtwizards_table_2.png b/tools/designer/plugins/wizards/images/qtwizards_table_2.png
new file mode 100644
index 0000000..f729542
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/qtwizards_table_2.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/qtwizards_table_3.png b/tools/designer/plugins/wizards/images/qtwizards_table_3.png
new file mode 100644
index 0000000..472f267
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/qtwizards_table_3.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/qtwizards_table_4.png b/tools/designer/plugins/wizards/images/qtwizards_table_4.png
new file mode 100644
index 0000000..493b12e
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/qtwizards_table_4.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/re-sort.png b/tools/designer/plugins/wizards/images/re-sort.png
new file mode 100644
index 0000000..43a8234
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/re-sort.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/small/editcopy.png b/tools/designer/plugins/wizards/images/small/editcopy.png
new file mode 100644
index 0000000..080db08
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/small/editcopy.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/small/editcut.png b/tools/designer/plugins/wizards/images/small/editcut.png
new file mode 100644
index 0000000..f8bd744
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/small/editcut.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/small/editpaste.png b/tools/designer/plugins/wizards/images/small/editpaste.png
new file mode 100644
index 0000000..dc7915e
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/small/editpaste.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/small/filenew.png b/tools/designer/plugins/wizards/images/small/filenew.png
new file mode 100644
index 0000000..4e5a172
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/small/filenew.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/small/fileopen.png b/tools/designer/plugins/wizards/images/small/fileopen.png
new file mode 100644
index 0000000..cb18a2c
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/small/fileopen.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/small/filesave.png b/tools/designer/plugins/wizards/images/small/filesave.png
new file mode 100644
index 0000000..ad3f6f8
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/small/filesave.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/small/print.png b/tools/designer/plugins/wizards/images/small/print.png
new file mode 100644
index 0000000..8a3640b
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/small/print.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/small/redo.png b/tools/designer/plugins/wizards/images/small/redo.png
new file mode 100644
index 0000000..3a504a2
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/small/redo.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/small/searchfind.png b/tools/designer/plugins/wizards/images/small/searchfind.png
new file mode 100644
index 0000000..900156d
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/small/searchfind.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/images/small/undo.png b/tools/designer/plugins/wizards/images/small/undo.png
new file mode 100644
index 0000000..2fc8d26
--- /dev/null
+++ b/tools/designer/plugins/wizards/images/small/undo.png
Binary files differ
diff --git a/tools/designer/plugins/wizards/main.cpp b/tools/designer/plugins/wizards/main.cpp
new file mode 100644
index 0000000..617ad65
--- /dev/null
+++ b/tools/designer/plugins/wizards/main.cpp
@@ -0,0 +1,142 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <designerinterface.h>
+#include <qfeatures.h>
+#include <qwidget.h>
+#include <templatewizardiface.h>
+#ifndef QT_NO_SQL
+#include "sqlformwizardimpl.h"
+#endif
+#include "mainwindowwizard.h"
+#include <qapplication.h>
+
+class StandardTemplateWizardInterface : public TemplateWizardInterface, public QLibraryInterface
+{
+public:
+ StandardTemplateWizardInterface();
+ virtual ~StandardTemplateWizardInterface();
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+ Q_REFCOUNT;
+
+ QStringList featureList() const;
+
+ void setup( const QString &templ, QWidget *widget, DesignerFormWindow *fw, QUnknownInterface *aIface );
+
+ bool init();
+ void cleanup();
+ bool canUnload() const;
+
+private:
+ bool inUse;
+};
+
+StandardTemplateWizardInterface::StandardTemplateWizardInterface()
+ : inUse( FALSE )
+{
+}
+
+StandardTemplateWizardInterface::~StandardTemplateWizardInterface()
+{
+}
+
+bool StandardTemplateWizardInterface::init()
+{
+ return TRUE;
+}
+
+void StandardTemplateWizardInterface::cleanup()
+{
+}
+
+bool StandardTemplateWizardInterface::canUnload() const
+{
+ return !inUse;
+}
+
+QStringList StandardTemplateWizardInterface::featureList() const
+{
+ QStringList list;
+#ifndef QT_NO_SQL
+ list << "QDataBrowser" << "QDesignerDataBrowser" << "QDataView" << \
+ "QDesignerDataView" << "QDataTable";
+#endif
+ list << "QMainWindow";
+
+ return list;
+}
+
+void StandardTemplateWizardInterface::setup( const QString &templ, QWidget *widget, DesignerFormWindow *fw, QUnknownInterface *aIface )
+{
+ inUse = TRUE;
+#ifndef QT_NO_SQL
+ if ( templ == "QDesignerDataView" ||
+ templ == "QDesignerDataBrowser" ||
+ templ == "QDataView" ||
+ templ == "QDataBrowser" ||
+ templ == "QDataTable" ) {
+ SqlFormWizard wizard( aIface, widget, qApp->mainWidget(), fw, 0, TRUE );
+ wizard.exec();
+ }
+#endif
+ if ( templ == "QMainWindow" ) {
+ MainWindowWizardBase wizard( qApp->mainWidget(), 0, TRUE );
+ wizard.setAppInterface( aIface, fw, widget );
+ wizard.exec();
+ }
+ inUse = FALSE;
+}
+
+QRESULT StandardTemplateWizardInterface::queryInterface( const QUuid& uuid, QUnknownInterface** iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = (QUnknownInterface*)(TemplateWizardInterface*) this;
+ else if ( uuid == IID_QFeatureList )
+ *iface = (QFeatureListInterface*)this;
+ else if ( uuid == IID_TemplateWizard )
+ *iface = (TemplateWizardInterface*)this;
+ else if ( uuid == IID_QLibrary )
+ *iface = (QLibraryInterface*)this;
+ else
+ return QE_NOINTERFACE;
+
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+Q_EXPORT_COMPONENT()
+{
+ Q_CREATE_INSTANCE( StandardTemplateWizardInterface )
+}
diff --git a/tools/designer/plugins/wizards/mainwindowwizard.ui b/tools/designer/plugins/wizards/mainwindowwizard.ui
new file mode 100644
index 0000000..52bc752
--- /dev/null
+++ b/tools/designer/plugins/wizards/mainwindowwizard.ui
@@ -0,0 +1,757 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MainWindowWizardBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<include location="global" impldecl="in implementation">designerinterface.h</include>
+<include location="global" impldecl="in implementation">qiconset.h</include>
+<include location="global" impldecl="in implementation">qaction.h</include>
+<include location="global" impldecl="in implementation">qpixmap.h</include>
+<include location="global" impldecl="in implementation">qdict.h</include>
+<include location="local" implDecl="in declaration">mainwindowwizard.ui.h</include>
+<forward>struct DesignerFormWindow;</forward>
+<forward>struct DesignerInterface;</forward>
+<forward>struct QUnknownInterface;</forward>
+<forward>class QWidget;</forward>
+<variable>QWidget *widget;</variable>
+<variable>DesignerInterface *dIface;</variable>
+<variable>DesignerFormWindow *dfw;</variable>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="QWizard">
+ <property name="name">
+ <cstring>MainWindowWizardBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>604</width>
+ <height>392</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Main Window Wizard</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>menuToolbarPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Choose available menus and toolbars</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="0" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>TextLabel4_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>qtwizards_menu_1.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="1" column="1">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>File Actions</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>checkFileMenu</cstring>
+ </property>
+ <property name="text">
+ <string>Menu</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="1">
+ <property name="name">
+ <cstring>checkFileToolbar</cstring>
+ </property>
+ <property name="text">
+ <string>Toolbar</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="1" column="3">
+ <property name="name">
+ <cstring>checkCreateConnectionsFile</cstring>
+ </property>
+ <property name="text">
+ <string>Create Slots and Connections for the actions</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>like New, Open File, Save, Print, etc.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="2" column="1">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Edit Actions</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="1" column="1">
+ <property name="name">
+ <cstring>checkEditToolbar</cstring>
+ </property>
+ <property name="text">
+ <string>Toolbar</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>checkEditMenu</cstring>
+ </property>
+ <property name="text">
+ <string>Menu</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="1" column="3">
+ <property name="name">
+ <cstring>checkCreateConnectionsEdit</cstring>
+ </property>
+ <property name="text">
+ <string>Create Slots and Connections for the actions</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>like Cut, Copy, Paste, Undo and Redo, etc.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="3" column="1">
+ <property name="name">
+ <cstring>GroupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Help Actions</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>TextLabel2_2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>like Contents and About, etc.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>checkHelpMenu</cstring>
+ </property>
+ <property name="text">
+ <string>Menu</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="1">
+ <property name="name">
+ <cstring>checkHelpToolbar</cstring>
+ </property>
+ <property name="text">
+ <string>Toolbar</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>Spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="1" column="3">
+ <property name="name">
+ <cstring>checkCreateConnectionsHelp</cstring>
+ </property>
+ <property name="text">
+ <string>Create Slots and Connections for the actions</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>toolbarsPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Setup Toolbar</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="7" column="2">
+ <property name="name">
+ <cstring>buttonToolbarActionUp</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_up.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="3">
+ <property name="name">
+ <cstring>TextLabel4_3_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Toolbar</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>listToolbar</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="8" column="2">
+ <property name="name">
+ <cstring>buttonToolbarActionDown</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_down.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QListBox" row="3" column="1" rowspan="7" colspan="1">
+ <property name="name">
+ <cstring>listToolbarActions</cstring>
+ </property>
+ </widget>
+ <widget class="QListBox" row="3" column="3" rowspan="7" colspan="1">
+ <property name="name">
+ <cstring>listToolbar</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout20_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel5_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Category</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboToolbar</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>comboToolbar</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="2" column="1">
+ <property name="name">
+ <cstring>TextLabel4_4</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Actions</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>listToolbarActions</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="5" column="2">
+ <property name="name">
+ <cstring>buttonToolbarRemoveAction</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_left.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="10" colspan="1">
+ <property name="name">
+ <cstring>TextLabel4_2_2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>qtwizards_menu_2.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="2">
+ <property name="name">
+ <cstring>buttonToolbarAddAction</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_right.png</pixmap>
+ </property>
+ </widget>
+ <spacer row="3" column="2">
+ <property name="name">
+ <cstring>Spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="6" column="2">
+ <property name="name">
+ <cstring>Spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="9" column="2">
+ <property name="name">
+ <cstring>Spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>finishPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Finish</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>TextLabel4_2_2_2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>qtwizards_menu_3.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>TextLabel1_5</cstring>
+ </property>
+ <property name="text">
+ <string>Press Finish to populate the main window.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="1">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+</widget>
+<connections>
+ <connection language="C++">
+ <sender>comboToolbar</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>currentToolbarChanged(const QString&amp;)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>buttonToolbarAddAction</sender>
+ <signal>clicked()</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>toolbarAddAction()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>buttonToolbarRemoveAction</sender>
+ <signal>clicked()</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>toolbarRemoveAction()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>buttonToolbarActionUp</sender>
+ <signal>clicked()</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>toolbarActionUp()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>buttonToolbarActionDown</sender>
+ <signal>clicked()</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>toolbarActionDown()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>MainWindowWizardBase</sender>
+ <signal>selected(const QString&amp;)</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>pageSelected(const QString&amp;)</slot>
+ </connection>
+ <connection language="C++">
+ <sender>checkHelpMenu</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>currentSettingChanged()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>checkHelpToolbar</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>currentSettingChanged()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>checkEditMenu</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>currentSettingChanged()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>checkEditToolbar</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>currentSettingChanged()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>checkFileMenu</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>currentSettingChanged()</slot>
+ </connection>
+ <connection language="C++">
+ <sender>checkFileToolbar</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MainWindowWizardBase</receiver>
+ <slot>currentSettingChanged()</slot>
+ </connection>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">init()</slot>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">destroy()</slot>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">currentSettingChanged()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">setupToolbarPage()</slot>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">toolbarActionDown()</slot>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">toolbarActionUp()</slot>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">toolbarAddAction()</slot>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">toolbarRemoveAction()</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">accept()</slot>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">currentToolbarChanged( const QString &amp; s )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">getPixmap( const QString &amp; n, QPixmap &amp; pix )</slot>
+ <slot access="protected" specifier="virtual" language="C++" returnType="void">pageSelected( const QString &amp; )</slot>
+ <slot access="public" specifier="virtual" language="C++" returnType="void">setAppInterface( QUnknownInterface * iface, DesignerFormWindow * fw, QWidget * w )</slot>
+</connections>
+<tabstops>
+ <tabstop>checkFileMenu</tabstop>
+ <tabstop>checkFileToolbar</tabstop>
+ <tabstop>checkEditMenu</tabstop>
+ <tabstop>checkEditToolbar</tabstop>
+ <tabstop>checkHelpMenu</tabstop>
+ <tabstop>checkHelpToolbar</tabstop>
+ <tabstop>comboToolbar</tabstop>
+ <tabstop>listToolbarActions</tabstop>
+ <tabstop>buttonToolbarAddAction</tabstop>
+ <tabstop>buttonToolbarRemoveAction</tabstop>
+ <tabstop>buttonToolbarActionUp</tabstop>
+ <tabstop>buttonToolbarActionDown</tabstop>
+ <tabstop>listToolbar</tabstop>
+</tabstops>
+</UI>
diff --git a/tools/designer/plugins/wizards/mainwindowwizard.ui.h b/tools/designer/plugins/wizards/mainwindowwizard.ui.h
new file mode 100644
index 0000000..8155e62
--- /dev/null
+++ b/tools/designer/plugins/wizards/mainwindowwizard.ui.h
@@ -0,0 +1,321 @@
+/**********************************************************************
+**
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+void MainWindowWizardBase::init()
+{
+ dIface = 0;
+ dfw = 0;
+ widget = 0;
+ setHelpEnabled( menuToolbarPage, FALSE );
+ setHelpEnabled( toolbarsPage, FALSE );
+ setHelpEnabled( finishPage, FALSE );
+ setFinishEnabled( finishPage, TRUE );
+}
+
+void MainWindowWizardBase::destroy()
+{
+ if ( dIface )
+ dIface->release();
+}
+
+void MainWindowWizardBase::currentSettingChanged()
+{
+ bool appr = checkFileToolbar->isChecked() || checkEditToolbar->isChecked() || checkHelpToolbar->isChecked();
+ setAppropriate( toolbarsPage, appr );
+}
+
+void MainWindowWizardBase::setupToolbarPage()
+{
+ if ( checkFileToolbar->isChecked() )
+ comboToolbar->insertItem( tr( "File" ) );
+ if ( checkEditToolbar->isChecked() )
+ comboToolbar->insertItem( tr( "Edit" ) );
+ if ( checkHelpToolbar->isChecked() )
+ comboToolbar->insertItem( tr( "Help" ) );
+}
+
+void MainWindowWizardBase::toolbarActionDown()
+{
+ if ( listToolbar->currentItem() < 0 || listToolbar->currentItem() >= (int)listToolbar->count() - 1 )
+ return;
+
+ int next = listToolbar->currentItem() + 1;
+ QString tmp = listToolbar->text( next );
+ listToolbar->changeItem( listToolbar->text( next - 1 ), next );
+ listToolbar->changeItem( tmp, next - 1 );
+ listToolbar->setCurrentItem( next );
+}
+
+void MainWindowWizardBase::toolbarActionUp()
+{
+ if ( listToolbar->currentItem() < 1 || listToolbar->currentItem() > (int)listToolbar->count() - 1 )
+ return;
+
+ int prev = listToolbar->currentItem() - 1;
+ QString tmp = listToolbar->text( prev );
+ listToolbar->changeItem( listToolbar->text( prev + 1 ), prev );
+ listToolbar->changeItem( tmp, prev + 1 );
+ listToolbar->setCurrentItem( prev );
+}
+
+void MainWindowWizardBase::toolbarAddAction()
+{
+ if ( listToolbarActions->text( listToolbarActions->currentItem() ).isEmpty() )
+ return;
+ listToolbar->insertItem( listToolbarActions->text( listToolbarActions->currentItem() ) );
+ listToolbar->setCurrentItem( listToolbar->count() - 1 );
+ listToolbarActions->setCurrentItem( listToolbarActions->currentItem() + 1 );
+}
+
+void MainWindowWizardBase::toolbarRemoveAction()
+{
+ listToolbar->removeItem( listToolbar->currentItem() );
+}
+
+static void devNull( QtMsgType, const char * )
+{
+}
+
+void MainWindowWizardBase::accept()
+{
+ if ( !dfw || !dIface || !widget ) {
+ QWizard::accept();
+ return;
+ }
+
+ setFinishEnabled( finishPage, FALSE );
+
+ QPixmap pix;
+
+ QDict<QAction> actions;
+ QPtrList<QAction> usedActions;
+
+ QtMsgHandler oldMsgHandler = qInstallMsgHandler( devNull );
+
+ getPixmap( "filenew", pix );
+
+ QAction *fileNewAction = dfw->createAction( tr( "New" ), pix, tr( "&New" ), CTRL + Key_N, 0, "fileNewAction" );
+ actions.insert( tr( "New" ), fileNewAction );
+ getPixmap( "fileopen", pix );
+ QAction *fileOpenAction = dfw->createAction( tr( "Open" ), pix, tr( "&Open..." ), CTRL + Key_O, 0, "fileOpenAction" );
+ actions.insert( tr( "Open" ), fileOpenAction );
+ getPixmap( "filesave", pix );
+ QAction *fileSaveAction = dfw->createAction( tr( "Save" ), pix, tr( "&Save" ), CTRL + Key_S, 0, "fileSaveAction" );
+ actions.insert( tr( "Save" ), fileSaveAction );
+ QAction *fileSaveAsAction = dfw->createAction( tr( "Save As" ), QIconSet(), tr( "Save &As..." ), 0, 0, "fileSaveAsAction" );
+ actions.insert( tr( "Save As" ), fileSaveAsAction );
+ getPixmap( "print", pix );
+ QAction *filePrintAction = dfw->createAction( tr( "Print" ), pix, tr( "&Print..." ), CTRL + Key_P, 0, "filePrintAction" );
+ actions.insert( tr( "Print" ), filePrintAction );
+ QAction *fileExitAction = dfw->createAction( tr( "Exit" ), QIconSet(), tr( "E&xit" ), 0, 0, "fileExitAction" );
+ actions.insert( tr( "Exit" ), fileExitAction );
+
+ getPixmap( "undo", pix );
+ QAction *editUndoAction = dfw->createAction( tr( "Undo" ), pix, tr( "&Undo" ), CTRL + Key_Z, 0, "editUndoAction" );
+ actions.insert( tr( "Undo" ), editUndoAction );
+ getPixmap( "redo", pix );
+ QAction *editRedoAction = dfw->createAction( tr( "Redo" ), pix, tr( "&Redo" ), CTRL + Key_Y, 0, "editRedoAction" );
+ actions.insert( tr( "Redo" ), editRedoAction );
+ getPixmap( "editcut", pix );
+ QAction *editCutAction = dfw->createAction( tr( "Cut" ), pix, tr( "Cu&t" ), CTRL + Key_X, 0, "editCutAction" );
+ actions.insert( tr( "Cut" ), editCutAction );
+ getPixmap( "editcopy", pix );
+ QAction *editCopyAction = dfw->createAction( tr( "Copy" ), pix, tr( "&Copy" ), CTRL + Key_C, 0, "editCopyAction" );
+ actions.insert( tr( "Copy" ), editCopyAction );
+ getPixmap( "editpaste", pix );
+ QAction *editPasteAction = dfw->createAction( tr( "Paste" ), pix, tr( "&Paste" ), CTRL + Key_V, 0, "editPasteAction" );
+ actions.insert( tr( "Paste" ), editPasteAction );
+ getPixmap( "searchfind", pix );
+ QAction *editFindAction = dfw->createAction( tr( "Find" ), pix, tr( "&Find..." ), CTRL + Key_F, 0, "editFindAction" );
+ actions.insert( tr( "Find" ), editFindAction );
+
+ QAction *helpAboutAction = dfw->createAction( tr( "About" ), QIconSet(), tr( "&About" ), 0, 0, "helpAboutAction" );
+ actions.insert( tr( "About" ), helpAboutAction );
+ QAction *helpContentsAction = dfw->createAction( tr( "Contents" ), QIconSet(), tr( "&Contents..." ), 0, 0, "helpContentsAction" );
+ actions.insert( tr( "Contents" ), helpContentsAction );
+ QAction *helpIndexAction = dfw->createAction( tr( "Index" ), QIconSet(), tr( "&Index..." ), 0, 0, "helpIndexAction" );
+ actions.insert( tr( "Index" ), helpIndexAction );
+
+ if ( checkFileMenu->isChecked() ) {
+ dfw->addMenu( "&File", "fileMenu" );
+ dfw->addMenuAction( "fileMenu", fileNewAction );
+ dfw->addMenuAction( "fileMenu", fileOpenAction );
+ dfw->addMenuAction( "fileMenu", fileSaveAction );
+ dfw->addMenuAction( "fileMenu", fileSaveAsAction );
+ dfw->addMenuSeparator( "fileMenu" );
+ dfw->addMenuAction( "fileMenu", filePrintAction );
+ dfw->addMenuSeparator( "fileMenu" );
+ dfw->addMenuAction( "fileMenu", fileExitAction );
+ dfw->addAction( fileNewAction );
+ dfw->addAction( fileOpenAction );
+ dfw->addAction( fileSaveAction );
+ dfw->addAction( fileSaveAsAction );
+ dfw->addAction( filePrintAction );
+ dfw->addAction( fileExitAction );
+ usedActions.append( fileNewAction );
+ usedActions.append( fileOpenAction );
+ usedActions.append( fileSaveAction );
+ usedActions.append( fileSaveAsAction );
+ usedActions.append( filePrintAction );
+ usedActions.append( fileExitAction );
+ }
+
+ if ( checkEditMenu->isChecked() ) {
+ dfw->addMenu( "&Edit", "editMenu" );
+ dfw->addMenuAction( "editMenu", editUndoAction );
+ dfw->addMenuAction( "editMenu", editRedoAction );
+ dfw->addMenuSeparator( "editMenu" );
+ dfw->addMenuAction( "editMenu", editCutAction );
+ dfw->addMenuAction( "editMenu", editCopyAction );
+ dfw->addMenuAction( "editMenu", editPasteAction );
+ dfw->addMenuSeparator( "editMenu" );
+ dfw->addMenuAction( "editMenu", editFindAction );
+ dfw->addAction( editUndoAction );
+ dfw->addAction( editRedoAction );
+ dfw->addAction( editCutAction );
+ dfw->addAction( editCopyAction );
+ dfw->addAction( editPasteAction );
+ dfw->addAction( editFindAction );
+ usedActions.append( editUndoAction );
+ usedActions.append( editRedoAction );
+ usedActions.append( editCutAction );
+ usedActions.append( editCopyAction );
+ usedActions.append( editPasteAction );
+ usedActions.append( editFindAction );
+ }
+
+ if ( checkHelpMenu->isChecked() ) {
+ dfw->addMenu( "&Help", "helpMenu" );
+ dfw->addMenuAction( "helpMenu", helpContentsAction );
+ dfw->addMenuAction( "helpMenu", helpIndexAction );
+ dfw->addMenuSeparator( "helpMenu" );
+ dfw->addMenuAction( "helpMenu", helpAboutAction );
+ dfw->addAction( helpContentsAction );
+ dfw->addAction( helpIndexAction );
+ dfw->addAction( helpAboutAction );
+ usedActions.append( helpIndexAction );
+ usedActions.append( helpContentsAction );
+ usedActions.append( helpAboutAction );
+ }
+
+ if ( listToolbar->count() > 0 && appropriate( toolbarsPage ) ) {
+ dfw->addToolBar( "Tools", "toolBar" );
+ for ( int i = 0; i < (int)listToolbar->count(); ++i ) {
+ if ( listToolbar->text( i ) == tr( "<Separator>" ) ) {
+ dfw->addToolBarSeparator( "toolBar" );
+ continue;
+ }
+ QAction *a = actions.find( listToolbar->text( i ) );
+ if ( !a )
+ continue;
+ dfw->addToolBarAction( "toolBar", a );
+ dfw->addAction( a );
+ if ( usedActions.findRef( a ) == -1 )
+ usedActions.append( a );
+ }
+ }
+ for ( QAction *ac = usedActions.first(); ac; ac = usedActions.next() ) {
+ if ( QString( ac->name() ).find( "file" ) != -1 && checkCreateConnectionsFile->isChecked() ||
+ QString( ac->name() ).find( "edit" ) != -1 && checkCreateConnectionsEdit->isChecked() ||
+ QString( ac->name() ).find( "help" ) != -1 && checkCreateConnectionsHelp->isChecked() ) {
+ QString slot = ac->name();
+ slot.remove( slot.length() - 6, 6 );
+ slot += "()";
+ dfw->addFunction( slot.latin1(), "virtual", "public", "slot", dIface->currentProject()->language(), "void" );
+ dfw->addConnection( ac, "activated()", widget, slot );
+ }
+ }
+
+ qInstallMsgHandler( oldMsgHandler );
+
+ QWizard::accept();
+}
+
+void MainWindowWizardBase::currentToolbarChanged( const QString & s )
+{
+ if ( s == tr( "File" ) ) {
+ listToolbarActions->clear();
+ listToolbarActions->insertItem( tr( "New" ) );
+ listToolbarActions->insertItem( tr( "Open" ) );
+ listToolbarActions->insertItem( tr( "Save" ) );
+ listToolbarActions->insertItem( tr( "Save As" ) );
+ listToolbarActions->insertItem( tr( "Print" ) );
+ listToolbarActions->insertItem( tr( "Exit" ) );
+ } else if ( s == tr( "Edit" ) ) {
+ listToolbarActions->clear();
+ listToolbarActions->insertItem( tr( "Undo" ) );
+ listToolbarActions->insertItem( tr( "Redo" ) );
+ listToolbarActions->insertItem( tr( "Cut" ) );
+ listToolbarActions->insertItem( tr( "Copy" ) );
+ listToolbarActions->insertItem( tr( "Paste" ) );
+ listToolbarActions->insertItem( tr( "Find" ) );
+ } else if ( s == tr( "Help" ) ) {
+ listToolbarActions->clear();
+ listToolbarActions->insertItem( tr( "Contents" ) );
+ listToolbarActions->insertItem( tr( "Index" ) );
+ listToolbarActions->insertItem( tr( "About" ) );
+ }
+ listToolbarActions->insertItem( "<Separator>" );
+ listToolbarActions->setCurrentItem( 0 );
+}
+
+void MainWindowWizardBase::getPixmap( const QString & n, QPixmap & pix )
+{
+ QString name = n + ".png";
+ pix = QPixmap::fromMimeSource( name );
+ DesignerProject *pro = dIface->currentProject();
+ if ( !pro || pro->projectName() == "<No Project>" )
+ return;
+ pro->pixmapCollection()->addPixmap( pix, n, FALSE );
+}
+
+void MainWindowWizardBase::pageSelected( const QString & )
+{
+ if ( currentPage() == toolbarsPage ) {
+ comboToolbar->clear();
+ setupToolbarPage();
+ listToolbarActions->clear();
+ currentToolbarChanged( comboToolbar->text( comboToolbar->currentItem() ) );
+ }
+}
+
+void MainWindowWizardBase::setAppInterface( QUnknownInterface * iface, DesignerFormWindow * fw, QWidget * w )
+{
+ DesignerInterface *d = 0;
+ iface->queryInterface( IID_Designer, (QUnknownInterface**)&d );
+ dIface = d;
+ dfw = fw;
+ widget = w;
+}
+
diff --git a/tools/designer/plugins/wizards/sqlformwizard.ui b/tools/designer/plugins/wizards/sqlformwizard.ui
new file mode 100644
index 0000000..c4ee673
--- /dev/null
+++ b/tools/designer/plugins/wizards/sqlformwizard.ui
@@ -0,0 +1,1776 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>SqlFormWizardBase</class>
+<comment>*********************************************************************
+** Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QWizard">
+ <property name="name">
+ <cstring>SqlFormWizardBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>577</width>
+ <height>570</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Sql Wizard</string>
+ </property>
+ <property name="icon">
+ <pixmap></pixmap>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>databasePage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Choose the Database and Table</string>
+ </attribute>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>qtwizards_table_1.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>TextLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Table:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>listBoxTable</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton5</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Setup Database Connections...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Click here to manage your database connections</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can add, modify and delete your database connections</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel3_3</cstring>
+ </property>
+ <property name="text">
+ <string>Database &amp;Connection:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>listBoxConnection</cstring>
+ </property>
+ </widget>
+ <widget class="QListBox" row="2" column="1">
+ <property name="name">
+ <cstring>listBoxTable</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Displays all tables inside the selected Database</string>
+ </property>
+ </widget>
+ <widget class="QListBox" row="2" column="0">
+ <property name="name">
+ <cstring>listBoxConnection</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Displays a list of available connections on your system</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>populatePage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Displayed Fields</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>TextLabel4_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>qtwizards_table_2.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>Layout11</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer row="4" column="1">
+ <property name="name" stdset="0">
+ <cstring>Spacer1_10</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>buttonAddField_2</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_right.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move field to list of displayed fields</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to add the selected field to the list of fields that will be displayed.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>buttonRemoveField_2</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_left.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>remove field from list of displayed fields</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to remove the selected field from the list of fields that will be displayed.</string>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name" stdset="0">
+ <cstring>Spacer2_5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="5" column="1">
+ <property name="name">
+ <cstring>buttonFieldUp_2</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_up.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move Field up</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to move the selected field in the displayed fields list up.</string>
+ </property>
+ </widget>
+ <spacer row="7" column="1">
+ <property name="name" stdset="0">
+ <cstring>Spacer3_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QListBox" row="1" column="0" rowspan="7" colspan="1">
+ <property name="name">
+ <cstring>listBoxField</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is a list of all available fields in your selected table. Fields in this list will not be displayed.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="6" column="1">
+ <property name="name">
+ <cstring>buttonFieldDown_2</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_down.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move field down</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to move the selected field in the displayed fields list down.</string>
+ </property>
+ </widget>
+ <widget class="QListBox" row="1" column="2" rowspan="7" colspan="1">
+ <property name="name">
+ <cstring>listBoxSelectedField</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>All fields in this list will be displayed.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>TextLabel2_3</cstring>
+ </property>
+ <property name="text">
+ <string>Displayed Fields:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1_7</cstring>
+ </property>
+ <property name="text">
+ <string>Available Fields:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>navigPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Navigation and Editing</string>
+ </attribute>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel4_2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>qtwizards_table_3.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBoxNavig</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Include Navigation Buttons</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Activates the navigation bar</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Activates the navigation bar</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>&amp;Navigation</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>checkBoxPrev</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Previous</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Toggles whether the "Previous" button will be displayed</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Toggles whether the "Previous" button will be displayed</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>checkBoxNext</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Next</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Toggles whether the "Next" button will be displayed</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Toggles whether the "Next" button will be displayed</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="1">
+ <property name="name">
+ <cstring>checkBoxFirst</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;First</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Toggles whether the "First" button will be displayed</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Toggles whether the "First" button will be displayed</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="1">
+ <property name="name">
+ <cstring>checkBoxLast</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Last</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Toggles whether the "Last" button will be displayed</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Toggles whether the "Last" button will be displayed</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBoxEdit</cstring>
+ </property>
+ <property name="text">
+ <string>In&amp;clude Edit Buttons</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Activates the edit bar</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Activates the edit bar</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>&amp;Editing</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>checkBoxInsert</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Insert</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>User can insert new rows</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>User can insert new rows</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>checkBoxUpdate</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Update</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>user can edit existing rows</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>user can edit existing rows</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="1">
+ <property name="name">
+ <cstring>checkBoxDelete</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>user can delete rows</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>user can delete rows</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tablePropertiesPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Table Properties</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="4" colspan="1">
+ <property name="name">
+ <cstring>TextLabel4_2_2_2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>qtwizards_table_4.png</pixmap>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name" stdset="0">
+ <cstring>Spacer1_7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="1" column="1">
+ <property name="name">
+ <cstring>GroupBox5</cstring>
+ </property>
+ <property name="title">
+ <string>Editing</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkBoxReadOnly</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Read-Only</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Table will be read-only</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Activate this to prevent editing, deleting and adding of rows</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox4</cstring>
+ </property>
+ <property name="title">
+ <string>Confirmations</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>checkBoxConfirmInserts</cstring>
+ </property>
+ <property name="text">
+ <string>Confirm &amp;Inserts</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Query user on inserting rows</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>User will be asked for confirmation if he inserts a new row</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>checkBoxConfirmUpdates</cstring>
+ </property>
+ <property name="text">
+ <string>Confirm &amp;Updates</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Query user on editing rows</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>User will be asked for confirmation if he edits a row</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>checkBoxConfirmCancels</cstring>
+ </property>
+ <property name="text">
+ <string>Confirm &amp;Cancels</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Query user on canceling</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>User will be asked for confirmation if he cancels an action</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>checkBoxConfirmDeletes</cstring>
+ </property>
+ <property name="text">
+ <string>Confirm &amp;Deletes</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Query user on deleting rows</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>User will be asked for confirmation if he deletes a row</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QCheckBox" row="2" column="1">
+ <property name="name">
+ <cstring>checkBoxSorting</cstring>
+ </property>
+ <property name="text">
+ <string>Allow column &amp;sorting</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>User may change sorting</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>User may change sorting of data by clicking on a field in the top row of the table</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>sqlPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>SQL</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>TextLabel4_2_2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>qtwizards_table_2.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>Layout8</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel3_2_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Sort:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>listBoxTable</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1_5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>Layout10</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel3_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Filter:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>listBoxTable</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1_4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="2" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>Layout13</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>(a valid WHERE clause, e.g. id &gt; 100)</string>
+ </property>
+ </widget>
+ <widget class="QMultiLineEdit">
+ <property name="name">
+ <cstring>editFilter</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter a valid SQL WHERE statement, for example:
+name like "qt%"
+(name like "q%") and (version &gt; 3)
+((version &gt; 3) and (price &gt; 1000)) or (name like "%embed%")</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="4">
+ <property name="name">
+ <cstring>Layout10</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Sort By</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>listBoxSortedField</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Data will be sorted according to the selected fields.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="3">
+ <property name="name">
+ <cstring>Layout11</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonAddSortField</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_right.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move field to the right list</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Klick here to add the currently selected field from the available fields list to the sorting criteria</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonRemoveSortField</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_left.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>remove field from the right list</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Klick here to remove the currently selected field from the sorting criteria</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1_6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonUpSortField</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_up.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>move field up</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Move selected field in the sort by list up</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonDownSortField</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>designer_down.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>move field down</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Move selected field in the sort by list down</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer2_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonReSortField</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>re-sort.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Change field sort from ASC to DESC and back</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Changes the field sort order from ascending to descending for the selected field in the sort by list.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="2">
+ <property name="name">
+ <cstring>Layout12</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>Available Fields</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>listBoxSortField</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the list of all available fields in the selected table</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>layoutPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Layout</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="6" colspan="1">
+ <property name="name">
+ <cstring>TextLabel4_2_2_2_3_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>qtwizards_table_3.png</pixmap>
+ </property>
+ </widget>
+ <spacer row="5" column="5">
+ <property name="name" stdset="0">
+ <cstring>Spacer1_9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup" row="1" column="1" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Labels</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>radioLabelsLeft</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Labels to &amp;left</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Create labels to the left of data entry fields.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="1">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Create labels above data entry fields.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Create labels to the left of data entry fields.</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name" stdset="0">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Maximum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="3" column="0">
+ <property name="name" stdset="0">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Maximum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QRadioButton" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>radioLabelsTop</cstring>
+ </property>
+ <property name="text">
+ <string>Labels on &amp;top</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Create labels above data entry fields.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox" row="4" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>checkCreateLayouts</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Create layout for all</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Create a BoxLayout around the whole widget</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If you select this a BoxLayout will be created for the whole widget</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>checkCreateButtonLayout</cstring>
+ </property>
+ <property name="text">
+ <string>Create layout for &amp;buttons</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Create a BoxLayout around the buttons</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If you select this the designer will arrange all buttons inside an BoxLayout</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="1" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>checkCreateFieldLayout</cstring>
+ </property>
+ <property name="text">
+ <string>Create layout for &amp;fields</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Create a BoxLayout around the fields</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If you select this the designer will arrange all fields inside an BoxLayout</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="2">
+ <property name="name">
+ <cstring>spinNumberOfColumns</cstring>
+ </property>
+ <property name="maxValue">
+ <number>20</number>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enter the number of desired columns</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the number of desired columns</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>TextLabel1_6</cstring>
+ </property>
+ <property name="text">
+ <string>Number of Columns:</string>
+ </property>
+ </widget>
+ <spacer row="0" column="3">
+ <property name="name" stdset="0">
+ <cstring>Spacer3_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>finishPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Finish</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>TextLabel4_2_2_2_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>qtwizards_table_1.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>TextLabel1_5</cstring>
+ </property>
+ <property name="text">
+ <string>Press Finish to create the widget.</string>
+ </property>
+ </widget>
+ <spacer row="4" column="3">
+ <property name="name" stdset="0">
+ <cstring>Spacer2_4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="2" rowspan="1" colspan="2">
+ <property name="name" stdset="0">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="0" column="2">
+ <property name="name" stdset="0">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="1" column="1">
+ <property name="name">
+ <cstring>checkBoxAutoEdit</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;AutoEditing</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Discard changes when user klicks into another row</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This property holds whether the table automatically applies edits. When the user begins an insert or update in the table there are two possible outcomes when they navigate to another record
+1.the insert or update is is performed -- this occurs if AutoEditing is on
+2.the insert or update is abandoned -- this occurs if AutoEditing is off</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton5</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>setupDatabaseConnections()</slot>
+ </connection>
+ <connection>
+ <sender>checkBoxNavig</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>GroupBox2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkBoxEdit</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>GroupBox3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>buttonReSortField</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>reSortSortField()</slot>
+ </connection>
+ <connection>
+ <sender>buttonRemoveSortField</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>removeSortField()</slot>
+ </connection>
+ <connection>
+ <sender>buttonAddSortField</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>addSortField()</slot>
+ </connection>
+ <connection>
+ <sender>buttonUpSortField</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>sortFieldUp()</slot>
+ </connection>
+ <connection>
+ <sender>buttonDownSortField</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>sortFieldDown()</slot>
+ </connection>
+ <connection>
+ <sender>listBoxSortField</sender>
+ <signal>doubleClicked(QListBoxItem*)</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>addSortField()</slot>
+ </connection>
+ <connection>
+ <sender>listBoxSortedField</sender>
+ <signal>doubleClicked(QListBoxItem*)</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>removeSortField()</slot>
+ </connection>
+ <connection>
+ <sender>listBoxSortedField</sender>
+ <signal>rightButtonClicked(QListBoxItem*,const QPoint&amp;)</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>reSortSortField()</slot>
+ </connection>
+ <connection>
+ <sender>checkBoxReadOnly</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>GroupBox4</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>listBoxConnection</sender>
+ <signal>highlighted(const QString&amp;)</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>connectionSelected(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>listBoxTable</sender>
+ <signal>highlighted(const QString&amp;)</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>tableSelected(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>buttonAddField_2</sender>
+ <signal>released()</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>addField()</slot>
+ </connection>
+ <connection>
+ <sender>buttonRemoveField_2</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>removeField()</slot>
+ </connection>
+ <connection>
+ <sender>buttonFieldUp_2</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>fieldUp()</slot>
+ </connection>
+ <connection>
+ <sender>buttonFieldDown_2</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlFormWizardBase</receiver>
+ <slot>fieldDown()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>PushButton5</tabstop>
+ <tabstop>listBoxConnection</tabstop>
+ <tabstop>listBoxTable</tabstop>
+ <tabstop>checkBoxNavig</tabstop>
+ <tabstop>checkBoxPrev</tabstop>
+ <tabstop>checkBoxNext</tabstop>
+ <tabstop>checkBoxFirst</tabstop>
+ <tabstop>checkBoxLast</tabstop>
+ <tabstop>checkBoxEdit</tabstop>
+ <tabstop>checkBoxInsert</tabstop>
+ <tabstop>checkBoxUpdate</tabstop>
+ <tabstop>checkBoxDelete</tabstop>
+ <tabstop>checkBoxReadOnly</tabstop>
+ <tabstop>checkBoxConfirmInserts</tabstop>
+ <tabstop>checkBoxConfirmUpdates</tabstop>
+ <tabstop>checkBoxConfirmDeletes</tabstop>
+ <tabstop>checkBoxConfirmCancels</tabstop>
+ <tabstop>checkBoxSorting</tabstop>
+ <tabstop>editFilter</tabstop>
+ <tabstop>listBoxSortField</tabstop>
+ <tabstop>buttonAddSortField</tabstop>
+ <tabstop>buttonRemoveSortField</tabstop>
+ <tabstop>buttonUpSortField</tabstop>
+ <tabstop>buttonDownSortField</tabstop>
+ <tabstop>buttonReSortField</tabstop>
+ <tabstop>listBoxSortedField</tabstop>
+ <tabstop>spinNumberOfColumns</tabstop>
+ <tabstop>radioLabelsLeft</tabstop>
+ <tabstop>radioLabelsTop</tabstop>
+ <tabstop>checkCreateFieldLayout</tabstop>
+ <tabstop>checkCreateButtonLayout</tabstop>
+ <tabstop>checkCreateLayouts</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot access="protected">addField()</slot>
+ <slot access="protected">addSortField()</slot>
+ <slot access="protected">fieldDown()</slot>
+ <slot access="protected">fieldUp()</slot>
+ <slot access="protected">reSortSortField()</slot>
+ <slot access="protected">removeField()</slot>
+ <slot access="protected">removeSortField()</slot>
+ <slot access="protected">setupDatabaseConnections()</slot>
+ <slot access="protected">sortFieldDown()</slot>
+ <slot access="protected">sortFieldUp()</slot>
+ <slot access="protected">connectionSelected( const QString &amp; )</slot>
+ <slot access="protected">tableSelected( const QString &amp; )</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/designer/plugins/wizards/sqlformwizardimpl.cpp b/tools/designer/plugins/wizards/sqlformwizardimpl.cpp
new file mode 100644
index 0000000..7519877
--- /dev/null
+++ b/tools/designer/plugins/wizards/sqlformwizardimpl.cpp
@@ -0,0 +1,624 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "sqlformwizardimpl.h"
+
+#include <qlistbox.h>
+#include <qwidget.h>
+#include <qcheckbox.h>
+#include <qlineedit.h>
+
+#include <qlabel.h>
+#include <qgroupbox.h>
+#include <qlayout.h>
+#include <qregexp.h>
+#include <qpushbutton.h>
+#include <qmultilineedit.h>
+#include <qlistview.h>
+#include <qfeatures.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <limits.h>
+
+#ifndef QT_NO_SQL
+#include <qdatatable.h>
+#include <qdatabrowser.h>
+#include <qdataview.h>
+#include <qsqleditorfactory.h>
+#include <qsqlindex.h>
+#include <qsqlcursor.h>
+#endif
+
+SqlFormWizard::SqlFormWizard( QUnknownInterface *aIface, QWidget *w,
+ QWidget* parent, DesignerFormWindow *fw, const char* name, bool modal, WFlags fl )
+ : SqlFormWizardBase( parent, name, modal, fl ), widget( w ), appIface( aIface ),
+ mode( None )
+{
+ appIface->addRef();
+ formWindow = fw;
+ setFinishEnabled( finishPage, TRUE );
+
+ /* set mode of operation */
+ if ( ::qt_cast<QDataTable*>(widget) ) {
+ setCaption( "Data Table Wizard" );
+ mode = Table;
+ setAppropriate( navigPage, FALSE );
+ setAppropriate( layoutPage, FALSE );
+ checkBoxAutoEdit->setChecked( FALSE );
+ } else if ( ::qt_cast<QDataBrowser*>(widget) ) {
+ setCaption( "Data Browser Wizard" );
+ setAppropriate( tablePropertiesPage, FALSE );
+ mode = Browser;
+ checkBoxAutoEdit->setChecked( TRUE );
+ } else if ( ::qt_cast<QDataView*>(widget) ) {
+ setCaption( "Data View Wizard" );
+ setAppropriate( tablePropertiesPage, FALSE );
+ setAppropriate( navigPage, FALSE );
+ setAppropriate( sqlPage, FALSE);
+ checkCreateFieldLayout->hide();
+ checkCreateButtonLayout->hide();
+ checkBoxAutoEdit->hide();
+ mode = View;
+ }
+
+ connect( nextButton(), SIGNAL(clicked()), SLOT(nextPageClicked()) );
+ setupPage1();
+}
+
+
+SqlFormWizard::~SqlFormWizard()
+{
+ appIface->release();
+}
+
+void SqlFormWizard::nextPageClicked()
+{
+ if ( currentPage() == populatePage ) {
+ autoPopulate( TRUE );
+ }
+}
+
+void SqlFormWizard::connectionSelected( const QString &c )
+{
+ if ( !appIface )
+ return;
+
+ DesignerProject *proIface = (DesignerProject*)( (DesignerInterface*)appIface )->currentProject();
+ if ( !proIface )
+ return;
+
+ listBoxTable->clear();
+ QPtrList<DesignerDatabase> databases = proIface->databaseConnections();
+ for ( DesignerDatabase *d = databases.first(); d; d = databases.next() ) {
+ if ( d->name() == c || ( d->name() == "(default)" || d->name().isEmpty() ) && c == "(default)")
+ listBoxTable->insertStringList( d->tables() );
+ }
+ setNextEnabled( databasePage, ( listBoxTable->currentItem() >= 0 ) );
+}
+
+void SqlFormWizard::tableSelected( const QString & )
+{
+ if ( listBoxTable->currentItem() >= 0 ) {
+ setNextEnabled( databasePage, TRUE );
+ } else {
+ setNextEnabled( databasePage, FALSE );
+ }
+
+}
+
+void SqlFormWizard::autoPopulate( bool populate )
+{
+ DesignerProject *proIface = (DesignerProject*)( (DesignerInterface*)appIface )->currentProject();
+ if ( !proIface )
+ return;
+ QPtrList<DesignerDatabase> databases = proIface->databaseConnections();
+ listBoxField->clear();
+ listBoxSortField->clear();
+ listBoxSelectedField->clear();
+ if ( populate ) {
+ for ( DesignerDatabase *d = databases.first(); d; d = databases.next() ) {
+ if ( d->name() == listBoxConnection->currentText() ||
+ ( ( d->name() == "(default)" || d->name().isEmpty() ) &&
+ listBoxConnection->currentText() == "(default)" ) ) {
+ QStringList lst = *d->fields().find( listBoxTable->currentText() );
+ // remove primary index fields, if any
+ listBoxSortField->insertStringList( lst );
+ d->open( FALSE );
+#ifndef QT_NO_SQL
+ QSqlCursor tab( listBoxTable->currentText(), TRUE, d->connection() );
+ QSqlIndex pIdx = tab.primaryIndex();
+ for ( uint i = 0; i < pIdx.count(); i++ ) {
+ listBoxField->insertItem( pIdx.field( i )->name() );
+ lst.remove( pIdx.field( i )->name() );
+ }
+#endif
+ d->close();
+ listBoxSelectedField->insertStringList( lst );
+ }
+ }
+ }
+}
+
+void SqlFormWizard::fieldDown()
+{
+ if ( listBoxSelectedField->currentItem() == -1 ||
+ listBoxSelectedField->currentItem() == (int)listBoxSelectedField->count() - 1 ||
+ listBoxSelectedField->count() < 2 )
+ return;
+ int index = listBoxSelectedField->currentItem() + 1;
+ QListBoxItem *i = listBoxSelectedField->item( listBoxSelectedField->currentItem() );
+ listBoxSelectedField->takeItem( i );
+ listBoxSelectedField->insertItem( i, index );
+ listBoxSelectedField->setCurrentItem( i );
+}
+
+void SqlFormWizard::fieldUp()
+{
+ if ( listBoxSelectedField->currentItem() <= 0 ||
+ listBoxSelectedField->count() < 2 )
+ return;
+ int index = listBoxSelectedField->currentItem() - 1;
+ QListBoxItem *i = listBoxSelectedField->item( listBoxSelectedField->currentItem() );
+ listBoxSelectedField->takeItem( i );
+ listBoxSelectedField->insertItem( i, index );
+ listBoxSelectedField->setCurrentItem( i );
+}
+
+void SqlFormWizard::removeField()
+{
+ int i = listBoxSelectedField->currentItem();
+ if ( i != -1 ) {
+ listBoxField->insertItem( listBoxSelectedField->currentText() );
+ listBoxSelectedField->removeItem( i );
+ }
+}
+
+void SqlFormWizard::addField()
+{
+ int i = listBoxField->currentItem();
+ if ( i == -1 )
+ return;
+ QString f = listBoxField->currentText();
+ if ( !f.isEmpty() )
+ listBoxSelectedField->insertItem( f );
+ listBoxField->removeItem( i );
+}
+
+void SqlFormWizard::addSortField()
+{
+ int i = listBoxSortField->currentItem();
+ if ( i == -1 )
+ return;
+ QString f = listBoxSortField->currentText();
+ if ( !f.isEmpty() )
+ listBoxSortedField->insertItem( f + " ASC" );
+}
+
+void SqlFormWizard::reSortSortField()
+{
+ int i = listBoxSortedField->currentItem();
+ if ( i != -1 ) {
+ QString text = listBoxSortedField->currentText();
+ if ( text.mid( text.length() - 3 ) == "ASC" )
+ text = text.mid( 0, text.length() - 3 ) + "DESC";
+ else if ( text.mid( text.length() - 4 ) == "DESC" )
+ text = text.mid( 0, text.length() - 4 ) + "ASC";
+ listBoxSortedField->removeItem( i );
+ listBoxSortedField->insertItem( text, i );
+ listBoxSortedField->setCurrentItem( i );
+ }
+}
+
+void SqlFormWizard::removeSortField()
+{
+ int i = listBoxSortedField->currentItem();
+ if ( i != -1 ) {
+ listBoxSortedField->removeItem( i );
+ }
+}
+
+void SqlFormWizard::sortFieldUp()
+{
+ if ( listBoxSortedField->currentItem() <= 0 ||
+ listBoxSortedField->count() < 2 )
+ return;
+ int index = listBoxSortedField->currentItem() - 1;
+ QListBoxItem *i = listBoxSortedField->item( listBoxSortedField->currentItem() );
+ listBoxSortedField->takeItem( i );
+ listBoxSortedField->insertItem( i, index );
+ listBoxSortedField->setCurrentItem( i );
+}
+
+void SqlFormWizard::sortFieldDown()
+{
+ if ( listBoxSortedField->currentItem() == -1 ||
+ listBoxSortedField->currentItem() == (int)listBoxSortedField->count() - 1 ||
+ listBoxSortedField->count() < 2 )
+ return;
+ int index = listBoxSortedField->currentItem() + 1;
+ QListBoxItem *i = listBoxSortedField->item( listBoxSortedField->currentItem() );
+ listBoxSortedField->takeItem( i );
+ listBoxSortedField->insertItem( i, index );
+ listBoxSortedField->setCurrentItem( i );
+}
+
+void SqlFormWizard::setupDatabaseConnections()
+{
+ if ( !appIface )
+ return;
+
+ DesignerProject *proIface = (DesignerProject*)( (DesignerInterface*)appIface )->currentProject();
+ if ( !proIface )
+ return;
+ proIface->setupDatabases();
+ raise();
+ setupPage1();
+}
+
+void SqlFormWizard::setupPage1()
+{
+ if ( !appIface )
+ return;
+
+ DesignerProject *proIface = (DesignerProject*)( (DesignerInterface*)appIface )->currentProject();
+ if ( !proIface )
+ return;
+
+ listBoxTable->clear();
+ listBoxConnection->clear();
+ QPtrList<DesignerDatabase> databases = proIface->databaseConnections();
+ QStringList lst;
+ for ( DesignerDatabase *d = databases.first(); d; d = databases.next() )
+ lst << d->name();
+ listBoxConnection->insertStringList( lst );
+ if ( lst.count() )
+ listBoxConnection->setCurrentItem( 0 );
+
+ setNextEnabled( databasePage, FALSE );
+}
+
+static QPushButton *create_widget( QWidget *parent, const char *name,
+ const QString &txt, const QRect &r, DesignerFormWindow *fw )
+{
+ QPushButton *pb = (QPushButton*)fw->create( "QPushButton", parent, name );
+ pb->setText( txt );
+ pb->setGeometry( r );
+ fw->setPropertyChanged( pb, "text", TRUE );
+ fw->setPropertyChanged( pb, "geometry", TRUE );
+ return pb;
+}
+
+void SqlFormWizard::accept()
+{
+ if ( !appIface || mode == None )
+ return;
+
+#ifndef QT_NO_SQL
+ DesignerProject *proIface = (DesignerProject*)( (DesignerInterface*)appIface )->currentProject();
+ if ( !widget || !proIface ) {
+ SqlFormWizardBase::accept();
+ return;
+ }
+
+ QString conn = listBoxConnection->currentText();
+ QString table = listBoxTable->currentText();
+ QStringList lst;
+ lst << conn << table;
+
+ if ( !conn.isEmpty() && !table.isEmpty() ) {
+ formWindow->setProperty( widget, "database", lst );
+ formWindow->setPropertyChanged( widget, "database", TRUE );
+ }
+
+ if ( !editFilter->text().isEmpty() ) {
+ widget->setProperty( "filter", editFilter->text() );
+ formWindow->setPropertyChanged( widget, "filter", TRUE );
+ }
+
+ if ( listBoxSortedField->count() ) {
+ QStringList lst;
+ for ( uint i = 0; i < listBoxSortedField->count(); ++i )
+ lst << listBoxSortedField->text( i );
+ widget->setProperty( "sort", lst );
+ formWindow->setPropertyChanged( widget, "sort", TRUE );
+ }
+
+ QPtrList<DesignerDatabase> databases = proIface->databaseConnections();
+ DesignerDatabase *database = 0;
+ for ( DesignerDatabase *d = databases.first(); d; d = databases.next() ) {
+ if ( d->name() == listBoxConnection->currentText() || ( d->name() == "(default)" || d->name().isEmpty() ) && listBoxConnection->currentText() == "(default)" ) {
+ database = d;
+ d->open( FALSE );
+ break;
+ }
+ }
+
+ if (!database) {
+ return;
+ }
+ QSqlCursor tab( listBoxTable->currentText(), TRUE, database->connection() );
+ int columns = 2;
+
+ QSqlEditorFactory * f = QSqlEditorFactory::defaultFactory();
+
+ QWidget * editorDummy;
+ QWidget * editor;
+ QLabel * label;
+
+ int visibleFields = listBoxSelectedField->count();
+ int numPerColumn = visibleFields / columns;
+ if( (visibleFields % columns) > 0)
+ numPerColumn++;
+
+ int row = 0;
+ const int SPACING = 25;
+ const int COL_SPACING = SPACING*9;
+
+ uint j;
+ switch ( mode ) {
+ case None:
+ break;
+ case View:
+ case Browser: {
+
+ if ( mode == Browser && !checkBoxAutoEdit->isChecked() ) {
+ ((QDataBrowser*)widget)->setAutoEdit( FALSE );
+ formWindow->setPropertyChanged( widget, "autoEdit", TRUE );
+ }
+
+ formWindow->clearSelection();
+ bool createFieldLayout = checkCreateFieldLayout->isChecked();
+ bool createButtonLayout = checkCreateButtonLayout->isChecked();
+ bool createLayouts = checkCreateLayouts->isChecked();
+ bool labelAbove = radioLabelsTop->isOn();
+ uint numCols = spinNumberOfColumns->text().toInt();
+ uint currentCol = 0;
+ uint fieldsPerCol = listBoxSelectedField->count();
+ uint fieldsInCol = 0;
+ if ( listBoxSelectedField->count() )
+ fieldsPerCol = listBoxSelectedField->count() / numCols;
+ /* labels and data field editors */
+ for( j = 0; j < listBoxSelectedField->count(); j++ ){
+
+ QSqlField* field = tab.field( listBoxSelectedField->text( j ) );
+ if ( !field )
+ continue;
+
+ /* label */
+ QString labelName = field->name();
+ labelName = labelName.mid(0,1).upper() + labelName.mid(1);
+ label = (QLabel*)formWindow->create( "QLabel", widget,
+ QString( "label" + labelName ) );
+ label->setText( labelName );
+ label->setGeometry( SPACING + currentCol*COL_SPACING, row+SPACING,
+ SPACING*3, SPACING );
+
+ formWindow->setPropertyChanged( label, "geometry", TRUE );
+ formWindow->setPropertyChanged( label, "text", TRUE );
+
+ /* editor */
+ editorDummy = f->createEditor( widget, field );
+ editor = formWindow->create( editorDummy->className(), widget,
+ QString( QString( editorDummy->className() )
+ + labelName) );
+ delete editorDummy;
+ if ( labelAbove ) {
+ row += SPACING;
+ editor->setGeometry(SPACING + currentCol*COL_SPACING, row+SPACING,
+ SPACING*3, SPACING );
+ } else {
+ editor->setGeometry(SPACING * 5 + currentCol*COL_SPACING, row+SPACING,
+ SPACING*3, SPACING );
+ }
+ formWindow->setPropertyChanged( editor, "geometry", TRUE );
+ if ( QString(editor->className()) == "QLineEdit" &&
+ (field->type() == QVariant::Double ||
+ field->type() == QVariant::Int ||
+ field->type() == QVariant::UInt ) ) {
+ /* default right-align numerics */
+ //##
+ ((QLineEdit*)editor)->setAlignment( Qt::AlignRight );
+ formWindow->setPropertyChanged( editor, "alignment", TRUE );
+ }
+ if ( ::qt_cast<QSpinBox*>(editor) ) {
+ ( (QSpinBox*)editor )->setMaxValue( INT_MAX );
+ formWindow->setPropertyChanged( editor, "maxValue", TRUE );
+ }
+ QStringList lst;
+ lst << conn << table << field->name();
+ formWindow->setProperty( editor, "database", lst );
+ formWindow->setPropertyChanged( editor, "database", TRUE );
+
+ /* geometry */
+ if ( createFieldLayout ) {
+ formWindow->selectWidget( label );
+ formWindow->selectWidget( editor );
+ }
+
+ row += SPACING + 5;
+ fieldsInCol++;
+ if ( ( fieldsInCol >= fieldsPerCol ) && ( currentCol < numCols-1 ) ) {
+ currentCol++;
+ fieldsInCol = 0;
+ row = 0;
+ }
+ }
+
+ if ( listBoxSelectedField->count() ) {
+ if ( createFieldLayout )
+ formWindow->layoutG();
+ row += SPACING;
+ }
+
+ if ( mode == Browser ) {
+ if ( checkBoxNavig->isChecked() ) {
+ formWindow->clearSelection();
+ currentCol = 0;
+ if ( checkBoxFirst->isChecked() ) {
+ QPushButton *pb = create_widget( widget, "PushButtonFirst",
+ "|< &First",
+ QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ),
+ formWindow );
+ formWindow->addConnection( pb, "clicked()", widget, "first()" );
+ formWindow->addConnection( widget, "firstRecordAvailable( bool )",
+ pb, "setEnabled( bool )" );
+ currentCol++;
+ formWindow->selectWidget( pb );
+ }
+ if ( checkBoxPrev->isChecked() ) {
+ QPushButton *pb = create_widget( widget, "PushButtonPrev",
+ "<< &Prev",
+ QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ),
+ formWindow );
+ formWindow->addConnection( pb, "clicked()", widget, "prev()" );
+ formWindow->addConnection( widget, "prevRecordAvailable( bool )",
+ pb, "setEnabled( bool )" );
+ currentCol++;
+ formWindow->selectWidget( pb );
+ }
+ if ( checkBoxNext->isChecked() ) {
+ QPushButton *pb = create_widget( widget, "PushButtonNext",
+ "&Next >>",
+ QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ),
+ formWindow );
+ formWindow->addConnection( pb, "clicked()", widget, "next()" );
+ formWindow->addConnection( widget, "nextRecordAvailable( bool )", pb,
+ "setEnabled( bool )" );
+ currentCol++;
+ formWindow->selectWidget( pb );
+ }
+ if ( checkBoxLast->isChecked() ) {
+ QPushButton *pb = create_widget( widget, "PushButtonLast", "&Last >|",
+ QRect( 3 * SPACING * currentCol, row+SPACING, SPACING*3, SPACING ), formWindow );
+ formWindow->addConnection( pb, "clicked()", widget, "last()" );
+ formWindow->addConnection( widget, "lastRecordAvailable( bool )", pb,
+ "setEnabled( bool )" );
+ currentCol++;
+ formWindow->selectWidget( pb );
+ }
+ if ( createButtonLayout )
+ formWindow->layoutH();
+ }
+ if ( checkBoxEdit->isChecked() ) {
+ formWindow->clearSelection();
+ row += SPACING;
+ currentCol = 0;
+ if ( checkBoxInsert->isChecked() ) {
+ QPushButton *pb = create_widget( widget, "PushButtonInsert", "&Insert",
+ QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ), formWindow );
+ formWindow->addConnection( pb, "clicked()", widget, "insert()" );
+ currentCol++;
+ formWindow->selectWidget( pb );
+ }
+ if ( checkBoxUpdate->isChecked() ) {
+ QPushButton *pb = create_widget( widget, "PushButtonUpdate", "&Update",
+ QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ), formWindow );
+ formWindow->addConnection( pb, "clicked()", widget, "update()" );
+ currentCol++;
+ formWindow->selectWidget( pb );
+ }
+ if ( checkBoxDelete->isChecked() ) {
+ QPushButton *pb = create_widget( widget, "PushButtonDelete", "&Delete",
+ QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ), formWindow );
+ formWindow->addConnection( pb, "clicked()", widget, "del()" );
+ currentCol++;
+ formWindow->selectWidget( pb );
+ }
+ if ( createButtonLayout )
+ formWindow->layoutH();
+ }
+ }
+ if ( createLayouts )
+ formWindow->layoutGContainer( widget );
+ formWindow->clearSelection();
+ break;
+ }
+ case Table:
+ {
+ QDataTable* sqlTable = ((QDataTable*)widget);
+ if ( checkBoxAutoEdit->isChecked() ) {
+ sqlTable->setAutoEdit( TRUE );
+ formWindow->setPropertyChanged( sqlTable, "autoEdit", TRUE );
+ }
+
+ if ( checkBoxReadOnly->isChecked() ) {
+ sqlTable->setReadOnly( TRUE );
+ formWindow->setPropertyChanged( sqlTable, "readOnly", TRUE );
+ } else {
+ if ( checkBoxConfirmInserts->isChecked() ) {
+ sqlTable->setConfirmInsert( TRUE );
+ formWindow->setPropertyChanged( sqlTable, "confirmInsert", TRUE );
+ }
+ if ( checkBoxConfirmUpdates->isChecked() ) {
+ sqlTable->setConfirmUpdate( TRUE );
+ formWindow->setPropertyChanged( sqlTable, "confirmUpdate", TRUE );
+ }
+ if ( checkBoxConfirmDeletes->isChecked() ) {
+ sqlTable->setConfirmDelete( TRUE );
+ formWindow->setPropertyChanged( sqlTable, "confirmDelete", TRUE );
+ }
+ if ( checkBoxConfirmCancels->isChecked() ) {
+ sqlTable->setConfirmCancels( TRUE );
+ formWindow->setPropertyChanged( sqlTable, "confirmCancels", TRUE );
+ }
+ }
+ if ( checkBoxSorting->isChecked() ) {
+ sqlTable->setSorting( TRUE );
+ formWindow->setPropertyChanged( sqlTable, "sorting", TRUE );
+ }
+
+ QMap<QString, QString> columnFields;
+ sqlTable->setNumCols( listBoxSelectedField->count() ); // no need to change property through mdbIface here, since QDataTable doesn't offer that through Designer
+ for( j = 0; j < listBoxSelectedField->count(); j++ ){
+
+ QSqlField* field = tab.field( listBoxSelectedField->text( j ) );
+ if ( !field )
+ continue;
+
+ QString labelName = field->name();
+ labelName = labelName.mid(0,1).upper() + labelName.mid(1);
+
+ ((QTable*)widget)->horizontalHeader()->setLabel( j, labelName );
+
+ columnFields.insert( labelName, field->name() );
+ }
+ formWindow->setColumnFields( widget, columnFields );
+ break;
+ }
+ }
+
+ database->close();
+#endif
+
+ SqlFormWizardBase::accept();
+}
diff --git a/tools/designer/plugins/wizards/sqlformwizardimpl.h b/tools/designer/plugins/wizards/sqlformwizardimpl.h
new file mode 100644
index 0000000..c82a86e
--- /dev/null
+++ b/tools/designer/plugins/wizards/sqlformwizardimpl.h
@@ -0,0 +1,87 @@
+ /**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef SQLFORMWIZARDIMPL_H
+#define SQLFORMWIZARDIMPL_H
+
+#include "sqlformwizard.h"
+#include <templatewizardiface.h>
+#include <designerinterface.h>
+#include <qvaluelist.h>
+
+class SqlFormWizard : public SqlFormWizardBase
+{
+ Q_OBJECT
+
+public:
+ SqlFormWizard( QUnknownInterface *aIface, QWidget *w, QWidget* parent = 0, DesignerFormWindow *fw = 0,
+ const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~SqlFormWizard();
+
+ void accept() const;
+
+protected slots:
+ void connectionSelected( const QString & );
+ void tableSelected( const QString & );
+ void autoPopulate( bool populate );
+ void fieldDown();
+ void fieldUp();
+ void removeField();
+ void addField();
+ void setupDatabaseConnections();
+ void accept();
+ void addSortField();
+ void reSortSortField();
+ void removeSortField();
+ void sortFieldUp();
+ void sortFieldDown();
+ void nextPageClicked();
+
+private:
+ void setupPage1();
+
+private:
+ QWidget *widget;
+ QUnknownInterface *appIface;
+ DesignerFormWindow *formWindow;
+ enum Mode {
+ None,
+ View,
+ Browser,
+ Table
+ };
+ Mode mode;
+
+};
+
+#endif // SQLFORMWIZARDIMPL_H
diff --git a/tools/designer/plugins/wizards/wizards.pro b/tools/designer/plugins/wizards/wizards.pro
new file mode 100644
index 0000000..1e50693
--- /dev/null
+++ b/tools/designer/plugins/wizards/wizards.pro
@@ -0,0 +1,21 @@
+TEMPLATE = lib
+CONFIG += qt warn_on release plugin
+
+SOURCES += main.cpp
+FORMS = sqlformwizard.ui mainwindowwizard.ui
+
+sql {
+ HEADERS += sqlformwizardimpl.h
+ SOURCES += sqlformwizardimpl.cpp
+ }
+DESTDIR = ../../../../plugins/designer
+
+PROJECTNAME = Wizards
+IMAGES = images/qtwizards_menu_1.png images/qtwizards_menu_2.png images/qtwizards_menu_3.png images/qtwizards_table_1.png images/qtwizards_table_2.png images/qtwizards_table_3.png images/qtwizards_table_4.png images/re-sort.png images/small/editcopy.png images/small/editcut.png images/small/editpaste.png images/small/filenew.png images/small/fileopen.png images/small/filesave.png images/small/print.png images/small/redo.png images/small/searchfind.png images/small/undo.png
+INCLUDEPATH += ../../interfaces
+DBFILE = wizards.db
+LANGUAGE = C++
+
+
+target.path += $$plugins.path/designer
+INSTALLS += target
diff --git a/tools/designer/shared/domtool.cpp b/tools/designer/shared/domtool.cpp
new file mode 100644
index 0000000..51796e1
--- /dev/null
+++ b/tools/designer/shared/domtool.cpp
@@ -0,0 +1,460 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "domtool.h"
+
+#include <qsizepolicy.h>
+#include <qcolor.h>
+#include <qcursor.h>
+#include <qdatetime.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qfont.h>
+#include <qdom.h>
+
+/*!
+ \class DomTool domtool.h
+ \brief Tools for the dom
+
+ A collection of static functions used by Resource (part of the
+ designer) and Uic.
+
+*/
+
+/*!
+ Returns the contents of property \a name of object \a e as
+ variant or the variant passed as \a defValue if the property does
+ not exist.
+
+ \sa hasProperty()
+*/
+QVariant DomTool::readProperty( const QDomElement& e, const QString& name, const QVariant& defValue, QString& comment )
+{
+ QDomElement n;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "property" ) {
+ if ( n.attribute( "name" ) != name )
+ continue;
+ return elementToVariant( n.firstChild().toElement(), defValue, comment );
+ }
+ }
+ return defValue;
+}
+
+
+/*!
+ \overload
+ */
+QVariant DomTool::readProperty( const QDomElement& e, const QString& name, const QVariant& defValue )
+{
+ QString comment;
+ return readProperty( e, name, defValue, comment );
+}
+
+/*!
+ Returns wheter object \a e defines property \a name or not.
+
+ \sa readProperty()
+ */
+bool DomTool::hasProperty( const QDomElement& e, const QString& name )
+{
+ QDomElement n;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "property" ) {
+ if ( n.attribute( "name" ) != name )
+ continue;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+QStringList DomTool::propertiesOfType( const QDomElement& e, const QString& type )
+{
+ QStringList result;
+ QDomElement n;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "property" ) {
+ QDomElement n2 = n.firstChild().toElement();
+ if ( n2.tagName() == type )
+ result += n.attribute( "name" );
+ }
+ }
+ return result;
+}
+
+
+QVariant DomTool::elementToVariant( const QDomElement& e, const QVariant& defValue )
+{
+ QString dummy;
+ return elementToVariant( e, defValue, dummy );
+}
+
+/*!
+ Interprets element \a e as variant and returns the result of the interpretation.
+ */
+QVariant DomTool::elementToVariant( const QDomElement& e, const QVariant& defValue, QString &comment )
+{
+ QVariant v;
+ if ( e.tagName() == "rect" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int x = 0, y = 0, w = 0, h = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "x" )
+ x = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "y" )
+ y = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "width" )
+ w = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "height" )
+ h = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = QVariant( QRect( x, y, w, h ) );
+ } else if ( e.tagName() == "point" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int x = 0, y = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "x" )
+ x = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "y" )
+ y = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = QVariant( QPoint( x, y ) );
+ } else if ( e.tagName() == "size" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int w = 0, h = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "width" )
+ w = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "height" )
+ h = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = QVariant( QSize( w, h ) );
+ } else if ( e.tagName() == "color" ) {
+ v = QVariant( readColor( e ) );
+ } else if ( e.tagName() == "font" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ QFont f( defValue.toFont() );
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "family" )
+ f.setFamily( n3.firstChild().toText().data() );
+ else if ( n3.tagName() == "pointsize" )
+ f.setPointSize( n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "bold" )
+ f.setBold( n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "italic" )
+ f.setItalic( n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "underline" )
+ f.setUnderline( n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "strikeout" )
+ f.setStrikeOut( n3.firstChild().toText().data().toInt() );
+ n3 = n3.nextSibling().toElement();
+ }
+ v = QVariant( f );
+ } else if ( e.tagName() == "string" ) {
+ v = QVariant( e.firstChild().toText().data() );
+ QDomElement n = e;
+ n = n.nextSibling().toElement();
+ if ( n.tagName() == "comment" )
+ comment = n.firstChild().toText().data();
+ } else if ( e.tagName() == "cstring" ) {
+ v = QVariant( QCString( e.firstChild().toText().data() ) );
+ } else if ( e.tagName() == "number" ) {
+ bool ok = TRUE;
+ v = QVariant( e.firstChild().toText().data().toInt( &ok ) );
+ if ( !ok )
+ v = QVariant( e.firstChild().toText().data().toDouble() );
+ } else if ( e.tagName() == "bool" ) {
+ QString t = e.firstChild().toText().data();
+ v = QVariant( t == "true" || t == "1", 0 );
+ } else if ( e.tagName() == "pixmap" ) {
+ v = QVariant( e.firstChild().toText().data() );
+ } else if ( e.tagName() == "iconset" ) {
+ v = QVariant( e.firstChild().toText().data() );
+ } else if ( e.tagName() == "image" ) {
+ v = QVariant( e.firstChild().toText().data() );
+ } else if ( e.tagName() == "enum" ) {
+ v = QVariant( e.firstChild().toText().data() );
+ } else if ( e.tagName() == "set" ) {
+ v = QVariant( e.firstChild().toText().data() );
+ } else if ( e.tagName() == "sizepolicy" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ QSizePolicy sp;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "hsizetype" )
+ sp.setHorData( (QSizePolicy::SizeType)n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "vsizetype" )
+ sp.setVerData( (QSizePolicy::SizeType)n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "horstretch" )
+ sp.setHorStretch( n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "verstretch" )
+ sp.setVerStretch( n3.firstChild().toText().data().toInt() );
+ n3 = n3.nextSibling().toElement();
+ }
+ v = QVariant( sp );
+ } else if ( e.tagName() == "cursor" ) {
+ v = QVariant( QCursor( e.firstChild().toText().data().toInt() ) );
+ } else if ( e.tagName() == "stringlist" ) {
+ QStringList lst;
+ QDomElement n;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() )
+ lst << n.firstChild().toText().data();
+ v = QVariant( lst );
+ } else if ( e.tagName() == "date" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int y, m, d;
+ y = m = d = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "year" )
+ y = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "month" )
+ m = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "day" )
+ d = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = QVariant( QDate( y, m, d ) );
+ } else if ( e.tagName() == "time" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int h, m, s;
+ h = m = s = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "hour" )
+ h = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "minute" )
+ m = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "second" )
+ s = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = QVariant( QTime( h, m, s ) );
+ } else if ( e.tagName() == "datetime" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int h, mi, s, y, mo, d ;
+ h = mi = s = y = mo = d = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "hour" )
+ h = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "minute" )
+ mi = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "second" )
+ s = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "year" )
+ y = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "month" )
+ mo = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "day" )
+ d = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = QVariant( QDateTime( QDate( y, mo, d ), QTime( h, mi, s ) ) );
+ }
+ return v;
+}
+
+
+/*! Returns the color which is returned in the dom element \a e.
+ */
+
+QColor DomTool::readColor( const QDomElement &e )
+{
+ QDomElement n = e.firstChild().toElement();
+ int r= 0, g = 0, b = 0;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "red" )
+ r = n.firstChild().toText().data().toInt();
+ else if ( n.tagName() == "green" )
+ g = n.firstChild().toText().data().toInt();
+ else if ( n.tagName() == "blue" )
+ b = n.firstChild().toText().data().toInt();
+ n = n.nextSibling().toElement();
+ }
+
+ return QColor( r, g, b );
+}
+
+/*!
+ Returns the contents of attribute \a name of object \a e as
+ variant or the variant passed as \a defValue if the attribute does
+ not exist.
+
+ \sa hasAttribute()
+ */
+QVariant DomTool::readAttribute( const QDomElement& e, const QString& name, const QVariant& defValue, QString& comment )
+{
+ QDomElement n;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "attribute" ) {
+ if ( n.attribute( "name" ) != name )
+ continue;
+ return elementToVariant( n.firstChild().toElement(), defValue, comment );
+ }
+ }
+ return defValue;
+}
+
+/*!
+ \overload
+*/
+QVariant DomTool::readAttribute( const QDomElement& e, const QString& name, const QVariant& defValue )
+{
+ QString comment;
+ return readAttribute( e, name, defValue, comment );
+}
+
+/*!
+ Returns wheter object \a e defines attribute \a name or not.
+
+ \sa readAttribute()
+ */
+bool DomTool::hasAttribute( const QDomElement& e, const QString& name )
+{
+ QDomElement n;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "attribute" ) {
+ if ( n.attribute( "name" ) != name )
+ continue;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool toBool( const QString& s )
+{
+ return s == "true" || s.toInt() != 0;
+}
+
+/*!
+ Convert Qt 2.x format to Qt 3.0 format if necessary
+*/
+void DomTool::fixDocument( QDomDocument& doc )
+{
+ QDomElement e;
+ QDomNode n;
+ QDomNodeList nl;
+ int i = 0;
+
+ e = doc.firstChild().toElement();
+ if ( e.tagName() != "UI" )
+ return;
+
+ // latest version, don't do anything
+ if ( e.hasAttribute("version") && e.attribute("version").toDouble() > 3.0 )
+ return;
+
+ nl = doc.elementsByTagName( "property" );
+
+ // in 3.0, we need to fix a spelling error
+ if ( e.hasAttribute("version") && e.attribute("version").toDouble() == 3.0 ) {
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QDomElement el = nl.item(i).toElement();
+ QString s = el.attribute( "name" );
+ if ( s == "resizeable" ) {
+ el.removeAttribute( "name" );
+ el.setAttribute( "name", "resizable" );
+ }
+ }
+ return;
+ }
+
+
+ // in versions smaller than 3.0 we need to change more
+ e.setAttribute( "version", 3.0 );
+
+ e.setAttribute("stdsetdef", 1 );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ e = nl.item(i).toElement();
+ QString name;
+ QDomElement n2 = e.firstChild().toElement();
+ if ( n2.tagName() == "name" ) {
+ name = n2.firstChild().toText().data();
+ if ( name == "resizeable" )
+ e.setAttribute( "name", "resizable" );
+ else
+ e.setAttribute( "name", name );
+ e.removeChild( n2 );
+ }
+ bool stdset = toBool( e.attribute( "stdset" ) );
+ if ( stdset || name == "toolTip" || name == "whatsThis" ||
+ name == "buddy" ||
+ e.parentNode().toElement().tagName() == "item" ||
+ e.parentNode().toElement().tagName() == "spacer" ||
+ e.parentNode().toElement().tagName() == "column"
+ )
+ e.removeAttribute( "stdset" );
+ else
+ e.setAttribute( "stdset", 0 );
+ }
+
+ nl = doc.elementsByTagName( "attribute" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ e = nl.item(i).toElement();
+ QString name;
+ QDomElement n2 = e.firstChild().toElement();
+ if ( n2.tagName() == "name" ) {
+ name = n2.firstChild().toText().data();
+ e.setAttribute( "name", name );
+ e.removeChild( n2 );
+ }
+ }
+
+ nl = doc.elementsByTagName( "image" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ e = nl.item(i).toElement();
+ QString name;
+ QDomElement n2 = e.firstChild().toElement();
+ if ( n2.tagName() == "name" ) {
+ name = n2.firstChild().toText().data();
+ e.setAttribute( "name", name );
+ e.removeChild( n2 );
+ }
+ }
+
+ nl = doc.elementsByTagName( "widget" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ e = nl.item(i).toElement();
+ QString name;
+ QDomElement n2 = e.firstChild().toElement();
+ if ( n2.tagName() == "class" ) {
+ name = n2.firstChild().toText().data();
+ e.setAttribute( "class", name );
+ e.removeChild( n2 );
+ }
+ }
+
+}
+
diff --git a/tools/designer/shared/domtool.h b/tools/designer/shared/domtool.h
new file mode 100644
index 0000000..4fa561c
--- /dev/null
+++ b/tools/designer/shared/domtool.h
@@ -0,0 +1,60 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef DOMTOOL_H
+#define DOMTOOL_H
+
+#include <qvariant.h>
+#include <qnamespace.h>
+
+class QDomElement;
+class QDomDocument;
+
+class DomTool : public Qt
+{
+public:
+ static QVariant readProperty( const QDomElement& e, const QString& name, const QVariant& defValue );
+ static QVariant readProperty( const QDomElement& e, const QString& name, const QVariant& defValue, QString& comment );
+ static bool hasProperty( const QDomElement& e, const QString& name );
+ static QStringList propertiesOfType( const QDomElement& e, const QString& type );
+ static QVariant elementToVariant( const QDomElement& e, const QVariant& defValue );
+ static QVariant elementToVariant( const QDomElement& e, const QVariant& defValue, QString &comment );
+ static QVariant readAttribute( const QDomElement& e, const QString& name, const QVariant& defValue );
+ static QVariant readAttribute( const QDomElement& e, const QString& name, const QVariant& defValue, QString& comment );
+ static bool hasAttribute( const QDomElement& e, const QString& name );
+ static QColor readColor( const QDomElement &e );
+ static void fixDocument( QDomDocument& );
+};
+
+
+#endif // DOMTOOL_H
diff --git a/tools/designer/shared/globaldefs.h b/tools/designer/shared/globaldefs.h
new file mode 100644
index 0000000..09be46e
--- /dev/null
+++ b/tools/designer/shared/globaldefs.h
@@ -0,0 +1,69 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef GLOBALDEFS_H
+#define GLOBALDEFS_H
+
+#include <qcolor.h>
+#include <qapplication.h>
+
+#define BOXLAYOUT_DEFAULT_MARGIN 11
+#define BOXLAYOUT_DEFAULT_SPACING 6
+
+#ifndef NO_STATIC_COLORS
+static QColor *backColor1 = 0;
+static QColor *backColor2 = 0;
+static QColor *selectedBack = 0;
+
+static void init_colors()
+{
+ if ( backColor1 )
+ return;
+
+#if 0 // a calculated alternative for backColor1
+ QColorGroup myCg = qApp->palette().active();
+ int h1, s1, v1;
+ int h2, s2, v2;
+ myCg.color( QColorGroup::Base ).hsv( &h1, &s1, &v1 );
+ myCg.color( QColorGroup::Background ).hsv( &h2, &s2, &v2 );
+ QColor c( h1, s1, ( v1 + v2 ) / 2, QColor::Hsv );
+#endif
+
+ backColor1 = new QColor( 250, 248, 235 );
+ backColor2 = new QColor( 255, 255, 255 );
+ selectedBack = new QColor( 230, 230, 230 );
+}
+
+#endif
+
+#endif
diff --git a/tools/designer/shared/parser.cpp b/tools/designer/shared/parser.cpp
new file mode 100644
index 0000000..dbc3816
--- /dev/null
+++ b/tools/designer/shared/parser.cpp
@@ -0,0 +1,79 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "parser.h"
+#include <qobject.h>
+#include <qstringlist.h>
+
+class NormalizeObject : public QObject
+{
+public:
+ NormalizeObject() : QObject() {}
+ static QCString normalizeSignalSlot( const char *signalSlot ) { return QObject::normalizeSignalSlot( signalSlot ); }
+};
+
+QString Parser::cleanArgs( const QString &func )
+{
+ QString slot( func );
+ int begin = slot.find( "(" ) + 1;
+ QString args = slot.mid( begin );
+ args = args.left( args.find( ")" ) );
+ QStringList lst = QStringList::split( ',', args );
+ QString res = slot.left( begin );
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ if ( it != lst.begin() )
+ res += ",";
+ QString arg = *it;
+ int pos = 0;
+ if ( ( pos = arg.find( "&" ) ) != -1 ) {
+ arg = arg.left( pos + 1 );
+ } else if ( ( pos = arg.find( "*" ) ) != -1 ) {
+ arg = arg.left( pos + 1 );
+ } else {
+ arg = arg.simplifyWhiteSpace();
+ if ( ( pos = arg.find( ':' ) ) != -1 )
+ arg = arg.left( pos ).simplifyWhiteSpace() + ":" + arg.mid( pos + 1 ).simplifyWhiteSpace();
+ QStringList l = QStringList::split( ' ', arg );
+ if ( l.count() == 2 ) {
+ if ( l[ 0 ] != "const" && l[ 0 ] != "unsigned" && l[ 0 ] != "var" )
+ arg = l[ 0 ];
+ } else if ( l.count() == 3 ) {
+ arg = l[ 0 ] + " " + l[ 1 ];
+ }
+ }
+ res += arg;
+ }
+ res += ")";
+
+ return QString::fromLatin1( NormalizeObject::normalizeSignalSlot( res.latin1() ) );
+}
diff --git a/tools/designer/shared/parser.h b/tools/designer/shared/parser.h
new file mode 100644
index 0000000..642ff2c
--- /dev/null
+++ b/tools/designer/shared/parser.h
@@ -0,0 +1,46 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PARSER_H
+#define PARSER_H
+
+#include <qstring.h>
+
+class Parser
+{
+public:
+ static QString cleanArgs( const QString &func );
+
+};
+
+#endif
diff --git a/tools/designer/shared/ui2uib.cpp b/tools/designer/shared/ui2uib.cpp
new file mode 100644
index 0000000..e5b20dd
--- /dev/null
+++ b/tools/designer/shared/ui2uib.cpp
@@ -0,0 +1,900 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "ui2uib.h"
+#include "uib.h"
+
+#include <domtool.h>
+
+#include <qcolor.h>
+#include <qcursor.h>
+#include <qdatetime.h>
+#include <qdom.h>
+#include <qfile.h>
+#include <qfont.h>
+#include <qobject.h>
+#include <qrect.h>
+#include <qsizepolicy.h>
+
+/*
+ The .uib file format is the binary counterpart of the .ui file
+ format. It is generated by the ui2uib converter and understood by
+ QWidgetFactory; in a future version, it might also be understood
+ by a uib2ui converter. Experiments show that .uib files are about
+ 2.5 times faster to load and 6 times smaller than .ui files.
+
+ The .uib format, unlike the .ui format, is internal to Trolltech
+ and is not officially documented; it is assumed that anybody who
+ needs to understand the file format can read the ui2uib and
+ QWidgetFactory source code, with some guidance. And here's some
+ guidance.
+
+ A .uib file starts with a 32-bit magic number that allows
+ QWidgetFactory to determine the file type. The magic number is
+ followed by '\n' (0x0a) and '\r' (0x0d), which ensure that the
+ file wasn't corrupted during transfer between different
+ platforms. For example, transferring a .ui file from Windows to
+ Unix using FTP with type ASCII will produce a file with '\r\n\r'
+ in place of '\n\r'. This is followed by the QDataStream format
+ version number used.
+
+ The rest of the file is made up of blocks, each of which starts
+ with a block type (Block_XXX) and a block length. Block_Intro and
+ Block_Widget are mandatory; the others are optional.
+ QWidgetFactory makes certain assumptions about the order of the
+ blocks; for example, it expects Block_String before any other
+ block that refers to a string and Block_Images before
+ Block_Widget. The order generated by ui2uib is one of the orders
+ that make sense. Just after the last block, a Block_End marker
+ indicates the end of the file.
+
+ The division of .uib files into blocks corresponds grossly to the
+ division of .ui files in top-level XML elements. Thus,
+ Block_Widget corresponds to <widget> and Block_Toolbars to
+ <toolbars>. The internal organization of each block also mimics
+ the organization of the corresponding XML elements.
+
+ These are the major differences, all of which contribute to
+ making .uib files more compact:
+
+ 1. The strings are gathered in Block_Strings, a string-table.
+ When a string is needed later, it is referenced by a 32-bit
+ index into that table. The UicStringTable class makes the
+ whole process of inserting and looking up strings very
+ simple. The advantage of this scheme is that if a string is
+ used more than once, it is stored only once. Also, the
+ string-table is preinitialized with very common strings, so
+ that these need not be stored along with .uib files.
+
+ 2. QObjects are referred to by index in a table rather than by
+ name. The table itself is not stored in the .uib file; it is
+ rather build dynamically by ui2uib and QWidgetFactory as new
+ objects are specified. In ui2uib, the table is represented by
+ a UibIndexMap object; in QWidgetFactory, a plain array of
+ QObject pointers suffices.
+
+ 3. The data is packed to take as little place as possible,
+ without slowing down QLayoutFactory too much. For example, an
+ index into the string-table is a 32-bit integer, but in
+ practice it is rarely above 65534, so only 16 bits are used
+ for them; when an index above 65534 is met, the index is
+ saved as 65535 followed by the 32-bit index, for a total of
+ 48 bits.
+
+ 4. The name of a signal or slot and its signature are saved
+ separately. That way, if a signal 'foo(const QString&)' is
+ connected to a slot 'bar(const QString&)', the string-table
+ will only contain 'foo', 'bar', and '(const QString&)',
+ instead of the longer 'foo(const QString&)' and 'bar(const
+ QString&)'. The signatures are normalized beforehand to
+ ensure that trivial spacing problems don't result in multiple
+ string-table entries.
+
+ 5. In a signal-to-slot connection, a sender, signal, receiver,
+ or slot is not repeated if it's the same as for the previous
+ connection. Bit flags indicate what is repeated and what is
+ specified.
+
+ 6. Some of the information stored in a .ui file is useful only
+ by uic, not to QLayoutFactory. That information is, for now,
+ not taken along in the .uib file. Likewise, needless
+ QLayoutWidget objects are not taken along.
+
+ The arbitrary constants related to the .uib file formats are
+ defined in uib.h. Constants such as Block_Actions and
+ Object_SubWidget are given values such as 'A' and 'W' to make
+ .uib files easier to read in a hexadecimal editor.
+
+ The file format isn't designed to be extensible. Any extension
+ that prevents an older version of QLayoutWidget of reading the
+ file correctly must have a different magic number. The plan is to
+ use UibMagic + 1 for version 2, UibMagic + 2 for version 3, etc.
+*/
+
+static QCString layoutForTag( const QString& tag )
+{
+ if ( tag == "grid" ) {
+ return "QGridLayout";
+ } else if ( tag == "hbox" ) {
+ return "QHBoxLayout";
+ } else if ( tag == "vbox" ) {
+ return "QVBoxLayout";
+ } else {
+ return "QLayout";
+ }
+}
+
+class UibHack : public QObject
+{
+public:
+ static QString normalize( const QString& member ) {
+ return QString::fromUtf8( QObject::normalizeSignalSlot(member.utf8()) );
+ }
+};
+
+class UibIndexMap
+{
+public:
+ UibIndexMap() : next( 0 ) { }
+
+ void insert( const QString& name ) { setName( insert(), name ); }
+ int insert() { return next++; }
+ void setName( int no, const QString& name );
+
+ int find( const QString& name, int deflt = -1 ) const;
+ int count() const { return next; }
+
+private:
+ QMap<QString, int> nameMap;
+ QMap<QString, int> conflicts;
+ int next;
+};
+
+void UibIndexMap::setName( int no, const QString& name )
+{
+ if ( !name.isEmpty() ) {
+ if ( *nameMap.insert(name, no, FALSE) != no )
+ conflicts.insert( name, 0 );
+ }
+}
+
+int UibIndexMap::find( const QString& name, int deflt ) const
+{
+ QMap<QString, int>::ConstIterator no = nameMap.find( name );
+ if ( no == nameMap.end() || conflicts.contains(name) ) {
+ return deflt;
+ } else {
+ return *no;
+ }
+}
+
+static void packUInt16( QDataStream& out, Q_UINT16 n )
+{
+ if ( n < 255 ) {
+ out << (Q_UINT8) n;
+ } else {
+ out << (Q_UINT8) 255;
+ out << n;
+ }
+}
+
+static void packUInt32( QDataStream& out, Q_UINT32 n )
+{
+ if ( n < 65535 ) {
+ out << (Q_UINT16) n;
+ } else {
+ out << (Q_UINT16) 65535;
+ out << n;
+ }
+}
+
+static void packByteArray( QDataStream& out, const QByteArray& array )
+{
+ packUInt32( out, array.size() );
+ out.writeRawBytes( array.data(), array.size() );
+}
+
+static void packCString( UibStrTable& strings, QDataStream& out,
+ const char *cstr )
+{
+ packUInt32( out, strings.insertCString(cstr) );
+}
+
+static void packString( UibStrTable& strings, QDataStream& out,
+ const QString& str )
+{
+ packUInt32( out, strings.insertString(str) );
+}
+
+static void packStringSplit( UibStrTable& strings, QDataStream& out,
+ const QString& str, QChar sep )
+{
+ int pos = str.find( sep );
+ if ( pos == -1 )
+ pos = str.length();
+ packString( strings, out, str.left(pos) );
+ packString( strings, out, str.mid(pos) );
+}
+
+static void packVariant( UibStrTable& strings, QDataStream& out,
+ QVariant value, QString tag = "" )
+{
+ QStringList::ConstIterator s;
+
+ Q_UINT8 type = value.type();
+ if ( tag == "pixmap" ) {
+ type = QVariant::Pixmap;
+ } else if ( tag == "image" ) {
+ type = QVariant::Image;
+ } else if ( tag == "iconset" ) {
+ type = QVariant::IconSet;
+ }
+ out << type;
+
+ switch ( type ) {
+ case QVariant::String:
+ case QVariant::Pixmap:
+ case QVariant::Image:
+ case QVariant::IconSet:
+ packString( strings, out, value.asString() );
+ break;
+ case QVariant::StringList:
+ packUInt16( out, value.asStringList().count() );
+ s = value.asStringList().begin();
+ while ( s != value.asStringList().end() ) {
+ packString( strings, out, *s );
+ ++s;
+ }
+ break;
+ case QVariant::Font:
+ out << value.asFont();
+ break;
+ case QVariant::Rect:
+ packUInt16( out, value.asRect().x() );
+ packUInt16( out, value.asRect().y() );
+ packUInt16( out, value.asRect().width() );
+ packUInt16( out, value.asRect().height() );
+ break;
+ case QVariant::Size:
+ packUInt16( out, value.asSize().width() );
+ packUInt16( out, value.asSize().height() );
+ break;
+ case QVariant::Color:
+ out << value.asColor();
+ break;
+ case QVariant::Point:
+ packUInt16( out, value.asPoint().x() );
+ packUInt16( out, value.asPoint().y() );
+ break;
+ case QVariant::Int:
+ packUInt32( out, value.asInt() );
+ break;
+ case QVariant::Bool:
+ out << (Q_UINT8) value.asBool();
+ break;
+ case QVariant::Double:
+ out << value.asDouble();
+ break;
+ case QVariant::CString:
+ packCString( strings, out, value.asCString() );
+ break;
+ case QVariant::Cursor:
+ out << value.asCursor();
+ break;
+ case QVariant::Date:
+ out << value.asDate();
+ break;
+ case QVariant::Time:
+ out << value.asTime();
+ break;
+ case QVariant::DateTime:
+ out << value.asDateTime();
+ break;
+ default:
+ out << value;
+ }
+}
+
+static void outputProperty( QMap<int, QStringList>& buddies, int objectNo,
+ UibStrTable& strings, QDataStream& out,
+ QDomElement elem )
+{
+ QCString name = elem.attribute( "name" ).latin1();
+ QDomElement f = elem.firstChild().toElement();
+ QString tag = f.tagName();
+ QString comment;
+ QVariant value;
+
+ if ( name == "resizeable" )
+ name = "resizable";
+
+ if ( tag == "font" ) {
+ QString family;
+ Q_UINT16 pointSize = 65535;
+ Q_UINT8 fontFlags = 0;
+
+ QDomElement g = f.firstChild().toElement();
+ while ( !g.isNull() ) {
+ QString text = g.firstChild().toText().data();
+ if ( g.tagName() == "family" ) {
+ fontFlags |= Font_Family;
+ family = text;
+ } else if ( g.tagName() == "pointsize" ) {
+ fontFlags |= Font_PointSize;
+ pointSize = (Q_UINT16) text.toUInt();
+ } else {
+ if ( g.firstChild().toText().data().toInt() != 0 ) {
+ if ( g.tagName() == "bold" ) {
+ fontFlags |= Font_Bold;
+ } else if ( g.tagName() == "italic" ) {
+ fontFlags |= Font_Italic;
+ } else if ( g.tagName() == "underline" ) {
+ fontFlags |= Font_Underline;
+ } else if ( g.tagName() == "strikeout" ) {
+ fontFlags |= Font_StrikeOut;
+ }
+ }
+ }
+ g = g.nextSibling().toElement();
+ }
+
+ out << (Q_UINT8) Object_FontProperty;
+ packCString( strings, out, name );
+ out << fontFlags;
+ if ( fontFlags & Font_Family )
+ packString( strings, out, family );
+ if ( fontFlags & Font_PointSize )
+ packUInt16( out, pointSize );
+ } else if ( tag == "palette" ) {
+ out << (Q_UINT8) Object_PaletteProperty;
+ packCString( strings, out, name );
+
+ QDomElement g = f.firstChild().toElement();
+ while ( !g.isNull() ) {
+ QDomElement h = g.firstChild().toElement();
+ while ( !h.isNull() ) {
+ value = DomTool::elementToVariant( h, Qt::gray );
+ if ( h.tagName() == "color" ) {
+ out << (Q_UINT8) Palette_Color;
+ out << value.asColor();
+ } else if ( h.tagName() == "pixmap" ) {
+ out << (Q_UINT8) Palette_Pixmap;
+ packVariant( strings, out, value, "pixmap" );
+ }
+ h = h.nextSibling().toElement();
+ }
+
+ if ( g.tagName() == "active" ) {
+ out << (Q_UINT8) Palette_Active;
+ } else if ( g.tagName() == "inactive" ) {
+ out << (Q_UINT8) Palette_Inactive;
+ } else {
+ out << (Q_UINT8) Palette_Disabled;
+ }
+ g = g.nextSibling().toElement();
+ }
+ out << (Q_UINT8) Palette_End;
+ } else {
+ value = DomTool::elementToVariant( f, value, comment );
+ if ( value.isValid() ) {
+ if ( name == "buddy" ) {
+ buddies[objectNo] += value.asString();
+ } else {
+ if ( tag == "string" ) {
+ out << (Q_UINT8) Object_TextProperty;
+ packCString( strings, out, name );
+ packCString( strings, out, value.asString().utf8() );
+ packCString( strings, out, comment.utf8() );
+ } else {
+ out << (Q_UINT8) Object_VariantProperty;
+ packCString( strings, out, name );
+ packVariant( strings, out, value, tag );
+ }
+ }
+ }
+ }
+}
+
+static void outputGridCell( QDataStream& out, QDomElement elem )
+{
+ int column = elem.attribute( "column", "0" ).toInt();
+ int row = elem.attribute( "row", "0" ).toInt();
+ int colspan = elem.attribute( "colspan", "1" ).toInt();
+ int rowspan = elem.attribute( "rowspan", "1" ).toInt();
+ if ( colspan < 1 )
+ colspan = 1;
+ if ( rowspan < 1 )
+ rowspan = 1;
+
+ if ( column != 0 || row != 0 || colspan != 1 || rowspan != 1 ) {
+ out << (Q_UINT8) Object_GridCell;
+ packUInt16( out, column );
+ packUInt16( out, row );
+ packUInt16( out, colspan );
+ packUInt16( out, rowspan );
+ }
+}
+
+static int outputObject( QMap<int, QStringList>& buddies,
+ UibIndexMap& objects, UibStrTable& strings,
+ QDataStream& out, QDomElement elem,
+ QCString className = "" );
+
+static void outputLayoutWidgetsSubLayout( QMap<int, QStringList>& buddies,
+ UibIndexMap& objects,
+ UibStrTable& strings,
+ QDataStream& out, QDomElement elem )
+{
+ int subLayoutNo = -1;
+ QCString name;
+ QDomElement nameElem;
+
+ QDomElement f = elem.firstChild().toElement();
+ while ( !f.isNull() ) {
+ QString tag = f.tagName();
+ if ( tag == "grid" || tag == "hbox" || tag == "vbox" ) {
+ out << (Q_UINT8) Object_SubLayout;
+ subLayoutNo = outputObject( buddies, objects, strings, out, f,
+ layoutForTag(tag) );
+ } else if ( tag == "property" ) {
+ if ( f.attribute("name") == "name" ) {
+ name = DomTool::elementToVariant( f, name ).asCString();
+ nameElem = f;
+ }
+ }
+ f = f.nextSibling().toElement();
+ }
+
+ if ( subLayoutNo != -1 ) {
+ /*
+ Remove the sub-layout's Object_End marker, append the grid
+ cell and the correct name property, and put the Object_End
+ marker back.
+ */
+ out.device()->at( out.device()->at() - 1 );
+ outputGridCell( out, elem );
+ outputProperty( buddies, subLayoutNo, strings, out, nameElem );
+ out << (Q_UINT8) Object_End;
+
+ objects.setName( subLayoutNo, name );
+ }
+}
+
+static int outputObject( QMap<int, QStringList>& buddies,
+ UibIndexMap& objects, UibStrTable& strings,
+ QDataStream& out, QDomElement elem,
+ QCString className )
+{
+ bool isQObject = !className.isEmpty();
+
+ if ( className == "QToolBar" )
+ out << (Q_UINT8) elem.attribute( "dock", "0" ).toInt();
+ if ( className == "QWidget" )
+ className = elem.attribute( "class", className ).latin1();
+
+ int objectNo = -1;
+ if ( isQObject ) {
+ packCString( strings, out, className );
+ objectNo = objects.insert();
+ }
+
+ outputGridCell( out, elem );
+
+ // optimization: insert '&Foo' into string-table before 'Foo'
+ if ( className == "QAction" || className == "QActionGroup" ) {
+ QVariant value = DomTool::readProperty( elem, "menuText", QVariant() );
+ if ( value.asString().startsWith("&") )
+ strings.insertString( value.asString() );
+ }
+
+ QDomElement f = elem.firstChild().toElement();
+ while ( !f.isNull() ) {
+ QString tag = f.tagName();
+ if ( tag == "action" ) {
+ if ( elem.tagName() == "item" || elem.tagName() == "toolbar" ) {
+ QString actionName = f.attribute( "name" );
+ int no = objects.find( actionName );
+ if ( no != -1 ) {
+ out << (Q_UINT8) Object_ActionRef;
+ packUInt16( out, no );
+ }
+ } else {
+ out << (Q_UINT8) Object_SubAction;
+ outputObject( buddies, objects, strings, out, f, "QAction" );
+ }
+ } else if ( tag == "actiongroup" ) {
+ out << (Q_UINT8) Object_SubAction;
+ outputObject( buddies, objects, strings, out, f, "QActionGroup" );
+ } else if ( tag == "attribute" ) {
+ out << (Q_UINT8) Object_Attribute;
+ outputProperty( buddies, objectNo, strings, out, f );
+ } else if ( tag == "column" ) {
+ out << (Q_UINT8) Object_Column;
+ outputObject( buddies, objects, strings, out, f );
+ } else if ( tag == "event" ) {
+ out << (Q_UINT8) Object_Event;
+ packCString( strings, out, f.attribute("name").latin1() );
+ packVariant( strings, out,
+ QStringList::split(',', f.attribute("functions")) );
+ } else if ( tag == "grid" || tag == "hbox" || tag == "vbox" ) {
+ out << (Q_UINT8) Object_SubLayout;
+ outputObject( buddies, objects, strings, out, f,
+ layoutForTag(tag) );
+ } else if ( tag == "item" ) {
+ if ( elem.tagName() == "menubar" ) {
+ out << (Q_UINT8) Object_MenuItem;
+ packCString( strings, out, f.attribute("name").latin1() );
+ packCString( strings, out, f.attribute("text").utf8() );
+ outputObject( buddies, objects, strings, out, f );
+ } else {
+ out << (Q_UINT8) Object_Item;
+ outputObject( buddies, objects, strings, out, f );
+ }
+ } else if ( tag == "property" ) {
+ outputProperty( buddies, objectNo, strings, out, f );
+ } else if ( tag == "row" ) {
+ out << (Q_UINT8) Object_Row;
+ outputObject( buddies, objects, strings, out, f );
+ } else if ( tag == "separator" ) {
+ out << (Q_UINT8) Object_Separator;
+ } else if ( tag == "spacer" ) {
+ out << (Q_UINT8) Object_Spacer;
+ outputObject( buddies, objects, strings, out, f );
+ } else if ( tag == "widget" ) {
+ if ( f.attribute("class") == "QLayoutWidget" &&
+ elem.tagName() != "widget" ) {
+ outputLayoutWidgetsSubLayout( buddies, objects, strings, out,
+ f );
+ } else {
+ out << (Q_UINT8) Object_SubWidget;
+ outputObject( buddies, objects, strings, out, f, "QWidget" );
+ }
+ }
+ f = f.nextSibling().toElement();
+ }
+ out << (Q_UINT8) Object_End;
+ if ( isQObject )
+ objects.setName( objectNo,
+ DomTool::readProperty(elem, "name", "").asString() );
+ return objectNo;
+}
+
+static void outputBlock( QDataStream& out, BlockTag tag,
+ const QByteArray& data )
+{
+ if ( !data.isEmpty() ) {
+ out << (Q_UINT8) tag;
+ packByteArray( out, data );
+ }
+}
+
+void convertUiToUib( QDomDocument& doc, QDataStream& out )
+{
+ QByteArray introBlock;
+ QByteArray actionsBlock;
+ QByteArray buddiesBlock;
+ QByteArray connectionsBlock;
+ QByteArray functionsBlock;
+ QByteArray imagesBlock;
+ QByteArray menubarBlock;
+ QByteArray slotsBlock;
+ QByteArray tabstopsBlock;
+ QByteArray toolbarsBlock;
+ QByteArray variablesBlock;
+ QByteArray widgetBlock;
+
+ QDomElement actionsElem;
+ QDomElement connectionsElem;
+ QDomElement imagesElem;
+ QDomElement menubarElem;
+ QDomElement tabstopsElem;
+ QDomElement toolbarsElem;
+ QDomElement widgetElem;
+
+ QMap<int, QStringList> buddies;
+ UibStrTable strings;
+ UibIndexMap objects;
+ int widgetNo = -1;
+ QCString className;
+ Q_INT16 defaultMargin = -32768;
+ Q_INT16 defaultSpacing = -32768;
+ Q_UINT8 introFlags = 0;
+
+ QDomElement elem = doc.firstChild().toElement().firstChild().toElement();
+ while ( !elem.isNull() ) {
+ QString tag = elem.tagName();
+
+ switch ( tag[0].latin1() ) {
+ case 'a':
+ if ( tag == "actions" )
+ actionsElem = elem;
+ break;
+ case 'c':
+ if ( tag == "class" ) {
+ className = elem.firstChild().toText().data().latin1();
+ } else if ( tag == "connections" ) {
+ connectionsElem = elem;
+ }
+ break;
+ case 'f':
+ if ( tag == "functions" ) {
+ QDataStream out2( functionsBlock, IO_WriteOnly );
+ QDomElement f = elem.firstChild().toElement();
+ while ( !f.isNull() ) {
+ if ( f.tagName() == "function" ) {
+ packStringSplit( strings, out2,
+ f.attribute("name").latin1(), '(' );
+ packString( strings, out2,
+ f.firstChild().toText().data() );
+ }
+ f = f.nextSibling().toElement();
+ }
+ }
+ break;
+ case 'i':
+ if ( tag == "images" ) {
+ QDataStream out2( imagesBlock, IO_WriteOnly );
+ QDomElement f = elem.firstChild().toElement();
+ while ( !f.isNull() ) {
+ if ( f.tagName() == "image" ) {
+ QString name = f.attribute( "name" );
+ QDomElement g = f.firstChild().toElement();
+ if ( g.tagName() == "data" ) {
+ QString format = g.attribute( "format", "PNG" );
+ QString hex = g.firstChild().toText().data();
+ int n = hex.length() / 2;
+ QByteArray data( n );
+ for ( int i = 0; i < n; i++ )
+ data[i] = (char) hex.mid( 2 * i, 2 )
+ .toUInt( 0, 16 );
+
+ packString( strings, out2, name );
+ packString( strings, out2, format );
+ packUInt32( out2, g.attribute("length").toInt() );
+ packByteArray( out2, data );
+ }
+ }
+ f = f.nextSibling().toElement();
+ }
+ }
+ break;
+ case 'l':
+ if ( tag == "layoutdefaults" ) {
+ QString margin = elem.attribute( "margin" );
+ if ( !margin.isEmpty() )
+ defaultMargin = margin.toInt();
+ QString spacing = elem.attribute( "spacing" );
+ if ( !spacing.isEmpty() )
+ defaultSpacing = spacing.toInt();
+ }
+ break;
+ case 'm':
+ if ( tag == "menubar" )
+ menubarElem = elem;
+ break;
+ case 'p':
+ if ( tag == "pixmapinproject" )
+ introFlags |= Intro_Pixmapinproject;
+ break;
+ case 's':
+ if ( tag == "slots" ) {
+ QDataStream out2( slotsBlock, IO_WriteOnly );
+ QDomElement f = elem.firstChild().toElement();
+ while ( !f.isNull() ) {
+ if ( f.tagName() == "slot" ) {
+ QString language = f.attribute( "language", "C++" );
+ QString slot = UibHack::normalize(
+ f.firstChild().toText().data() );
+ packString( strings, out2, language );
+ packStringSplit( strings, out2, slot, '(' );
+ }
+ f = f.nextSibling().toElement();
+ }
+ }
+ break;
+ case 't':
+ if ( tag == "tabstops" ) {
+ tabstopsElem = elem;
+ } else if ( tag == "toolbars" ) {
+ toolbarsElem = elem;
+ }
+ break;
+ case 'v':
+ if ( tag == "variable" ) {
+ QDataStream out2( variablesBlock, IO_WriteOnly | IO_Append );
+ packString( strings, out2, elem.firstChild().toText().data() );
+ } else if ( tag == "variables" ) {
+ QDataStream out2( variablesBlock, IO_WriteOnly );
+ QDomElement f = elem.firstChild().toElement();
+ while ( !f.isNull() ) {
+ if ( f.tagName() == "variable" )
+ packString( strings, out2,
+ f.firstChild().toText().data() );
+ f = f.nextSibling().toElement();
+ }
+ }
+ break;
+ case 'w':
+ if ( tag == "widget" )
+ widgetElem = elem;
+ }
+ elem = elem.nextSibling().toElement();
+ }
+
+ {
+ QDataStream out2( widgetBlock, IO_WriteOnly );
+ widgetNo = outputObject( buddies, objects, strings, out2, widgetElem,
+ "QWidget" );
+ }
+
+ if ( !tabstopsElem.isNull() ) {
+ QDataStream out2( tabstopsBlock, IO_WriteOnly );
+ QDomElement f = tabstopsElem.firstChild().toElement();
+ while ( !f.isNull() ) {
+ if ( f.tagName() == "tabstop" ) {
+ QString widgetName = f.firstChild().toText().data();
+ int no = objects.find( widgetName );
+ if ( no != -1 )
+ packUInt16( out2, no );
+ }
+ f = f.nextSibling().toElement();
+ }
+ }
+
+ if ( !actionsElem.isNull() ) {
+ QDataStream out2( actionsBlock, IO_WriteOnly );
+ outputObject( buddies, objects, strings, out2, actionsElem );
+ }
+
+ if ( !menubarElem.isNull() ) {
+ QDataStream out2( menubarBlock, IO_WriteOnly );
+ outputObject( buddies, objects, strings, out2, menubarElem,
+ "QMenuBar" );
+ }
+
+ if ( !toolbarsElem.isNull() ) {
+ QDataStream out2( toolbarsBlock, IO_WriteOnly );
+ QDomElement f = toolbarsElem.firstChild().toElement();
+ while ( !f.isNull() ) {
+ if ( f.tagName() == "toolbar" )
+ outputObject( buddies, objects, strings, out2, f, "QToolBar" );
+ f = f.nextSibling().toElement();
+ }
+ }
+
+ if ( !buddies.isEmpty() ) {
+ QDataStream out2( buddiesBlock, IO_WriteOnly );
+ QMap<int, QStringList>::ConstIterator a = buddies.begin();
+ while ( a != buddies.end() ) {
+ QStringList::ConstIterator b = (*a).begin();
+ while ( b != (*a).end() ) {
+ int no = objects.find( *b );
+ if ( no != -1 ) {
+ packUInt16( out2, a.key() );
+ packUInt16( out2, no );
+ }
+ ++b;
+ }
+ ++a;
+ }
+ }
+
+ if ( !connectionsElem.isNull() ) {
+ QString prevLanguage = "C++";
+ int prevSenderNo = 0;
+ QString prevSignal = "clicked()";
+ int prevReceiverNo = 0;
+ QString prevSlot = "accept()";
+
+ QDataStream out2( connectionsBlock, IO_WriteOnly );
+ QDomElement f = connectionsElem.firstChild().toElement();
+ while ( !f.isNull() ) {
+ if ( f.tagName() == "connection" ) {
+ QMap<QString, QString> argMap;
+
+ QDomElement g = f.firstChild().toElement();
+ while ( !g.isNull() ) {
+ argMap[g.tagName()] = g.firstChild().toText().data();
+ g = g.nextSibling().toElement();
+ }
+
+ QString language = f.attribute( "language", "C++" );
+ int senderNo = objects.find( argMap["sender"], widgetNo );
+ int receiverNo = objects.find( argMap["receiver"], widgetNo );
+ QString signal = UibHack::normalize( argMap["signal"] );
+ QString slot = UibHack::normalize( argMap["slot"] );
+
+ Q_UINT8 connectionFlags = 0;
+ if ( language != prevLanguage )
+ connectionFlags |= Connection_Language;
+ if ( senderNo != prevSenderNo )
+ connectionFlags |= Connection_Sender;
+ if ( signal != prevSignal )
+ connectionFlags |= Connection_Signal;
+ if ( receiverNo != prevReceiverNo )
+ connectionFlags |= Connection_Receiver;
+ if ( slot != prevSlot )
+ connectionFlags |= Connection_Slot;
+ out2 << connectionFlags;
+
+ if ( connectionFlags & Connection_Language )
+ packString( strings, out2, language );
+ if ( connectionFlags & Connection_Sender )
+ packUInt16( out2, senderNo );
+ if ( connectionFlags & Connection_Signal )
+ packStringSplit( strings, out2, signal, '(' );
+ if ( connectionFlags & Connection_Receiver )
+ packUInt16( out2, receiverNo );
+ if ( connectionFlags & Connection_Slot )
+ packStringSplit( strings, out2, slot, '(' );
+
+ prevLanguage = language;
+ prevSenderNo = senderNo;
+ prevSignal = signal;
+ prevReceiverNo = receiverNo;
+ prevSlot = slot;
+ } else if ( f.tagName() == "slot" ) {
+ // ###
+ }
+ f = f.nextSibling().toElement();
+ }
+ }
+
+ {
+ QDataStream out2( introBlock, IO_WriteOnly );
+ out2 << introFlags;
+ out2 << defaultMargin;
+ out2 << defaultSpacing;
+ packUInt16( out2, objects.count() );
+ packCString( strings, out2, className );
+ }
+
+ out << UibMagic;
+ out << (Q_UINT8) '\n';
+ out << (Q_UINT8) '\r';
+ out << (Q_UINT8) out.version();
+ outputBlock( out, Block_Strings, strings.block() );
+ outputBlock( out, Block_Intro, introBlock );
+ outputBlock( out, Block_Images, imagesBlock );
+ outputBlock( out, Block_Widget, widgetBlock );
+ outputBlock( out, Block_Slots, slotsBlock );
+ outputBlock( out, Block_Tabstops, tabstopsBlock );
+ outputBlock( out, Block_Actions, actionsBlock );
+ outputBlock( out, Block_Menubar, menubarBlock );
+ outputBlock( out, Block_Toolbars, toolbarsBlock );
+ outputBlock( out, Block_Variables, variablesBlock );
+ outputBlock( out, Block_Functions, functionsBlock );
+ outputBlock( out, Block_Buddies, buddiesBlock );
+ outputBlock( out, Block_Connections, connectionsBlock );
+ out << (Q_UINT8) Block_End;
+}
diff --git a/tools/designer/shared/ui2uib.h b/tools/designer/shared/ui2uib.h
new file mode 100644
index 0000000..6b0c9d3
--- /dev/null
+++ b/tools/designer/shared/ui2uib.h
@@ -0,0 +1,42 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef UI2UIB_H
+#define UI2UIB_H
+
+class QDataStream;
+class QDomDocument;
+
+void convertUiToUib( QDomDocument& doc, QDataStream& out );
+
+#endif
diff --git a/tools/designer/shared/uib.cpp b/tools/designer/shared/uib.cpp
new file mode 100644
index 0000000..74fbc0d
--- /dev/null
+++ b/tools/designer/shared/uib.cpp
@@ -0,0 +1,49 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "uib.h"
+
+static const char commonStrings[] =
+ "\0()\0(bool)\0(const QString&)\0(int)\0C++\0Layout1\0PNG\0QCheckBox\0"
+ "QComboBox\0QDialog\0QFrame\0QGridLayout\0QGroupBox\0QHBoxLayout\0QLabel\0"
+ "QLineEdit\0QListView\0QPushButton\0QRadioButton\0QVBoxLayout\0QWidget\0"
+ "TextLabel1\0XPM.GZ\0accept\0autoDefault\0buddy\0caption\0clicked\0"
+ "default\0destroy\0frameShadow\0frameShape\0geometry\0init\0margin\0"
+ "maximumSize\0minimumSize\0name\0reject\0sizePolicy\0spacing\0text\0title\0"
+ "toolTip\0unnamed\0whatsThis";
+
+UibStrTable::UibStrTable()
+ : out( table, IO_WriteOnly ), start( sizeof(commonStrings) )
+{
+ out.writeRawBytes( commonStrings, start );
+}
diff --git a/tools/designer/shared/uib.h b/tools/designer/shared/uib.h
new file mode 100644
index 0000000..743c4b6
--- /dev/null
+++ b/tools/designer/shared/uib.h
@@ -0,0 +1,159 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef UIB_H
+#define UIB_H
+
+#include <qdatastream.h>
+
+const Q_UINT32 UibMagic = 0xb77c61d8;
+
+enum BlockTag { Block_End = '$', Block_Actions = 'A', Block_Buddies = 'B',
+ Block_Connections = 'C', Block_Functions = 'F',
+ Block_Images = 'G', Block_Intro = 'I', Block_Menubar = 'M',
+ Block_Slots = 'S', Block_Strings = 'Z', Block_Tabstops = 'T',
+ Block_Toolbars = 'O', Block_Variables = 'V',
+ Block_Widget = 'W' };
+
+enum ObjectTag { Object_End = '$', Object_ActionRef = 'X',
+ Object_Attribute = 'B', Object_Column = 'C',
+ Object_Event = 'E', Object_FontProperty = 'F',
+ Object_GridCell = 'G', Object_Item = 'I',
+ Object_MenuItem = 'M', Object_PaletteProperty = 'P',
+ Object_Row = 'R', Object_Separator = 'S', Object_Spacer = 'Y',
+ Object_SubAction = 'A', Object_SubLayout = 'L',
+ Object_SubWidget = 'W', Object_TextProperty = 'T',
+ Object_VariantProperty = 'V' };
+
+enum PaletteTag { Palette_End = '$', Palette_Active = 'A',
+ Palette_Inactive = 'I', Palette_Disabled = 'D',
+ Palette_Color = 'C', Palette_Pixmap = 'P' };
+
+enum IntroFlag { Intro_Pixmapinproject = 0x1 };
+
+enum FontFlag { Font_Family = 0x1, Font_PointSize = 0x2, Font_Bold = 0x4,
+ Font_Italic = 0x8, Font_Underline = 0x10,
+ Font_StrikeOut = 0x20 };
+
+enum ConnectionFlag { Connection_Language = 0x1, Connection_Sender = 0x2,
+ Connection_Signal = 0x4, Connection_Receiver = 0x8,
+ Connection_Slot = 0x10 };
+
+class UibStrTable
+{
+public:
+ UibStrTable();
+
+ inline int insertCString( const char *cstr );
+ inline int insertString( const QString& str );
+ inline void readBlock( QDataStream& in, int size );
+
+ inline const char *asCString( int offset ) const;
+ inline QString asString( int offset ) const;
+ inline QByteArray block() const;
+
+private:
+ QCString table;
+ QDataStream out;
+ int start;
+};
+
+/*
+ uic uses insertCString(), insertString(), and block();
+ QWidgetFactory uses readBlock(), asCString(), and asString(). By
+ implementing these functions inline, we ensure that the binaries
+ don't contain needless code.
+*/
+
+inline int UibStrTable::insertCString( const char *cstr )
+{
+ if ( cstr == 0 || cstr[0] == 0 ) {
+ return 0;
+ } else {
+ int nextPos = table.size();
+ int len = (int)strlen( cstr );
+ int i;
+ for ( i = 0; i < nextPos - len; i++ ) {
+ if ( memcmp(table.data() + i, cstr, len + 1) == 0 )
+ return i;
+ }
+ for ( i = 0; i < len + 1; i++ )
+ out << (Q_UINT8) cstr[i];
+ return nextPos;
+ }
+}
+
+inline int UibStrTable::insertString( const QString& str )
+{
+ if ( str.contains('\0') || str[0] == QChar(0x7f) ) {
+ int nextPos = table.size();
+ out << (Q_UINT8) 0x7f;
+ out << str;
+ return nextPos;
+ } else {
+ return insertCString( str.utf8() );
+ }
+}
+
+inline void UibStrTable::readBlock( QDataStream& in, int size )
+{
+ table.resize( start + size );
+ in.readRawBytes( table.data() + start, size );
+}
+
+inline QString UibStrTable::asString( int offset ) const
+{
+ if ( table[offset] == 0x7f ) {
+ QDataStream in( table, IO_ReadOnly );
+ in.device()->at( offset + 1 );
+ QString str;
+ in >> str;
+ return str;
+ } else {
+ return QString::fromUtf8( asCString(offset) );
+ }
+}
+
+inline const char *UibStrTable::asCString( int offset ) const
+{
+ return table.data() + offset;
+}
+
+inline QByteArray UibStrTable::block() const
+{
+ QByteArray block;
+ block.duplicate( table.data() + start, table.size() - start );
+ return block;
+}
+
+#endif
diff --git a/tools/designer/shared/widgetdatabase.cpp b/tools/designer/shared/widgetdatabase.cpp
new file mode 100644
index 0000000..1459818
--- /dev/null
+++ b/tools/designer/shared/widgetdatabase.cpp
@@ -0,0 +1,960 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "widgetdatabase.h"
+#include "../interfaces/widgetinterface.h"
+
+#include <qapplication.h>
+#define NO_STATIC_COLORS
+#include <globaldefs.h>
+#include <qstrlist.h>
+#include <qdict.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qcleanuphandler.h>
+#include <qfeatures.h>
+
+#include <stdlib.h>
+
+const int dbsize = 300;
+const int dbcustom = 200;
+const int dbdictsize = 211;
+static WidgetDatabaseRecord* db[ dbsize ];
+static QDict<int> *className2Id = 0;
+static int dbcount = 0;
+static int dbcustomcount = 200;
+static QStrList *wGroups;
+static QStrList *invisibleGroups;
+static bool whatsThisLoaded = FALSE;
+static QPluginManager<WidgetInterface> *widgetPluginManager = 0;
+static bool plugins_set_up = FALSE;
+static bool was_in_setup = FALSE;
+
+QCleanupHandler<QPluginManager<WidgetInterface> > cleanup_manager;
+
+WidgetDatabaseRecord::WidgetDatabaseRecord()
+{
+ isForm = FALSE;
+ isContainer = FALSE;
+ icon = 0;
+ nameCounter = 0;
+ isCommon = FALSE;
+ isPlugin = FALSE;
+}
+
+WidgetDatabaseRecord::~WidgetDatabaseRecord()
+{
+ delete icon;
+}
+
+
+/*!
+ \class WidgetDatabase widgetdatabase.h
+ \brief The WidgetDatabase class holds information about widgets
+
+ The WidgetDatabase holds information about widgets like toolTip(),
+ iconSet(), ... It works Id-based, so all access functions take the
+ widget id as parameter. To get the id for a widget (classname), use
+ idFromClassName().
+
+ All access functions are static. Having multiple widgetdatabases in
+ one application doesn't make sense anyway and so you don't need more
+ than an instance of the widgetdatabase.
+
+ For creating widgets, layouts, etc. see WidgetFactory.
+*/
+
+/*!
+ Creates widget database. Does nothing.
+*/
+
+WidgetDatabase::WidgetDatabase()
+{
+}
+
+/*! Sets up the widget database. If the static widgetdatabase already
+ exists, the functions returns immediately.
+*/
+
+void WidgetDatabase::setupDataBase( int id )
+{
+ was_in_setup = TRUE;
+#ifndef UIC
+ Q_UNUSED( id )
+ if ( dbcount )
+ return;
+#else
+ if ( dbcount && id != -2 )
+ return;
+ if ( dbcount && !plugins_set_up ) {
+ setupPlugins();
+ return;
+ }
+ if ( dbcount && plugins_set_up)
+ return;
+#endif
+
+ wGroups = new QStrList;
+ invisibleGroups = new QStrList;
+ invisibleGroups->append( "Forms" );
+ invisibleGroups->append( "Temp" );
+ className2Id = new QDict<int>( dbdictsize );
+ className2Id->setAutoDelete( TRUE );
+
+ WidgetDatabaseRecord *r = 0;
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_pushbutton.png";
+ r->name = "QPushButton";
+ r->group = widgetGroup( "Buttons" );
+ r->toolTip = "Push Button";
+ r->isCommon = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_toolbutton.png";
+ r->name = "QToolButton";
+ r->group = widgetGroup( "Buttons" );
+ r->toolTip = "Tool Button";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_radiobutton.png";
+ r->name = "QRadioButton";
+ r->group = widgetGroup( "Buttons" );
+ r->toolTip = "Radio Button";
+ r->isCommon = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_checkbox.png";
+ r->name = "QCheckBox";
+ r->group = widgetGroup( "Buttons" );
+ r->toolTip = "Check Box";
+ r->isCommon = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_groupbox.png";
+ r->name = "QGroupBox";
+ r->group = widgetGroup( "Containers" );
+ r->toolTip = "Group Box";
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_buttongroup.png";
+ r->name = "QButtonGroup";
+ r->group = widgetGroup( "Containers" );
+ r->toolTip = "Button Group";
+ r->isContainer = TRUE;
+ r->isCommon = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_frame.png";
+ r->name = "QFrame";
+ r->group = widgetGroup( "Containers" );
+ r->toolTip = "Frame";
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_tabwidget.png";
+ r->name = "QTabWidget";
+ r->group = widgetGroup( "Containers" );
+ r->toolTip = "Tabwidget";
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_widgetstack.png";
+ r->name = "QWidgetStack";
+ r->group = widgetGroup( "Containers" );
+ r->toolTip = "Widget Stack";
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_toolbox.png";
+ r->name = "QToolBox";
+ r->group = widgetGroup( "Containers" );
+ r->toolTip = "Tool Box";
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_listbox.png";
+ r->name = "QListBox";
+ r->group = widgetGroup( "Views" );
+ r->toolTip = "List Box";
+ r->isCommon = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_listview.png";
+ r->name = "QListView";
+ r->group = widgetGroup( "Views" );
+ r->toolTip = "List View";
+
+ append( r );
+
+#if !defined(QT_NO_ICONVIEW) || defined(UIC)
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_iconview.png";
+ r->name = "QIconView";
+ r->group = widgetGroup( "Views" );
+ r->toolTip = "Icon View";
+
+ append( r );
+#endif
+
+#if !defined(QT_NO_TABLE)
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_table.png";
+ r->name = "QTable";
+ r->group = widgetGroup( "Views" );
+ r->toolTip = "Table";
+
+ append( r );
+#endif
+
+#if !defined(QT_NO_SQL)
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_datatable.png";
+ r->includeFile = "qdatatable.h";
+ r->name = "QDataTable";
+ r->group = widgetGroup( "Database" );
+ r->toolTip = "Data Table";
+
+ append( r );
+#endif
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_lineedit.png";
+ r->name = "QLineEdit";
+ r->group = widgetGroup( "Input" );
+ r->toolTip = "Line Edit";
+ r->isCommon = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_spinbox.png";
+ r->name = "QSpinBox";
+ r->group = widgetGroup( "Input" );
+ r->toolTip = "Spin Box";
+ r->isCommon = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_dateedit.png";
+ r->name = "QDateEdit";
+ r->group = widgetGroup( "Input" );
+ r->toolTip = "Date Edit";
+ r->includeFile = "qdatetimeedit.h";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_timeedit.png";
+ r->name = "QTimeEdit";
+ r->group = widgetGroup( "Input" );
+ r->toolTip = "Time Edit";
+ r->includeFile = "qdatetimeedit.h";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_datetimeedit.png";
+ r->name = "QDateTimeEdit";
+ r->group = widgetGroup( "Input" );
+ r->toolTip = "Date-Time Edit";
+ r->includeFile = "qdatetimeedit.h";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_multilineedit.png";
+ r->name = "QMultiLineEdit";
+ r->group = widgetGroup( "Temp" );
+ r->toolTip = "Multi Line Edit";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_richtextedit.png";
+ r->name = "QTextEdit";
+ r->group = widgetGroup( "Input" );
+ r->toolTip = "Rich Text Edit";
+ r->isCommon = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_combobox.png";
+ r->name = "QComboBox";
+ r->group = widgetGroup( "Input" );
+ r->toolTip = "Combo Box";
+ r->isCommon = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_slider.png";
+ r->name = "QSlider";
+ r->group = widgetGroup( "Input" );
+ r->toolTip = "Slider";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_scrollbar.png";
+ r->name = "QScrollBar";
+ r->group = widgetGroup( "Input" );
+ r->toolTip = "Scrollbar";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_dial.png";
+ r->name = "QDial";
+ r->group = widgetGroup( "Input" );
+ r->toolTip = "Dial";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_label.png";
+ r->name = "QLabel";
+ r->group = widgetGroup( "Temp" );
+ r->toolTip = "Label";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_label.png";
+ r->name = "TextLabel";
+ r->group = widgetGroup( "Display" );
+ r->toolTip = "Text Label";
+ r->whatsThis = "The Text Label provides a widget to display static text.";
+ r->isCommon = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_pixlabel.png";
+ r->name = "PixmapLabel";
+ r->group = widgetGroup( "Display" );
+ r->toolTip = "Pixmap Label";
+ r->whatsThis = "The Pixmap Label provides a widget to display pixmaps.";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_lcdnumber.png";
+ r->name = "QLCDNumber";
+ r->group = widgetGroup( "Display" );
+ r->toolTip = "LCD Number";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_line.png";
+ r->name = "Line";
+ r->group = widgetGroup( "Display" );
+ r->toolTip = "Line";
+ r->includeFile = "qframe.h";
+ r->whatsThis = "The Line widget provides horizontal and vertical lines.";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_progress.png";
+ r->name = "QProgressBar";
+ r->group = widgetGroup( "Display" );
+ r->toolTip = "Progress Bar";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_textview.png";
+ r->name = "QTextView";
+ r->group = widgetGroup( "Temp" );
+ r->toolTip = "Text View";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_textbrowser.png";
+ r->name = "QTextBrowser";
+ r->group = widgetGroup( "Display" );
+ r->toolTip = "Text Browser";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_spacer.png";
+ r->name = "Spacer";
+ r->group = widgetGroup( "Temp" );
+ r->toolTip = "Spacer";
+ r->whatsThis = "The Spacer provides horizontal and vertical spacing to be able to manipulate the behaviour of layouts.";
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->name = "QWidget";
+ r->isForm = TRUE;
+ r->group = widgetGroup( "Forms" );
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->name = "QDialog";
+ r->group = widgetGroup( "Forms" );
+ r->isForm = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->name = "QWizard";
+ r->group = widgetGroup( "Forms" );
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->name = "QDesignerWizard";
+ r->group = widgetGroup( "Forms" );
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->name = "QLayoutWidget";
+ r->group = widgetGroup( "Temp" );
+ r->includeFile = "";
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->name = "QSplitter";
+ r->group = widgetGroup( "Temp" );
+ r->includeFile = "qsplitter.h";
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_tabwidget.png";
+ r->name = "QDesignerTabWidget";
+ r->group = widgetGroup( "Temp" );
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_tabwidget.png";
+ r->name = "QDesignerWidget";
+ r->group = widgetGroup( "Temp" );
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "designer_tabwidget.png";
+ r->name = "QDesignerDialog";
+ r->group = widgetGroup( "Temp" );
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "";
+ r->name = "QMainWindow";
+ r->includeFile = "qmainwindow.h";
+ r->group = widgetGroup( "Temp" );
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "";
+ r->name = "QDesignerAction";
+ r->includeFile = "qaction.h";
+ r->group = widgetGroup( "Temp" );
+ r->isContainer = FALSE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "";
+ r->name = "QDesignerActionGroup";
+ r->includeFile = "qaction.h";
+ r->group = widgetGroup( "Temp" );
+ r->isContainer = FALSE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "";
+ r->name = "QScrollView";
+ r->includeFile = "qscrollview.h";
+ r->group = widgetGroup( "Temp" );
+ r->isContainer = TRUE;
+
+ append( r );
+
+#ifndef QT_NO_SQL
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "";
+ r->name = "QDataBrowser";
+ r->includeFile = "qdatabrowser.h";
+ r->group = widgetGroup( "Database" );
+ r->toolTip = "Data Browser";
+ r->iconSet = "designer_databrowser.png";
+ r->isContainer = TRUE;
+
+ append( r );
+
+ r = new WidgetDatabaseRecord;
+ r->iconSet = "";
+ r->name = "QDataView";
+ r->includeFile = "qdataview.h";
+ r->group = widgetGroup( "Database" );
+ r->toolTip = "Data View";
+ r->iconSet = "designer_dataview.png";
+ r->isContainer = TRUE;
+
+ append( r );
+#endif
+
+#ifndef UIC
+ setupPlugins();
+#endif
+}
+
+void WidgetDatabase::setupPlugins()
+{
+ if ( plugins_set_up )
+ return;
+ plugins_set_up = TRUE;
+ QStringList widgets = widgetManager()->featureList();
+ for ( QStringList::Iterator it = widgets.begin(); it != widgets.end(); ++it ) {
+ if ( hasWidget( *it ) )
+ continue;
+ WidgetDatabaseRecord *r = new WidgetDatabaseRecord;
+ WidgetInterface *iface = 0;
+ widgetManager()->queryInterface( *it, &iface );
+ if ( !iface )
+ continue;
+
+#ifndef UIC
+ QIconSet icon = iface->iconSet( *it );
+ if ( !icon.pixmap().isNull() )
+ r->icon = new QIconSet( icon );
+#endif
+ QString grp = iface->group( *it );
+ if ( grp.isEmpty() )
+ grp = "3rd party widgets";
+ r->group = widgetGroup( grp );
+ r->toolTip = iface->toolTip( *it );
+ r->whatsThis = iface->whatsThis( *it );
+ r->includeFile = iface->includeFile( *it );
+ r->isContainer = iface->isContainer( *it );
+ r->name = *it;
+ r->isPlugin = TRUE;
+ append( r );
+ iface->release();
+ }
+}
+
+/*!
+ Returns the number of elements in the widget database.
+*/
+
+int WidgetDatabase::count()
+{
+ setupDataBase( -1 );
+ return dbcount;
+}
+
+/*!
+ Returns the id at which the ids of custom widgets start.
+*/
+
+int WidgetDatabase::startCustom()
+{
+ setupDataBase( -1 );
+ return dbcustom;
+}
+
+/*!
+ Returns the iconset which represents the class registered as \a id.
+*/
+
+QIconSet WidgetDatabase::iconSet( int id )
+{
+ setupDataBase( id );
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return QIconSet();
+#if !defined(UIC) && !defined(RESOURCE)
+ if ( !r->icon ) {
+ if ( r->iconSet.isEmpty() )
+ return QIconSet();
+ QPixmap pix = QPixmap::fromMimeSource( r->iconSet );
+ if ( pix.isNull() )
+ pix = QPixmap( r->iconSet );
+ r->icon = new QIconSet( pix );
+ }
+ return *r->icon;
+#else
+ return QIconSet();
+#endif
+}
+
+/*!
+ Returns the classname of the widget which is registered as \a id.
+*/
+
+QString WidgetDatabase::className( int id )
+{
+ setupDataBase( id );
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return QString::null;
+ return r->name;
+}
+
+/*!
+ Returns the group the widget registered as \a id belongs to.
+*/
+
+QString WidgetDatabase::group( int id )
+{
+ setupDataBase( id );
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return QString::null;
+ return r->group;
+}
+
+/*!
+ Returns the tooltip text of the widget which is registered as \a id.
+*/
+
+QString WidgetDatabase::toolTip( int id )
+{
+ setupDataBase( id );
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return QString::null;
+ return r->toolTip;
+}
+
+/*!
+ Returns the what's this? text of the widget which is registered as \a id.
+*/
+
+QString WidgetDatabase::whatsThis( int id )
+{
+ setupDataBase( id );
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return QString::null;
+ return r->whatsThis;
+}
+
+/*!
+ Returns the include file if the widget which is registered as \a id.
+*/
+
+QString WidgetDatabase::includeFile( int id )
+{
+ setupDataBase( id );
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return QString::null;
+ if ( r->includeFile.isNull() )
+ return r->name.lower() + ".h";
+ return r->includeFile;
+}
+
+/*! Returns whether the widget registered as \a id is a form.
+*/
+bool WidgetDatabase::isForm( int id )
+{
+ setupDataBase( id );
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return FALSE;
+ return r->isForm;
+}
+
+/*! Returns whether the widget registered as \a id can have children.
+*/
+
+bool WidgetDatabase::isContainer( int id )
+{
+ setupDataBase( id );
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return FALSE;
+ return r->isContainer || r->isForm;
+}
+
+bool WidgetDatabase::isCommon( int id )
+{
+ setupDataBase( id );
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return FALSE;
+ return r->isCommon;
+}
+
+QString WidgetDatabase::createWidgetName( int id )
+{
+ setupDataBase( id );
+ QString n = className( id );
+ if ( n == "QLayoutWidget" )
+ n = "Layout";
+ if ( n[ 0 ] == 'Q' && n[ 1 ].lower() != n[ 1 ] )
+ n = n.mid( 1 );
+ int colonColon = n.findRev( "::" );
+ if ( colonColon != -1 )
+ n = n.mid( colonColon + 2 );
+
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return n;
+ n += QString::number( ++r->nameCounter );
+ n[0] = n[0].lower();
+ return n;
+}
+
+/*! Returns the id for \a name or -1 if \a name is unknown.
+ */
+int WidgetDatabase::idFromClassName( const QString &name )
+{
+ setupDataBase( -1 );
+ if ( name.isEmpty() )
+ return 0;
+ int *i = className2Id->find( name );
+ if ( i )
+ return *i;
+ if ( name == "FormWindow" )
+ return idFromClassName( "QLayoutWidget" );
+#ifdef UIC
+ setupDataBase( -2 );
+ i = className2Id->find( name );
+ if ( i )
+ return *i;
+#endif
+ return -1;
+}
+
+bool WidgetDatabase::hasWidget( const QString &name )
+{
+ return className2Id->find( name ) != 0;
+}
+
+WidgetDatabaseRecord *WidgetDatabase::at( int index )
+{
+ if ( index < 0 )
+ return 0;
+ if ( index >= dbcustom && index < dbcustomcount )
+ return db[ index ];
+ if ( index < dbcount )
+ return db[ index ];
+ return 0;
+}
+
+void WidgetDatabase::insert( int index, WidgetDatabaseRecord *r )
+{
+ if ( index < 0 || index >= dbsize )
+ return;
+ db[ index ] = r;
+ className2Id->insert( r->name, new int( index ) );
+ if ( index < dbcustom )
+ dbcount = QMAX( dbcount, index );
+}
+
+void WidgetDatabase::append( WidgetDatabaseRecord *r )
+{
+ if ( !was_in_setup )
+ setupDataBase( -1 );
+ insert( dbcount++, r );
+}
+
+QString WidgetDatabase::widgetGroup( const QString &g )
+{
+ if ( wGroups->find( g ) == -1 )
+ wGroups->append( g );
+ return g;
+}
+
+bool WidgetDatabase::isGroupEmpty( const QString &grp )
+{
+ WidgetDatabaseRecord *r = 0;
+ for ( int i = 0; i < dbcount; ++i ) {
+ if ( !( r = db[ i ] ) )
+ continue;
+ if ( r->group == grp )
+ return FALSE;
+ }
+ return TRUE;
+}
+
+QString WidgetDatabase::widgetGroup( int i )
+{
+ setupDataBase( -1 );
+ if ( i >= 0 && i < (int)wGroups->count() )
+ return wGroups->at( i );
+ return QString::null;
+}
+
+int WidgetDatabase::numWidgetGroups()
+{
+ setupDataBase( -1 );
+ return wGroups->count();
+}
+
+bool WidgetDatabase::isGroupVisible( const QString &g )
+{
+ setupDataBase( -1 );
+ return invisibleGroups->find( g ) == -1;
+}
+
+int WidgetDatabase::addCustomWidget( WidgetDatabaseRecord *r )
+{
+ insert( dbcustomcount++, r );
+ return dbcustomcount - 1;
+}
+
+void WidgetDatabase::customWidgetClassNameChanged( const QString &oldName,
+ const QString &newName )
+{
+ int id = idFromClassName( oldName );
+ if ( id == -1 )
+ return;
+ WidgetDatabaseRecord *r = db[ id ];
+ r->name = newName;
+ className2Id->remove( oldName );
+ className2Id->insert( newName, new int( id ) );
+}
+
+bool WidgetDatabase::isCustomWidget( int id )
+{
+ if ( id >= dbcustom && id < dbcustomcount )
+ return TRUE;
+ return FALSE;
+}
+
+bool WidgetDatabase::isCustomPluginWidget( int id )
+{
+ setupDataBase( id );
+ WidgetDatabaseRecord *r = at( id );
+ if ( !r )
+ return FALSE;
+ return r->isPlugin;
+}
+
+bool WidgetDatabase::isWhatsThisLoaded()
+{
+ return whatsThisLoaded;
+}
+
+void WidgetDatabase::loadWhatsThis( const QString &docPath )
+{
+ QString whatsthisFile = docPath + "/whatsthis";
+ QFile f( whatsthisFile );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+ QTextStream ts( &f );
+ while ( !ts.atEnd() ) {
+ QString s = ts.readLine();
+ QStringList l = QStringList::split( " | ", s );
+ int id = idFromClassName( l[ 1 ] );
+ WidgetDatabaseRecord *r = at( id );
+ if ( r )
+ r->whatsThis = l[ 0 ];
+ }
+ whatsThisLoaded = TRUE;
+}
+
+
+// ### Qt 3.1: make these publically accessible via QWidgetDatabase API
+#if defined(UIC)
+bool dbnounload = FALSE;
+QStringList *dbpaths = 0;
+#else
+extern QString *qwf_plugin_dir;
+#endif
+
+
+QPluginManager<WidgetInterface> *widgetManager()
+{
+ if ( !widgetPluginManager ) {
+ QString pluginDir = "/designer";
+#if !defined(UIC)
+ if ( qwf_plugin_dir )
+ pluginDir = *qwf_plugin_dir;
+#endif
+ widgetPluginManager = new QPluginManager<WidgetInterface>( IID_Widget, QApplication::libraryPaths(), pluginDir );
+ cleanup_manager.add( &widgetPluginManager );
+#if defined(UIC)
+ if ( dbnounload )
+ widgetPluginManager->setAutoUnload( FALSE );
+ if ( dbpaths ) {
+ QStringList::ConstIterator it = dbpaths->begin();
+ for ( ; it != dbpaths->end(); ++it )
+ widgetPluginManager->addLibraryPath( *it );
+ }
+#endif
+ }
+ return widgetPluginManager;
+}
diff --git a/tools/designer/shared/widgetdatabase.h b/tools/designer/shared/widgetdatabase.h
new file mode 100644
index 0000000..5802444
--- /dev/null
+++ b/tools/designer/shared/widgetdatabase.h
@@ -0,0 +1,103 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef WIDGETDATABASE_H
+#define WIDGETDATABASE_H
+
+#include <qiconset.h>
+#include <qstring.h>
+#include "../interfaces/widgetinterface.h" // up here for GCC 2.7.* compatibility
+#include <private/qpluginmanager_p.h>
+
+
+extern QPluginManager<WidgetInterface> *widgetManager();
+
+struct WidgetDatabaseRecord
+{
+ WidgetDatabaseRecord();
+ ~WidgetDatabaseRecord();
+ QString iconSet, name, group, toolTip, whatsThis, includeFile;
+ uint isContainer : 1;
+ uint isForm : 1;
+ uint isCommon : 1;
+ uint isPlugin : 1;
+ QIconSet *icon;
+ int nameCounter;
+};
+
+class WidgetDatabase : public Qt
+{
+public:
+ WidgetDatabase();
+ static void setupDataBase( int id );
+ static void setupPlugins();
+
+ static int count();
+ static int startCustom();
+
+ static QIconSet iconSet( int id );
+ static QString className( int id );
+ static QString group( int id );
+ static QString toolTip( int id );
+ static QString whatsThis( int id );
+ static QString includeFile( int id );
+ static bool isForm( int id );
+ static bool isContainer( int id );
+ static bool isCommon( int id );
+
+ static int idFromClassName( const QString &name );
+ static QString createWidgetName( int id );
+
+ static WidgetDatabaseRecord *at( int index );
+ static void insert( int index, WidgetDatabaseRecord *r );
+ static void append( WidgetDatabaseRecord *r );
+
+ static QString widgetGroup( const QString &g );
+ static QString widgetGroup( int i );
+ static int numWidgetGroups();
+ static bool isGroupVisible( const QString &g );
+ static bool isGroupEmpty( const QString &grp );
+
+ static int addCustomWidget( WidgetDatabaseRecord *r );
+ static bool isCustomWidget( int id );
+ static bool isCustomPluginWidget( int id );
+
+ static bool isWhatsThisLoaded();
+ static void loadWhatsThis( const QString &docPath );
+
+ static bool hasWidget( const QString &name );
+ static void customWidgetClassNameChanged( const QString &oldName, const QString &newName );
+
+};
+
+#endif
diff --git a/tools/designer/templates/Configuration_Dialog.ui b/tools/designer/templates/Configuration_Dialog.ui
new file mode 100644
index 0000000..463ff84
--- /dev/null
+++ b/tools/designer/templates/Configuration_Dialog.ui
@@ -0,0 +1,162 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MyDialog2</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>MyDialog2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>597</width>
+ <height>364</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>MyDialog2</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListBox" row="0" column="0">
+ <item>
+ <property name="text">
+ <string>New Item</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>listBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QTabWidget" row="0" column="1">
+ <property name="name">
+ <cstring>tabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget2</cstring>
+ </property>
+ <attribute name="title">
+ <string>Tab</string>
+ </attribute>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget3</cstring>
+ </property>
+ <attribute name="title">
+ <string>Tab</string>
+ </attribute>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="accel">
+ <number>4144</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>MyDialog2</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>MyDialog2</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+</UI>
diff --git a/tools/designer/templates/Dialog_with_Buttons_(Bottom).ui b/tools/designer/templates/Dialog_with_Buttons_(Bottom).ui
new file mode 100644
index 0000000..6e243ac
--- /dev/null
+++ b/tools/designer/templates/Dialog_with_Buttons_(Bottom).ui
@@ -0,0 +1,122 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MyDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>MyDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>511</width>
+ <height>282</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>MyDialog</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>240</y>
+ <width>476</width>
+ <height>33</height>
+ </rect>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="accel">
+ <number>4144</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>MyDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>MyDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+</UI>
diff --git a/tools/designer/templates/Dialog_with_Buttons_(Right).ui b/tools/designer/templates/Dialog_with_Buttons_(Right).ui
new file mode 100644
index 0000000..09d14e9
--- /dev/null
+++ b/tools/designer/templates/Dialog_with_Buttons_(Right).ui
@@ -0,0 +1,122 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MyDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>MyDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>592</width>
+ <height>470</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>MyDialog</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>500</x>
+ <y>30</y>
+ <width>82</width>
+ <height>410</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="accel">
+ <number>4144</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>MyDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>MyDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+</UI>
diff --git a/tools/designer/templates/Tab_Dialog.ui b/tools/designer/templates/Tab_Dialog.ui
new file mode 100644
index 0000000..01d6f2c
--- /dev/null
+++ b/tools/designer/templates/Tab_Dialog.ui
@@ -0,0 +1,146 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MyDialog1</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>MyDialog1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>528</width>
+ <height>368</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>MyDialog1</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget8</cstring>
+ </property>
+ <attribute name="title">
+ <string>Tab</string>
+ </attribute>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget9</cstring>
+ </property>
+ <attribute name="title">
+ <string>Tab</string>
+ </attribute>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="accel">
+ <number>4144</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>MyDialog1</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>MyDialog1</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+</UI>
diff --git a/tools/designer/tools/conv2ui/conv2ui.pro b/tools/designer/tools/conv2ui/conv2ui.pro
new file mode 100644
index 0000000..015ad94
--- /dev/null
+++ b/tools/designer/tools/conv2ui/conv2ui.pro
@@ -0,0 +1,10 @@
+######################################################################
+# Automatically generated by qmake (1.04a) Tue Oct 1 18:34:56 2002
+######################################################################
+TEMPLATE = app
+CONFIG -= moc
+
+# Input
+INCLUDEPATH += ../../interfaces
+SOURCES += main.cpp
+DESTDIR = $$QT_BUILD_TREE/bin
diff --git a/tools/designer/tools/conv2ui/main.cpp b/tools/designer/tools/conv2ui/main.cpp
new file mode 100644
index 0000000..7ede6c7
--- /dev/null
+++ b/tools/designer/tools/conv2ui/main.cpp
@@ -0,0 +1,220 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt GUI Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qapplication.h>
+#include <private/qpluginmanager_p.h>
+#include <qstringlist.h>
+#include <qdir.h>
+#include <stdio.h>
+#include "filterinterface.h"
+#include <qfileinfo.h>
+
+class Conv2ui {
+public:
+ Conv2ui();
+ ~Conv2ui();
+ bool reinit();
+ bool convert( const QString & filename, const QDir & dest );
+ QStringList featureList();
+private:
+ QString getTag( const QString & filename );
+ QString absName( const QString & filename );
+ QPluginManager<ImportFilterInterface> * importFiltersManager;
+};
+
+Conv2ui::Conv2ui() : importFiltersManager( 0 )
+{
+ reinit();
+}
+
+Conv2ui::~Conv2ui()
+{
+ if ( importFiltersManager )
+ delete importFiltersManager;
+}
+
+bool Conv2ui::reinit()
+{
+ if ( importFiltersManager )
+ delete importFiltersManager;
+ importFiltersManager = new QPluginManager<ImportFilterInterface>( IID_ImportFilter,
+ QApplication::libraryPaths(),
+ "/designer");
+ return !!importFiltersManager;
+}
+
+bool Conv2ui::convert( const QString & filename, const QDir & dest )
+{
+ if ( !importFiltersManager ) {
+ qWarning( "Conv2ui: no QPluginManager was found" );
+ return FALSE;
+ }
+
+ if ( !QFile::exists( absName( filename ) ) ) {
+ qWarning( "Conv2ui: can not find file %s", filename.latin1() );
+ return FALSE;
+ }
+
+ QString tag = getTag( filename );
+ QStringList lst = importFiltersManager->featureList();
+
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+
+ ImportFilterInterface * interface = 0;
+ importFiltersManager->queryInterface( *it, &interface );
+
+ if ( !interface ) continue;
+
+ if ( (*it).contains( tag, FALSE ) ) {
+ // Make sure we output the files in the destination dir
+ QString absfile = absName( filename );
+ QString current = QDir::currentDirPath();
+ QDir::setCurrent( dest.absPath() );
+ interface->import( *it, absfile ); // resulting files go into the current dir
+ QDir::setCurrent( current );
+ }
+
+ interface->release();
+
+ }
+
+ return TRUE;
+}
+
+QStringList Conv2ui::featureList()
+{
+ if ( !importFiltersManager ) {
+ return 0;
+ }
+ return importFiltersManager->featureList();
+}
+
+QString Conv2ui::getTag( const QString & filename )
+{
+ QFileInfo info( filename );
+ return info.extension();
+}
+
+QString Conv2ui::absName( const QString & filename )
+{
+ QString absFileName = QDir::isRelativePath( filename ) ?
+ QDir::currentDirPath() +
+ QDir::separator() +
+ filename :
+ filename;
+ return absFileName;
+}
+
+void printHelpMessage( QStringList & formats )
+{
+ printf( "Usage: conv2ui [options] <file> <destination directory>\n\n" );
+ printf( "Options:\n");
+ printf( "\t-help\t\tDisplay this information\n" );
+ printf( "\t-silent\t\tDon't write any messages\n");
+ printf( "\t-version\tDisplay version of conv2ui\n");
+ printf( "Supported file formats:\n" );
+ for ( QStringList::Iterator it = formats.begin(); it != formats.end(); ++it )
+ printf( "\t%s\n", (*it).latin1() );
+}
+
+void printVersion()
+{
+ printf( "Qt user interface file converter for Qt version %s\n", QT_VERSION_STR );
+}
+
+int main( int argc, char ** argv )
+{
+ Conv2ui conv;
+
+ bool help = TRUE;
+ bool silent = FALSE;
+ bool version = FALSE;
+ bool unrecognized = FALSE;
+
+ // parse options
+ int argi = 1;
+ while ( argi < argc && argv[argi][0] == '-' ) {
+ int i = 1;
+ while ( argv[argi][i] != '\0' ) {
+
+ if ( argv[argi][i] == 's' ) {
+ silent = TRUE;
+ break;
+ } else if ( argv[argi][i] == 'h' ) {
+ help = TRUE;
+ break;
+ } else if ( argv[argi][i] == 'v' ) {
+ version = TRUE;
+ silent = TRUE;
+ break;
+ } else {
+ unrecognized = TRUE;
+ }
+ i++;
+ }
+ argi++;
+ }
+
+ // get source file
+ QString src;
+ if ( argv[argi] ) {
+ src = argv[argi++];
+ }
+
+ // get destination directory
+ QDir dst;
+ if ( argv[argi] ) {
+ dst.setPath( argv[argi++] );
+ help = FALSE;
+ }
+
+ if ( !silent ) {
+ printf( "Qt user interface file converter.\n" );
+ if ( unrecognized ) {
+ printf( "conv2ui: Unrecognized option\n" );
+ }
+ }
+ if ( version ) {
+ printVersion();
+ return 0;
+ } else if ( help ) {
+ QStringList formats = conv.featureList();
+ printHelpMessage( formats );
+ return 0;
+ }
+
+ // do the magic
+ if ( conv.convert( src, dst ) )
+ return 0;
+ return -1;
+}
diff --git a/tools/designer/tools/createcw/README b/tools/designer/tools/createcw/README
new file mode 100644
index 0000000..cc48234
--- /dev/null
+++ b/tools/designer/tools/createcw/README
@@ -0,0 +1,18 @@
+This small application makes it much easier to create custom widget
+descriptions for Qt Designer. Using them you can use custom widgets
+in Qt Designer including their signals, slots and properties.
+
+The usual way to do this is to enter all the information in the custom
+widget dialog in Qt Designer for each widget. But this small tool can
+create these description files for your custom widgets which you then
+can simply import into Qt Designer. So you can use your custom widgets
+without any additional work in your forms in Qt Designer.
+
+To do this you must modify the sourcecode (main.cpp) a bit and
+recompile it afterwards. For further instructions how to use it see
+the comments starting with STEP1 and STEP2 in main.cpp.
+
+Note that Qt Designer now supports widget plugins which are more
+versatile and work just like built-in widgets, so you may prefer to
+make your custom widgets into plugins. See the designer manual for
+more information.
diff --git a/tools/designer/tools/createcw/createcw.pro b/tools/designer/tools/createcw/createcw.pro
new file mode 100644
index 0000000..415c0be
--- /dev/null
+++ b/tools/designer/tools/createcw/createcw.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+CONFIG += qt warn_on release
+HEADERS =
+SOURCES = main.cpp
+TARGET = createcw
+
+target.path = $$bins.path
+INSTALLS += target
diff --git a/tools/designer/tools/createcw/main.cpp b/tools/designer/tools/createcw/main.cpp
new file mode 100644
index 0000000..78f8562
--- /dev/null
+++ b/tools/designer/tools/createcw/main.cpp
@@ -0,0 +1,190 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt GUI Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qvaluelist.h>
+#include <qstrlist.h>
+#include <qmetaobject.h>
+#include <qapplication.h>
+
+// STEP1: Include header files of the widgets for which a description
+// should be created here. If you have a widget which is defined in
+// the file mycustomwidget.h in /home/joedeveloper/src, write here
+//
+// #include "/home/joedeveloper/src/mycustomwidget.h"
+//
+// Now go on to STEP2!
+
+// -----------------------------
+
+struct Widget
+{
+ QWidget *w; // the widget
+ QString include; // header file
+ QString location; // "global" for include <...> or "local" include "..."
+};
+
+static QString makeIndent( int indent )
+{
+ QString s;
+ s.fill( ' ', indent * 4 );
+ return s;
+}
+
+static QString entitize( const QString &s )
+{
+ QString s2 = s;
+ s2 = s2.replace( "\"", "&quot;" );
+ s2 = s2.replace( "&", "&amp;" );
+ s2 = s2.replace( ">", "&gt;" );
+ s2 = s2.replace( "<", "&lt;" );
+ s2 = s2.replace( "'", "&apos;" );
+ return s2;
+}
+
+static QString convert_type( const QString &s )
+{
+ QString str( s );
+ if ( str[ 0 ] == 'Q' )
+ str.remove( 0, 1 );
+ str[ 0 ] = str[ 0 ].upper();
+ return str;
+}
+
+static void createDescription( const QValueList<Widget> &l, QTextStream &ts )
+{
+ int indent = 0;
+ ts << "<!DOCTYPE CW><CW>" << endl;
+ ts << makeIndent( indent ) << "<customwidgets>" << endl;
+ indent++;
+
+ for ( QValueList<Widget>::ConstIterator it = l.begin(); it != l.end(); ++it ) {
+ Widget w = *it;
+ ts << makeIndent( indent ) << "<customwidget>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<class>" << w.w->className() << "</class>" << endl;
+ ts << makeIndent( indent ) << "<header location=\"" << w.location << "\">" << w.include << "</header>" << endl;
+ ts << makeIndent( indent ) << "<sizehint>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<width>" << w.w->sizeHint().width() << "</width>" << endl;
+ ts << makeIndent( indent ) << "<height>" << w.w->sizeHint().height() << "</height>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</sizehint>" << endl;
+ ts << makeIndent( indent ) << "<container>" << ( w.w->inherits( "QGroupBox" ) || w.w->inherits( "QWidgetStack" ) ) << "</container>" << endl;
+ ts << makeIndent( indent ) << "<sizepolicy>" << endl;
+ indent++;
+ ts << makeIndent( indent ) << "<hordata>" << (int)w.w->sizePolicy().horData() << "</hordata>" << endl;
+ ts << makeIndent( indent ) << "<verdata>" << (int)w.w->sizePolicy().verData() << "</verdata>" << endl;
+ indent--;
+ ts << makeIndent( indent ) << "</sizepolicy>" << endl;
+
+ QStrList sigs = w.w->metaObject()->signalNames( TRUE );
+ if ( !sigs.isEmpty() ) {
+ for ( int i = 0; i < (int)sigs.count(); ++i )
+ ts << makeIndent( indent ) << "<signal>" << entitize( sigs.at( i ) ) << "</signal>" << endl;
+ }
+ QStrList slts = w.w->metaObject()->slotNames( TRUE );
+ if ( !slts.isEmpty() ) {
+ for ( int i = 0; i < (int)slts.count(); ++i ) {
+ QMetaData::Access data = w.w->metaObject()->slot( i, TRUE )->access;
+ if ( data == QMetaData::Private )
+ continue;
+ ts << makeIndent( indent ) << "<slot access=\""
+ << ( data == QMetaData::Protected ? "protected" : "public" )
+ << "\">" << entitize( slts.at( i ) ) << "</slot>" << endl;
+ }
+ }
+ QStrList props = w.w->metaObject()->propertyNames( TRUE );
+ if ( !props.isEmpty() ) {
+ for ( int i = 0; i < (int)props.count(); ++i ) {
+ const QMetaProperty *p = w.w->metaObject()->
+ property( w.w->metaObject()->
+ findProperty( props.at( i ), TRUE ), TRUE );
+ if ( !p )
+ continue;
+ if ( !p->writable() || !p->designable( w.w ) )
+ continue;
+ ts << makeIndent( indent ) << "<property type=\"" << convert_type( p->type() ) << "\">" << entitize( p->name() ) << "</property>" << endl;
+ }
+ }
+ indent--;
+ ts << makeIndent( indent ) << "</customwidget>" << endl;
+ }
+
+ indent--;
+ ts << makeIndent( indent ) << "</customwidgets>" << endl;
+ ts << "</CW>" << endl;
+}
+
+int main( int argc, char **argv )
+{
+ if ( argc < 2 )
+ return -1;
+ QString fn = argv[1];
+ QFile f( fn );
+ if ( !f.open( IO_WriteOnly ) )
+ return -1;
+ QTextStream ts( &f );
+ QApplication a( argc, argv );
+
+ QValueList<Widget> wl;
+
+ // STEP2: Instantiate all widgets for which a description should
+ // be created here and add them to the list wl. If your custom widget
+ // is e.g. called MyCustomWidget you would write here
+ //
+ // Widget w;
+ // w.w = new MyCustomWidget( 0, 0 );
+ // w.include = "mycustomwidget.h";
+ // w.location = "global";
+ // wl.append( w );
+ //
+ // After that compile the program, link it with your custom widget
+ // (library or object file) and run it like this:
+ // (unix): ./createcw mywidgets.cw
+ // (win32): createcw mywidgets.cw
+ //
+ // After that you can import this description file into the Qt
+ // Designer using the Custom-Widget Dialog (See
+ // Tools->Custom->Edit Custom Widgets... in the Qt Designer)
+ // and use these custom widget there in your forms.
+
+
+
+ // ----------------------------------------------
+
+ createDescription( wl, ts );
+ f.close();
+ return 0;
+}
diff --git a/tools/designer/uic/embed.cpp b/tools/designer/uic/embed.cpp
new file mode 100644
index 0000000..f6f09c4
--- /dev/null
+++ b/tools/designer/uic/embed.cpp
@@ -0,0 +1,316 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "uic.h"
+#include <qfile.h>
+#include <qimage.h>
+#include <qstringlist.h>
+#include <qdatetime.h>
+#include <qfileinfo.h>
+#include <stdio.h>
+#include <ctype.h>
+
+// on embedded, we do not compress image data. Rationale: by mapping
+// the ready-only data directly into memory we are both faster and
+// more memory efficient
+#if defined(Q_WS_QWS) && !defined(QT_NO_IMAGE_COLLECTION_COMPRESSION)
+#define QT_NO_IMAGE_COLLECTION_COMPRESSION
+#endif
+
+struct EmbedImage
+{
+ ~EmbedImage() { delete[] colorTable; }
+ int width, height, depth;
+ int numColors;
+ QRgb* colorTable;
+ QString name;
+ QString cname;
+ bool alpha;
+#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION
+ ulong compressed;
+#endif
+};
+
+static QString convertToCIdentifier( const char *s )
+{
+ QString r = s;
+ int len = r.length();
+ if ( len > 0 && !isalpha( (char)r[0].latin1() ) )
+ r[0] = '_';
+ for ( int i=1; i<len; i++ ) {
+ if ( !isalnum( (char)r[i].latin1() ) )
+ r[i] = '_';
+ }
+ return r;
+}
+
+
+static ulong embedData( QTextStream& out, const uchar* input, int nbytes )
+{
+#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION
+ QByteArray bazip( qCompress( input, nbytes ) );
+ ulong len = bazip.size();
+#else
+ ulong len = nbytes;
+#endif
+ static const char hexdigits[] = "0123456789abcdef";
+ QString s;
+ for ( int i=0; i<(int)len; i++ ) {
+ if ( (i%14) == 0 ) {
+ s += "\n ";
+ out << (const char*)s;
+ s.truncate( 0 );
+ }
+ uint v = (uchar)
+#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION
+ bazip
+#else
+ input
+#endif
+ [i];
+ s += "0x";
+ s += hexdigits[(v >> 4) & 15];
+ s += hexdigits[v & 15];
+ if ( i < (int)len-1 )
+ s += ',';
+ }
+ if ( s.length() )
+ out << (const char*)s;
+ return len;
+}
+
+static void embedData( QTextStream& out, const QRgb* input, int n )
+{
+ out << hex;
+ const QRgb *v = input;
+ for ( int i=0; i<n; i++ ) {
+ if ( (i%14) == 0 )
+ out << "\n ";
+ out << "0x";
+ out << hex << *v++;
+ if ( i < n-1 )
+ out << ',';
+ }
+ out << dec; // back to decimal mode
+}
+
+void Uic::embed( QTextStream& out, const char* project, const QStringList& images )
+{
+
+ QString cProject = convertToCIdentifier( project );
+
+ QStringList::ConstIterator it;
+ out << "/****************************************************************************\n";
+ out << "** Image collection for project '" << project << "'.\n";
+ out << "**\n";
+ out << "** Generated from reading image files: \n";
+ for ( it = images.begin(); it != images.end(); ++it )
+ out << "** " << *it << "\n";
+ out << "**\n";
+ out << "** Created: " << QDateTime::currentDateTime().toString() << "\n";
+ out << "**\n";
+ out << "** WARNING! All changes made in this file will be lost!\n";
+ out << "****************************************************************************/\n";
+ out << "\n";
+
+ out << "#include <qimage.h>\n";
+ out << "#include <qdict.h>\n";
+ out << "#include <qmime.h>\n";
+ out << "#include <qdragobject.h>\n";
+ out << "\n";
+
+ QPtrList<EmbedImage> list_image;
+ list_image.setAutoDelete( TRUE );
+ int image_count = 0;
+ for ( it = images.begin(); it != images.end(); ++it ) {
+ QImage img;
+ if ( !img.load( *it ) ) {
+ fprintf( stderr, "uic: cannot load image file %s\n", (*it).latin1() );
+ continue;
+ }
+ EmbedImage *e = new EmbedImage;
+ e->width = img.width();
+ e->height = img.height();
+ e->depth = img.depth();
+ e->numColors = img.numColors();
+ e->colorTable = new QRgb[e->numColors];
+ e->alpha = img.hasAlphaBuffer();
+ memcpy(e->colorTable, img.colorTable(), e->numColors*sizeof(QRgb));
+ QFileInfo fi( *it );
+ e->name = fi.fileName();
+ e->cname = QString("image_%1").arg( image_count++);
+ list_image.append( e );
+ out << "// " << *it << "\n";
+ QString s;
+ if ( e->depth == 1 )
+ img = img.convertBitOrder(QImage::BigEndian);
+ out << s.sprintf( "static const unsigned char %s_data[] = {",
+ (const char *)e->cname );
+#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION
+ e->compressed =
+#endif
+ embedData( out, img.bits(), img.numBytes() );
+ out << "\n};\n\n";
+ if ( e->numColors ) {
+ out << s.sprintf( "static const QRgb %s_ctable[] = {",
+ (const char *)e->cname );
+ embedData( out, e->colorTable, e->numColors );
+ out << "\n};\n\n";
+ }
+ }
+
+ if ( !list_image.isEmpty() ) {
+ out << "static struct EmbedImage {\n"
+ " int width, height, depth;\n"
+ " const unsigned char *data;\n"
+#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION
+ " ulong compressed;\n"
+#endif
+ " int numColors;\n"
+ " const QRgb *colorTable;\n"
+ " bool alpha;\n"
+ " const char *name;\n"
+ "} embed_image_vec[] = {\n";
+ EmbedImage *e = list_image.first();
+ while ( e ) {
+ out << " { "
+ << e->width << ", "
+ << e->height << ", "
+ << e->depth << ", "
+ << "(const unsigned char*)" << e->cname << "_data, "
+#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION
+ << e->compressed << ", "
+#endif
+ << e->numColors << ", ";
+ if ( e->numColors )
+ out << e->cname << "_ctable, ";
+ else
+ out << "0, ";
+ if ( e->alpha )
+ out << "TRUE, ";
+ else
+ out << "FALSE, ";
+ out << "\"" << e->name << "\" },\n";
+ e = list_image.next();
+ }
+#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION
+ out << " { 0, 0, 0, 0, 0, 0, 0, 0, 0 }\n};\n";
+#else
+ out << " { 0, 0, 0, 0, 0, 0, 0, 0 }\n};\n";
+#endif
+
+ out << "\n"
+ "static QImage uic_findImage( const QString& name )\n"
+ "{\n"
+ " for ( int i=0; embed_image_vec[i].data; i++ ) {\n"
+ " if ( QString::fromUtf8(embed_image_vec[i].name) == name ) {\n"
+#ifndef QT_NO_IMAGE_COLLECTION_COMPRESSION
+ " QByteArray baunzip;\n"
+ " baunzip = qUncompress( embed_image_vec[i].data, \n"
+ " embed_image_vec[i].compressed );\n"
+ " QImage img((uchar*)baunzip.data(),\n"
+ " embed_image_vec[i].width,\n"
+ " embed_image_vec[i].height,\n"
+ " embed_image_vec[i].depth,\n"
+ " (QRgb*)embed_image_vec[i].colorTable,\n"
+ " embed_image_vec[i].numColors,\n"
+ " QImage::BigEndian\n"
+ " );\n"
+ " img = img.copy();\n"
+#else
+ " QImage img((uchar*)embed_image_vec[i].data,\n"
+ " embed_image_vec[i].width,\n"
+ " embed_image_vec[i].height,\n"
+ " embed_image_vec[i].depth,\n"
+ " (QRgb*)embed_image_vec[i].colorTable,\n"
+ " embed_image_vec[i].numColors,\n"
+ " QImage::BigEndian\n"
+ " );\n"
+#endif
+ " if ( embed_image_vec[i].alpha )\n"
+ " img.setAlphaBuffer(TRUE);\n"
+ " return img;\n"
+ " }\n"
+ " }\n"
+ " return QImage();\n"
+ "}\n\n";
+
+ out << "class MimeSourceFactory_" << cProject << " : public QMimeSourceFactory\n";
+ out << "{\n";
+ out << "public:\n";
+ out << " MimeSourceFactory_" << cProject << "() {}\n";
+ out << " ~MimeSourceFactory_" << cProject << "() {}\n";
+ out << " const QMimeSource* data( const QString& abs_name ) const {\n";
+ out << "\tconst QMimeSource* d = QMimeSourceFactory::data( abs_name );\n";
+ out << "\tif ( d || abs_name.isNull() ) return d;\n";
+ out << "\tQImage img = uic_findImage( abs_name );\n";
+ out << "\tif ( !img.isNull() )\n";
+ out << "\t ((QMimeSourceFactory*)this)->setImage( abs_name, img );\n";
+ out << "\treturn QMimeSourceFactory::data( abs_name );\n";
+ out << " };\n";
+ out << "};\n\n";
+
+ out << "static QMimeSourceFactory* factory = 0;\n";
+ out << "\n";
+
+ out << "void qInitImages_" << cProject << "()\n";
+ out << "{\n";
+ out << " if ( !factory ) {\n";
+ out << "\tfactory = new MimeSourceFactory_" << cProject << ";\n";
+ out << "\tQMimeSourceFactory::defaultFactory()->addFactory( factory );\n";
+ out << " }\n";
+ out << "}\n\n";
+
+ out << "void qCleanupImages_" << cProject << "()\n";
+ out << "{\n";
+ out << " if ( factory ) {\n";
+ out << "\tQMimeSourceFactory::defaultFactory()->removeFactory( factory );\n";
+ out << "\tdelete factory;\n";
+ out << "\tfactory = 0;\n";
+ out << " }\n";
+ out << "}\n\n";
+
+ out << "class StaticInitImages_" << cProject << "\n";
+ out << "{\n";
+ out << "public:\n";
+ out << " StaticInitImages_" << cProject << "() { qInitImages_" << cProject << "(); }\n";
+ out << "#if defined(Q_OS_SCO) || defined(Q_OS_UNIXWARE)\n";
+ out << " ~StaticInitImages_" << cProject << "() { }\n";
+ out << "#else\n";
+ out << " ~StaticInitImages_" << cProject << "() { qCleanupImages_" << cProject << "(); }\n";
+ out << "#endif\n";
+ out << "};\n\n";
+
+ out << "static StaticInitImages_" << cProject << " staticImages;\n";
+ }
+}
diff --git a/tools/designer/uic/form.cpp b/tools/designer/uic/form.cpp
new file mode 100644
index 0000000..699e446
--- /dev/null
+++ b/tools/designer/uic/form.cpp
@@ -0,0 +1,1452 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "uic.h"
+#include "parser.h"
+#include "widgetdatabase.h"
+#include "domtool.h"
+#include <qstringlist.h>
+#include <qvaluelist.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+#include <qregexp.h>
+#define NO_STATIC_COLORS
+#include <globaldefs.h>
+
+static QByteArray unzipXPM( QString data, ulong& length )
+{
+ const int lengthOffset = 4;
+ int baSize = data.length() / 2 + lengthOffset;
+ uchar *ba = new uchar[ baSize ];
+ for ( int i = lengthOffset; i < baSize; ++i ) {
+ char h = data[ 2 * (i-lengthOffset) ].latin1();
+ char l = data[ 2 * (i-lengthOffset) + 1 ].latin1();
+ uchar r = 0;
+ if ( h <= '9' )
+ r += h - '0';
+ else
+ r += h - 'a' + 10;
+ r = r << 4;
+ if ( l <= '9' )
+ r += l - '0';
+ else
+ r += l - 'a' + 10;
+ ba[ i ] = r;
+ }
+ // qUncompress() expects the first 4 bytes to be the expected length of the
+ // uncompressed data
+ ba[0] = ( length & 0xff000000 ) >> 24;
+ ba[1] = ( length & 0x00ff0000 ) >> 16;
+ ba[2] = ( length & 0x0000ff00 ) >> 8;
+ ba[3] = ( length & 0x000000ff );
+ QByteArray baunzip = qUncompress( ba, baSize );
+ delete[] ba;
+ return baunzip;
+}
+
+#if QT_VERSION >= 0x030900
+#error Add this functionality to QDir (relativePathTo() maybe?) and \
+remove it from here and from moc
+#endif
+
+QCString combinePath( const char *infile, const char *outfile )
+{
+ QFileInfo inFileInfo( QDir::current(), QFile::decodeName(infile) );
+ QFileInfo outFileInfo( QDir::current(), QFile::decodeName(outfile) );
+ int numCommonComponents = 0;
+
+ QStringList inSplitted =
+ QStringList::split( '/', inFileInfo.dir().canonicalPath(), TRUE );
+ QStringList outSplitted =
+ QStringList::split( '/', outFileInfo.dir().canonicalPath(), TRUE );
+
+ while ( !inSplitted.isEmpty() && !outSplitted.isEmpty() &&
+ inSplitted.first() == outSplitted.first() ) {
+ inSplitted.remove( inSplitted.begin() );
+ outSplitted.remove( outSplitted.begin() );
+ numCommonComponents++;
+ }
+
+ if ( numCommonComponents < 2 ) {
+ /*
+ The paths don't have the same drive, or they don't have the
+ same root directory. Use an absolute path.
+ */
+ return QFile::encodeName( inFileInfo.absFilePath() );
+ } else {
+ /*
+ The paths have something in common. Use a path relative to
+ the output file.
+ */
+ while ( !outSplitted.isEmpty() ) {
+ outSplitted.remove( outSplitted.begin() );
+ inSplitted.prepend( ".." );
+ }
+ inSplitted.append( inFileInfo.fileName() );
+ return QFile::encodeName( inSplitted.join("/") );
+ }
+}
+
+/*!
+ Creates a declaration (header file) for the form given in \a e
+
+ \sa createFormImpl(), createObjectDecl()
+*/
+void Uic::createFormDecl( const QDomElement &e )
+{
+ QDomElement n;
+ QDomNodeList nl;
+ int i;
+ QString objClass = getClassName( e );
+ if ( objClass.isEmpty() )
+ return;
+ QString objName = getObjectName( e );
+
+ QStringList typeDefs;
+
+ QMap<QString, CustomInclude> customWidgetIncludes;
+
+ QString imageMembers;
+
+ /*
+ We are generating a few QImage members that are not strictly
+ necessary in some cases. Ideally, we would use requiredImage,
+ which is computed elsewhere, to keep the generated .h and .cpp
+ files synchronized.
+ */
+
+ // at first the images
+ QMap<QString, int> customWidgets;
+ QStringList forwardDecl;
+ QStringList forwardDecl2;
+ QString exportMacro;
+ for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "images" ) {
+ nl = n.elementsByTagName( "image" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QString img = registerObject( nl.item(i).toElement().attribute("name") );
+ registerObject( img );
+ imageMembers += QString( " QPixmap %1;\n" ).arg( img );
+ }
+ } else if ( n.tagName() == "customwidgets" ) {
+ QDomElement n2 = n.firstChild().toElement();
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "customwidget" ) {
+ QDomElement n3 = n2.firstChild().toElement();
+ QString cl;
+ WidgetDatabaseRecord *r = new WidgetDatabaseRecord;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "class" ) {
+ cl = n3.firstChild().toText().data();
+ if ( !nofwd )
+ forwardDecl << cl;
+ customWidgets.insert( cl, 0 );
+ r->name = cl;
+ } else if ( n3.tagName() == "header" ) {
+ CustomInclude ci;
+ ci.header = n3.firstChild().toText().data();
+ ci.location = n3.attribute( "location", "global" );
+ r->includeFile = ci.header;
+ customWidgetIncludes.insert( cl, ci );
+ }
+ WidgetDatabase::append( r );
+ n3 = n3.nextSibling().toElement();
+ }
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ }
+ }
+
+ // register the object and unify its name
+ objName = registerObject( objName );
+ QString protector = objName.upper() + "_H";
+ protector.replace( "::", "_" );
+ out << "#ifndef " << protector << endl;
+ out << "#define " << protector << endl;
+ out << endl;
+ out << "#include <qvariant.h>" << endl; // for broken HP-UX compilers
+
+ if ( !imageMembers.isEmpty() )
+ out << "#include <qpixmap.h>" << endl;
+
+ QStringList globalIncludes, localIncludes;
+ int wid = WidgetDatabase::idFromClassName( objClass );
+ {
+ QMap<QString, CustomInclude>::Iterator it = customWidgetIncludes.find( objClass );
+ if ( it != customWidgetIncludes.end() ) {
+ if ( ( *it ).location == "global" )
+ globalIncludes += (*it).header;
+ else
+ localIncludes += (*it).header;
+ } else {
+ globalIncludes += WidgetDatabase::includeFile( wid );
+ }
+ }
+
+ nl = e.parentNode().toElement().elementsByTagName( "include" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QDomElement n2 = nl.item(i).toElement();
+ QString s = n2.firstChild().toText().data();
+ if ( n2.attribute( "impldecl", "in implementation" ) == "in declaration" &&
+ n2.attribute( "location" ) != "local" ) {
+ if ( s.right( 5 ) == ".ui.h" )
+ continue;
+ globalIncludes += s;
+ }
+ }
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QDomElement n2 = nl.item(i).toElement();
+ QString s = n2.firstChild().toText().data();
+ if ( n2.attribute( "impldecl", "in implementation" ) == "in declaration" &&
+ n2.attribute( "location" ) == "local" &&!globalIncludes.contains( s ) ) {
+ if ( s.right( 5 ) == ".ui.h" )
+ continue;
+ localIncludes += s;
+ }
+ }
+
+ QStringList::Iterator it;
+
+ globalIncludes = unique( globalIncludes );
+ for ( it = globalIncludes.begin(); it != globalIncludes.end(); ++it ) {
+ if ( !(*it).isEmpty() )
+ out << "#include <" << *it << ">" << endl;
+ }
+ localIncludes = unique( localIncludes );
+ for ( it = localIncludes.begin(); it != localIncludes.end(); ++it ) {
+ if ( !(*it).isEmpty() )
+ out << "#include \"" << *it << "\"" << endl;
+ }
+ out << endl;
+
+ // forward declarations for child widgets and layouts
+ out << "class QVBoxLayout;" << endl;
+ out << "class QHBoxLayout;" << endl;
+ out << "class QGridLayout;" << endl;
+ out << "class QSpacerItem;" << endl;
+ if ( objClass == "QMainWindow" ) {
+ out << "class QAction;" << endl;
+ out << "class QActionGroup;" << endl;
+ out << "class QToolBar;" << endl;
+ out << "class QPopupMenu;" << endl;
+ }
+
+ bool dbForm = FALSE;
+ registerDatabases( e );
+ dbConnections = unique( dbConnections );
+ if ( dbConnections.count() )
+ forwardDecl += "QSqlDatabase";
+ if ( dbCursors.count() )
+ forwardDecl += "QSqlCursor";
+ if ( dbForms[ "(default)" ].count() )
+ dbForm = TRUE;
+ bool subDbForms = FALSE;
+ for ( it = dbConnections.begin(); it != dbConnections.end(); ++it ) {
+ if ( !(*it).isEmpty() && (*it) != "(default)" ) {
+ if ( dbForms[ (*it) ].count() ) {
+ subDbForms = TRUE;
+ break;
+ }
+ }
+ }
+ if ( dbForm || subDbForms )
+ forwardDecl += "QSqlForm";
+
+ for ( it = tags.begin(); it != tags.end(); ++it ) {
+ nl = e.parentNode().toElement().elementsByTagName( *it );
+ for ( i = 1; i < (int) nl.length(); i++ ) { // begin at 1, 0 is the toplevel widget
+ QString s = getClassName( nl.item(i).toElement() );
+ if ( s == "QLayoutWidget" )
+ continue; // hide qlayoutwidgets
+ if ( s == "Line" )
+ s = "QFrame";
+ if ( !(nofwd && customWidgets.contains(s)) )
+ forwardDecl += s;
+ if ( s.mid( 1 ) == "ListBox" || s.mid( 1 ) == "ListView" || s.mid( 1 ) == "IconView" )
+ forwardDecl += "Q" + s.mid( 1 ) + "Item";
+ if ( s == "QDataTable" ) { // other convenience classes which are used in QDataTable signals, and thus should be forward-declared by uic for us
+ forwardDecl += "QSqlRecord";
+ }
+ }
+ }
+
+ // some typedefs, maybe
+ typeDefs = unique( typeDefs );
+ for ( it = typeDefs.begin(); it != typeDefs.end(); ++it ) {
+ if ( !(*it).isEmpty() )
+ out << "typedef " << *it << ";" << endl;
+ }
+
+ nl = e.parentNode().toElement().elementsByTagName( "forward" );
+ for ( i = 0; i < (int) nl.length(); i++ )
+ forwardDecl2 << nl.item(i).toElement().firstChild().toText().data();
+
+ nl = e.parentNode().toElement().elementsByTagName( "include" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QDomElement n2 = nl.item(i).toElement();
+ QString s = n2.firstChild().toText().data();
+ if ( n2.attribute( "impldecl", "in implementation" ) == "in declaration" &&
+ n2.attribute( "location" ) != "local" )
+ globalIncludes += s;
+ }
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QDomElement n2 = nl.item(i).toElement();
+ QString s = n2.firstChild().toText().data();
+ if ( n2.attribute( "impldecl", "in implementation" ) == "in declaration" &&
+ n2.attribute( "location" ) == "local" &&!globalIncludes.contains( s ) )
+ localIncludes += s;
+ }
+ nl = e.parentNode().toElement().elementsByTagName( "exportmacro" );
+ if ( nl.length() == 1 )
+ exportMacro = nl.item( 0 ).firstChild().toText().data();
+
+ forwardDecl = unique( forwardDecl );
+ for ( it = forwardDecl.begin(); it != forwardDecl.end(); ++it ) {
+ if ( !(*it).isEmpty() && (*it) != objClass ) {
+ QString forwardName = *it;
+ QStringList forwardNamespaces = QStringList::split( "::",
+ forwardName );
+ forwardName = forwardNamespaces.last();
+ forwardNamespaces.remove( forwardNamespaces.fromLast() );
+
+ QStringList::ConstIterator ns = forwardNamespaces.begin();
+ while ( ns != forwardNamespaces.end() ) {
+ out << "namespace " << *ns << " {" << endl;
+ ++ns;
+ }
+ out << "class " << forwardName << ";" << endl;
+ for ( int i = 0; i < (int) forwardNamespaces.count(); i++ )
+ out << "}" << endl;
+ }
+ }
+
+ for ( it = forwardDecl2.begin(); it != forwardDecl2.end(); ++it ) {
+ QString fd = *it;
+ fd = fd.stripWhiteSpace();
+ if ( !fd.endsWith( ";" ) )
+ fd += ";";
+ out << fd << endl;
+ }
+
+ out << endl;
+
+ QStringList::ConstIterator ns = namespaces.begin();
+ while ( ns != namespaces.end() ) {
+ out << "namespace " << *ns << " {" << endl;
+ ++ns;
+ }
+
+ out << "class ";
+ if ( !exportMacro.isEmpty() )
+ out << exportMacro << " ";
+ out << bareNameOfClass << " : public " << objClass << endl << "{" << endl;
+
+ /* qmake ignore Q_OBJECT */
+ out << " Q_OBJECT" << endl;
+ out << endl;
+ out << "public:" << endl;
+
+ // constructor
+ if ( objClass == "QDialog" || objClass == "QWizard" ) {
+ out << " " << bareNameOfClass << "( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );" << endl;
+ } else if ( objClass == "QWidget" ) {
+ out << " " << bareNameOfClass << "( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );" << endl;
+ } else if ( objClass == "QMainWindow" ) {
+ out << " " << bareNameOfClass << "( QWidget* parent = 0, const char* name = 0, WFlags fl = WType_TopLevel );" << endl;
+ isMainWindow = TRUE;
+ } else {
+ out << " " << bareNameOfClass << "( QWidget* parent = 0, const char* name = 0 );" << endl;
+ }
+
+ // destructor
+ out << " ~" << bareNameOfClass << "();" << endl;
+ out << endl;
+
+ // children
+ bool needPolish = FALSE;
+ nl = e.parentNode().toElement().elementsByTagName( "widget" );
+ for ( i = 1; i < (int) nl.length(); i++ ) { // start at 1, 0 is the toplevel widget
+ n = nl.item(i).toElement();
+ createObjectDecl( n );
+ QString t = n.tagName();
+ if ( t == "vbox" || t == "hbox" || t == "grid" )
+ createSpacerDecl( n );
+ QString s = getClassName( n );
+ if ( s == "QDataTable" || s == "QDataBrowser" ) {
+ if ( isFrameworkCodeGenerated( n ) )
+ needPolish = TRUE;
+ }
+ }
+
+ // actions, toolbars, menus
+ for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "actions" ) {
+ for ( QDomElement a = n.firstChild().toElement(); !a.isNull(); a = a.nextSibling().toElement() )
+ createActionDecl( a );
+ } else if ( n.tagName() == "toolbars" ) {
+ for ( QDomElement a = n.firstChild().toElement(); !a.isNull(); a = a.nextSibling().toElement() )
+ createToolbarDecl( a );
+ } else if ( n.tagName() == "menubar" ) {
+ out << " " << "QMenuBar *" << getObjectName( n ) << ";" << endl;
+ for ( QDomElement a = n.firstChild().toElement(); !a.isNull(); a = a.nextSibling().toElement() )
+ createMenuBarDecl( a );
+ }
+ }
+ out << endl;
+
+ // database connections
+ dbConnections = unique( dbConnections );
+ bool hadOutput = FALSE;
+ for ( it = dbConnections.begin(); it != dbConnections.end(); ++it ) {
+ if ( !(*it).isEmpty() ) {
+ // only need pointers to non-default connections
+ if ( (*it) != "(default)" && !(*it).isEmpty() ) {
+ out << indent << "QSqlDatabase* " << *it << "Connection;" << endl;
+ hadOutput = TRUE;
+ }
+ }
+ }
+ if ( hadOutput )
+ out << endl;
+
+ QStringList publicSlots, protectedSlots, privateSlots;
+ QStringList publicSlotTypes, protectedSlotTypes, privateSlotTypes;
+ QStringList publicSlotSpecifier, protectedSlotSpecifier, privateSlotSpecifier;
+
+ nl = e.parentNode().toElement().elementsByTagName( "slot" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ n = nl.item(i).toElement();
+ if ( n.parentNode().toElement().tagName() != "slots"
+ && n.parentNode().toElement().tagName() != "connections" )
+ continue;
+ if ( n.attribute( "language", "C++" ) != "C++" )
+ continue;
+ QString returnType = n.attribute( "returnType", "void" );
+ QString functionName = n.firstChild().toText().data().stripWhiteSpace();
+ if ( functionName.endsWith( ";" ) )
+ functionName = functionName.left( functionName.length() - 1 );
+ QString specifier = n.attribute( "specifier" );
+ QString access = n.attribute( "access" );
+ if ( access == "protected" ) {
+ protectedSlots += functionName;
+ protectedSlotTypes += returnType;
+ protectedSlotSpecifier += specifier;
+ } else if ( access == "private" ) {
+ privateSlots += functionName;
+ privateSlotTypes += returnType;
+ privateSlotSpecifier += specifier;
+ } else {
+ publicSlots += functionName;
+ publicSlotTypes += returnType;
+ publicSlotSpecifier += specifier;
+ }
+ }
+
+ QStringList publicFuncts, protectedFuncts, privateFuncts;
+ QStringList publicFunctRetTyp, protectedFunctRetTyp, privateFunctRetTyp;
+ QStringList publicFunctSpec, protectedFunctSpec, privateFunctSpec;
+
+ nl = e.parentNode().toElement().elementsByTagName( "function" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ n = nl.item( i ).toElement();
+ if ( n.parentNode().toElement().tagName() != "functions" )
+ continue;
+ if ( n.attribute( "language", "C++" ) != "C++" )
+ continue;
+ QString returnType = n.attribute( "returnType", "void" );
+ QString functionName = n.firstChild().toText().data().stripWhiteSpace();
+ if ( functionName.endsWith( ";" ) )
+ functionName = functionName.left( functionName.length() - 1 );
+ QString specifier = n.attribute( "specifier" );
+ QString access = n.attribute( "access" );
+ if ( access == "protected" ) {
+ protectedFuncts += functionName;
+ protectedFunctRetTyp += returnType;
+ protectedFunctSpec += specifier;
+ } else if ( access == "private" ) {
+ privateFuncts += functionName;
+ privateFunctRetTyp += returnType;
+ privateFunctSpec += specifier;
+ } else {
+ publicFuncts += functionName;
+ publicFunctRetTyp += returnType;
+ publicFunctSpec += specifier;
+ }
+ }
+
+ QStringList publicVars, protectedVars, privateVars;
+ nl = e.parentNode().toElement().elementsByTagName( "variable" );
+ for ( i = 0; i < (int)nl.length(); i++ ) {
+ n = nl.item( i ).toElement();
+ // Because of compatibility the next lines have to be commented out.
+ // Someday it should be uncommented.
+ //if ( n.parentNode().toElement().tagName() != "variables" )
+ // continue;
+ QString access = n.attribute( "access", "protected" );
+ QString var = n.firstChild().toText().data().stripWhiteSpace();
+ if (var.isEmpty())
+ continue;
+ if ( !var.endsWith( ";" ) )
+ var += ";";
+ if ( access == "public" )
+ publicVars += var;
+ else if ( access == "private" )
+ privateVars += var;
+ else
+ protectedVars += var;
+ }
+
+ if ( !publicVars.isEmpty() ) {
+ for ( it = publicVars.begin(); it != publicVars.end(); ++it )
+ out << indent << *it << endl;
+ out << endl;
+ }
+ if ( !publicFuncts.isEmpty() )
+ writeFunctionsDecl( publicFuncts, publicFunctRetTyp, publicFunctSpec );
+
+ if ( needPolish || !publicSlots.isEmpty() ) {
+ out << "public slots:" << endl;
+ if ( needPolish ) {
+ out << indent << "virtual void polish();" << endl;
+ out << endl;
+ }
+ if ( !publicSlots.isEmpty() )
+ writeFunctionsDecl( publicSlots, publicSlotTypes, publicSlotSpecifier );
+ }
+
+ // find signals
+ QStringList extraSignals;
+ nl = e.parentNode().toElement().elementsByTagName( "signal" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ n = nl.item( i ).toElement();
+ if ( n.parentNode().toElement().tagName() != "signals"
+ && n.parentNode().toElement().tagName() != "connections" )
+ continue;
+ if ( n.attribute( "language", "C++" ) != "C++" )
+ continue;
+ QString sigName = n.firstChild().toText().data().stripWhiteSpace();
+ if ( sigName.endsWith( ";" ) )
+ sigName = sigName.left( sigName.length() - 1 );
+ extraSignals += sigName;
+ }
+
+ // create signals
+ if ( !extraSignals.isEmpty() ) {
+ out << "signals:" << endl;
+ for ( it = extraSignals.begin(); it != extraSignals.end(); ++it )
+ out << " void " << (*it) << ";" << endl;
+ out << endl;
+ }
+
+ out << "protected:" << endl;
+ if ( !protectedVars.isEmpty() ) {
+ for ( it = protectedVars.begin(); it != protectedVars.end(); ++it )
+ out << indent << *it << endl;
+ out << endl;
+ }
+ if ( !protectedFuncts.isEmpty() )
+ writeFunctionsDecl( protectedFuncts, protectedFunctRetTyp, protectedFunctSpec );
+
+ // child layouts
+ registerLayouts( e );
+ out << endl;
+
+#if QT_VERSION >= 0x030900
+#error Make languageChange() a virtual protected non-slot member of QWidget
+#endif
+
+ out << "protected slots:" << endl;
+ out << " virtual void languageChange();" << endl;
+ if ( !protectedSlots.isEmpty() ) {
+ out << endl;
+ writeFunctionsDecl( protectedSlots, protectedSlotTypes, protectedSlotSpecifier );
+ }
+ out << endl;
+
+ // create all private stuff
+ if ( !privateFuncts.isEmpty() || !privateVars.isEmpty() || !imageMembers.isEmpty() ) {
+ out << "private:" << endl;
+ if ( !privateVars.isEmpty() ) {
+ for ( it = privateVars.begin(); it != privateVars.end(); ++it )
+ out << indent << *it << endl;
+ out << endl;
+ }
+ if ( !imageMembers.isEmpty() ) {
+ out << imageMembers;
+ out << endl;
+ }
+ if ( !privateFuncts.isEmpty() )
+ writeFunctionsDecl( privateFuncts, privateFunctRetTyp, privateFunctSpec );
+ }
+
+ if ( !privateSlots.isEmpty() ) {
+ out << "private slots:" << endl;
+ writeFunctionsDecl( privateSlots, privateSlotTypes, privateSlotSpecifier );
+ }
+
+ out << "};" << endl;
+ for ( i = 0; i < (int) namespaces.count(); i++ )
+ out << "}" << endl;
+
+ out << endl;
+ out << "#endif // " << protector << endl;
+}
+
+void Uic::writeFunctionsDecl( const QStringList &fuLst, const QStringList &typLst, const QStringList &specLst )
+{
+ QValueListConstIterator<QString> it, it2, it3;
+ for ( it = fuLst.begin(), it2 = typLst.begin(), it3 = specLst.begin();
+ it != fuLst.end(); ++it, ++it2, ++it3 ) {
+ QString signature = *it;
+ QString specifier;
+ QString pure;
+ QString type = *it2;
+ if ( type.isEmpty() )
+ type = "void";
+ if ( *it3 == "static" ) {
+ specifier = "static ";
+ } else {
+ if ( *it3 != "non virtual" && *it3 != "nonVirtual" )
+ specifier = "virtual ";
+ if ( *it3 == "pure virtual" || *it3 == "pureVirtual" )
+ pure = " = 0";
+ }
+ type.replace( ">>", "> >" );
+ if ( !signature.contains("operator") )
+ signature.replace( ">>", "> >" );
+ out << " " << specifier << type << " " << signature << pure << ";" << endl;
+ }
+ out << endl;
+}
+
+/*!
+ Creates an implementation (cpp-file) for the form given in \a e.
+
+ \sa createFormDecl(), createObjectImpl()
+ */
+void Uic::createFormImpl( const QDomElement &e )
+{
+ QDomElement n;
+ QDomNodeList nl;
+ int i;
+ QString objClass = getClassName( e );
+ if ( objClass.isEmpty() )
+ return;
+ QString objName = getObjectName( e );
+
+ // generate local and local includes required
+ QStringList globalIncludes, localIncludes;
+ QStringList::Iterator it;
+
+ QMap<QString, CustomInclude> customWidgetIncludes;
+
+ // find additional slots and functions
+ QStringList extraFuncts;
+ QStringList extraFunctTyp;
+ QStringList extraFunctSpecifier;
+
+ nl = e.parentNode().toElement().elementsByTagName( "slot" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ n = nl.item(i).toElement();
+ if ( n.parentNode().toElement().tagName() != "slots"
+ && n.parentNode().toElement().tagName() != "connections" )
+ continue;
+ if ( n.attribute( "language", "C++" ) != "C++" )
+ continue;
+ QString functionName = n.firstChild().toText().data().stripWhiteSpace();
+ if ( functionName.endsWith( ";" ) )
+ functionName = functionName.left( functionName.length() - 1 );
+ extraFuncts += functionName;
+ extraFunctTyp += n.attribute( "returnType", "void" );
+ extraFunctSpecifier += n.attribute( "specifier", "virtual" );
+ }
+
+ nl = e.parentNode().toElement().elementsByTagName( "function" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ n = nl.item(i).toElement();
+ if ( n.parentNode().toElement().tagName() != "functions" )
+ continue;
+ if ( n.attribute( "language", "C++" ) != "C++" )
+ continue;
+ QString functionName = n.firstChild().toText().data().stripWhiteSpace();
+ if ( functionName.endsWith( ";" ) )
+ functionName = functionName.left( functionName.length() - 1 );
+ extraFuncts += functionName;
+ extraFunctTyp += n.attribute( "returnType", "void" );
+ extraFunctSpecifier += n.attribute( "specifier", "virtual" );
+ }
+
+ for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "customwidgets" ) {
+ QDomElement n2 = n.firstChild().toElement();
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "customwidget" ) {
+ QDomElement n3 = n2.firstChild().toElement();
+ QString cl;
+ WidgetDatabaseRecord *r = new WidgetDatabaseRecord;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "class" ) {
+ cl = n3.firstChild().toText().data();
+ r->name = cl;
+ } else if ( n3.tagName() == "header" ) {
+ CustomInclude ci;
+ ci.header = n3.firstChild().toText().data();
+ ci.location = n3.attribute( "location", "global" );
+ r->includeFile = ci.header;
+ customWidgetIncludes.insert( cl, ci );
+ }
+ WidgetDatabase::append( r );
+ n3 = n3.nextSibling().toElement();
+ }
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ }
+ }
+
+ // additional includes (local or global) and forward declaractions
+ nl = e.parentNode().toElement().elementsByTagName( "include" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QDomElement n2 = nl.item(i).toElement();
+ QString s = n2.firstChild().toText().data();
+ if ( n2.attribute( "location" ) != "local" ) {
+ if ( s.right( 5 ) == ".ui.h" && !QFile::exists( s ) )
+ continue;
+ if ( n2.attribute( "impldecl", "in implementation" ) != "in implementation" )
+ continue;
+ globalIncludes += s;
+ }
+ }
+
+ registerDatabases( e );
+ dbConnections = unique( dbConnections );
+ if ( dbConnections.count() )
+ globalIncludes += "qsqldatabase.h";
+ if ( dbCursors.count() )
+ globalIncludes += "qsqlcursor.h";
+ bool dbForm = FALSE;
+ if ( dbForms[ "(default)" ].count() )
+ dbForm = TRUE;
+ bool subDbForms = FALSE;
+ for ( it = dbConnections.begin(); it != dbConnections.end(); ++it ) {
+ if ( !(*it).isEmpty() && (*it) != "(default)" ) {
+ if ( dbForms[ (*it) ].count() ) {
+ subDbForms = TRUE;
+ break;
+ }
+ }
+ }
+ if ( dbForm || subDbForms ) {
+ globalIncludes += "qsqlform.h";
+ globalIncludes += "qsqlrecord.h";
+ }
+
+ // do the local includes afterwards, since global includes have priority on clashes
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QDomElement n2 = nl.item(i).toElement();
+ QString s = n2.firstChild().toText().data();
+ if ( n2.attribute( "location" ) == "local" &&!globalIncludes.contains( s ) ) {
+ if ( s.right( 5 ) == ".ui.h" && !QFile::exists( s ) )
+ continue;
+ if ( n2.attribute( "impldecl", "in implementation" ) != "in implementation" )
+ continue;
+ localIncludes += s;
+ }
+ }
+
+ // additional custom widget headers
+ nl = e.parentNode().toElement().elementsByTagName( "header" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QDomElement n2 = nl.item(i).toElement();
+ QString s = n2.firstChild().toText().data();
+ if ( n2.attribute( "location" ) != "local" )
+ globalIncludes += s;
+ else
+ localIncludes += s;
+ }
+
+ // includes for child widgets
+ for ( it = tags.begin(); it != tags.end(); ++it ) {
+ nl = e.parentNode().toElement().elementsByTagName( *it );
+ for ( i = 1; i < (int) nl.length(); i++ ) { // start at 1, 0 is the toplevel widget
+ QString name = getClassName( nl.item(i).toElement() );
+ if ( name == "Spacer" ) {
+ globalIncludes += "qlayout.h";
+ globalIncludes += "qapplication.h";
+ continue;
+ }
+ if ( name.mid( 1 ) == "ListView" )
+ globalIncludes += "qheader.h";
+ if ( name != objClass ) {
+ int wid = WidgetDatabase::idFromClassName( name );
+ QMap<QString, CustomInclude>::Iterator it = customWidgetIncludes.find( name );
+ if ( it == customWidgetIncludes.end() )
+ globalIncludes += WidgetDatabase::includeFile( wid );
+ }
+ }
+ }
+
+ out << "#include <qvariant.h>" << endl; // first for gcc 2.7.2
+
+ globalIncludes = unique( globalIncludes );
+ for ( it = globalIncludes.begin(); it != globalIncludes.end(); ++it ) {
+ if ( !(*it).isEmpty() )
+ out << "#include <" << *it << ">" << endl;
+ }
+
+ out << "#include <qlayout.h>" << endl;
+ out << "#include <qtooltip.h>" << endl;
+ out << "#include <qwhatsthis.h>" << endl;
+ if ( objClass == "QMainWindow" ) {
+ out << "#include <qaction.h>" << endl;
+ out << "#include <qmenubar.h>" << endl;
+ out << "#include <qpopupmenu.h>" << endl;
+ out << "#include <qtoolbar.h>" << endl;
+ }
+
+ // find out what images are required
+ QStringList requiredImages;
+ static const char *imgTags[] = { "pixmap", "iconset", 0 };
+ for ( i = 0; imgTags[i] != 0; i++ ) {
+ nl = e.parentNode().toElement().elementsByTagName( imgTags[i] );
+ for ( int j = 0; j < (int) nl.length(); j++ ) {
+ QDomNode nn = nl.item(j);
+ while ( nn.parentNode() != e.parentNode() )
+ nn = nn.parentNode();
+ if ( nn.nodeName() != "customwidgets" )
+ requiredImages += nl.item(j).firstChild().toText().data();
+ }
+ }
+
+ if ( !requiredImages.isEmpty() || externPixmaps ) {
+ out << "#include <qimage.h>" << endl;
+ out << "#include <qpixmap.h>" << endl << endl;
+ }
+
+ /*
+ Put local includes after all global includes
+ */
+ localIncludes = unique( localIncludes );
+ for ( it = localIncludes.begin(); it != localIncludes.end(); ++it ) {
+ if ( !(*it).isEmpty() && *it != QFileInfo( fileName + ".h" ).fileName() )
+ out << "#include \"" << *it << "\"" << endl;
+ }
+
+ QString uiDotH = fileName + ".h";
+ if ( QFile::exists( uiDotH ) ) {
+ if ( !outputFileName.isEmpty() )
+ uiDotH = combinePath( uiDotH, outputFileName );
+ out << "#include \"" << uiDotH << "\"" << endl;
+ writeFunctImpl = FALSE;
+ }
+
+ // register the object and unify its name
+ objName = registerObject( objName );
+
+ QStringList images;
+ QStringList xpmImages;
+ if ( pixmapLoaderFunction.isEmpty() && !externPixmaps ) {
+ // create images
+ for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "images" ) {
+ nl = n.elementsByTagName( "image" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QString img = registerObject( nl.item(i).toElement().attribute("name") );
+ if ( !requiredImages.contains( img ) )
+ continue;
+ QDomElement tmp = nl.item(i).firstChild().toElement();
+ if ( tmp.tagName() != "data" )
+ continue;
+ QString format = tmp.attribute("format", "PNG" );
+ QString data = tmp.firstChild().toText().data();
+ if ( format == "XPM.GZ" ) {
+ xpmImages += img;
+ ulong length = tmp.attribute("length").toULong();
+ QByteArray baunzip = unzipXPM( data, length );
+ length = baunzip.size();
+ // shouldn't we test the initial 'length' against the
+ // resulting 'length' to catch corrupt UIC files?
+ int a = 0;
+ int column = 0;
+ bool inQuote = FALSE;
+ out << "static const char* const " << img << "_data[] = { " << endl;
+ while ( baunzip[a] != '\"' )
+ a++;
+ for ( ; a < (int) length; a++ ) {
+ out << baunzip[a];
+ if ( baunzip[a] == '\n' ) {
+ column = 0;
+ } else if ( baunzip[a] == '"' ) {
+ inQuote = !inQuote;
+ }
+
+ if ( column++ >= 511 && inQuote ) {
+ out << "\"\n\""; // be nice with MSVC & Co.
+ column = 1;
+ }
+ }
+ out << endl;
+ } else {
+ images += img;
+ out << "static const unsigned char " << img << "_data[] = { " << endl;
+ out << " ";
+ int a ;
+ for ( a = 0; a < (int) (data.length()/2)-1; a++ ) {
+ out << "0x" << QString(data[2*a]) << QString(data[2*a+1]) << ",";
+ if ( a % 12 == 11 )
+ out << endl << " ";
+ else
+ out << " ";
+ }
+ out << "0x" << QString(data[2*a]) << QString(data[2*a+1]) << endl;
+ out << "};" << endl << endl;
+ }
+ }
+ }
+ }
+ out << endl;
+ } else if ( externPixmaps ) {
+ pixmapLoaderFunction = "QPixmap::fromMimeSource";
+ }
+
+ // constructor
+ if ( objClass == "QDialog" || objClass == "QWizard" ) {
+ out << "/*" << endl;
+ out << " * Constructs a " << nameOfClass << " as a child of 'parent', with the" << endl;
+ out << " * name 'name' and widget flags set to 'f'." << endl;
+ out << " *" << endl;
+ out << " * The " << objClass.mid(1).lower() << " will by default be modeless, unless you set 'modal' to" << endl;
+ out << " * TRUE to construct a modal " << objClass.mid(1).lower() << "." << endl;
+ out << " */" << endl;
+ out << nameOfClass << "::" << bareNameOfClass << "( QWidget* parent, const char* name, bool modal, WFlags fl )" << endl;
+ out << " : " << objClass << "( parent, name, modal, fl )";
+ } else if ( objClass == "QWidget" ) {
+ out << "/*" << endl;
+ out << " * Constructs a " << nameOfClass << " as a child of 'parent', with the" << endl;
+ out << " * name 'name' and widget flags set to 'f'." << endl;
+ out << " */" << endl;
+ out << nameOfClass << "::" << bareNameOfClass << "( QWidget* parent, const char* name, WFlags fl )" << endl;
+ out << " : " << objClass << "( parent, name, fl )";
+ } else if ( objClass == "QMainWindow" ) {
+ out << "/*" << endl;
+ out << " * Constructs a " << nameOfClass << " as a child of 'parent', with the" << endl;
+ out << " * name 'name' and widget flags set to 'f'." << endl;
+ out << " *" << endl;
+ out << " */" << endl;
+ out << nameOfClass << "::" << bareNameOfClass << "( QWidget* parent, const char* name, WFlags fl )" << endl;
+ out << " : " << objClass << "( parent, name, fl )";
+ isMainWindow = TRUE;
+ } else {
+ out << "/*" << endl;
+ out << " * Constructs a " << nameOfClass << " which is a child of 'parent', with the" << endl;
+ out << " * name 'name'.' " << endl;
+ out << " */" << endl;
+ out << nameOfClass << "::" << bareNameOfClass << "( QWidget* parent, const char* name )" << endl;
+ out << " : " << objClass << "( parent, name )";
+ }
+
+ // create pixmaps for all images
+ if ( !xpmImages.isEmpty() ) {
+ for ( it = xpmImages.begin(); it != xpmImages.end(); ++it ) {
+ out << "," << endl;
+ out << indent << " " << *it << "( (const char **) " << (*it) << "_data )";
+ }
+ }
+ out << endl;
+
+ out << "{" << endl;
+ if ( isMainWindow )
+ out << indent << "(void)statusBar();" << endl;
+
+ if ( !images.isEmpty() ) {
+ out << indent << "QImage img;" << endl;
+ for ( it = images.begin(); it != images.end(); ++it ) {
+ out << indent << "img.loadFromData( " << (*it) << "_data, sizeof( " << (*it) << "_data ), \"PNG\" );" << endl;
+ out << indent << (*it) << " = img;" << endl;
+ }
+ }
+
+ // set the properties
+ QSize geometry( 0, 0 );
+
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "property" ) {
+ bool stdset = stdsetdef;
+ if ( n.hasAttribute( "stdset" ) )
+ stdset = toBool( n.attribute( "stdset" ) );
+ QString prop = n.attribute("name");
+ QDomElement n2 = n.firstChild().toElement();
+ QString value = setObjectProperty( objClass, QString::null, prop, n2, stdset );
+ if ( value.isEmpty() )
+ continue;
+
+ if ( prop == "geometry" && n2.tagName() == "rect" ) {
+ QDomElement n3 = n2.firstChild().toElement();
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "width" )
+ geometry.setWidth( n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "height" )
+ geometry.setHeight( n3.firstChild().toText().data().toInt() );
+ n3 = n3.nextSibling().toElement();
+ }
+ } else {
+ QString call;
+ if ( stdset ) {
+ call = mkStdSet( prop ) + "( ";
+ } else {
+ call = "setProperty( \"" + prop + "\", ";
+ }
+ call += value + " );";
+
+ if ( n2.tagName() == "string" ) {
+ trout << indent << call << endl;
+ } else if ( prop == "name" ) {
+ out << indent << "if ( !name )" << endl;
+ out << "\t" << call << endl;
+ } else {
+ out << indent << call << endl;
+ }
+ }
+ }
+ }
+
+ // create all children, some forms have special requirements
+
+ if ( objClass == "QWizard" ) {
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( tags.contains( n.tagName() ) ) {
+ QString page = createObjectImpl( n, objClass, "this" );
+ QString comment;
+ QString label = DomTool::readAttribute( n, "title", "", comment ).toString();
+ out << indent << "addPage( " << page << ", QString(\"\") );" << endl;
+ trout << indent << "setTitle( " << page << ", " << trcall( label, comment ) << " );" << endl;
+ QVariant def( FALSE, 0 );
+ if ( DomTool::hasAttribute( n, "backEnabled" ) )
+ out << indent << "setBackEnabled( " << page << ", " << mkBool( DomTool::readAttribute( n, "backEnabled", def).toBool() ) << endl;
+ if ( DomTool::hasAttribute( n, "nextEnabled" ) )
+ out << indent << "setNextEnabled( " << page << ", " << mkBool( DomTool::readAttribute( n, "nextEnabled", def).toBool() ) << endl;
+ if ( DomTool::hasAttribute( n, "finishEnabled" ) )
+ out << indent << "setFinishEnabled( " << page << ", " << mkBool( DomTool::readAttribute( n, "finishEnabled", def).toBool() ) << " );" << endl;
+ if ( DomTool::hasAttribute( n, "helpEnabled" ) )
+ out << indent << "setHelpEnabled( " << page << ", " << mkBool( DomTool::readAttribute( n, "helpEnabled", def).toBool() ) << endl;
+ if ( DomTool::hasAttribute( n, "finish" ) )
+ out << indent << "setFinish( " << page << ", " << mkBool( DomTool::readAttribute( n, "finish", def).toBool() ) << endl;
+ }
+ }
+ } else { // standard widgets
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( tags.contains( n.tagName() ) )
+ createObjectImpl( n, objName, "this" );
+ }
+ }
+
+ // database support
+ dbConnections = unique( dbConnections );
+ if ( dbConnections.count() )
+ out << endl;
+ for ( it = dbConnections.begin(); it != dbConnections.end(); ++it ) {
+ if ( !(*it).isEmpty() && (*it) != "(default)") {
+ out << indent << (*it) << "Connection = QSqlDatabase::database( \"" <<(*it) << "\" );" << endl;
+ }
+ }
+
+ nl = e.parentNode().toElement().elementsByTagName( "widget" );
+ for ( i = 1; i < (int) nl.length(); i++ ) { // start at 1, 0 is the toplevel widget
+ n = nl.item(i).toElement();
+ QString s = getClassName( n );
+ if ( (dbForm || subDbForms) && (s == "QDataBrowser" || s == "QDataView") ) {
+ QString objName = getObjectName( n );
+ QString tab = getDatabaseInfo( n, "table" );
+ QString con = getDatabaseInfo( n, "connection" );
+ out << indent << "QSqlForm* " << objName << "Form = new QSqlForm( this, \"" << objName << "Form\" );" << endl;
+ QDomElement n2;
+ for ( n2 = n.firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement() )
+ createFormImpl( n2, objName, con, tab );
+ out << indent << objName << "->setForm( " << objName << "Form );" << endl;
+ }
+ }
+
+ // actions, toolbars, menubar
+ bool needEndl = FALSE;
+ for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "actions" ) {
+ if ( !needEndl )
+ out << endl << indent << "// actions" << endl;
+ createActionImpl( n.firstChild().toElement(), "this" );
+ needEndl = TRUE;
+ }
+ }
+ if ( needEndl )
+ out << endl;
+ needEndl = FALSE;
+ for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "toolbars" ) {
+ if ( !needEndl )
+ out << endl << indent << "// toolbars" << endl;
+ createToolbarImpl( n, objClass, objName );
+ needEndl = TRUE;
+ }
+ }
+ if ( needEndl )
+ out << endl;
+ needEndl = FALSE;
+ for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "menubar" ) {
+ if ( !needEndl )
+ out << endl << indent << "// menubar" << endl;
+ createMenuBarImpl( n, objClass, objName );
+ needEndl = TRUE;
+ }
+ }
+ if ( needEndl )
+ out << endl;
+
+ out << indent << "languageChange();" << endl;
+
+ // take minimumSizeHint() into account, for height-for-width widgets
+ if ( !geometry.isNull() ) {
+ out << indent << "resize( QSize(" << geometry.width() << ", "
+ << geometry.height() << ").expandedTo(minimumSizeHint()) );" << endl;
+ out << indent << "clearWState( WState_Polished );" << endl;
+ }
+
+ for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "connections" ) {
+ // setup signals and slots connections
+ out << endl << indent << "// signals and slots connections" << endl;
+ nl = n.elementsByTagName( "connection" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QString sender, receiver, signal, slot;
+ for ( QDomElement n2 = nl.item(i).firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement() ) {
+ if ( n2.tagName() == "sender" )
+ sender = n2.firstChild().toText().data();
+ else if ( n2.tagName() == "receiver" )
+ receiver = n2.firstChild().toText().data();
+ else if ( n2.tagName() == "signal" )
+ signal = n2.firstChild().toText().data();
+ else if ( n2.tagName() == "slot" )
+ slot = n2.firstChild().toText().data();
+ }
+ if ( sender.isEmpty() ||
+ receiver.isEmpty() ||
+ signal.isEmpty() ||
+ slot.isEmpty() )
+ continue;
+ if ( sender[0] == '<' ||
+ receiver[0] == '<' ||
+ signal[0] == '<' ||
+ slot[0] == '<' )
+ continue;
+
+ sender = registeredName( sender );
+ receiver = registeredName( receiver );
+
+ // translate formwindow name to "this"
+ if ( sender == objName )
+ sender = "this";
+ if ( receiver == objName )
+ receiver = "this";
+
+ out << indent << "connect( " << sender << ", SIGNAL( " << signal << " ), "
+ << receiver << ", SLOT( " << slot << " ) );" << endl;
+ }
+ } else if ( n.tagName() == "tabstops" ) {
+ // setup tab order
+ out << endl << indent << "// tab order" << endl;
+ QString lastName;
+ QDomElement n2 = n.firstChild().toElement();
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "tabstop" ) {
+ QString name = n2.firstChild().toText().data();
+ name = registeredName( name );
+ if ( !lastName.isEmpty() )
+ out << indent << "setTabOrder( " << lastName << ", " << name << " );" << endl;
+ lastName = name;
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ }
+ }
+
+ // buddies
+ bool firstBuddy = TRUE;
+ for ( QValueList<Buddy>::Iterator buddy = buddies.begin(); buddy != buddies.end(); ++buddy ) {
+ if ( isObjectRegistered( (*buddy).buddy ) ) {
+ if ( firstBuddy ) {
+ out << endl << indent << "// buddies" << endl;
+ }
+ out << indent << (*buddy).key << "->setBuddy( " << registeredName( (*buddy).buddy ) << " );" << endl;
+ firstBuddy = FALSE;
+ }
+ }
+
+ if ( extraFuncts.find( "init()" ) != extraFuncts.end() )
+ out << indent << "init();" << endl;
+
+ // end of constructor
+ out << "}" << endl;
+ out << endl;
+
+ // destructor
+ out << "/*" << endl;
+ out << " * Destroys the object and frees any allocated resources" << endl;
+ out << " */" << endl;
+ out << nameOfClass << "::~" << bareNameOfClass << "()" << endl;
+ out << "{" << endl;
+ if ( extraFuncts.find( "destroy()" ) != extraFuncts.end() )
+ out << indent << "destroy();" << endl;
+ out << indent << "// no need to delete child widgets, Qt does it all for us" << endl;
+ out << "}" << endl;
+ out << endl;
+
+ // handle application events if required
+ bool needFontEventHandler = FALSE;
+ bool needSqlTableEventHandler = FALSE;
+ bool needSqlDataBrowserEventHandler = FALSE;
+ nl = e.elementsByTagName( "widget" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ if ( !DomTool::propertiesOfType( nl.item(i).toElement() , "font" ).isEmpty() )
+ needFontEventHandler = TRUE;
+ QString s = getClassName( nl.item(i).toElement() );
+ if ( s == "QDataTable" || s == "QDataBrowser" ) {
+ if ( !isFrameworkCodeGenerated( nl.item(i).toElement() ) )
+ continue;
+ if ( s == "QDataTable" )
+ needSqlTableEventHandler = TRUE;
+ if ( s == "QDataBrowser" )
+ needSqlDataBrowserEventHandler = TRUE;
+ }
+ if ( needFontEventHandler && needSqlTableEventHandler && needSqlDataBrowserEventHandler )
+ break;
+ }
+ if ( needFontEventHandler && FALSE ) {
+ // indent = "\t"; // increase indentation for if-clause below
+ out << "/*" << endl;
+ out << " * Main event handler. Reimplemented to handle" << endl;
+ out << " * application font changes";
+ out << " */" << endl;
+ out << "bool " << nameOfClass << "::event( QEvent* ev )" << endl;
+ out << "{" << endl;
+ out << " bool ret = " << objClass << "::event( ev ); " << endl;
+ if ( needFontEventHandler ) {
+ indent += "\t";
+ out << " if ( ev->type() == QEvent::ApplicationFontChange ) {" << endl;
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ n = nl.item(i).toElement();
+ QStringList list = DomTool::propertiesOfType( n, "font" );
+ for ( it = list.begin(); it != list.end(); ++it )
+ createExclusiveProperty( n, *it );
+ }
+ out << " }" << endl;
+ indent = " ";
+ }
+ out << "}" << endl;
+ out << endl;
+ }
+
+ if ( needSqlTableEventHandler || needSqlDataBrowserEventHandler ) {
+ out << "/*" << endl;
+ out << " * Widget polish. Reimplemented to handle" << endl;
+ if ( needSqlTableEventHandler )
+ out << " * default data table initialization" << endl;
+ if ( needSqlDataBrowserEventHandler )
+ out << " * default data browser initialization" << endl;
+ out << " */" << endl;
+ out << "void " << nameOfClass << "::polish()" << endl;
+ out << "{" << endl;
+ if ( needSqlTableEventHandler ) {
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QString s = getClassName( nl.item(i).toElement() );
+ if ( s == "QDataTable" ) {
+ n = nl.item(i).toElement();
+ QString c = getObjectName( n );
+ QString conn = getDatabaseInfo( n, "connection" );
+ QString tab = getDatabaseInfo( n, "table" );
+ if ( !( conn.isEmpty() || tab.isEmpty() || !isFrameworkCodeGenerated( nl.item(i).toElement() ) ) ) {
+ out << indent << "if ( " << c << " ) {" << endl;
+ out << indent << indent << "QSqlCursor* cursor = " << c << "->sqlCursor();" << endl;
+ out << indent << indent << "if ( !cursor ) {" << endl;
+ if ( conn == "(default)" )
+ out << indent << indent << indent << "cursor = new QSqlCursor( \"" << tab << "\" );" << endl;
+ else
+ out << indent << indent << indent << "cursor = new QSqlCursor( \"" << tab << "\", TRUE, " << conn << "Connection );" << endl;
+ out << indent << indent << indent << "if ( " << c << "->isReadOnly() ) " << endl;
+ out << indent << indent << indent << indent << "cursor->setMode( QSqlCursor::ReadOnly );" << endl;
+ out << indent << indent << indent << c << "->setSqlCursor( cursor, FALSE, TRUE );" << endl;
+ out << indent << indent << "}" << endl;
+ out << indent << indent << "if ( !cursor->isActive() )" << endl;
+ out << indent << indent << indent << c << "->refresh( QDataTable::RefreshAll );" << endl;
+ out << indent << "}" << endl;
+ }
+ }
+ }
+ }
+ if ( needSqlDataBrowserEventHandler ) {
+ nl = e.elementsByTagName( "widget" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ QString s = getClassName( nl.item(i).toElement() );
+ if ( s == "QDataBrowser" ) {
+ QString obj = getObjectName( nl.item(i).toElement() );
+ QString tab = getDatabaseInfo( nl.item(i).toElement(),
+ "table" );
+ QString conn = getDatabaseInfo( nl.item(i).toElement(),
+ "connection" );
+ if ( !(tab.isEmpty() || !isFrameworkCodeGenerated( nl.item(i).toElement() ) ) ) {
+ out << indent << "if ( " << obj << " ) {" << endl;
+ out << indent << indent << "if ( !" << obj << "->sqlCursor() ) {" << endl;
+ if ( conn == "(default)" )
+ out << indent << indent << indent << "QSqlCursor* cursor = new QSqlCursor( \"" << tab << "\" );" << endl;
+ else
+ out << indent << indent << indent << "QSqlCursor* cursor = new QSqlCursor( \"" << tab << "\", TRUE, " << conn << "Connection );" << endl;
+ out << indent << indent << indent << obj << "->setSqlCursor( cursor, TRUE );" << endl;
+ out << indent << indent << indent << obj << "->refresh();" << endl;
+ out << indent << indent << indent << obj << "->first();" << endl;
+ out << indent << indent << "}" << endl;
+ out << indent << "}" << endl;
+ }
+ }
+ }
+ }
+ out << indent << objClass << "::polish();" << endl;
+ out << "}" << endl;
+ out << endl;
+ }
+
+ out << "/*" << endl;
+ out << " * Sets the strings of the subwidgets using the current" << endl;
+ out << " * language." << endl;
+ out << " */" << endl;
+ out << "void " << nameOfClass << "::languageChange()" << endl;
+ out << "{" << endl;
+ out << languageChangeBody;
+ out << "}" << endl;
+ out << endl;
+
+ // create stubs for additional slots if necessary
+ if ( !extraFuncts.isEmpty() && writeFunctImpl ) {
+ it = extraFuncts.begin();
+ QStringList::Iterator it2 = extraFunctTyp.begin();
+ QStringList::Iterator it3 = extraFunctSpecifier.begin();
+ while ( it != extraFuncts.end() ) {
+ QString type = *it2;
+ if ( type.isEmpty() )
+ type = "void";
+ type = type.simplifyWhiteSpace();
+ QString fname = Parser::cleanArgs( *it );
+ if ( !(*it3).startsWith("pure") ) { // "pure virtual" or "pureVirtual"
+ out << type << " " << nameOfClass << "::" << fname << endl;
+ out << "{" << endl;
+ if ( *it != "init()" && *it != "destroy()" ) {
+ QRegExp numeric( "^(?:signed|unsigned|u?char|u?short|u?int"
+ "|u?long|Q_U?INT(?:8|16|32)|Q_U?LONG|float"
+ "|double)$" );
+ QString retVal;
+
+ /*
+ We return some kind of dummy value to shut the
+ compiler up.
+
+ 1. If the type is 'void', we return nothing.
+
+ 2. If the type is 'bool', we return 'FALSE'.
+
+ 3. If the type is 'unsigned long' or
+ 'Q_UINT16' or 'double' or similar, we
+ return '0'.
+
+ 4. If the type is 'Foo *', we return '0'.
+
+ 5. If the type is 'Foo &', we create a static
+ variable of type 'Foo' and return it.
+
+ 6. If the type is 'Foo', we assume there's a
+ default constructor and use it.
+ */
+ if ( type != "void" ) {
+ QStringList toks = QStringList::split( " ", type );
+ bool isBasicNumericType =
+ ( toks.grep(numeric).count() == toks.count() );
+
+ if ( type == "bool" ) {
+ retVal = "FALSE";
+ } else if ( isBasicNumericType || type.endsWith("*") ) {
+ retVal = "0";
+ } else if ( type.endsWith("&") ) {
+ do {
+ type.truncate( type.length() - 1 );
+ } while ( type.endsWith(" ") );
+ retVal = "uic_temp_var";
+ out << indent << "static " << type << " " << retVal << ";" << endl;
+ } else {
+ retVal = type + "()";
+ }
+ }
+
+ out << indent << "qWarning( \"" << nameOfClass << "::" << fname << ": Not implemented yet\" );" << endl;
+ if ( !retVal.isEmpty() )
+ out << indent << "return " << retVal << ";" << endl;
+ }
+ out << "}" << endl;
+ out << endl;
+ }
+ ++it;
+ ++it2;
+ ++it3;
+ }
+ }
+}
+
+
+/*! Creates form support implementation code for the widgets given
+ in \a e.
+
+ Traverses recursively over all children.
+ */
+
+void Uic::createFormImpl( const QDomElement& e, const QString& form, const QString& connection, const QString& table )
+{
+ if ( e.tagName() == "widget" &&
+ e.attribute( "class" ) != "QDataTable" ) {
+ QString field = getDatabaseInfo( e, "field" );
+ if ( !field.isEmpty() ) {
+ if ( isWidgetInTable( e, connection, table ) )
+ out << indent << form << "Form->insert( " << getObjectName( e ) << ", " << fixString( field ) << " );" << endl;
+ }
+ }
+ QDomElement n;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ createFormImpl( n, form, connection, table );
+ }
+}
diff --git a/tools/designer/uic/main.cpp b/tools/designer/uic/main.cpp
new file mode 100644
index 0000000..ace2033
--- /dev/null
+++ b/tools/designer/uic/main.cpp
@@ -0,0 +1,358 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "uic.h"
+#include "domtool.h"
+#if defined(UIB)
+#include "ui2uib.h"
+#endif
+#include <qapplication.h>
+#include <qfile.h>
+#include <qstringlist.h>
+#include <qdatetime.h>
+#include <qsettings.h>
+#define NO_STATIC_COLORS
+#include <globaldefs.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+// see ### in widgetdatabase.cpp
+extern bool dbnounload;
+extern QStringList *dbpaths;
+
+int main( int argc, char * argv[] )
+{
+ bool impl = FALSE;
+ bool subcl = FALSE;
+ bool imagecollection = FALSE;
+ bool imagecollection_tmpfile = FALSE;
+#if defined(UIB)
+ bool binary = FALSE;
+#endif
+ QStringList images;
+ const char *error = 0;
+ const char* fileName = 0;
+ const char* className = 0;
+ const char* headerFile = 0;
+ QCString outputFile;
+ QCString image_tmpfile;
+ const char* projectName = 0;
+ const char* trmacro = 0;
+ bool nofwd = FALSE;
+ bool fix = FALSE;
+ QCString pchFile;
+ QApplication app(argc, argv, FALSE);
+
+ QString keybase( "/Qt Designer/" +
+ QString::number( (QT_VERSION >> 16) & 0xff ) +"." + QString::number( (QT_VERSION >> 8) & 0xff ) + "/" );
+ QSettings config;
+ config.insertSearchPath( QSettings::Windows, "/Trolltech" );
+ QStringList pluginPaths = config.readListEntry( keybase + "PluginPaths" );
+ if (pluginPaths.count())
+ QApplication::setLibraryPaths(pluginPaths);
+
+ for ( int n = 1; n < argc && error == 0; n++ ) {
+ QCString arg = argv[n];
+ if ( arg[0] == '-' ) { // option
+ QCString opt = &arg[1];
+ if ( opt[0] == 'o' ) { // output redirection
+ if ( opt[1] == '\0' ) {
+ if ( !(n < argc-1) ) {
+ error = "Missing output-file name";
+ break;
+ }
+ outputFile = argv[++n];
+ } else
+ outputFile = &opt[1];
+ } else if ( opt[0] == 'i' || opt == "impl" ) {
+ impl = TRUE;
+ if ( opt == "impl" || opt[1] == '\0' ) {
+ if ( !(n < argc-1) ) {
+ error = "Missing name of header file";
+ break;
+ }
+ headerFile = argv[++n];
+ } else
+ headerFile = &opt[1];
+ } else if ( opt[0] == 'e' || opt == "embed" ) {
+ imagecollection = TRUE;
+ if ( opt == "embed" || opt[1] == '\0' ) {
+ if ( !(n < argc-1) ) {
+ error = "Missing name of project";
+ break;
+ }
+ projectName = argv[++n];
+ } else {
+ projectName = &opt[1];
+ }
+ if ( argc > n+1 && qstrcmp( argv[n+1], "-f" ) == 0 ) {
+ imagecollection_tmpfile = TRUE;
+ image_tmpfile = argv[n+2];
+ n += 2;
+ }
+#if defined(UIB)
+
+ } else if ( opt == "binary" ) {
+ binary = TRUE;
+#endif
+ } else if ( opt == "nofwd" ) {
+ nofwd = TRUE;
+ } else if ( opt == "nounload" ) {
+ dbnounload = TRUE;
+ } else if ( opt == "subdecl" ) {
+ subcl = TRUE;
+ if ( !(n < argc-2) ) {
+ error = "Missing arguments";
+ break;
+ }
+ className = argv[++n];
+ headerFile = argv[++n];
+ } else if ( opt == "subimpl" ) {
+ subcl = TRUE;
+ impl = TRUE;
+ if ( !(n < argc-2) ) {
+ error = "Missing arguments";
+ break;
+ }
+ className = argv[++n];
+ headerFile = argv[++n];
+ } else if ( opt == "tr" ) {
+ if ( opt == "tr" || opt[1] == '\0' ) {
+ if ( !(n < argc-1) ) {
+ error = "Missing tr macro.";
+ break;
+ }
+ trmacro = argv[++n];
+ } else {
+ trmacro = &opt[1];
+ }
+ } else if ( opt == "L" ) {
+ if ( !(n < argc-1) ) {
+ error = "Missing plugin path.";
+ break;
+ }
+ if ( !dbpaths )
+ dbpaths = new QStringList();
+ QString fn = QFile::decodeName( argv[++n] );
+ dbpaths->append( fn );
+ QApplication::addLibraryPath( fn );
+ } else if ( opt == "version" ) {
+ fprintf( stderr,
+ "User Interface Compiler for Qt version %s\n",
+ QT_VERSION_STR );
+ return 1;
+ } else if ( opt == "help" ) {
+ break;
+ } else if ( opt == "fix" ) {
+ fix = TRUE;
+ } else if ( opt == "pch") {
+ if ( !(n < argc-1) ) {
+ error = "Missing name of PCH file";
+ break;
+ }
+ pchFile = argv[++n];
+ } else {
+ error = "Unrecognized option";
+ }
+ } else {
+ if ( imagecollection && !imagecollection_tmpfile )
+ images << argv[n];
+ else if ( fileName ) // can handle only one file
+ error = "Too many input files specified";
+ else
+ fileName = argv[n];
+ }
+ }
+
+ if ( argc < 2 || error || (!fileName && !imagecollection ) ) {
+ fprintf( stderr, "Qt user interface compiler.\n" );
+ if ( error )
+ fprintf( stderr, "uic: %s\n", error );
+
+ fprintf( stderr, "Usage: %s [options] [mode] <uifile>\n\n"
+ "Generate declaration:\n"
+ " %s [options] <uifile>\n"
+ "Generate implementation:\n"
+ " %s [options] -impl <headerfile> <uifile>\n"
+ "\t<headerfile> name of the declaration file\n"
+ "Generate image collection:\n"
+ " %s [options] -embed <project> <image1> <image2> <image3> ...\n"
+ "or\n"
+ " %s [options] -embed <project> -f <temporary file containing image names>\n"
+ "\t<project> project name\n"
+ "\t<image[1-N]> image files\n"
+#if defined(UIB)
+ "Generate binary UI file:\n"
+ " %s [options] -binary <uifile>\n"
+#endif
+ "Generate subclass declaration:\n"
+ " %s [options] -subdecl <subclassname> <baseclassheaderfile> <uifile>\n"
+ "\t<subclassname> name of the subclass to generate\n"
+ "\t<baseclassheaderfile> declaration file of the baseclass\n"
+ "Generate subclass implementation:\n"
+ " %s [options] -subimpl <subclassname> <subclassheaderfile> <uifile>\n"
+ "\t<subclassname> name of the subclass to generate\n"
+ "\t<subclassheaderfile> declaration file of the subclass\n"
+ "Options:\n"
+ "\t-o file Write output to file rather than stdout\n"
+ "\t-pch file Add #include \"file\" as the first statement in implementation\n"
+ "\t-nofwd Omit forward declarations of custom classes\n"
+ "\t-nounload Don't unload plugins after processing\n"
+ "\t-tr func Use func() instead of tr() for i18n\n"
+ "\t-L path Additional plugin search path\n"
+ "\t-version Display version of uic\n"
+ "\t-help Display this information\n"
+ , argv[0], argv[0], argv[0], argv[0], argv[0], argv[0], argv[0]
+#if defined(UIB)
+ , argv[0]
+#endif
+ );
+ return 1;
+ }
+
+ if ( imagecollection_tmpfile ) {
+ QFile ifile( image_tmpfile );
+ if ( ifile.open( IO_ReadOnly ) ) {
+ QTextStream ts( &ifile );
+ QString s = ts.read();
+ s = s.simplifyWhiteSpace();
+ images = QStringList::split( ' ', s );
+ for ( QStringList::Iterator it = images.begin(); it != images.end(); ++it )
+ *it = (*it).simplifyWhiteSpace();
+ }
+ }
+
+#if defined(UIB)
+ if ( binary && outputFile.isEmpty() ) {
+ outputFile = fileName;
+ if ( outputFile.mid(outputFile.length() - 3).lower() == ".ui" )
+ outputFile.truncate( outputFile.length() - 3 );
+ outputFile += ".uib";
+ }
+#endif
+
+ QFile fileOut;
+ if ( !outputFile.isEmpty() ) {
+ fileOut.setName( outputFile );
+ if (!fileOut.open( IO_WriteOnly ) ) {
+ qWarning( "uic: Could not open output file '%s'", outputFile.data() );
+ return 1;
+ }
+ } else {
+ fileOut.open( IO_WriteOnly, stdout );
+ }
+ QTextStream out( &fileOut );
+
+ if ( imagecollection ) {
+ out.setEncoding( QTextStream::Latin1 );
+ Uic::embed( out, projectName, images );
+ return 0;
+ }
+
+ out.setEncoding( QTextStream::UnicodeUTF8 );
+
+ QFile file( fileName );
+ if ( !file.open( IO_ReadOnly ) ) {
+ qWarning( "uic: Could not open file '%s'", fileName );
+ return 1;
+ }
+
+ QDomDocument doc;
+ QString errMsg;
+ int errLine;
+ if ( !doc.setContent( &file, &errMsg, &errLine ) ) {
+ qWarning( QString("uic: Failed to parse %s: ") + errMsg + QString (" in line %d"), fileName, errLine );
+ return 1;
+ }
+
+ QDomElement e = doc.firstChild().toElement();
+ if ( e.hasAttribute("version") && e.attribute("version").toDouble() > 3.3 ) {
+ qWarning( QString("uic: File generated with too recent version of Qt Designer (%s vs. %s)"),
+ e.attribute("version").latin1(), QT_VERSION_STR );
+ return 1;
+ }
+
+ DomTool::fixDocument( doc );
+
+ if ( fix ) {
+ out << doc.toString();
+ return 0;
+#if defined(UIB)
+ } else if ( binary ) {
+ out.unsetDevice();
+ QDataStream binaryOut( &fileOut );
+ convertUiToUib( doc, binaryOut );
+ return 0;
+#endif
+ }
+
+ if ( !subcl ) {
+ out << "/****************************************************************************" << endl;
+ out << "** Form "<< (impl? "implementation" : "interface") << " generated from reading ui file '" << fileName << "'" << endl;
+ out << "**" << endl;
+ out << "** Created: " << QDateTime::currentDateTime().toString() << endl;
+ out << "**" << endl;
+ out << "** WARNING! All changes made in this file will be lost!" << endl;
+ out << "****************************************************************************/" << endl << endl;
+ }
+
+ QString protector;
+ if ( subcl && className && !impl )
+ protector = QString::fromLocal8Bit( className ).upper() + "_H";
+
+ if ( !protector.isEmpty() ) {
+ out << "#ifndef " << protector << endl;
+ out << "#define " << protector << endl;
+ }
+
+ if ( !pchFile.isEmpty() && impl ) {
+ out << "#include \"" << pchFile << "\" // PCH include" << endl;
+ }
+
+ if ( headerFile ) {
+ out << "#include \"" << headerFile << "\"" << endl << endl;
+ }
+
+ Uic( fileName, outputFile, out, doc, !impl, subcl, trmacro, className, nofwd );
+
+ if ( !protector.isEmpty() ) {
+ out << endl;
+ out << "#endif // " << protector << endl;
+ }
+ if ( fileOut.status() != IO_Ok ) {
+ qWarning( "uic: Error writing to file" );
+ if ( !outputFile.isEmpty() )
+ remove( outputFile );
+ }
+ return 0;
+}
diff --git a/tools/designer/uic/object.cpp b/tools/designer/uic/object.cpp
new file mode 100644
index 0000000..00eaa55
--- /dev/null
+++ b/tools/designer/uic/object.cpp
@@ -0,0 +1,745 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "uic.h"
+#include "parser.h"
+#include "domtool.h"
+#include <qregexp.h>
+#include <qsizepolicy.h>
+#include <qstringlist.h>
+#define NO_STATIC_COLORS
+#include <globaldefs.h>
+#include "../interfaces/widgetinterface.h"
+#include "../shared/widgetdatabase.h"
+
+/*!
+ Creates a declaration for the object given in \a e.
+
+ Children are not traversed recursively.
+
+ \sa createObjectImpl()
+ */
+void Uic::createObjectDecl( const QDomElement& e )
+{
+ if ( e.tagName() == "vbox" ) {
+ out << " QVBoxLayout* " << registerObject(getLayoutName(e) ) << ";" << endl;
+ } else if ( e.tagName() == "hbox" ) {
+ out << " QHBoxLayout* " << registerObject(getLayoutName(e) ) << ";" << endl;
+ } else if ( e.tagName() == "grid" ) {
+ out << " QGridLayout* " << registerObject(getLayoutName(e) ) << ";" << endl;
+ } else {
+ QString objClass = getClassName( e );
+ if ( objClass.isEmpty() )
+ return;
+ QString objName = getObjectName( e );
+ if ( objName.isEmpty() )
+ return;
+ // ignore QLayoutWidgets
+ if ( objClass == "QLayoutWidget" )
+ return;
+ // register the object and unify its name
+ objName = registerObject( objName );
+ if ( objClass == "Line" )
+ objClass = "QFrame";
+ else if (objClass == "Spacer")
+ objClass = "QSpacerItem";
+ out << " " << objClass << "* " << objName << ";" << endl;
+ }
+}
+
+
+/*!
+ Creates an implementation for the object given in \a e.
+
+ Traverses recursively over all children.
+
+ Returns the name of the generated child object.
+
+ \sa createObjectDecl()
+ */
+
+static bool createdCentralWidget = FALSE;
+
+QString Uic::createObjectImpl( const QDomElement &e, const QString& parentClass, const QString& par, const QString& layout )
+{
+ QString parent( par );
+ if ( parent == "this" && isMainWindow ) {
+ if ( !createdCentralWidget )
+ out << indent << "setCentralWidget( new QWidget( this, \"qt_central_widget\" ) );" << endl;
+ createdCentralWidget = TRUE;
+ parent = "centralWidget()";
+ }
+ QDomElement n;
+ QString objClass, objName;
+ int numItems = 0;
+ int numColumns = 0;
+ int numRows = 0;
+
+ if ( layouts.contains( e.tagName() ) )
+ return createLayoutImpl( e, parentClass, parent, layout );
+
+ objClass = getClassName( e );
+ if ( objClass.isEmpty() )
+ return objName;
+ objName = getObjectName( e );
+
+ QString definedName = objName;
+ bool isTmpObject = objName.isEmpty() || objClass == "QLayoutWidget";
+ if ( isTmpObject ) {
+ if ( objClass[0] == 'Q' )
+ objName = objClass.mid(1);
+ else
+ objName = objClass.lower();
+ objName.prepend( "private" );
+ }
+
+ bool isLine = objClass == "Line";
+ if ( isLine )
+ objClass = "QFrame";
+
+ out << endl;
+ if ( objClass == "QLayoutWidget" ) {
+ if ( layout.isEmpty() ) {
+ // register the object and unify its name
+ objName = registerObject( objName );
+ out << " QWidget* " << objName << " = new QWidget( " << parent << ", \"" << definedName << "\" );" << endl;
+ } else {
+ // the layout widget is not necessary, hide it by creating its child in the parent
+ QString result;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if (tags.contains( n.tagName() ) )
+ result = createObjectImpl( n, parentClass, parent, layout );
+ }
+ return result;
+ }
+ } else if ( objClass != "QToolBar" && objClass != "QMenuBar" ) {
+ // register the object and unify its name
+ objName = registerObject( objName );
+ out << " ";
+ if ( isTmpObject )
+ out << objClass << "* ";
+ out << objName << " = new " << createObjectInstance( objClass, parent, objName ) << ";" << endl;
+ }
+
+ if ( objClass == "QAxWidget" ) {
+ QString controlId;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "property" && n.attribute( "name" ) == "control" ) {
+ controlId = n.firstChild().toElement().text();
+ }
+ }
+ out << " ";
+ out << objName << "->setControl(\"" << controlId << "\");" << endl;
+ }
+
+ lastItem = "0";
+ // set the properties and insert items
+ bool hadFrameShadow = FALSE;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "property" ) {
+ bool stdset = stdsetdef;
+ if ( n.hasAttribute( "stdset" ) )
+ stdset = toBool( n.attribute( "stdset" ) );
+ QString prop = n.attribute( "name" );
+ if ( prop == "database" )
+ continue;
+ QString value = setObjectProperty( objClass, objName, prop, n.firstChild().toElement(), stdset );
+ if ( value.isEmpty() )
+ continue;
+ if ( prop == "name" )
+ continue;
+ if ( isLine && prop == "frameShadow" )
+ hadFrameShadow = TRUE;
+ if ( prop == "buddy" && value.startsWith("\"") && value.endsWith("\"") ) {
+ buddies << Buddy( objName, value.mid(1, value.length() - 2 ) );
+ continue;
+ }
+ if ( isLine && prop == "orientation" ) {
+ prop = "frameShape";
+ if ( value.right(10) == "Horizontal" )
+ value = "QFrame::HLine";
+ else
+ value = "QFrame::VLine";
+ if ( !hadFrameShadow ) {
+ prop = "frameStyle";
+ value += " | QFrame::Sunken";
+ }
+ }
+ if ( prop == "buttonGroupId" ) {
+ if ( parentClass == "QButtonGroup" )
+ out << indent << parent << "->insert( " << objName << ", " << value << " );" << endl;
+ continue;
+ }
+ if ( prop == "frameworkCode" )
+ continue;
+ if ( objClass == "QMultiLineEdit" &&
+ QRegExp("echoMode|hMargin|maxLength|maxLines|undoEnabled").exactMatch(prop) )
+ continue;
+
+ QString call = objName + "->";
+ if ( stdset ) {
+ call += mkStdSet( prop ) + "( ";
+ } else {
+ call += "setProperty( \"" + prop + "\", ";
+ }
+ if ( prop == "accel" )
+ call += "QKeySequence( " + value + " ) );";
+ else
+ call += value + " );";
+
+ if ( n.firstChild().toElement().tagName() == "string" ||
+ prop == "currentItem" ) {
+ trout << indent << call << endl;
+ } else {
+ out << indent << call << endl;
+ }
+ } else if ( n.tagName() == "item" ) {
+ QString call;
+ QString value;
+
+ if ( objClass.contains( "ListBox" ) ) {
+ call = createListBoxItemImpl( n, objName );
+ if ( !call.isEmpty() ) {
+ if ( numItems == 0 )
+ trout << indent << objName << "->clear();" << endl;
+ trout << indent << call << endl;
+ }
+ } else if ( objClass.contains( "ComboBox" ) ) {
+ call = createListBoxItemImpl( n, objName, &value );
+ if ( !call.isEmpty() ) {
+ if ( numItems == 0 )
+ trout << indent << objName << "->clear();" << endl;
+ trout << indent << call << endl;
+ }
+ } else if ( objClass.contains( "IconView" ) ) {
+ call = createIconViewItemImpl( n, objName );
+ if ( !call.isEmpty() ) {
+ if ( numItems == 0 )
+ trout << indent << objName << "->clear();" << endl;
+ trout << indent << call << endl;
+ }
+ } else if ( objClass.contains( "ListView" ) ) {
+ call = createListViewItemImpl( n, objName, QString::null );
+ if ( !call.isEmpty() ) {
+ if ( numItems == 0 )
+ trout << indent << objName << "->clear();" << endl;
+ trout << call << endl;
+ }
+ }
+ if ( !call.isEmpty() )
+ numItems++;
+ } else if ( n.tagName() == "column" || n.tagName() == "row" ) {
+ QString call;
+ QString value;
+
+ if ( objClass.contains( "ListView" ) ) {
+ call = createListViewColumnImpl( n, objName, &value );
+ if ( !call.isEmpty() ) {
+ out << call;
+ trout << indent << objName << "->header()->setLabel( "
+ << numColumns++ << ", " << value << " );\n";
+ }
+ } else if ( objClass == "QTable" || objClass == "QDataTable" ) {
+ bool isCols = ( n.tagName() == "column" );
+ call = createTableRowColumnImpl( n, objName, &value );
+ if ( !call.isEmpty() ) {
+ out << call;
+ trout << indent << objName << "->"
+ << ( isCols ? "horizontalHeader" : "verticalHeader" )
+ << "()->setLabel( "
+ << ( isCols ? numColumns++ : numRows++ )
+ << ", " << value << " );\n";
+ }
+ }
+ }
+ }
+
+ // create all children, some widgets have special requirements
+
+ if ( objClass == "QTabWidget" ) {
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( tags.contains( n.tagName() ) ) {
+ QString page = createObjectImpl( n, objClass, objName );
+ QString comment;
+ QString label = DomTool::readAttribute( n, "title", "", comment ).toString();
+ out << indent << objName << "->insertTab( " << page << ", QString::fromLatin1(\"\") );" << endl;
+ trout << indent << objName << "->changeTab( " << page << ", "
+ << trcall( label, comment ) << " );" << endl;
+ }
+ }
+ } else if ( objClass == "QWidgetStack" ) {
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( tags.contains( n.tagName() ) ) {
+ QString page = createObjectImpl( n, objClass, objName );
+ int id = DomTool::readAttribute( n, "id", "" ).toInt();
+ out << indent << objName << "->addWidget( " << page << ", " << id << " );" << endl;
+ }
+ }
+ } else if ( objClass == "QToolBox" ) {
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( tags.contains( n.tagName() ) ) {
+ QString page = createObjectImpl( n, objClass, objName );
+ QString comment;
+ QString label = DomTool::readAttribute( n, "label", "", comment ).toString();
+ out << indent << objName << "->addItem( " << page << ", QString::fromLatin1(\"\") );" << endl;
+ trout << indent << objName << "->setItemLabel( " << objName
+ << "->indexOf(" << page << "), " << trcall( label, comment )
+ << " );" << endl;
+ }
+ }
+ } else if ( objClass != "QToolBar" && objClass != "QMenuBar" ) { // standard widgets
+ WidgetInterface *iface = 0;
+ widgetManager()->queryInterface( objClass, &iface );
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ int id = WidgetDatabase::idFromClassName( objClass );
+ if ( WidgetDatabase::isContainer( id ) && WidgetDatabase::isCustomPluginWidget( id ) && iface ) {
+ QWidgetContainerInterfacePrivate *iface2 = 0;
+ iface->queryInterface( IID_QWidgetContainer, (QUnknownInterface**)&iface2 );
+ if ( iface2 ) {
+ bool supportsPages = iface2->supportsPages( objClass );
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( tags.contains( n.tagName() ) ) {
+ if ( supportsPages ) {
+ QString page = createObjectImpl( n, objClass, objName );
+ QString comment;
+ QString label = DomTool::readAttribute( n, "label", "", comment ).toString();
+ out << indent << iface2->createCode( objClass, objName, page, label ) << endl;
+ } else {
+ createObjectImpl( n, objClass, objName );
+ }
+ }
+ }
+ iface2->release();
+ }
+ iface->release();
+ } else {
+#endif
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( tags.contains( n.tagName() ) )
+ createObjectImpl( n, objClass, objName );
+ }
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ }
+#endif
+ }
+
+ return objName;
+}
+
+/*!
+ Creates declarations for spacer items that are children of \a e.
+
+ \sa createObjectDecl()
+*/
+
+void Uic::createSpacerDecl( const QDomElement &e )
+{
+ for ( QDomElement n = e.firstChild().toElement();
+ !n.isNull(); n = n.nextSibling().toElement() )
+ if ( n.tagName() == "spacer" )
+ out << " QSpacerItem* " << registerObject(getObjectName(n)) << ";" << endl;
+}
+
+/*!
+ Creates a set-call for property \a exclusiveProp of the object
+ given in \a e.
+
+ If the object does not have this property, the function does nothing.
+
+ Exclusive properties are used to generate the implementation of
+ application font or palette change handlers in createFormImpl().
+
+ */
+void Uic::createExclusiveProperty( const QDomElement & e, const QString& exclusiveProp )
+{
+ QDomElement n;
+ QString objClass = getClassName( e );
+ if ( objClass.isEmpty() )
+ return;
+ QString objName = getObjectName( e );
+#if 0 // it's not clear whether this check should be here or not
+ if ( objName.isEmpty() )
+ return;
+#endif
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "property" ) {
+ bool stdset = stdsetdef;
+ if ( n.hasAttribute( "stdset" ) )
+ stdset = toBool( n.attribute( "stdset" ) );
+ QString prop = n.attribute( "name" );
+ if ( prop != exclusiveProp )
+ continue;
+ QString value = setObjectProperty( objClass, objName, prop, n.firstChild().toElement(), stdset );
+ if ( value.isEmpty() )
+ continue;
+ // we assume the property isn't of type 'string'
+ out << '\t' << objName << "->setProperty( \"" << prop << "\", " << value << " );" << endl;
+ }
+ }
+}
+
+
+/*! Attention: this function has to be in sync with
+ Resource::saveProperty() and DomTool::elementToVariant. If you
+ change one, change all.
+ */
+QString Uic::setObjectProperty( const QString& objClass, const QString& obj, const QString &prop, const QDomElement &e, bool stdset )
+{
+ QString v;
+ if ( e.tagName() == "rect" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int x = 0, y = 0, w = 0, h = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "x" )
+ x = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "y" )
+ y = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "width" )
+ w = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "height" )
+ h = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = "QRect( %1, %2, %3, %4 )";
+ v = v.arg(x).arg(y).arg(w).arg(h);
+
+ } else if ( e.tagName() == "point" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int x = 0, y = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "x" )
+ x = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "y" )
+ y = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = "QPoint( %1, %2 )";
+ v = v.arg(x).arg(y);
+ } else if ( e.tagName() == "size" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int w = 0, h = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "width" )
+ w = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "height" )
+ h = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = "QSize( %1, %2 )";
+ v = v.arg(w).arg(h);
+ } else if ( e.tagName() == "color" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int r = 0, g = 0, b = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "red" )
+ r = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "green" )
+ g = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "blue" )
+ b = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = "QColor( %1, %2, %3 )";
+ v = v.arg(r).arg(g).arg(b);
+ } else if ( e.tagName() == "font" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ QString attrname = e.parentNode().toElement().attribute( "name", "font" );
+ QString fontname;
+ if ( !obj.isEmpty() ) {
+ fontname = registerObject( obj + "_" + attrname );
+ out << indent << "QFont " << fontname << "( " << obj << "->font() );" << endl;
+ } else {
+ fontname = registerObject( "f" );
+ out << indent << "QFont " << fontname << "( font() );" << endl;
+ }
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "family" )
+ out << indent << fontname << ".setFamily( \"" << n3.firstChild().toText().data() << "\" );" << endl;
+ else if ( n3.tagName() == "pointsize" )
+ out << indent << fontname << ".setPointSize( " << n3.firstChild().toText().data() << " );" << endl;
+ else if ( n3.tagName() == "bold" )
+ out << indent << fontname << ".setBold( " << mkBool( n3.firstChild().toText().data() ) << " );" << endl;
+ else if ( n3.tagName() == "italic" )
+ out << indent << fontname << ".setItalic( " << mkBool( n3.firstChild().toText().data() ) << " );" << endl;
+ else if ( n3.tagName() == "underline" )
+ out << indent << fontname << ".setUnderline( " << mkBool( n3.firstChild().toText().data() ) << " );" << endl;
+ else if ( n3.tagName() == "strikeout" )
+ out << indent << fontname << ".setStrikeOut( " << mkBool( n3.firstChild().toText().data() ) << " );" << endl;
+ n3 = n3.nextSibling().toElement();
+ }
+
+ if ( prop == "font" ) {
+ if ( !obj.isEmpty() )
+ out << indent << obj << "->setFont( " << fontname << " ); " << endl;
+ else
+ out << indent << "setFont( " << fontname << " ); " << endl;
+ } else {
+ v = fontname;
+ }
+ } else if ( e.tagName() == "string" ) {
+ QString txt = e.firstChild().toText().data();
+ QString com = getComment( e.parentNode() );
+
+ if ( prop == "toolTip" && objClass != "QAction" && objClass != "QActionGroup" ) {
+ if ( !obj.isEmpty() )
+ trout << indent << "QToolTip::add( " << obj << ", "
+ << trcall( txt, com ) << " );" << endl;
+ else
+ trout << indent << "QToolTip::add( this, "
+ << trcall( txt, com ) << " );" << endl;
+ } else if ( prop == "whatsThis" && objClass != "QAction" && objClass != "QActionGroup" ) {
+ if ( !obj.isEmpty() )
+ trout << indent << "QWhatsThis::add( " << obj << ", "
+ << trcall( txt, com ) << " );" << endl;
+ else
+ trout << indent << "QWhatsThis::add( this, "
+ << trcall( txt, com ) << " );" << endl;
+ } else {
+ v = trcall( txt, com );
+ }
+ } else if ( e.tagName() == "cstring" ) {
+ v = "\"%1\"";
+ v = v.arg( e.firstChild().toText().data() );
+ } else if ( e.tagName() == "number" ) {
+ v = "%1";
+ v = v.arg( e.firstChild().toText().data() );
+ } else if ( e.tagName() == "bool" ) {
+ if ( stdset )
+ v = "%1";
+ else
+ v = "QVariant( %1, 0 )";
+ v = v.arg( mkBool( e.firstChild().toText().data() ) );
+ } else if ( e.tagName() == "pixmap" ) {
+ v = e.firstChild().toText().data();
+ if ( !pixmapLoaderFunction.isEmpty() ) {
+ v.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) );
+ v.append( QString( externPixmaps ? "\"" : "" ) + " )" );
+ }
+ } else if ( e.tagName() == "iconset" ) {
+ v = "QIconSet( %1 )";
+ QString s = e.firstChild().toText().data();
+ if ( !pixmapLoaderFunction.isEmpty() ) {
+ s.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) );
+ s.append( QString( externPixmaps ? "\"" : "" ) + " )" );
+ }
+ v = v.arg( s );
+ } else if ( e.tagName() == "image" ) {
+ v = e.firstChild().toText().data() + ".convertToImage()";
+ } else if ( e.tagName() == "enum" ) {
+ if ( stdset )
+ v = "%1::%2";
+ else
+ v = "\"%1\"";
+ QString oc = objClass;
+ QString ev = e.firstChild().toText().data();
+ if ( oc == "QListView" && ev == "Manual" ) // #### workaround, rename QListView::Manual in 4.0
+ oc = "QScrollView";
+ if ( stdset )
+ v = v.arg( oc ).arg( ev );
+ else
+ v = v.arg( ev );
+ } else if ( e.tagName() == "set" ) {
+ QString keys( e.firstChild().toText().data() );
+ QStringList lst = QStringList::split( '|', keys );
+ v = "int( ";
+ QStringList::Iterator it = lst.begin();
+ while ( it != lst.end() ) {
+ v += objClass + "::" + *it;
+ if ( it != lst.fromLast() )
+ v += " | ";
+ ++it;
+ }
+ v += " )";
+ } else if ( e.tagName() == "sizepolicy" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ QSizePolicy sp;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "hsizetype" )
+ sp.setHorData( (QSizePolicy::SizeType)n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "vsizetype" )
+ sp.setVerData( (QSizePolicy::SizeType)n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "horstretch" )
+ sp.setHorStretch( n3.firstChild().toText().data().toInt() );
+ else if ( n3.tagName() == "verstretch" )
+ sp.setVerStretch( n3.firstChild().toText().data().toInt() );
+ n3 = n3.nextSibling().toElement();
+ }
+ QString tmp;
+ if ( !obj.isEmpty() )
+ tmp = obj + "->";
+ v = "QSizePolicy( (QSizePolicy::SizeType)%1, (QSizePolicy::SizeType)%2, %3, %4, " + tmp + "sizePolicy().hasHeightForWidth() )";
+ v = v.arg( (int)sp.horData() ).arg( (int)sp.verData() ).arg( sp.horStretch() ).arg( sp.verStretch() );
+ } else if ( e.tagName() == "palette" ) {
+ QPalette pal;
+ bool no_pixmaps = e.elementsByTagName( "pixmap" ).count() == 0;
+ QDomElement n;
+ if ( no_pixmaps ) {
+ n = e.firstChild().toElement();
+ while ( !n.isNull() ) {
+ QColorGroup cg;
+ if ( n.tagName() == "active" ) {
+ cg = loadColorGroup( n );
+ pal.setActive( cg );
+ } else if ( n.tagName() == "inactive" ) {
+ cg = loadColorGroup( n );
+ pal.setInactive( cg );
+ } else if ( n.tagName() == "disabled" ) {
+ cg = loadColorGroup( n );
+ pal.setDisabled( cg );
+ }
+ n = n.nextSibling().toElement();
+ }
+ }
+ if ( no_pixmaps && pal == QPalette( pal.active().button(), pal.active().background() ) ) {
+ v = "QPalette( QColor( %1, %2, %3 ), QColor( %1, %2, %3 ) )";
+ v = v.arg( pal.active().button().red() ).arg( pal.active().button().green() ).arg( pal.active().button().blue() );
+ v = v.arg( pal.active().background().red() ).arg( pal.active().background().green() ).arg( pal.active().background().blue() );
+ } else {
+ QString palette = "pal";
+ if ( !pal_used ) {
+ out << indent << "QPalette " << palette << ";" << endl;
+ pal_used = TRUE;
+ }
+ QString cg = "cg";
+ if ( !cg_used ) {
+ out << indent << "QColorGroup " << cg << ";" << endl;
+ cg_used = TRUE;
+ }
+ n = e.firstChild().toElement();
+ while ( !n.isNull() && n.tagName() != "active" )
+ n = n.nextSibling().toElement();
+ createColorGroupImpl( cg, n );
+ out << indent << palette << ".setActive( " << cg << " );" << endl;
+
+ n = e.firstChild().toElement();
+ while ( !n.isNull() && n.tagName() != "inactive" )
+ n = n.nextSibling().toElement();
+ createColorGroupImpl( cg, n );
+ out << indent << palette << ".setInactive( " << cg << " );" << endl;
+
+ n = e.firstChild().toElement();
+ while ( !n.isNull() && n.tagName() != "disabled" )
+ n = n.nextSibling().toElement();
+ createColorGroupImpl( cg, n );
+ out << indent << palette << ".setDisabled( " << cg << " );" << endl;
+ v = palette;
+ }
+ } else if ( e.tagName() == "cursor" ) {
+ v = "QCursor( %1 )";
+ v = v.arg( e.firstChild().toText().data() );
+ } else if ( e.tagName() == "date" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int y, m, d;
+ y = m = d = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "year" )
+ y = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "month" )
+ m = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "day" )
+ d = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = "QDate( %1, %2, %3 )";
+ v = v.arg(y).arg(m).arg(d);
+ } else if ( e.tagName() == "time" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int h, m, s;
+ h = m = s = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "hour" )
+ h = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "minute" )
+ m = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "second" )
+ s = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = "QTime( %1, %2, %3 )";
+ v = v.arg(h).arg(m).arg(s);
+ } else if ( e.tagName() == "datetime" ) {
+ QDomElement n3 = e.firstChild().toElement();
+ int h, mi, s, y, mo, d;
+ h = mi = s = y = mo = d = 0;
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "hour" )
+ h = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "minute" )
+ mi = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "second" )
+ s = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "year" )
+ y = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "month" )
+ mo = n3.firstChild().toText().data().toInt();
+ else if ( n3.tagName() == "day" )
+ d = n3.firstChild().toText().data().toInt();
+ n3 = n3.nextSibling().toElement();
+ }
+ v = "QDateTime( QDate( %1, %2, %3 ), QTime( %4, %5, %6 ) )";
+ v = v.arg(y).arg(mo).arg(d).arg(h).arg(mi).arg(s);
+ } else if ( e.tagName() == "stringlist" ) {
+ QStringList l;
+ QDomElement n3 = e.firstChild().toElement();
+ QString listname = "l";
+ if ( !obj.isEmpty() ) {
+ listname = obj + "_stringlist";
+ listname = registerObject( listname );
+ out << indent << "QStringList " << listname << ";" << endl;
+ } else {
+ listname = registerObject( listname );
+ out << indent << "QStringList " << listname << ";" << endl;
+ }
+ while ( !n3.isNull() ) {
+ if ( n3.tagName() == "string" )
+ out << indent << listname << " << \"" << n3.firstChild().toText().data().simplifyWhiteSpace() << "\";" << endl;
+ n3 = n3.nextSibling().toElement();
+ }
+ v = listname;
+ }
+ return v;
+}
+
+/*! Extracts a named object property from \a e.
+ */
+QDomElement Uic::getObjectProperty( const QDomElement& e, const QString& name )
+{
+ QDomElement n;
+ for ( n = e.firstChild().toElement();
+ !n.isNull();
+ n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "property" && n.toElement().attribute("name") == name )
+ return n;
+ }
+ return n;
+}
diff --git a/tools/designer/uic/subclassing.cpp b/tools/designer/uic/subclassing.cpp
new file mode 100644
index 0000000..a7be6df
--- /dev/null
+++ b/tools/designer/uic/subclassing.cpp
@@ -0,0 +1,352 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "uic.h"
+#include "parser.h"
+#include "widgetdatabase.h"
+#include "domtool.h"
+#include <qfile.h>
+#include <qstringlist.h>
+#include <qdatetime.h>
+#define NO_STATIC_COLORS
+#include <globaldefs.h>
+#include <qregexp.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/*!
+ Creates a declaration ( headerfile ) for a subclass \a subClass
+ of the form given in \a e
+
+ \sa createSubImpl()
+ */
+void Uic::createSubDecl( const QDomElement &e, const QString& subClass )
+{
+ QDomElement n;
+ QDomNodeList nl;
+ int i;
+
+ QString objClass = getClassName( e );
+ if ( objClass.isEmpty() )
+ return;
+
+ out << "class " << subClass << " : public " << nameOfClass << endl;
+ out << "{" << endl;
+
+/* tmake ignore Q_OBJECT */
+ out << " Q_OBJECT" << endl;
+ out << endl;
+ out << "public:" << endl;
+
+ // constructor
+ if ( objClass == "QDialog" || objClass == "QWizard" ) {
+ out << " " << subClass << "( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );" << endl;
+ } else { // standard QWidget
+ out << " " << subClass << "( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );" << endl;
+ }
+
+ // destructor
+ out << " ~" << subClass << "();" << endl;
+ out << endl;
+
+ // find additional functions
+ QStringList publicSlots, protectedSlots, privateSlots;
+ QStringList publicSlotTypes, protectedSlotTypes, privateSlotTypes;
+ QStringList publicSlotSpecifier, protectedSlotSpecifier, privateSlotSpecifier;
+ QStringList publicFuncts, protectedFuncts, privateFuncts;
+ QStringList publicFunctRetTyp, protectedFunctRetTyp, privateFunctRetTyp;
+ QStringList publicFunctSpec, protectedFunctSpec, privateFunctSpec;
+
+ nl = e.parentNode().toElement().elementsByTagName( "slot" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ n = nl.item(i).toElement();
+ if ( n.parentNode().toElement().tagName() != "slots"
+ && n.parentNode().toElement().tagName() != "connections" )
+ continue;
+ if ( n.attribute( "language", "C++" ) != "C++" )
+ continue;
+ QString returnType = n.attribute( "returnType", "void" );
+ QString functionName = n.firstChild().toText().data().stripWhiteSpace();
+ if ( functionName.endsWith( ";" ) )
+ functionName = functionName.left( functionName.length() - 1 );
+ QString specifier = n.attribute( "specifier" );
+ QString access = n.attribute( "access" );
+ if ( access == "protected" ) {
+ protectedSlots += functionName;
+ protectedSlotTypes += returnType;
+ protectedSlotSpecifier += specifier;
+ } else if ( access == "private" ) {
+ privateSlots += functionName;
+ privateSlotTypes += returnType;
+ privateSlotSpecifier += specifier;
+ } else {
+ publicSlots += functionName;
+ publicSlotTypes += returnType;
+ publicSlotSpecifier += specifier;
+ }
+ }
+
+ nl = e.parentNode().toElement().elementsByTagName( "function" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ n = nl.item(i).toElement();
+ if ( n.parentNode().toElement().tagName() != "functions" )
+ continue;
+ if ( n.attribute( "language", "C++" ) != "C++" )
+ continue;
+ QString returnType = n.attribute( "returnType", "void" );
+ QString functionName = n.firstChild().toText().data().stripWhiteSpace();
+ if ( functionName.endsWith( ";" ) )
+ functionName = functionName.left( functionName.length() - 1 );
+ QString specifier = n.attribute( "specifier" );
+ QString access = n.attribute( "access" );
+ if ( access == "protected" ) {
+ protectedFuncts += functionName;
+ protectedFunctRetTyp += returnType;
+ protectedFunctSpec += specifier;
+ } else if ( access == "private" ) {
+ privateFuncts += functionName;
+ privateFunctRetTyp += returnType;
+ privateFunctSpec += specifier;
+ } else {
+ publicFuncts += functionName;
+ publicFunctRetTyp += returnType;
+ publicFunctSpec += specifier;
+ }
+ }
+
+ if ( !publicFuncts.isEmpty() )
+ writeFunctionsSubDecl( publicFuncts, publicFunctRetTyp, publicFunctSpec );
+
+ // create public additional slots
+ if ( !publicSlots.isEmpty() ) {
+ out << "public slots:" << endl;
+ writeFunctionsSubDecl( publicSlots, publicSlotTypes, publicSlotSpecifier );
+ }
+
+ if ( !protectedFuncts.isEmpty() ) {
+ out << "protected:" << endl;
+ writeFunctionsSubDecl( protectedFuncts, protectedFunctRetTyp, protectedFunctSpec );
+ }
+
+ // create protected additional slots
+ if ( !protectedSlots.isEmpty() ) {
+ out << "protected slots:" << endl;
+ writeFunctionsSubDecl( protectedSlots, protectedSlotTypes, protectedSlotSpecifier );
+ }
+
+ if ( !privateFuncts.isEmpty() ) {
+ out << "private:" << endl;
+ writeFunctionsSubDecl( privateFuncts, privateFunctRetTyp, privateFunctSpec );
+ }
+
+ // create private additional slots
+ if ( !privateSlots.isEmpty() ) {
+ out << "private slots:" << endl;
+ writeFunctionsSubDecl( privateSlots, privateSlotTypes, privateSlotSpecifier );
+ }
+ out << "};" << endl;
+}
+
+void Uic::writeFunctionsSubDecl( const QStringList &fuLst, const QStringList &typLst, const QStringList &specLst )
+{
+ QValueListConstIterator<QString> it, it2, it3;
+ for ( it = fuLst.begin(), it2 = typLst.begin(), it3 = specLst.begin();
+ it != fuLst.end(); ++it, ++it2, ++it3 ) {
+ QString type = *it2;
+ if ( type.isEmpty() )
+ type = "void";
+ if ( *it3 == "non virtual" )
+ continue;
+ out << " " << type << " " << (*it) << ";" << endl;
+ }
+ out << endl;
+}
+
+/*!
+ Creates an implementation for a subclass \a subClass of the form
+ given in \a e
+
+ \sa createSubDecl()
+ */
+void Uic::createSubImpl( const QDomElement &e, const QString& subClass )
+{
+ QDomElement n;
+ QDomNodeList nl;
+ int i;
+
+ QString objClass = getClassName( e );
+ if ( objClass.isEmpty() )
+ return;
+
+ // constructor
+ if ( objClass == "QDialog" || objClass == "QWizard" ) {
+ out << "/* " << endl;
+ out << " * Constructs a " << subClass << " which is a child of 'parent', with the " << endl;
+ out << " * name 'name' and widget flags set to 'f' " << endl;
+ out << " *" << endl;
+ out << " * The " << objClass.mid(1).lower() << " will by default be modeless, unless you set 'modal' to" << endl;
+ out << " * TRUE to construct a modal " << objClass.mid(1).lower() << "." << endl;
+ out << " */" << endl;
+ out << subClass << "::" << subClass << "( QWidget* parent, const char* name, bool modal, WFlags fl )" << endl;
+ out << " : " << nameOfClass << "( parent, name, modal, fl )" << endl;
+ } else { // standard QWidget
+ out << "/* " << endl;
+ out << " * Constructs a " << subClass << " which is a child of 'parent', with the " << endl;
+ out << " * name 'name' and widget flags set to 'f' " << endl;
+ out << " */" << endl;
+ out << subClass << "::" << subClass << "( QWidget* parent, const char* name, WFlags fl )" << endl;
+ out << " : " << nameOfClass << "( parent, name, fl )" << endl;
+ }
+ out << "{" << endl;
+ out << "}" << endl;
+ out << endl;
+
+ // destructor
+ out << "/* " << endl;
+ out << " * Destroys the object and frees any allocated resources" << endl;
+ out << " */" << endl;
+ out << subClass << "::~" << subClass << "()" << endl;
+ out << "{" << endl;
+ out << " // no need to delete child widgets, Qt does it all for us" << endl;
+ out << "}" << endl;
+ out << endl;
+
+
+ // find additional functions
+ QStringList publicSlots, protectedSlots, privateSlots;
+ QStringList publicSlotTypes, protectedSlotTypes, privateSlotTypes;
+ QStringList publicSlotSpecifier, protectedSlotSpecifier, privateSlotSpecifier;
+ QStringList publicFuncts, protectedFuncts, privateFuncts;
+ QStringList publicFunctRetTyp, protectedFunctRetTyp, privateFunctRetTyp;
+ QStringList publicFunctSpec, protectedFunctSpec, privateFunctSpec;
+
+ nl = e.parentNode().toElement().elementsByTagName( "slot" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ n = nl.item(i).toElement();
+ if ( n.parentNode().toElement().tagName() != "slots"
+ && n.parentNode().toElement().tagName() != "connections" )
+ continue;
+ if ( n.attribute( "language", "C++" ) != "C++" )
+ continue;
+ QString returnType = n.attribute( "returnType", "void" );
+ QString functionName = n.firstChild().toText().data().stripWhiteSpace();
+ if ( functionName.endsWith( ";" ) )
+ functionName = functionName.left( functionName.length() - 1 );
+ QString specifier = n.attribute( "specifier" );
+ QString access = n.attribute( "access" );
+ if ( access == "protected" ) {
+ protectedSlots += functionName;
+ protectedSlotTypes += returnType;
+ protectedSlotSpecifier += specifier;
+ } else if ( access == "private" ) {
+ privateSlots += functionName;
+ privateSlotTypes += returnType;
+ privateSlotSpecifier += specifier;
+ } else {
+ publicSlots += functionName;
+ publicSlotTypes += returnType;
+ publicSlotSpecifier += specifier;
+ }
+ }
+
+ nl = e.parentNode().toElement().elementsByTagName( "function" );
+ for ( i = 0; i < (int) nl.length(); i++ ) {
+ n = nl.item(i).toElement();
+ if ( n.parentNode().toElement().tagName() != "functions" )
+ continue;
+ if ( n.attribute( "language", "C++" ) != "C++" )
+ continue;
+ QString returnType = n.attribute( "returnType", "void" );
+ QString functionName = n.firstChild().toText().data().stripWhiteSpace();
+ if ( functionName.endsWith( ";" ) )
+ functionName = functionName.left( functionName.length() - 1 );
+ QString specifier = n.attribute( "specifier" );
+ QString access = n.attribute( "access" );
+ if ( access == "protected" ) {
+ protectedFuncts += functionName;
+ protectedFunctRetTyp += returnType;
+ protectedFunctSpec += specifier;
+ } else if ( access == "private" ) {
+ privateFuncts += functionName;
+ privateFunctRetTyp += returnType;
+ privateFunctSpec += specifier;
+ } else {
+ publicFuncts += functionName;
+ publicFunctRetTyp += returnType;
+ publicFunctSpec += specifier;
+ }
+ }
+
+ if ( !publicFuncts.isEmpty() )
+ writeFunctionsSubImpl( publicFuncts, publicFunctRetTyp, publicFunctSpec, subClass, "public function" );
+
+ // create stubs for public additional slots
+ if ( !publicSlots.isEmpty() )
+ writeFunctionsSubImpl( publicSlots, publicSlotTypes, publicSlotSpecifier, subClass, "public slot" );
+
+ if ( !protectedFuncts.isEmpty() )
+ writeFunctionsSubImpl( protectedFuncts, protectedFunctRetTyp, protectedFunctSpec, subClass, "protected function" );
+
+ // create stubs for protected additional slots
+ if ( !protectedSlots.isEmpty() )
+ writeFunctionsSubImpl( protectedSlots, protectedSlotTypes, protectedSlotSpecifier, subClass, "protected slot" );
+
+ if ( !privateFuncts.isEmpty() )
+ writeFunctionsSubImpl( privateFuncts, privateFunctRetTyp, privateFunctSpec, subClass, "private function" );
+
+ // create stubs for private additional slots
+ if ( !privateSlots.isEmpty() )
+ writeFunctionsSubImpl( privateSlots, privateSlotTypes, privateSlotSpecifier, subClass, "private slot" );
+}
+
+void Uic::writeFunctionsSubImpl( const QStringList &fuLst, const QStringList &typLst, const QStringList &specLst,
+ const QString &subClass, const QString &descr )
+{
+ QValueListConstIterator<QString> it, it2, it3;
+ for ( it = fuLst.begin(), it2 = typLst.begin(), it3 = specLst.begin();
+ it != fuLst.end(); ++it, ++it2, ++it3 ) {
+ QString type = *it2;
+ if ( type.isEmpty() )
+ type = "void";
+ if ( *it3 == "non virtual" )
+ continue;
+ out << "/*" << endl;
+ out << " * " << descr << endl;
+ out << " */" << endl;
+ out << type << " " << subClass << "::" << (*it) << endl;
+ out << "{" << endl;
+ out << " qWarning( \"" << subClass << "::" << (*it) << " not yet implemented!\" );" << endl;
+ out << "}" << endl << endl;
+ }
+ out << endl;
+}
diff --git a/tools/designer/uic/uic.cpp b/tools/designer/uic/uic.cpp
new file mode 100644
index 0000000..b0a61d6
--- /dev/null
+++ b/tools/designer/uic/uic.cpp
@@ -0,0 +1,1129 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "uic.h"
+#include "parser.h"
+#include "widgetdatabase.h"
+#include "domtool.h"
+#include <qfile.h>
+#include <qstringlist.h>
+#include <qdatetime.h>
+#define NO_STATIC_COLORS
+#include <globaldefs.h>
+#include <qregexp.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+bool Uic::isMainWindow = FALSE;
+
+QString Uic::getComment( const QDomNode& n )
+{
+ QDomNode child = n.firstChild();
+ while ( !child.isNull() ) {
+ if ( child.toElement().tagName() == "comment" )
+ return child.toElement().firstChild().toText().data();
+ child = child.nextSibling();
+ }
+ return QString::null;
+}
+
+QString Uic::mkBool( bool b )
+{
+ return b? "TRUE" : "FALSE";
+}
+
+QString Uic::mkBool( const QString& s )
+{
+ return mkBool( s == "true" || s == "1" );
+}
+
+bool Uic::toBool( const QString& s )
+{
+ return s == "true" || s.toInt() != 0;
+}
+
+QString Uic::fixString( const QString &str, bool encode )
+{
+ QString s;
+ if ( !encode ) {
+ s = str;
+ s.replace( "\\", "\\\\" );
+ s.replace( "\"", "\\\"" );
+ s.replace( "\r", "" );
+ s.replace( "\n", "\\n\"\n\"" );
+ } else {
+ QCString utf8 = str.utf8();
+ const int l = utf8.length();
+
+ for ( int i = 0; i < l; ++i ) {
+ uchar c = (uchar)utf8[i];
+ if (c != 0x0d) // skip \r
+ s += "\\x" + QString::number(c, 16);
+
+ if (i && (i % 20) == 0)
+ s += "\"\n \"";
+ }
+ }
+
+ return "\"" + s + "\"";
+}
+
+QString Uic::trcall( const QString& sourceText, const QString& comment )
+{
+ if ( sourceText.isEmpty() && comment.isEmpty() )
+ return "QString::null";
+
+ QString t = trmacro;
+ bool encode = FALSE;
+ if ( t.isNull() ) {
+ t = "tr";
+ for ( int i = 0; i < (int) sourceText.length(); i++ ) {
+ if ( sourceText[i].unicode() >= 0x80 ) {
+ t = "trUtf8";
+ encode = TRUE;
+ break;
+ }
+ }
+ }
+
+ if ( comment.isEmpty() ) {
+ return t + "( " + fixString( sourceText, encode ) + " )";
+ } else {
+ return t + "( " + fixString( sourceText, encode ) + ", " +
+ fixString( comment, encode ) + " )";
+ }
+}
+
+QString Uic::mkStdSet( const QString& prop )
+{
+ return QString( "set" ) + prop[0].upper() + prop.mid(1);
+}
+
+
+
+/*!
+ \class Uic uic.h
+ \brief User Interface Compiler
+
+ The class Uic encapsulates the user interface compiler (uic).
+ */
+Uic::Uic( const QString &fn, const char *outputFn, QTextStream &outStream,
+ QDomDocument doc, bool decl, bool subcl, const QString &trm,
+ const QString& subClass, bool omitForwardDecls )
+ : out( outStream ), trout( &languageChangeBody ),
+ outputFileName( outputFn ), trmacro( trm ), nofwd( omitForwardDecls )
+{
+ fileName = fn;
+ writeFunctImpl = TRUE;
+ defMargin = BOXLAYOUT_DEFAULT_MARGIN;
+ defSpacing = BOXLAYOUT_DEFAULT_SPACING;
+ externPixmaps = FALSE;
+ indent = " "; // default indent
+
+ item_used = cg_used = pal_used = 0;
+
+ layouts << "hbox" << "vbox" << "grid";
+ tags = layouts;
+ tags << "widget";
+
+ pixmapLoaderFunction = getPixmapLoaderFunction( doc.firstChild().toElement() );
+ nameOfClass = getFormClassName( doc.firstChild().toElement() );
+
+ uiFileVersion = doc.firstChild().toElement().attribute("version");
+ stdsetdef = toBool( doc.firstChild().toElement().attribute("stdsetdef") );
+
+ if ( doc.firstChild().isNull() || doc.firstChild().firstChild().isNull() )
+ return;
+ QDomElement e = doc.firstChild().firstChild().toElement();
+ QDomElement widget;
+ while ( !e.isNull() ) {
+ if ( e.tagName() == "widget" ) {
+ widget = e;
+ } else if ( e.tagName() == "pixmapinproject" ) {
+ externPixmaps = TRUE;
+ } else if ( e.tagName() == "layoutdefaults" ) {
+ defSpacing = e.attribute( "spacing", defSpacing.toString() );
+ defMargin = e.attribute( "margin", defMargin.toString() );
+ } else if ( e.tagName() == "layoutfunctions" ) {
+ defSpacing = e.attribute( "spacing", defSpacing.toString() );
+ bool ok;
+ defSpacing.toInt( &ok );
+ if ( !ok ) {
+ QString buf = defSpacing.toString();
+ defSpacing = buf.append( "()" );
+ }
+ defMargin = e.attribute( "margin", defMargin.toString() );
+ defMargin.toInt( &ok );
+ if ( !ok ) {
+ QString buf = defMargin.toString();
+ defMargin = buf.append( "()" );
+ }
+ }
+ e = e.nextSibling().toElement();
+ }
+ e = widget;
+
+ if ( nameOfClass.isEmpty() )
+ nameOfClass = getObjectName( e );
+ namespaces = QStringList::split( "::", nameOfClass );
+ bareNameOfClass = namespaces.last();
+ namespaces.remove( namespaces.fromLast() );
+
+ if ( subcl ) {
+ if ( decl )
+ createSubDecl( e, subClass );
+ else
+ createSubImpl( e, subClass );
+ } else {
+ if ( decl )
+ createFormDecl( e );
+ else
+ createFormImpl( e );
+ }
+
+}
+
+/*! Extracts a pixmap loader function from \a e
+ */
+QString Uic::getPixmapLoaderFunction( const QDomElement& e )
+{
+ QDomElement n;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "pixmapfunction" )
+ return n.firstChild().toText().data();
+ }
+ return QString::null;
+}
+
+
+/*! Extracts the forms class name from \a e
+ */
+QString Uic::getFormClassName( const QDomElement& e )
+{
+ QDomElement n;
+ QString cn;
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "class" ) {
+ QString s = n.firstChild().toText().data();
+ int i;
+ while ( ( i = s.find(' ' )) != -1 )
+ s[i] = '_';
+ cn = s;
+ }
+ }
+ return cn;
+}
+
+/*! Extracts a class name from \a e.
+ */
+QString Uic::getClassName( const QDomElement& e )
+{
+ QString s = e.attribute( "class" );
+ if ( s.isEmpty() && e.tagName() == "toolbar" )
+ s = "QToolBar";
+ else if ( s.isEmpty() && e.tagName() == "menubar" )
+ s = "QMenuBar";
+ return s;
+}
+
+/*! Returns TRUE if database framework code is generated, else FALSE.
+*/
+
+bool Uic::isFrameworkCodeGenerated( const QDomElement& e )
+{
+ QDomElement n = getObjectProperty( e, "frameworkCode" );
+ if ( n.attribute("name") == "frameworkCode" &&
+ !DomTool::elementToVariant( n.firstChild().toElement(), QVariant( TRUE, 0 ) ).toBool() )
+ return FALSE;
+ return TRUE;
+}
+
+/*! Extracts an object name from \a e. It's stored in the 'name'
+ property.
+ */
+QString Uic::getObjectName( const QDomElement& e )
+{
+ QDomElement n = getObjectProperty( e, "name" );
+ if ( n.firstChild().toElement().tagName() == "cstring" )
+ return n.firstChild().toElement().firstChild().toText().data();
+ return QString::null;
+}
+
+/*! Extracts an layout name from \a e. It's stored in the 'name'
+ property of the preceeding sibling (the first child of a QLayoutWidget).
+ */
+QString Uic::getLayoutName( const QDomElement& e )
+{
+ QDomElement p = e.parentNode().toElement();
+ QString name;
+
+ if ( getClassName(p) != "QLayoutWidget" )
+ name = "Layout";
+
+ QDomElement n = getObjectProperty( p, "name" );
+ if ( n.firstChild().toElement().tagName() == "cstring" ) {
+ name.prepend( n.firstChild().toElement().firstChild().toText().data() );
+ return QStringList::split( "::", name ).last();
+ }
+ return e.tagName();
+}
+
+
+QString Uic::getDatabaseInfo( const QDomElement& e, const QString& tag )
+{
+ QDomElement n;
+ QDomElement n1;
+ int child = 0;
+ // database info is a stringlist stored in this order
+ if ( tag == "connection" )
+ child = 0;
+ else if ( tag == "table" )
+ child = 1;
+ else if ( tag == "field" )
+ child = 2;
+ else
+ return QString::null;
+ n = getObjectProperty( e, "database" );
+ if ( n.firstChild().toElement().tagName() == "stringlist" ) {
+ // find correct stringlist entry
+ QDomElement n1 = n.firstChild().firstChild().toElement();
+ for ( int i = 0; i < child && !n1.isNull(); ++i )
+ n1 = n1.nextSibling().toElement();
+ if ( n1.isNull() )
+ return QString::null;
+ return n1.firstChild().toText().data();
+ }
+ return QString::null;
+}
+
+
+void Uic::registerLayouts( const QDomElement &e )
+{
+ if ( layouts.contains(e.tagName())) {
+ createObjectDecl(e);
+ QString t = e.tagName();
+ if ( t == "vbox" || t == "hbox" || t == "grid" )
+ createSpacerDecl( e );
+ }
+
+ QDomNodeList nl = e.childNodes();
+ for ( int i = 0; i < (int) nl.length(); ++i )
+ registerLayouts( nl.item(i).toElement() );
+}
+
+
+/*!
+ Returns include file for class \a className or a null string.
+ */
+QString Uic::getInclude( const QString& className )
+{
+ int wid = WidgetDatabase::idFromClassName( className );
+ if ( wid != -1 )
+ return WidgetDatabase::includeFile( wid );
+ return QString::null;
+}
+
+
+void Uic::createActionDecl( const QDomElement& e )
+{
+ QString objClass = e.tagName() == "action" ? "QAction" : "QActionGroup";
+ QString objName = getObjectName( e );
+ if ( objName.isEmpty() )
+ return;
+ out << " " << objClass << "* " << objName << ";" << endl;
+ if ( e.tagName() == "actiongroup" ) {
+ for ( QDomElement n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "action" || n.tagName() == "actiongroup" )
+ createActionDecl( n );
+ }
+ }
+}
+
+void Uic::createToolbarDecl( const QDomElement &e )
+{
+ if ( e.tagName() == "toolbar" )
+ out << " " << "QToolBar *" << getObjectName( e ) << ";" << endl;
+}
+
+void Uic::createMenuBarDecl( const QDomElement &e )
+{
+ if ( e.tagName() == "item" ) {
+ out << " " << "QPopupMenu *" << e.attribute( "name" ) << ";" << endl;
+ createPopupMenuDecl( e );
+ }
+}
+
+void Uic::createPopupMenuDecl( const QDomElement &e )
+{
+ for ( QDomElement n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "action" || n.tagName() == "actiongroup" ) {
+ QDomElement n2 = n.nextSibling().toElement();
+ if ( n2.tagName() == "item" ) { // the action has a sub menu
+ out << " " << "QPopupMenu *" << n2.attribute( "name" ) << ";" << endl;
+ createPopupMenuDecl( n2 );
+ n = n2;
+ }
+ }
+ }
+}
+
+void Uic::createActionImpl( const QDomElement &n, const QString &parent )
+{
+ for ( QDomElement ae = n; !ae.isNull(); ae = ae.nextSibling().toElement() ) {
+ QString objName = registerObject( getObjectName( ae ) );
+ if ( ae.tagName() == "action" )
+ out << indent << objName << " = new QAction( " << parent << ", \"" << objName << "\" );" << endl;
+ else if ( ae.tagName() == "actiongroup" )
+ out << indent << objName << " = new QActionGroup( " << parent << ", \"" << objName << "\" );" << endl;
+ else
+ continue;
+ bool subActionsDone = FALSE;
+ bool hasMenuText = FALSE;
+ QString actionText;
+ for ( QDomElement n2 = ae.firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement() ) {
+ if ( n2.tagName() == "property" ) {
+ bool stdset = stdsetdef;
+ if ( n2.hasAttribute( "stdset" ) )
+ stdset = toBool( n2.attribute( "stdset" ) );
+ QString prop = n2.attribute("name");
+ if ( prop == "name" )
+ continue;
+ QString value = setObjectProperty( "QAction", objName, prop, n2.firstChild().toElement(), stdset );
+ if ( value.isEmpty() )
+ continue;
+
+ QString call = objName + "->";
+ if ( stdset ) {
+ call += mkStdSet( prop ) + "( ";
+ } else {
+ call += "setProperty( \"" + prop + "\", ";
+ }
+ call += value + " );";
+
+ if (prop == "menuText")
+ hasMenuText = TRUE;
+ else if (prop == "text")
+ actionText = value;
+
+ if ( n2.firstChild().toElement().tagName() == "string" ) {
+ trout << indent << call << endl;
+ } else {
+ out << indent << call << endl;
+ }
+ } else if ( !subActionsDone && ( n2.tagName() == "actiongroup" || n2.tagName() == "action" ) ) {
+ createActionImpl( n2, objName );
+ subActionsDone = TRUE;
+ }
+ }
+ // workaround for loading pre-3.3 files expecting bogus QAction behavior
+ if (!hasMenuText && !actionText.isEmpty() && uiFileVersion < "3.3")
+ trout << indent << objName << "->setMenuText(" << actionText << ");" << endl;
+ }
+}
+
+QString get_dock( const QString &d )
+{
+ if ( d == "0" )
+ return "DockUnmanaged";
+ if ( d == "1" )
+ return "DockTornOff";
+ if ( d == "2" )
+ return "DockTop";
+ if ( d == "3" )
+ return "DockBottom";
+ if ( d == "4" )
+ return "DockRight";
+ if ( d == "5" )
+ return "DockLeft";
+ if ( d == "6" )
+ return "DockMinimized";
+ return "";
+}
+
+void Uic::createToolbarImpl( const QDomElement &n, const QString &parentClass, const QString &parent )
+{
+ QDomNodeList nl = n.elementsByTagName( "toolbar" );
+ for ( int i = 0; i < (int) nl.length(); i++ ) {
+ QDomElement ae = nl.item( i ).toElement();
+ QString dock = get_dock( ae.attribute( "dock" ) );
+ QString objName = getObjectName( ae );
+ out << indent << objName << " = new QToolBar( QString(\"\"), this, " << dock << " ); " << endl;
+ createObjectImpl( ae, parentClass, parent );
+ for ( QDomElement n2 = ae.firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement() ) {
+ if ( n2.tagName() == "action" ) {
+ out << indent << n2.attribute( "name" ) << "->addTo( " << objName << " );" << endl;
+ } else if ( n2.tagName() == "separator" ) {
+ out << indent << objName << "->addSeparator();" << endl;
+ } else if ( n2.tagName() == "widget" ) {
+ if ( n2.attribute( "class" ) != "Spacer" ) {
+ createObjectImpl( n2, "QToolBar", objName );
+ } else {
+ QString child = createSpacerImpl( n2, parentClass, parent, objName );
+ out << indent << "QApplication::sendPostedEvents( " << objName
+ << ", QEvent::ChildInserted );" << endl;
+ out << indent << objName << "->boxLayout()->addItem( " << child << " );" << endl;
+ }
+ }
+ }
+ }
+}
+
+void Uic::createMenuBarImpl( const QDomElement &n, const QString &parentClass, const QString &parent )
+{
+ QString objName = getObjectName( n );
+ out << indent << objName << " = new QMenuBar( this, \"" << objName << "\" );" << endl;
+ createObjectImpl( n, parentClass, parent );
+ int i = 0;
+ QDomElement c = n.firstChild().toElement();
+ while ( !c.isNull() ) {
+ if ( c.tagName() == "item" ) {
+ QString itemName = c.attribute( "name" );
+ out << endl;
+ out << indent << itemName << " = new QPopupMenu( this );" << endl;
+ createPopupMenuImpl( c, parentClass, itemName );
+ out << indent << objName << "->insertItem( QString(\"\"), " << itemName << ", " << i << " );" << endl;
+ QString findItem(objName + "->findItem(%1)");
+ findItem = findItem.arg(i);
+ trout << indent << "if (" << findItem << ")" << endl;
+ trout << indent << indent << findItem << "->setText( " << trcall( c.attribute( "text" ) ) << " );" << endl;
+ } else if ( c.tagName() == "separator" ) {
+ out << endl;
+ out << indent << objName << "->insertSeparator( " << i << " );" << endl;
+ }
+ c = c.nextSibling().toElement();
+ i++;
+ }
+}
+
+void Uic::createPopupMenuImpl( const QDomElement &e, const QString &parentClass, const QString &parent )
+{
+ int i = 0;
+ for ( QDomElement n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "action" || n.tagName() == "actiongroup" ) {
+ QDomElement n2 = n.nextSibling().toElement();
+ if ( n2.tagName() == "item" ) { // the action has a sub menu
+ QString itemName = n2.attribute( "name" );
+ QString itemText = n2.attribute( "text" );
+ out << indent << itemName << " = new QPopupMenu( this );" << endl;
+ out << indent << parent << "->insertItem( " << n.attribute( "name" ) << "->iconSet(), ";
+ out << trcall( itemText ) << ", " << itemName << " );" << endl;
+ trout << indent << parent << "->changeItem( " << parent << "->idAt( " << i << " ), ";
+ trout << trcall( itemText ) << " );" << endl;
+ createPopupMenuImpl( n2, parentClass, itemName );
+ n = n2;
+ } else {
+ out << indent << n.attribute( "name" ) << "->addTo( " << parent << " );" << endl;
+ }
+ } else if ( n.tagName() == "separator" ) {
+ out << indent << parent << "->insertSeparator();" << endl;
+ }
+ ++i;
+ }
+}
+
+/*!
+ Creates implementation of an listbox item tag.
+*/
+
+QString Uic::createListBoxItemImpl( const QDomElement &e, const QString &parent,
+ QString *value )
+{
+ QDomElement n = e.firstChild().toElement();
+ QString txt;
+ QString com;
+ QString pix;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" ) {
+ txt = v.toString();
+ com = getComment( n );
+ } else if ( attrib == "pixmap" ) {
+ pix = v.toString();
+ if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) {
+ pix.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) );
+ pix.append( QString( externPixmaps ? "\"" : "" ) + " )" );
+ }
+ }
+ }
+ n = n.nextSibling().toElement();
+ }
+
+ if ( value )
+ *value = trcall( txt, com );
+
+ if ( pix.isEmpty() ) {
+ return parent + "->insertItem( " + trcall( txt, com ) + " );";
+ } else {
+ return parent + "->insertItem( " + pix + ", " + trcall( txt, com ) + " );";
+ }
+}
+
+/*!
+ Creates implementation of an iconview item tag.
+*/
+
+QString Uic::createIconViewItemImpl( const QDomElement &e, const QString &parent )
+{
+ QDomElement n = e.firstChild().toElement();
+ QString txt;
+ QString com;
+ QString pix;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" ) {
+ txt = v.toString();
+ com = getComment( n );
+ } else if ( attrib == "pixmap" ) {
+ pix = v.toString();
+ if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) {
+ pix.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) );
+ pix.append( QString( externPixmaps ? "\"" : "" ) + " )" );
+ }
+ }
+ }
+ n = n.nextSibling().toElement();
+ }
+
+ if ( pix.isEmpty() )
+ return "(void) new QIconViewItem( " + parent + ", " + trcall( txt, com ) + " );";
+ else
+ return "(void) new QIconViewItem( " + parent + ", " + trcall( txt, com ) + ", " + pix + " );";
+}
+
+/*!
+ Creates implementation of an listview item tag.
+*/
+
+QString Uic::createListViewItemImpl( const QDomElement &e, const QString &parent,
+ const QString &parentItem )
+{
+ QString s;
+
+ QDomElement n = e.firstChild().toElement();
+
+ bool hasChildren = e.elementsByTagName( "item" ).count() > 0;
+ QString item;
+
+ if ( hasChildren ) {
+ item = registerObject( "item" );
+ s = indent + "QListViewItem * " + item + " = ";
+ } else {
+ item = "item";
+ if ( item_used )
+ s = indent + item + " = ";
+ else
+ s = indent + "QListViewItem * " + item + " = ";
+ item_used = TRUE;
+ }
+
+ if ( !parentItem.isEmpty() )
+ s += "new QListViewItem( " + parentItem + ", " + lastItem + " );\n";
+ else
+ s += "new QListViewItem( " + parent + ", " + lastItem + " );\n";
+
+ QStringList texts;
+ QStringList pixmaps;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute("name");
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" )
+ texts << v.toString();
+ else if ( attrib == "pixmap" ) {
+ QString pix = v.toString();
+ if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) {
+ pix.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) );
+ pix.append( QString( externPixmaps ? "\"" : "" ) + " )" );
+ }
+ pixmaps << pix;
+ }
+ } else if ( n.tagName() == "item" ) {
+ s += indent + item + "->setOpen( TRUE );\n";
+ s += createListViewItemImpl( n, parent, item );
+ }
+ n = n.nextSibling().toElement();
+ }
+
+ for ( int i = 0; i < (int)texts.count(); ++i ) {
+ if ( !texts[ i ].isEmpty() )
+ s += indent + item + "->setText( " + QString::number( i ) + ", " + trcall( texts[ i ] ) + " );\n";
+ if ( !pixmaps[ i ].isEmpty() )
+ s += indent + item + "->setPixmap( " + QString::number( i ) + ", " + pixmaps[ i ] + " );\n";
+ }
+
+ lastItem = item;
+ return s;
+}
+
+/*!
+ Creates implementation of an listview column tag.
+*/
+
+QString Uic::createListViewColumnImpl( const QDomElement &e, const QString &parent,
+ QString *value )
+{
+ QDomElement n = e.firstChild().toElement();
+ QString txt;
+ QString com;
+ QString pix;
+ bool clickable = FALSE, resizable = FALSE;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute("name");
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" ) {
+ txt = v.toString();
+ com = getComment( n );
+ } else if ( attrib == "pixmap" ) {
+ pix = v.toString();
+ if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) {
+ pix.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) );
+ pix.append( QString( externPixmaps ? "\"" : "" ) + " )" );
+ }
+ } else if ( attrib == "clickable" )
+ clickable = v.toBool();
+ else if ( attrib == "resizable" || attrib == "resizeable" )
+ resizable = v.toBool();
+ }
+ n = n.nextSibling().toElement();
+ }
+
+ if ( value )
+ *value = trcall( txt, com );
+
+ QString s;
+ s = indent + parent + "->addColumn( " + trcall( txt, com ) + " );\n";
+ if ( !pix.isEmpty() )
+ s += indent + parent + "->header()->setLabel( " + parent + "->header()->count() - 1, " + pix + ", " + trcall( txt, com ) + " );\n";
+ if ( !clickable )
+ s += indent + parent + "->header()->setClickEnabled( FALSE, " + parent + "->header()->count() - 1 );\n";
+ if ( !resizable )
+ s += indent + parent + "->header()->setResizeEnabled( FALSE, " + parent + "->header()->count() - 1 );\n";
+ return s;
+}
+
+QString Uic::createTableRowColumnImpl( const QDomElement &e, const QString &parent,
+ QString *value )
+{
+ QString objClass = getClassName( e.parentNode().toElement() );
+ QDomElement n = e.firstChild().toElement();
+ QString txt;
+ QString com;
+ QString pix;
+ QString field;
+ bool isRow = e.tagName() == "row";
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute("name");
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" ) {
+ txt = v.toString();
+ com = getComment( n );
+ } else if ( attrib == "pixmap" ) {
+ pix = v.toString();
+ if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) {
+ pix.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) );
+ pix.append( QString( externPixmaps ? "\"" : "" ) + " )" );
+ }
+ } else if ( attrib == "field" )
+ field = v.toString();
+ }
+ n = n.nextSibling().toElement();
+ }
+
+ if ( value )
+ *value = trcall( txt, com );
+
+ // ### This generated code sucks! We have to set the number of
+ // rows/cols before and then only do setLabel/()
+ // ### careful, though, since QDataTable has an API which makes this code pretty good
+
+ QString s;
+ if ( isRow ) {
+ s = indent + parent + "->setNumRows( " + parent + "->numRows() + 1 );\n";
+ if ( pix.isEmpty() )
+ s += indent + parent + "->verticalHeader()->setLabel( " + parent + "->numRows() - 1, "
+ + trcall( txt, com ) + " );\n";
+ else
+ s += indent + parent + "->verticalHeader()->setLabel( " + parent + "->numRows() - 1, "
+ + pix + ", " + trcall( txt, com ) + " );\n";
+ } else {
+ if ( objClass == "QTable" ) {
+ s = indent + parent + "->setNumCols( " + parent + "->numCols() + 1 );\n";
+ if ( pix.isEmpty() )
+ s += indent + parent + "->horizontalHeader()->setLabel( " + parent + "->numCols() - 1, "
+ + trcall( txt, com ) + " );\n";
+ else
+ s += indent + parent + "->horizontalHeader()->setLabel( " + parent + "->numCols() - 1, "
+ + pix + ", " + trcall( txt, com ) + " );\n";
+ } else if ( objClass == "QDataTable" ) {
+ if ( !txt.isEmpty() && !field.isEmpty() ) {
+ if ( pix.isEmpty() )
+ out << indent << parent << "->addColumn( " << fixString( field ) << ", " << trcall( txt, com ) << " );" << endl;
+ else
+ out << indent << parent << "->addColumn( " << fixString( field ) << ", " << trcall( txt, com ) << ", " << pix << " );" << endl;
+ }
+ }
+ }
+ return s;
+}
+
+/*!
+ Creates the implementation of a layout tag. Called from createObjectImpl().
+ */
+QString Uic::createLayoutImpl( const QDomElement &e, const QString& parentClass, const QString& parent, const QString& layout )
+{
+ QDomElement n;
+ QString objClass, objName;
+ objClass = e.tagName();
+
+ QString qlayout = "QVBoxLayout";
+ if ( objClass == "hbox" )
+ qlayout = "QHBoxLayout";
+ else if ( objClass == "grid" )
+ qlayout = "QGridLayout";
+
+ bool isGrid = e.tagName() == "grid" ;
+ objName = registerObject( getLayoutName( e ) );
+ layoutObjects += objName;
+
+ QString margin = DomTool::readProperty( e, "margin", defMargin ).toString();
+ QString spacing = DomTool::readProperty( e, "spacing", defSpacing ).toString();
+ QString resizeMode = DomTool::readProperty( e, "resizeMode", QString::null ).toString();
+
+ QString optcells;
+ if ( isGrid )
+ optcells = "1, 1, ";
+ if ( (parentClass == "QGroupBox" || parentClass == "QButtonGroup") && layout.isEmpty() ) {
+ // special case for group box
+ out << indent << parent << "->setColumnLayout(0, Qt::Vertical );" << endl;
+ out << indent << parent << "->layout()->setSpacing( " << spacing << " );" << endl;
+ out << indent << parent << "->layout()->setMargin( " << margin << " );" << endl;
+ out << indent << objName << " = new " << qlayout << "( " << parent << "->layout() );" << endl;
+ out << indent << objName << "->setAlignment( Qt::AlignTop );" << endl;
+ } else {
+ out << indent << objName << " = new " << qlayout << "( ";
+ if ( layout.isEmpty() )
+ out << parent;
+ else {
+ out << "0";
+ if ( !DomTool::hasProperty( e, "margin" ) )
+ margin = "0";
+ }
+ out << ", " << optcells << margin << ", " << spacing << ", \"" << objName << "\"); " << endl;
+ }
+ if ( !resizeMode.isEmpty() )
+ out << indent << objName << "->setResizeMode( QLayout::" << resizeMode << " );" << endl;
+
+ if ( !isGrid ) {
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "spacer" ) {
+ QString child = createSpacerImpl( n, parentClass, parent, objName );
+ out << indent << objName << "->addItem( " << child << " );" << endl;
+ } else if ( tags.contains( n.tagName() ) ) {
+ QString child = createObjectImpl( n, parentClass, parent, objName );
+ if ( isLayout( child ) )
+ out << indent << objName << "->addLayout( " << child << " );" << endl;
+ else
+ out << indent << objName << "->addWidget( " << child << " );" << endl;
+ }
+ }
+ } else {
+ for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
+ QDomElement ae = n;
+ int row = ae.attribute( "row" ).toInt();
+ int col = ae.attribute( "column" ).toInt();
+ int rowspan = ae.attribute( "rowspan" ).toInt();
+ int colspan = ae.attribute( "colspan" ).toInt();
+ if ( rowspan < 1 )
+ rowspan = 1;
+ if ( colspan < 1 )
+ colspan = 1;
+ if ( n.tagName() == "spacer" ) {
+ QString child = createSpacerImpl( n, parentClass, parent, objName );
+ if ( rowspan * colspan != 1 )
+ out << indent << objName << "->addMultiCell( " << child << ", "
+ << row << ", " << ( row + rowspan - 1 ) << ", " << col << ", " << ( col + colspan - 1 ) << " );" << endl;
+ else
+ out << indent << objName << "->addItem( " << child << ", "
+ << row << ", " << col << " );" << endl;
+ } else if ( tags.contains( n.tagName() ) ) {
+ QString child = createObjectImpl( n, parentClass, parent, objName );
+ out << endl;
+ QString o = "Widget";
+ if ( isLayout( child ) )
+ o = "Layout";
+ if ( rowspan * colspan != 1 )
+ out << indent << objName << "->addMultiCell" << o << "( " << child << ", "
+ << row << ", " << ( row + rowspan - 1 ) << ", " << col << ", " << ( col + colspan - 1 ) << " );" << endl;
+ else
+ out << indent << objName << "->add" << o << "( " << child << ", "
+ << row << ", " << col << " );" << endl;
+ }
+ }
+ }
+
+ return objName;
+}
+
+
+
+QString Uic::createSpacerImpl( const QDomElement &e, const QString& /*parentClass*/, const QString& /*parent*/, const QString& /*layout*/)
+{
+ QDomElement n;
+ QString objClass, objName;
+ objClass = e.tagName();
+ objName = registerObject( getObjectName( e ) );
+
+ QSize size = DomTool::readProperty( e, "sizeHint", QSize( 0, 0 ) ).toSize();
+ QString sizeType = DomTool::readProperty( e, "sizeType", "Expanding" ).toString();
+ bool isVspacer = DomTool::readProperty( e, "orientation", "Horizontal" ) == "Vertical";
+
+ if ( sizeType != "Expanding" && sizeType != "MinimumExpanding" &&
+ DomTool::hasProperty( e, "geometry" ) ) { // compatibility Qt 2.2
+ QRect geom = DomTool::readProperty( e, "geometry", QRect(0,0,0,0) ).toRect();
+ size = geom.size();
+ }
+
+ if ( isVspacer )
+ out << " " << objName << " = new QSpacerItem( "
+ << size.width() << ", " << size.height()
+ << ", QSizePolicy::Minimum, QSizePolicy::" << sizeType << " );" << endl;
+ else
+ out << " " << objName << " = new QSpacerItem( "
+ << size.width() << ", " << size.height()
+ << ", QSizePolicy::" << sizeType << ", QSizePolicy::Minimum );" << endl;
+
+ return objName;
+}
+
+static const char* const ColorRole[] = {
+ "Foreground", "Button", "Light", "Midlight", "Dark", "Mid",
+ "Text", "BrightText", "ButtonText", "Base", "Background", "Shadow",
+ "Highlight", "HighlightedText", "Link", "LinkVisited", 0
+};
+
+
+/*!
+ Creates a colorgroup with name \a name from the color group \a cg
+ */
+void Uic::createColorGroupImpl( const QString& name, const QDomElement& e )
+{
+ QColorGroup cg;
+ int r = -1;
+ QDomElement n = e.firstChild().toElement();
+ QString color;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "color" ) {
+ r++;
+ QColor col = DomTool::readColor( n );
+ color = "QColor( %1, %2, %3)";
+ color = color.arg( col.red() ).arg( col.green() ).arg( col.blue() );
+ if ( col == white )
+ color = "white";
+ else if ( col == black )
+ color = "black";
+ if ( n.nextSibling().toElement().tagName() != "pixmap" ) {
+ out << indent << name << ".setColor( QColorGroup::" << ColorRole[r] << ", " << color << " );" << endl;
+ }
+ } else if ( n.tagName() == "pixmap" ) {
+ QString pixmap = n.firstChild().toText().data();
+ if ( !pixmapLoaderFunction.isEmpty() ) {
+ pixmap.prepend( pixmapLoaderFunction + "( " + QString( externPixmaps ? "\"" : "" ) );
+ pixmap.append( QString( externPixmaps ? "\"" : "" ) + " )" );
+ }
+ out << indent << name << ".setBrush( QColorGroup::"
+ << ColorRole[r] << ", QBrush( " << color << ", " << pixmap << " ) );" << endl;
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+/*!
+ Auxiliary function to load a color group. The colorgroup must not
+ contain pixmaps.
+ */
+QColorGroup Uic::loadColorGroup( const QDomElement &e )
+{
+ QColorGroup cg;
+ int r = -1;
+ QDomElement n = e.firstChild().toElement();
+ QColor col;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "color" ) {
+ r++;
+ cg.setColor( (QColorGroup::ColorRole)r, (col = DomTool::readColor( n ) ) );
+ }
+ n = n.nextSibling().toElement();
+ }
+ return cg;
+}
+
+/*! Returns TRUE if the widget properties specify that it belongs to
+ the database \a connection and \a table.
+*/
+
+bool Uic::isWidgetInTable( const QDomElement& e, const QString& connection, const QString& table )
+{
+ QString conn = getDatabaseInfo( e, "connection" );
+ QString tab = getDatabaseInfo( e, "table" );
+ if ( conn == connection && tab == table )
+ return TRUE;
+ return FALSE;
+}
+
+/*!
+ Registers all database connections, cursors and forms.
+*/
+
+void Uic::registerDatabases( const QDomElement& e )
+{
+ QDomElement n;
+ QDomNodeList nl;
+ int i;
+ nl = e.parentNode().toElement().elementsByTagName( "widget" );
+ for ( i = 0; i < (int) nl.length(); ++i ) {
+ n = nl.item(i).toElement();
+ QString conn = getDatabaseInfo( n, "connection" );
+ QString tab = getDatabaseInfo( n, "table" );
+ QString fld = getDatabaseInfo( n, "field" );
+ if ( !conn.isNull() ) {
+ dbConnections += conn;
+ if ( !tab.isNull() ) {
+ dbCursors[conn] += tab;
+ if ( !fld.isNull() )
+ dbForms[conn] += tab;
+ }
+ }
+ }
+}
+
+/*!
+ Registers an object with name \a name.
+
+ The returned name is a valid variable identifier, as similar to \a
+ name as possible and guaranteed to be unique within the form.
+
+ \sa registeredName(), isObjectRegistered()
+ */
+QString Uic::registerObject( const QString& name )
+{
+ if ( objectNames.isEmpty() ) {
+ // some temporary variables we need
+ objectNames += "img";
+ objectNames += "item";
+ objectNames += "cg";
+ objectNames += "pal";
+ }
+
+ QString result = name;
+ int i;
+ while ( ( i = result.find(' ' )) != -1 ) {
+ result[i] = '_';
+ }
+
+ if ( objectNames.contains( result ) ) {
+ int i = 2;
+ while ( objectNames.contains( result + "_" + QString::number(i) ) )
+ i++;
+ result += "_";
+ result += QString::number(i);
+ }
+ objectNames += result;
+ objectMapper.insert( name, result );
+ return result;
+}
+
+/*!
+ Returns the registered name for the original name \a name
+ or \a name if \a name wasn't registered.
+
+ \sa registerObject(), isObjectRegistered()
+ */
+QString Uic::registeredName( const QString& name )
+{
+ if ( !objectMapper.contains( name ) )
+ return name;
+ return objectMapper[name];
+}
+
+/*!
+ Returns whether the object \a name was registered yet or not.
+ */
+bool Uic::isObjectRegistered( const QString& name )
+{
+ return objectMapper.contains( name );
+}
+
+
+/*!
+ Unifies the entries in stringlist \a list. Should really be a QStringList feature.
+ */
+QStringList Uic::unique( const QStringList& list )
+{
+ if ( list.isEmpty() )
+ return list;
+
+ QStringList result;
+ for ( QStringList::ConstIterator it = list.begin(); it != list.end(); ++it ) {
+ if ( !result.contains(*it) )
+ result += *it;
+ }
+ return result;
+}
+
+
+
+/*!
+ Creates an instance of class \a objClass, with parent \a parent and name \a objName
+ */
+QString Uic::createObjectInstance( const QString& objClass, const QString& parent, const QString& objName )
+{
+
+ if ( objClass.mid( 1 ) == "ComboBox" ) {
+ return objClass + "( FALSE, " + parent + ", \"" + objName + "\" )";
+ }
+ return objClass + "( " + parent + ", \"" + objName + "\" )";
+}
+
+bool Uic::isLayout( const QString& name ) const
+{
+ return layoutObjects.contains( name );
+}
+
+
+
diff --git a/tools/designer/uic/uic.h b/tools/designer/uic/uic.h
new file mode 100644
index 0000000..f6e41a5
--- /dev/null
+++ b/tools/designer/uic/uic.h
@@ -0,0 +1,176 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef UIC_H
+#define UIC_H
+#include <qdom.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qmap.h>
+#include <qtextstream.h>
+#include <qpalette.h>
+#include <qvariant.h>
+
+class Uic : public Qt
+{
+public:
+ Uic( const QString &fn, const char *outputFn, QTextStream& out,
+ QDomDocument doc, bool decl, bool subcl, const QString &trm,
+ const QString& subclname, bool omitForwardDecls );
+
+ void createFormDecl( const QDomElement &e );
+ void createFormImpl( const QDomElement &e );
+
+ void createSubDecl( const QDomElement &e, const QString& subclname );
+ void createSubImpl( const QDomElement &e, const QString& subclname );
+
+ void createObjectDecl( const QDomElement &e );
+ void createSpacerDecl( const QDomElement &e );
+ void createActionDecl( const QDomElement &e );
+ void createToolbarDecl( const QDomElement &e );
+ void createMenuBarDecl( const QDomElement &e );
+ void createPopupMenuDecl( const QDomElement &e );
+ void createActionImpl( const QDomElement &e, const QString &parent );
+ void createToolbarImpl( const QDomElement &e, const QString &parentClass, const QString &parent );
+ void createMenuBarImpl( const QDomElement &e, const QString &parentClass, const QString &parent );
+ void createPopupMenuImpl( const QDomElement &e, const QString &parentClass, const QString &parent );
+ QString createObjectImpl( const QDomElement &e, const QString& parentClass, const QString& parent, const QString& layout = QString::null );
+ QString createLayoutImpl( const QDomElement &e, const QString& parentClass, const QString& parent, const QString& layout = QString::null );
+ QString createObjectInstance( const QString& objClass, const QString& parent, const QString& objName );
+ QString createSpacerImpl( const QDomElement &e, const QString& parentClass, const QString& parent, const QString& layout = QString::null );
+ void createExclusiveProperty( const QDomElement & e, const QString& exclusiveProp );
+ QString createListBoxItemImpl( const QDomElement &e, const QString &parent, QString *value = 0 );
+ QString createIconViewItemImpl( const QDomElement &e, const QString &parent );
+ QString createListViewColumnImpl( const QDomElement &e, const QString &parent, QString *value = 0 );
+ QString createTableRowColumnImpl( const QDomElement &e, const QString &parent, QString *value = 0 );
+ QString createListViewItemImpl( const QDomElement &e, const QString &parent,
+ const QString &parentItem );
+ void createColorGroupImpl( const QString& cg, const QDomElement& e );
+ QColorGroup loadColorGroup( const QDomElement &e );
+
+ QDomElement getObjectProperty( const QDomElement& e, const QString& name );
+ QString getPixmapLoaderFunction( const QDomElement& e );
+ QString getFormClassName( const QDomElement& e );
+ QString getClassName( const QDomElement& e );
+ QString getObjectName( const QDomElement& e );
+ QString getLayoutName( const QDomElement& e );
+ QString getInclude( const QString& className );
+
+ QString setObjectProperty( const QString& objClass, const QString& obj, const QString &prop, const QDomElement &e, bool stdset );
+
+ QString registerObject( const QString& name );
+ QString registeredName( const QString& name );
+ bool isObjectRegistered( const QString& name );
+ QStringList unique( const QStringList& );
+
+ QString trcall( const QString& sourceText, const QString& comment = "" );
+
+ static void embed( QTextStream& out, const char* project, const QStringList& images );
+
+private:
+ void registerLayouts ( const QDomElement& e );
+
+ QTextStream& out;
+ QTextOStream trout;
+ QString languageChangeBody;
+ QCString outputFileName;
+ QStringList objectNames;
+ QMap<QString,QString> objectMapper;
+ QString indent;
+ QStringList tags;
+ QStringList layouts;
+ QString formName;
+ QString lastItem;
+ QString trmacro;
+ bool nofwd;
+
+ struct Buddy
+ {
+ Buddy( const QString& k, const QString& b )
+ : key( k ), buddy( b ) {}
+ Buddy(){} // for valuelist
+ QString key;
+ QString buddy;
+ bool operator==( const Buddy& other ) const
+ { return (key == other.key); }
+ };
+ struct CustomInclude
+ {
+ QString header;
+ QString location;
+ Q_DUMMY_COMPARISON_OPERATOR(CustomInclude)
+ };
+ QValueList<Buddy> buddies;
+
+ QStringList layoutObjects;
+ bool isLayout( const QString& name ) const;
+
+ uint item_used : 1;
+ uint cg_used : 1;
+ uint pal_used : 1;
+ uint stdsetdef : 1;
+ uint externPixmaps : 1;
+
+ QString uiFileVersion;
+ QString nameOfClass;
+ QStringList namespaces;
+ QString bareNameOfClass;
+ QString pixmapLoaderFunction;
+
+ void registerDatabases( const QDomElement& e );
+ bool isWidgetInTable( const QDomElement& e, const QString& connection, const QString& table );
+ bool isFrameworkCodeGenerated( const QDomElement& e );
+ QString getDatabaseInfo( const QDomElement& e, const QString& tag );
+ void createFormImpl( const QDomElement& e, const QString& form, const QString& connection, const QString& table );
+ void writeFunctionsDecl( const QStringList &fuLst, const QStringList &typLst, const QStringList &specLst );
+ void writeFunctionsSubDecl( const QStringList &fuLst, const QStringList &typLst, const QStringList &specLst );
+ void writeFunctionsSubImpl( const QStringList &fuLst, const QStringList &typLst, const QStringList &specLst,
+ const QString &subClass, const QString &descr );
+ QStringList dbConnections;
+ QMap< QString, QStringList > dbCursors;
+ QMap< QString, QStringList > dbForms;
+
+ static bool isMainWindow;
+ static QString mkBool( bool b );
+ static QString mkBool( const QString& s );
+ bool toBool( const QString& s );
+ static QString fixString( const QString &str, bool encode = FALSE );
+ static bool onlyAscii;
+ static QString mkStdSet( const QString& prop );
+ static QString getComment( const QDomNode& n );
+ QVariant defSpacing, defMargin;
+ QString fileName;
+ bool writeFunctImpl;
+};
+
+#endif
diff --git a/tools/designer/uic/uic.pro b/tools/designer/uic/uic.pro
new file mode 100644
index 0000000..ef5bde0
--- /dev/null
+++ b/tools/designer/uic/uic.pro
@@ -0,0 +1,42 @@
+TEMPLATE = app
+CONFIG += qt console warn_on release professional
+HEADERS = uic.h \
+ ../shared/widgetdatabase.h \
+ ../shared/domtool.h \
+ ../shared/parser.h \
+ ../interfaces/widgetinterface.h
+
+#HEADERS += ../shared/ui2uib.h \
+# ../shared/uib.h
+
+SOURCES = main.cpp uic.cpp form.cpp object.cpp \
+ subclassing.cpp embed.cpp\
+ ../shared/widgetdatabase.cpp \
+ ../shared/domtool.cpp \
+ ../shared/parser.cpp
+
+#SOURCES += ../shared/ui2uib.cpp \
+# ../shared/uib.cpp
+
+DEFINES += QT_INTERNAL_XML
+include( ../../../src/qt_professional.pri )
+
+TARGET = uic
+INCLUDEPATH += ../shared
+DEFINES += UIC
+DESTDIR = ../../../bin
+
+target.path=$$bins.path
+INSTALLS += target
+
+*-mwerks {
+ TEMPLATE = lib
+ TARGET = McUic
+ CONFIG -= static
+ CONFIG += shared plugin
+ DEFINES += UIC_MWERKS_PLUGIN
+ MWERKSDIR = $(QT_SOURCE_TREE)/util/mwerks_plugin
+ INCLUDEPATH += $$MWERKSDIR/Headers
+ LIBS += $$MWERKSDIR/Libraries/PluginLib4.shlb
+ SOURCES += mwerks_mac.cpp
+}
diff --git a/tools/designer/uilib/qwidgetfactory.cpp b/tools/designer/uilib/qwidgetfactory.cpp
new file mode 100644
index 0000000..a1ff1c2
--- /dev/null
+++ b/tools/designer/uilib/qwidgetfactory.cpp
@@ -0,0 +1,2623 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "qwidgetfactory.h"
+
+#include "../interfaces/languageinterface.h"
+#include "../interfaces/widgetinterface.h"
+
+#include <qfeatures.h>
+#include "../designer/database2.h"
+#include <qdom.h>
+#include <qdir.h>
+#include <qlayout.h>
+#include <qmetaobject.h>
+#include <domtool.h>
+#include <uib.h>
+#include <qapplication.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qobjectlist.h>
+#include <private/qpluginmanager_p.h>
+#include <qmime.h>
+#include <qdragobject.h>
+
+#ifndef QT_NO_SQL
+#include <qsqlrecord.h>
+#include <qsqldatabase.h>
+#include <qdatatable.h>
+#endif
+
+// include all Qt widgets we support
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+#include <qgroupbox.h>
+#include <qbuttongroup.h>
+#include <qiconview.h>
+#include <qheader.h>
+#ifndef QT_NO_TABLE
+#include <qtable.h>
+#endif
+#include <qlistbox.h>
+#include <qlistview.h>
+#include <qlineedit.h>
+#include <qspinbox.h>
+#include <qmultilineedit.h>
+#include <qlabel.h>
+#include <qwidget.h>
+#include <qtabwidget.h>
+#include <qcombobox.h>
+#include <qdialog.h>
+#include <qwizard.h>
+#include <qlcdnumber.h>
+#include <qprogressbar.h>
+#include <qtextview.h>
+#include <qtextbrowser.h>
+#include <qdial.h>
+#include <qslider.h>
+#include <qframe.h>
+#include <qwidgetstack.h>
+#include <qtoolbox.h>
+#include <qtextedit.h>
+#include <qscrollbar.h>
+#include <qmainwindow.h>
+#include <qsplitter.h>
+#include <qaction.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qdatetimeedit.h>
+#include <qvbox.h>
+#include <qhbox.h>
+#include <qgrid.h>
+
+#include <stdlib.h>
+
+class QWidgetFactoryPrivate
+{
+public:
+ QCString translationContext;
+ QListViewItem *lastItem;
+ QDict<bool> customWidgets;
+};
+
+static QPtrList<QWidgetFactory> widgetFactories;
+static QPluginManager<LanguageInterface> *languageInterfaceManager = 0;
+static QPluginManager<WidgetInterface> *widgetInterfaceManager = 0;
+
+static QMap<QString, bool> *availableWidgetMap = 0;
+static QStringList *availableWidgetList = 0;
+
+QMap<QWidget*, QString> *qwf_forms = 0;
+QString *qwf_language = 0;
+bool qwf_execute_code = TRUE;
+bool qwf_stays_on_top = FALSE;
+QString qwf_currFileName = "";
+QObject *qwf_form_object = 0;
+QString *qwf_plugin_dir = 0;
+
+static void setupPluginDir()
+{
+ if ( !qwf_plugin_dir )
+ qwf_plugin_dir = new QString( "/designer" );
+}
+
+static void setupWidgetListAndMap()
+{
+ if ( availableWidgetMap )
+ return;
+ setupPluginDir();
+ availableWidgetList = new QStringList;
+ (*availableWidgetList) << "QPushButton" << "QToolButton" << "QCheckBox" << "QRadioButton"
+ << "QGroupBox" << "QButtonGroup" << "QIconView" << "QTable"
+ << "QListBox" << "QListView" << "QLineEdit" << "QSpinBox"
+ << "QMultiLineEdit" << "QLabel" << "TextLabel" << "PixmapLabel"
+ << "QLayoutWidget" << "QTabWidget" << "QComboBox"
+ << "QWidget" << "QDialog" << "QWizard" << "QLCDNumber";
+ // put less stress on the compiler by limiting the template nesting depth
+ (*availableWidgetList) << "QProgressBar" << "QTextView" << "QTextBrowser"
+ << "QDial" << "QSlider" << "QFrame" << "Line" << "QTextEdit"
+ << "QDateEdit" << "QTimeEdit" << "QDateTimeEdit" << "QScrollBar"
+ << "QPopupMenu" << "QWidgetStack" << "QMainWindow"
+ << "QDataTable" << "QDataBrowser" << "QDataView"
+ << "QVBox" << "QHBox" << "QGrid" << "QToolBox" << "QSplitter";
+
+ if ( !widgetInterfaceManager )
+ widgetInterfaceManager =
+ new QPluginManager<WidgetInterface>( IID_Widget, QApplication::libraryPaths(), *qwf_plugin_dir );
+
+ QStringList l = widgetInterfaceManager->featureList();
+ QStringList::Iterator it;
+ for ( it = l.begin(); it != l.end(); ++it )
+ (*availableWidgetList) << *it;
+
+ availableWidgetMap = new QMap<QString, bool>;
+ for ( it = availableWidgetList->begin(); it != availableWidgetList->end(); ++it )
+ availableWidgetMap->insert( *it, TRUE );
+}
+
+static QImage loadImageData( const QString& format, ulong len, QByteArray data )
+{
+ QImage img;
+ if ( format == "XPM.GZ" || format == "XBM.GZ" ) {
+ if ( len < data.size() * 10 )
+ len = data.size() * 10;
+ // qUncompress() expects the first 4 bytes to be the expected length of
+ // the uncompressed data
+ QByteArray dataTmp( data.size() + 4 );
+ memcpy( dataTmp.data()+4, data.data(), data.size() );
+ dataTmp[0] = ( len & 0xff000000 ) >> 24;
+ dataTmp[1] = ( len & 0x00ff0000 ) >> 16;
+ dataTmp[2] = ( len & 0x0000ff00 ) >> 8;
+ dataTmp[3] = ( len & 0x000000ff );
+ QByteArray baunzip = qUncompress( dataTmp );
+ len = baunzip.size();
+ img.loadFromData( (const uchar*)baunzip.data(), len, format.left(format.find('.')) );
+ } else {
+ img.loadFromData( (const uchar*)data.data(), data.size(), format );
+ }
+ return img;
+}
+
+static QSizePolicy::SizeType stringToSizeType( const QString& str )
+{
+ if ( str == "Fixed" ) {
+ return QSizePolicy::Fixed;
+ } else if ( str == "Minimum" ) {
+ return QSizePolicy::Minimum;
+ } else if ( str == "Maximum" ) {
+ return QSizePolicy::Maximum;
+ } else if ( str == "Preferred" ) {
+ return QSizePolicy::Preferred;
+ } else if ( str == "MinimumExpanding" ) {
+ return QSizePolicy::MinimumExpanding;
+ } else if ( str == "Expanding" ) {
+ return QSizePolicy::Expanding;
+ } else {
+ return QSizePolicy::Ignored;
+ }
+}
+
+
+/*!
+ \class QWidgetFactory
+
+ \brief The QWidgetFactory class provides for the dynamic creation of widgets
+ from Qt Designer .ui files.
+
+ This class basically offers two things:
+
+ \list
+
+ \i Dynamically creating widgets from \link designer-manual.book Qt
+ Designer\endlink user interface description files.
+ You can do this using the static function QWidgetFactory::create().
+ This function also performs signal and slot connections, tab
+ ordering, etc., as defined in the .ui file, and returns the
+ top-level widget in the .ui file. After creating the widget you can
+ use QObject::child() and QObject::queryList() to access child
+ widgets of this returned widget.
+
+ \i Adding additional widget factories to be able to create custom
+ widgets. See createWidget() for details.
+
+ \endlist
+
+ This class is not included in the Qt library itself. To use it you
+ must link against \c libqui.so (Unix) or \c qui.lib (Windows), which is
+ built into \c INSTALL/lib if you built \e{Qt Designer} (\c INSTALL is
+ the directory where Qt is installed ).
+
+ If you create a QMainWindow using a QWidgetFactory, be aware that
+ it already has a central widget. Therefore, you need to delete this
+ one before setting another one.
+
+ See the "Creating Dynamic Dialogs from .ui Files" section of the \link
+ designer-manual.book Qt Designer manual\endlink for an example. See
+ also the \l{QWidgetPlugin} class and the \link plugins-howto.html
+ Plugins documentation\endlink.
+*/
+
+/*! Constructs a QWidgetFactory. */
+
+QWidgetFactory::QWidgetFactory()
+ : d( new QWidgetFactoryPrivate() ), dbControls( 0 ),
+ usePixmapCollection( FALSE ), defMargin( 11 ), defSpacing( 6 )
+{
+ widgetFactories.setAutoDelete( TRUE );
+ d->customWidgets.setAutoDelete( TRUE );
+}
+
+/*! \fn QWidgetFactory::~QWidgetFactory()
+ Destructor.
+*/
+QWidgetFactory::~QWidgetFactory()
+{
+ delete d;
+}
+
+/*!
+
+ Loads the \e{Qt Designer} user interface description file \a uiFile
+ and returns the top-level widget in that description. \a parent and
+ \a name are passed to the constructor of the top-level widget.
+
+ This function also performs signal and slot connections, tab
+ ordering, etc., as described in the .ui file. In \e{Qt Designer} it
+ is possible to add custom slots to a form and connect to them. If
+ you want these connections to be made, you must create a class
+ derived from QObject, which implements all these slots. Then pass an
+ instance of the object as \a connector to this function. If you do
+ this, the connections to the custom slots will be done using the \a
+ connector as slot.
+
+ If something fails, 0 is returned.
+
+ The ownership of the returned widget is passed to the caller.
+*/
+
+QWidget *QWidgetFactory::create( const QString &uiFile, QObject *connector,
+ QWidget *parent, const char *name )
+{
+ setupPluginDir();
+ QFile f( uiFile );
+ bool failed = FALSE;
+ if ( !f.open( IO_ReadOnly ) )
+ failed = TRUE;
+ if ( failed && qApp->type() == QApplication::Tty ) {
+ // for QSA: If we have no GUI, we have no form definition
+ // files, but just the code. So try if only the code exists.
+ f.setName( uiFile + ".qs" );
+ failed = !f.open( IO_ReadOnly );
+ }
+ if ( failed )
+ return 0;
+
+ qwf_currFileName = uiFile;
+ QWidget *w = QWidgetFactory::create( &f, connector, parent, name );
+ if ( !qwf_forms )
+ qwf_forms = new QMap<QWidget*, QString>;
+ qwf_forms->insert( w, uiFile );
+ return w;
+}
+
+#undef slots
+
+/*! \overload
+ Loads the user interface description from device \a dev.
+ */
+
+QWidget *QWidgetFactory::create( QIODevice *dev, QObject *connector, QWidget *parent, const char *name )
+{
+ setupPluginDir();
+ QWidget *w = 0;
+ QDomDocument doc;
+ QString errMsg;
+ int errLine;
+
+ QWidgetFactory *widgetFactory = new QWidgetFactory;
+ widgetFactory->toplevel = 0;
+
+ // If we have no GUI, we only want to load the code
+ if ( qApp->type() != QApplication::Tty ) {
+ QIODevice::Offset start = dev->at();
+ Q_UINT32 magic;
+ QDataStream in( dev );
+ in >> magic;
+ if ( magic == UibMagic ) {
+ w = widgetFactory->createFromUibFile( in, connector, parent, name );
+ } else {
+ in.unsetDevice();
+ dev->at( start );
+ if ( doc.setContent( dev, &errMsg, &errLine ) ) {
+ w = widgetFactory->createFromUiFile( doc, connector, parent, name );
+ } else {
+ // qDebug( QString("Parse error: ") + errMsg + QString(" in line %d"), errLine );
+ }
+ }
+ if ( !w ) {
+ delete widgetFactory;
+ return 0;
+ }
+ }
+
+ if ( !languageInterfaceManager )
+ languageInterfaceManager =
+ new QPluginManager<LanguageInterface>( IID_Language, QApplication::libraryPaths(), *qwf_plugin_dir );
+ widgetFactory->loadExtraSource();
+
+ if ( widgetFactory->toplevel ) {
+#ifndef QT_NO_SQL
+ QMap<QWidget*, SqlWidgetConnection>::Iterator cit = widgetFactory->sqlWidgetConnections.begin();
+ for( ; cit != widgetFactory->sqlWidgetConnections.end(); ++cit ) {
+ if ( widgetFactory->noDatabaseWidgets.find( cit.key()->name() ) !=
+ widgetFactory->noDatabaseWidgets.end() )
+ continue;
+ if ( cit.key()->inherits( "QDesignerDataBrowser2" ) )
+ ( (QDesignerDataBrowser2*)cit.key() )->initPreview( (*cit).conn, (*cit).table,
+ cit.key(), *(*cit).dbControls );
+ else if ( cit.key()->inherits( "QDesignerDataView2" ) )
+ ( (QDesignerDataView2*)cit.key() )->initPreview( (*cit).conn, (*cit).table,
+ cit.key(), *(*cit).dbControls );
+ }
+
+ for ( QMap<QString, QStringList>::Iterator it = widgetFactory->dbTables.begin();
+ it != widgetFactory->dbTables.end(); ++it ) {
+ QDataTable *table = (QDataTable*)widgetFactory->toplevel->child( it.key(), "QDataTable" );
+ if ( !table )
+ continue;
+ if ( widgetFactory->noDatabaseWidgets.find( table->name() ) !=
+ widgetFactory->noDatabaseWidgets.end() )
+ continue;
+ QValueList<Field> fieldMap = *widgetFactory->fieldMaps.find( table );
+ QString conn = (*it)[ 0 ];
+ QSqlCursor* c = 0;
+ QSqlDatabase *db = 0;
+ if ( conn.isEmpty() || conn == "(default)" ) {
+ db = QSqlDatabase::database();
+ c = new QSqlCursor( (*it)[ 1 ] );
+ } else {
+ db = QSqlDatabase::database( conn );
+ c = new QSqlCursor( (*it)[ 1 ], TRUE, db );
+ }
+ if ( db ) {
+ table->setSqlCursor( c, fieldMap.isEmpty(), TRUE );
+ table->refresh( QDataTable::RefreshAll );
+ }
+ }
+#endif
+ }
+
+ for ( QMap<QString, QString>::Iterator it = widgetFactory->buddies.begin();
+ it != widgetFactory->buddies.end(); ++it ) {
+ QLabel *label = (QLabel*)widgetFactory->toplevel->child( it.key(), "QLabel" );
+ QWidget *buddy = (QWidget*)widgetFactory->toplevel->child( *it, "QWidget" );
+ if ( label && buddy )
+ label->setBuddy( buddy );
+ }
+
+ delete widgetFactory;
+
+ QApplication::sendPostedEvents();
+
+ return w;
+}
+
+QWidget *QWidgetFactory::createFromUiFile( QDomDocument doc, QObject *connector,
+ QWidget *parent, const char *name )
+{
+ DomTool::fixDocument( doc );
+
+ uiFileVersion = doc.firstChild().toElement().attribute("version");
+ QDomElement e = doc.firstChild().toElement().firstChild().toElement();
+
+ QDomElement variables = e;
+ while ( variables.tagName() != "variables" && !variables.isNull() )
+ variables = variables.nextSibling().toElement();
+
+ QDomElement slots = e;
+ while ( slots.tagName() != "slots" && !slots.isNull() )
+ slots = slots.nextSibling().toElement();
+
+ QDomElement connections = e;
+ while ( connections.tagName() != "connections" && !connections.isNull() )
+ connections = connections.nextSibling().toElement();
+
+ QDomElement imageCollection = e;
+ while ( imageCollection.tagName() != "images" && !imageCollection.isNull() )
+ imageCollection = imageCollection.nextSibling().toElement();
+
+ QDomElement tabOrder = e;
+ while ( tabOrder.tagName() != "tabstops" && !tabOrder.isNull() )
+ tabOrder = tabOrder.nextSibling().toElement();
+
+ QDomElement actions = e;
+ while ( actions.tagName() != "actions" && !actions.isNull() )
+ actions = actions.nextSibling().toElement();
+
+ QDomElement toolbars = e;
+ while ( toolbars.tagName() != "toolbars" && !toolbars.isNull() )
+ toolbars = toolbars.nextSibling().toElement();
+
+ QDomElement menubar = e;
+ while ( menubar.tagName() != "menubar" && !menubar.isNull() )
+ menubar = menubar.nextSibling().toElement();
+
+ QDomElement functions = e;
+ while ( functions.tagName() != "functions" && !functions.isNull() )
+ functions = functions.nextSibling().toElement();
+
+ QDomElement widget;
+ while ( !e.isNull() ) {
+ if ( e.tagName() == "class" ) {
+ d->translationContext = e.firstChild().toText().data();
+ } else if ( e.tagName() == "widget" ) {
+ widget = e;
+ } else if ( e.tagName() == "pixmapinproject" ) {
+ usePixmapCollection = TRUE;
+ } else if ( e.tagName() == "layoutdefaults" ) {
+ defSpacing = e.attribute( "spacing", QString::number( defSpacing ) ).toInt();
+ defMargin = e.attribute( "margin", QString::number( defMargin ) ).toInt();
+ }
+ e = e.nextSibling().toElement();
+ }
+
+ if ( !imageCollection.isNull() )
+ loadImageCollection( imageCollection );
+
+ createWidgetInternal( widget, parent, 0, widget.attribute("class", "QWidget") );
+ QWidget *w = toplevel;
+ if ( !w )
+ return 0;
+
+ if ( !actions.isNull() )
+ loadActions( actions );
+ if ( !toolbars.isNull() )
+ loadToolBars( toolbars );
+ if ( !menubar.isNull() )
+ loadMenuBar( menubar );
+
+ if ( !connections.isNull() )
+ loadConnections( connections, connector );
+ if ( w && name && qstrlen( name ) > 0 )
+ w->setName( name );
+
+ if ( !tabOrder.isNull() )
+ loadTabOrder( tabOrder );
+
+#if 0
+ if ( !functions.isNull() ) // compatibiliy with early 3.0 betas
+ loadFunctions( functions );
+#endif
+
+ return w;
+}
+
+void QWidgetFactory::unpackUInt16( QDataStream& in, Q_UINT16& n )
+{
+ Q_UINT8 half;
+ in >> half;
+ if ( half == 255 ) {
+ in >> n;
+ } else {
+ n = half;
+ }
+}
+
+void QWidgetFactory::unpackUInt32( QDataStream& in, Q_UINT32& n )
+{
+ Q_UINT16 half;
+ in >> half;
+ if ( half == 65535 ) {
+ in >> n;
+ } else {
+ n = half;
+ }
+}
+
+void QWidgetFactory::unpackByteArray( QDataStream& in, QByteArray& array )
+{
+ Q_UINT32 size;
+ unpackUInt32( in, size );
+ array.resize( size );
+ in.readRawBytes( array.data(), size );
+}
+
+void QWidgetFactory::unpackCString( const UibStrTable& strings, QDataStream& in,
+ QCString& cstr )
+{
+ Q_UINT32 n;
+ unpackUInt32( in, n );
+ cstr = strings.asCString( n );
+}
+
+void QWidgetFactory::unpackString( const UibStrTable& strings, QDataStream& in,
+ QString& str )
+{
+ Q_UINT32 n;
+ unpackUInt32( in, n );
+ str = strings.asString( n );
+}
+
+void QWidgetFactory::unpackStringSplit( const UibStrTable& strings,
+ QDataStream& in, QString& str )
+{
+ QString remainder;
+ unpackString( strings, in, str );
+ unpackString( strings, in, remainder );
+ str += remainder;
+}
+
+void QWidgetFactory::unpackVariant( const UibStrTable& strings, QDataStream& in,
+ QVariant& value )
+{
+ QString imageName;
+ Q_UINT32 number;
+ Q_UINT16 count;
+ Q_UINT16 x;
+ Q_UINT16 y;
+ Q_UINT16 width;
+ Q_UINT16 height;
+ Q_UINT8 bit;
+ Q_UINT8 type;
+
+ in >> type;
+
+ switch ( type ) {
+ case QVariant::String:
+ unpackString( strings, in, value.asString() );
+ break;
+ case QVariant::Pixmap:
+ unpackString( strings, in, imageName );
+ if ( imageName.isEmpty() ) {
+ value.asPixmap() = QPixmap();
+ } else {
+ value.asPixmap() = loadPixmap( imageName );
+ }
+ break;
+ case QVariant::Image:
+ unpackString( strings, in, imageName );
+ if ( imageName.isEmpty() ) {
+ value.asImage() = QImage();
+ } else {
+ value.asImage() = loadFromCollection( imageName );
+ }
+ break;
+ case QVariant::IconSet:
+ unpackString( strings, in, imageName );
+ if ( imageName.isEmpty() ) {
+ value.asIconSet() = QIconSet();
+ } else {
+ value.asIconSet() = QIconSet( loadPixmap(imageName) );
+ }
+ break;
+ case QVariant::StringList:
+ unpackUInt16( in, count );
+ while ( count-- ) {
+ QString str;
+ unpackString( strings, in, str );
+ value.asStringList().append( str );
+ }
+ break;
+ case QVariant::Rect:
+ unpackUInt16( in, x );
+ unpackUInt16( in, y );
+ unpackUInt16( in, width );
+ unpackUInt16( in, height );
+ value = QRect( x, y, width, height );
+ break;
+ case QVariant::Size:
+ unpackUInt16( in, width );
+ unpackUInt16( in, height );
+ value = QSize( width, height );
+ break;
+ case QVariant::Color:
+ in >> value.asColor();
+ break;
+ case QVariant::Point:
+ unpackUInt16( in, x );
+ unpackUInt16( in, y );
+ value = QPoint( x, y );
+ break;
+ case QVariant::Int:
+ unpackUInt32( in, number );
+ value = (int) number;
+ break;
+ case QVariant::Bool:
+ in >> bit;
+ value = QVariant( bit != 0, 0 );
+ break;
+ case QVariant::Double:
+ in >> value.asDouble();
+ break;
+ case QVariant::CString:
+ unpackCString( strings, in, value.asCString() );
+ break;
+ case QVariant::Cursor:
+ in >> value.asCursor();
+ break;
+ case QVariant::Date:
+ in >> value.asDate();
+ break;
+ case QVariant::Time:
+ in >> value.asTime();
+ break;
+ case QVariant::DateTime:
+ in >> value.asDateTime();
+ break;
+ default:
+ in >> value;
+ }
+}
+
+void QWidgetFactory::inputSpacer( const UibStrTable& strings, QDataStream& in,
+ QLayout *parent )
+{
+ QCString name;
+ QVariant value;
+ QCString comment;
+ QSizePolicy::SizeType sizeType = QSizePolicy::Preferred;
+ bool vertical = FALSE;
+ int w = 0;
+ int h = 0;
+ Q_UINT16 column = 0;
+ Q_UINT16 row = 0;
+ Q_UINT16 colspan = 1;
+ Q_UINT16 rowspan = 1;
+ Q_UINT8 objectTag;
+
+ in >> objectTag;
+ while ( !in.atEnd() && objectTag != Object_End ) {
+ switch ( objectTag ) {
+ case Object_GridCell:
+ unpackUInt16( in, column );
+ unpackUInt16( in, row );
+ unpackUInt16( in, colspan );
+ unpackUInt16( in, rowspan );
+ break;
+ case Object_VariantProperty:
+ unpackCString( strings, in, name );
+ unpackVariant( strings, in, value );
+
+ if ( name == "orientation" ) {
+ vertical = ( value == "Vertical" );
+ } else if ( name == "sizeHint" ) {
+ w = value.toSize().width();
+ h = value.toSize().height();
+ } else if ( name == "sizeType" ) {
+ sizeType = stringToSizeType( value.toString() );
+ }
+ break;
+ default:
+ qFatal( "Corrupt" );
+ }
+ in >> objectTag;
+ }
+
+ if ( parent != 0 ) {
+ QSpacerItem *spacer;
+ if ( vertical ) {
+ spacer = new QSpacerItem( w, h, QSizePolicy::Minimum, sizeType );
+ } else {
+ spacer = new QSpacerItem( w, h, sizeType, QSizePolicy::Minimum );
+ }
+
+ if ( parent->inherits("QGridLayout") ) {
+ ((QGridLayout *) parent)->addMultiCell( spacer, row,
+ row + rowspan - 1, column, column + colspan - 1,
+ vertical ? Qt::AlignHCenter : Qt::AlignVCenter );
+ } else {
+ parent->addItem( spacer );
+ }
+ }
+}
+
+void QWidgetFactory::inputColumnOrRow( const UibStrTable& strings,
+ QDataStream& in, QObject *parent,
+ bool isRow )
+{
+ QString text;
+ QPixmap pixmap;
+ QString field;
+ bool clickable = TRUE;
+ bool resizable = TRUE;
+
+ QCString name;
+ QVariant value;
+ QCString comment;
+ QString str;
+ Q_UINT8 objectTag;
+
+ in >> objectTag;
+ while ( !in.atEnd() && objectTag != Object_End ) {
+ switch ( objectTag ) {
+ case Object_TextProperty:
+ unpackCString( strings, in, name );
+ unpackCString( strings, in, value.asCString() );
+ unpackCString( strings, in, comment );
+ str = translate( value.asCString().data(), comment.data() );
+
+ if ( name == "field" ) {
+ field = str;
+ } else if ( name == "text" ) {
+ text = str;
+ }
+ break;
+ case Object_VariantProperty:
+ unpackCString( strings, in, name );
+ unpackVariant( strings, in, value );
+
+ if ( name == "clickable" ) {
+ clickable = value.toBool();
+ } else if ( name == "pixmap" ) {
+ pixmap = value.asPixmap();
+ } else if ( name == "resizable" ) {
+ resizable = value.toBool();
+ }
+ break;
+ default:
+ qFatal( "Corrupt" );
+ }
+ in >> objectTag;
+ }
+
+ if ( parent != 0 ) {
+ if ( parent->inherits("QListView") ) {
+ createListViewColumn( (QListView *) parent, text, pixmap, clickable,
+ resizable );
+#ifndef QT_NO_TABLE
+ } else if ( parent->inherits("QTable") ) {
+ createTableColumnOrRow( (QTable *) parent, text, pixmap, field,
+ isRow );
+#endif
+ }
+ }
+}
+
+void QWidgetFactory::inputItem( const UibStrTable& strings, QDataStream& in,
+ QObject *parent, QListViewItem *parentItem )
+{
+ QStringList texts;
+ QValueList<QPixmap> pixmaps;
+ QCString name;
+ QVariant value;
+ QCString comment;
+ Q_UINT8 objectTag;
+
+ QListView *listView = 0;
+ if ( parent != 0 && parent->inherits("QListView") )
+ parent = (QListView *) parent;
+ QListViewItem *item = 0;
+ if ( listView != 0 ) {
+ if ( parentItem == 0 ) {
+ item = new QListViewItem( listView, d->lastItem );
+ } else {
+ item = new QListViewItem( parentItem, d->lastItem );
+ }
+ d->lastItem = item;
+ }
+
+ in >> objectTag;
+ while ( !in.atEnd() && objectTag != Object_End ) {
+ switch ( objectTag ) {
+ case Object_Item:
+ if ( listView != 0 )
+ d->lastItem->setOpen( TRUE );
+ inputItem( strings, in, parent, item );
+ break;
+ case Object_TextProperty:
+ unpackCString( strings, in, name );
+ unpackCString( strings, in, value.asCString() );
+ unpackCString( strings, in, comment );
+
+ if ( name == "text" )
+ texts << translate( value.asCString().data(), comment.data() );
+ break;
+ case Object_VariantProperty:
+ unpackCString( strings, in, name );
+ unpackVariant( strings, in, value );
+
+ if ( name == "pixmap" )
+ pixmaps << value.asPixmap();
+ break;
+ default:
+ qFatal( "Corrupt" );
+ }
+ in >> objectTag;
+ }
+
+ if ( listView != 0 ) {
+ int i = 0;
+ QStringList::ConstIterator t = texts.begin();
+ while ( t != texts.end() ) {
+ item->setText( i, *t );
+ ++i;
+ ++t;
+ }
+
+ int j = 0;
+ QValueList<QPixmap>::ConstIterator p = pixmaps.begin();
+ while ( p != pixmaps.end() ) {
+ item->setPixmap( j, *p );
+ ++j;
+ ++p;
+ }
+ } else {
+ QString text = texts.last();
+ QPixmap pixmap = pixmaps.last();
+
+ if ( parent != 0 ) {
+ if ( parent->inherits("QComboBox") ||
+ parent->inherits("QListBox") ) {
+ QListBox *listBox = (QListBox *) parent->qt_cast( "QListBox" );
+ if ( listBox == 0 )
+ listBox = ((QComboBox *) parent)->listBox();
+
+ if ( pixmap.isNull() ) {
+ (void) new QListBoxText( listBox, text );
+ } else {
+ (void) new QListBoxPixmap( listBox, pixmap, text );
+ }
+ #ifndef QT_NO_ICONVIEW
+ } else if ( parent->inherits("QIconView") ) {
+ (void) new QIconViewItem( (QIconView *) parent, text, pixmap );
+ #endif
+ }
+ }
+ }
+}
+
+void QWidgetFactory::inputMenuItem( QObject **objects,
+ const UibStrTable& strings, QDataStream& in,
+ QMenuBar *menuBar )
+{
+ QCString name;
+ QCString text;
+ Q_UINT16 actionNo;
+ Q_UINT8 objectTag;
+
+ unpackCString( strings, in, name );
+ unpackCString( strings, in, text );
+
+ QPopupMenu *popupMenu = new QPopupMenu( menuBar->parentWidget(), name );
+
+ in >> objectTag;
+ while ( !in.atEnd() && objectTag != Object_End ) {
+ switch ( objectTag ) {
+ case Object_ActionRef:
+ unpackUInt16( in, actionNo );
+ ((QAction *) objects[actionNo])->addTo( popupMenu );
+ break;
+ case Object_Separator:
+ popupMenu->insertSeparator();
+ break;
+ default:
+ qFatal( "Corrupt" );
+ }
+ in >> objectTag;
+ }
+ menuBar->insertItem( translate(text.data()), popupMenu );
+}
+
+QObject *QWidgetFactory::inputObject( QObject **objects, int& numObjects,
+ const UibStrTable& strings,
+ QDataStream& in, QWidget *ancestorWidget,
+ QObject *parent, QCString className )
+{
+ QObject *obj = 0;
+ QWidget *widget = 0;
+ QLayout *layout = 0;
+ QWidget *parentWidget = 0;
+ QLayout *parentLayout = 0;
+
+ bool isQObject = !className.isEmpty();
+ if ( isQObject ) {
+ if ( parent != 0 ) {
+ if ( parent->isWidgetType() ) {
+ if ( parent->inherits("QMainWindow") ) {
+ parentWidget = ((QMainWindow *) parent)->centralWidget();
+ } else {
+ parentWidget = (QWidget *) parent;
+ }
+ } else if ( parent->inherits("QLayout") ) {
+ parentLayout = (QLayout *) parent;
+ parentWidget = ancestorWidget;
+ }
+ }
+
+ if ( className == "QAction" ) {
+ unpackCString( strings, in, className );
+ if ( className == "QActionGroup" ) {
+ obj = new QActionGroup( parent );
+ } else {
+ obj = new QAction( parent );
+ }
+ } else if ( className == "QLayout" ) {
+ unpackCString( strings, in, className );
+ LayoutType type = Grid;
+ if ( className == "QHBoxLayout" ) {
+ type = HBox;
+ } else if ( className == "QVBoxLayout" ) {
+ type = VBox;
+ }
+ if ( parentLayout != 0 && parentLayout->inherits("QGridLayout") ) {
+ layout = createLayout( 0, 0, type );
+ } else {
+ layout = createLayout( parentWidget, parentLayout, type );
+ }
+ obj = layout;
+ } else if ( className == "QMenuBar" ) {
+ unpackCString( strings, in, className );
+ widget = ((QMainWindow *) parent)->menuBar();
+ obj = widget;
+ } else if ( className == "QToolBar" ) {
+ Q_UINT8 dock;
+ in >> dock;
+ unpackCString( strings, in, className );
+ widget = new QToolBar( QString::null, (QMainWindow *) parent,
+ (Qt::Dock) dock );
+ obj = widget;
+ } else if ( className == "QWidget" ) {
+ unpackCString( strings, in, className );
+ widget = createWidget( className, parentWidget, 0 );
+ obj = widget;
+ }
+
+ if ( widget != 0 )
+ ancestorWidget = widget;
+ d->lastItem = 0;
+ objects[numObjects++] = obj;
+ }
+
+ QCString name;
+ QVariant value;
+ QCString comment;
+ QString str;
+ Q_UINT16 actionNo;
+ int metAttribute = 0;
+ Q_UINT16 column = 0;
+ Q_UINT16 row = 0;
+ Q_UINT16 colspan = 1;
+ Q_UINT16 rowspan = 1;
+ Q_UINT8 paletteTag;
+ Q_UINT8 objectTag;
+
+ in >> objectTag;
+ while ( !in.atEnd() && objectTag != Object_End ) {
+ switch ( objectTag ) {
+ case Object_ActionRef:
+ unpackUInt16( in, actionNo );
+ ((QAction *) objects[actionNo])->addTo( (QToolBar *) widget );
+ break;
+ case Object_Attribute:
+ metAttribute = 2;
+ break;
+ case Object_Column:
+ inputColumnOrRow( strings, in, obj, FALSE );
+ break;
+ case Object_Event:
+ unpackCString( strings, in, name );
+ unpackVariant( strings, in, value );
+ // ### do something with value.asStringList()
+ break;
+ case Object_FontProperty:
+ {
+ QFont font;
+ QString family;
+ Q_UINT16 pointSize;
+ Q_UINT8 fontFlags;
+
+ unpackCString( strings, in, name );
+ in >> fontFlags;
+
+ if ( fontFlags & Font_Family ) {
+ unpackString( strings, in, family );
+ font.setFamily( family );
+ }
+ if ( fontFlags & Font_PointSize ) {
+ unpackUInt16( in, pointSize );
+ font.setPointSize( pointSize );
+ }
+ if ( fontFlags & Font_Bold )
+ font.setBold( TRUE );
+ if ( fontFlags & Font_Italic )
+ font.setItalic( TRUE );
+ if ( fontFlags & Font_Underline )
+ font.setUnderline( TRUE );
+ if ( fontFlags & Font_StrikeOut )
+ font.setStrikeOut( TRUE );
+
+ if ( obj != 0 )
+ setProperty( obj, name, font );
+ }
+ break;
+ case Object_GridCell:
+ unpackUInt16( in, column );
+ unpackUInt16( in, row );
+ unpackUInt16( in, colspan );
+ unpackUInt16( in, rowspan );
+ break;
+ case Object_Item:
+ inputItem( strings, in, obj );
+ break;
+ case Object_MenuItem:
+ inputMenuItem( objects, strings, in, (QMenuBar *) widget );
+ break;
+ case Object_PaletteProperty:
+ {
+ QPalette palette;
+ QColorGroup colorGroup;
+ QColor color;
+ int role = -1;
+
+ unpackCString( strings, in, name );
+
+ in >> paletteTag;
+ while ( !in.atEnd() && paletteTag != Palette_End ) {
+ switch ( paletteTag ) {
+ case Palette_Active:
+ palette.setActive( colorGroup );
+ role = -1;
+ break;
+ case Palette_Inactive:
+ palette.setInactive( colorGroup );
+ role = -1;
+ break;
+ case Palette_Disabled:
+ palette.setDisabled( colorGroup );
+ role = -1;
+ break;
+ case Palette_Color:
+ role++;
+ in >> color;
+ colorGroup.setColor( (QColorGroup::ColorRole) role,
+ color );
+ break;
+ case Palette_Pixmap:
+ unpackVariant( strings, in, value );
+ colorGroup.setBrush( (QColorGroup::ColorRole) role,
+ QBrush(color, value.asPixmap()) );
+ break;
+ default:
+ qFatal( "Corrupt" );
+ }
+ in >> paletteTag;
+ }
+ if ( obj != 0 )
+ setProperty( obj, name, palette );
+ }
+ break;
+ case Object_Row:
+ inputColumnOrRow( strings, in, obj, TRUE );
+ break;
+ case Object_Spacer:
+ inputSpacer( strings, in, layout );
+ break;
+ case Object_Separator:
+ ((QToolBar *) widget)->addSeparator();
+ break;
+ case Object_SubAction:
+ inputObject( objects, numObjects, strings, in, parentWidget,
+ obj != 0 ? obj : parent, "QAction" );
+ break;
+ case Object_SubLayout:
+ inputObject( objects, numObjects, strings, in, parentWidget, obj,
+ "QLayout" );
+ break;
+ case Object_SubWidget:
+ inputObject( objects, numObjects, strings, in, parentWidget, obj,
+ "QWidget" );
+ break;
+ case Object_TextProperty:
+ unpackCString( strings, in, name );
+ unpackCString( strings, in, value.asCString() );
+ unpackCString( strings, in, comment );
+ str = translate( value.asCString().data(), comment.data() );
+
+ if ( metAttribute > 0 ) {
+ if ( name == "title" ) {
+ if ( parent != 0 ) {
+ if ( parent->inherits("QTabWidget") ) {
+ ((QTabWidget *) parent)->insertTab( widget, str );
+ } else if ( parent->inherits("QWizard") ) {
+ ((QWizard *) parent)->addPage( widget, str );
+ }
+ }
+ }
+ } else {
+ if ( obj != 0 )
+ setProperty( obj, name, str );
+ }
+ break;
+ case Object_VariantProperty:
+ unpackCString( strings, in, name );
+ unpackVariant( strings, in, value );
+
+ if ( metAttribute > 0 ) {
+ if ( name == "id" ) {
+ if ( parent != 0 && parent->inherits("QWidgetStack") )
+ ((QWidgetStack *) parent)->addWidget( widget, value.toInt() );
+ }
+ } else {
+ if ( obj != 0 )
+ setProperty( obj, name, value );
+ }
+ break;
+ default:
+ qFatal( "Corrupt" );
+ }
+ in >> objectTag;
+ metAttribute--;
+ }
+
+ if ( parentLayout != 0 ) {
+ if ( widget != 0 ) {
+ if ( parentLayout->inherits("QGridLayout") ) {
+ ((QGridLayout *) parentLayout)->addMultiCellWidget(
+ widget, row, row + rowspan - 1, column,
+ column + colspan - 1 );
+ } else {
+ ((QBoxLayout *) parentLayout)->addWidget( widget );
+ }
+ } else if ( layout != 0 ) {
+ if ( parentLayout->inherits("QGridLayout") ) {
+ ((QGridLayout *) parentLayout)->addMultiCellLayout(
+ layout, row, row + rowspan - 1, column,
+ column + colspan - 1 );
+ }
+ }
+ }
+ return obj;
+}
+
+QWidget *QWidgetFactory::createFromUibFile( QDataStream& in,
+ QObject * /* connector */ , QWidget *parent, const char *name )
+{
+#define END_OF_BLOCK() \
+ ( in.atEnd() || in.device()->at() >= nextBlock )
+
+ Q_UINT8 lf;
+ Q_UINT8 cr;
+ in >> lf;
+ in >> cr;
+ if ( lf != '\n' || cr != '\r' ) {
+ qWarning( "File corrupted" );
+ return 0;
+ }
+
+ Q_UINT8 qdatastreamVersion;
+ in >> qdatastreamVersion;
+ if ( (int) qdatastreamVersion > in.version() ) {
+ qWarning( "Incompatible version of Qt" );
+ return 0;
+ }
+ in.setVersion( qdatastreamVersion );
+
+ UibStrTable strings;
+ QObject **objects = 0;
+ int numObjects = 0;
+
+ Q_UINT8 blockType;
+ Q_UINT32 blockSize;
+
+ in >> blockType;
+ while ( !in.atEnd() && blockType != Block_End ) {
+ unpackUInt32( in, blockSize );
+ QIODevice::Offset nextBlock = in.device()->at() + blockSize;
+
+ switch ( blockType ) {
+ case Block_Actions:
+ inputObject( objects, numObjects, strings, in, toplevel, toplevel );
+ break;
+ case Block_Buddies:
+ {
+ Q_UINT16 labelNo;
+ Q_UINT16 buddyNo;
+
+ do {
+ unpackUInt16( in, labelNo );
+ unpackUInt16( in, buddyNo );
+ QLabel *label =
+ (QLabel *) objects[labelNo]->qt_cast( "QLabel" );
+ if ( label != 0 )
+ label->setBuddy( (QWidget *) objects[buddyNo] );
+ } while ( !END_OF_BLOCK() );
+ }
+ break;
+ case Block_Connections:
+ {
+ QString language = "C++";
+ Q_UINT16 senderNo = 0;
+ QString signal = "clicked()";
+ Q_UINT16 receiverNo = 0;
+ QString slot = "accept()";
+ Q_UINT8 connectionFlags;
+
+ do {
+ in >> connectionFlags;
+ if ( connectionFlags & Connection_Language )
+ unpackString( strings, in, language );
+ if ( connectionFlags & Connection_Sender )
+ unpackUInt16( in, senderNo );
+ if ( connectionFlags & Connection_Signal )
+ unpackStringSplit( strings, in, signal );
+ if ( connectionFlags & Connection_Receiver )
+ unpackUInt16( in, receiverNo );
+ if ( connectionFlags & Connection_Slot )
+ unpackStringSplit( strings, in, slot );
+ // ###
+#if 0
+ qWarning( "connect( %p, %s, %p, %s )", objects[senderNo],
+ signal.latin1(), objects[receiverNo],
+ slot.latin1() );
+#endif
+ } while ( !END_OF_BLOCK() );
+ }
+ break;
+ case Block_Functions:
+ // ###
+ qWarning( "Block_Functions not supported" );
+ in.device()->at( nextBlock );
+ break;
+ case Block_Images:
+ {
+ QString format;
+ Q_UINT32 length;
+ QByteArray data;
+ Image image;
+
+ do {
+ unpackString( strings, in, image.name );
+ unpackString( strings, in, format );
+ unpackUInt32( in, length );
+ unpackByteArray( in, data );
+ image.img = loadImageData( format, length, data );
+ images += image;
+ } while ( !END_OF_BLOCK() );
+ }
+ break;
+ case Block_Intro:
+ {
+ Q_INT16 defaultMargin;
+ Q_INT16 defaultSpacing;
+ Q_UINT16 maxObjects;
+ Q_UINT8 introFlags;
+
+ in >> introFlags;
+ in >> defaultMargin;
+ in >> defaultSpacing;
+ unpackUInt16( in, maxObjects );
+ unpackCString( strings, in, d->translationContext );
+
+ if ( introFlags & Intro_Pixmapinproject )
+ usePixmapCollection = TRUE;
+ if ( defaultMargin != -32768 )
+ defMargin = defaultMargin;
+ if ( defaultSpacing != -32768 )
+ defSpacing = defaultSpacing;
+ objects = new QObject *[maxObjects];
+ }
+ break;
+ case Block_Menubar:
+ inputObject( objects, numObjects, strings, in, toplevel, toplevel,
+ "QMenuBar" );
+ break;
+ case Block_Slots:
+ {
+ QString language;
+ QString slot;
+
+ do {
+ unpackString( strings, in, language );
+ unpackStringSplit( strings, in, slot );
+ } while ( !END_OF_BLOCK() );
+ }
+ break;
+ case Block_Strings:
+ strings.readBlock( in, blockSize );
+ break;
+ case Block_Tabstops:
+ {
+ Q_UINT16 beforeNo;
+ Q_UINT16 afterNo;
+
+ unpackUInt16( in, beforeNo );
+ while ( !END_OF_BLOCK() ) {
+ unpackUInt16( in, afterNo );
+ toplevel->setTabOrder( (QWidget *) objects[beforeNo],
+ (QWidget *) objects[afterNo] );
+ beforeNo = afterNo;
+ }
+ }
+ break;
+ case Block_Toolbars:
+ do {
+ inputObject( objects, numObjects, strings, in, toplevel,
+ toplevel, "QToolBar" );
+ } while ( !END_OF_BLOCK() );
+ break;
+ case Block_Variables:
+ // ###
+ qWarning( "Block_Variables not supported" );
+ in.device()->at( nextBlock );
+ break;
+ case Block_Widget:
+ toplevel = (QWidget *)
+ inputObject( objects, numObjects, strings, in, toplevel, parent,
+ "QWidget" );
+ if ( toplevel != 0 )
+ toplevel->setName( name );
+ break;
+ default:
+ qWarning( "Version error" );
+ return 0;
+ }
+ in >> blockType;
+ }
+ delete[] objects;
+ return toplevel;
+}
+
+/*! Installs a widget factory \a factory, which normally contains
+ additional widgets that can then be created using a QWidgetFactory.
+ See createWidget() for further details.
+*/
+
+void QWidgetFactory::addWidgetFactory( QWidgetFactory *factory )
+{
+ widgetFactories.append( factory );
+}
+
+/*!
+ Creates a widget of the type \a className passing \a parent and \a
+ name to its constructor.
+
+ If \a className is a widget in the Qt library, it is directly
+ created by this function. If the widget isn't in the Qt library,
+ each of the installed widget plugins is asked, in turn, to create
+ the widget. As soon as a plugin says it can create the widget it
+ is asked to do so. It may occur that none of the plugins can
+ create the widget, in which case each installed widget factory is
+ asked to create the widget (see addWidgetFactory()). If the widget
+ cannot be created by any of these means, 0 is returned.
+
+ If you have a custom widget, and want it to be created using the
+ widget factory, there are two approaches you can use:
+
+ \list 1
+
+ \i Write a widget plugin. This allows you to use the widget in
+ \e{Qt Designer} and in this QWidgetFactory. See the widget plugin
+ documentation for further details. (See the "Creating Custom
+ Widgets with Plugins" section of the \link designer-manual.book Qt
+ Designer manual\endlink for an example.
+
+ \i Subclass QWidgetFactory. Then reimplement this function to
+ create and return an instance of your custom widget if \a
+ className equals the name of your widget, otherwise return 0. Then
+ at the beginning of your program where you want to use the widget
+ factory to create widgets do a:
+ \code
+ QWidgetFactory::addWidgetFactory( new MyWidgetFactory );
+ \endcode
+ where MyWidgetFactory is your QWidgetFactory subclass.
+
+ \endlist
+*/
+
+QWidget *QWidgetFactory::createWidget( const QString &className, QWidget *parent,
+ const char *name ) const
+{
+ // create widgets we know
+ if ( className == "QPushButton" ) {
+ return new QPushButton( parent, name );
+ } else if ( className == "QToolButton" ) {
+ return new QToolButton( parent, name );
+ } else if ( className == "QCheckBox" ) {
+ return new QCheckBox( parent, name );
+ } else if ( className == "QRadioButton" ) {
+ return new QRadioButton( parent, name );
+ } else if ( className == "QGroupBox" ) {
+ return new QGroupBox( parent, name );
+ } else if ( className == "QButtonGroup" ) {
+ return new QButtonGroup( parent, name );
+ } else if ( className == "QIconView" ) {
+#if !defined(QT_NO_ICONVIEW)
+ return new QIconView( parent, name );
+#endif
+ } else if ( className == "QTable" ) {
+#if !defined(QT_NO_TABLE)
+ return new QTable( parent, name );
+#endif
+ } else if ( className == "QListBox" ) {
+ return new QListBox( parent, name );
+ } else if ( className == "QListView" ) {
+ return new QListView( parent, name );
+ } else if ( className == "QLineEdit" ) {
+ return new QLineEdit( parent, name );
+ } else if ( className == "QSpinBox" ) {
+ return new QSpinBox( parent, name );
+ } else if ( className == "QMultiLineEdit" ) {
+ return new QMultiLineEdit( parent, name );
+ } else if ( className == "QLabel" || className == "TextLabel" || className == "PixmapLabel" ) {
+ return new QLabel( parent, name );
+ } else if ( className == "QLayoutWidget" ) {
+ return new QWidget( parent, name );
+ } else if ( className == "QTabWidget" ) {
+ return new QTabWidget( parent, name );
+ } else if ( className == "QComboBox" ) {
+ return new QComboBox( FALSE, parent, name );
+ } else if ( className == "QWidget" ) {
+ if ( !qwf_stays_on_top )
+ return new QWidget( parent, name );
+ return new QWidget( parent, name, Qt::WStyle_StaysOnTop );
+ } else if ( className == "QDialog" ) {
+ if ( !qwf_stays_on_top )
+ return new QDialog( parent, name );
+ return new QDialog( parent, name, FALSE, Qt::WStyle_StaysOnTop );
+ } else if ( className == "QWizard" ) {
+ return new QWizard( parent, name );
+ } else if ( className == "QLCDNumber" ) {
+ return new QLCDNumber( parent, name );
+ } else if ( className == "QProgressBar" ) {
+ return new QProgressBar( parent, name );
+ } else if ( className == "QTextView" ) {
+ return new QTextView( parent, name );
+ } else if ( className == "QTextBrowser" ) {
+ return new QTextBrowser( parent, name );
+ } else if ( className == "QDial" ) {
+ return new QDial( parent, name );
+ } else if ( className == "QSlider" ) {
+ return new QSlider( parent, name );
+ } else if ( className == "QFrame" ) {
+ return new QFrame( parent, name );
+ } else if ( className == "QSplitter" ) {
+ return new QSplitter( parent, name );
+ } else if ( className == "Line" ) {
+ QFrame *f = new QFrame( parent, name );
+ f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
+ return f;
+ } else if ( className == "QTextEdit" ) {
+ return new QTextEdit( parent, name );
+ } else if ( className == "QDateEdit" ) {
+ return new QDateEdit( parent, name );
+ } else if ( className == "QTimeEdit" ) {
+ return new QTimeEdit( parent, name );
+ } else if ( className == "QDateTimeEdit" ) {
+ return new QDateTimeEdit( parent, name );
+ } else if ( className == "QScrollBar" ) {
+ return new QScrollBar( parent, name );
+ } else if ( className == "QPopupMenu" ) {
+ return new QPopupMenu( parent, name );
+ } else if ( className == "QWidgetStack" ) {
+ return new QWidgetStack( parent, name );
+ } else if ( className == "QToolBox" ) {
+ return new QToolBox( parent, name );
+ } else if ( className == "QVBox" ) {
+ return new QVBox( parent, name );
+ } else if ( className == "QHBox" ) {
+ return new QHBox( parent, name );
+ } else if ( className == "QGrid" ) {
+ return new QGrid( 4, parent, name );
+ } else if ( className == "QMainWindow" ) {
+ QMainWindow *mw = 0;
+ if ( !qwf_stays_on_top )
+ mw = new QMainWindow( parent, name );
+ else
+ mw = new QMainWindow( parent, name, Qt::WType_TopLevel | Qt::WStyle_StaysOnTop );
+ mw->setCentralWidget( new QWidget( mw, "qt_central_widget" ) );
+ mw->centralWidget()->show();
+ (void)mw->statusBar();
+ return mw;
+
+ }
+#if !defined(QT_NO_SQL)
+ else if ( className == "QDataTable" ) {
+ return new QDataTable( parent, name );
+ } else if ( className == "QDataBrowser" ) {
+ return new QDesignerDataBrowser2( parent, name );
+ } else if ( className == "QDataView" ) {
+ return new QDesignerDataView2( parent, name );
+ }
+#endif
+
+ setupPluginDir();
+ // try to create it using the loaded widget plugins
+ if ( !widgetInterfaceManager )
+ widgetInterfaceManager =
+ new QPluginManager<WidgetInterface>( IID_Widget, QApplication::libraryPaths(),
+ *qwf_plugin_dir );
+
+ QInterfacePtr<WidgetInterface> iface = 0;
+ widgetInterfaceManager->queryInterface( className, &iface );
+ if ( iface ) {
+ QWidget *w = iface->create( className, parent, name );
+ if ( w ) {
+ d->customWidgets.replace( className.latin1(), new bool(TRUE) );
+ return w;
+ }
+ }
+
+ // hope we have a factory which can do it
+ for ( QWidgetFactory* f = widgetFactories.first(); f; f = widgetFactories.next() ) {
+ QWidget *w = f->createWidget( className, parent, name );
+ if ( w )
+ return w;
+ }
+
+ // no success
+ return 0;
+}
+
+/*! Returns the names of the widgets this factory can create. */
+
+QStringList QWidgetFactory::widgets()
+{
+ setupWidgetListAndMap();
+ return *availableWidgetList;
+}
+
+/*! Returns TRUE if the widget factory can create the specified \a widget;
+otherwise returns FALSE. */
+
+bool QWidgetFactory::supportsWidget( const QString &widget )
+{
+ setupWidgetListAndMap();
+ return ( availableWidgetMap->find( widget ) != availableWidgetMap->end() );
+}
+
+QWidget *QWidgetFactory::createWidgetInternal( const QDomElement &e, QWidget *parent,
+ QLayout* layout, const QString &classNameArg )
+{
+ d->lastItem = 0;
+ QDomElement n = e.firstChild().toElement();
+ QWidget *w = 0; // the widget that got created
+ QObject *obj = 0; // gets the properties
+
+ QString className = classNameArg;
+
+ int row = e.attribute( "row" ).toInt();
+ int col = e.attribute( "column" ).toInt();
+ int rowspan = e.attribute( "rowspan" ).toInt();
+ int colspan = e.attribute( "colspan" ).toInt();
+ if ( rowspan < 1 )
+ rowspan = 1;
+ if ( colspan < 1 )
+ colspan = 1;
+
+ bool isQLayoutWidget = FALSE;
+
+ if ( !className.isEmpty() ) {
+ if ( !layout && className == "QLayoutWidget" ) {
+ className = "QWidget";
+ isQLayoutWidget = TRUE;
+ }
+ if ( layout && className == "QLayoutWidget" ) {
+ // hide layout widgets
+ w = parent;
+ } else {
+ obj = QWidgetFactory::createWidget( className, parent, 0 );
+ if ( !obj )
+ return 0;
+ w = (QWidget*)obj;
+ if ( !toplevel )
+ toplevel = w;
+ if ( w->inherits( "QMainWindow" ) )
+ w = ( (QMainWindow*)w )->centralWidget();
+ if ( layout ) {
+ switch( layoutType( layout ) ) {
+ case HBox:
+ ( (QHBoxLayout*)layout )->addWidget( w );
+ break;
+ case VBox:
+ ( (QVBoxLayout*)layout )->addWidget( w );
+ break;
+ case Grid:
+ ( (QGridLayout*)layout )->addMultiCellWidget( w, row, row + rowspan - 1,
+ col, col + colspan - 1 );
+ break;
+ default:
+ break;
+ }
+ }
+
+ layout = 0;
+ }
+ }
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ QString parentClassName = parent ? parent->className() : 0;
+ bool isPlugin = parent ? !!d->customWidgets.find( parent->className() ) : FALSE;
+ if ( isPlugin )
+ qWarning( "####### loading custom container widgets without page support not implemented!" );
+ // ### TODO loading for custom container widgets without pages
+#endif
+
+ int idx = 0;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "spacer" ) {
+ createSpacer( n, layout );
+ } else if ( n.tagName() == "widget" ) {
+ QMap< QString, QString> *oldDbControls = dbControls;
+ createWidgetInternal( n, w, layout, n.attribute( "class", "QWidget" ) );
+ dbControls = oldDbControls;
+ } else if ( n.tagName() == "hbox" ) {
+ QLayout *parentLayout = layout;
+ if ( layout && layout->inherits( "QGridLayout" ) )
+ layout = createLayout( 0, 0, QWidgetFactory::HBox, isQLayoutWidget );
+ else
+ layout = createLayout( w, layout, QWidgetFactory::HBox, isQLayoutWidget );
+ obj = layout;
+ n = n.firstChild().toElement();
+ if ( parentLayout && parentLayout->inherits( "QGridLayout" ) )
+ ( (QGridLayout*)parentLayout )->addMultiCellLayout( layout, row,
+ row + rowspan - 1, col, col + colspan - 1 );
+ continue;
+ } else if ( n.tagName() == "grid" ) {
+ QLayout *parentLayout = layout;
+ if ( layout && layout->inherits( "QGridLayout" ) )
+ layout = createLayout( 0, 0, QWidgetFactory::Grid, isQLayoutWidget );
+ else
+ layout = createLayout( w, layout, QWidgetFactory::Grid, isQLayoutWidget );
+ obj = layout;
+ n = n.firstChild().toElement();
+ if ( parentLayout && parentLayout->inherits( "QGridLayout" ) )
+ ( (QGridLayout*)parentLayout )->addMultiCellLayout( layout, row,
+ row + rowspan - 1, col, col + colspan - 1 );
+ continue;
+ } else if ( n.tagName() == "vbox" ) {
+ QLayout *parentLayout = layout;
+ if ( layout && layout->inherits( "QGridLayout" ) )
+ layout = createLayout( 0, 0, QWidgetFactory::VBox, isQLayoutWidget );
+ else
+ layout = createLayout( w, layout, QWidgetFactory::VBox, isQLayoutWidget );
+ obj = layout;
+ n = n.firstChild().toElement();
+ if ( parentLayout && parentLayout->inherits( "QGridLayout" ) )
+ ( (QGridLayout*)parentLayout )->addMultiCellLayout( layout, row,
+ row + rowspan - 1, col, col + colspan - 1 );
+ continue;
+ } else if ( n.tagName() == "property" && obj ) {
+ setProperty( obj, n.attribute( "name" ), n.firstChild().toElement() );
+ } else if ( n.tagName() == "attribute" && w ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( parent ) {
+ if ( parent->inherits( "QTabWidget" ) ) {
+ if ( attrib == "title" )
+ ( (QTabWidget*)parent )->insertTab( w, translate( v.toString() ) );
+ } else if ( parent->inherits( "QWidgetStack" ) ) {
+ if ( attrib == "id" )
+ ( (QWidgetStack*)parent )->addWidget( w, v.toInt() );
+ } else if ( parent->inherits( "QToolBox" ) ) {
+ if ( attrib == "label" )
+ ( (QToolBox*)parent )->addItem( w, v.toString() );
+ } else if ( parent->inherits( "QWizard" ) ) {
+ if ( attrib == "title" )
+ ( (QWizard*)parent )->addPage( w, translate( v.toString() ) );
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
+ } else if ( isPlugin ) {
+ if ( attrib == "label" ) {
+ WidgetInterface *iface = 0;
+ widgetInterfaceManager->queryInterface( parentClassName, &iface );
+ if ( iface ) {
+ QWidgetContainerInterfacePrivate *iface2 = 0;
+ iface->queryInterface( IID_QWidgetContainer,
+ (QUnknownInterface**)&iface2 );
+ if ( iface2 ) {
+ iface2->insertPage( parentClassName,
+ (QWidget*)parent, translate( v.toString() ), -1, w );
+ iface2->release();
+ }
+ iface->release();
+ }
+ }
+#endif
+ }
+ }
+ } else if ( n.tagName() == "item" ) {
+ createItem( n, w );
+ } else if ( n.tagName() == "column" || n.tagName() == "row" ) {
+ createColumn( n, w );
+ }
+
+ n = n.nextSibling().toElement();
+ idx++;
+ }
+
+ return w;
+}
+
+QLayout *QWidgetFactory::createLayout( QWidget *widget, QLayout* layout,
+ LayoutType type, bool isQLayoutWidget )
+{
+ int spacing = defSpacing;
+ int margin = defMargin;
+
+ if ( layout || !widget || isQLayoutWidget )
+ margin = 0;
+
+ if ( !layout && widget && widget->inherits( "QTabWidget" ) )
+ widget = ((QTabWidget*)widget)->currentPage();
+
+ if ( !layout && widget && widget->inherits( "QWizard" ) )
+ widget = ((QWizard*)widget)->currentPage();
+
+ if ( !layout && widget && widget->inherits( "QWidgetStack" ) )
+ widget = ((QWidgetStack*)widget)->visibleWidget();
+
+ if ( !layout && widget && widget->inherits( "QToolBox" ) )
+ widget = ((QToolBox*)widget)->currentItem();
+
+ QLayout *l = 0;
+ int align = 0;
+ if ( !layout && widget && widget->inherits( "QGroupBox" ) ) {
+ QGroupBox *gb = (QGroupBox*)widget;
+ gb->setColumnLayout( 0, Qt::Vertical );
+ layout = gb->layout();
+ layout->setMargin( 0 );
+ layout->setSpacing( 0 );
+ align = Qt::AlignTop;
+ }
+ if ( layout ) {
+ switch ( type ) {
+ case HBox:
+ l = new QHBoxLayout( layout );
+ break;
+ case VBox:
+ l = new QVBoxLayout( layout );
+ break;
+ case Grid:
+ l = new QGridLayout( layout );
+ break;
+ default:
+ return 0;
+ }
+ } else {
+ switch ( type ) {
+ case HBox:
+ l = new QHBoxLayout( widget );
+ break;
+ case VBox:
+ l = new QVBoxLayout( widget );
+ break;
+ case Grid:
+ l = new QGridLayout( widget );
+ break;
+ default:
+ return 0;
+ }
+ }
+ l->setAlignment( align );
+ l->setMargin( margin );
+ l->setSpacing( spacing );
+ return l;
+}
+
+QWidgetFactory::LayoutType QWidgetFactory::layoutType( QLayout *layout ) const
+{
+ if ( layout->inherits( "QHBoxLayout" ) )
+ return HBox;
+ else if ( layout->inherits( "QVBoxLayout" ) )
+ return VBox;
+ else if ( layout->inherits( "QGridLayout" ) )
+ return Grid;
+ return NoLayout;
+}
+
+void QWidgetFactory::setProperty( QObject* obj, const QString &prop,
+ QVariant value )
+{
+ int offset = obj->metaObject()->findProperty( prop, TRUE );
+
+ if ( offset != -1 ) {
+ if ( prop == "geometry" && obj == toplevel ) {
+ toplevel->resize( value.toRect().size() );
+ } else if ( prop == "accel" ) {
+ obj->setProperty( prop, value.toKeySequence() );
+ } else {
+ if ( value.type() == QVariant::String ||
+ value.type() == QVariant::CString ) {
+ const QMetaProperty *metaProp =
+ obj->metaObject()->property( offset, TRUE );
+ if ( metaProp != 0 && metaProp->isEnumType() ) {
+ if ( metaProp->isSetType() ) {
+ QStrList flagsCStr;
+ QStringList flagsStr =
+ QStringList::split( '|', value.asString() );
+ QStringList::ConstIterator f = flagsStr.begin();
+ while ( f != flagsStr.end() ) {
+ flagsCStr.append( *f );
+ ++f;
+ }
+ value = QVariant( metaProp->keysToValue(flagsCStr) );
+ } else {
+ QCString key = value.toCString();
+ value = QVariant( metaProp->keyToValue(key) );
+ }
+ }
+ }
+ obj->setProperty( prop, value );
+ }
+ } else {
+ if ( obj->isWidgetType() ) {
+ if ( prop == "toolTip" ) {
+ if ( !value.toString().isEmpty() )
+ QToolTip::add( (QWidget*)obj, translate( value.toString() ) );
+ } else if ( prop == "whatsThis" ) {
+ if ( !value.toString().isEmpty() )
+ QWhatsThis::add( (QWidget*)obj, translate( value.toString() ) );
+ } else if ( prop == "buddy" ) {
+ buddies.insert( obj->name(), value.toCString() );
+ } else if ( prop == "buttonGroupId" ) {
+ if ( obj->inherits( "QButton" ) && obj->parent()->inherits( "QButtonGroup" ) )
+ ( (QButtonGroup*)obj->parent() )->insert( (QButton*)obj, value.toInt() );
+#ifndef QT_NO_SQL
+ } else if ( prop == "database" && !obj->inherits( "QDataView" )
+ && !obj->inherits( "QDataBrowser" ) ) {
+ const QStringList& lst = value.asStringList();
+ if ( lst.count() > 2 ) {
+ if ( dbControls )
+ dbControls->insert( obj->name(), lst[ 2 ] );
+ } else if ( lst.count() == 2 ) {
+ dbTables.insert( obj->name(), lst );
+ }
+ } else if ( prop == "database" ) {
+ const QStringList& lst = value.asStringList();
+ if ( lst.count() == 2 && obj->inherits( "QWidget" ) ) {
+ SqlWidgetConnection conn( lst[ 0 ], lst[ 1 ] );
+ sqlWidgetConnections.insert( (QWidget*)obj, conn );
+ dbControls = conn.dbControls;
+ }
+#endif
+ } else if ( prop == "frameworkCode" ) {
+ if ( value.isValid() && !value.toBool() )
+ noDatabaseWidgets << obj->name();
+ }
+ }
+ }
+}
+
+void QWidgetFactory::setProperty( QObject* widget, const QString &prop, const QDomElement &e )
+{
+ QString comment;
+ QVariant value( DomTool::elementToVariant( e, QVariant(), comment ) );
+
+ if ( e.tagName() == "string" ) {
+ value = translate( value.asString(), comment );
+ } else if ( e.tagName() == "pixmap" ) {
+ QPixmap pix = loadPixmap( value.toString() );
+ if ( !pix.isNull() )
+ value = pix;
+ } else if ( e.tagName() == "iconset" ) {
+ QPixmap pix = loadPixmap( value.toString() );
+ if ( !pix.isNull() )
+ value = QIconSet( pix );
+ } else if ( e.tagName() == "image" ) {
+ value = loadFromCollection( value.toString() );
+ } else if ( e.tagName() == "palette" ) {
+ QDomElement n = e.firstChild().toElement();
+ QPalette p;
+ while ( !n.isNull() ) {
+ QColorGroup cg;
+ if ( n.tagName() == "active" ) {
+ cg = loadColorGroup( n );
+ p.setActive( cg );
+ } else if ( n.tagName() == "inactive" ) {
+ cg = loadColorGroup( n );
+ p.setInactive( cg );
+ } else if ( n.tagName() == "disabled" ) {
+ cg = loadColorGroup( n );
+ p.setDisabled( cg );
+ }
+ n = n.nextSibling().toElement();
+ }
+ value = p;
+ }
+ setProperty( widget, prop, value );
+}
+
+void QWidgetFactory::createSpacer( const QDomElement &e, QLayout *layout )
+{
+ QDomElement n = e.firstChild().toElement();
+ int row = e.attribute( "row" ).toInt();
+ int col = e.attribute( "column" ).toInt();
+ int rowspan = e.attribute( "rowspan" ).toInt();
+ int colspan = e.attribute( "colspan" ).toInt();
+
+ Qt::Orientation orient = Qt::Horizontal;
+ int w = 0, h = 0;
+ QSizePolicy::SizeType sizeType = QSizePolicy::Preferred;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString prop = n.attribute( "name" );
+ if ( prop == "orientation" ) {
+ if ( n.firstChild().firstChild().toText().data() == "Horizontal" )
+ orient = Qt::Horizontal;
+ else
+ orient = Qt::Vertical;
+ } else if ( prop == "sizeType" ) {
+ sizeType = stringToSizeType( n.firstChild().firstChild().toText().data() );
+ } else if ( prop == "sizeHint" ) {
+ w = n.firstChild().firstChild().firstChild().toText().data().toInt();
+ h = n.firstChild().firstChild().nextSibling().firstChild().toText().data().toInt();
+ }
+ }
+ n = n.nextSibling().toElement();
+ }
+
+ if ( rowspan < 1 )
+ rowspan = 1;
+ if ( colspan < 1 )
+ colspan = 1;
+ QSpacerItem *item = new QSpacerItem( w, h, orient == Qt::Horizontal ? sizeType : QSizePolicy::Minimum,
+ orient == Qt::Vertical ? sizeType : QSizePolicy::Minimum );
+ if ( layout ) {
+ if ( layout->inherits( "QBoxLayout" ) )
+ ( (QBoxLayout*)layout )->addItem( item );
+ else
+ ( (QGridLayout*)layout )->addMultiCell( item, row, row + rowspan - 1, col, col + colspan - 1,
+ orient == Qt::Horizontal ? Qt::AlignVCenter : Qt::AlignHCenter );
+ }
+}
+
+static QImage loadImageData( QDomElement &n2 )
+{
+ QString format = n2.attribute( "format", "PNG" );
+ QString hex = n2.firstChild().toText().data();
+ int n = hex.length() / 2;
+ QByteArray data( n );
+ for ( int i = 0; i < n; i++ )
+ data[i] = (char) hex.mid( 2 * i, 2 ).toUInt( 0, 16 );
+ return loadImageData( format, n2.attribute("length").toULong(), data );
+}
+
+void QWidgetFactory::loadImageCollection( const QDomElement &e )
+{
+ QDomElement n = e.firstChild().toElement();
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "image" ) {
+ Image img;
+ img.name = n.attribute( "name" );
+ QDomElement n2 = n.firstChild().toElement();
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "data" )
+ img.img = loadImageData( n2 );
+ n2 = n2.nextSibling().toElement();
+ }
+ images.append( img );
+ n = n.nextSibling().toElement();
+ }
+ }
+}
+
+QImage QWidgetFactory::loadFromCollection( const QString &name )
+{
+ QValueList<Image>::Iterator it = images.begin();
+ for ( ; it != images.end(); ++it ) {
+ if ( ( *it ).name == name )
+ return ( *it ).img;
+ }
+ return QImage();
+}
+
+QPixmap QWidgetFactory::loadPixmap( const QString& name )
+{
+ QPixmap pix;
+ if ( usePixmapCollection ) {
+ const QMimeSource *m = QMimeSourceFactory::defaultFactory()->data( name );
+ if ( m )
+ QImageDrag::decode( m, pix );
+ } else {
+ pix.convertFromImage( loadFromCollection(name) );
+ }
+ return pix;
+}
+
+QPixmap QWidgetFactory::loadPixmap( const QDomElement &e )
+{
+ return loadPixmap( e.firstChild().toText().data() );
+}
+
+QColorGroup QWidgetFactory::loadColorGroup( const QDomElement &e )
+{
+ QColorGroup cg;
+ int r = -1;
+ QDomElement n = e.firstChild().toElement();
+ QColor col;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "color" ) {
+ r++;
+ cg.setColor( (QColorGroup::ColorRole)r, (col = DomTool::readColor( n ) ) );
+ } else if ( n.tagName() == "pixmap" ) {
+ QPixmap pix = loadPixmap( n );
+ cg.setBrush( (QColorGroup::ColorRole)r, QBrush( col, pix ) );
+ }
+ n = n.nextSibling().toElement();
+ }
+ return cg;
+}
+
+struct Connection
+{
+ QObject *sender, *receiver;
+ QCString signal, slot;
+ bool operator==( const Connection &c ) const {
+ return sender == c.sender && receiver == c.receiver &&
+ signal == c.signal && slot == c.slot ;
+ }
+
+ Connection() : sender( 0 ), receiver( 0 ) { }
+};
+
+class NormalizeObject : public QObject
+{
+public:
+ NormalizeObject() : QObject() {}
+ static QCString normalizeSignalSlot( const char *signalSlot ) { return QObject::normalizeSignalSlot( signalSlot ); }
+};
+
+void QWidgetFactory::loadConnections( const QDomElement &e, QObject *connector )
+{
+ QDomElement n = e.firstChild().toElement();
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "connection" ) {
+ QString lang = n.attribute( "language", "C++" );
+ QDomElement n2 = n.firstChild().toElement();
+ Connection conn;
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "sender" ) {
+ QString name = n2.firstChild().toText().data();
+ if ( name == "this" || qstrcmp( toplevel->name(), name ) == 0 ) {
+ conn.sender = toplevel;
+ } else {
+ if ( name == "this" )
+ name = toplevel->name();
+ QObjectList *l = toplevel->queryList( 0, name, FALSE );
+ if ( l ) {
+ if ( l->first() )
+ conn.sender = l->first();
+ delete l;
+ }
+ }
+ if ( !conn.sender )
+ conn.sender = findAction( name );
+ } else if ( n2.tagName() == "signal" ) {
+ conn.signal = n2.firstChild().toText().data();
+ } else if ( n2.tagName() == "receiver" ) {
+ QString name = n2.firstChild().toText().data();
+ if ( name == "this" || qstrcmp( toplevel->name(), name ) == 0 ) {
+ conn.receiver = toplevel;
+ } else {
+ QObjectList *l = toplevel->queryList( 0, name, FALSE );
+ if ( l ) {
+ if ( l->first() )
+ conn.receiver = l->first();
+ delete l;
+ }
+ }
+ } else if ( n2.tagName() == "slot" ) {
+ conn.slot = n2.firstChild().toText().data();
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+
+ conn.signal = NormalizeObject::normalizeSignalSlot( conn.signal );
+ conn.slot = NormalizeObject::normalizeSignalSlot( conn.slot );
+
+ if ( !conn.sender || !conn.receiver ) {
+ n = n.nextSibling().toElement();
+ continue;
+ }
+
+ QObject *sender = 0, *receiver = 0;
+ QObjectList *l = toplevel->queryList( 0, conn.sender->name(), FALSE );
+ if ( qstrcmp( conn.sender->name(), toplevel->name() ) == 0 ) {
+ sender = toplevel;
+ } else {
+ if ( !l || !l->first() ) {
+ delete l;
+ n = n.nextSibling().toElement();
+ continue;
+ }
+ sender = l->first();
+ delete l;
+ }
+ if ( !sender )
+ sender = findAction( conn.sender->name() );
+
+ if ( qstrcmp( conn.receiver->name(), toplevel->name() ) == 0 ) {
+ receiver = toplevel;
+ } else {
+ l = toplevel->queryList( 0, conn.receiver->name(), FALSE );
+ if ( !l || !l->first() ) {
+ delete l;
+ n = n.nextSibling().toElement();
+ continue;
+ }
+ receiver = l->first();
+ delete l;
+ }
+
+ QString s = "2""%1";
+ s = s.arg( conn.signal );
+ QString s2 = "1""%1";
+ s2 = s2.arg( conn.slot );
+
+ QStrList signalList = sender->metaObject()->signalNames( TRUE );
+ QStrList slotList = receiver->metaObject()->slotNames( TRUE );
+
+ // if this is a connection to a custom slot and we have a connector, try this as receiver
+ if ( slotList.find( conn.slot ) == -1 && receiver == toplevel && connector ) {
+ slotList = connector->metaObject()->slotNames( TRUE );
+ receiver = connector;
+ }
+
+ // avoid warnings
+ if ( signalList.find( conn.signal ) == -1 ||
+ slotList.find( conn.slot ) == -1 ) {
+ n = n.nextSibling().toElement();
+ continue;
+ }
+ QObject::connect( sender, s, receiver, s2 );
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void QWidgetFactory::loadTabOrder( const QDomElement &e )
+{
+ QWidget *last = 0;
+ QDomElement n = e.firstChild().toElement();
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "tabstop" ) {
+ QString name = n.firstChild().toText().data();
+ QObjectList *l = toplevel->queryList( 0, name, FALSE );
+ if ( l ) {
+ if ( l->first() ) {
+ QWidget *w = (QWidget*)l->first();
+ if ( last )
+ toplevel->setTabOrder( last, w );
+ last = w;
+ }
+ delete l;
+ }
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void QWidgetFactory::createListViewColumn( QListView *lv, const QString& txt,
+ const QPixmap& pix, bool clickable,
+ bool resizable )
+{
+ if ( pix.isNull() ) {
+ lv->addColumn( txt );
+ } else {
+ lv->addColumn( pix, txt );
+ }
+
+ int i = lv->header()->count() - 1;
+ if ( !pix.isNull() )
+ lv->header()->setLabel( i, pix, txt );
+ if ( !clickable )
+ lv->header()->setClickEnabled( clickable, i );
+ if ( !resizable )
+ lv->header()->setResizeEnabled( resizable, i );
+}
+
+#ifndef QT_NO_TABLE
+void QWidgetFactory::createTableColumnOrRow( QTable *table, const QString& txt,
+ const QPixmap& pix,
+ const QString& field, bool isRow )
+{
+#ifndef QT_NO_SQL
+ bool isSql = table->inherits( "QDataTable" );
+#endif
+ if ( isRow )
+ table->setNumRows( table->numRows() + 1 );
+ else {
+#ifndef QT_NO_SQL
+ if ( !isSql )
+#endif
+ table->setNumCols( table->numCols() + 1 );
+ }
+
+ QValueList<Field> fieldMap;
+ if ( fieldMaps.find( table ) != fieldMaps.end() ) {
+ fieldMap = *fieldMaps.find( table );
+ fieldMaps.remove( table );
+ }
+
+ int i = isRow ? table->numRows() - 1 : table->numCols() - 1;
+ QHeader *h = !isRow ? table->horizontalHeader() : table->verticalHeader();
+ if ( !pix.isNull() ) {
+#ifndef QT_NO_SQL
+ if ( isSql )
+ ((QDataTable*)table)->addColumn( field, txt, -1, pix );
+ else
+#endif
+ h->setLabel( i, pix, txt );
+ } else {
+#ifndef QT_NO_SQL
+ if ( isSql )
+ ((QDataTable*)table)->addColumn( field, txt );
+ else
+#endif
+ h->setLabel( i, txt );
+ }
+ if ( !isRow && !field.isEmpty() ) {
+ fieldMap.append( Field( txt, pix, field ) );
+ fieldMaps.insert( table, fieldMap );
+ }
+
+}
+#endif
+
+void QWidgetFactory::createColumn( const QDomElement &e, QWidget *widget )
+{
+ if ( widget->inherits( "QListView" ) && e.tagName() == "column" ) {
+ QListView *lv = (QListView*)widget;
+ QDomElement n = e.firstChild().toElement();
+ QPixmap pix;
+ QString txt;
+ bool clickable = TRUE, resizable = TRUE;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" )
+ txt = translate( v.toString() );
+ else if ( attrib == "pixmap" )
+ pix = loadPixmap( n.firstChild().toElement().toElement() );
+ else if ( attrib == "clickable" )
+ clickable = v.toBool();
+ else if ( attrib == "resizable" || attrib == "resizeable" )
+ resizable = v.toBool();
+ }
+ n = n.nextSibling().toElement();
+ }
+ createListViewColumn( lv, txt, pix, clickable, resizable );
+ }
+#ifndef QT_NO_TABLE
+ else if ( widget->inherits( "QTable" ) ) {
+ QTable *table = (QTable*)widget;
+
+ QDomElement n = e.firstChild().toElement();
+ QPixmap pix;
+ QString txt;
+ QString field;
+
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" )
+ txt = translate( v.toString() );
+ else if ( attrib == "pixmap" ) {
+ if ( !n.firstChild().firstChild().toText().data().isEmpty() )
+ pix = loadPixmap( n.firstChild().toElement().toElement() );
+ } else if ( attrib == "field" )
+ field = translate( v.toString() );
+ }
+ n = n.nextSibling().toElement();
+ }
+ createTableColumnOrRow( table, txt, pix, field, e.tagName() == "row" );
+ }
+#endif
+}
+
+void QWidgetFactory::loadItem( const QDomElement &e, QPixmap &pix, QString &txt, bool &hasPixmap )
+{
+ QDomElement n = e;
+ hasPixmap = FALSE;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" )
+ txt = translate( v.toString() );
+ else if ( attrib == "pixmap" ) {
+ pix = loadPixmap( n.firstChild().toElement() );
+ hasPixmap = !pix.isNull();
+ }
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void QWidgetFactory::createItem( const QDomElement &e, QWidget *widget, QListViewItem *i )
+{
+ if ( widget->inherits( "QListBox" ) || widget->inherits( "QComboBox" ) ) {
+ QDomElement n = e.firstChild().toElement();
+ QPixmap pix;
+ bool hasPixmap = FALSE;
+ QString txt;
+ loadItem( n, pix, txt, hasPixmap );
+ QListBox *lb = 0;
+ if ( widget->inherits( "QListBox" ) ) {
+ lb = (QListBox*)widget;
+ } else {
+ QComboBox *cb = (QComboBox*)widget;
+ lb = cb->listBox();
+ if (!lb) {
+ lb = new QListBox(cb);
+ cb->setListBox(lb);
+ }
+ }
+ if ( hasPixmap ) {
+ new QListBoxPixmap( lb, pix, txt );
+ } else {
+ new QListBoxText( lb, txt );
+ }
+#ifndef QT_NO_ICONVIEW
+ } else if ( widget->inherits( "QIconView" ) ) {
+ QDomElement n = e.firstChild().toElement();
+ QPixmap pix;
+ bool hasPixmap = FALSE;
+ QString txt;
+ loadItem( n, pix, txt, hasPixmap );
+
+ QIconView *iv = (QIconView*)widget;
+ new QIconViewItem( iv, txt, pix );
+#endif
+ } else if ( widget->inherits( "QListView" ) ) {
+ QDomElement n = e.firstChild().toElement();
+ QPixmap pix;
+ QValueList<QPixmap> pixmaps;
+ QStringList textes;
+ QListViewItem *item = 0;
+ QListView *lv = (QListView*)widget;
+ if ( i )
+ item = new QListViewItem( i, d->lastItem );
+ else
+ item = new QListViewItem( lv, d->lastItem );
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "property" ) {
+ QString attrib = n.attribute( "name" );
+ QVariant v = DomTool::elementToVariant( n.firstChild().toElement(), QVariant() );
+ if ( attrib == "text" )
+ textes << translate( v.toString() );
+ else if ( attrib == "pixmap" ) {
+ QString s = v.toString();
+ if ( s.isEmpty() ) {
+ pixmaps << QPixmap();
+ } else {
+ pix = loadPixmap( n.firstChild().toElement() );
+ pixmaps << pix;
+ }
+ }
+ } else if ( n.tagName() == "item" ) {
+ item->setOpen( TRUE );
+ createItem( n, widget, item );
+ }
+
+ n = n.nextSibling().toElement();
+ }
+
+ for ( int i = 0; i < lv->columns(); ++i ) {
+ item->setText( i, textes[ i ] );
+ item->setPixmap( i, pixmaps[ i ] );
+ }
+ d->lastItem = item;
+ }
+}
+
+
+
+void QWidgetFactory::loadChildAction( QObject *parent, const QDomElement &e )
+{
+ QDomElement n = e;
+ QAction *a = 0;
+ bool hasMenuText = FALSE;
+ if ( n.tagName() == "action" ) {
+ a = new QAction( parent );
+ QDomElement n2 = n.firstChild().toElement();
+
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "property" ) {
+ QString prop(n2.attribute("name"));
+ if (prop == "menuText")
+ hasMenuText = TRUE;
+ setProperty( a, prop, n2.firstChild().toElement() );
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ if ( !parent->inherits( "QAction" ) )
+ actionList.append( a );
+ } else if ( n.tagName() == "actiongroup" ) {
+ a = new QActionGroup( parent );
+ QDomElement n2 = n.firstChild().toElement();
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "property" ) {
+ QString prop(n2.attribute("name"));
+ if (prop == "menuText")
+ hasMenuText = TRUE;
+ setProperty( a, prop, n2.firstChild().toElement() );
+ } else if ( n2.tagName() == "action" ||
+ n2.tagName() == "actiongroup" ) {
+ loadChildAction( a, n2 );
+
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ if ( !parent->inherits( "QAction" ) )
+ actionList.append( a );
+ }
+
+ if (a && !hasMenuText && !a->text().isEmpty() && uiFileVersion < "3.3")
+ a->setMenuText(a->text());
+}
+
+void QWidgetFactory::loadActions( const QDomElement &e )
+{
+ QDomElement n = e.firstChild().toElement();
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "action" ) {
+ loadChildAction( toplevel, n );
+ } else if ( n.tagName() == "actiongroup" ) {
+ loadChildAction( toplevel, n );
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void QWidgetFactory::loadToolBars( const QDomElement &e )
+{
+ QDomElement n = e.firstChild().toElement();
+ QMainWindow *mw = ( (QMainWindow*)toplevel );
+ QToolBar *tb = 0;
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "toolbar" ) {
+ Qt::Dock dock = (Qt::Dock)n.attribute( "dock" ).toInt();
+ tb = new QToolBar( QString::null, mw, dock );
+ tb->setLabel( n.attribute( "label" ) );
+ tb->setName( n.attribute( "name" ) );
+ QDomElement n2 = n.firstChild().toElement();
+ while ( !n2.isNull() ) {
+ if ( n2.tagName() == "action" ) {
+ QAction *a = findAction( n2.attribute( "name" ) );
+ if ( a )
+ a->addTo( tb );
+ } else if ( n2.tagName() == "separator" ) {
+ tb->addSeparator();
+ } else if ( n2.tagName() == "widget" ) {
+ (void)createWidgetInternal( n2, tb, 0, n2.attribute( "class", "QWidget" ) );
+ } else if ( n2.tagName() == "property" ) {
+ setProperty( tb, n2.attribute( "name" ), n2.firstChild().toElement() );
+ }
+ n2 = n2.nextSibling().toElement();
+ }
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void QWidgetFactory::loadMenuBar( const QDomElement &e )
+{
+ QDomElement n = e.firstChild().toElement();
+ QMainWindow *mw = ( (QMainWindow*)toplevel );
+ QMenuBar *mb = mw->menuBar();
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "item" ) {
+ QPopupMenu *popup = new QPopupMenu( mw );
+ loadPopupMenu( popup, n );
+ popup->setName( n.attribute( "name" ) );
+ mb->insertItem( translate( n.attribute( "text" ) ), popup );
+ } else if ( n.tagName() == "property" ) {
+ setProperty( mb, n.attribute( "name" ), n.firstChild().toElement() );
+ } else if ( n.tagName() == "separator" ) {
+ mb->insertSeparator();
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+void QWidgetFactory::loadPopupMenu( QPopupMenu *p, const QDomElement &e )
+{
+ QMainWindow *mw = ( (QMainWindow*)toplevel );
+ QDomElement n = e.firstChild().toElement();
+ while ( !n.isNull() ) {
+ if ( n.tagName() == "action" || n.tagName() == "actiongroup" ) {
+ QAction *a = findAction( n.attribute( "name" ) );
+ QDomElement n2 = n.nextSibling().toElement();
+ if ( n2.tagName() == "item") { // load submenu
+ QPopupMenu *popup = new QPopupMenu( mw );
+ popup->setName( n2.attribute( "name" ) );
+ if ( a ) {
+ p->setAccel( a->accel(), p->insertItem( a->iconSet(),
+ translate( n2.attribute( "text" ).utf8().data() ),
+ popup ) );
+ } else {
+ p->insertItem( translate( n2.attribute( "text" ).utf8().data() ), popup );
+ }
+ loadPopupMenu( popup, n2 );
+ n = n2;
+ } else {
+ if ( a ) {
+ a->addTo( p );
+ }
+ }
+ a = 0;
+ } else if ( n.tagName() == "separator" ) {
+ p->insertSeparator();
+ }
+ n = n.nextSibling().toElement();
+ }
+}
+
+// compatibility with early 3.0 betas
+// ### remove for 4.0
+void QWidgetFactory::loadFunctions( const QDomElement & )
+{
+}
+
+QAction *QWidgetFactory::findAction( const QString &name )
+{
+ for ( QAction *a = actionList.first(); a; a = actionList.next() ) {
+ if ( QString( a->name() ) == name )
+ return a;
+ QAction *ac = (QAction*)a->child( name.latin1(), "QAction" );
+ if ( ac )
+ return ac;
+ }
+ return 0;
+}
+
+/*!
+ If you use a pixmap collection (which is the default for new
+ projects) rather than saving the pixmaps within the .ui XML file,
+ you must load the pixmap collection. QWidgetFactory looks in the
+ default QMimeSourceFactory for the pixmaps. Either add it there
+ manually, or call this function and specify the directory where
+ the images can be found, as \a dir. This is normally the
+ directory called \c images in the project's directory.
+*/
+
+void QWidgetFactory::loadImages( const QString &dir )
+{
+ QDir d( dir );
+ QStringList l = d.entryList( QDir::Files );
+ for ( QStringList::Iterator it = l.begin(); it != l.end(); ++it )
+ QMimeSourceFactory::defaultFactory()->setPixmap( *it, QPixmap( d.path() + "/" + *it, "PNG" ) );
+
+}
+
+void QWidgetFactory::loadExtraSource()
+{
+ if ( !qwf_language || !languageInterfaceManager )
+ return;
+ QString lang = *qwf_language;
+ LanguageInterface *iface = 0;
+ languageInterfaceManager->queryInterface( lang, &iface );
+ if ( !iface )
+ return;
+ QFile f( qwf_currFileName + iface->formCodeExtension() );
+ if ( f.open( IO_ReadOnly ) ) {
+ QTextStream ts( &f );
+ code = ts.read();
+ }
+}
+
+QString QWidgetFactory::translate( const QString& sourceText, const QString& comment )
+{
+ return qApp->translate( d->translationContext, sourceText.utf8(), comment.utf8(),
+ QApplication::UnicodeUTF8 );
+}
+
+QString QWidgetFactory::translate( const char *sourceText, const char *comment )
+{
+ return qApp->translate( d->translationContext, sourceText, comment,
+ QApplication::UnicodeUTF8 );
+}
diff --git a/tools/designer/uilib/qwidgetfactory.h b/tools/designer/uilib/qwidgetfactory.h
new file mode 100644
index 0000000..daf5db6
--- /dev/null
+++ b/tools/designer/uilib/qwidgetfactory.h
@@ -0,0 +1,187 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef QWIDGETFACTORY_H
+#define QWIDGETFACTORY_H
+
+#ifndef QT_H
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qvaluelist.h>
+#include <qmap.h>
+#include <qaction.h>
+#endif // QT_H
+
+class QDomDocument;
+class QDomElement;
+class QLayout;
+class QListView;
+class QListViewItem;
+class QMenuBar;
+class QTable;
+class QWidget;
+class QWidgetFactoryPrivate;
+class UibStrTable;
+
+class QWidgetFactory
+{
+public:
+ QWidgetFactory();
+ virtual ~QWidgetFactory();
+
+ static QWidget *create( const QString &uiFile, QObject *connector = 0, QWidget *parent = 0, const char *name = 0 );
+ static QWidget *create( QIODevice *dev, QObject *connector = 0, QWidget *parent = 0, const char *name = 0 );
+ static void addWidgetFactory( QWidgetFactory *factory );
+ static void loadImages( const QString &dir );
+
+ virtual QWidget *createWidget( const QString &className, QWidget *parent, const char *name ) const;
+ static QStringList widgets();
+ static bool supportsWidget( const QString &widget );
+
+private:
+ enum LayoutType { HBox, VBox, Grid, NoLayout };
+ void loadImageCollection( const QDomElement &e );
+ void loadConnections( const QDomElement &e, QObject *connector );
+ void loadTabOrder( const QDomElement &e );
+ QWidget *createWidgetInternal( const QDomElement &e, QWidget *parent, QLayout* layout, const QString &classNameArg );
+ QLayout *createLayout( QWidget *widget, QLayout* layout, LayoutType type, bool isQLayoutWidget = FALSE );
+ LayoutType layoutType( QLayout *l ) const;
+ void setProperty( QObject* widget, const QString &prop, QVariant value );
+ void setProperty( QObject* widget, const QString &prop, const QDomElement &e );
+ void createSpacer( const QDomElement &e, QLayout *layout );
+ QImage loadFromCollection( const QString &name );
+ QPixmap loadPixmap( const QString &name );
+ QPixmap loadPixmap( const QDomElement &e );
+ QColorGroup loadColorGroup( const QDomElement &e );
+ void createListViewColumn( QListView *lv, const QString& txt,
+ const QPixmap& pix, bool clickable,
+ bool resizable );
+#ifndef QT_NO_TABLE
+ void createTableColumnOrRow( QTable *table, const QString& txt,
+ const QPixmap& pix, const QString& field,
+ bool isRow );
+#endif
+ void createColumn( const QDomElement &e, QWidget *widget );
+ void loadItem( const QDomElement &e, QPixmap &pix, QString &txt, bool &hasPixmap );
+ void createItem( const QDomElement &e, QWidget *widget, QListViewItem *i = 0 );
+ void loadChildAction( QObject *parent, const QDomElement &e );
+ void loadActions( const QDomElement &e );
+ void loadToolBars( const QDomElement &e );
+ void loadMenuBar( const QDomElement &e );
+ void loadPopupMenu( QPopupMenu *p, const QDomElement &e );
+ void loadFunctions( const QDomElement &e );
+ QAction *findAction( const QString &name );
+ void loadExtraSource();
+ QString translate( const char *sourceText, const char *comment = "" );
+ QString translate( const QString& sourceText, const QString& comment = QString::null );
+
+ void unpackUInt16( QDataStream& in, Q_UINT16& n );
+ void unpackUInt32( QDataStream& in, Q_UINT32& n );
+ void unpackByteArray( QDataStream& in, QByteArray& array );
+ void unpackCString( const UibStrTable& strings, QDataStream& in,
+ QCString& cstr );
+ void unpackString( const UibStrTable& strings, QDataStream& in,
+ QString& str );
+ void unpackStringSplit( const UibStrTable& strings, QDataStream& in,
+ QString& str );
+ void unpackVariant( const UibStrTable& strings, QDataStream& in,
+ QVariant& value );
+ void inputSpacer( const UibStrTable& strings, QDataStream& in,
+ QLayout *parent );
+ void inputColumnOrRow( const UibStrTable& strings, QDataStream& in,
+ QObject *parent, bool isRow );
+ void inputItem( const UibStrTable& strings, QDataStream& in,
+ QObject *parent, QListViewItem *parentItem = 0 );
+ void inputMenuItem( QObject **objects, const UibStrTable& strings,
+ QDataStream& in, QMenuBar *menuBar );
+ QObject *inputObject( QObject **objects, int& numObjects,
+ const UibStrTable& strings, QDataStream& in,
+ QWidget *ancestorWidget, QObject *parent,
+ QCString className = "" );
+ QWidget *createFromUiFile( QDomDocument doc, QObject *connector,
+ QWidget *parent, const char *name );
+ QWidget *createFromUibFile( QDataStream& in, QObject *connector,
+ QWidget *parent, const char *name );
+
+private:
+ struct Image {
+ QImage img;
+ QString name;
+ bool operator==( const Image &i ) const {
+ return ( i.name == name &&
+ i.img == img );
+ }
+ };
+
+ struct Field
+ {
+ Field() {}
+ Field( const QString &s1, const QPixmap &p, const QString &s2 ) : name( s1 ), pix( p ), field( s2 ) {}
+ QString name;
+ QPixmap pix;
+ QString field;
+ Q_DUMMY_COMPARISON_OPERATOR( Field )
+ };
+
+ struct SqlWidgetConnection
+ {
+ SqlWidgetConnection() {}
+ SqlWidgetConnection( const QString &c, const QString &t )
+ : conn( c ), table( t ), dbControls( new QMap<QString, QString>() ) {}
+ QString conn;
+ QString table;
+ QMap<QString, QString> *dbControls;
+ Q_DUMMY_COMPARISON_OPERATOR( SqlWidgetConnection )
+ };
+
+ QValueList<Image> images;
+ QWidget *toplevel;
+ QWidgetFactoryPrivate *d;
+ QMap<QString, QString> *dbControls;
+ QMap<QString, QStringList> dbTables;
+ QMap<QWidget*, SqlWidgetConnection> sqlWidgetConnections;
+ QMap<QString, QString> buddies;
+ QMap<QTable*, QValueList<Field> > fieldMaps;
+ QPtrList<QAction> actionList;
+ QMap<QString, QString> languageSlots;
+ QStringList noDatabaseWidgets;
+ bool usePixmapCollection;
+ int defMargin;
+ int defSpacing;
+ QString code;
+ QString uiFileVersion;
+};
+
+#endif
diff --git a/tools/designer/uilib/test/main.cpp b/tools/designer/uilib/test/main.cpp
new file mode 100644
index 0000000..f5f0559
--- /dev/null
+++ b/tools/designer/uilib/test/main.cpp
@@ -0,0 +1,50 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt GUI Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <qapplication.h>
+#include "../qwidgetfactory.h"
+
+int main( int argc, char ** argv )
+{
+ QApplication a( argc, argv );
+ if ( argc == 1 )
+ return 0;
+ if ( argc == 3 )
+ QWidgetFactory::loadImages( argv[ 2 ] );
+ QWidget *w = QWidgetFactory::create( argv[ 1 ] );
+ if ( !w )
+ return 0;
+ w->show();
+ a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
+ return a.exec();
+}
diff --git a/tools/designer/uilib/test/test.pro b/tools/designer/uilib/test/test.pro
new file mode 100644
index 0000000..b2459c0
--- /dev/null
+++ b/tools/designer/uilib/test/test.pro
@@ -0,0 +1,7 @@
+TEMPLATE = app
+CONFIG += qt warn_on release
+HEADERS =
+SOURCES = main.cpp
+TARGET = test
+LIBS += -L$$QT_BUILD_TREE/lib -lqui
+
diff --git a/tools/designer/uilib/uilib.pro b/tools/designer/uilib/uilib.pro
new file mode 100644
index 0000000..bf98d7b
--- /dev/null
+++ b/tools/designer/uilib/uilib.pro
@@ -0,0 +1,30 @@
+TEMPLATE = lib
+CONFIG += qt warn_on release
+win32:CONFIG += static
+win32:CONFIG -= dll
+SOURCES = qwidgetfactory.cpp \
+ ../shared/domtool.cpp \
+ ../shared/uib.cpp
+
+HEADERS = ../shared/domtool.h \
+ ../shared/uib.h
+
+sql:SOURCES += ../designer/database.cpp
+sql:HEADERS += ../designer/database2.h
+
+DEFINES += QT_INTERNAL_XML
+!win32-borland:DEFINES += Q_TEMPLATE_EXTERN=extern
+include( ../../../src/qt_professional.pri )
+TARGET = qui
+INCLUDEPATH += ../shared
+DESTDIR = ../../../lib
+VERSION = 1.0.0
+DEFINES += RESOURCE
+
+unix {
+ target.path=$$libs.path
+
+ INSTALLS += target
+}
+
+mac:QMAKE_LFLAGS_PREBIND = -prebind -seg1addr 0xB9000000