From c282aa16ae87c2696ff8649152093823b2ffd428 Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Sat, 7 Aug 2010 22:50:47 +0000 Subject: [PATCH] 2010-08-07 15:35 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + contrib/hbide/resources/dbf_p1.png + contrib/hbide/resources/dbf_p10.png + contrib/hbide/resources/dbf_p2.png + contrib/hbide/resources/dbf_p3.png + contrib/hbide/resources/dbf_p4.png + contrib/hbide/resources/dbf_p5.png + contrib/hbide/resources/dbf_p6.png + contrib/hbide/resources/dbf_p7.png + contrib/hbide/resources/dbf_p8.png + contrib/hbide/resources/dbf_p9.png * contrib/hbide/resources/formview.png * contrib/hbide/resources/home3.png * contrib/hbide/resources/new.png * contrib/hbide/resources/print.png * contrib/hbide/resources/statistics.png * contrib/hbide/resources/view_organized.png * contrib/hbide/resources/view_tiled.png * contrib/hbide/resources/view_vertstacked.png * contrib/hbide/resources/view_zoomin.png * contrib/hbide/resources/view_zoomout.png + contrib/hbide/resources/zoomin3.png + contrib/hbide/resources/zoomout3.png * contrib/hbide/hbide.qrc + Added and refined above images. * contrib/hbide/idedocks.prg + Assigned: "statistics" icon to "Welcome" tab. ! Reworked: many artifacts. * contrib/hbide/idebrowse.prg + Implemented: Edits MDI area icons equivilent functionality in ideDBU panels also. Now you can view browsers in organized, cascaded, tiled, maximized, vertically tiled, horizontally tiled, mode. Verically|Horizontally tiled modes can be zoomed to fit the user requirements. However the last close mode is not retained. Next run always open the "Main" panel with "Organized" view. + Assigned: color-differentiated icons to every open browser window. Now the view is more attractive and allows one to memorize a browser by color. With this commit, rounds of beutification for this session ends. Now concentrating on a really-useful implementation you will know by the end of next-week. --- harbour/ChangeLog | 48 +++ harbour/contrib/hbide/hbide.qrc | 14 + harbour/contrib/hbide/idebrowse.prg | 273 +++++++++++++----- harbour/contrib/hbide/idedocks.prg | 132 ++++----- harbour/contrib/hbide/resources/dbf_p1.png | Bin 0 -> 123 bytes harbour/contrib/hbide/resources/dbf_p10.png | Bin 0 -> 119 bytes harbour/contrib/hbide/resources/dbf_p2.png | Bin 0 -> 110 bytes harbour/contrib/hbide/resources/dbf_p3.png | Bin 0 -> 116 bytes harbour/contrib/hbide/resources/dbf_p4.png | Bin 0 -> 115 bytes harbour/contrib/hbide/resources/dbf_p5.png | Bin 0 -> 114 bytes harbour/contrib/hbide/resources/dbf_p6.png | Bin 0 -> 117 bytes harbour/contrib/hbide/resources/dbf_p7.png | Bin 0 -> 123 bytes harbour/contrib/hbide/resources/dbf_p8.png | Bin 0 -> 116 bytes harbour/contrib/hbide/resources/dbf_p9.png | Bin 0 -> 123 bytes harbour/contrib/hbide/resources/formview.png | Bin 592 -> 587 bytes harbour/contrib/hbide/resources/home3.png | Bin 436 -> 448 bytes harbour/contrib/hbide/resources/new.png | Bin 2941 -> 312 bytes harbour/contrib/hbide/resources/print.png | Bin 2975 -> 336 bytes .../contrib/hbide/resources/statistics.png | Bin 0 -> 689 bytes .../hbide/resources/view_organized.png | Bin 353 -> 392 bytes .../contrib/hbide/resources/view_tiled.png | Bin 374 -> 434 bytes .../hbide/resources/view_vertstacked.png | Bin 335 -> 390 bytes .../contrib/hbide/resources/view_zoomin.png | Bin 843 -> 863 bytes .../contrib/hbide/resources/view_zoomout.png | Bin 835 -> 855 bytes harbour/contrib/hbide/resources/zoomin3.png | Bin 0 -> 781 bytes harbour/contrib/hbide/resources/zoomout3.png | Bin 0 -> 769 bytes 26 files changed, 324 insertions(+), 143 deletions(-) create mode 100644 harbour/contrib/hbide/resources/dbf_p1.png create mode 100644 harbour/contrib/hbide/resources/dbf_p10.png create mode 100644 harbour/contrib/hbide/resources/dbf_p2.png create mode 100644 harbour/contrib/hbide/resources/dbf_p3.png create mode 100644 harbour/contrib/hbide/resources/dbf_p4.png create mode 100644 harbour/contrib/hbide/resources/dbf_p5.png create mode 100644 harbour/contrib/hbide/resources/dbf_p6.png create mode 100644 harbour/contrib/hbide/resources/dbf_p7.png create mode 100644 harbour/contrib/hbide/resources/dbf_p8.png create mode 100644 harbour/contrib/hbide/resources/dbf_p9.png create mode 100644 harbour/contrib/hbide/resources/statistics.png create mode 100644 harbour/contrib/hbide/resources/zoomin3.png create mode 100644 harbour/contrib/hbide/resources/zoomout3.png diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 8cd1500425..437bff26e3 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,54 @@ The license applies to all entries newer than 2009-04-28. */ +2010-08-07 15:35 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + + contrib/hbide/resources/dbf_p1.png + + contrib/hbide/resources/dbf_p10.png + + contrib/hbide/resources/dbf_p2.png + + contrib/hbide/resources/dbf_p3.png + + contrib/hbide/resources/dbf_p4.png + + contrib/hbide/resources/dbf_p5.png + + contrib/hbide/resources/dbf_p6.png + + contrib/hbide/resources/dbf_p7.png + + contrib/hbide/resources/dbf_p8.png + + contrib/hbide/resources/dbf_p9.png + * contrib/hbide/resources/formview.png + * contrib/hbide/resources/home3.png + * contrib/hbide/resources/new.png + * contrib/hbide/resources/print.png + * contrib/hbide/resources/statistics.png + * contrib/hbide/resources/view_organized.png + * contrib/hbide/resources/view_tiled.png + * contrib/hbide/resources/view_vertstacked.png + * contrib/hbide/resources/view_zoomin.png + * contrib/hbide/resources/view_zoomout.png + + contrib/hbide/resources/zoomin3.png + + contrib/hbide/resources/zoomout3.png + * contrib/hbide/hbide.qrc + + Added and refined above images. + + * contrib/hbide/idedocks.prg + + Assigned: "statistics" icon to "Welcome" tab. + ! Reworked: many artifacts. + + * contrib/hbide/idebrowse.prg + + Implemented: Edits MDI area icons equivilent functionality + in ideDBU panels also. Now you can view browsers in + organized, cascaded, tiled, maximized, vertically tiled, + horizontally tiled, mode. Verically|Horizontally tiled + modes can be zoomed to fit the user requirements. + However the last close mode is not retained. Next run + always open the "Main" panel with "Organized" view. + + + Assigned: color-differentiated icons to every open browser + window. Now the view is more attractive and allows one to + memorize a browser by color. + + + With this commit, rounds of beutification for this session ends. + Now concentrating on a really-useful implementation you will + know by the end of next-week. + 2010-08-07 15:28 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbxbp/xbp.ch + Added: few more constants with HBP* prefix to be used diff --git a/harbour/contrib/hbide/hbide.qrc b/harbour/contrib/hbide/hbide.qrc index 7d19a9c113..f52a38fe83 100644 --- a/harbour/contrib/hbide/hbide.qrc +++ b/harbour/contrib/hbide/hbide.qrc @@ -40,6 +40,16 @@ resources/database_search.png resources/dbl2sglquote.png resources/dbstruct.png +resources/dbf_p1.png +resources/dbf_p2.png +resources/dbf_p3.png +resources/dbf_p4.png +resources/dbf_p5.png +resources/dbf_p6.png +resources/dbf_p7.png +resources/dbf_p8.png +resources/dbf_p9.png +resources/dbf_p10.png resources/dc_delete.png resources/dc_down.png resources/dc_folder.png @@ -103,6 +113,7 @@ resources/hb-16x16.png resources/hb-32x32.png resources/hbide.png +resources/hbide3.png resources/hbidesplash.png resources/hbidesplashwatermark.png resources/help.png @@ -189,6 +200,7 @@ resources/source_res.png resources/source_txt.png resources/source_unknown.png +resources/statistics.png resources/spacestotabs.png resources/stream.png resources/streamcomment.png @@ -225,5 +237,7 @@ resources/xmate.png resources/zoomin.png resources/zoomout.png +resources/zoomin3.png +resources/zoomout3.png diff --git a/harbour/contrib/hbide/idebrowse.prg b/harbour/contrib/hbide/idebrowse.prg index 7f2eace8cd..c1addbd40b 100644 --- a/harbour/contrib/hbide/idebrowse.prg +++ b/harbour/contrib/hbide/idebrowse.prg @@ -558,34 +558,39 @@ METHOD IdeBrowseManager:execEvent( cEvent, p, p1 ) ENDIF EXIT - CASE "buttonViewOrganized_clicked" - ::oCurPanel:nViewStyle := 0 - ::oCurPanel:restGeometry() - ::oCurPanel:prepare() - EXIT - - CASE "buttonSaveLayout_clicked" - ::oCurPanel:saveGeometry() - EXIT - - CASE "buttonViewTiled_clicked" - ::oCurPanel:saveGeometry() - ::oCurPanel:tileSubWindows() - ::oCurPanel:nViewStyle := 1 - ::oCurPanel:prepare() - EXIT - - CASE "buttonViewCascaded_clicked" - ::oCurPanel:saveGeometry() - ::oCurPanel:cascadeSubWindows() - ::oCurPanel:nViewStyle := 2 - ::oCurPanel:prepare() - EXIT - + /* Left-toolbar actions */ CASE "buttonViewTabbed_clicked" ::oCurPanel:setViewMode( iif( ::oCurPanel:viewMode() == QMdiArea_TabbedView, QMdiArea_SubWindowView, QMdiArea_TabbedView ) ) EXIT + CASE "buttonViewOrganized_clicked" + ::oCurPanel:setViewStyle( HBPMDI_STYLE_ORGANIZED ) + EXIT + CASE "buttonSaveLayout_clicked" + ::oCurPanel:saveGeometry() + EXIT + CASE "buttonViewCascaded_clicked" + ::oCurPanel:setViewStyle( HBPMDI_STYLE_CASCADED ) + EXIT + CASE "buttonViewTiled_clicked" + ::oCurPanel:setViewStyle( HBPMDI_STYLE_TILED ) + EXIT + CASE "buttonViewMaximized_clicked" + ::oCurPanel:setViewStyle( HBPMDI_STYLE_MAXIMIZED ) + EXIT + CASE "buttonViewStackedVert_clicked" + ::oCurPanel:setViewStyle( HBPMDI_STYLE_TILEDVERT ) + EXIT + CASE "buttonViewStackedHorz_clicked" + ::oCurPanel:setViewStyle( HBPMDI_STYLE_TILEDHORZ ) + EXIT + CASE "buttonViewZoomedIn_clicked" + ::oCurPanel:tilesZoom( +1 ) + EXIT + CASE "buttonViewZoomedOut_clicked" + ::oCurPanel:tilesZoom( -1 ) + EXIT + /* Left-toolbar Table Manipulation Actions */ CASE "buttonDbStruct_clicked" IF !empty( ::oCurBrw ) ::showStruct() @@ -663,6 +668,7 @@ METHOD IdeBrowseManager:execEvent( cEvent, p, p1 ) EXIT CASE "buttonZaptable_clicked" EXIT + /* End - left-toolbar actions */ ENDSWITCH @@ -909,7 +915,7 @@ METHOD IdeBrowseManager:buildToolbar() ::buildToolButton( ::qToolbar, {} ) ::buildIndexButton() ::buildToolButton( ::qToolbar, { "Search in table" , "find" , {|| ::execEvent( "buttonFind_clicked" ) }, .f. } ) - ::buildToolButton( ::qToolbar, { "Goto record" , "gotoline" , {|| ::execEvent( "buttonGoto_clicked" ) }, .f. } ) + ::buildToolButton( ::qToolbar, { "Goto record" , "gotoline3" , {|| ::execEvent( "buttonGoto_clicked" ) }, .f. } ) ::buildToolButton( ::qToolbar, {} ) ::buildToolButton( ::qToolbar, { "Close current table", "dc_delete" , {|| ::execEvent( "buttonClose_clicked" ) }, .f. } ) ::qToolbar:addWidget( sp3 ) @@ -931,23 +937,22 @@ METHOD IdeBrowseManager:buildLeftToolbar() qTBar := ::qToolbarL aBtn := {} - aadd( aBtn, hbide_buildToolbarButton( qTBar, { "Toggle tabbed view" , "view_tabbed" , {|| ::execEvent( "buttonViewTabbed_clicked" ) }, .f. } ) ) + aadd( aBtn, hbide_buildToolbarButton( qTBar, { "Toggle tabbed view" , "view_tabbed" , {|| ::execEvent( "buttonViewTabbed_clicked" ) }, .f. } ) ) hbide_buildToolbarButton( qTBar, {} ) - aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View as arranged" , "view_organized" , {|| ::execEvent( "buttonViewOrganized_clicked" ) }, .f. } ) ) - aadd( aBtn, hbide_buildToolbarButton( qTBar, { "Save layout" , "save3" , {|| ::execEvent( "buttonSaveLayout_clicked" ) }, .f. } ) ) + aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View as arranged" , "view_organized" , {|| ::execEvent( "buttonViewOrganized_clicked" ) }, .f. } ) ) + aadd( aBtn, hbide_buildToolbarButton( qTBar, { "Save layout" , "save3" , {|| ::execEvent( "buttonSaveLayout_clicked" ) }, .f. } ) ) hbide_buildToolbarButton( qTBar, {} ) - aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View as cascaded" , "view_cascaded" , {|| ::execEvent( "buttonViewCascaded_clicked" ) }, .f. } ) ) - aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View as tiled" , "view_tiled" , {|| ::execEvent( "buttonViewTiled_clicked" ) }, .f. } ) ) - aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View Maximized" , "fullscreen" , {|| ::execEvent( "buttonViewMaximized_clicked" ) }, .f. } ) ) + aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View as cascaded" , "view_cascaded" , {|| ::execEvent( "buttonViewCascaded_clicked" ) }, .f. } ) ) + aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View as tiled" , "view_tiled" , {|| ::execEvent( "buttonViewTiled_clicked" ) }, .f. } ) ) + aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View Maximized" , "fullscreen" , {|| ::execEvent( "buttonViewMaximized_clicked" ) }, .f. } ) ) aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View Vertically Tiled" , "view_vertstacked", {|| ::execEvent( "buttonViewStackedVert_clicked" ) }, .f. } ) ) aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View Horizontally Tiled" , "view_horzstacked", {|| ::execEvent( "buttonViewStackedHorz_clicked" ) }, .f. } ) ) - aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View Zoom In" , "view_zoomin" , {|| ::execEvent( "buttonViewZoomedIn_clicked" ) }, .f. } ) ) - aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View Zoom Out" , "view_zoomout" , {|| ::execEvent( "buttonViewZoomedOut_clicked" ) }, .f. } ) ) + aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View Zoom In" , "view_zoomin" , {|| ::execEvent( "buttonViewZoomedIn_clicked" ) }, .f. } ) ) + aadd( aBtn, hbide_buildToolbarButton( qTBar, { "View Zoom Out" , "view_zoomout" , {|| ::execEvent( "buttonViewZoomedOut_clicked" ) }, .f. } ) ) hbide_buildToolbarButton( qTBar, {} ) aeval( aBtn, {|q| aadd( ::aToolBtns, q ) } ) -#if 1 ::buildToolButton( ::qToolbarL, { "Append a record" , "database_add" , {|| ::execEvent( "buttonAppendRecord_clicked" ) }, .f. } ) ::buildToolButton( ::qToolbarL, { "Delete a record" , "database_remove" , {|| ::execEvent( "buttonDelRecord_clicked" ) }, .f. } ) ::buildToolButton( ::qToolbarL, { "Lock/Unlock Record" , "database_lock" , {|| ::execEvent( "buttonLockRecord_clicked" ) }, .f. } ) @@ -960,7 +965,6 @@ METHOD IdeBrowseManager:buildLeftToolbar() ::buildToolButton( ::qToolbarL, { "Search in Table" , "database_search" , {|| ::execEvent( "buttonSearchInTable_clicked" ) }, .f. } ) ::buildToolButton( ::qToolbarL, {} ) ::buildToolButton( ::qToolbarL, { "Zap Table" , "database_process" , {|| ::execEvent( "buttonZaptable_clicked" ) }, .f. } ) -#endif RETURN Self @@ -1156,19 +1160,12 @@ CLASS IdeBrowsePanel INHERIT IdeObject METHOD saveGeometry() METHOD restGeometry() METHOD activateBrowser() + METHOD setViewStyle( nStyle ) + METHOD tileVertically() + METHOD tileHorizontally() + METHOD tilesZoom( nMode ) - METHOD viewMode() INLINE ::qWidget:viewMode() - METHOD setViewMode( nMode ) INLINE ::qWidget:setViewMode( nMode ) - METHOD tileSubWindows() INLINE ::qWidget:tileSubWindows() - METHOD cascadeSubWindows() INLINE ::qWidget:cascadeSubWindows() - METHOD activateNextSubWindow() INLINE ::qWidget:activateNextSubWindow() - METHOD activatePreviousSubWindow() INLINE ::qWidget:activatePreviousSubWindow() - - #if 0 - closeActiveSubWindow() - closeAllSubWindows() - setActiveSubWindow( QMdiSubWindow ) - #endif + ERROR HANDLER OnError( ... ) ENDCLASS @@ -1184,6 +1181,11 @@ METHOD IdeBrowsePanel:new( oIde, cPanel, oManager ) ::qWidget:setObjectName( ::cPanel ) ::qWidget:setDocumentMode( .t. ) ::qWidget:setOption( QMdiArea_DontMaximizeSubWindowOnActivation, .t. ) + ::qWidget:setVerticalScrollBarPolicy( Qt_ScrollBarAsNeeded ) + ::qWidget:setHorizontalScrollBarPolicy( Qt_ScrollBarAsNeeded ) + ::qWidget:setDocumentMode( .t. ) + ::qWidget:setTabShape( QTabWidget_Triangular ) + ::qWidget:setViewMode( QMdiArea_TabbedView ) ::connect( ::qWidget, "subWindowActivated(QMdiSubWindow)", {|p| ::execEvent( "mdiArea_subWindowActivated", p ) } ) @@ -1205,6 +1207,156 @@ METHOD IdeBrowsePanel:destroy() /*----------------------------------------------------------------------*/ +METHOD IdeBrowsePanel:onError( ... ) + LOCAL cMsg + + cMsg := __GetMessage() + IF SubStr( cMsg, 1, 1 ) == "_" + cMsg := SubStr( cMsg, 2 ) + ENDIF + + RETURN ::qWidget:&cMsg( ... ) + +/*------------------------------------------------------------------------*/ + +METHOD IdeBrowsePanel:setViewStyle( nStyle ) + LOCAL qObj, a_ + LOCAL nOldStyle := ::nViewStyle + + IF hb_isNumeric( nStyle ) + IF nStyle != ::nViewStyle + IF ::nViewStyle == HBPMDI_STYLE_ORGANIZED + ::saveGeometry() + ENDIF + + IF ::nViewStyle == HBPMDI_STYLE_MAXIMIZED + qObj := QMdiSubWindow():from( ::activeSubWindow() ) + FOR EACH a_ IN ::aBrowsers + a_[ 2 ]:setWindowState( Qt_WindowNoState ) + NEXT + ::setActiveSubWindow( qObj ) + ENDIF + + SWITCH nStyle + CASE HBPMDI_STYLE_ORGANIZED + ::restGeometry() + EXIT + CASE HBPMDI_STYLE_CASCADED + ::qWidget:cascadeSubWindows() + EXIT + CASE HBPMDI_STYLE_TILED + ::qWidget:tileSubWindows() + EXIT + CASE HBPMDI_STYLE_MAXIMIZED + qObj := QMdiSubWindow():from( ::activeSubWindow() ) + FOR EACH a_ IN ::aBrowsers + a_[ 2 ]:setWindowState( Qt_WindowMaximized ) + NEXT + ::setActiveSubWindow( qObj ) + EXIT + CASE HBPMDI_STYLE_TILEDVERT + ::tileVertically() + EXIT + CASE HBPMDI_STYLE_TILEDHORZ + ::tileHorizontally() + EXIT + ENDSWITCH + + ::nViewStyle := nStyle + ::prepare() + ENDIF + ENDIF + RETURN nOldStyle + +/*----------------------------------------------------------------------*/ + +METHOD IdeBrowsePanel:tileVertically() + LOCAL qObj, qVPort, nH, nT, nW, a_ + + qObj := ::activeSubWindow() + qVPort := QWidget():from( ::viewport() ) + nH := qVPort:height() / len( ::aBrowsers ) + nW := qVPort:width() + nT := 0 + FOR EACH a_ IN ::aBrowsers + a_[ 2 ]:setGeometry( QRect():new( 0, nT, nW, nH ) ) + nT += nH + NEXT + ::setActiveSubWindow( qObj ) + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeBrowsePanel:tileHorizontally() + LOCAL qObj, qVPort, nH, nT, nW, nL, a_ + + qObj := ::activeSubWindow() + qVPort := QWidget():from( ::viewport() ) + nH := qVPort:height() + nW := qVPort:width() / len( ::aBrowsers ) + nT := 0 + nL := 0 + FOR EACH a_ IN ::aBrowsers + a_[ 2 ]:setGeometry( QRect():new( nL, nT, nW, nH ) ) + nL += nW + NEXT + ::setActiveSubWindow( qObj ) + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeBrowsePanel:tilesZoom( nMode ) + LOCAL qMdi, nT, nL, nH, nW, qRect, a_ + + IF ::nViewStyle == HBPMDI_STYLE_TILEDVERT .OR. ::nViewStyle == HBPMDI_STYLE_TILEDHORZ + IF ::nViewStyle == HBPMDI_STYLE_TILEDVERT + nT := 0 + FOR EACH a_ IN ::aBrowsers + qMdi := a_[ 2 ] + qRect := QRect():from( qMdi:geometry() ) + nH := qRect:height() + ( nMode * ( qRect:height() / 4 ) ) + qMdi:setGeometry( QRect():new( 0, nT, qRect:width(), nH ) ) + nT += nH + NEXT + ELSE + nL := 0 + FOR EACH a_ IN ::aBrowsers + qMdi := a_[ 2 ] + qRect := QRect():from( qMdi:geometry() ) + nW := qRect:width() + ( nMode * ( qRect:width() / 4 ) ) + qMdi:setGeometry( QRect():new( nL, 0, nW, qRect:height() ) ) + nL += nW + NEXT + ENDIF + + ::prepare() + ENDIF + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeBrowsePanel:saveGeometry() + LOCAL a_ + IF ::nViewStyle == HBPMDI_STYLE_ORGANIZED + FOR EACH a_ IN ::aBrowsers + a_[ SUB_GEOMETRY ] := QRect():from( a_[ SUB_WINDOW ]:geometry() ) + NEXT + ENDIF + RETURN Self + +/*------------------------------------------------------------------------*/ + +METHOD IdeBrowsePanel:restGeometry() + LOCAL a_ + FOR EACH a_ IN ::aBrowsers + IF hb_isObject( a_[ SUB_GEOMETRY ] ) + a_[ SUB_WINDOW ]:setGeometry( a_[ SUB_GEOMETRY ] ) + ENDIF + NEXT + RETURN Self + +/*----------------------------------------------------------------------*/ + METHOD IdeBrowsePanel:destroyBrw( oBrw ) LOCAL n, oSub @@ -1296,30 +1448,6 @@ METHOD IdeBrowsePanel:activateBrowser() ENDIF RETURN Self -/*----------------------------------------------------------------------*/ - -METHOD IdeBrowsePanel:saveGeometry() - LOCAL a_ - IF ::nViewStyle == 0 /* Only if in self organized mode */ - FOR EACH a_ IN ::aBrowsers - a_[ SUB_GEOMETRY ] := QRect():from( a_[ SUB_WINDOW ]:geometry() ) - NEXT - ENDIF - RETURN Self - -/*------------------------------------------------------------------------*/ - -METHOD IdeBrowsePanel:restGeometry() - LOCAL a_ - IF ::nViewStyle == 0 - FOR EACH a_ IN ::aBrowsers - IF hb_isObject( a_[ SUB_GEOMETRY ] ) - a_[ SUB_WINDOW ]:setGeometry( a_[ SUB_GEOMETRY ] ) - ENDIF - NEXT - ENDIF - RETURN Self - /*----------------------------------------------------------------------*/ // // Class IdeBrowse @@ -1376,6 +1504,8 @@ CLASS IdeBrowse INHERIT IdeObject DATA aSeek INIT {} DATA aToFld INIT {} + CLASSDATA nIdentity INIT 0 + METHOD new( oIde, oManager, oPanel, aInfo ) METHOD create( oIde, oManager, oPanel, aInfo ) METHOD configure() @@ -1702,6 +1832,7 @@ METHOD IdeBrowse:buildMdiWindow() ::qMdi:setWindowTitle( ::cTable ) ::qMdi:setObjectName( hb_ntos( nID ) ) + ::qMdi:setWindowIcon( hbide_image( "dbf_p" + hb_ntos( ::nID ) ) ) IF ! empty( ::aInfo[ TBL_GEOMETRY ] ) qRect := hb_aTokens( ::aInfo[ TBL_GEOMETRY ], " " ) diff --git a/harbour/contrib/hbide/idedocks.prg b/harbour/contrib/hbide/idedocks.prg index 67485be1eb..02eb013ddd 100644 --- a/harbour/contrib/hbide/idedocks.prg +++ b/harbour/contrib/hbide/idedocks.prg @@ -246,20 +246,20 @@ METHOD IdeDocks:getEditorPanelsInfo() METHOD IdeDocks:buildDialog() LOCAL s, aSize, a_, lTiled := .t., x_ - ::oIde:oDlg := XbpDialog():new() - ::oDlg:icon := hbide_image( "hbide" ) - ::oDlg:title := "Harbour IDE" + ::oIde:oDlg := XbpDialog():new() + ::oDlg:icon := hbide_image( "hbide" ) + ::oDlg:title := "Harbour IDE" ::oDlg:qtObject := hbide_getUI( "mainwindow" ) ::oDlg:create( , , , , , .f. ) ::oDlg:setStyleSheet( GetStyleSheet( "QMainWindow", ::nAnimantionMode ) ) ::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( 900,470 ) + ::oDlg:setDockOptions( QMainWindow_AllowTabbedDocks + QMainWindow_ForceTabbedDocks ) + ::oDlg:setTabPosition( Qt_BottomDockWidgetArea, QTabWidget_South ) + ::oDlg:setCorner( Qt_BottomLeftCorner, Qt_LeftDockWidgetArea ) + ::oDlg:setCorner( Qt_BottomRightCorner, Qt_RightDockWidgetArea ) + ::oDlg:resize( 900,470 ) ::oIde:oDa := ::oDlg:drawingArea @@ -280,7 +280,7 @@ METHOD IdeDocks:buildDialog() ::oIde:qLayout:setHorizontalSpacing( 0 ) ::oIde:qLayout:setVerticalSpacing( 0 ) // - ::oDa:oWidget:setLayout( ::qLayout ) + ::oDa:setLayout( ::qLayout ) IF ::oIde:lCurEditsMdi ::buildMdiToolbar() @@ -308,7 +308,7 @@ METHOD IdeDocks:buildDialog() ENDIF DEFAULT a_[ 3 ] TO "0" DEFAULT a_[ 4 ] TO "0" - DEFAULT a_[ 5 ] TO "0" + DEFAULT a_[ 5 ] TO hb_ntos( QMdiArea_TabbedView ) DEFAULT a_[ 6 ] TO "0" a_[ 3 ] := val( a_[ 3 ] ) a_[ 4 ] := val( a_[ 4 ] ) @@ -330,20 +330,20 @@ METHOD IdeDocks:buildDialog() NEXT IF ::oIde:lCurEditsMdi IF lTiled - ::oStackedWidget:oWidget:tileSubWindows() + ::oStackedWidget:tileSubWindows() ENDIF ENDIF ::setView( "Stats" ) /* Always call with name */ IF ::oIde:lCurEditsMdi IF x_[ 1,5 ] == QMdiArea_TabbedView - ::oStackedWidget:oWidget:setViewMode( QMdiArea_TabbedView ) + ::oStackedWidget:setViewMode( QMdiArea_TabbedView ) ENDIF IF x_[ 1,6 ] == 1 - ::oStackedWidget:oWidget:tileSubWindows() + ::oStackedWidget:tileSubWindows() ELSEIF x_[ 1,6 ] == 2 - ::oStackedWidget:oWidget:cascadeSubWindows() + ::oStackedWidget:cascadeSubWindows() ELSEIF x_[ 1,6 ] == 3 ::stackMaximized() #if 0 /* At this point size of the viewport is not determined */ @@ -588,53 +588,46 @@ HB_TRACE( HB_TR_DEBUG, "projectTree_dropEvent" ) ENDIF EXIT + /* Left-toolbar actions */ + CASE "buttonViewTabbed_clicked" + ::oStackedWidget:setViewMode( iif( ::oStackedWidget:viewMode() == QMdiArea_TabbedView, QMdiArea_SubWindowView, QMdiArea_TabbedView ) ) + EXIT CASE "buttonViewOrganized_clicked" - ::nViewStyle := 0 + ::nViewStyle := HBPMDI_STYLE_ORGANIZED ::restState() EXIT - - CASE "buttonViewTiled_clicked" - ::oStackedWidget:oWidget:tileSubWindows() - ::nViewStyle := 1 - EXIT - - CASE "buttonViewCascaded_clicked" - ::oStackedWidget:oWidget:cascadeSubWindows() - ::nViewStyle := 2 - EXIT - - CASE "buttonViewMaximized_clicked" - ::nViewStyle := 3 - ::stackMaximized() - EXIT - - CASE "buttonViewStackedVert_clicked" - ::nViewStyle := 4 - ::stackVertically() - EXIT - - CASE "buttonViewStackedHorz_clicked" - ::nViewStyle := 5 - ::stackHorizontally() - EXIT - - CASE "buttonViewZoomedIn_clicked" - ::stackZoom( +1 ) - EXIT - - CASE "buttonViewZoomedOut_clicked" - ::stackZoom( -1 ) - EXIT - - CASE "buttonViewTabbed_clicked" - ::oStackedWidget:oWidget:setViewMode( iif( ::oStackedWidget:oWidget:viewMode() == QMdiArea_TabbedView, QMdiArea_SubWindowView, QMdiArea_TabbedView ) ) - EXIT - CASE "buttonSaveLayout_clicked" - IF ::nViewStyle == 0 + IF ::nViewStyle == HBPMDI_STYLE_ORGANIZED ::savePanelsGeometry() ENDIF EXIT + CASE "buttonViewTiled_clicked" + ::oStackedWidget:tileSubWindows() + ::nViewStyle := HBPMDI_STYLE_TILED + EXIT + CASE "buttonViewCascaded_clicked" + ::oStackedWidget:cascadeSubWindows() + ::nViewStyle := HBPMDI_STYLE_CASCADED + EXIT + CASE "buttonViewMaximized_clicked" + ::nViewStyle := HBPMDI_STYLE_MAXIMIZED + ::stackMaximized() + EXIT + CASE "buttonViewStackedVert_clicked" + ::nViewStyle := HBPMDI_STYLE_TILEDVERT + ::stackVertically() + EXIT + CASE "buttonViewStackedHorz_clicked" + ::nViewStyle := HBPMDI_STYLE_TILEDHORZ + ::stackHorizontally() + EXIT + CASE "buttonViewZoomedIn_clicked" + ::stackZoom( +1 ) + EXIT + CASE "buttonViewZoomedOut_clicked" + ::stackZoom( -1 ) + EXIT + /* Ends: MDI actions */ CASE "mdiSubWindow_windowStateChanged" IF ! empty( ::oIde:aMdies ) @@ -653,25 +646,22 @@ HB_TRACE( HB_TR_DEBUG, "projectTree_dropEvent" ) METHOD IdeDocks:restState( nMode ) LOCAL qMdi - HB_SYMBOL_UNUSED( nMode ) FOR EACH qMdi IN ::oIde:aMdies - qMdi:setWindowState( 0 ) + qMdi:setWindowState( Qt_WindowNoState ) NEXT ::restPanelsGeometry() - RETURN Self /*----------------------------------------------------------------------*/ METHOD IdeDocks:stackMaximized() LOCAL qObj, qMdi - - qObj := QMdiSubWindow():from( ::oStackedWidget:oWidget:activeSubWindow() ) + qObj := QMdiSubWindow():from( ::oStackedWidget:activeSubWindow() ) FOR EACH qMdi IN ::oIde:aMdies qMdi:setWindowState( Qt_WindowMaximized ) NEXT - ::oStackedWidget:oWidget:setActiveSubWindow( qObj ) + ::oStackedWidget:setActiveSubWindow( qObj ) RETURN Self /*----------------------------------------------------------------------*/ @@ -713,10 +703,8 @@ METHOD IdeDocks:stackHorizontally() ::restState( 0 ) - qArea := ::oStackedWidget:oWidget - + qArea := ::oStackedWidget qObj := QMdiSubWindow():from( qArea:activeSubWindow() ) - qVPort := QWidget():from( qArea:viewport() ) nH := qVPort:height() nW := qVPort:width() / ( len( ::oIde:aMdies ) - 1 ) @@ -730,7 +718,7 @@ METHOD IdeDocks:stackHorizontally() ENDIF NEXT - ::oStackedWidget:oWidget:setActiveSubWindow( qObj ) + ::oStackedWidget:setActiveSubWindow( qObj ) RETURN Self /*----------------------------------------------------------------------*/ @@ -738,12 +726,10 @@ METHOD IdeDocks:stackHorizontally() METHOD IdeDocks:stackVertically() LOCAL qArea, qObj, qVPort, nH, nT, nW, qMdi - ::restState() - - qArea := ::oStackedWidget:oWidget + ::restState( 0 ) + qArea := ::oStackedWidget qObj := QMdiSubWindow():from( qArea:activeSubWindow() ) - qVPort := QWidget():from( qArea:viewport() ) nH := qVPort:height() / ( len( ::oIde:aMdies ) - 1 ) nW := qVPort:width() @@ -756,7 +742,7 @@ METHOD IdeDocks:stackVertically() ENDIF NEXT - ::oStackedWidget:oWidget:setActiveSubWindow( qObj ) + ::oStackedWidget:setActiveSubWindow( qObj ) RETURN Self /*----------------------------------------------------------------------*/ @@ -987,8 +973,8 @@ METHOD IdeDocks:buildMdiToolbarLeft() aadd( aBtn, hbide_buildToolbarButton( qTBar, { "Toggle Code Completion" , "help1" , {|| ::oEM:toggleCodeCompetion() }, .f. } ) ) aadd( aBtn, hbide_buildToolbarButton( qTBar, { "Toggle Completion Tips" , "infotips" , {|| ::oEM:toggleCompetionTips() }, .f. } ) ) hbide_buildToolbarButton( qTBar, {} ) - aadd( aBtn, hbide_buildToolbarButton( qTBar, { "Zoom In" , "zoomin" , {|| ::oEM:zoom( +1 ) }, .f. } ) ) - aadd( aBtn, hbide_buildToolbarButton( qTBar, { "Zoom Out" , "zoomout" , {|| ::oEM:zoom( -1 ) }, .f. } ) ) + aadd( aBtn, hbide_buildToolbarButton( qTBar, { "Zoom In" , "zoomin3" , {|| ::oEM:zoom( +1 ) }, .f. } ) ) + aadd( aBtn, hbide_buildToolbarButton( qTBar, { "Zoom Out" , "zoomout3" , {|| ::oEM:zoom( -1 ) }, .f. } ) ) hbide_buildToolbarButton( qTBar, {} ) aeval( aBtn, {|q| aadd( ::aMdiBtns, q ) } ) @@ -1114,7 +1100,9 @@ METHOD IdeDocks:buildViewWidget( cView ) qMdi := QMdiSubWindow():new( ::oStackedWidget:oWidget ) qMdi:setWindowTitle( cView ) qMdi:setObjectName( cView ) - IF cView != "Stats" + IF cView == "Stats" + qMdi:setWindowIcon( hbide_image( "statistics" ) ) + ELSE qMdi:setWindowIcon( ::getPanelIcon( cView ) ) ENDIF diff --git a/harbour/contrib/hbide/resources/dbf_p1.png b/harbour/contrib/hbide/resources/dbf_p1.png new file mode 100644 index 0000000000000000000000000000000000000000..5d94874575b82392bd7b1e19c93dbfa20e6609bc GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`PM$7~Ar-fhQx*sq9Fk~d{r_Kh z^~!oCW#ukLgR?a?4rk6EIB=dl)%mBwEcwpZkPd^CD-D6nE7BQ`dd}3EnR$SRf#I8p Wi{NGd2jW1}7(8A5T-G@yGywp2*eA>Y literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/dbf_p10.png b/harbour/contrib/hbide/resources/dbf_p10.png new file mode 100644 index 0000000000000000000000000000000000000000..69ce1f73d8de397667483e25f08169da9a3d1f12 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`cAhSdAr-fhQx*sq9Fq9Y>iuu> zl8?3g%6AwxqzTHgu?gm}u_bEgHu*4bG?+CbK=a0gKxQ{y2|u=gIWsjF8B{_81V5?o R=mna@;OXk;vd$@?2><{+AoBnK literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/dbf_p2.png b/harbour/contrib/hbide/resources/dbf_p2.png new file mode 100644 index 0000000000000000000000000000000000000000..42aa4ea2754e962359a2393b406a501277d68fc3 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar-fhQx*sq9FpMW;rZWr z^-9B%e!)m%eu2+UhI(ck=1P)ASqD}yUNLTXw8V!~qJo)Wm6ej9obj)NKm!;&UHx3v IIVCg!0Nh|6zyJUM literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/dbf_p3.png b/harbour/contrib/hbide/resources/dbf_p3.png new file mode 100644 index 0000000000000000000000000000000000000000..5b01f7998deb4b54d39e2eefd124694b7472db35 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)}AhoAr-fhQx*sq9FpMW<@w)v zl_lhKM-qdNF+V>uv%Wsd0-4=-7tCW6QBPf!vW(G~fuV1Pg`lOiMkLS} N22WQ%mvv4FO#nX~9v1)r literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/dbf_p4.png b/harbour/contrib/hbide/resources/dbf_p4.png new file mode 100644 index 0000000000000000000000000000000000000000..268d76ca11b7d87fa223afd1512c322cbb7db19f GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`R-P`7Ar-fhQx*sq9E#-S{oi@* z>V*RxSqwhL{QS(!`uZ%7lbQ>XmG4XlWOn0Su!vDaJ#|&evPL5YhNKx5f?^j6TY#o8 Nc)I$ztaD0e0syFfAngDE literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/dbf_p5.png b/harbour/contrib/hbide/resources/dbf_p5.png new file mode 100644 index 0000000000000000000000000000000000000000..9d6f3dd82f5e3e400e4799a96580fffb9b583de1 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`mYyz-Ar-fhQx*sq9FpMW;r-uv zl_lhKM-qdNF~7hkCq+Fo4l^djGZO-t-FO$wV-!(OU6rzo(U^guVuppFa;@A_pdk#N Lu6{1-oD!M<`#T+M literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/dbf_p6.png b/harbour/contrib/hbide/resources/dbf_p6.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe7e8d2d606595277032ed5ac9bf470950497f2 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Hl8kyAr-fhQx*sq9FmCt-}+zO zRoVQqm)j0Tg|j_8H9QJu7?wVqA-Ma;_Wyzj&ThOCrU@334uxrpSQr=%wd@ literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/dbf_p7.png b/harbour/contrib/hbide/resources/dbf_p7.png new file mode 100644 index 0000000000000000000000000000000000000000..4ede4fc3d291862daa604f260e6710ff7b226bf0 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`PM$7~Ar-fhQx*sq9Fo|W|L?!L z>*FLrH@6*(3TOBD@bJ_)$jMK5#(GJkW`%@&2+xuJYHq`nD-D6nZIc;A($%~e7-nt> V5WIQh=o6r644$rjF6*2UngA9gCJ+Ds literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/dbf_p8.png b/harbour/contrib/hbide/resources/dbf_p8.png new file mode 100644 index 0000000000000000000000000000000000000000..83fcaebacf5c77135132e56b7246c40e61db0d88 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)}AhoAr-fhQx*sq9Fi#gul`@% zHCZ@WPx%hRgtR<1KQ@79O_yHelx(bO(@b!7tQRa_#nH1Z4qztkS6c{x;I^)90z!1qA VASm*;@+;6Z22WQ%mvv4FO#m<1CAa_p literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbide/resources/formview.png b/harbour/contrib/hbide/resources/formview.png index cda2d6a4f4c77c97ebf925798bb8424e26540636..d2f0bef5a296ee6a15840419f250eea27c713474 100644 GIT binary patch delta 563 zcmV-30?hr;1j_`FBYy%CNklHq)9G@F5kje&uOl@UU-0clnS25u+~=0oK>PyA-!J3W=5tfY_;Y{0HP`~DwdwISMo zspoz(7=1m;;O628F<{HK9sf^oJ2Bj!l?e8gV%j{gGr5oVF@IdWas|cd|AE-DU_OKL z+XD=q?ye96)~?_5|Gba~gBTYhgBUj>gD4jRoDHH+oIC~53P%4KZgHD1h(AX%V8yDn z|9@)wG2B|&1XidPUJthI_o+n;j~+f^U}9ooU}R#181Vl;gHA*>1J9%V3?6P!1D35= z{h!Yykm1IrsecULzkg#e3@?Rv;mHw(`}giMfK>ehYW(~6FT=mT{}~iqlNkQr+RNbS z=?*cVp}GCPdtw>G$@McBczL)Pv|MAs2C%+3&+z*7Ym_kf_3Jl-kdZgTt=)?ll9Li4 z1~dWSqh>nVc7|_{xJPg9JDqw|7KRz&g{`?ukfM2|_3>WvUV+aWeff&%y)%(A^w1^=zES!Oj zm4#vH(xqU9y}i8*=gytOFratV5{8p|H!}qI`!kZ25zb}V)dd1hv2V4O1&nVG)7TD^LuC2^|p000xw#St3`YMKB5002ovPDHLkV1k1E B6XpN_ delta 568 zcmV-80>}N!1kePKBYyw{b3#c}2nYxWdk7R5*>L)4^^MK^({N?+m*XlynzFD<(!$PTq(o9-uV6 zZM?&!(Y^rEhtS1vs8?Q~eSq3D^=2AtXiV^;U}9?u2T2ghu79xI9S<~8#KbiGk~#i9 zllOk#n^HVOiGVqG9YrBhd%fDLRhR?smIRuq~iw$1Sus#iZP%R z&o(v?;tCK10ggK)o=D=l4ri@4>1dR6I*k+(As|o+-}ec8MW^!v573FFz!CE6!OgMk;l8Y6hc`Mo? z$Ye4^B9RH8>mf|jAfGQ_EXKH1Z#W76bUvXWx-T8TbER<3#KYA$0Kd+#G;qv7x3@*zzV5E&bkpT?4x;hM#CQLwy37iH@jH`ib&R^6* zx&g)Bd2j=Iw@#w50i8!a{+AQxLvb>?0WdE;dix1Xm)r2eqftq$viT}51Bu{Od#y5% kx(71Af>g~=@CB5J0Z@wD5y^VQod5s;07*qoM6N<$g1dQBvH$=8 delta 170 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 diff --git a/harbour/contrib/hbide/resources/print.png b/harbour/contrib/hbide/resources/print.png index abae8512fd1f913035eaf8e3db5c03e0a14b83f9..3a2d4b8391e9eaaae7c429f44113c5635952b24c 100644 GIT binary patch delta 310 zcmV-60m=TK7tjKbBYy!GNklGC22}SfC4U&|FrcVu$#DJrHiql> zKR^rsX>KWwV)*%&f#C-f|AgWn|IqkAe0N$0JY@u5ubjYq5uE@07*qo IM6N<$f=!Q#R{#J2 delta 2970 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 Q;s5{u07*qoM6N<$g85#HBLDyZ diff --git a/harbour/contrib/hbide/resources/statistics.png b/harbour/contrib/hbide/resources/statistics.png new file mode 100644 index 0000000000000000000000000000000000000000..e34407257dcbd5606a1829ccb38c3b33e5c0691e GIT binary patch literal 689 zcmV;i0#5yjP)}F>_x=GWnZfZkav6i+04_XhUq=Ftq1*=%RDdN?S3SL@@605U-@JKm9)kZ|Xw?CW z_99ATCz_MFkD&!?LCd2&Rz2Qyom4l`s5FgILah}6-+!gO*OT!xgXaBX*?cyDFa}I8 zAg<`0Smveq9aTFA4(msvHNrZx40x9rZ|WL7J~VI52N5X>${rQO2)TaAL?UI*2G1R6 zRa+ky03FZvzBPZFp}&O1!%z~I0l2WIaPqf1#(;sQb5nssW1VJ6ToRT9xpbBZG6g}Q zZj6>gqk6O*J$N#>rjJBYyvQS1c1sD6nVf@@i6l&VB{uE%!%C2ZT21)u=705HSLkR;xGvwr%NTZ1iutCcS#pF*^T z07#m=ltB^V0z-*3M1Q_wRC9{XISQu?EajlTwm)(KO?t#PEa{@oV*x0YK(1Dppi+IHB9p#@Gi9|>&7E?1nGKMdtws{S;LD7^dj^k}BXMM1S67Qe) zSl8a9*x1wAjW-&1U%I_-|3PcTVT#A&*fdRS+cx5Pp7r+jTHW2NNfV X-wC~6`-Y(b00000NkvXXu0mjfG%H+|2Ngg@u9f|9^&m-@h?@d-H~Y@%s;k z`zxn2xTKddyc8D4Dt~L))aQ&GR(}6EEqxf!!K5oY7*ap~VUTtRV0icQ4^DYTBPXB# zO$#we7xW=N0Q=YM;to*-2 zP6ti}K7IiVFGcjR%9oZ`{AUaei})YkvmB=ZLE%w2!$4X_b~WBW1lbTC5y^iu$ zX8_2C?R)lx;%1EnkO60n{II9Q4GS6e&YQ$Q&;^T`G;pT0lXH8>PY0lswr%;m0Za$L zSYQCg0{(QMrlI-Y!rBHS41nSJ|MJE2i~<4z3~~yJSmpQb+`a|?UNgw*S%}i!00000 LNkvXXu0mjfbCa>0 delta 326 zcmV-M0lEH&1K|RYB!4JLL_t(|+G7lwu=4*)VR43kEG!I+|Nk@m`~HpL+nYBGjNgAS z++R7J!6m(v0hj!(WmBIsDp$?>|L*4>26Qm#$_|Fq&wm)C9Re8e$unlR&-(8foyx$^ z#sI;r3~;uwvoC|Cs~-bCdB%&^Z~cGFt%_Aaeo-+)a#{uhK7V<}7cXD^Kl4)*tAeJc zCWiEkOa^@NjQ8%{`+to^5vziR#zuztxHtxU@{Fg?UHJb}L?5RDAHM(wT=J#m75@nu z5ELGTGYq6co>fr$M?f?J)07*qoM6N<$f;G9B;Q#;t diff --git a/harbour/contrib/hbide/resources/view_tiled.png b/harbour/contrib/hbide/resources/view_tiled.png index 144ac0bde3b94836cad87f86a38e3e28078fff04..fce318bb65c696ca782c4440fd7b927c7a3eaedf 100644 GIT binary patch delta 408 zcmV;J0cZa90G%H+|2Ngg@u9f|9^&m-@h?@d-H~Y@%s;k z`zxn2xTKddyc8D4Dt~L))aQ&GR(}6EEqxf!!K5oY7*ap~VUTtRV0icQ4^DYTBPXB# zO$#U3R|AD!6 zSQV_F+{BQck;(9iRTQT@V|_!z|D@u2tP1A!HZsJ=#W668D&mx9EGaAhU(?)yRY6N_ z#sBb#NJdp{eVp=)pf@AWf+AM=y*szB0RRiB%n^?X1se(g0000|L*4>26Qm#$_|Fq&wm)C9Re8e$unlR&-(8foyvd> z)Ft>bSi1T#;FD*(c>UJ@PlBpg6|C+oW=KxUV8AEO_~PZO|9`JoMX@SaKe>q^JtLC= zpFHEed-wh`iz;GOFt4|fAwDjS0iQhM>2nwUt7_|GRnSsf@jpBwk`bRg*Z>nl>ZF5jLfGSZc?TpN z;FAZZgHP<(<5YS1L`XWoCl5{sd{Wrsd2$CN9pID48;zyq6%4?1z<@{oKcj=Q%YQiq tOdEg!{{QmD^Na!l0t~q1_wL-j1^@{O*pDA5a>M`t002ovPDHLkV1nkcs4M^g diff --git a/harbour/contrib/hbide/resources/view_vertstacked.png b/harbour/contrib/hbide/resources/view_vertstacked.png index f11f3a01aee0309942a07f246a2c51bdf361a7cf..b625fe6f5aa0c57bd0ba35873d243716846c775e 100644 GIT binary patch delta 363 zcmV-x0hIpF0)_*SB!5jwL_t(|+GFHYGy2QG&h?VREl%>su0_vbw3Kg>e|BW+?82+)aFfjiA&+za2H->L--Y}@JvoO3A7H1HD z`w~o}%QJre!EkfeMg~SBC!haK3pO*bF)@HKD>DO}O^9#o?0?I^m{(Zz->tBhECce3 ziWwLi8yo){C)SZ=KvPo_17m$d!~aR2r5KO{i2(?Z1M%N~1_ty%o+TwFdB;+Zfw8!( z{Qn7EPqG5h_1mrgjNy^d|6@CskmUtw8QIm0GUiVIXRO{!mH}Mq#*lQdX2nLb4B)i( zhopo1hJFm_DP#?n0`aB9{@=eK>ENu9A6bED|M4o7(t&AGJy`}cG&V9YmH^X%Lrw=- z29%ap{AX0t(EM*LfZqMj$jHF>510&@m>99j@7=k54FC!f^N)kPP9p#S002ov JPDHLkV1h4Xv;qJC delta 308 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 KMNUMnLSTZPiKp@a delta 812 zcmV+{1JnH12EzuBB!3D?L_t(|+MSbKOj~6b$A703TIhll0#&<~54)@`vumg`L6DIk zn_L(&nbE{0&YN9qGiEbcmR*<#(TmN*Nx0A~S)#@m1ICbu3=qXIz-$ENV_LedjM71w zEoOYQJLk0L?DP;>#&+fN=E<8pZ=V1AKEM25;hD3S)MYWn)_*888OhZD+qXvB^kt6D z-dYr1yYQX5RAfUj8WB_#C7B=*i{a85Gj&^hiN~D_$$QN7bs~}rEiT!)1*=c`7;Js7tBSe?(sJ4<~mJ>2>clZgdrl>D3 zq`;iRY&^+uV1Jg_LWqx=DtY&S?;(MfmKKBz#JC1&Eyqdo^Siikz`^Y`7z~Td{441I z{qu9oj9wM5u&5eIn__lu(vQ$V(T8f|vkOj{*A0jgH8>e4za_03qT_A6# zZ&8QnJwM1kpO^f?Vut)TNy#ZBB~4}-vlXoN5(JZlK+lhS@y3h1Rp-?Oa;uv*AV%UM z1vV!QHGefkwV4&IIVA`f@{E|b8Idp&9Jxw#_!n}EpTb}gbcmm7W9ksY7AsSe^VrK= z*xb9w&dbKAInj_MXbe&;1%dm#522tgQcvrO3y`z%?pf8RL_4=TxDt{$^{q#Mb=)0000WdP)TA3YwHr5@{49QDoi;i`4oO7%AqL z(1fX2nt0d38#^P)LEWhy_Vp14HMB zwdHxNEqnx_FFIT05;b5jf}SJ3!l1fw#k3LB~icy~X4 zcR^|c3mUQ_!bcFC7c9WwtR5*9ZD5;Pf@|x5euW&;t|sVKmlJfQDX(`5ZcFZnT?M(- zF`iJa0r~ASD6Xjm+l&LR6Z9k`3zH*#P6HCP@~gh7&1zO93D{iD!R7*Z~w^ivzQDw%Ys>2{VD z=o~n9DIDXi4VWM3PoV|b#)5>RsfaTt?JT%FG)qUZNEc0x$v{y|*gHGH+Tj2gYz_vi zC0H4sh=C-t#8?pb@|CTl@W%Oo04Vi({GR!R&MFDa_&fweg+W757;5RjbjxS0TFw`u z;ETu(G!W*VzSA15ymvcOiuHL7TL{GCe2*k9X_= zGxm8fn9K?*KA&ajCC;Y+5FT-_1h&G!_`}jAlc4$Qy)-uNXZ} zmk$o!iwpOLy^xKim3nY&j-$8kE4u4Oa}(d-?oPoro?bC;5P7%<`Ui@k-B5raX6YXy z&|K9skX(eLdkUUJk)HcF)-7TWq1j;<3M8e*msT01eRI{RWeC|*U?4r(DH^APx(yh;Y7Z#HQ1Ck00imL`cU6JNf80?^HN}V%7ym+VGIwM>|pH|@Z|ix z#RWyJ3h;D8MyxvJ_HH#s9l%>N3)3_Q8!Mpi#|TWF21v7xJgK(u;X=V_{TW@9`bKkB z491;6(;yFv(*>)O#gr(*MbjAn)(d;@he^)%D;ka0COifC`hio)n`sp zc@8etT`qV9`onuwFsyCQ;V_TvgZ^6mKR>9Szm&Ee1CukTefb`s<^h3|iv?r>C}89M zbXbh7nC|;pC=1Fx1$ouu89TSF@(l<=Ti-VbyZ}xT;a)T&!GHBi5K0yLoAq#7Mzf$V zt??A(+ z4u{f51(9W8x0qq=8A80)jHf4Um}sxZ_b>L`y=AEK93(dxWeEf+-Br+3EG54#a)O)( zkApEhO4GWa*3QCVkAt!Lrgg}KttTq+!&BfUCQ}Jb_-2sH;&kYaIIz0^Tu%CCgld$S zalU~na0_}`KB22+_{Pa9oLwmRhwF!zw`!v|B*rJ|9ei5s1B)13fvTDF55vd%9_9+m3m&{Fg7yTDM&b2 zQip;661cgVsfe0$iAMxpoFf?KPI(<~bD#eP{s}7}p&UZ*00000NkvXXu0mjf9R^?l literal 0 HcmV?d00001