From 4c5a91c3caa71eded803d2907b006c21b1fb7864 Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Sun, 7 Mar 2010 00:06:49 +0000 Subject: [PATCH] 2010-03-06 15:32 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) + contrib/hbide/resources/fl_c.png + contrib/hbide/resources/fl_dll.png + contrib/hbide/resources/fl_exe.png + contrib/hbide/resources/fl_ini.png + contrib/hbide/resources/fl_lib.png + contrib/hbide/resources/fl_prg.png + contrib/hbide/resources/fl_res.png + contrib/hbide/resources/fl_txt.png * contrib/hbide/resources/hb-16x16.png * contrib/hbide/resources/hb-32x32.png * contrib/hbide/resources/hbide.png + contrib/hbide/resources/hbidesplashwatermark.png + contrib/hbide/resources/panel_2.png + contrib/hbide/resources/panel_3.png + contrib/hbide/resources/panel_4.png + contrib/hbide/resources/panel_5.png + contrib/hbide/resources/panel_6.png + contrib/hbide/resources/panel_7.png + contrib/hbide/resources/source_c.png + contrib/hbide/resources/source_cpp.png + contrib/hbide/resources/source_h.png + contrib/hbide/resources/source_o.png + contrib/hbide/resources/source_prg.png + contrib/hbide/resources/source_res.png + contrib/hbide/resources/source_txt.png + contrib/hbide/resources/source_unknown.png + Added more images for user interface. * contrib/hbide/resources/projectpropertiesex.ui * contrib/hbide/resources/projectpropertiesex.uic - Removed xMate ".xhp" project loading icon. * contrib/hbxbp/xbpwindow.prg ! Commented out "resize" event as it was hanging the applications without any graspable reason. Will be investigated deeply in future. * contrib/hbide/hbide.hbp * contrib/hbide/hbide.prg * contrib/hbide/ideactions.prg * contrib/hbide/idedocks.prg * contrib/hbide/ideeditor.prg * contrib/hbide/idehome.prg * contrib/hbide/idemisc.prg * contrib/hbide/ideobject.prg * contrib/hbide/ideprojmanager.prg * contrib/hbide/idesaveload.prg * contrib/hbide/idestylesheets.prg + contrib/hbide/idethemes.prg ! This commit corrects/fixes issues reported by Viktor. Please scratch them again. I might have missed a couple of them. + Implemented: A root panel called "Stats" containing, presently, "Welcome" and "FAQ's" tabs, detailed below. Now hbIDE has a mechanism to hold as many informative slots as the development will demand in future. : It holds the exiting "Projects" information: Title Type Sources Last_Modified Location The field is a link to open detailed view of its contents which contain fields: Source Type Size Last_Modified Location Clicking on a <Source> opens it in the editor under "Main" panel. <Home> icon is added in the top-toolbar next to <Exit> icon which leads you to <Stats> panel holding <Welcome> and <FAQs> tabs. Projects -> Detail -> Source : backward navigation is enabled through context menu withing browser. The options within thus context menu has <Print> option which leads to print preview dialog and eventually to printing on the paper. <FAQs>: This holds short questions and answers as per the industry standards. I could put only two of them still. Please forward the ones you consider should go to this list. ! Changed: main window icon as previous one was not giving a strong impression to be remember for long. ! Loading/Opening a project: now offers .hbp or .xhp options. .xhp is converted to .hbp and is written to disk and project is loaded as usual. This should be a one-time process. ! Click on function list now position the clicked function in the center of the editor. ! IdeSettings.ini is now hbide.set and is saved where hbide.ini is residing. The change is name was nessary as to avoid wrong impression of .ini nature as a text file. It is binary by nature. ! Many more artifacts which I tend to forget, please bear it with my age. --- harbour/ChangeLog | 99 ++++ harbour/contrib/hbide/hbide.hbp | 1 + harbour/contrib/hbide/hbide.prg | 83 +-- harbour/contrib/hbide/ideactions.prg | 22 +- harbour/contrib/hbide/idedocks.prg | 495 ++++++---------- harbour/contrib/hbide/ideeditor.prg | 31 +- harbour/contrib/hbide/idehome.prg | 528 ++++++++++++++++++ harbour/contrib/hbide/idemisc.prg | 288 +++++++++- harbour/contrib/hbide/ideobject.prg | 2 +- harbour/contrib/hbide/ideprojmanager.prg | 248 ++------ harbour/contrib/hbide/idesaveload.prg | 18 +- harbour/contrib/hbide/idestylesheets.prg | 28 +- harbour/contrib/hbide/idethemes.prg | 7 +- harbour/contrib/hbide/resources/fl_c.png | Bin 0 -> 197 bytes harbour/contrib/hbide/resources/fl_dll.png | Bin 0 -> 826 bytes harbour/contrib/hbide/resources/fl_exe.png | Bin 0 -> 811 bytes harbour/contrib/hbide/resources/fl_ini.png | Bin 0 -> 210 bytes harbour/contrib/hbide/resources/fl_lib.png | Bin 0 -> 176 bytes harbour/contrib/hbide/resources/fl_prg.png | Bin 0 -> 173 bytes harbour/contrib/hbide/resources/fl_res.png | Bin 0 -> 232 bytes harbour/contrib/hbide/resources/fl_txt.png | Bin 0 -> 176 bytes harbour/contrib/hbide/resources/hb-16x16.png | Bin 643 -> 731 bytes harbour/contrib/hbide/resources/hb-32x32.png | Bin 1716 -> 2102 bytes harbour/contrib/hbide/resources/hbide.png | Bin 282 -> 983 bytes .../hbide/resources/hbidesplashwatermark.png | Bin 0 -> 34772 bytes harbour/contrib/hbide/resources/panel_2.png | Bin 0 -> 306 bytes harbour/contrib/hbide/resources/panel_3.png | Bin 0 -> 288 bytes harbour/contrib/hbide/resources/panel_4.png | Bin 0 -> 275 bytes harbour/contrib/hbide/resources/panel_5.png | Bin 0 -> 314 bytes harbour/contrib/hbide/resources/panel_6.png | Bin 0 -> 301 bytes harbour/contrib/hbide/resources/panel_7.png | Bin 0 -> 281 bytes .../hbide/resources/projectpropertiesex.ui | 85 +-- .../hbide/resources/projectpropertiesex.uic | 84 +-- harbour/contrib/hbide/resources/source_c.png | Bin 0 -> 910 bytes .../contrib/hbide/resources/source_cpp.png | Bin 0 -> 964 bytes harbour/contrib/hbide/resources/source_h.png | Bin 0 -> 901 bytes harbour/contrib/hbide/resources/source_o.png | Bin 0 -> 935 bytes .../contrib/hbide/resources/source_prg.png | Bin 0 -> 886 bytes .../contrib/hbide/resources/source_res.png | Bin 0 -> 718 bytes .../contrib/hbide/resources/source_txt.png | Bin 0 -> 896 bytes .../hbide/resources/source_unknown.png | Bin 0 -> 616 bytes harbour/contrib/hbxbp/xbpwindow.prg | 13 +- 42 files changed, 1296 insertions(+), 736 deletions(-) create mode 100644 harbour/contrib/hbide/idehome.prg create mode 100644 harbour/contrib/hbide/resources/fl_c.png create mode 100644 harbour/contrib/hbide/resources/fl_dll.png create mode 100644 harbour/contrib/hbide/resources/fl_exe.png create mode 100644 harbour/contrib/hbide/resources/fl_ini.png create mode 100644 harbour/contrib/hbide/resources/fl_lib.png create mode 100644 harbour/contrib/hbide/resources/fl_prg.png create mode 100644 harbour/contrib/hbide/resources/fl_res.png create mode 100644 harbour/contrib/hbide/resources/fl_txt.png create mode 100644 harbour/contrib/hbide/resources/hbidesplashwatermark.png create mode 100644 harbour/contrib/hbide/resources/panel_2.png create mode 100644 harbour/contrib/hbide/resources/panel_3.png create mode 100644 harbour/contrib/hbide/resources/panel_4.png create mode 100644 harbour/contrib/hbide/resources/panel_5.png create mode 100644 harbour/contrib/hbide/resources/panel_6.png create mode 100644 harbour/contrib/hbide/resources/panel_7.png create mode 100644 harbour/contrib/hbide/resources/source_c.png create mode 100644 harbour/contrib/hbide/resources/source_cpp.png create mode 100644 harbour/contrib/hbide/resources/source_h.png create mode 100644 harbour/contrib/hbide/resources/source_o.png create mode 100644 harbour/contrib/hbide/resources/source_prg.png create mode 100644 harbour/contrib/hbide/resources/source_res.png create mode 100644 harbour/contrib/hbide/resources/source_txt.png create mode 100644 harbour/contrib/hbide/resources/source_unknown.png diff --git a/harbour/ChangeLog b/harbour/ChangeLog index ad9ef123a2..19ba1dba31 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,105 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-03-06 15:32 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) + + contrib/hbide/resources/fl_c.png + + contrib/hbide/resources/fl_dll.png + + contrib/hbide/resources/fl_exe.png + + contrib/hbide/resources/fl_ini.png + + contrib/hbide/resources/fl_lib.png + + contrib/hbide/resources/fl_prg.png + + contrib/hbide/resources/fl_res.png + + contrib/hbide/resources/fl_txt.png + * contrib/hbide/resources/hb-16x16.png + * contrib/hbide/resources/hb-32x32.png + * contrib/hbide/resources/hbide.png + + contrib/hbide/resources/hbidesplashwatermark.png + + contrib/hbide/resources/panel_2.png + + contrib/hbide/resources/panel_3.png + + contrib/hbide/resources/panel_4.png + + contrib/hbide/resources/panel_5.png + + contrib/hbide/resources/panel_6.png + + contrib/hbide/resources/panel_7.png + + contrib/hbide/resources/source_c.png + + contrib/hbide/resources/source_cpp.png + + contrib/hbide/resources/source_h.png + + contrib/hbide/resources/source_o.png + + contrib/hbide/resources/source_prg.png + + contrib/hbide/resources/source_res.png + + contrib/hbide/resources/source_txt.png + + contrib/hbide/resources/source_unknown.png + + Added more images for user interface. + + * contrib/hbide/resources/projectpropertiesex.ui + * contrib/hbide/resources/projectpropertiesex.uic + - Removed xMate ".xhp" project loading icon. + + * contrib/hbxbp/xbpwindow.prg + ! Commented out "resize" event as it was hanging the + applications without any graspable reason. Will be + investigated deeply in future. + + * contrib/hbide/hbide.hbp + * contrib/hbide/hbide.prg + * contrib/hbide/ideactions.prg + * contrib/hbide/idedocks.prg + * contrib/hbide/ideeditor.prg + * contrib/hbide/idehome.prg + * contrib/hbide/idemisc.prg + * contrib/hbide/ideobject.prg + * contrib/hbide/ideprojmanager.prg + * contrib/hbide/idesaveload.prg + * contrib/hbide/idestylesheets.prg + + contrib/hbide/idethemes.prg + + ! This commit corrects/fixes issues reported by Viktor. + Please scratch them again. I might have missed a couple + of them. + + + Implemented: A root panel called "Stats" containing, + presently, "Welcome" and "FAQ's" tabs, detailed below. + Now hbIDE has a mechanism to hold as many informative + slots as the development will demand in future. + + <Welcome>: It holds the exiting "Projects" information: + Title Type Sources Last_Modified Location + + The field <Title> is a link to open detailed view of its + contents which contain fields: + Source Type Size Last_Modified Location + + Clicking on a <Source> opens it in the editor under "Main" panel. + + <Home> icon is added in the top-toolbar next to <Exit> icon + which leads you to <Stats> panel holding <Welcome> and <FAQs> tabs. + + Projects -> Detail -> Source : backward navigation is enabled + through context menu withing browser. The options within thus + context menu has <Print> option which leads to print preview + dialog and eventually to printing on the paper. + + <FAQs>: This holds short questions and answers as per the + industry standards. I could put only two of them still. + Please forward the ones you consider should go to this list. + + ! Changed: main window icon as previous one was not giving a + strong impression to be remember for long. + + ! Loading/Opening a project: now offers .hbp or .xhp options. + .xhp is converted to .hbp and is written to disk and project + is loaded as usual. This should be a one-time process. + + ! Click on function list now position the clicked function + in the center of the editor. + + ! IdeSettings.ini is now hbide.set and is saved where hbide.ini + is residing. The change is name was nessary as to avoid + wrong impression of .ini nature as a text file. It is binary + by nature. + + ! Many more artifacts which I tend to forget, please bear it + with my age. + 2010-03-06 23:44 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/src/vm/evalhb.c * harbour/src/vm/asort.c diff --git a/harbour/contrib/hbide/hbide.hbp b/harbour/contrib/hbide/hbide.hbp index 6dea5bd5c0..8d7d783864 100644 --- a/harbour/contrib/hbide/hbide.hbp +++ b/harbour/contrib/hbide/hbide.hbp @@ -24,6 +24,7 @@ ideprojmanager.prg idesources.prg ideharbourhelp.prg ideenviron.prg +idehome.prg ideparseexpr.c diff --git a/harbour/contrib/hbide/hbide.prg b/harbour/contrib/hbide/hbide.prg index 1d5cef350c..bdcea1587a 100644 --- a/harbour/contrib/hbide/hbide.prg +++ b/harbour/contrib/hbide/hbide.prg @@ -140,6 +140,7 @@ CLASS HbIde DATA oSkeltnUI DATA oFindDock DATA oHL + DATA oHM DATA oUI @@ -154,7 +155,6 @@ CLASS HbIde DATA aProjData INIT {} DATA aPrpObjs INIT {} DATA aEditorPath INIT {} - DATA nCurView INIT 1 /* HBQT Objects */ DATA qLayout @@ -286,7 +286,6 @@ CLASS HbIde METHOD execProjectAction( cKey ) METHOD execSourceAction( cKey ) METHOD execEditorAction( cKey ) - METHOD execWindowsAction( cKey ) /* Methods to be evaluated as macros */ METHOD getWord( lSelect ) @@ -335,8 +334,7 @@ METHOD HbIde:showApplicationCursor( nCursor ) /*----------------------------------------------------------------------*/ METHOD HbIde:create( cProjIni ) - #if 1 - LOCAL qPixmap, qSplash, nStart + LOCAL qPixmap, qSplash qPixmap := QPixmap():new( hb_dirBase() + "resources" + hb_osPathSeparator() + "hbidesplash.png" ) qSplash := QSplashScreen():new() @@ -345,7 +343,6 @@ METHOD HbIde:create( cProjIni ) qSplash:show() ::showApplicationCursor( Qt_BusyCursor ) QApplication():processEvents() - #endif DEFAULT cProjIni TO ::cProjIni ::cProjIni := cProjIni @@ -411,6 +408,9 @@ METHOD HbIde:create( cProjIni ) /* Load Environments */ ::oEV := IdeEnvironments():new( Self, hbide_pathToOSPath( ::aINI[ INI_HBIDE, PathEnv ] + ::pathSep + "hbide.env" ) ):create() + /* Home Implementation */ + ::oHM := IdeHome():new():create( Self ) + /* Just to spare some GC calls */ ::qCursor := QTextCursor():new() ::qBrushWrkProject := QBrush():new( "QColor", QColor():new( 255,0,0 ) ) @@ -453,21 +453,16 @@ METHOD HbIde:create( cProjIni ) ::oDockB1:hide() ::oDockB2:hide() ::oDockB:hide() - //::oDocViewDock:hide() + ::oDocViewDock:hide() /* Request Main Window to Appear on the Screen */ + ::oHM:refresh() ::oDlg:Show() + ::oDK:setView( "Stats" ) - nStart := seconds() - DO WHILE .t. - QApplication():processEvents() - IF seconds()-nStart > 5 - ::showApplicationCursor() - qSplash:close() - qSplash := NIL - EXIT - ENDIF - ENDDO + ::showApplicationCursor() + qSplash:close() + qSplash := NIL DO WHILE .t. ::nEvent := AppEvent( @::mp1, @::mp2, @::oXbp ) @@ -531,6 +526,7 @@ METHOD HbIde:create( cProjIni ) hbide_dbg( "Before ::oDlg:destroy()", memory( 1001 ), hbqt_getMemUsed() ) hbide_dbg( " " ) + ::oHM:destroy() ::oHL:destroy() ::oThemes:destroy() ::oFindInFiles:destroy() @@ -560,6 +556,10 @@ METHOD HbIde:execAction( cKey ) CASE "Exit" PostAppEvent( xbeP_Close, NIL, NIL, ::oDlg ) EXIT + CASE "Home" + ::oDK:setView( "Stats" ) + //::oHM:refresh() + EXIT CASE "NewProject" CASE "LoadProject" CASE "LaunchProject" @@ -628,7 +628,7 @@ METHOD HbIde:execAction( cKey ) CASE "ToggleProjectTree" CASE "ToggleBuildInfo" CASE "ToggleFuncList" - ::execWindowsAction( cKey ) + //::execWindowsAction( cKey ) EXIT CASE "Help" ::oHelpDock:show() @@ -849,23 +849,6 @@ METHOD HbIde:execProjectAction( cKey ) /*----------------------------------------------------------------------*/ -METHOD HbIde:execWindowsAction( cKey ) - - SWITCH cKey - CASE "ToggleProjectTree" - ::oDK:toggleLeftDocks() - EXIT - CASE "ToggleBuildInfo" - ::oDK:toggleBottomDocks() - EXIT - CASE "ToggleFuncList" - ::oDK:toggleRightDocks() - EXIT - ENDSWITCH - RETURN Self - -/*----------------------------------------------------------------------*/ - METHOD HbIde:setPosAndSizeByIni( qWidget, nPart ) LOCAL aRect @@ -1029,12 +1012,12 @@ METHOD HbIde:updateProjectTree( aPrj ) /*----------------------------------------------------------------------*/ METHOD HbIde:manageItemSelected( oXbpTreeItem ) - LOCAL n, cHbp, aPrj + LOCAL n, cHbp IF oXbpTreeItem == ::oProjRoot - n := -1 + n := -1 ELSEIF oXbpTreeItem == ::oOpenedSources - n := -2 + n := -2 ELSE n := ascan( ::aProjData, {|e_| e_[ 1 ] == oXbpTreeItem } ) ENDIF @@ -1044,11 +1027,7 @@ METHOD HbIde:manageItemSelected( oXbpTreeItem ) CASE n == -2 // "Files" CASE n == -1 CASE ::aProjData[ n, TRE_TYPE ] == "Project Name" - aPrj := ::aProjData[ n, 5 ] - - cHbp := hbide_pathToOSPath( aPrj[ PRJ_PRP_PROPERTIES, 2, PRJ_PRP_LOCATION ] + s_pathSep + ; - aPrj[ PRJ_PRP_PROPERTIES, 2, PRJ_PRP_OUTPUT ] + ".hbp" ) - + cHbp := ::oPM:getProjectFileNameFromTitle( ::aProjData[ n, TRE_ORIGINAL ] ) ::oPM:loadProperties( cHbp, .f., .t., .f. ) CASE ::aProjData[ n, TRE_TYPE ] == "Source File" @@ -1067,7 +1046,7 @@ METHOD HbIde:manageItemSelected( oXbpTreeItem ) /*----------------------------------------------------------------------*/ METHOD HbIde:manageProjectContext( mp1, mp2, oXbpTreeItem ) - LOCAL n, cHbi, aPrj, s + LOCAL n, cHbp, s LOCAL aPops := {}, aSub :={} HB_SYMBOL_UNUSED( mp2 ) @@ -1088,7 +1067,7 @@ METHOD HbIde:manageProjectContext( mp1, mp2, oXbpTreeItem ) CASE n == -1 // Project Root aadd( aPops, { "New Project" , {|| ::oPM:loadProperties( NIL, .t., .t., .t. ) } } ) aadd( aPops, { "" } ) - aadd( aPops, { "Load Project" , {|| ::oPM:loadProperties( NIL, .f., .f., .t. ) } } ) + aadd( aPops, { "Open Project" , {|| ::oPM:loadProperties( NIL, .f., .f., .t. ) } } ) aadd( aPops, { "" } ) // IF !empty( ::oEV:getNames() ) @@ -1102,15 +1081,12 @@ METHOD HbIde:manageProjectContext( mp1, mp2, oXbpTreeItem ) hbide_ExecPopup( aPops, mp1, ::oProjTree:oWidget ) CASE ::aProjData[ n, TRE_TYPE ] == "Project Name" - aPrj := ::aProjData[ n, TRE_DATA ] - cHbi := aPrj[ PRJ_PRP_PROPERTIES, 2, PRJ_PRP_LOCATION ] + s_pathSep + ; - aPrj[ PRJ_PRP_PROPERTIES, 2, PRJ_PRP_OUTPUT ] + ".hbp" - cHbi := hbide_pathToOSPath( cHbi ) + cHbp := hbide_pathToOSPath( ::oPM:getProjectFileNameFromTitle( ::aProjData[ n, TRE_ORIGINAL ] ) ) // IF Alltrim( Upper( ::cWrkProject ) ) != Alltrim( Upper( oXbpTreeItem:caption ) ) aadd( aPops, { "Set as Current" , {|| ::oPM:setCurrentProject( oXbpTreeItem:caption ) } } ) End - aadd( aPops, { "Properties" , {|| ::oPM:loadProperties( cHbi, .f., .t., .t. ) } } ) + aadd( aPops, { "Properties" , {|| ::oPM:loadProperties( cHbp, .f., .t., .t. ) } } ) aadd( aPops, { "" } ) aadd( aPops, { ::oAC:getAction( "BuildQt" ), {|| ::oPM:buildProject( oXbpTreeItem:caption, .F., , , .T. ) } } ) aadd( aPops, { ::oAC:getAction( "BuildLaunchQt" ), {|| ::oPM:buildProject( oXbpTreeItem:caption, .T., , , .T. ) } } ) @@ -1169,7 +1145,7 @@ METHOD HbIde:updateFuncList() /*----------------------------------------------------------------------*/ METHOD HbIde:gotoFunction( mp1, mp2, oListBox ) - LOCAL n, cAnchor, oEdit + LOCAL n, cAnchor, oEdit, lFound mp1 := oListBox:getData() mp2 := oListBox:getItem( mp1 ) @@ -1177,8 +1153,11 @@ METHOD HbIde:gotoFunction( mp1, mp2, oListBox ) IF ( n := ascan( ::aTags, {|e_| mp2 == e_[ 7 ] } ) ) > 0 cAnchor := trim( ::aText[ ::aTags[ n,3 ] ] ) IF !empty( oEdit := ::oEM:getEditCurrent() ) - IF !( oEdit:find( cAnchor, QTextDocument_FindCaseSensitively ) ) - oEdit:find( cAnchor, QTextDocument_FindBackward + QTextDocument_FindCaseSensitively ) + IF !( lFound := oEdit:find( cAnchor, QTextDocument_FindCaseSensitively ) ) + lFound := oEdit:find( cAnchor, QTextDocument_FindBackward + QTextDocument_FindCaseSensitively ) + ENDIF + IF lFound + oEdit:centerCursor() ENDIF ENDIF ENDIF diff --git a/harbour/contrib/hbide/ideactions.prg b/harbour/contrib/hbide/ideactions.prg index 46f8a69134..1bd20a6bc9 100644 --- a/harbour/contrib/hbide/ideactions.prg +++ b/harbour/contrib/hbide/ideactions.prg @@ -173,6 +173,7 @@ METHOD IdeActions:loadActions() // Name Text Image Shortcut Checkable IconVisInMenu // aadd( aAct, { "TB_Exit" , "E~xit" , "exit" , "" , "No", "Yes" } ) + aadd( aAct, { "TB_Home" , "~Home" , "dc_home" , "" , "No", "Yes" } ) aadd( aAct, { "TB_New" , "~Source" , "new" , "" , "No", "Yes" } ) aadd( aAct, { "TB_Open" , "~Open" , "open" , "" , "No", "Yes" } ) aadd( aAct, { "TB_Save" , "~Save" , "save" , "" , "No", "Yes" } ) @@ -209,10 +210,10 @@ METHOD IdeActions:loadActions() aadd( aAct, { "Help" , "~Help" , "help" , "F1" , "No", "Yes" } ) aadd( aAct, { "Exit" , "E~xit" , "exit" , "Sh+^W", "No", "Yes" } ) aadd( aAct, { "New" , "~Source" , "new" , "^N" , "No", "Yes" } ) - aadd( aAct, { "Open" , "~Open" , "open" , "^O" , "No", "Yes" } ) + aadd( aAct, { "Open" , "~Open..." , "open" , "^O" , "No", "Yes" } ) aadd( aAct, { "Save" , "~Save" , "save" , "^S" , "No", "Yes" } ) aadd( aAct, { "Close" , "~Close" , "close" , "^W" , "No", "Yes" } ) - aadd( aAct, { "Print" , "~Print" , "print" , "^P" , "No", "Yes" } ) + aadd( aAct, { "Print" , "~Print..." , "print" , "^P" , "No", "Yes" } ) aadd( aAct, { "Compile" , "Co~mpile" , "compile" , "" , "No", "Yes" } ) aadd( aAct, { "CompilePPO" , "Com~pile to PPO" , "ppo" , "" , "No", "Yes" } ) aadd( aAct, { "Build" , "Build Project" , "build" , "" , "No", "Yes" } ) @@ -244,7 +245,7 @@ METHOD IdeActions:loadActions() // aadd( aAct, { "NewProject" , "~Project" , "project" , "" , "No", "Yes" } ) aadd( aAct, { "LoadProject" , "Open Projec~t" , "" , "" , "No", "Yes" } ) - aadd( aAct, { "SaveAs" , "Save ~As" , "saveas" , "" , "No", "Yes" } ) + aadd( aAct, { "SaveAs" , "Save ~as..." , "saveas" , "" , "No", "Yes" } ) aadd( aAct, { "SaveAll" , "Save A~ll" , "saveall" , "Sh+^s", "No", "Yes" } ) aadd( aAct, { "CloseAll" , "Clos~e All" , "closeall" , "" , "No", "Yes" } ) aadd( aAct, { "CloseOther" , "Close Ot~hers" , "closeexcept" , "" , "No", "Yes" } ) @@ -277,7 +278,7 @@ METHOD IdeActions:loadActions() aadd( aAct, { "ManageThemes" , "Manage Themes" , "" , "" , "No", "Yes" } ) aadd( aAct, { "DefaultTheme" , "Set Default Theme" , "" , "" , "No", "Yes" } ) - aadd( aAct, { "AboutIDE" , "About Harbour IDE" , "vr-16x16" , "" , "No", "Yes" } ) + aadd( aAct, { "AboutIDE" , "About Harbour IDE" , "hbide" , "" , "No", "Yes" } ) aadd( aAct, { "AboutHarbour" , "About Harbour" , "hb-16x16" , "" , "No", "Yes" } ) aadd( aAct, { "HarbourUsersList" , "Harbour Users (Mailing Lists)", "list-users" , "" , "No", "Yes" } ) aadd( aAct, { "HarbourDevList" , "Harbour Developers (Mailing Lists)", "list-developers", "", "No", "Yes" } ) @@ -317,14 +318,14 @@ METHOD IdeActions:buildToolBar() oTBar:imageWidth := 22 oTBar:imageHeight := 22 oTBar:create( , , { 0, ::oDlg:currentSize()[ 2 ]-60 }, { ::oDlg:currentSize()[ 1 ], 60 } ) - oTBar:setStyleSheet( GetStyleSheet( "QToolBar" ) ) + * oTBar:setStyleSheet( GetStyleSheet( "QToolBar" ) ) oTBar:oWidget:setMaximumHeight( 28 ) oTBar:buttonClick := {|oButton| ::oIde:execAction( oButton:key ) } oTBar:addItem( ::getAction( "TB_Exit" ), , , , , , "Exit" ) - * oTBar:addItem( ::getAction( "Help" ), , , , , , "Help" ) + oTBar:addItem( ::getAction( "TB_Home" ), , , , , , "Home" ) oTBar:addItem( , , , , , nSep ) oTBar:addItem( ::getAction( "TB_New" ), , , , , , "New" ) oTBar:addItem( ::getAction( "TB_Open" ), , , , , , "Open" ) @@ -488,7 +489,7 @@ METHOD IdeActions:buildMainMenu() oSubMenu2:addItem( { ::getAction( "DeleteLine" ), {|| oIde:execAction( "DeleteLine" ) } } ) oSubMenu2:addItem( { ::getAction( "MoveLineUp" ), {|| oIde:execAction( "MoveLineUp" ) } } ) oSubMenu2:addItem( { ::getAction( "MoveLineDown" ), {|| oIde:execAction( "MoveLineDown" ) } } ) - oMenuBar:addItem( { oSubMenu2, _T( "~Line..." ) } ) + oMenuBar:addItem( { oSubMenu2, _T( "~Line" ) } ) // oSubMenu2 := XbpMenu():new( oSubMenu ):create() oSubMenu2:addItem( { ::getAction( "StreamComment" ), {|| oIde:execAction( "StreamComment" ) } } ) @@ -499,7 +500,7 @@ METHOD IdeActions:buildMainMenu() hbide_menuAddSep( oSubMenu2 ) oSubMenu2:addItem( { ::getAction( "BlockSgl2Dbl" ), {|| oIde:execAction( "BlockSgl2Dbl" ) } } ) oSubMenu2:addItem( { ::getAction( "BlockDbl2Sgl" ), {|| oIde:execAction( "BlockDbl2Sgl" ) } } ) - oMenuBar:addItem( { oSubMenu2, _T( "~Block..." ) } ) + oMenuBar:addItem( { oSubMenu2, _T( "~Block" ) } ) hbide_menuAddSep( oSubMenu ) oSubMenu2 := XbpMenu():new( oSubMenu ):create() @@ -556,6 +557,7 @@ METHOD IdeActions:buildMainMenu() /*----------------------------------------------------------------------------*/ /* Tools */ /*----------------------------------------------------------------------------*/ +#if 0 oSubMenu := XbpMenu():new( oMenuBar ):create() oSubMenu:title := "~Tools" oSubMenu:addItem( { ::getAction( "ConfigureTools" ), {|| oIde:execAction( "ConfigureTools" ) } } ) @@ -566,14 +568,14 @@ METHOD IdeActions:buildMainMenu() oSubMenu:addItem( { ::getAction( "Terminal" ), {|| oIde:execAction( "Terminal" ) } } ) #endif oMenuBar:addItem( { oSubMenu, NIL } ) - +#endif /*----------------------------------------------------------------------------*/ /* Options */ /*----------------------------------------------------------------------------*/ oSubMenu := XbpMenu():new( oMenuBar ):create() oSubMenu:title := "~Setup" oSubMenu2 := hbide_buildCodecMenu( oIde, oSubMenu ) - oSubMenu2:title := "~Codecs" + oSubMenu2:title := "~Encoding" oSubMenu:addItem( { oSubMenu2, NIL } ) oMenuBar:addItem( { oSubMenu, NIL } ) diff --git a/harbour/contrib/hbide/idedocks.prg b/harbour/contrib/hbide/idedocks.prg index 53e2add3a8..546830f87c 100644 --- a/harbour/contrib/hbide/idedocks.prg +++ b/harbour/contrib/hbide/idedocks.prg @@ -97,7 +97,7 @@ CLASS IdeDocks INHERIT IdeObject METHOD buildHelpWidget() METHOD buildSkeletonWidget() METHOD buildDialog() - METHOD buildViewWidget() + METHOD buildViewWidget( cObjectName ) METHOD buildStackedWidget() METHOD buildSearchReplaceWidget() METHOD buildDockWidgets() @@ -114,9 +114,6 @@ CLASS IdeDocks INHERIT IdeObject METHOD buildDocViewer() METHOD outputDoubleClicked( lSelected ) METHOD buildStatusBar() - METHOD toggleLeftDocks() - METHOD toggleRightDocks() - METHOD toggleBottomDocks() METHOD setStatusText( nPart, xValue ) METHOD getMarkWidget( nIndex ) METHOD dispEnvironment( cEnviron ) @@ -130,19 +127,14 @@ CLASS IdeDocks INHERIT IdeObject /*----------------------------------------------------------------------*/ METHOD IdeDocks:new( oIde ) - ::oIde := oIde - RETURN Self /*----------------------------------------------------------------------*/ METHOD IdeDocks:create( oIde ) - DEFAULT oIde TO ::oIde - ::oIde := oIde - RETURN Self /*----------------------------------------------------------------------*/ @@ -195,32 +187,66 @@ METHOD IdeDocks:destroy() /*----------------------------------------------------------------------*/ -METHOD IdeDocks:getADockWidget( nArea, cObjectName, cWindowTitle, nFlags ) - LOCAL oDock, nBasic +METHOD IdeDocks:buildDialog() + LOCAL s, aSize - DEFAULT nFlags TO 0 + ::oIde:oDlg := XbpDialog():new() + ::oDlg:icon := hbide_image( "hbide" ) + ::oDlg:title := "Harbour IDE" + ::oDlg:qtObject := HbQtUI():new( ::resPath + "mainwindow.uic" ):build() + ::oDlg:create( , , , , , .f. ) - nBasic := hb_bitOR( QDockWidget_DockWidgetClosable, nFlags ) + ::oDlg:setStyleSheet( GetStyleSheet( "QMainWindow" ) ) - oDock := XbpWindow():new() - oDock:oWidget := QDockWidget():new( ::oDlg:oWidget ) - oDock:oWidget:setObjectName( cObjectName ) - ::oDlg:addChild( oDock ) - oDock:oWidget:setFeatures( nBasic ) - oDock:oWidget:setAllowedAreas( nArea ) - oDock:oWidget:setWindowTitle( cWindowTitle ) - oDock:oWidget:setFocusPolicy( Qt_NoFocus ) - oDock:oWidget:setStyleSheet( getStyleSheet( "QDockWidget" ) ) - oDock:hide() + ::oDlg:close := {|| hbide_getYesNo( "hbIDE is about to be closed!", "Are you sure?" ) } + ::oDlg:oWidget:setDockOptions( QMainWindow_AllowTabbedDocks + QMainWindow_ForceTabbedDocks ) + ::oDlg:oWidget:setTabPosition( Qt_BottomDockWidgetArea, QTabWidget_South ) + ::oDlg:oWidget:setCorner( Qt_BottomLeftCorner, Qt_LeftDockWidgetArea ) + ::oDlg:oWidget:setCorner( Qt_BottomRightCorner, Qt_RightDockWidgetArea ) + ::oDlg:oWidget:resize( 868,470 ) - oDock:hbLayout := HBPLAYOUT_TYPE_VERTBOX - oDock:qLayout:setContentsMargins( 2, 2, 2, 2 ) + ::oIde:oDa := ::oDlg:drawingArea - RETURN oDock + SetAppWindow( ::oDlg ) + + // Center on Desktop and decorate + aSize := AppDesktop():currentSize() + ::oDlg:setPos( { ( aSize[ 1 ] - ::oDlg:currentSize()[ 1 ] ) / 2, ; + ( aSize[ 2 ] - ::oDlg:currentSize()[ 2 ] ) / 2 } ) + + ::oIde:setPosAndSizeByIni( ::oDlg:oWidget, MainWindowGeometry ) + //::oDlg:Show() + + /* StatusBar */ + ::buildStatusBar() + + /* Attach GRID Layout to Editor Area - Futuristic */ + ::oIde:qLayout := QGridLayout():new() + ::oIde:qLayout:setContentsMargins( 0,0,0,0 ) + ::oIde:qLayout:setHorizontalSpacing( 0 ) + ::oIde:qLayout:setVerticalSpacing( 0 ) + // + ::oDa:oWidget:setLayout( ::qLayout ) + + ::buildStackedWidget() + ::qLayout:addWidget_1( ::oStackedWidget:oWidget, 0, 0, 1, 1 ) +// ::buildSearchReplaceWidget() //////////////////////////////////// +// ::qLayout:addWidget_1( ::oSearchReplace:oUI, 1, 0, 1, 1 ) + + /* View Panels */ + ::buildViewWidget( "Stats" ) /* At stayrtup displaying various statistics */ + ::buildViewWidget( "Main" ) /* Main Panel to hold editor tabs */ + FOR EACH s IN ::aINI[ INI_VIEWS ] + ::buildViewWidget( s ) /* All other panels user created */ + NEXT + + ::setView( "Stats" ) /* Always call with name */ + + RETURN Self /*----------------------------------------------------------------------*/ - METHOD IdeDocks:buildDockWidgets() +METHOD IdeDocks:buildDockWidgets() ::buildProjectTree() ::buildEditorTree() @@ -255,40 +281,37 @@ METHOD IdeDocks:getADockWidget( nArea, cObjectName, cWindowTitle, nFlags ) /*----------------------------------------------------------------------*/ +METHOD IdeDocks:getADockWidget( nArea, cObjectName, cWindowTitle, nFlags ) + LOCAL oDock, nBasic + + DEFAULT nFlags TO 0 + + nBasic := hb_bitOR( QDockWidget_DockWidgetClosable, nFlags ) + + oDock := XbpWindow():new() + oDock:oWidget := QDockWidget():new( ::oDlg:oWidget ) + oDock:oWidget:setObjectName( cObjectName ) + ::oDlg:addChild( oDock ) + oDock:oWidget:setFeatures( nBasic ) + oDock:oWidget:setAllowedAreas( nArea ) + oDock:oWidget:setWindowTitle( cWindowTitle ) + oDock:oWidget:setFocusPolicy( Qt_NoFocus ) + oDock:oWidget:setStyleSheet( getStyleSheet( "QDockWidget" ) ) + oDock:hide() + + oDock:hbLayout := HBPLAYOUT_TYPE_VERTBOX + oDock:qLayout:setContentsMargins( 2, 2, 2, 2 ) + + RETURN oDock + +/*----------------------------------------------------------------------*/ + METHOD IdeDocks:execEvent( nMode, p ) - LOCAL nIndex, aMenu DO CASE - CASE nMode == 1 /* StackedWidget:currentChanged(int) */ - IF p >= 0 .AND. p <= len( ::aViews ) - ::oIde:nCurView := p - - ::oIde:qTabWidget := ::aViews[ ::nCurView + 1 ]:oTabWidget:oWidget - ::oIde:oTabParent := ::aViews[ ::nCurView + 1 ] - - nIndex := ::oIde:qTabWidget:currentIndex() - IF nIndex + 1 == ::oIde:qTabWidget:count() - IF !( ::oIde:lClosing ) - ::oIde:qTabWidget:setCurrentIndex( 0 ) - ::oIde:qTabWidget:setCurrentIndex( nIndex ) /* TODO: Must be last saved */ - ENDIF - ENDIF - ::setStatusText( SB_PNL_VIEW, iif( p == 0, "Main", ::aINI[ INI_VIEWS, ::nCurView ] ) ) - ENDIF CASE nMode == 2 /* HelpWidget:contextMenuRequested(qPoint) */ - aMenu := {} - - aadd( aMenu, { "Back" , {|| ::qHelpBrw:backward() } } ) - aadd( aMenu, { "Forward" , {|| ::qHelpBrw:forward() } } ) - aadd( aMenu, { "Home" , {|| ::qHelpBrw:home() } } ) - aadd( aMenu, { "" } ) - aadd( aMenu, { "Reload" , {|| ::qHelpBrw:reload() } } ) - aadd( aMenu, { "" } ) - aadd( aMenu, { "Select All", {|| ::qHelpBrw:selectAll() } } ) - aadd( aMenu, { "Copy" , {|| ::qHelpBrw:copy() } } ) - - hbide_execPopup( aMenu, p, ::qHelpBrw ) + hbide_popupBrwContextMenu( ::qHelpBrw, p ) CASE nMode == dockDocViewer_visibilityChanged IF p @@ -321,62 +344,50 @@ METHOD IdeDocks:execEvent( nMode, p ) /*----------------------------------------------------------------------*/ -METHOD IdeDocks:buildDialog() - LOCAL s, aSize +METHOD IdeDocks:setView( cView ) + LOCAL n, nIndex - ::oIde:oDlg := XbpDialog():new() - ::oDlg:icon := hbide_image( "hbide" ) - ::oDlg:title := "Harbour IDE" - ::oDlg:qtObject := HbQtUI():new( ::resPath + "mainwindow.uic" ):build() - ::oDlg:create( , , , , , .f. ) + SWITCH cView - ::oDlg:setStyleSheet( GetStyleSheet( "QMainWindow" ) ) + CASE "New..." + cView := hbide_fetchAString( ::qViewsCombo, cView, "Name the View", "New View" ) + IF cView != "New..." .AND. cView != "Stats" .AND. cView != "Main" + IF ascan( ::aINI[ INI_VIEWS ], {|e| e == cView } ) > 0 + MsgBox( "View: " + cView + ", already exists" ) + ELSE + aadd( ::aINI[ INI_VIEWS ], cView ) + ::qViewsCombo:addItem( cView ) + ::buildViewWidget( cView ) + ::addPanelButton( cView ) + ::setView( cView ) + ENDIF + ENDIF + EXIT - ::oDlg:close := {|| hbide_getYesNo( "hbIDE is about to be closed!", "Are you sure?" ) } - ::oDlg:oWidget:setDockOptions( QMainWindow_AllowTabbedDocks + QMainWindow_ForceTabbedDocks ) - ::oDlg:oWidget:setTabPosition( Qt_BottomDockWidgetArea, QTabWidget_South ) - ::oDlg:oWidget:setCorner( Qt_BottomLeftCorner, Qt_LeftDockWidgetArea ) - ::oDlg:oWidget:setCorner( Qt_BottomRightCorner, Qt_RightDockWidgetArea ) - ::oDlg:oWidget:resize( 850,430 ) + OTHERWISE + IF ( n := ascan( ::aViews, {|o| o:oWidget:objectName() == cView } ) ) > 0 + ::oIde:cWrkView := cView - ::oIde:oDa := ::oDlg:drawingArea + IF !( cView == "Stats" ) + ::oIde:qTabWidget := ::aViews[ n ]:oTabWidget:oWidget + ::oIde:oTabParent := ::aViews[ n ] - SetAppWindow( ::oDlg ) + nIndex := ::oIde:qTabWidget:currentIndex() + IF nIndex + 1 == ::oIde:qTabWidget:count() + IF !( ::oIde:lClosing ) + ::oIde:qTabWidget:setCurrentIndex( 0 ) + ::oIde:qTabWidget:setCurrentIndex( nIndex ) /* TODO: Must be last saved */ + ENDIF + ENDIF + ENDIF + ::oStackedWidget:oWidget:setCurrentIndex( n - 1 ) + ::setStatusText( SB_PNL_VIEW, ::cWrkView ) + ENDIF + EXIT - // Center on Desktop and decorate - aSize := AppDesktop():currentSize() - ::oDlg:setPos( { ( aSize[ 1 ] - ::oDlg:currentSize()[ 1 ] ) / 2, ; - ( aSize[ 2 ] - ::oDlg:currentSize()[ 2 ] ) / 2 } ) + ENDSWITCH - ::oIde:setPosAndSizeByIni( ::oDlg:oWidget, MainWindowGeometry ) - //::oDlg:Show() - - /* StatusBar */ - ::buildStatusBar() - - /* Attach GRID Layout to Editor Area - Futuristic */ - ::oIde:qLayout := QGridLayout():new() - ::oIde:qLayout:setContentsMargins( 0,0,0,0 ) - ::oIde:qLayout:setHorizontalSpacing( 0 ) - ::oIde:qLayout:setVerticalSpacing( 0 ) - // - ::oDa:oWidget:setLayout( ::qLayout ) - - ::buildStackedWidget() - ::qLayout:addWidget_1( ::oStackedWidget:oWidget, 0, 0, 1, 1 ) -// ::buildSearchReplaceWidget() //////////////////////////////////// -// ::qLayout:addWidget_1( ::oSearchReplace:oUI, 1, 0, 1, 1 ) - - /* View Panels */ - ::buildViewWidget() /* Main */ - FOR EACH s IN ::aINI[ INI_VIEWS ] - ::buildViewWidget() - NEXT - - /* Force to populate current widget */ - ::oStackedWidget:oWidget:setCurrentIndex( 0 ) - - RETURN Self + RETURN NIL /*----------------------------------------------------------------------*/ @@ -389,28 +400,16 @@ METHOD IdeDocks:buildStackedWidget() ::oStackedWidget:oWidget:setObjectName( "myStackedWidget" ) ::oDa:addChild( ::oStackedWidget ) - ::oStackedWidget:connect( ::oStackedWidget:oWidget, "currentChanged(int)", {|p| ::execEvent( 1, p ) } ) - RETURN Self /*----------------------------------------------------------------------*/ -METHOD IdeDocks:buildSearchReplaceWidget() - - ::oIde:oSearchReplace := IdeSearchReplace():new( ::oIde ):create() - ::oSearchReplace:oUI:hide() - - RETURN Self - -/*----------------------------------------------------------------------*/ - -METHOD IdeDocks:buildViewWidget() - LOCAL n := len( ::aViews ) + 1 +METHOD IdeDocks:buildViewWidget( cObjectName ) LOCAL oFrame oFrame := XbpWindow():new( ::oStackedWidget ) oFrame:oWidget := QWidget():new( ::oStackedWidget:oWidget ) - oFrame:oWidget:setObjectName( "viewWidget" + hb_ntos( n ) ) + oFrame:oWidget:setObjectName( cObjectName ) /* This will form the basis of showing at top */ ::oStackedWidget:addChild( oFrame ) oFrame:hbLayout := HBPLAYOUT_TYPE_VERTBOX @@ -422,93 +421,20 @@ METHOD IdeDocks:buildViewWidget() oFrame:oTabWidget:oWidget:setMovable( .t. ) aadd( ::oIde:aViews, oFrame ) + oFrame:oWidget:show() + oFrame:oTabWidget:oWidget:show() ::oStackedWidget:oWidget:addWidget( oFrame:oWidget ) - - ::oStackedWidget:oWidget:setCurrentIndex( 0 ) + ::setView( cObjectName ) RETURN oFrame /*----------------------------------------------------------------------*/ -METHOD IdeDocks:setView( cView ) - LOCAL n +METHOD IdeDocks:buildSearchReplaceWidget() - SWITCH cView - - CASE "New..." - cView := hbide_fetchAString( ::qViewsCombo, cView, "Name the View", "New View" ) - IF cView != "New..." - IF ascan( ::aINI[ INI_VIEWS ], {|e| e == cView } ) > 0 - MsgBox( "View: " + cView + ", already exists" ) - ELSE - aadd( ::aINI[ INI_VIEWS ], cView ) - ::qViewsCombo:addItem( cView ) - ::buildViewWidget() - ::oStackedWidget:oWidget:setCurrentIndex( len( ::aINI[ INI_VIEWS ] ) ) - ::oIde:cWrkView := cView - ENDIF - ENDIF - EXIT - - CASE "Main" - ::oIde:nCurView := 0 - ::oIde:qTabWidget := ::aViews[ ::nCurView + 1 ]:oTabWidget:oWidget - ::oIde:oTabParent := ::aViews[ ::nCurView + 1 ] - ::oStackedWidget:oWidget:setCurrentIndex( 0 ) - ::oIde:cWrkView := "Main" - EXIT - - OTHERWISE - IF ( n := ascan( ::aINI[ INI_VIEWS ], cView ) ) > 0 - ::oStackedWidget:oWidget:setCurrentIndex( n ) /* Note: n is always base of zero as main == 1 */ - ::oIde:cWrkView := cView - ENDIF - EXIT - ENDSWITCH - - RETURN NIL - -/*----------------------------------------------------------------------*/ - -METHOD IdeDocks:disblePanelButton( qTBtn ) - LOCAL q - - FOR EACH q IN ::aPanels - q:setEnabled( !( q == qTBtn ) ) - NEXT - RETURN Self - -/*----------------------------------------------------------------------*/ - -METHOD IdeDocks:addPanelButton( cPanel ) - LOCAL qTBtn, aColors, nIndex, cColor - - * aColors := { "#996633", "#A37547", "#AD855C", "#B89470", "#C2A385", "#CCB299", "#D6C2AD", "#E0D1C2", "#EBE0D6", "#F5F0EB" } - aColors := { "#98FB98","#20B2AA","#6B8E23","#9ACD32","#FFFF00","#FF00FF","#FFA500","#4169E1","#00FF7F","#FFFF00" } - - IF cPanel == "Main" - nIndex := 1 - cColor := "#008000" - ELSE - nIndex := len( ::aPanels ) - IF nIndex > len( aColors ) - nIndex := nIndex - len( aColors ) - ENDIF - cColor := aColors[ nIndex ] - ENDIF - - qTBtn := QToolButton():new() - qTBtn:setMaximumHeight( 12 ) - qTBtn:setMaximumWidth( 18 ) - qTBtn:setTooltip( "Panel: " + cPanel ) - qTBtn:setStyleSheet( "background-color: " + cColor + " ;" ) - - ::connect( qTBtn, "clicked()", {|| ::disblePanelButton( qTBtn ), ::setView( cPanel ) } ) - ::qTBarPanels:addWidget( qTBtn ) - ::qTBarPanels:addSeparator() - - aadd( ::aPanels, qTBtn ) + ::oIde:oSearchReplace := IdeSearchReplace():new( ::oIde ):create() + ::oSearchReplace:oUI:hide() RETURN Self @@ -652,17 +578,46 @@ METHOD IdeDocks:buildToolBarPanels() /*----------------------------------------------------------------------*/ +METHOD IdeDocks:disblePanelButton( qTBtn ) + LOCAL q + + FOR EACH q IN ::aPanels + q:setEnabled( !( q == qTBtn ) ) + NEXT + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeDocks:addPanelButton( cPanel ) + LOCAL qTBtn + + STATIC nIndex := 0 + nIndex++ + + qTBtn := QToolButton():new() + qTBtn:setMaximumHeight( 20 ) + qTBtn:setMaximumWidth( 20 ) + qTBtn:setTooltip( "Panel: " + cPanel ) + qTBtn:setIcon( hbide_image( "panel_" + hb_ntos( nIndex ) ) ) + aadd( ::aPanels, qTBtn ) + ::qTBarPanels:addWidget( qTBtn ) + ::connect( qTBtn, "clicked()", {|| ::setView( cPanel ) } ) + + nIndex := iif( nIndex >= 7, 0, nIndex ) + + IF !empty( ::qViewsCombo ) + ::qViewsCombo:setCurrentIndex( len( ::aPanels ) + 1 ) + endif + + RETURN Self + +/*----------------------------------------------------------------------*/ + METHOD IdeDocks:buildProjectTree() LOCAL i - ::oIde:oDockPT := XbpWindow():new() - ::oDockPT:oWidget := QDockWidget():new( ::oDlg:oWidget ) - ::oDockPT:oWidget:setObjectName( "dockProjectTree" ) - ::oDlg:addChild( ::oDockPT ) - ::oDockPT:oWidget:setFeatures( QDockWidget_DockWidgetClosable + QDockWidget_DockWidgetMovable ) - ::oDockPT:oWidget:setAllowedAreas( Qt_LeftDockWidgetArea ) - ::oDockPT:oWidget:setWindowTitle( "Projects Tree" ) - ::oDockPT:oWidget:setFocusPolicy( Qt_NoFocus ) + ::oIde:oDockPT := ::getADockWidget( Qt_LeftDockWidgetArea, "dockProjectTree", "Projects Tree" ) + ::oDlg:oWidget:addDockWidget_1( Qt_LeftDockWidgetArea, ::oDockPT:oWidget, Qt_Vertical ) ::oIde:oProjTree := XbpTreeView():new() ::oProjTree:hasLines := .T. @@ -674,7 +629,7 @@ METHOD IdeDocks:buildProjectTree() ::oProjTree:oWidget:setSizePolicy_1( QSizePolicy_MinimumExpanding, QSizePolicy_Preferred ) * ::oProjTree:itemMarked := {|oItem| ::manageItemSelected( 0, oItem ), ::oCurProjItem := oItem } - ::oProjTree:itemMarked := {|oItem| ::oIde:oCurProjItem := oItem, ::oIde:manageFocusInEditor() } + ::oProjTree:itemMarked := {|oItem| ::oIde:oCurProjItem := oItem } //, ::oIde:manageFocusInEditor() } ::oProjTree:itemSelected := {|oItem| ::oIde:manageItemSelected( oItem ) } ::oProjTree:hbContextMenu := {|mp1, mp2, oXbp| ::oIde:manageProjectContext( mp1, mp2, oXbp ) } @@ -693,8 +648,7 @@ METHOD IdeDocks:buildProjectTree() /* Insert Project Tree Into Dock Widget */ ::oDockPT:oWidget:setWidget( ::oProjTree:oWidget ) - /* Add dock widget to Main Window */ - ::oDlg:oWidget:addDockWidget_1( Qt_LeftDockWidgetArea, ::oDockPT:oWidget, Qt_Vertical ) + ::oDockPT:hide() RETURN Self @@ -702,14 +656,8 @@ METHOD IdeDocks:buildProjectTree() METHOD IdeDocks:buildEditorTree() - ::oIde:oDockED := XbpWindow():new() - ::oDockED:oWidget := QDockWidget():new( ::oDlg:oWidget ) - ::oDockED:oWidget:setObjectName( "dockEditorTabs" ) - ::oDlg:addChild( ::oDockED ) - ::oDockED:oWidget:setFeatures( QDockWidget_DockWidgetClosable + QDockWidget_DockWidgetMovable ) - ::oDockED:oWidget:setAllowedAreas( Qt_LeftDockWidgetArea ) - ::oDockED:oWidget:setWindowTitle( "Editor Tabs" ) - ::oDockED:oWidget:setFocusPolicy( Qt_NoFocus ) + ::oIde:oDockED := ::getADockWidget( Qt_LeftDockWidgetArea, "dockEditorTabs", "Editor Tabs" ) + ::oDlg:oWidget:addDockWidget_1( Qt_LeftDockWidgetArea, ::oDockED:oWidget, Qt_Vertical ) ::oIde:oEditTree := XbpTreeView():new() ::oEditTree:hasLines := .T. @@ -731,8 +679,7 @@ METHOD IdeDocks:buildEditorTree() /* Insert Project Tree Into Dock Widget */ ::oDockED:oWidget:setWidget( ::oEditTree:oWidget ) - /* Add dock widget to Main Window */ - ::oDlg:oWidget:addDockWidget_1( Qt_LeftDockWidgetArea, ::oDockED:oWidget, Qt_Vertical ) + ::oDockED:hide() RETURN Self @@ -741,6 +688,7 @@ METHOD IdeDocks:buildEditorTree() METHOD IdeDocks:buildFuncList() ::oIde:oFuncDock := ::getADockWidget( Qt_RightDockWidgetArea, "dockFuncList", "Functions List", QDockWidget_DockWidgetFloatable ) + ::oDlg:oWidget:addDockWidget_1( Qt_RightDockWidgetArea, ::oFuncDock:oWidget, Qt_Vertical ) ::oIde:oFuncList := XbpListBox():new( ::oFuncDock ):create( , , { 0,0 }, { 100,400 }, , .t. ) ::oFuncList:oWidget:setEditTriggers( QAbstractItemView_NoEditTriggers ) @@ -751,7 +699,6 @@ METHOD IdeDocks:buildFuncList() ::oFuncList:hbContextMenu := {|mp1, mp2, oXbp| ::oIde:manageFuncContext( mp1, mp2, oXbp ) } ::oFuncDock:oWidget:setWidget( ::oFuncList:oWidget ) - ::oDlg:oWidget:addDockWidget_1( Qt_RightDockWidgetArea, ::oFuncDock:oWidget, Qt_Vertical ) RETURN Self @@ -760,22 +707,22 @@ METHOD IdeDocks:buildFuncList() METHOD IdeDocks:buildHelpWidget() LOCAL qUrl, qStr - qUrl := QUrl():new( "idemainpage.html" ) - qStr := QStringList():new() - qStr:append( hb_dirBase() + "docs" ) - ::oIde:oHelpDock := ::getADockWidget( Qt_RightDockWidgetArea, "dockHelp", "hbIDE Help", QDockWidget_DockWidgetFloatable ) + ::oDlg:oWidget:addDockWidget_1( Qt_RightDockWidgetArea, ::oHelpDock:oWidget, Qt_Horizontal ) ::oIde:qHelpBrw := QTextBrowser():new( ::oHelpDock:oWidget ) ::qHelpBrw:show() ::qHelpBrw:setContextMenuPolicy( Qt_CustomContextMenu ) ::qHelpBrw:setOpenExternalLinks( .t. ) + qUrl := QUrl():new( "idemainpage.html" ) + qStr := QStringList():new() + qStr:append( hb_dirBase() + "docs" ) + ::qHelpBrw:setSearchPaths( qStr ) ::qHelpBrw:setSource( qUrl ) ::oHelpDock:oWidget:setWidget( ::oIde:qHelpBrw ) - ::oDlg:oWidget:addDockWidget_1( Qt_RightDockWidgetArea, ::oHelpDock:oWidget, Qt_Horizontal ) ::oHelpDock:connect( ::qHelpBrw, "customContextMenuRequested(QPoint)", {|p| ::execEvent( 2, p ) } ) @@ -785,41 +732,23 @@ METHOD IdeDocks:buildHelpWidget() METHOD IdeDocks:buildCompileResults() - ::oIde:oDockB := XbpWindow():new() - ::oDockB:oWidget := QDockWidget():new( ::oDlg:oWidget ) - ::oDockB:oWidget:setObjectName( "dockCompileResults" ) - ::oDlg:addChild( ::oDockB ) - ::oDockB:oWidget:setFeatures( QDockWidget_DockWidgetClosable ) - ::oDockB:oWidget:setAllowedAreas( Qt_BottomDockWidgetArea ) - ::oDockB:oWidget:setWindowTitle( "Compile Results" ) - ::oDockB:oWidget:setFocusPolicy( Qt_NoFocus ) + ::oIde:oDockB := ::getADockWidget( Qt_BottomDockWidgetArea, "dockCompileResults", "Compile Results" ) + ::oDlg:oWidget:addDockWidget_1( Qt_BottomDockWidgetArea, ::oDockB:oWidget, Qt_Horizontal ) ::oIde:oCompileResult := XbpMLE():new( ::oDockB ):create( , , { 0,0 }, { 100,400 }, , .t. ) ::oDockB:oWidget:setWidget( ::oCompileResult:oWidget ) - ::oDlg:oWidget:addDockWidget_1( Qt_BottomDockWidgetArea, ::oDockB:oWidget, Qt_Horizontal ) - ::oDockB:hide() - RETURN Self /*----------------------------------------------------------------------*/ METHOD IdeDocks:buildLinkResults() - ::oIde:oDockB1 := XbpWindow():new() - ::oDockB1:oWidget := QDockWidget():new( ::oDlg:oWidget ) - ::oDockB1:oWidget:setObjectName( "dockLinkResults" ) - ::oDlg:addChild( ::oDockB1 ) - ::oDockB1:oWidget:setFeatures( QDockWidget_DockWidgetClosable ) - ::oDockB1:oWidget:setAllowedAreas( Qt_BottomDockWidgetArea ) - ::oDockB1:oWidget:setWindowTitle( "Link Results" ) - ::oDockB1:oWidget:setFocusPolicy( Qt_NoFocus ) - - ::oIde:oLinkResult := XbpMLE():new( ::oDockB1 ):create( , , { 0,0 }, { 100, 400 }, , .t. ) - ::oDockB1:oWidget:setWidget( ::oLinkResult:oWidget ) - + ::oIde:oDockB1 := ::getADockWidget( Qt_BottomDockWidgetArea, "dockLinkResults", "Link Results" ) ::oDlg:oWidget:addDockWidget_1( Qt_BottomDockWidgetArea, ::oDockB1:oWidget, Qt_Horizontal ) - ::oDockB1:hide() + + ::oIde:oLinkResult := XbpMLE():new( ::oDockB1 ):create( , , { 0,0 }, { 100, 400 }, , .T. ) + ::oDockB1:oWidget:setWidget( ::oLinkResult:oWidget ) RETURN Self @@ -827,15 +756,8 @@ METHOD IdeDocks:buildLinkResults() METHOD IdeDocks:buildOutputResults() - ::oIde:oDockB2 := XbpWindow():new() - ::oDockB2:oWidget := QDockWidget():new( ::oDlg:oWidget ) - ::oDockB2:oWidget:setObjectName( "dockOutputResults" ) - ::oDlg:addChild( ::oDockB2 ) - ::oDockB2:oWidget:setFeatures( QDockWidget_DockWidgetClosable ) - ::oDockB2:oWidget:setAllowedAreas( Qt_BottomDockWidgetArea ) - ::oDockB2:oWidget:setWindowTitle( "Output Console" ) - ::oDockB2:oWidget:setFocusPolicy( Qt_NoFocus ) - ::oDockB2:hide() + ::oIde:oDockB2 := ::getADockWidget( Qt_BottomDockWidgetArea, "dockOutputResults", "Output Console" ) + ::oDlg:oWidget:addDockWidget_1( Qt_BottomDockWidgetArea, ::oDockB2:oWidget, Qt_Horizontal ) ::oIde:oOutputResult := XbpRtf():new( ::oDockB2 ):create( , , { 0,0 }, { 100, 400 }, , .T. ) ::oOutputResult:oWidget:setAcceptRichText( .T. ) @@ -843,8 +765,6 @@ METHOD IdeDocks:buildOutputResults() ::oDockB2:oWidget:setWidget( ::oOutputResult:oWidget ) - ::oDlg:oWidget:addDockWidget_1( Qt_BottomDockWidgetArea, ::oDockB2:oWidget, Qt_Horizontal ) - ::connect( ::oIde:oOutputResult:oWidget, "copyAvailable(bool)", {|l| ::outputDoubleClicked( l ) } ) RETURN Self @@ -907,7 +827,7 @@ METHOD IdeDocks:buildStatusBar() METHOD IdeDocks:buildThemesDock() - ::oIde:oThemesDock := ::getADockWidget( Qt_RightDockWidgetArea, "dockThemes", "Editor Themes", QDockWidget_DockWidgetFloatable ) + ::oIde:oThemesDock := ::getADockWidget( Qt_RightDockWidgetArea, "dockThemes", "Theme Manager", QDockWidget_DockWidgetFloatable ) ::oDlg:oWidget:addDockWidget_1( Qt_RightDockWidgetArea, ::oThemesDock:oWidget, Qt_Horizontal ) ::connect( ::oThemesDock:oWidget, "visibilityChanged(bool)", {|p| ::execEvent( dockThemes_visibilityChanged, p ) } ) @@ -1081,16 +1001,19 @@ METHOD IdeDocks:setStatusText( nPart, xValue ) oPanel:caption := "Find: " + xValue EXIT CASE SB_PNL_CODEC + xValue := iif( empty( xValue ), "default", xValue ) oPanel:caption := "<font color = brown >Codec: " + xValue + "</font>" EXIT CASE SB_PNL_ENVIRON - oPanel:caption := "<font color = blue >Env: " + xValue + "</font>" + xValue := iif( empty( xValue ), "default", xValue ) + oPanel:caption := "<font color = blue >Env: " + xValue + "</font>" EXIT CASE SB_PNL_VIEW oPanel:caption := "<font color = green >View: " + xValue + "</font>" EXIT CASE SB_PNL_PROJECT - oPanel:caption := "<font color = darkred >Proj: " + xValue + "</font>" + xValue := iif( empty( xValue ), "none", xValue ) + oPanel:caption := "<font color = darkred >Proj: " + xValue + "</font>" EXIT ENDSWITCH @@ -1120,49 +1043,3 @@ METHOD IdeDocks:getMarkWidget( nIndex ) RETURN ::oIde:aMarkTBtns[ nIndex ] /*----------------------------------------------------------------------*/ - -METHOD IdeDocks:toggleLeftDocks() - - IF ::lProjTreeVisible - ::oDockPT:hide() - ::oDockED:hide() - ELSE - ::oDockPT:show() - ::oDockED:show() - ENDIF - ::oIde:lProjTreeVisible := !( ::lProjTreeVisible ) - - RETURN Self - -/*----------------------------------------------------------------------*/ - -METHOD IdeDocks:toggleRightDocks() - - IF ::lDockRVisible - ::oFuncDock:hide() - ELSE - ::oFuncDock:show() - ENDIF - ::oIde:lDockRVisible := !( ::lDockRVisible ) - - RETURN Self - -/*----------------------------------------------------------------------*/ - -METHOD IdeDocks:toggleBottomDocks() - - IF ::lDockBVisible - ::oDockB:hide() - ::oDockB1:hide() - ::oDockB2:hide() - ELSEIF ::qTabWidget:count() > 0 - ::oDockB:show() - ::oDockB1:show() - ::oDockB2:show() - ENDIF - ::oIde:lDockBVisible := !( ::oIde:lDockBVisible ) - - RETURN Self - -/*----------------------------------------------------------------------*/ - diff --git a/harbour/contrib/hbide/ideeditor.prg b/harbour/contrib/hbide/ideeditor.prg index af6540b945..df7fc9e70b 100644 --- a/harbour/contrib/hbide/ideeditor.prg +++ b/harbour/contrib/hbide/ideeditor.prg @@ -288,9 +288,10 @@ METHOD IdeEditsManager:getTabBySource( cSource ) METHOD IdeEditsManager:getTabCurrent() LOCAL qTab, nTab - qTab := ::qTabWidget:currentWidget() - nTab := ascan( ::aTabs, {|e_| hbqt_IsEqualGcQtPointer( e_[ TAB_OTAB ]:oWidget:pPtr, qTab ) } ) - + IF !empty( ::qTabWidget ) + qTab := ::qTabWidget:currentWidget() + nTab := ascan( ::aTabs, {|e_| hbqt_IsEqualGcQtPointer( e_[ TAB_OTAB ]:oWidget:pPtr, qTab ) } ) + ENDIF RETURN nTab /*----------------------------------------------------------------------*/ @@ -298,7 +299,7 @@ METHOD IdeEditsManager:getTabCurrent() METHOD IdeEditsManager:getDocumentCurrent() LOCAL qTab, nTab - IF ::qTabWidget:count() > 0 + IF !empty( ::qTabWidget ) .AND. ::qTabWidget:count() > 0 qTab := ::qTabWidget:currentWidget() IF ( nTab := ascan( ::aTabs, {|e_| hbqt_IsEqualGcQtPointer( e_[ TAB_OTAB ]:oWidget:pPtr, qTab ) } ) ) > 0 RETURN QTextDocument():configure( ::aTabs[ nTab, TAB_OEDITOR ]:document() ) @@ -312,7 +313,7 @@ METHOD IdeEditsManager:getDocumentCurrent() METHOD IdeEditsManager:getEditObjectCurrent() LOCAL qTab, nTab - IF ::qTabWidget:count() > 0 + IF !empty( ::qTabWidget ) .AND. ::qTabWidget:count() > 0 qTab := ::qTabWidget:currentWidget() IF ( nTab := ascan( ::aTabs, {|e_| hbqt_IsEqualGcQtPointer( e_[ TAB_OTAB ]:oWidget:pPtr, qTab ) } ) ) > 0 RETURN ::aTabs[ nTab, TAB_OEDITOR ]:qCoEdit @@ -326,7 +327,7 @@ METHOD IdeEditsManager:getEditObjectCurrent() METHOD IdeEditsManager:getEditCurrent() LOCAL qTab, nTab - IF ::qTabWidget:count() > 0 + IF !empty( ::qTabWidget ) .AND. ::qTabWidget:count() > 0 qTab := ::qTabWidget:currentWidget() IF ( nTab := ascan( ::aTabs, {|e_| hbqt_IsEqualGcQtPointer( e_[ TAB_OTAB ]:oWidget:pPtr, qTab ) } ) ) > 0 RETURN ::aTabs[ nTab, TAB_OEDITOR ]:qCqEdit @@ -340,7 +341,7 @@ METHOD IdeEditsManager:getEditCurrent() METHOD IdeEditsManager:getEditorCurrent() LOCAL qTab, nTab - IF ::qTabWidget:count() > 0 + IF !empty( ::qTabWidget ) .AND. ::qTabWidget:count() > 0 qTab := ::qTabWidget:currentWidget() IF ( nTab := ascan( ::aTabs, {|e_| hbqt_IsEqualGcQtPointer( e_[ TAB_OTAB ]:oWidget:pPtr, qTab ) } ) ) > 0 RETURN ::aTabs[ nTab, TAB_OEDITOR ] @@ -426,6 +427,8 @@ METHOD IdeEditsManager:setSourceVisible( cSource ) LOCAL oEdit, nIndex IF !empty( oEdit := ::getEditorBySource( cSource ) ) + ::oDK:setView( oEdit:cView ) + nIndex := ::qTabWidget:indexOf( oEdit:oTab:oWidget ) IF ::qTabWidget:currentIndex() != nIndex ::qTabWidget:setCurrentIndex( nIndex ) @@ -1050,7 +1053,6 @@ METHOD IdeEditor:new( oIde, cSourceFile, nPos, nHPos, nVPos, cTheme, cView ) /*----------------------------------------------------------------------*/ METHOD IdeEditor:create( oIde, cSourceFile, nPos, nHPos, nVPos, cTheme, cView ) - LOCAL n ::qSlots := HBSlots():new() @@ -1070,17 +1072,8 @@ METHOD IdeEditor:create( oIde, cSourceFile, nPos, nHPos, nVPos, cTheme, cView ) ::cTheme := cTheme ::cView := cView - DEFAULT ::cView TO iif( ::nCurView == 0, "Main", ::aINI[ INI_VIEWS, ::nCurView ] ) - - IF ::cView == "Main" - ::oStackedWidget:oWidget:setCurrentIndex( 0 ) - ELSE - IF ( n := ascan( ::aINI[ INI_VIEWS ], {|e| e == ::cView } ) ) > 0 - ::oStackedWidget:oWidget:setCurrentIndex( n ) - ELSE - ::oStackedWidget:oWidget:setCurrentIndex( 0 ) - ENDIF - ENDIF + DEFAULT ::cView TO iif( ::cWrkView == "Stats", "Main", ::cWrkView ) + ::oDK:setView( ::cView ) ::pathNormalized := hbide_pathNormalized( cSourceFile, .t. ) diff --git a/harbour/contrib/hbide/idehome.prg b/harbour/contrib/hbide/idehome.prg new file mode 100644 index 0000000000..64adfb5e20 --- /dev/null +++ b/harbour/contrib/hbide/idehome.prg @@ -0,0 +1,528 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * + * Copyright 2010 Pritpal Bedi <pritpal@vouchcac.com> + * www - http://www.harbour-project.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ +/*----------------------------------------------------------------------*/ +/*----------------------------------------------------------------------*/ +/*----------------------------------------------------------------------*/ +/* + * EkOnkar + * ( The LORD is ONE ) + * + * Harbour-Qt IDE + * + * Pritpal Bedi <pritpal@vouchcac.com> + * 04Mar2010 + */ +/*----------------------------------------------------------------------*/ +/*----------------------------------------------------------------------*/ +/*----------------------------------------------------------------------*/ + +#include "hbide.ch" +#include "common.ch" +#include "hbclass.ch" +#include "xbp.ch" +#include "hbqt.ch" + +/*----------------------------------------------------------------------*/ + +#define browserStat_anchorClicked 101 +#define browserWelcome_contextMenuRequested 102 +#define browserFaq_contextMenuRequested 103 +#define tabWidget_currentChanged 104 + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION hbide_htmlImgAnchor( cHref, cImg, nWidth, nHeight ) + DEFAULT nWidth TO 12 + DEFAULT nHeight TO 12 + RETURN '<A href="' + cHref + '"' + '>' + ' <IMG src="' + cImg + '"' + ; + ' width="' + hb_ntos( nWidth ) + '" height="' + hb_ntos( nHeight ) + '"' + '</IMG>' + '</A>' + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION hbide_htmlAnchor( cHref, cText, cTooltip ) + + RETURN '<A href="' + cHref + '"' + iif( empty( cTooltip ), '', ' title="' + cTooltip + '"' ) +'>' + cText + '</A>' + +/*----------------------------------------------------------------------*/ + +CLASS IdeHome INHERIT IdeObject + + DATA oWelcomeTab + DATA qWelcomeBrowser + DATA oFaqTab + DATA qFaqBrowser + + DATA cClickedProject + DATA cClickedSource + + DATA qCurBrowser + + METHOD new( oIde ) + METHOD create( oIde ) + METHOD destroy() + METHOD refresh() + METHOD execEvent( nMode, p ) + METHOD buildWelcomeTab() + METHOD activateTab( mp1, mp2, oTab ) + METHOD addProjectsInfo( aHtm ) + METHOD buildProjectDetails( cProjectTitle ) + METHOD buildSourcesInfo( cProjectTitle, aSrcInfo ) + METHOD formatSourceInfo( aHtm, aSrc ) + METHOD buildFaqTab() + METHOD setStyleSheetTextBrowser( qBrw ) + METHOD print() + METHOD paintRequested( pPrinter ) + + ENDCLASS + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:new( oIde ) + ::oIde := oIde + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:create( oIde ) + LOCAL oStatFrame + + DEFAULT oIde TO ::oIde + ::oIde := oIde + + oStatFrame := ::aViews[ 1 ] + + oStatFrame:oTabWidget:oWidget:setDocumentMode( .t. ) + oStatFrame:oTabWidget:oWidget:setStyleSheet( "QTabWidget::tab-bar {left: 5px;}" ) + oStatFrame:qLayout:setContentsMargins( 0,0,0,0 ) + + ::buildWelcomeTab() + ::buildFaqTab() + + oStatFrame:oTabWidget:oWidget:setCurrentIndex( 0 ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:destroy() + + ::disconnect( ::qWelcomeBrowser, "anchorClicked(QUrl)" ) + ::disconnect( ::qWelcomeBrowser, "customContextMenuRequested(QPoint)" ) + ::disconnect( ::qFaqBrowser , "customContextMenuRequested(QPoint)" ) + + ::qWelcomeBrowser := NIL + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:execEvent( nMode, p ) + LOCAL cAct, qUrl, cText, cExt + + DO CASE + CASE nMode == tabWidget_currentChanged + IF p == 0 + ::qCurBrowser := ::qWelcomeBrowser + ELSEIF p == 1 + ::qCurBrowser := ::qFaqBrowser + ENDIF + + CASE nMode == browserStat_anchorClicked + qUrl := QUrl():from( p ) + cText := lower( qUrl:toString() ) + + IF "prj-" $ cText + ::cClickedProject := substr( cText, 5 ) + ::buildProjectDetails( ::cClickedProject ) + + ELSEIF "fle-" $ cText + ::cClickedSource := substr( cText, 5 ) + + /* Send it for Editing */ + hb_fNameSplit( ::cClickedSource, , , @cExt ) + IF lower( cExt ) == ".hbp" + ::buildProjectDetails( ::cClickedSource ) + ELSE + ::oSM:editSource( hbide_stripFilter( ::cClickedSource ) ) + ENDIF + /* Stay on the Same Page */ + ::buildProjectDetails( ::cClickedProject ) + ENDIF + + CASE nMode == browserWelcome_contextMenuRequested .OR. nMode == browserFaq_contextMenuRequested + + IF !empty( cAct := hbide_popupBrwContextMenu( ::qCurBrowser, p ) ) + IF cAct $ "Back,Forward,Home" + ::refresh() + ELSEIF cAct == "Print" + ::print() + ENDIF + ENDIF + + ENDCASE + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:activateTab( mp1, mp2, oTab ) + + HB_SYMBOL_UNUSED( mp1 ) + HB_SYMBOL_UNUSED( mp2 ) + + IF oTab == ::oWelcomeTab + ::qCurBrowser := ::qWelcomeBrowser + ELSEIF oTab == ::oFaqTab + ::qCurBrowser := ::qFaqBrowser + ENDIF + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:print() + LOCAL qDlg + + qDlg := QPrintPreviewDialog():new( ::aViews[ 1 ]:oTabWidget ) + qDlg:setWindowTitle( "Wecome::Projects" ) + Qt_Slots_Connect( ::pSlots, qDlg, "paintRequested(QPrinter)", {|p| ::paintRequested( p ) } ) + qDlg:exec() + Qt_Slots_disConnect( ::pSlots, qDlg, "paintRequested(QPrinter)" ) + + RETURN self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:paintRequested( pPrinter ) + LOCAL qPrinter := QPrinter():configure( pPrinter ) + + ::qCurBrowser:print( qPrinter ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:setStyleSheetTextBrowser( qBrw ) + + qBrw:setStyleSheet( 'QTextBrowser { background-image: url(resources/hbidesplashwatermark.png); ' + ; + 'background-attachment: scroll; background-repeat:no-repeat; background-position:center;' + ; + 'background-color: rgb(255,255,255); }' ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:buildWelcomeTab() + LOCAL oTab, qBrw, qSList + + oTab := XbpTabPage():new( ::aViews[ 1 ], , { 5,5 }, { 700,400 }, , .t. ) + oTab:caption := "Welcome" + oTab:minimized := .F. + oTab:create() + oTab:tabActivate := {|mp1,mp2,oXbp| ::activateTab( mp1, mp2, oXbp ) } + + oTab:hbLayout := HBPLAYOUT_TYPE_VERTBOX + oTab:qLayout:setContentsMargins( 0,0,0,0 ) + + qBrw := QTextBrowser():new() + oTab:qLayout:addWidget( qBrw ) + qBrw:setContextMenuPolicy( Qt_CustomContextMenu ) + ::setStyleSheetTextBrowser( qBrw ) + + ::oWelcomeTab := oTab + ::qWelcomeBrowser := qBrw + ::qCurBrowser := qBrw + + ::connect( qBrw, "anchorClicked(QUrl)" , {|p| ::execEvent( browserStat_anchorClicked, p ) } ) + ::connect( qBrw, "customContextMenuRequested(QPoint)", {|p| ::execEvent( browserWelcome_contextMenuRequested, p ) } ) + + qSList := QStringList():new() + qSList:append( "docs" ) + qBrw:setSearchPaths( qSList ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:refresh() + LOCAL aHtm := {} + + aadd( aHtm, '<HTML>' ) + aadd( aHtm, ' <BODY align=center valign=center>' ) + aadd( aHtm, ' <TABLE cols="7" width="95%">' ) + aadd( aHtm, ' <TR>' ) + aadd( aHtm, ' <TD align="left" valign="center" colspan="5">' ) + aadd( aHtm, ' <IMG src="resources/project.png"' + '</IMG>' + ' ' + ' ' + ' ' ) + aadd( aHtm, ' <FONT face="Times New Roman" color="#FF4719" size="7"><B><U>Projects</U></B></FONT>' ) + aadd( aHtm, '  ' + ' ' + ' ' ) + aadd( aHtm, ' <FONT face="Times New Roman" size="5">' + '( ' + ::oIde:cProjIni + ' )' + '</FONT>' ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' </TR>' ) + aadd( aHtm, ' <TR bgcolor="#F0F0F5">' ) + aadd( aHtm, ' <TH width="150" >Title </TH>' ) + aadd( aHtm, ' <TH width="50" >Type </TH>' ) + aadd( aHtm, ' <TH width="75" >Sources </TH>' ) + aadd( aHtm, ' <TH width="150" >Last Modified </TH>' ) + aadd( aHtm, ' <TH >Location </TH>' ) + AADD( aHtm, ' </TR>' ) + // + ::addProjectsInfo( @aHtm ) + // + aadd( aHtm, ' </TABLE>' ) + aadd( aHtm, ' </BODY>' ) + aadd( aHtm, '</HTML>' ) + // + ::qWelcomeBrowser:clear() + // + ::qWelcomeBrowser:setHTML( hbide_arrayToMemo( aHtm ) ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:addProjectsInfo( aHtm ) + LOCAL a_, prp_, src_, dir_, cIcon + + IF empty( ::aProjects ) + aadd( aHtm, ' <TR>' ) + aadd( aHtm, ' <TD>' ) + aadd( aHtm, ' ' + 'None' ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' <TR>' ) + ELSE + FOR EACH a_ IN ::aProjects + prp_ := a_[ 3, PRJ_PRP_PROPERTIES, 1 ] + src_ := a_[ 3, PRJ_PRP_SOURCES , 1 ] + dir_ := directory( a_[ 1 ] ) + cIcon := hbide_imageForProjectType( prp_[ PRJ_PRP_TYPE ] ) + + aadd( aHtm, ' <TR>' ) + aadd( aHtm, ' <TD><B>' ) + aadd( aHtm, ' ' + hbide_htmlImgAnchor( 'prj-' + prp_[ PRJ_PRP_TITLE ], 'resources/' + cIcon + '.png' ) + ' ' ) + aadd( aHtm, ' ' + hbide_htmlAnchor( 'prj-' + prp_[ PRJ_PRP_TITLE ], prp_[ PRJ_PRP_TITLE ], a_[ 1 ] ) ) + aadd( aHtm, ' </B></TD>' ) + aadd( aHtm, ' <TD align=left>' ) + aadd( aHtm, ' ' + left( prp_[ PRJ_PRP_TYPE ], 3 ) ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' <TD align=right>' ) + aadd( aHtm, ' ' + hb_ntos( len( src_ ) ) ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' <TD align=center>' ) + aadd( aHtm, ' ' + dtoc( dir_[ 1,3 ] ) + " " + dir_[ 1,4 ] ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' <TD align=right>' ) + aadd( aHtm, ' ' + hbide_pathNormalized( a_[ 1 ] ) ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' </TR>' ) + NEXT + ENDIF + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:buildProjectDetails( cProjectTitle ) + LOCAL aSrc, cSrc, dir_, cRoot, cExt, cIcon, cName, cPath + LOCAL aSrcInfo := {}, a_:= {} + + aSrc := ::oPM:getSourcesByProjectTitle( cProjectTitle ) + cRoot := ::oPM:getProjectPathFromTitle( cProjectTitle ) + + FOR EACH cSrc IN aSrc + aadd( a_, hbide_syncProjPath( cRoot, cSrc ) ) + NEXT + a_ := hbide_groupSources( "org", a_ ) + FOR EACH cSrc IN a_ + hb_fNameSplit( cSrc, @cPath, @cName, @cExt ) + cExt := lower( cExt ) + cIcon := hbide_imageForFileType( cExt ) + IF !empty( dir_:= directory( cSrc ) ) + // bytes date time + aadd( aSrcInfo, { cSrc, hbide_pathNormalized( cPath ), cName, cExt, cIcon, dir_[ 1,2 ], dir_[ 1,3 ], dir_[ 1,4 ] } ) + ENDIF + NEXT + + IF !empty( aSrcInfo ) + ::buildSourcesInfo( cProjectTitle, aSrcInfo ) + ELSE + ::refresh() + ENDIF + + RETURN aSrcInfo + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:buildSourcesInfo( cProjectTitle, aSrcInfo ) + LOCAL aHtm := {}, aSrc + LOCAL cIcon := hbide_imageForProjectType( ::oPM:getProjectTypeFromTitle( cProjectTitle ) ) + + aadd( aHtm, '<HTML>' ) + aadd( aHtm, ' <BODY ALIGN=center VALIGN=center>' ) + aadd( aHtm, ' <TABLE COLS="7" WIDTH="95%">' ) + aadd( aHtm, ' <TR><TD align=left>' ) + aadd( aHtm, ' <IMG src="' + 'resources/' + cIcon + '.png' + '"' + '</IMG>' + ' ' + ' ' + ' ' ) + aadd( aHtm, ' <FONT color="#FF4719" size=5><U>' + cProjectTitle + '</U></FONT>' ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' <TR bgcolor="#F0F0F5">' ) + aadd( aHtm, ' <TH width="150" >Source</TH>' ) + aadd( aHtm, ' <TH width="50" >Type</TH>' ) + aadd( aHtm, ' <TH width="60" >Size</TH>' ) + aadd( aHtm, ' <TH width="150" >Last Modified</TH>' ) + aadd( aHtm, ' <TH >Location</TH>' ) + AADD( aHtm, ' </TR>' ) + // + FOR EACH aSrc IN aSrcInfo + ::formatSourceInfo( @aHtm, aSrc ) + NEXT + // + aadd( aHtm, ' </TABLE>' ) + aadd( aHtm, ' </BODY>' ) + aadd( aHtm, '</HTML>' ) + // + ::qWelcomeBrowser:clear() + // + ::qWelcomeBrowser:setHTML( hbide_arrayToMemo( aHtm ) ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:formatSourceInfo( aHtm, aSrc ) + + aadd( aHtm, ' <TR>' ) + aadd( aHtm, ' <TD><B>' ) + aadd( aHtm, ' ' + hbide_htmlImgAnchor( 'fle-' + aSrc[ 1 ], 'resources/' + aSrc[ 5 ] + '.png' ) + ' ' ) + aadd( aHtm, ' ' + hbide_htmlAnchor( 'fle-' + aSrc[ 1 ], aSrc[ 3 ], aSrc[ 1 ] ) ) + aadd( aHtm, ' </B></TD>' ) + aadd( aHtm, ' <TD>' ) + aadd( aHtm, ' ' + aSrc[ 4 ] ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' <TD align=right>' ) + aadd( aHtm, ' ' + hb_ntos( aSrc[ 6 ] ) ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' <TD align=center>' ) + aadd( aHtm, ' ' + dtoc( aSrc[ 7 ] ) + " " + aSrc[ 8 ] ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' <TD align=right>' ) + aadd( aHtm, ' ' + aSrc[ 2 ] ) + aadd( aHtm, ' </TD>' ) + aadd( aHtm, ' </TR>' ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeHome:buildFaqTab() + LOCAL oTab, qBrw, aFaq, aHtm, a_, b_, s + + oTab := XbpTabPage():new( ::aViews[ 1 ], , { 5,5 }, { 700,400 }, , .t. ) + oTab:caption := "FAQ's" + oTab:minimized := .F. + oTab:create() + oTab:tabActivate := {|mp1,mp2,oXbp| ::activateTab( mp1, mp2, oXbp ) } + + oTab:hbLayout := HBPLAYOUT_TYPE_VERTBOX + oTab:qLayout:setContentsMargins( 0,0,0,0 ) + + qBrw := QTextBrowser():new() + oTab:qLayout:addWidget( qBrw ) + qBrw:setContextMenuPolicy( Qt_CustomContextMenu ) + ::setStyleSheetTextBrowser( qBrw ) + + ::connect( qBrw, "customContextMenuRequested(QPoint)", {|p| ::execEvent( browserFaq_contextMenuRequested, p ) } ) + + ::oFaqTab := oTab + ::qFaqBrowser := qBrw + + aFaq := hbide_getFaqs() ; a_:= aFaq[ 1 ]; b_:= aFaq[ 2 ] + aHtm := {} + + aadd( aHtm, '<HTML>' ) + aadd( aHtm, ' <BODY ALIGN=center VALIGN=center>' ) + aadd( aHtm, ' <TABLE COLS="7" WIDTH="95%">' ) + FOR EACH s IN a_ + aadd( aHtm, ' <TR><TD></TD></TR>' ) + aadd( aHtm, ' <TR><TD>' ) + aadd( aHtm, ' <FONT color="red" size=4>' + s + '</FONT>' ) + aadd( aHtm, ' </TD></TR>' ) + aadd( aHtm, ' <TR><TD>' ) + aadd( aHtm, ' <FONT color="black" size=3>' + b_[ s:__enumIndex() ] + '</FONT>' ) + aadd( aHtm, ' </TD></TR>' ) + NEXT + aadd( aHtm, ' </TABLE>' ) + aadd( aHtm, ' </BODY>' ) + aadd( aHtm, '</HTML>' ) + // + ::qFaqBrowser:clear() + // + ::qFaqBrowser:setHTML( hbide_arrayToMemo( aHtm ) ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION hbide_getFaqs() + LOCAL a_:= {}, b_:= {} + + aadd( a_, 'Does hbIDE support editing of same source at more than one place simultaneously ?' ) + aadd( b_, 'Yes. hbIDE provides for splitting an editing window, horizontally and vertically, ' + ; + 'both ways. Right-click anywhere in the editor, point to "Split..." and then ' + ; + 'click on required option.' ) + + aadd( a_, 'Does hbIDE support session management ?' ) + aadd( b_, 'Yes. And in a unique way. It provides to construct n number of "Panels" where you can spread ' + ; + 'sources. Each panel is given a name as well as corresponding button on the left-toolbar, a colored ' + ; + 'circle, to bring it forward. New panel can be created from selecting "New..." from drop-down ' + ; + 'list on top-toolbar and providing a name in the editing dialog. For this reason you will never ' + ; + 'need to exit hbIDE and reenter again. It is a big productivity boost.' ) + + RETURN { a_, b_ } + +/*----------------------------------------------------------------------*/ + diff --git a/harbour/contrib/hbide/idemisc.prg b/harbour/contrib/hbide/idemisc.prg index f60ff3e3d3..69c1d8b19e 100644 --- a/harbour/contrib/hbide/idemisc.prg +++ b/harbour/contrib/hbide/idemisc.prg @@ -153,8 +153,8 @@ FUNCTION hbide_execPopup( aPops, aqPos, qParent ) ENDIF qPop := NIL - - RETURN xRet + hbide_justACall( xRet ) + RETURN cAct /*----------------------------------------------------------------------*/ @@ -1411,7 +1411,7 @@ STATIC FUNCTION hbide_HBPStrStripQuote( cString ) STATIC FUNCTION hbide_HBPExtGet( cFileName ) LOCAL cExt - hb_FNameSplit( cFileName,,, @cExt ) + hb_FNameSplit( cFileName, , , @cExt ) RETURN cExt @@ -1722,3 +1722,285 @@ FUNCTION hbide_syncProjPath( cRoot, cSource ) RETURN cRoot + cSource /*----------------------------------------------------------------------*/ + +FUNCTION hbide_popupBrwContextMenu( qTextBrowser, p ) + LOCAL aMenu := {} + + aadd( aMenu, { "Back" , {|| qTextBrowser:backward() } } ) + aadd( aMenu, { "Forward" , {|| qTextBrowser:forward() } } ) + aadd( aMenu, { "Home" , {|| qTextBrowser:home() } } ) + aadd( aMenu, { "" } ) + aadd( aMenu, { "Reload" , {|| qTextBrowser:reload() } } ) + aadd( aMenu, { "" } ) + aadd( aMenu, { "Select All", {|| qTextBrowser:selectAll() } } ) + aadd( aMenu, { "Copy" , {|| qTextBrowser:copy() } } ) + aadd( aMenu, { "Print" , {|| NIL } } ) + + RETURN hbide_execPopup( aMenu, p, qTextBrowser ) + +/*----------------------------------------------------------------------*/ + +FUNCTION hbide_groupSources( cMode, a_ ) + LOCAL cTyp, s, d_, n + LOCAL aSrc := { ".prg", ".c", ".cpp", ".h", ".ch", ".hbp", ".hbc", ".rc", ".res", ".obj", ".o", ".lib", ".a" } + LOCAL aTxt := { {} , {} , {} , {} , {} , {} , {} , {} , {} , {} , {} , {} , {} } + LOCAL aRst := {} + + IF cMode == "az" + asort( a_, , , {|e,f| lower( hbide_stripFilter( e ) ) < lower( hbide_stripFilter( f ) ) } ) + ELSEIF cMode == "za" + asort( a_, , , {|e,f| lower( hbide_stripFilter( f ) ) < lower( hbide_stripFilter( e ) ) } ) + ELSEIF cMode == "org" + asort( a_, , , {|e,f| lower( hbide_stripFilter( e ) ) < lower( hbide_stripFilter( f ) ) } ) + + FOR EACH s IN a_ + s := alltrim( s ) + IF left( s, 1 ) != "#" + cTyp := hbide_sourceType( s ) + + IF ( n := ascan( aSrc, {|e| cTyp == e } ) ) > 0 + aadd( aTxt[ n ], s ) + ELSE + aadd( aRst, s ) + ENDIF + ENDIF + NEXT + + a_:= {} + FOR EACH d_ IN aTxt + IF !empty( d_ ) + FOR EACH s IN d_ + aadd( a_, s ) + NEXT + ENDIF + NEXT + IF !empty( aRst ) + FOR EACH s IN aRst + aadd( a_, s ) + NEXT + ENDIF + ENDIF + + RETURN a_ + +/*----------------------------------------------------------------------*/ + +FUNCTION hbide_imageForProjectType( cType ) + cType := left( cType, 8 ) + RETURN iif( cType == "Lib", "fl_lib", iif( cType == "Dll", "fl_dll", "fl_exe" ) ) + +/*----------------------------------------------------------------------*/ + +FUNCTION hbide_imageForFileType( cType ) + cType := lower( cType ) + SWITCH cType + CASE ".exe" + RETURN "fl_exe" + CASE ".lib" + CASE ".a" + RETURN "fl_lib" + CASE ".rc" + CASE ".res" + RETURN "source_res" //"fl_res" + CASE ".prg" + RETURN "source_prg" //"fl_prg" + CASE ".c" + RETURN "source_c" + CASE ".cpp" + RETURN "source_cpp" //"fl_c" + CASE ".o" + CASE ".obj" + RETURN "source_o" //"fl_obj" + CASE ".hbp" + RETURN "project" + CASE ".hbc" + RETURN "envconfig" + CASE ".h" + CASE ".ch" + RETURN "source_h" + OTHERWISE + RETURN "source_unknown" //"fl_txt" + ENDSWITCH + RETURN NIL + +/*----------------------------------------------------------------------*/ +/* Borrowed from hbmk2.prg - thanks Viktor */ + +PROCEDURE convert_xhp_to_hbp( cSrcName, cDstName ) + LOCAL cSrc := MemoRead( cSrcName ) + LOCAL cDst + LOCAL aDst := {} + LOCAL tmp + LOCAL cLine + LOCAL cSetting + LOCAL cValue + LOCAL aValue + LOCAL cFile + + LOCAL hLIBPATH := {=>} + + LOCAL cMAIN := NIL + + LOCAL lFileSection := .F. + + IF empty( cDstName ) + cDstName := FN_ExtSet( cSrcName, ".hbp" ) + ENDIF + + cSrc := StrTran( cSrc, Chr( 13 ) + Chr( 10 ), Chr( 10 ) ) + cSrc := StrTran( cSrc, Chr( 9 ), Chr( 32 ) ) + + FOR EACH cLine IN hb_ATokens( cSrc, Chr( 10 ) ) + IF cLine == "[Files]" + lFileSection := .T. + ELSEIF lFileSection + tmp := At( "=", cLine ) + IF tmp > 0 + cFile := AllTrim( Left( cLine, tmp - 1 ) ) + SWITCH Lower( FN_ExtGet( cFile ) ) + CASE ".c" + CASE ".prg" + IF !( "%HB_INSTALL%\" $ cFile ) + AAdd( aDst, StrTran( cFile, "%HOME%\" ) ) + ENDIF + EXIT + CASE ".lib" + CASE ".a" + IF !( "%C_LIB_INSTALL%\" $ cFile ) .AND. ; + !( "%HB_LIB_INSTALL%\" $ cFile ) + cFile := StrTran( cFile, "%HOME%\" ) + IF !( FN_DirGet( cFile ) $ hLIBPATH ) + hLIBPATH[ FN_DirGet( cFile ) ] := NIL + ENDIF + AAdd( aDst, "-l" + FN_NameGet( cFile ) ) + ENDIF + EXIT + CASE ".obj" + CASE ".o" + IF !( "%C_LIB_INSTALL%\" $ cFile ) .AND. ; + !( "%HB_LIB_INSTALL%\" $ cFile ) + AAdd( aDst, StrTran( cFile, "%HOME%\" ) ) + ENDIF + EXIT + ENDSWITCH + ENDIF + ELSE + tmp := At( "=", cLine ) + IF tmp > 0 + cSetting := AllTrim( Left( cLine, tmp - 1 ) ) + cValue := AllTrim( SubStr( cLine, tmp + Len( "=" ) ) ) + aValue := hb_ATokens( cValue ) + IF ! Empty( cValue ) + SWITCH cSetting + CASE "Create Map/List File" + IF cValue == "Yes" + AAdd( aDst, "-map" ) + ENDIF + EXIT + CASE "Final Path" + IF ! Empty( cValue ) + AAdd( aDst, "-o" + DirAddPathSep( StrTran( cValue, "%HOME%\" ) ) ) + ENDIF + EXIT + CASE "Include" + FOR EACH tmp IN aValue + IF Left( tmp, 2 ) == "-I" + tmp := SubStr( tmp, 3 ) + ENDIF + AAdd( aDst, "-incpath=" + StrTran( StrTran( tmp, Chr( 34 ) ), "%HOME%\" ) ) + NEXT + EXIT + CASE "Define" + FOR EACH tmp IN aValue + IF Left( tmp, 2 ) == "-D" + tmp := SubStr( tmp, 3 ) + ENDIF + AAdd( aDst, "-D" + tmp ) + NEXT + EXIT + CASE "Params" + FOR EACH tmp IN aValue + AAdd( aDst, "-runflag=" + tmp ) + NEXT + EXIT + ENDSWITCH + ENDIF + ENDIF + ENDIF + NEXT + + FOR EACH tmp IN hLIBPATH + AAdd( aDst, "-L" + tmp:__enumKey() ) + NEXT + + cDst := "" + FOR EACH tmp IN aDst + cDst += tmp + hb_osNewLine() + NEXT + + hb_MemoWrit( cDstName, cDst ) + + RETURN + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION FN_DirGet( cFileName ) + LOCAL cDir + + hb_FNameSplit( cFileName, @cDir ) + + RETURN cDir + +STATIC FUNCTION FN_NameGet( cFileName ) + LOCAL cName + + hb_FNameSplit( cFileName,, @cName ) + + RETURN cName + +STATIC FUNCTION FN_NameExtGet( cFileName ) + LOCAL cName, cExt + + hb_FNameSplit( cFileName,, @cName, @cExt ) + + RETURN hb_FNameMerge( NIL, cName, cExt ) + +STATIC FUNCTION FN_ExtGet( cFileName ) + LOCAL cExt + + hb_FNameSplit( cFileName,,, @cExt ) + + RETURN cExt + +STATIC FUNCTION FN_ExtDef( cFileName, cDefExt ) + LOCAL cDir, cName, cExt + + hb_FNameSplit( cFileName, @cDir, @cName, @cExt ) + IF Empty( cExt ) + cExt := cDefExt + ENDIF + + RETURN hb_FNameMerge( cDir, cName, cExt ) + +STATIC FUNCTION FN_ExtSet( cFileName, cExt ) + LOCAL cDir, cName + + hb_FNameSplit( cFileName, @cDir, @cName ) + + RETURN hb_FNameMerge( cDir, cName, cExt ) + +STATIC FUNCTION FN_DirExtSet( cFileName, cDirNew, cExtNew ) + LOCAL cDir, cName, cExt + + hb_FNameSplit( cFileName, @cDir, @cName, @cExt ) + + IF cDirNew != NIL + cDir := cDirNew + ENDIF + IF cExtNew != NIL + cExt := cExtNew + ENDIF + + RETURN hb_FNameMerge( cDir, cName, cExt ) + +/*----------------------------------------------------------------------*/ diff --git a/harbour/contrib/hbide/ideobject.prg b/harbour/contrib/hbide/ideobject.prg index a1970dbc9d..8b09491232 100644 --- a/harbour/contrib/hbide/ideobject.prg +++ b/harbour/contrib/hbide/ideobject.prg @@ -91,6 +91,7 @@ CLASS IdeObject ACCESS oSM INLINE ::oIde:oSM ACCESS oEV INLINE ::oIde:oEV ACCESS oHL INLINE ::oIde:oHL + ACCESS oHM INLINE ::oIde:oHM ACCESS oFindDock INLINE ::oIde:oFindDock ACCESS oFindInFiles INLINE ::oIde:oFindInFiles @@ -143,7 +144,6 @@ CLASS IdeObject ACCESS aViews INLINE ::oIde:aViews ACCESS aSkltns INLINE ::oIde:aSkltns - ACCESS nCurView INLINE ::oIde:nCurView ACCESS nTabSpaces INLINE ::oIde:nTabSpaces ACCESS cTabSpaces INLINE ::oIde:cTabSpaces ACCESS cSeparator INLINE ::oIde:cSeparator diff --git a/harbour/contrib/hbide/ideprojmanager.prg b/harbour/contrib/hbide/ideprojmanager.prg index ba4830171a..923aba61ba 100644 --- a/harbour/contrib/hbide/ideprojmanager.prg +++ b/harbour/contrib/hbide/ideprojmanager.prg @@ -238,6 +238,7 @@ CLASS IdeProjManager INHERIT IdeObject METHOD getProjectProperties( cProjectTitle ) METHOD getProjectByFile( cProjectFile ) METHOD getProjectFileNameFromTitle( cProjectTitle ) + METHOD getProjectTypeFromTitle( cProjectTitle ) METHOD getProjectPathFromTitle( cProjectTitle ) METHOD getProjectByTitle( cProjectTitle ) METHOD getSourcesByProjectTitle( cProjectTitle ) @@ -248,12 +249,12 @@ CLASS IdeProjManager INHERIT IdeObject METHOD launchProject( cProject, cExe ) METHOD showOutput( cOutput, mp2, oProcess ) METHOD finished( nExitCode, nExitStatus, oProcess ) - METHOD loadXhpProject() METHOD loadHbpProject( cHbp ) METHOD isValidProjectLocation( lTell ) METHOD setProjectLocation( cPath ) METHOD buildInterface() METHOD pullHbpData( cHbp ) + METHOD synchronizeAlienProject( cProjFileName ) ENDCLASS @@ -299,20 +300,11 @@ METHOD IdeProjManager:populate() /*----------------------------------------------------------------------*/ METHOD IdeProjManager:getProperties() - LOCAL aPrj, cHbi, cTmp, n + LOCAL cTmp, n - IF Empty( ::cWrkProject ) - MsgBox( 'No active project detected' ) - ENDIF cTmp := ::getCurrentProject() IF ( n := ascan( ::aProjects, {|e_| e_[ 3, PRJ_PRP_PROPERTIES, 2, E_oPrjTtl ] == cTmp } ) ) > 0 - aPrj := ::aProjects[ n, 3 ] - cHbi := aPrj[ PRJ_PRP_PROPERTIES, 2, PRJ_PRP_LOCATION ] + ::pathSep + ; - aPrj[ PRJ_PRP_PROPERTIES, 2, PRJ_PRP_OUTPUT ] + ".hbp" - - ::loadProperties( cHbi, .f., .t., .t. ) - ELSE - MsgBox( 'Invalid project: ' + cTmp ) + ::loadProperties( ::aProjects[ n, 1 ], .f., .t., .t. ) ENDIF RETURN Self @@ -340,7 +332,9 @@ METHOD IdeProjManager:loadProperties( cProjFileName, lNew, lFetch, lUpdateTree ) lFetch := .t. ELSE IF empty( cProjFileName ) - cProjFileName := hbide_fetchAFile( ::oDlg, "Load Project...", { { "Harbour IDE Projects (*.hbp)", "*.hbp" } } ) + cProjFileName := hbide_fetchAFile( ::oDlg, "Open Project...", { { "Harbour Projects (*.hbp)", "*.hbp" } , ; + { "xMate Projects (*.xhp)" , "*.xhp" } } ) + cProjFileName := ::synchronizeAlienProject( cProjFileName ) ENDIF IF empty( cProjFileName ) RETURN Self @@ -362,24 +356,22 @@ METHOD IdeProjManager:loadProperties( cProjFileName, lNew, lFetch, lUpdateTree ) ::oPropertiesDock:hide() ::oPropertiesDock:show() ELSE - IF nAlready == 0 .AND. !empty( ::aPrjProps ) - aadd( ::oIDE:aProjects, { hbide_pathNormalized( cProjFileName ), cProjFileName, aclone( ::aPrjProps ) } ) - IF lUpdateTree - ::oIDE:updateProjectTree( ::aPrjProps ) + IF !empty( ::aPrjProps ) + IF nAlready == 0 + aadd( ::oIDE:aProjects, { hbide_pathNormalized( cProjFileName ), cProjFileName, aclone( ::aPrjProps ) } ) + IF lUpdateTree + ::oIDE:updateProjectTree( ::aPrjProps ) + ENDIF + hbide_mnuAddFileToMRU( ::oIDE, cProjFileName, INI_RECENTPROJECTS ) + ELSE + ::aProjects[ nAlready, 3 ] := aclone( ::aPrjProps ) + IF lUpdateTree + ::oIDE:updateProjectTree( ::aPrjProps ) + ENDIF ENDIF - hbide_mnuAddFileToMRU( ::oIDE, cProjFileName, INI_RECENTPROJECTS ) - ELSE - ::aProjects[ nAlready, 3 ] := aclone( ::aPrjProps ) - IF lUpdateTree - ::oIDE:updateProjectTree( ::aPrjProps ) - ENDIF - #if 0 - IF lUpdateTree .AND. ::aPrjProps[ PRJ_PRP_PROPERTIES, 2, E_qPrjType ] <> t - MsgBox( "::removeProjectFromTree( ::aPrjProps )" ) - ENDIF - #endif ENDIF + ::oHM:refresh() /* Rearrange Projects Data */ ENDIF RETURN Self @@ -596,25 +588,24 @@ METHOD IdeProjManager:save( lCanClose ) ::cSaveTo := ::oUI:q_editPrjLoctn:text() + ::pathSep + ::oUI:q_editOutName:text() + ".hbp" ::cSaveTo := hbide_pathToOSPath( ::cSaveTo ) -hbide_dbg( ::lUpdateTree, ::cSaveTo ) + IF ( lOk := hbide_createTarget( ::cSaveTo, txt_ ) ) ::aPrjProps := ::pullHbpData( hbide_pathToOSPath( ::cSaveTo ) ) IF ( nAlready := ascan( ::aProjects, {|e_| e_[ 1 ] == hbide_pathNormalized( ::cSaveTo ) } ) ) == 0 -hbide_dbg( nAlready, ::lUpdateTree, ::cSaveTo ) aadd( ::oIDE:aProjects, { hbide_pathNormalized( ::cSaveTo ), ::cSaveTo, aclone( ::aPrjProps ) } ) IF ::lUpdateTree ::oIDE:updateProjectTree( ::aPrjProps ) ENDIF hbide_mnuAddFileToMRU( ::oIDE, ::cSaveTo, INI_RECENTPROJECTS ) ELSE -hbide_dbg( nAlready, ::lUpdateTree, ::cSaveTo ) ::aProjects[ nAlready, 3 ] := aclone( ::aPrjProps ) IF ::lUpdateTree ::oIDE:updateProjectTree( ::aPrjProps ) ENDIF ENDIF + ::oHM:refresh() /* Rearrange Projects Data */ ELSE MsgBox( 'Error saving project file: ' + ::cSaveTo, 'Error saving project ...' ) @@ -749,7 +740,6 @@ METHOD IdeProjManager:buildInterface() ::oUI:q_buttonChooseWd :setIcon( cLukupPng ) ::oUI:q_buttonChooseDest :setIcon( cLukupPng ) ::oUI:q_buttonBackup :setIcon( cLukupPng ) - ::oUI:q_buttonXmate :setIcon( hbide_image( "xmate" ) ) ::oUI:q_buttonSelect :setIcon( hbide_image( "open" ) ) ::oUI:q_buttonSort :setIcon( hbide_image( "sort" ) ) @@ -771,7 +761,6 @@ METHOD IdeProjManager:buildInterface() ::oUI:signal( "buttonChooseWd" , "clicked()", {|| ::PromptForPath( 'editWrkFolder', 'Choose Working Folder...' ) } ) ::oUI:signal( "buttonChooseDest" , "clicked()", {|| ::PromptForPath( 'editDstFolder', 'Choose Destination Folder...' ) } ) ::oUI:signal( "buttonBackup" , "clicked()", {|| ::PromptForPath( 'editBackup' , 'Choose Backup Folder...' ) } ) - ::oUI:signal( "buttonXmate" , "clicked()", {|| ::loadXhpProject() } ) ::oUI:signal( "editPrjLoctn" , "textChanged(QString)", {|cPath| ::setProjectLocation( cPath ) } ) @@ -779,167 +768,28 @@ METHOD IdeProjManager:buildInterface() /*----------------------------------------------------------------------*/ -METHOD IdeProjManager:loadXhpProject() - LOCAL cXhp, a_, s, n, cPart, cKey, cVal - LOCAL cHome, cOutname, cType, cDefine, cInclude - LOCAL cRun, cParams, cDestntn, cMap - LOCAL cPath, cFile, cExt - LOCAL hLIBPATH := {=>} - LOCAL aLibs := {}, aFlags := {}, aFiles := {}, aSrc := {} +METHOD IdeProjManager:synchronizeAlienProject( cProjFileName ) + LOCAL cPath, cFile, cExt, cHbp - cXhp := hbide_fetchAFile( ::oDlg, "Selecet xMate Project File", { { "xMate Project Files", "*.xhp" } } ) - - IF empty( cXhp ) - RETURN Self + hb_fNameSplit( cProjFileName, @cPath, @cFile, @cExt ) + IF lower( cExt ) == ".hbp" /* Nothing to do */ + RETURN cProjFileName ENDIF - hb_fNameSplit( cXhp, @cHome, @cOutName ) - cHome := hbide_pathStripLastSlash( cHome ) - a_:= hbide_readSource( cXhp ) - - cPart := "" - FOR EACH s IN a_ - s := alltrim( s ) - IF empty( s ) - LOOP - ENDIF - IF left( s, 1 ) == "[" - IF ( n := at( "]", s ) ) > 0 - cPart := substr( s, 2, n-2 ) - ELSE - cPart := "" - ENDIF - ELSE - SWITCH lower( cPart ) - CASE "version" - EXIT - CASE "xmate" - IF hbide_parseKeyValPair( s, @cKey, @cVal ) - IF cKey == "Create Map/List File" .AND. cVal == "Yes" - cMap := "-map" - ENDIF - ENDIF - EXIT - CASE "info" - IF hbide_parseKeyValPair( s, @cKey, @cVal ) - SWITCH lower( cKey ) - CASE "type" - cType := cVal - EXIT - CASE "include" - cInclude := cVal - EXIT - CASE "define" - cDefine := cVal - EXIT - CASE "architecture" - EXIT - ENDSWITCH - ENDIF - EXIT - CASE "xmate" - EXIT - CASE "project" - IF hbide_parseKeyValPair( s, @cKey, @cVal ) - SWITCH lower( cKey ) - CASE "run" - cRun := cVal - EXIT - CASE "params" - cParams := cVal - EXIT - CASE "final path" - cDestntn := hbide_pathStripLastSlash( cVal ) - EXIT - ENDSWITCH - ENDIF - EXIT - CASE "data path" - EXIT - CASE "editor" - EXIT - CASE "files" - IF hbide_parseKeyValPair( s, @cKey, @cVal ) - aadd( aFiles, cKey ) - ENDIF - EXIT - ENDSWITCH - ENDIF - NEXT - - /* Basic Parsing is complete , parse paths from keywords */ - SWITCH cType - CASE "Executable" - ::oUI:q_comboPrjType:setCurrentIndex( 0 ) - EXIT - CASE "Library" - ::oUI:q_comboPrjType:setCurrentIndex( 1 ) - EXIT - CASE "Dll" - ::oUI:q_comboPrjType:setCurrentIndex( 2 ) - EXIT - OTHERWISE - ::oUI:q_comboPrjType:setCurrentIndex( 0 ) - EXIT - ENDSWITCH - - ::oUI:q_editPrjTitle :setText( cOutName ) - ::oUI:q_editPrjLoctn :setText( cHome ) -* ::oUI:q_editWrkFolder:setText( "" ) - ::oUI:q_editDstFolder:setText( iif( cDestntn == "%HOME%", cHome, strtran( cDestntn, "%HOME%\", ) ) ) -* ::oUI:q_editBackup :setText( "" ) - ::oUI:q_editOutName :setText( cOutName ) - ::oUI:q_editLaunchParams:setText( cParams ) - ::oUI:q_editLaunchExe:setText( cRun ) - - IF !empty( cMap ) - aadd( aFlags, cMap ) - endif - aadd( aFlags, "-inc" ) - IF !empty( cDefine ) - FOR EACH s IN hb_aTokens( cDefine, ";" ) - IF !empty( s ) - aadd( aFlags, "-D" + StrTran( s, "%HOME%\", ) ) - ENDIF - NEXT + IF !( lower( cExt ) $ ".xhp" ) /* Not a valid alien project file */ + RETURN "" ENDIF - IF !empty( cInclude ) - FOR EACH s IN hb_aTokens( cInclude, ";" ) - IF !empty( s ) - IF !( "%HB_INSTALL%" $ s .OR. "%HB_LIB_INSTALL%" $ s .OR. "%C_LIB_INSTALL%" $ s ) - aadd( aFlags, "-incpath=" + StrTran( s, "%HOME%\", ) ) - ENDIF - ENDIF - NEXT - ENDIF - FOR EACH s IN aFiles - IF !( "%HB_INSTALL%" $ s .OR. "%HB_LIB_INSTALL%" $ s .OR. "%C_LIB_INSTALL%" $ s ) - hb_fNameSplit( s, @cPath, @cFile, @cExt ) - SWITCH lower( cExt ) - CASE ".lib" - CASE ".a" - IF !( cPath $ hLIBPATH ) - hLIBPATH[ cPath ] := NIL - ENDIF - aadd( aLibs, cFile ) - EXIT - OTHERWISE - aadd( aSrc, StrTran( s, "%HOME%\", ) ) - EXIT - ENDSWITCH + + cHbp := cPath + cFile + ".hbp" + IF hb_fileExists( cHbp ) + IF ! hbide_getYesNo( "A .hbp with convered name already exists, overwrite ?", "", "Project exists" ) + RETURN "" ENDIF - NEXT - FOR EACH s IN hLIBPATH - aadd( aFlags, "-L" + s:__enumKey() ) - NEXT - FOR EACH s IN aLibs - aadd( aFlags, "-l" + s ) - NEXT + ENDIF - ::oUI:q_editFlags :setPlainText( hbide_arrayToMemo( aFlags ) ) - ::oUI:q_editSources:setPlainText( hbide_arrayToMemo( aSrc ) ) + convert_xhp_to_hbp( cProjFileName, cHbp ) - RETURN Self + RETURN cHbp /*----------------------------------------------------------------------*/ @@ -1142,23 +992,18 @@ METHOD IdeProjManager:selectCurrentProject() RETURN ::cWrkProject ENDIF - #ifdef HBIDE_USE_UIC oDlg := HbQtUI():new( ::oIDE:resPath + "selectproject.uic", ::oDlg:oWidget ):build() - #else - oDlg := HbQtUI():new( ::oIDE:resPath + "selectproject.ui", ::oDlg:oWidget ):create() - #endif * Fill ComboBox with current project names FOR EACH p IN ::aProjects - IF !empty( t := p[ 3, PRJ_PRP_PROPERTIES, 2, E_oPrjTtl ] ) - oDlg:qObj[ "cbProjects" ]:addItem( t ) - ENDIF + IF !empty( t := p[ 3, PRJ_PRP_PROPERTIES, 2, E_oPrjTtl ] ) + oDlg:qObj[ "cbProjects" ]:addItem( t ) + ENDIF NEXT + oDlg:signal( "btnCancel", "clicked()", {|| oDlg:oWidget:close() } ) oDlg:signal( "btnOk" , "clicked()", {|| ::setCurrentProject( oDlg:qObj[ "cbProjects" ]:currentText() ), ; oDlg:oWidget:close() } ) - oDlg:signal( "btnCancel", "clicked()", {|| oDlg:oWidget:close() } ) - oDlg:exec() oDlg:destroy() oDlg := NIL @@ -1202,6 +1047,17 @@ METHOD IdeProjManager:getProjectByFile( cProjectFile ) /*----------------------------------------------------------------------*/ +METHOD IdeProjManager:getProjectTypeFromTitle( cProjectTitle ) + LOCAL n, cType := "" + + IF ( n := ascan( ::aProjects, {|e_, x| x := e_[ 3 ], x[ 1, 2, PRJ_PRP_TITLE ] == cProjectTitle } ) ) > 0 + cType := ::aProjects[ n, 3, PRJ_PRP_PROPERTIES, 1, PRJ_PRP_TYPE ] + ENDIF + + RETURN cType + +/*----------------------------------------------------------------------*/ + METHOD IdeProjManager:getProjectPathFromTitle( cProjectTitle ) LOCAL cPath diff --git a/harbour/contrib/hbide/idesaveload.prg b/harbour/contrib/hbide/idesaveload.prg index 16cf6771d5..70fdfe4106 100644 --- a/harbour/contrib/hbide/idesaveload.prg +++ b/harbour/contrib/hbide/idesaveload.prg @@ -112,15 +112,15 @@ FUNCTION hbide_saveINI( oIde ) aadd( txt_, "[FILES]" ) aadd( txt_, " " ) - FOR j := 0 TO len( oIde:aINI[ INI_VIEWS ] ) + FOR j := 2 TO len( oIde:aViews ) oIde:lClosing := .t. - oIde:oStackedWidget:oWidget:setCurrentIndex( j ) + oIde:oDK:setView( oIde:aViews[ j ]:oWidget:objectName() ) nTabs := oIde:qTabWidget:count() FOR n := 1 TO nTabs - pTab := oIde:qTabWidget:widget( n-1 ) - nTab := ascan( oIde:aTabs, {|e_| hbqt_IsEqualGcQtPointer( e_[ 1 ]:oWidget:pPtr, pTab ) } ) - oEdit := oIde:aTabs[ nTab, TAB_OEDITOR ] + pTab := oIde:qTabWidget:widget( n - 1 ) + nTab := ascan( oIde:aTabs, {|e_| hbqt_IsEqualGcQtPointer( e_[ 1 ]:oWidget:pPtr, pTab ) } ) + oEdit := oIde:aTabs[ nTab, TAB_OEDITOR ] IF !Empty( oEdit:sourceFile ) .and. !( ".ppo" == lower( oEdit:cExt ) ) IF oEdit:lLoaded @@ -348,16 +348,20 @@ FUNCTION hbide_loadINI( oIde, cHbideIni ) /*----------------------------------------------------------------------*/ STATIC FUNCTION hbide_saveSettings( oIde ) + LOCAL cPath - hbqt_QMainWindow_saveSettings( hb_dirBase() + "idesettings.ini", "hbIDE", oIde:oDlg:oWidget:pPtr ) + hb_fNameSplit( oIde:cProjIni, @cPath ) + hbqt_QMainWindow_saveSettings( cPath + "hbide.set", "hbIDE", oIde:oDlg:oWidget:pPtr ) RETURN nil /*----------------------------------------------------------------------*/ FUNCTION hbide_restSettings( oIde ) + LOCAL cPath - hbqt_QMainWindow_restSettings( hb_dirBase() + "idesettings.ini", "hbIDE", oIde:oDlg:oWidget:pPtr ) + hb_fNameSplit( oIde:cProjIni, @cPath ) + hbqt_QMainWindow_restSettings( cPath + "hbide.set", "hbIDE", oIde:oDlg:oWidget:pPtr ) RETURN nil diff --git a/harbour/contrib/hbide/idestylesheets.prg b/harbour/contrib/hbide/idestylesheets.prg index cc859e1ebf..391ca6f13d 100644 --- a/harbour/contrib/hbide/idestylesheets.prg +++ b/harbour/contrib/hbide/idestylesheets.prg @@ -134,10 +134,10 @@ FUNCTION GetStyleSheet( cWidget ) CASE cWidget == "QMenuBar" - aadd( txt_, 'QMenuBar { ' ) - aadd( txt_, ' background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, ' ) - aadd( txt_, ' stop:0 lightgray, stop:1 darkgray); ' ) - aadd( txt_, '} ' ) + * aadd( txt_, 'QMenuBar { ' ) + * aadd( txt_, ' background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, ' ) + * aadd( txt_, ' stop:0 lightgray, stop:1 darkgray); ' ) + * aadd( txt_, '} ' ) aadd( txt_, 'QMenuBar::item { ' ) aadd( txt_, ' spacing : 3px; /* spacing between menu bar items */ ' ) aadd( txt_, ' padding : 1px 4px; ' ) @@ -257,18 +257,18 @@ FUNCTION GetStyleSheet( cWidget ) aadd( txt_, ' border-top: 2px solid #C2C7CB; ' ) aadd( txt_, '} ' ) aadd( txt_, 'QTabWidget::tab-bar { ' ) - aadd( txt_, ' background: qlineargradient(x1:0, y1:1, x2:0, y2:0, ' ) - aadd( txt_, ' stop:0 lightgray, stop:1 darkgray); ' ) + * aadd( txt_, ' background: qlineargradient(x1:0, y1:1, x2:0, y2:0, ' ) + * aadd( txt_, ' stop:0 lightgray, stop:1 darkgray); ' ) aadd( txt_, ' left: 5px; /* move to the right by 5px */ ' ) aadd( txt_, '} ' ) aadd( txt_, 'QTabBar { ' ) - aadd( txt_, ' background-color: qlineargradient(x1:0, y1:1, x2:0, y2:0, ' ) - aadd( txt_, ' stop:0 lightgray, stop:1 darkgray); ' ) + * aadd( txt_, ' background-color: qlineargradient(x1:0, y1:1, x2:0, y2:0, ' ) + * aadd( txt_, ' stop:0 lightgray, stop:1 darkgray); ' ) aadd( txt_, '} ' ) aadd( txt_, 'QTabBar::tab { ' ) - aadd( txt_, ' background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, ' ) - aadd( txt_, ' stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, ' ) - aadd( txt_, ' stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); ' ) + * aadd( txt_, ' background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, ' ) + * aadd( txt_, ' stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, ' ) + * aadd( txt_, ' stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); ' ) aadd( txt_, ' border: 2px solid #94C4C3; ' ) aadd( txt_, ' border-bottom-color: #C2C7CB; /* same as the pane color */ ' ) aadd( txt_, ' border-top-left-radius: 6px; ' ) @@ -280,6 +280,7 @@ FUNCTION GetStyleSheet( cWidget ) aadd( txt_, ' background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, ' ) aadd( txt_, ' stop: 0 #fafafa, stop: 0.4 #f4f4f4, ' ) aadd( txt_, ' stop: 0.5 #e7e7e7, stop: 1.0 #fafafa); ' ) + aadd( txt_, ' background: white; ' ) aadd( txt_, ' } ' ) aadd( txt_, ' QTabBar::tab:selected:hover { ' ) aadd( txt_, ' background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, ' ) @@ -310,10 +311,9 @@ FUNCTION GetStyleSheet( cWidget ) aadd( txt_, ' border: 1px solid darkgray; ' ) aadd( txt_, ' } ' ) aadd( txt_, 'QDockWidget::title { ' ) - aadd( txt_, ' background-color: qlineargradient(x1:0, y1:1, x2:0, y2:0, ' ) - aadd( txt_, ' stop:0 lightgray, stop:1 darkgray); ' ) + aadd( txt_, ' background-color: lightgray; ' ) aadd( txt_, ' padding-left: 10px; ' ) - aadd( txt_, ' padding-top: 3px; ' ) + aadd( txt_, ' padding-top: 4px; ' ) aadd( txt_, ' } ' ) CASE cWidget == "PathIsWrong" diff --git a/harbour/contrib/hbide/idethemes.prg b/harbour/contrib/hbide/idethemes.prg index 42619ae1d7..43061272dd 100644 --- a/harbour/contrib/hbide/idethemes.prg +++ b/harbour/contrib/hbide/idethemes.prg @@ -450,14 +450,13 @@ METHOD IdeThemes:setSyntaxHilighting( qEdit, cTheme, lNew ) /*----------------------------------------------------------------------*/ METHOD IdeThemes:show() - #if 0 + #if 1 LOCAL qAct #endif IF empty( ::oUI ) ::lCreating := .t. - //::oUI := HbQtUI():new( hbide_uic( "themesex" ), ::oThemesDock:oWidget ):build() ::oUI := HbQtUI():new( hbide_uic( "themesex" ) ):build() //::oThemesDock:qtObject := Self @@ -478,7 +477,7 @@ METHOD IdeThemes:show() ::oUI:signal( "buttonClose" , "clicked()" , {|| ::oThemesDock:hide() } ) /* Fill Themes Dialog Values */ - #if 0 + #if 1 ::oUI:setWindowTitle( GetKeyValue( ::aControls, "dialogTitle" ) ) // ::oUI:qObj[ "labelItems" ]:setText( GetKeyValue( ::aControls, "labelItems" , "Items" ) ) @@ -495,7 +494,7 @@ METHOD IdeThemes:show() ::oUI:qObj[ "buttonCopy" ]:setText( GetKeyValue( ::aControls, "buttonCopy" , "Copy" ) ) #endif - #if 0 + #if 1 ::qMenuApply := QMenu():new() // qAct := QAction():new( ::qMenuApply ) diff --git a/harbour/contrib/hbide/resources/fl_c.png b/harbour/contrib/hbide/resources/fl_c.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4d110a82bd6a5c48e416c366bbf99062ef0444 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6-vo-U3d z7XDL%0>usp@NAy_K4WjB_$EnR*LnO~CbCRlwM@Bz;g0ZzTS}o#>mLeaxVN<Q<p)e_ zJ1-)!p=gfkl~)?EN=!^wHziDOT$}%NzCK5;&>6{O=Y^iTmL5>iZdJ;6a-Y^yt#_E` v-`2{hhcA5O-?IHkzrf<^9i7t;eq$Ec@mGW2e9;x4I~Y7&{an^LB{Ts5dyYrr literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/fl_dll.png b/harbour/contrib/hbide/resources/fl_dll.png new file mode 100644 index 0000000000000000000000000000000000000000..4a922d94332953ed971df63d180916c168c05749 GIT binary patch literal 826 zcmV-A1I7G_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00094Nkl<Zc-noF z$!il~7{;HO$z&N@m558N7Lf=_F_<Aq<5H`sOFT#~Mck?d?czaPKo1^8Jc#%wh#+|A za%rt}lGda)RcW1or6?+`R$FV+*e12nOfrk#Okza^ANc0|X87he^DYksqEmHswVchi zPSrFG1ubrf7>1$8Mn_}8P^b@oiPA4m2L@hl-?77q|B0{<1_Cv~V6fvKz~kOtaj)Oc z%d-5>OU5CZ#!NhpH6<n3U0E6Ek4A+*0KGju1|XNqkp~oLiULEHs;F3yG9=1KBoeS$ zt*}@u2pl@JM~ub#76Cn>kXY@n=D+<&Bdti7lNRvi;~1uLNz|5jpwJXP$G?Eo38YT2 z6423O$94`44L!{Rf+2C6&&?0ckHKVRF*Y}a`H2Lsj^0JpDi1EMsRqBoflM}Iq{WiI z=<o0EJ6&JD#{h%`LEPZl!r%K4!P=FpaqY!@NVD@$85+f05sD-lgH<<>R<qC>#hT3! z1R>ne*yuL^!R~I+$-DR?gLj~CCdA&qLdAL)o=?3)Mw4)B^<mU*+7AU;P^tuznMIHQ z8k?H(fJa?jqR(5w50Aga^*8NUt}TUo#SnJczN50#j@Ri+D4VN6+;$n+Wi_x`I0!)@ z+|=Bh2XuCHh`h_itFi(sW5L(2pWu*AgV}rq%H#tKPx|1}ZbNb0L}KI)Qssk)^mP0N zw70d1UayyzNgH*=XVY+|_Cd36038=W%QncSjZll1fS!Mbx22<aJ`f5wpDO^`T3bbL zMFpSDk{n5q6pg{`gaD^{9=QbuYS{rSO-C_3ZN?0D99G8#JPDH`{;ENHON;3Cc=#Nd zM7_^CM5D||rBX0u$Dyf7Sd`DmaywxzUJom)AQFj$&zwD*2ecA^$L%%%dYe>L1w|&& z7-UV4WGcxGLy;X>9LJ$sZ(~D49?<ph;fT-YE0;+Ms$l`GU<EDj2LjW9EX#r>zR+W5 zXJ_=p$&-}^z;3s1wXp0;#rWR;3|TN2kt9i9lF8(&pL-2uAgxoHoB#j-07*qoM6N<$ Eg3ZHwz5oCK literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/fl_exe.png b/harbour/contrib/hbide/resources/fl_exe.png new file mode 100644 index 0000000000000000000000000000000000000000..7944651026bb59d8ac20efe84550bb8b7371fb71 GIT binary patch literal 811 zcmV+`1JwM9P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008=Nkl<Zc-oDV zeJs=g7{|ZAi__(<qh#)II_?S;jYXCarZ_JXt@XA_r?-C^ZK$S|YI@x=)zzU)B>s@B z?5-2K>aJ3fj^>>yuDqO=^P|hTu3ELqtnZ)Cp6_SRv*-H|_)qy#Vf{phPk+~mnM@(p zG|$7ni;MEA>#}nO9;FL;p(oV?q{N&#hg#f4R?P?q0bEYR2fp$W7t(O22=Mkr`;D|w z$K-R2(k(IF(Z%(ge*re22#+P{KPwf;+qfB^m;zQj13st-aCm^DBS5OK-y`M>hh;y0 zsJ8p~ZvX?<OdCc*WAjK##_qL9b+7|{qY&bg3A(lwepKGbAmXF_0cSsBvjZ?v4lfJA z^6vo4rOb$X)zUI?{tawc8UVqE8siQE3>W0%Cf^5fk#Vr`<cI<Wd-}^dzNAjwPXQzR zLJ$d5{+z)4bm>{`_NYC$tB{~%hwzQGxyGH$I1lM+0U|vDP}N*ZPRXVEkjQlmOpF5! zm5AASIf5W;36sFk)i1-s!rjBy3E;NaP5ka+ax8cKsd;#wjV{S!SR|!_GOh*VStY>b zpiNpn__E@4PnxW5Jz?o)5tLIZs_^EzLMB&WhyOlaFffrQTqO(5Dt3Wf23^Bbn9Q{R zg~<k33xG}qSg}{=YGCZg3Z~d*(CPDPTBPvu4ii9w^8S?A_Y-vL0$V#PfU|^(fl<I7 zXp+>Tr&cw2;6Xk6?F9M=Sb=8fGmzgny2&Q2iQff9?$ck_(I1J?E43tLR^KpIIx%5V zsFdqlhy4FYqH7Re#AaJ9x|4N1P}SOkLa79;&8-hP{DrRc;c?awg$h?ETU<JtS<v38 z**a~M!*>QNbFXHse5`x{I&HQwLsWd!sG-s7@U}sP;1GYvD&*R0DcOu^0rnoO^hpC4 zmh;W+M41<&ZkLq7Z1yZ16z(;eqtCYY_I7;H=t?mP^^DKNbf#~LiWc0;6BPyUmvIwm pW;CCAWup_ujMiy1<2U|~z5+J{9GAM1)nfnv002ovPDHLkV1mWFi=hAj literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/fl_ini.png b/harbour/contrib/hbide/resources/fl_ini.png new file mode 100644 index 0000000000000000000000000000000000000000..8217d6e01f89b91d5c3661eb1eb7a70be5499bc4 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6;?o-U3d z7XDL%8hH;Wa1_sfzoqsVSFFJD1eIeJnc-bAN|*YWSdPqP*=#sV_?b){(_3REZoA+G zj?Z~iA08GL>}TcB=r^Cr?#;ZKE88igA#v?}4vTz|j<7@QZ|7`nf3S4*B9q*bZ+v=8 zn;ducx4d9XS5m6Fuj+Spm-knef4f7@%<q5tq2TkARCE2v*L<m~&Wol19mU}3>gTe~ HDWM4f+_Fki literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/fl_lib.png b/harbour/contrib/hbide/resources/fl_lib.png new file mode 100644 index 0000000000000000000000000000000000000000..a0bb1133b030aa0a273d3679332a7a0e718442ce GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6<(o-U3d z7XHb9{{OdU<}olblCvmaI8j_sa3IAYlu46=VHLAh(~83>46F-JO$a@_b)liu0Y8U~ z25U}j<`q(_*%nMbFwb$h<0^O414&g0&YW^*6`l)}2yMzr;kCHTZd1BQ#m*$qCWe92 X*vjE(@atDVD;Ydp{an^LB{Ts5H%&Es literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/fl_prg.png b/harbour/contrib/hbide/resources/fl_prg.png new file mode 100644 index 0000000000000000000000000000000000000000..8c962a56ce21b48b820a062286ec8c06a561bf78 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6-jo-U3d z7XEK1Ir1?maxi~<Zg+Nm;?_tPUX^>>KdM||T)1MD4JX?QwxlcGX9|vg;J7i<al%L0 zq{t7_jl8qcwO=YItn@wTaEn3Bc1^f)v-*#;x~AIfeT~m$CjH&K^$uHkeq70A#*Enl V1wu>IBY^fXc)I$ztaD0e0suu=JC*<d literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/fl_res.png b/harbour/contrib/hbide/resources/fl_res.png new file mode 100644 index 0000000000000000000000000000000000000000..a2c6d26f532a479412198f67c93cabbe10c3c2c5 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>pfi@Ln>}9og66Es=(orn!3xl zFnyPiT!_ewX>;A>!>qO^S~&jL?2s=oabH&?Gv9=uUn~<o^EJ$vest?L*$-*8Y^4qA zuQ$1u{CCTiRX8TGz+r*U^<77KvKvD5#kH3C?&sLR=cSqd_%Y8a_7mJT>z04`)?|1f z>|8m+cIG>Lp3!^?)2h0eHmp6d`PoATx01eKGtq?b$0<Ak>e_sM*HluaQWIob9=p$B g`W4f*_`xs6<VmyG0zWHc0-es_>FVdQ&MBb@0Lv>^y#N3J literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/fl_txt.png b/harbour/contrib/hbide/resources/fl_txt.png new file mode 100644 index 0000000000000000000000000000000000000000..5bf90c37b4f7632eb74077b7df7d574c4991b5a5 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6<(o-U3d z7XHb9{{OdUmM}3hv$C*|u_$2B&dkr}4?M<jg@J{am)F5ePAEgbMb(Kpz%)Qao70dx zmf6Gnf*cP^p>Y|nfU&{B6}%rh4vV_{XqtNLBZF_Wg~pc|ZA<L`FsSN2{Af5!gyBy% W^WD-tMVvq@89ZJ6T-G@yGywopwlQY_ literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/hb-16x16.png b/harbour/contrib/hbide/resources/hb-16x16.png index 43e1eab8364a7fada3c6b00a4316751b331fe27d..9e7c766a6ce3a022a06ea204db886e2ac3a2c235 100644 GIT binary patch delta 707 zcmV;!0zCbL1=|IXB!8kwL_t(|+I^C3NK;W9#-Hn^_inmrxn*RTy<vumhHsfKA4)3J zf=CDovO=dNMdX))B#9tDR9~ztsFWh|EseRXP?8pbOHF#2X_?5>mavJ=U0>4u+r5%D zZh5}kbM8Iocb@0D4}&E}-_LQ9F$_Xis2E{=_uhRve(b0?cYpFzR8w6AW+}k=$M5NE zdI;nSKlm$IrmXA+6&9Wp&)94>G8&El2V8mjk<`8%WL7hDhxdv5{svgBR(jXo@o#|X zyPdXOc!rAXAh!(%F6#D606jfDWU&lN0sQnV#T7q?Wn>(Y!?ie&Uxd6}Tj8tZJS=o| zbrH|=Qb5te4u87d)D3pDA1>Qxqy@8h@uX6spsmeB!qWrrws(Y5N?u~lMUV}3!dvZ! zpzeAM^nH>5nwwilqX}FD2-0KD8Su^RSr}e@uc2JE4x4BI?e*mnfWFZ{QIQdgfIrfM z6~ACHn-Jjq0Y^v_(zmQZQ)#ZG2MrAkl$e+}4-lk3cz@H6qKt49<{U&zXD__N(lDdY zVt2+~=uagvg6FELD(G~1&}cN!>l=}kl{pU><EKd|O5-aNWtY}qGHi#aDrm41u{-y` zP!O|VAvt+Fg!F4`>yVn7;u&K2Wg~TuIN>wpfX}2I8rK9u<I>Q2I#y!g=B;u%QIO9p z0EF^<7=LykX{`!}&RoKre=y|A0H`-c!;l*x_MoDol5%p6h-b=g-=Tb69>Wx0t0UJG z50{r0<USlmoingcyAZ!Yi`6TaW0}7a3DN6CfRKDvX2wDf5)$GU6_~5*=u1m0_;EWN z#9`9g4>osIW`tkNYM{^tf>W!&D&*i;8Duhmb39+@k%9T^5S3hggb8;@n^hdNaEk9$ pjxn&9g_@a#LQZa_EZijV+iypIHYr7B-}nFk002ovPDHLkV1g-MQP=<g delta 618 zcmV-w0+s#S1%m~UB!5atL_t(IjeXL;Pg7A8!0~V2?^h{pp;Z!ygGMDb5scc&#KB!w zSN;JPbuz&?Iw+gKfMQG>tYI)Qm>2_tLPCSF4GI(*7*GR*((-ukwy!^)1KNhPa;9^0 zaz8ic+=F*aWViOcjcu!b9)JF#p4(2*o0xd%NgNa7(^&$t%YVLb0T7N;uN8$&C=}$s zz~gs|^hDZtJN21%Q){Z1%VlImZ4D&X_jvFoMc`nA-*&a-1BF5X(=eI=;Z_+Oo8^Qi zF*-6r@MIT`C^Z2>2>gDt85l~WSl-N2*~+qz*ZA;i48N&20i}|QEGtKWxz!zpr<SPJ zJW2;Sh@N9PwSUmE1<SI~b*%vix60t?900Q9Lvn3&%}?~w^_GAr772&L4PYpdVr|Q! z+bmOC|3aJC#x4t@=daW+nSOsguU5+Fx_$`Et?ppE6*5n65&M}y&3?oUcH(ngl<pV+ z^Ycl*FD{bFWXR=m<nskoRYd`a^#pk~80Y;=k{K_Cdw=^5E^un|D>c;wARfO)GMPjO z!OF@C>2#V<D0m3`Ta^2=CB%iBXhjQ6<S<Pg+pQjHp|7tGfN!ZZ0|Nt%86?;DxO?L? zKkmhe?ap#Wwde>30qT1oON~#H{^rWV;Yn&mhnggzXa=cimy5kuiJy(q)73#Z*ce=A zBvQ{W_ha`1;PX7s16WE-vixZVXFrGK83?tFT@PHq(Ic4APK@>dx~X93GO`SYW;6hR zrL|u?dh(hB$Duc15XA-{U=`4*(C({XDjtfagMK*NKfZVz`xbsx(EtDd07*qoM6N<$ Ef`+3bj{pDw diff --git a/harbour/contrib/hbide/resources/hb-32x32.png b/harbour/contrib/hbide/resources/hb-32x32.png index abc67aa6fd2e3448ff8e50b7a364444442985e99..35d949becc5952eaa2569b807b2e16b204b11b82 100644 GIT binary patch delta 2090 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 UP6HPlp#T5?07*qoM6N<$f}xB8MF0Q* delta 1701 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 diff --git a/harbour/contrib/hbide/resources/hbide.png b/harbour/contrib/hbide/resources/hbide.png index 5f3b62cc0e770c4a92ca4edbb9a39170c3bbeeef..44a8906c6aaeb5ed2198c47bf10c8b8f99ac5e39 100644 GIT binary patch literal 983 zcmV;|11S87P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000A?Nkl<Zc-rMz zOK##o5G^)rbATA`kPSF&a);q#C7LTlBS6udVT1sUa)(3^m^)+xh86pfvLMcmbrdO! zo_cL;KDNQc?nY>y)N*W~t6o*PUUw%$doZ8RMYr3f@pw$OZOdn-Y0~B8CDrS7%IEW$ zeRHV9PUGyLbe{cWhl#3H_xaNkF(D%UNRr_19F0Vz;Yy_<GMNFj+eEos_;+4kiJDC! zAu2Q&430t~)TrltzaMXsTJ3lw0tQhwj?<0p{5lE4&|gj)#zv!&sMSh*jV_xgpqxr2 zV&Wsdmb8)BFvQ(ORI4^M8ef~N)4>aFqFd=F;6)#iOaf$1XBK=TsC{mXGKxvyW>4R{ zux>=m=ZDw+Hju%5J}`Fx$T-9igS*$pXWRv)P-5)Mr2Meg>#<;2Qk>ENM6X`&k!4u{ z<8ZveX>wTA`D+AiG<kS&Lj^<cSt|+d7_9moE{iB4@?pE(7Pj3yxOGMWE!8yJEON~a zqX<;fvbeyw)MCzsitfV4UU)#{0|-~GHt?4UNr9zCzrQJLuwiqljMkzZ7sv{CXfi87 zv6MGxpN)o{DuGUC)lR+0Cv0$%_;x0|KZFqJIPXvF&YY3$nHBCUk>7@wiT-HSrj-+r z;>a)T7qu|}yc196D!WPvaP$e$Pg*+LKqkE`C?$Zs0yYf^wJ`u!D_yZvN&q{z2A5At zy}<`GqO&X`)m?~Ej>{@Qt2imu0X+m1DzP2{s@6g{5YX}tERp(ZR4&mqbs;7D0Z)Z> z=zy{vnJy(J-&o3fVqI&Yl`#dU5;|6+K2)6xDcui*8B=jGr))>Ii$vOIqe}L~QHXmw zZK1xI&2%~?$8r4MPbQO%d&4lOSS-rF7mEdbety!&$A^DxzZSg1P9=6B?EeE77Z-GP zc1G{-?=+ju*fV|zzs{Fe59iD9dce=$*6t_Edt8|($d$`wIdZvNtc)IX_{0Rn-QAsx zES34eH*&9OVaVf;dj*+RtA*B{ECT?Shq$@9p~)LNe#;Mjr08@Me)G6zBIiYVczB4+ z$X)`7I-GZI9X*bR5HaozdVYQmC9#tLB7b#tMb0lL-BLLeTvEo*a1uKSTwh;{VPSZj z$Zvx)QJ$9R@$oS}fowJ_=r1K-#H0c4V8(ZYUS3}QBLXL1LMQ(c11H@^J)E?Vt>a{u z65BvVhQlFYNHV9gn2Q23bLeu~yDt<9aCUE`l@d56{sH4<icc3D90>pb002ovPDHLk FV1gsq!RY`1 literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9F5uRxe_aaVF7Q1FbW zi(`mKXY!B#|LvJ|4V$m+um4}@`R>NY_x~?1-|^Ia0;`e(k8q~brh?Pc>i=I~|Nnda z)m8uho9F!a{{N!#CEa8PGZQfn<=+`!U)BF#AJh1OU+&NM`uA~0Iu2$6cbT3jFhy?3 z6n?o+;UrVhBbN27C-jzi3N$`q5ILx@Cs(>sv+K<h_dTpeM*lY^HB~9{^!xMu|Crdq zx8tCJVMw#VQN<#IW)612i((5-T|B|m^5?_GhOUV=4q`l8Ef!=Nxjqw0W<1-?wMoaJ dfFqKDA^+vHO4GV<W1znnJYD@<);T3K0RWKrbDIDF diff --git a/harbour/contrib/hbide/resources/hbidesplashwatermark.png b/harbour/contrib/hbide/resources/hbidesplashwatermark.png new file mode 100644 index 0000000000000000000000000000000000000000..1e831057fe08a057aacab7d197af0be4c9f1ce82 GIT binary patch literal 34772 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 N002ovPDHLkV1meT@L2!= literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/panel_2.png b/harbour/contrib/hbide/resources/panel_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e9a6b2145d6b80bb8192d300d8c0d9ca7dccc634 GIT binary patch literal 306 zcmV-20nPr2P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0002_Nkl<Zc-muR zpb#*k3%q>!`Tv$Jw-~;C`^|9k=354Ses%^^Q)vcKQ7#63eF+909(G2Y23)-O{C{if zVTPYS|1j|Ju>&=8fDM4LB_wzl?Cj(jgoL;lF$@4{PD<JYRLlm}fXx61&CXzBBL}28 z8Q}&zfBp%mc_YKCSKo*-Kva|)=pAtec6L@qumQcjNB=Kdb_MJbVhjM$%F03vQc`>n z1Io&F{olLyK1l}1%JMTPC<sCfFgBj~9~KtG8UW(!=}Az@0E)dpaUfD0jUcdV*PZ{B zm3xUY0F<=F#CRA{QX<TdIdjh8P0D6w(qO04CNq%(00R?r5!OrVc>n+a07*qoM6N<$ Eg3Bj*lmGw# literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/panel_3.png b/harbour/contrib/hbide/resources/panel_3.png new file mode 100644 index 0000000000000000000000000000000000000000..bd94f37df6916b0c463f8e2bc04b90295f37a869 GIT binary patch literal 288 zcmV+*0pI?KP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0002zNkl<Zc-muR zpb#*k3%q>y@BfzL3=H3XFfiPF%)r3U&A?!)$-p4W&%mIs%)r3I#l(oyfQxtj{cl~u z!0_`o0|OryL^BBUL1_tL1_nDl1_mKMgdvQ`nv=R1fg1mVHDEIUM%(BDXnVB+~( zpyo~nhF2emGeA@T;vIH2CPuIUy(|CyU$z(G7-9?n(aKT`3{oOc1IlLn`@i=bX$HuO zGB7AeLJcrZ`~M#n7Q`9=qV<%iWdOxqpg0gIjz$pJb^71`%GtyjV5-5uASQ^EkdO_T mvlV|*Hq(GOoi>??8~^|o`)Uz%31DOZ0000<MNUMnLSTX}RCTHV literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/panel_4.png b/harbour/contrib/hbide/resources/panel_4.png new file mode 100644 index 0000000000000000000000000000000000000000..e28662f76ec6fdb60d7260d5d877a7711b2cf3fa GIT binary patch literal 275 zcmV+u0qp*XP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0002mNkl<Zc-muR zpb#*k3q1Mv<o`m3g$$p8@H`L-1EDhzN&%rY5b`ncG2%4f*uP`{(-_hiz5}5U6oL$Z zvE_l#7YN0e#27IQ0BN>jv|<qaF9_FwZUBt$4TM5WLX2<&9{qdt--^MC;R)jtq6~m} zhl7cO5o|!=zrz3hjQwDj5Muy{)&@caCIyHAA^$@DuVGw6k^w3}sLrGgF@WJe5JCa5 z27sU?lO>f5px6r(2O`DM2m&krt^6O(7*3P{;H1qY#fXv;VTLp_G~-RmAk84B(<U>K Z0{|IxY7q~L>Dd4P002ovPDHLkV1hO1Yg7OL literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/panel_5.png b/harbour/contrib/hbide/resources/panel_5.png new file mode 100644 index 0000000000000000000000000000000000000000..cb5a57968d686f425394903db1cf8b42d38e1e11 GIT binary patch literal 314 zcmV-A0mc4_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00032Nkl<Zc-muR zpb#*k3w-|Z<o~U=3mJa@`^@n6+j$0d7GVZyUS|d_Rw)Jv9%}}6Rz60Y20Z_C?Em3M zX$*h<eP>{27GmIF5ds?kWAm`dGsp}0GH|hpF=7}1(!A-G6$2ZSAW)MKRs$g7!VGf! z-VB^<LX2<&KK*#~f8z}+hHrnK5M=;2n-qgMw>1MR3kM_EfTIr!|6h6C4|WML27qWG zPHhH04h4t-yY7VizyDzkNe1w<t1t+1sY48yd4}OXEG&pM0K}KzwWN{(6nlZ<K%_Vt zLEz5YmH+qN4=2h1X+CEL9(E~4l#~cF<lOUSyh$0P8RT@@WF~R|0Hl9(5kfQ5HUIzs M07*qoM6N<$f}1vY&j0`b literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/panel_6.png b/harbour/contrib/hbide/resources/panel_6.png new file mode 100644 index 0000000000000000000000000000000000000000..067e81b3719d0c443baadc29bcb8eb13ac0470a7 GIT binary patch literal 301 zcmV+|0n+}7P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0002=Nkl<Zc-muR zpb#*k3q1Mw<p0783mHED`pj_t#d!u{PGJUTMP~*nUMU7^Ico+!4n9Vl1{`~I?0?$k zG=}egzB34M3V|`m02o`IU!K8N-Iqa(M~o4}0FY*@c~%U99D;BS=mx;}-fG?qLR><O za04EFc=X?Dt`)<R&rgUl0OlPIRt`q60fjpX|M#Eh2fKtA13<L4m^OogpaR5zkd-0- z*IZvik^w40Dh%qP>JS4M8W{e=!h%=>K-f~wl1c_p>;;Mgk>Y3sft8n6{tsUpPLu)8 zO2DMeC&h@85@CikA8N*%ltG$7PNz*~A_o8fIHYtDU;OG$00000NkvXXu0mjfV&rtf literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/panel_7.png b/harbour/contrib/hbide/resources/panel_7.png new file mode 100644 index 0000000000000000000000000000000000000000..a6f0ec4afb0755fa4a96ded493cd7f1861208c04 GIT binary patch literal 281 zcmV+!0p|XRP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0002sNkl<Zc-pm- zF$=;l5QSfA+i0t;x>ykOcl$GR6r99OoE)SSM3)XykP1bxBqp_D6_slAhU6~rK3*;t z0>vPY2Ztl$egvEt5G4TBfo=n^48W_4+R(^LKo~PV-2$l)(+W`4FMw-aH-Uarz|0$j z6vZQ-z|{Di=vm%#fm#m9mRQ&xu7D&h2e5^cjtv;PMl!%`!}xM{F;fO0_jV0%sySdB zFuvY@25>3RvU0#+&iS<$WdXAG8ovT4UqQKv%Fiexh!~%&%K^HMm`Yk0q#|Syz8_^N fme&9CnZAiLTIy;MS1l?k00000NkvXXu0mjfPN8qK literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/projectpropertiesex.ui b/harbour/contrib/hbide/resources/projectpropertiesex.ui index 4e2efbd5c2..c62e5e7ba2 100644 --- a/harbour/contrib/hbide/resources/projectpropertiesex.ui +++ b/harbour/contrib/hbide/resources/projectpropertiesex.ui @@ -24,7 +24,7 @@ <string>General</string> </attribute> <layout class="QGridLayout" name="gridLayout"> - <item row="1" column="0"> + <item row="0" column="0"> <widget class="QLabel" name="label"> <property name="font"> <font> @@ -40,7 +40,7 @@ </property> </widget> </item> - <item row="1" column="1"> + <item row="0" column="1"> <widget class="QComboBox" name="comboPrjType"> <property name="toolTip"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -54,7 +54,7 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="2" column="0"> + <item row="1" column="0"> <widget class="QLabel" name="label_2"> <property name="text"> <string>Project Title:</string> @@ -64,7 +64,7 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="2" column="1"> + <item row="1" column="1"> <widget class="QLineEdit" name="editPrjTitle"> <property name="toolTip"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -75,7 +75,7 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="3" column="0"> + <item row="2" column="0"> <widget class="QLabel" name="label_3"> <property name="text"> <string>Project Location:</string> @@ -85,7 +85,7 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="3" column="1"> + <item row="2" column="1"> <widget class="QLineEdit" name="editPrjLoctn"> <property name="toolTip"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -96,7 +96,7 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="6" column="0"> + <item row="5" column="0"> <widget class="QLabel" name="label_5"> <property name="text"> <string>Destination Folder:</string> @@ -106,7 +106,7 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="6" column="1"> + <item row="5" column="1"> <widget class="QLineEdit" name="editDstFolder"> <property name="toolTip"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -118,7 +118,7 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="10" column="0"> + <item row="9" column="0"> <widget class="QLabel" name="label_7"> <property name="text"> <string>Launch Parameters:</string> @@ -128,10 +128,10 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="10" column="1" colspan="2"> + <item row="9" column="1" colspan="2"> <widget class="QLineEdit" name="editLaunchParams"/> </item> - <item row="11" column="0"> + <item row="10" column="0"> <widget class="QLabel" name="label_8"> <property name="text"> <string>Launch Program:</string> @@ -141,10 +141,10 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="11" column="1" colspan="2"> + <item row="10" column="1" colspan="2"> <widget class="QLineEdit" name="editLaunchExe"/> </item> - <item row="8" column="0"> + <item row="7" column="0"> <widget class="QLabel" name="label_13"> <property name="text"> <string>Backup Location:</string> @@ -154,10 +154,10 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="8" column="1"> + <item row="7" column="1"> <widget class="QLineEdit" name="editBackup"/> </item> - <item row="4" column="1"> + <item row="3" column="1"> <widget class="QLineEdit" name="editOutName"> <property name="toolTip"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -168,7 +168,7 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="4" column="0"> + <item row="3" column="0"> <widget class="QLabel" name="label_6"> <property name="text"> <string>Output Name:</string> @@ -178,63 +178,28 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="3" column="2"> + <item row="2" column="2"> <widget class="QToolButton" name="buttonChoosePrjLoc"> <property name="text"> <string>...</string> </property> </widget> </item> - <item row="8" column="2"> + <item row="7" column="2"> <widget class="QToolButton" name="buttonBackup"> <property name="text"> <string>...</string> </property> </widget> </item> - <item row="6" column="2"> + <item row="5" column="2"> <widget class="QToolButton" name="buttonChooseDest"> <property name="text"> <string>...</string> </property> </widget> </item> - <item row="0" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_7"> - <item> - <widget class="QToolButton" name="buttonXmate"> - <property name="toolTip"> - <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load an xMate project file.</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This feature is available only for new projects.</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hbIDE attempts to recognize various components</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">but it is possible that it may not load everything.</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">So you may need manual editing.</p></body></html></string> - </property> - <property name="text"> - <string>...</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item row="9" column="1"> + <item row="8" column="1"> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -247,7 +212,7 @@ p, li { white-space: pre-wrap; } </property> </spacer> </item> - <item row="12" column="1"> + <item row="11" column="1"> <widget class="QLineEdit" name="editWrkFolder"> <property name="toolTip"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -258,7 +223,7 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="12" column="0"> + <item row="11" column="0"> <widget class="QLabel" name="labelInitFolder"> <property name="text"> <string>Start In:</string> @@ -268,14 +233,14 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> - <item row="12" column="2"> + <item row="11" column="2"> <widget class="QToolButton" name="buttonChooseWd"> <property name="text"> <string>...</string> </property> </widget> </item> - <item row="5" column="1"> + <item row="4" column="1"> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -288,7 +253,7 @@ p, li { white-space: pre-wrap; } </property> </spacer> </item> - <item row="13" column="1"> + <item row="12" column="1"> <spacer name="verticalSpacer_3"> <property name="orientation"> <enum>Qt::Vertical</enum> diff --git a/harbour/contrib/hbide/resources/projectpropertiesex.uic b/harbour/contrib/hbide/resources/projectpropertiesex.uic index 2c53fcf44f..e11463deb2 100644 --- a/harbour/contrib/hbide/resources/projectpropertiesex.uic +++ b/harbour/contrib/hbide/resources/projectpropertiesex.uic @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading ui file 'projectpropertiesex.ui' ** -** Created: Mon Mar 1 01:10:15 2010 -** by: Qt User Interface Compiler version 4.5.2 +** Created: Sat Mar 6 14:12:50 2010 +** by: Qt User Interface Compiler version 4.5.3 ** ** WARNING! All changes made in this file will be lost when recompiling ui file! ********************************************************************************/ @@ -56,9 +56,6 @@ public: QToolButton *buttonChoosePrjLoc; QToolButton *buttonBackup; QToolButton *buttonChooseDest; - QHBoxLayout *horizontalLayout_7; - QToolButton *buttonXmate; - QSpacerItem *horizontalSpacer; QSpacerItem *verticalSpacer; QLineEdit *editWrkFolder; QLabel *labelInitFolder; @@ -104,147 +101,133 @@ public: label->setFont(font); label->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); - gridLayout->addWidget(label, 1, 0, 1, 1); + gridLayout->addWidget(label, 0, 0, 1, 1); comboPrjType = new QComboBox(tabGeneral); comboPrjType->setObjectName(QString::fromUtf8("comboPrjType")); comboPrjType->setEditable(false); - gridLayout->addWidget(comboPrjType, 1, 1, 1, 1); + gridLayout->addWidget(comboPrjType, 0, 1, 1, 1); label_2 = new QLabel(tabGeneral); label_2->setObjectName(QString::fromUtf8("label_2")); label_2->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); - gridLayout->addWidget(label_2, 2, 0, 1, 1); + gridLayout->addWidget(label_2, 1, 0, 1, 1); editPrjTitle = new QLineEdit(tabGeneral); editPrjTitle->setObjectName(QString::fromUtf8("editPrjTitle")); - gridLayout->addWidget(editPrjTitle, 2, 1, 1, 1); + gridLayout->addWidget(editPrjTitle, 1, 1, 1, 1); label_3 = new QLabel(tabGeneral); label_3->setObjectName(QString::fromUtf8("label_3")); label_3->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); - gridLayout->addWidget(label_3, 3, 0, 1, 1); + gridLayout->addWidget(label_3, 2, 0, 1, 1); editPrjLoctn = new QLineEdit(tabGeneral); editPrjLoctn->setObjectName(QString::fromUtf8("editPrjLoctn")); - gridLayout->addWidget(editPrjLoctn, 3, 1, 1, 1); + gridLayout->addWidget(editPrjLoctn, 2, 1, 1, 1); label_5 = new QLabel(tabGeneral); label_5->setObjectName(QString::fromUtf8("label_5")); label_5->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); - gridLayout->addWidget(label_5, 6, 0, 1, 1); + gridLayout->addWidget(label_5, 5, 0, 1, 1); editDstFolder = new QLineEdit(tabGeneral); editDstFolder->setObjectName(QString::fromUtf8("editDstFolder")); - gridLayout->addWidget(editDstFolder, 6, 1, 1, 1); + gridLayout->addWidget(editDstFolder, 5, 1, 1, 1); label_7 = new QLabel(tabGeneral); label_7->setObjectName(QString::fromUtf8("label_7")); label_7->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); - gridLayout->addWidget(label_7, 10, 0, 1, 1); + gridLayout->addWidget(label_7, 9, 0, 1, 1); editLaunchParams = new QLineEdit(tabGeneral); editLaunchParams->setObjectName(QString::fromUtf8("editLaunchParams")); - gridLayout->addWidget(editLaunchParams, 10, 1, 1, 2); + gridLayout->addWidget(editLaunchParams, 9, 1, 1, 2); label_8 = new QLabel(tabGeneral); label_8->setObjectName(QString::fromUtf8("label_8")); label_8->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); - gridLayout->addWidget(label_8, 11, 0, 1, 1); + gridLayout->addWidget(label_8, 10, 0, 1, 1); editLaunchExe = new QLineEdit(tabGeneral); editLaunchExe->setObjectName(QString::fromUtf8("editLaunchExe")); - gridLayout->addWidget(editLaunchExe, 11, 1, 1, 2); + gridLayout->addWidget(editLaunchExe, 10, 1, 1, 2); label_13 = new QLabel(tabGeneral); label_13->setObjectName(QString::fromUtf8("label_13")); label_13->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); - gridLayout->addWidget(label_13, 8, 0, 1, 1); + gridLayout->addWidget(label_13, 7, 0, 1, 1); editBackup = new QLineEdit(tabGeneral); editBackup->setObjectName(QString::fromUtf8("editBackup")); - gridLayout->addWidget(editBackup, 8, 1, 1, 1); + gridLayout->addWidget(editBackup, 7, 1, 1, 1); editOutName = new QLineEdit(tabGeneral); editOutName->setObjectName(QString::fromUtf8("editOutName")); - gridLayout->addWidget(editOutName, 4, 1, 1, 1); + gridLayout->addWidget(editOutName, 3, 1, 1, 1); label_6 = new QLabel(tabGeneral); label_6->setObjectName(QString::fromUtf8("label_6")); label_6->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); - gridLayout->addWidget(label_6, 4, 0, 1, 1); + gridLayout->addWidget(label_6, 3, 0, 1, 1); buttonChoosePrjLoc = new QToolButton(tabGeneral); buttonChoosePrjLoc->setObjectName(QString::fromUtf8("buttonChoosePrjLoc")); - gridLayout->addWidget(buttonChoosePrjLoc, 3, 2, 1, 1); + gridLayout->addWidget(buttonChoosePrjLoc, 2, 2, 1, 1); buttonBackup = new QToolButton(tabGeneral); buttonBackup->setObjectName(QString::fromUtf8("buttonBackup")); - gridLayout->addWidget(buttonBackup, 8, 2, 1, 1); + gridLayout->addWidget(buttonBackup, 7, 2, 1, 1); buttonChooseDest = new QToolButton(tabGeneral); buttonChooseDest->setObjectName(QString::fromUtf8("buttonChooseDest")); - gridLayout->addWidget(buttonChooseDest, 6, 2, 1, 1); - - horizontalLayout_7 = new QHBoxLayout(); - horizontalLayout_7->setObjectName(QString::fromUtf8("horizontalLayout_7")); - buttonXmate = new QToolButton(tabGeneral); - buttonXmate->setObjectName(QString::fromUtf8("buttonXmate")); - - horizontalLayout_7->addWidget(buttonXmate); - - horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - - horizontalLayout_7->addItem(horizontalSpacer); - - - gridLayout->addLayout(horizontalLayout_7, 0, 1, 1, 1); + gridLayout->addWidget(buttonChooseDest, 5, 2, 1, 1); verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); - gridLayout->addItem(verticalSpacer, 9, 1, 1, 1); + gridLayout->addItem(verticalSpacer, 8, 1, 1, 1); editWrkFolder = new QLineEdit(tabGeneral); editWrkFolder->setObjectName(QString::fromUtf8("editWrkFolder")); - gridLayout->addWidget(editWrkFolder, 12, 1, 1, 1); + gridLayout->addWidget(editWrkFolder, 11, 1, 1, 1); labelInitFolder = new QLabel(tabGeneral); labelInitFolder->setObjectName(QString::fromUtf8("labelInitFolder")); labelInitFolder->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); - gridLayout->addWidget(labelInitFolder, 12, 0, 1, 1); + gridLayout->addWidget(labelInitFolder, 11, 0, 1, 1); buttonChooseWd = new QToolButton(tabGeneral); buttonChooseWd->setObjectName(QString::fromUtf8("buttonChooseWd")); - gridLayout->addWidget(buttonChooseWd, 12, 2, 1, 1); + gridLayout->addWidget(buttonChooseWd, 11, 2, 1, 1); verticalSpacer_2 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); - gridLayout->addItem(verticalSpacer_2, 5, 1, 1, 1); + gridLayout->addItem(verticalSpacer_2, 4, 1, 1, 1); verticalSpacer_3 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); - gridLayout->addItem(verticalSpacer_3, 13, 1, 1, 1); + gridLayout->addItem(verticalSpacer_3, 12, 1, 1, 1); tabWidget->addTab(tabGeneral, QString()); tabFiles = new QWidget(); @@ -386,19 +369,6 @@ public: buttonChoosePrjLoc->setText(QApplication::translate("FormProjectPropEx", "...", 0, QApplication::UnicodeUTF8)); buttonBackup->setText(QApplication::translate("FormProjectPropEx", "...", 0, QApplication::UnicodeUTF8)); buttonChooseDest->setText(QApplication::translate("FormProjectPropEx", "...", 0, QApplication::UnicodeUTF8)); -#ifndef QT_NO_TOOLTIP - buttonXmate->setToolTip(QApplication::translate("FormProjectPropEx", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" -"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" -"p, li { white-space: pre-wrap; }\n" -"</style></head><body style=\" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n" -"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Load an xMate project file.</p>\n" -"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">This feature is available only for new projects.</p>\n" -"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">hbIDE attempts to recognize various components</p>\n" -"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; " - "text-indent:0px;\">but it is possible that it may not load everything.</p>\n" -"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">So you may need manual editing.</p></body></html>", 0, QApplication::UnicodeUTF8)); -#endif // QT_NO_TOOLTIP - buttonXmate->setText(QApplication::translate("FormProjectPropEx", "...", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP editWrkFolder->setToolTip(QApplication::translate("FormProjectPropEx", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" diff --git a/harbour/contrib/hbide/resources/source_c.png b/harbour/contrib/hbide/resources/source_c.png new file mode 100644 index 0000000000000000000000000000000000000000..b83658b65d0b846550cf689ee2647889ec5bacd5 GIT binary patch literal 910 zcmV;919AL`P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$TAW1|)R5*=Q zliy2Zbr{A!=gb-B%)wcIz~Ib6CK<}Op~y%W&V{Lo1RHD%x&%=RvTa2J+mFAZE~PuE zi^7Fiq+-y8MOLCkD6FI=$53h2L3iYgrE_M^oO8Z!7rPGad;ffRc%J9gL<E5A?|l+I z+WYIX{!6K`WHQmw($W%rR4P^e+$<EfwjX}g(>Jio)A!34pMQF!i3o}0#qMnOgROUN z+|Vt{0zgF2G!20H`FUQMoTTN#1^ghut=0HxeM8;8^W95^rfFI>o4xni<;(iv;UP;) zOO(rHip3%w9UTBvt5v3^rm!rFQmMqs$_m57!+JClzGVy!4rVi%OxMoN4r^;`3=Iu2 zK0c0Z+qAZ}5{X3E*w`Qx3gLMk;c%E#DurPfXwYUP5{b$E{e3h|!}C1G#>TKL3)3_a z5tLG-QYk#o!*yLmgm^rT>$(8w^?JQ~dwZKgp}@(>3ASycltM%Zf`EFx&hhavi;Igm zjzhUzW_fv;TCE0vQ7V;`VHk)Aqobp=wY4?Gp6B8FKBj5X-``Ip5<%B>1_lO*#bS>E z2L}g#R4SE}rfKx`^%0Fm@qHiP_X&akr4-?Cn69oaL<GYy=<V%oIMA!r>Rk~*M9AfG zY;JBg0KV_DzP`@U(Gj6gh)5)YX`1Boc}&xM?7(rH`Lnai$FW#*uTqMcnHi?1r|IeG zVQ+7b)z#HT2Jv_t+qUsM4*;ctzz`96apdI>RsAeiwrzqSU}0h5sUbBtH$TZE;Mo3$ z#KmX0cmIL<b^Yi2I>4oYq2k=!9GOgpWHL!C7Ne=DiT3t(Iy*a=ot;HQC>`7MzmVej z=boi<_OD&YZ`?7?hplNEBO@bRyLPS7gzx(li$x|TCiwRI9M|7^6W4WF{o%*@N4K(X z1H0z{@jQ=oI*qRDSeAulSwy2z(&;oJLZwn^h;QC}_kE{wc2`71e*!4{_WPE5-iGIS z)M_;x$Kmw!6vuH;gw)r!zj<`^^($BRAMSoBB0hk2{?4ynd81p`BnuKp(Ek6oq5@Ue k%s<%P%IAQ;<y-{(2P+e>YkO_;;{X5v07*qoM6N<$f-2m=U;qFB literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/source_cpp.png b/harbour/contrib/hbide/resources/source_cpp.png new file mode 100644 index 0000000000000000000000000000000000000000..02ec4abc7dca3a8df6f2ccdd3153074b342d5894 GIT binary patch literal 964 zcmV;#13UbQP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$TR!KxbR5*=Q zlkZF81sum;-#It@x*zDKZbBL<ff*iS5*H4CClZ`+$$<sY9msVR4KL|`5bB}yNT~;< z!Xa28)?s!{JcQ!TW~_5=6HVs4-8NIVxqbKDrzaWR`}ynj==D}a1b|x~ep+?>*Y4*X z?QQ*Tx2wT!w^uz)CbNG&+1Uw4559i+l`DHZzsFyG@!7E=BDma*Eq?#U;rDOfHmIr! zfQX<d3IMaSv%E1hgxzMNr0WzeF8K9Pu)MJN-Rnk0Q53)5zdCa5njw)$u(Gm3CX*o^ zkJHf506;#UXLxuRRaHqQldP?+arNp|LzTJmuF>Q1_<cU#i?LXY&CN|ZJ3AQ|7$6V` z(9zLBU0of)V33N63N%e48jaG}*oe_+M1dNE%jFt6JUk>8i=k;6{r&x@s!A%AVq;?i zfVQ?atX3<9LV?}gT|%J{nx+9@EEbC`(P$K1*C~}sEG;c@a&p4f))r>7nd9SQMn*=M znVF%wx|&ENLMD?TlgUulb;X!WCd)>n5fP!cx0gbp!20?+!C;W)=4Mi<6dsQUr_)Iw z5Fi{5W3$;P7K;>ggB6Fvaj&JNMOs^1WnyAN^7*_R9UVz~d%H|cO-U>klY@f;NhA^y zjYg%Xr$;6yCuMtkTW-94^L~Y*D0Yj*G6E2ZMCj}5!|8Nlx7%?#on*6FOePaHn+;V} zsjsgmoleu;-OcLHfk=g>X^$%_O=D)W$tfZ%E-rF<dP;qLJ^TCnEG#TAH#f)V=qPr( z9f!k#*=)w;a`D6cpTb5Fk=MHVJ}DQ^mow=!x~?-nKmS}v7K;T<(<qg6o~8fB)%XId z4<44c9{u*f0MLG=Gd?{%jnC)9?RI0eS}~bS)YjJ0)YQcI_&6d$@>!aWSKDZPshRBg zX?iCVTr^&WttbjzU0sZgjZsrmgNRTnm59gV3=R(R?f1*vdhcBdg#y2<Zxko*`fmbz zmjcl=4X@XW!C*jDRa8}_s;UaF*Ncdd&1V0D@7(#|qg?j<M-dUjzk;3L{|FaE1Q9{g zG%hYK$mMdJot=@(<tS58{$}Cc)6uuCj~*WEeI+6#0Oj(|Z(e_=#h{2Eqz*y(|8J$N mmv^3o9!A5VWnf<}A>bbmJFLs^J3K`I0000<MNUMnLSTYc(!dA+ literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/source_h.png b/harbour/contrib/hbide/resources/source_h.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4784375dc963c72b67f461cb062459938aacd5 GIT binary patch literal 901 zcmV;01A6?4P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$T7fD1xR5*=Q zlFdsacO1q)Gno(#1RRQ>qKmrQ`qENS!AmZZUSu!DdMNbb9(vfauw_XPJ@h{)g<h=3 z_ENMKdn;I2!!D)ET8eI8(3)hrYJwZ9O)@c=m;7et+rzHu_PKs}Uidzbwy?19@!Z_p zQmf_2lYQ&6q2cQ`FVOm@{L$EJuU;#a$_*{~$|w9EdtZL>=^5E<_P*=7a&&Yg>+9c0 zy<V4ky)Ly{O;%S|#dTfT+}xDiy*+vM?3t9xWhoYmvbOPE`1ZTE=5!Ger4&jjc6J`q zXf#NrQsi<uf*?RCMHq%eVMsEW#P>XMxg4*L-_W}g@q2os(NLCUaeREt=;$b>X%a;d z)6>&58VxMV;_U2<E0cIU&cwt7hGC$AY1p={EX%@mUGn)nD=RCA2mnecEX$%&sSpGK zzV9O<^!E1R`#u1=ZQE_jvN%0GWpHp1P1DeI9bMPy?(Xg+*xug8aU5#38e3aic%BD< zQLop7VzG$t`#6q+X_^>@frwBpm+9~Cr&6hq$z(_*66m_l)YKHIRO-3F#l=OtP$<xD zw^?3ZCY??b1OZ_flFeo*6bdw(O$G)Ah{xj?hQZj_*nbIZ+YU;l5@8rpsZ=mclVmbU z5CnLh$NBj=VHgsN#YiL)0PODWGC4W<T;SzpoSd9+aB$FZ3xc3?OC%C>b#+m#R#8d; z5Jh2VD5b=8U7{#rWMqV%o*u$5Bp#0wMG>y+qG=kjSd1VDxv1Lo4GeMr!K3KO?k^7v z+qU1oHhkmv?1y(gZ(d%~Y&J<IlNg4<+S(c$8yk#|kK;HF=NDDpd}D%EtHtA;pR0%a zzisLOZ{1vcm`<nZ>+7T4Zg;BGG>w^=88Vp+`Ql%U3=iS^J`aEVshz!d_ZIN<>Ib5f zVs>`6L)0`4(=?f%pGQP!wOSqW?b{#RaazqEL`3u#0*Al;k@rOe5kV=1=Xp4e!{y~A zj^hv!i@sj}_V1;47MIE=Prnk806@E%?ajsauIrlI1?ff5UT#OCFgpBm|B;p7{~kD& bD-!T8loHgND0;vc00000NkvXXu0mjfqd2XP literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/source_o.png b/harbour/contrib/hbide/resources/source_o.png new file mode 100644 index 0000000000000000000000000000000000000000..beb3c507ba64b7f7823c65ed1db99f2eab748636 GIT binary patch literal 935 zcmV;Y16cftP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$TIY~r8R5*=g z)6Y*Mbr{F-_e?46)J~<ybd3fhv7!EobHLDWqVYiJ9?)eEtPoI7%WAT?@xWhT;*Y>h z4{%s6BqX>T7S~`j&H967{lTilG`3_jlt@WgoFdR>X1|^JdO(PY&;9etlPAwdkx~MX zdfrSNRR4OvUOVb+4hEleT=#(%d1T9cx#!kXPbc^J|NL_O(~m2Pl#*bu`IXL8>Z`Y} zjH~5xncdx848x$avy<7`S%!y)8M<@{>H9Q157%+{>E4FFaN}l=swj$n?p$KwqYpn& z=jP@pl}ebVNuf|+dU~44$w}tt=h-fmh(sc|jzcb&<ArCFsul`f3jptqj*h-sEEW+$ zFflPfUtb^H-Q6gP!t(Mm*=&}XnHdHL2k|_Q=H_Oi(J0@3e|JX(OkLMmTU(>2r-yVp zO*9%MnM^V^Hpcq;Izk96%c5GXBBjJI41^E>sKH<`Y1=lHN(JBd+1c5__kE<4BoYaN z!62nliR0sA_V)IuR;#S6tl&7#2_S^nw=4@OC2ehO#N%<Klz5(pZQC3k9<sf?jjF16 zo<}Se!!%8FT|WVULa|uH_kA`tHqbPUMx%icg4NYk6h*<ZEDXay*L5^aBb7=K4u{Wx zPb!tl!%!&1($W&ST#iPg!PeFmQ&Uq!A`!~vGTCgF*49?S;V}7p{tRf6Qr>?w-g@1( z?aQ%PjG>{SvvqY{r&g<xPN(Vb@5e9<Y}-CNpznKL6Ttb`UY||2KX&=E#YJ4#rCzTS z4u^@wVvLN8kjZ2)O_N5$W8eOp$De5D>)UtyU+?{Vy9pqyMZAH50TPBmAP_)RRWwbb zrKN>~g9CbddvRTt2m3ZJz4#opT8+Cu{Ad^Q8#kIxAKUkRLZJ{H9UZi{x1W5S>$17I zi4cODpMSwyZ;ax)F5i5&`tZGLSKkDzQ$PwK=<4c1RaF#4K~WUq@i>`G1}P=ATJ0=6 zK7Qq$dhPg2DWz2Z1q#3YUUa3DNGTCQ;5ZKTdYz-ABkJ`!J^_DzVR7%`;Dw8SZd-Fw z$_9XPTIcf@hM!Rtc@?CAMEP%TrSJKLKk|3(7xTA(k~|Fo{{X^8n&~KCJY4_)002ov JPDHLkV1oNMzQX_j literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/source_prg.png b/harbour/contrib/hbide/resources/source_prg.png new file mode 100644 index 0000000000000000000000000000000000000000..30a49fb459cd0664b173bce832748539988a19a9 GIT binary patch literal 886 zcmV-+1Bv{JP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$T2uVaiR5*=o zk?%_+bsWcE-<erwZfr|s1qsBqJ+O82e2@w~6Q4wZaMy)ak4k)?1P7P+9|VE<Ea;(S z5CoZGR+xm|5#5u-^hi$+QdeaC?UFk)J3F&8pB{wW1-+iXU%Wr>j{-gdI+aqoX<e&R zN-15}-5S$6$+YH{ayMSt<^TEp^UppxHh|9M<>l8_R#w>G-$&PVve_(_WidH9`Bu|& z1|N=&62~zT$5f+;itqE=>cjZv+wZ@s0ThcxW@l&F+S<Z#9HytInVOnnY;26VxjD8T zJ>uD965F<^_&!TZOXOa<u3a+|cQt@~K9A>l^!4>IK0eOO%nYSciH(g7(&;pdi;Dz7 zKp2K35(%=|EQVpApx(F=xUNe>Lj%cV5)mPeV+w@=XJ==K2<3A5pEE>gY;2@bsQ{oo zEtr^?U~q7duC6YEAYf-_hkQOyQ&SW3^YeI~N3mFBVPOH^_W>{f_V)HLO_QUeBaV-c zsi~<U2m%U)0z*SX<Z?M|+r~6aG)<$Uql08J`9yGfddm6vIlaBT*tSh=Z7r!(iuU$) zGMNmSOa`SCB7$KUw6?bXx4{*iot^ae_hZ{Onx>IRBv@ZxM=6D_>*%@;!0PHMZEbB& zHn`&8;DE!!L(1hcK@f0qa)Rr+L{WrgSy+~Z=Xr!-2tXW1kpXadc}cZeC7n)FS64?A zMI;glQmGWp&CQsmiLUE}VU@Fszi4{CnV;`Hh}TwE?rFfsg8Fh`V1QDogyT5qx{hHO zXqv{_+8RnJ9LM4G?1CFFXSx1j3$Al{vAy~5TTMjnzkc(bPlrcFXlZF72m+K+XqtxO zIQYJg@B4iB{g0$yXr@xBaQ~NIgVDQp-UD_G0K4{?P(<kN?ncuzlu{_AsIRZ5r>6%I z!FAn#!^6WPA9$|wlZeRGh}-LbJg$fcB0?C3_`Z+ld6Y^eJkKLWkH7l*o0Hpb-nxCT zzx#!VQ~{KT0Px1GcQcxjJ0Oh+>gn%D9L3vPn-Bhcy!iu=m#Yx)H;Cwfsr<ICq5uE@ M07*qoM6N<$g0K*!+W-In literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/source_res.png b/harbour/contrib/hbide/resources/source_res.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2bbb8a6e8eeef6e100a5029a972bbd6c9953fa GIT binary patch literal 718 zcmV;<0x|uGP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00009a7bBm000ie z000ie0hKEb8vp<TfJsC_R47wjl21t5VHn4~bm-!xgBe~tbnp-+VFwF@Al!@&-3`W! zZ5OGVfq|D`Gh>=9hpuQYn-L)l{6npkq(Ncj)YRs`v@}gqG%LX%_x+hU+Qa*MdHL~t z-sk&$o|hz%NO(M6e}8{ZPcNsZm-pi3tJlIc;}6eq;J;NUURSGC60*0qx8-uVNF*8? z8`EesI-QQo<&KY!XR_J!<z*_BI!`3R;qc0;@lPm107j#c!{MOF$jAuxzP>(_$;4nV zc6N5|?(T}kBC@qwt;ge0&1nfhp-^;ocB)jWd_G?)mDp^yOeW*=`4bZpg+k%#>M9<O z+wFG0-~V2&BmgLBZ*SM@_4oJpl}e?nt7~+0w7a_-_Mj)3OvYldlamv-+g%5ShKAbO z+E8S8c$mp#c64+M4h~W%l-b!?C<%o^E|*KGRPOKZ*8vubMW@qSTU$xBpi-$VEiGcP zcx!8GZ*TAH>?{(ApfUd>(P*^h=H`Kc0n$^TQ4WU#deZ4M_KR9XqtR!8R4VoPd=18G zwIVy4&E{*dxw#4E86Xr2@fUR)4D6z5=xid901x1UTtNV2GP$X#X>xM%;NZaP^}=O? zDVNLF*QMVcpUZu`WLTSDSR~nOwl{Cz2?PST#2FP%Pfu~#BLGQ}X#C;f0i_ndEyFzt z&m$a-Id*r|YW2p(Mj#Ntn1aEe*=)|`atn((WTTG7x(-!16F~etX?HlF=jiAN1418h z@$K#H&CQMKlN#CUKYx8UtYECf<HLvPe*U6!I-Q4yhwy;wQ3Nf@WHK{zTD@V_VzEAE z*8#*uDy^CSI`vT{o1ST`scGesei@dar1}(p0U~bMYdea2oB#j-07*qoM6N<$g4Lf` AHUIzs literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/source_txt.png b/harbour/contrib/hbide/resources/source_txt.png new file mode 100644 index 0000000000000000000000000000000000000000..aca9b032aeeac6c539e4199ea6899f9953ccff90 GIT binary patch literal 896 zcmV-`1AqL9P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$T5=lfsR5*=o zl1*q_RTze!bMKuyAwM&Bl9~KCO|dheMG{F2L0dGNf<~c&Xmrymk)+nByQb@`+z3S! z-H96&x@$E>M6`-+5^0@j)y8TYtuu|ubTWVGq`AN6xM*fn@LQgb_c`x*-y@V#08Gxz z>cH^f{l7okox1mpwZC%Z)$5hx-{yvI@c*;?;rnlG3Z)d2Gqc+Mhabuv96yjW>R;04 zxxDxBM?AGJO=9p>q<IfgN`gS*`#z52uyi5ootpn*RNJ9FaPWx($*A~)uH8=({_1U} zTK*)M|DI^)E~3#WmSqu%bkN@3MkLa~Bcns1u&K`)I{?Ep4T|f_>{8oMze+vd!JUD< zNWB9oC7$Qu`#!Gg;&~oQDRfPAH2~PRS4pPFQC}ay>+VC`Q4CDH*%W)8*A&~fjqAE7 zg=jp1;`#!(8;JEYxb-TlRs!17O_A%m1VMoB`zWPogl_;C-dgK@15>D#cTkBQ^k9qF z;A>6WK@cE>KnQ_hG)?~lczmqyglU+FwGU863wbR@@BPmZ1OZY?05nZQ2!XEan5Kzs z+jjx`_6q&XxrI@+@d-p)&`O)Eo6i&9u?jSA2MC2i%`*UF{J9rSL?V5fcI{mhCWWnb z5<{<3tyVEj6UT9=R4SB8C4wMeWMl-(vQSDPrIf~_V`CF?djZX?p_OgESs5msawy!| zpjNBlc^;-|qG=jZO1?Y4$l&0ET>9yX`sK>y1?^U`yyeT=Y_}dES8k;oog|aVkk99_ zZ5v(J5klZN4#kZ!z1?xrdv-(M*M7`iJZXG7pUo{TR?>SqZBg`Q=t~MhJApMq(=?5% zzg^>%=_wM41Q&kD_(zXUPXjB)*|X<wR;smgb8~Z#^|rPCCp62lNTpKr^z?8ecawNL zP9}TVKXmBuvCV4bv{FhMg+k$YSE9Fj%XTxJG0V_(on$gee}6x*Sd4Hue78z1Bu{<z zdHv<dm!@i!(rKlX2Ot_%Jw5T_P)j&;EM(}NfcW=kkxHpwmw#T&UR*i}TvtlT#_n&i Wdwc1u?HKg{0000<MNUMnLSTZDD69_v literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/source_unknown.png b/harbour/contrib/hbide/resources/source_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc275250b4d083da65668225e8fc519356c840c GIT binary patch literal 616 zcmV-u0+;=XP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$R`bk7VR5*=| zlg&$3K@^9d`MQ^uDJ`SVO&=7rlOigJpjPItRqo6{knpc)-?lb^5H1oc+7(fo!pcfi zC`$sf(nY@S<-T|Bozuc*@Xdq<hS|*XoO6E6C=mf*aCmG7a1yZm-+F!f*3A_qA`A|X z*|VqnRxX`C(_^gxKtvD`LJ)!kLI_9*)J;RDEO|LS6UHYd`(m}j7tWpP>Fw<S*tjgR z<@DZDRTV~SP8>g??@v7%jRNhgP4K@2-h1l0rm8Bu_k<8ourtjY{#@J+j@7;Qlx0a( zRnQffY;C=1np8PfZJH)!)Flwv9*z)zwH6T}&+~3U*aX*goxl(RN-4C~D5Ve)oO6_A z*)53BW`T$#$QXk$2CX#!N~vza>gp=rmY1>Cl4TjrIh=Fkc}|vPWLbtWCXKQYc+(_7 zoU^WLj4?Rpk}S`2j4^m$^Xc;vBEq{5bK%YOt0($z0e~?EYi-(EYg(-qKYp%p?C2p5 z?%zYZ^=oZ@c4lIWAcm#2PIHS0lT#1bw|6(4PKT$@o>w<UN3H^kQ6S#?)PYheg%m?< zx7!IG8oGA9Xty4Vh(y8s+xH8d_<`bUD~f{k^>vD(AYj7X@q6C~F82?7U0S>&A~k@D zFY03dl>=JI2*@r3#ik{p3G;KaFFr2JJ^;Q*gn-}SWR}5e*zf}Y0000<MNUMnLSTZX Cn-MGk literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbxbp/xbpwindow.prg b/harbour/contrib/hbxbp/xbpwindow.prg index 8f9d1132d2..e2a5b6a795 100644 --- a/harbour/contrib/hbxbp/xbpwindow.prg +++ b/harbour/contrib/hbxbp/xbpwindow.prg @@ -442,7 +442,7 @@ METHOD XbpWindow:connectWindowEvents() // ::connectEvent( ::pWidget, QEvent_Move , {|e| ::grabEvent( QEvent_Move , e ) } ) * ::connectEvent( ::pWidget, QEvent_Paint , {|e| ::grabEvent( QEvent_Paint , e ) } ) - ::connectEvent( ::pWidget, QEvent_Resize , {|e| ::grabEvent( QEvent_Resize , e ) } ) +* ::connectEvent( ::pWidget, QEvent_Resize , {|e| ::grabEvent( QEvent_Resize , e ) } ) // ::connectEvent( ::pWidget, QEvent_FocusIn , {|e| ::grabEvent( QEvent_FocusIn , e ) } ) ::connectEvent( ::pWidget, QEvent_FocusOut , {|e| ::grabEvent( QEvent_FocusOut , e ) } ) @@ -478,7 +478,11 @@ METHOD XbpWindow:destroy() HBXBP_DBG( ". " ) HBXBP_DBG( ". " ) HBXBP_DBG( ". " ) -HBXBP_DBG( hb_threadId(),"Destroy[ B ] "+pad(__ObjGetClsName( self ),12)+ IF(empty(::cargo),'',str(::cargo) ), memory( 1001 ), hbqt_getMemUsed() ) +HBXBP_DBG( hb_threadId(),"Destroy[ B ] "+pad(cCls,12)+ IF(empty(::cargo),'',str(::cargo) ), memory( 1001 ), hbqt_getMemUsed() ) + + LOCAL cCls := __ObjGetClsName( self ), cMsg +cMsg := iif( cCls == "XBPWINDOW", ::oWidget:objectName(), IF( empty(::cargo),'',str(::cargo) ) ) +HBXBP_DBG( hb_threadId(),"Destroy[ B ] "+pad(cCls,12)+ cMsg, memory( 1001 ), hbqt_getMemUsed() ) #endif ::oParent := NIL ::oOwner := NIL @@ -503,7 +507,7 @@ HBXBP_DBG( hb_threadId(),"Destroy[ B ] "+pad(__ObjGetClsName( self ),12)+ IF(emp IF !empty( ::qtObject ) ::qtObject:destroy() - ::qtObject := NIL +// ::qtObject := NIL ENDIF IF !empty( ::qLayout ) @@ -511,8 +515,9 @@ HBXBP_DBG( hb_threadId(),"Destroy[ B ] "+pad(__ObjGetClsName( self ),12)+ IF(emp ENDIF ::oWidget := NIL - #if 0 +HBXBP_DBG( hb_threadId(),"Destroy[ E ] "+pad(__ObjGetClsName( self ),12)+ IF(empty(::cargo),'',str(::cargo) ), memory( 1001 ), hbqt_getMemUsed() ) + HBXBP_DBG( ". " ) HBXBP_DBG( ". " ) HBXBP_DBG( ". " )