Files
harbour-core/harbour/contrib/hbide/tools.prg
Pritpal Bedi 06a094209c 2012-08-04 21:56 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbide/tools.prg
    + Implemented: removal of a editng panel with confirmation.
       All modified sources will be confirmed to be saved if modified
       before a panel is removed.
    ! Fixed: if order has not been changed, alert message requesting 
       re-loading HbIDE will not be displayed. Before the message was 
       displayed in every click on <OK> button.
2012-08-05 05:00:32 +00:00

1058 lines
37 KiB
Plaintext

/*
* $Id$
*/
/*
* Harbour Project source code:
*
* Copyright 2010 Pritpal Bedi <bedipritpal@hotmail.com>
* www - http://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 <bedipritpal@hotmail.com>
* 20Mar2010
*/
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
#include "hbide.ch"
#include "common.ch"
#include "hbclass.ch"
#include "hbqtgui.ch"
/*----------------------------------------------------------------------*/
#define __buttonAdd_clicked__ 2000
#define __buttonDelete_clicked__ 2001
#define __buttonUp_clicked__ 2002
#define __buttonDown_clicked__ 2003
#define __buttonExec_clicked__ 2004
#define __buttonBrowse_clicked__ 2005
#define __buttonUpdate_clicked__ 2006
#define __buttonClose_clicked__ 2007
#define __listNames_itemSelectionChanged__ 2008
#define __buttonSetImage_clicked__ 2019
#define __buttonUserToolbarUpd_clicked__ 2010
#define __comboToolbarAsgnd_currentIndexChanged__ 2011
#define __listToolbars_itemSelectionChanged__ 2012
#define __checkToolActive_stateChanged__ 2013
#define __User_Toolbar_clicked__ 2014
/*----------------------------------------------------------------------*/
CLASS IdeToolsManager INHERIT IdeObject
DATA aAct INIT {}
DATA aSetAct INIT {}
DATA qToolsMenu
DATA qToolsButton
DATA qViewsMenu
DATA qViewsButton
DATA aPanelsAct INIT {}
DATA qPanelsButton
DATA qPanelsMenu
DATA oProcess
DATA lExecuting INIT .f.
DATA aHdr INIT {}
DATA aBtns INIT {}
DATA aToolbars INIT { NIL,NIL,NIL,NIL,NIL }
DATA aPlugins INIT {}
DATA cSetsFolderLast
DATA oUIPnls
ACCESS aTools INLINE ::oINI:aTools
ACCESS aUserToolBars INLINE ::oINI:aUserToolbars
METHOD new( oIde )
METHOD create( oIde )
METHOD destroy()
METHOD show()
METHOD execEvent( nEvent, p )
METHOD clearList()
METHOD populateList( aList )
METHOD execTool( ... )
METHOD execToolByParams( cCmd, cParams, cStartIn, lCapture, lOpen )
METHOD ini2controls( nIndex )
METHOD controls2ini( nIndex )
METHOD buildToolsButton()
METHOD buildPanelsButton()
METHOD addPanelsMenu( cPrompt )
METHOD showOutput( cOut, mp2, oHbp )
METHOD finished( nEC, nES, oHbp )
METHOD ini2toolbarControls( nIndex, nMode )
METHOD populateButtonsTable( nIndex )
METHOD buildUserToolbars()
METHOD populatePlugins( lClear )
METHOD setStyleSheet( cCSS )
METHOD buildViewsButton()
METHOD saveView()
METHOD execView( cView )
METHOD managePanels()
METHOD arrangePanels()
METHOD deletePanel( cView )
ENDCLASS
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:new( oIde )
::oIde := oIde
::cSetsFolderLast := oIde:oINI:getINIPath()
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:setStyleSheet( cCSS )
LOCAL oToolbar
FOR EACH oToolbar IN ::aToolbars
IF !empty( oToolbar )
oToolbar:setStyleSheet( cCSS )
ENDIF
NEXT
::qToolsMenu:setStyleSheet( GetStyleSheet( "QMenuPop", ::nAnimantionMode ) )
::qPanelsMenu:setStyleSheet( GetStyleSheet( "QMenuPop", ::nAnimantionMode ) )
RETURN Self
/*------------------------------------------------------------------------*/
METHOD IdeToolsManager:create( oIde )
DEFAULT oIde TO ::oIde
::oIde := oIde
IF empty( ::oINI:aUserToolbars )
asize( ::oINI:aUserToolbars, 5 )
DEFAULT ::oINI:aUserToolbars[ 1 ] TO { "","YES","","","YES","YES","YES" }
DEFAULT ::oINI:aUserToolbars[ 2 ] TO { "","YES","","","YES","YES","YES" }
DEFAULT ::oINI:aUserToolbars[ 3 ] TO { "","YES","","","YES","YES","YES" }
DEFAULT ::oINI:aUserToolbars[ 4 ] TO { "","YES","","","YES","YES","YES" }
DEFAULT ::oINI:aUserToolbars[ 5 ] TO { "","YES","","","YES","YES","YES" }
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:destroy()
LOCAL qAct, xTmp
IF !empty( ::oUI )
FOR EACH qAct IN ::aAct
qAct:disconnect( "triggered(bool)" )
qAct := NIL
NEXT
FOR EACH qAct IN ::aPanelsAct
qAct:disconnect( "triggered(bool)" )
qAct := NIL
NEXT
::qToolsButton:disconnect( "clicked()" )
::qToolsButton := NIL
::clearList()
::qPanelsButton :disconnect( "clicked()" )
::oUI:buttonAdd :disconnect( "clicked()" )
::oUI:buttonDelete :disconnect( "clicked()" )
::oUI:buttonUp :disconnect( "clicked()" )
::oUI:buttonDown :disconnect( "clicked()" )
::oUI:buttonExec :disconnect( "clicked()" )
::oUI:buttonBrowse :disconnect( "clicked()" )
::oUI:buttonUpdate :disconnect( "clicked()" )
::oUI:buttonClose :disconnect( "clicked()" )
::oUI:buttonSetImage :disconnect( "clicked()" )
::oUI:buttonUserToolbarUpd:disconnect( "clicked()" )
::oUI:comboToolbarAsgnd :disconnect( "currentIndexChanged(int)" )
::oUI:listToolbars :disconnect( "itemSelectionChanged()" )
::oUI:listNames :disconnect( "itemSelectionChanged()" )
::oUI:destroy()
ENDIF
FOR EACH xTmp IN ::aBtns
xTmp:disconnect( "clicked()" )
xTmp := NIL
NEXT
FOR EACH xTmp IN ::aToolbars
xTmp := NIL
NEXT
::aAct := NIL
::qToolsMenu := NIL
::qToolsButton := NIL
::aPanelsAct := NIL
::qPanelsButton := NIL
::qPanelsMenu := NIL
::oProcess := NIL
::lExecuting := NIL
::aHdr := NIL
::aBtns := NIL
::aToolbars := NIL
::aPlugins := NIL
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:show()
LOCAL oTbl, hdr_, n, qItm
IF empty( ::oUI )
::oUI := hbide_getUI( "toolsutilities", ::oDlg:oWidget )
::oUI:setWindowFlags( Qt_Sheet )
::oUI:setWindowIcon( QIcon( hbide_image( "hbide" ) ) )
::oUI:setMaximumWidth( ::oUI:width() )
::oUI:setMinimumWidth( ::oUI:width() )
::oUI:setMaximumHeight( ::oUI:height() )
::oUI:setMinimumHeight( ::oUI:height() )
::oUI:buttonAdd :connect( "clicked()", {|| ::execEvent( __buttonAdd_clicked__ ) } )
::oUI:buttonDelete:connect( "clicked()", {|| ::execEvent( __buttonDelete_clicked__ ) } )
::oUI:buttonUp :connect( "clicked()", {|| ::execEvent( __buttonUp_clicked__ ) } )
::oUI:buttonDown :connect( "clicked()", {|| ::execEvent( __buttonDown_clicked__ ) } )
::oUI:buttonExec :connect( "clicked()", {|| ::execEvent( __buttonExec_clicked__ ) } )
::oUI:buttonBrowse:connect( "clicked()", {|| ::execEvent( __buttonBrowse_clicked__ ) } )
::oUI:buttonUpdate:connect( "clicked()", {|| ::execEvent( __buttonUpdate_clicked__ ) } )
::oUI:buttonClose :connect( "clicked()", {|| ::execEvent( __buttonClose_clicked__ ) } )
::oUI:listNames :connect( "itemSelectionChanged()", {|| ::execEvent( __listNames_itemSelectionChanged__ ) } )
::oUI:buttonBtnDown :setIcon( QIcon( hbide_image( "dc_down" ) ) )
::oUI:buttonBtnUp :setIcon( QIcon( hbide_image( "dc_up" ) ) )
::oUI:buttonSetImage:setIcon( QIcon( hbide_image( "open" ) ) )
::oUI:buttonSetImage:connect( "clicked()", {|| ::execEvent( __buttonSetImage_clicked__ ) } )
::oUI:buttonUserToolbarUpd:connect( "clicked()", {|| ::execEvent( __buttonUserToolbarUpd_clicked__ ) } )
::oUI:comboToolbarAsgnd:addItem( "User_Toolbar_1" )
::oUI:comboToolbarAsgnd:addItem( "User_Toolbar_2" )
::oUI:comboToolbarAsgnd:addItem( "User_Toolbar_3" )
::oUI:comboToolbarAsgnd:addItem( "User_Toolbar_4" )
::oUI:comboToolbarAsgnd:addItem( "User_Toolbar_5" )
::oUI:comboToolbarAsgnd:setCurrentIndex( -1 )
::oUI:comboToolbarAsgnd:connect( "currentIndexChanged(int)", {|p| ::execEvent( __comboToolbarAsgnd_currentIndexChanged__, p ) } )
::oUI:listToolbars:addItem( "User_Toolbar_1" )
::oUI:listToolbars:addItem( "User_Toolbar_2" )
::oUI:listToolbars:addItem( "User_Toolbar_3" )
::oUI:listToolbars:addItem( "User_Toolbar_4" )
::oUI:listToolbars:addItem( "User_Toolbar_5" )
::oUI:listToolbars:connect( "itemSelectionChanged()", {|| ::execEvent( __listToolbars_itemSelectionChanged__ ) } )
::oUI:comboInitPos:addItem( "Left" )
::oUI:comboInitPos:addItem( "Top" )
::oUI:comboInitPos:addItem( "Right" )
::oUI:comboInitPos:addItem( "Bottom" )
::oUI:comboToolbarAsgnd:setCurrentIndex( -1 )
::oUI:checkDockTop :setChecked( .f. )
::oUI:checkDockLeft :setChecked( .t. )
::oUI:checkDockBottom:setChecked( .t. )
::oUI:checkDockRight :setChecked( .t. )
::oUI:checkFloatable :setChecked( .t. )
::oUI:checkToolActive:setChecked( .t. )
::oUI:checkInactive:connect( "stateChanged(int)", {|p| ::execEvent( __checkToolActive_stateChanged__, p ) } )
hdr_:= { { "Img", 30 }, { "Tool", 218 } }
oTbl := ::oUI:tableButtons
//
oTbl:verticalHeader():hide()
oTbl:horizontalHeader():setStretchLastSection( .t. )
oTbl:setAlternatingRowColors( .t. )
oTbl:setColumnCount( Len( hdr_ ) )
oTbl:setShowGrid( .t. )
oTbl:setSelectionMode( QAbstractItemView_SingleSelection )
oTbl:setSelectionBehavior( QAbstractItemView_SelectRows )
FOR n := 1 TO Len( hdr_ )
qItm := QTableWidgetItem()
qItm:setText( hdr_[ n,1 ] )
oTbl:setHorizontalHeaderItem( n-1, qItm )
oTbl:setColumnWidth( n-1, hdr_[ n,2 ] )
aadd( ::aHdr, qItm )
NEXT
::oUI:listToolbars:setCurrentRow( 0 )
ENDIF
::populatePlugins( .t. )
::clearList()
::populateList( ::oINI:aTools )
::oUI:listNames:setCurrentRow( 0 )
::oIde:setPosByIniEx( ::oUI:oWidget, ::oINI:cToolsDialogGeometry )
::oUI:show()
RETURN Nil
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:execEvent( nEvent, p )
LOCAL cFile, cFileName, nIndex, qItem, cName, nRow
LOCAL aTools := ::oINI:aTools
HB_SYMBOL_UNUSED( p )
IF ::lQuitting
RETURN Self
ENDIF
SWITCH nEvent
CASE __checkToolActive_stateChanged__
nRow := ::oUI:listToolbars:currentRow()
::aUserToolbars[ nRow + 1, 3 ] := "YES"
IF !empty( ::aToolbars[ nRow + 1 ] )
IF p > 0
::aToolbars[ nRow + 1 ]:hide()
ELSE
::aToolbars[ nRow + 1 ]:show()
ENDIF
ENDIF
EXIT
CASE __buttonSetImage_clicked__
cFileName := hbide_fetchAFile( ::oDlg, "Select an PNG image", { { "Image Files", "*.png" } },/* cFolder */ , /*cDftSuffix*/ )
IF !empty( cFileName )
::oUI:editImage:setText( hbide_pathNormalized( cFileName, .f. ) )
::oUI:buttonSetImage:setIcon( QIcon( hbide_pathToOsPath( cFileName ) ) )
ENDIF
EXIT
CASE __buttonUserToolbarUpd_clicked__
::ini2toolbarControls( ::oUI:listToolbars:currentRow(), 2 )
EXIT
CASE __listToolbars_itemSelectionChanged__
// Clear tableButtons and populate with new values
::ini2toolbarControls( ::oUI:listToolbars:currentRow(), 1 )
::populateButtonsTable( ::oUI:listToolbars:currentRow() )
EXIT
CASE __comboToolbarAsgnd_currentIndexChanged__
::oUI:listToolbars:setCurrentRow( p )
EXIT
CASE __listNames_itemSelectionChanged__
qItem := ::oUI:listNames:currentItem()
cName := qItem:text()
IF ( nIndex := ascan( aTools, {|e_| e_[ 1 ] == cName } ) ) > 0
::ini2Controls( nIndex )
ENDIF
EXIT
CASE __buttonAdd_clicked__
IF !empty( ::oUI:editName:text() )
::controls2ini()
::oUI:listNames:addItem( ::oUI:editName:text() )
ENDIF
EXIT
CASE __buttonDelete_clicked__
IF ::oUI:listNames:currentRow() >= 0
qItem := ::oUI:listNames:currentItem()
cName := qItem:text()
IF ( nIndex := ascan( aTools, {|e_| e_[ 1 ] == cName } ) ) > 0
hb_adel( ::oINI:aTools, nIndex, .t. )
::clearList()
::populateList()
ENDIF
ENDIF
EXIT
CASE __buttonUp_clicked__
EXIT
CASE __buttonDown_clicked__
EXIT
CASE __buttonExec_clicked__
IF ! ::lExecuting
::lExecuting := .t.
IF ::oUI:listNames:currentRow() >= 0
qItem := ::oUI:listNames:currentItem()
::execTool( qItem:text() )
ENDIF
::lExecuting := .f.
ENDIF
EXIT
CASE __buttonBrowse_clicked__
IF !empty( cFile := hbide_fetchAFile( ::oDlg, "Select a Tool" ) )
hb_fNameSplit( cFile, , @cFileName )
//::ini2controls()
::oUI:editName : setText( cFileName )
::oUI:editCmdLine : setText( cFile )
ENDIF
EXIT
CASE __buttonUpdate_clicked__
IF ( nRow := ::oUI:listNames:currentRow() ) >= 0
qItem := ::oUI:listNames:currentItem()
cName := qItem:text()
IF ( nIndex := ascan( aTools, {|e_| e_[ 1 ] == cName } ) ) > 0
::controls2ini( nIndex )
::clearList()
::populateList()
::oUI:listNames:setCurrentRow( nRow )
ENDIF
ENDIF
EXIT
CASE __buttonClose_clicked__
::oIde:oINI:cToolsDialogGeometry := hbide_posAndSize( ::oUI:oWidget )
::oUI:done( 1 )
EXIT
CASE __User_Toolbar_clicked__
::execTool( p )
EXIT
ENDSWITCH
RETURN Self
/*----------------------------------------------------------------------*/
STATIC FUNCTION hbide_toolBlock( o, a_ )
LOCAL cTool := a_[ 1 ]
RETURN {|| o:execEvent( __User_Toolbar_clicked__, cTool ) }
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:buildUserToolbars()
LOCAL a_:={}, b_, qTbar, qTBtn, nn, nIndex
LOCAL area_:= { Qt_LeftToolBarArea, Qt_TopToolBarArea, Qt_RightToolBarArea, Qt_BottomToolBarArea }
LOCAL aIndex := {}
FOR nIndex := 0 TO 4
nn := nIndex + 1
FOR EACH b_ IN ::aTools
IF !empty( b_[ 7 ] ) .AND. val( b_[ 7 ] ) == nIndex
aadd( a_, b_ )
aadd( aIndex, b_:__enumIndex() )
ENDIF
NEXT
IF !empty( a_ )
qTBar := QToolBar()
qTBar:setStyleSheet( GetStyleSheet( "QToolBarLR5", ::nAnimantionMode ) )
qTBar:setObjectName( "User_Toolbar_" + hb_ntos( nIndex ) )
qTBar:setWindowTitle( "User Toolbar : " + hb_ntos( nIndex ) )
qTBar:setIconSize( QSize( 16,16 ) )
qTBar:setToolButtonStyle( Qt_ToolButtonIconOnly )
qTBar:setAllowedAreas( iif( ::aUserToolbars[ nn,4 ] == "YES", Qt_TopToolBarArea , 0 ) + ;
iif( ::aUserToolbars[ nn,5 ] == "YES", Qt_LeftToolBarArea , 0 ) + ;
iif( ::aUserToolbars[ nn,6 ] == "YES", Qt_BottomToolBarArea, 0 ) + ;
iif( ::aUserToolbars[ nn,7 ] == "YES", Qt_RightToolBarArea , 0 ) )
FOR EACH b_ IN a_
qTBtn := QToolButton()
qTBtn:setText( b_[ 1 ] )
qTBtn:setTooltip( b_[ 10 ] )
qTBtn:setIcon( QIcon( hbide_pathToOSPath( b_[ 9 ] ) ) )
qTBtn:setMaximumWidth( 20 )
qTBtn:setMaximumHeight( 20 )
qTBtn:connect( "clicked()", hbide_toolBlock( Self, b_ ) )
qTBar:addWidget( qTBtn )
IF !( b_[ 8 ] == "YES" )
qTBtn:setEnabled( .f. )
ENDIF
aadd( ::aBtns, qTBtn )
NEXT
::oDlg:oWidget:addToolBar( area_[ val( ::aUserToolbars[ nn,4 ] ) + 1 ], qTBar )
IF ::aUserToolbars[ nn, 3 ] == "YES"
qTBar:hide()
ENDIF
::aToolbars[ nn ] := qTBar
a_:= {}
ENDIF
NEXT
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:populateButtonsTable( nIndex )
LOCAL a_:={}, b_, q0, q1, oTbl, nRow
oTbl := ::oUI:tableButtons
oTbl:clearContents()
IF nIndex > -1
FOR EACH b_ IN ::aTools
IF !empty( b_[ 7 ] ) .AND. val( b_[ 7 ] ) == nIndex
aadd( a_, b_ )
ENDIF
NEXT
oTbl:setRowCount( Len( a_ ) )
IF !empty( a_ )
FOR EACH b_ IN a_
nRow := b_:__enumIndex()-1
q0 := QTableWidgetItem()
q0:setIcon( QIcon( hbide_pathToOSPath( b_[ 9 ] ) ) )
q0:setTooltip( b_[ 10 ] )
oTbl:setItem( nRow, 0, q0 )
q1 := QTableWidgetItem()
q1:setText( b_[ 1 ] )
oTbl:setItem( nRow, 1, q1 )
oTbl:setRowHeight( nRow, 16 )
NEXT
ENDIF
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:ini2toolbarControls( nIndex, nMode )
IF nIndex > -1
nIndex++
IF nMode == 1
::oUI:comboInitPos :setCurrentIndex( val( ::aUserToolBars[ nIndex, 1 ] ) )
::oUI:checkFloatable :setChecked( ::aUserToolBars[ nIndex, 2 ] == "YES" )
::oUI:checkInactive :setChecked( ::aUserToolBars[ nIndex, 3 ] == "YES" )
::oUI:checkDockTop :setChecked( ::aUserToolBars[ nIndex, 4 ] == "YES" )
::oUI:checkDockLeft :setChecked( ::aUserToolBars[ nIndex, 5 ] == "YES" )
::oUI:checkDockBottom:setChecked( ::aUserToolBars[ nIndex, 6 ] == "YES" )
::oUI:checkDockRight :setChecked( ::aUserToolBars[ nIndex, 7 ] == "YES" )
ELSE
::aUserToolBars[ nIndex, 1 ] := hb_ntos( ::oUI:comboInitPos:currentIndex() )
::aUserToolBars[ nIndex, 2 ] := iif( ::oUI:checkFloatable :isChecked(), "YES", "NO" )
::aUserToolBars[ nIndex, 3 ] := iif( ::oUI:checkInactive :isChecked(), "YES", "NO" )
::aUserToolBars[ nIndex, 4 ] := iif( ::oUI:checkDockTop :isChecked(), "YES", "NO" )
::aUserToolBars[ nIndex, 5 ] := iif( ::oUI:checkDockLeft :isChecked(), "YES", "NO" )
::aUserToolBars[ nIndex, 6 ] := iif( ::oUI:checkDockBottom:isChecked(), "YES", "NO" )
::aUserToolBars[ nIndex, 7 ] := iif( ::oUI:checkDockRight :isChecked(), "YES", "NO" )
ENDIF
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:ini2controls( nIndex )
IF nIndex > 0
::oUI:editName :setText( ::aTools[ nIndex, 1 ] )
::oUI:editCmdLine :setText( ::aTools[ nIndex, 2 ] )
::oUI:editParams :setText( ::aTools[ nIndex, 3 ] )
::oUI:editStayIn :setText( ::aTools[ nIndex, 4 ] )
::oUI:checkCapture :setChecked( !empty( ::aTools[ nIndex, 5 ] ) )
::oUI:checkOpenCons :setChecked( !empty( ::aTools[ nIndex, 6 ] ) )
::oUI:comboToolbarAsgnd:setCurrentIndex( iif( empty( ::aTools[ nIndex, 7 ] ), -1, val( ::aTools[ nIndex, 7 ] ) ) )
::oUI:checkToolActive :setChecked( ::aTools[ nIndex, 8 ] == "YES" )
::oUI:editImage :setText( hbide_pathNormalized( ::aTools[ nIndex, 9 ], .f. ) )
::oUI:buttonSetImage :setIcon( QIcon( iif( empty( ::aTools[ nIndex, 9 ] ), hbide_image( "open" ), ;
hbide_pathToOsPath( ::aTools[ nIndex, 9 ] ) ) ) )
::oUI:editTooltip :setText( ::aTools[ nIndex, 10 ] )
::oUI:comboPlugin :setCurrentIndex( ascan( ::aPlugins, {|e| ::aTools[ nIndex, 11 ] == e } ) - 1 )
::oUI:checkPlugInit :setChecked( ::aTools[ nIndex, 12 ] == "YES" )
ELSE
::oUI:editName :setText( "" )
::oUI:editCmdLine :setText( "" )
::oUI:editParams :setText( "" )
::oUI:editStayIn :setText( "" )
::oUI:checkCapture :setChecked( .f. )
::oUI:checkOpenCons :setChecked( .f. )
::oUI:comboToolbarAsgnd:setCurrentIndex( -1 )
::oUI:checkToolActive :setChecked( .t. )
::oUI:editImage :setText( "" )
::oUI:buttonSetImage :setIcon( QIcon( hbide_image( "open" ) ) )
::oUI:editTooltip :setText( "" )
::oUI:comboPlugin :setCurrentIndex( -1 )
::oUI:checkPlugInit :setChecked( .f. )
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:controls2ini( nIndex )
IF empty( nIndex )
aadd( ::oINI:aTools, {} )
nIndex := Len( ::oINI:aTools )
ENDIF
::oINI:aTools[ nIndex ] := { ::oUI:editName:text() , ;
hbide_pathNormalized( ::oUI:editCmdLine:text() ), ;
hbide_pathNormalized( ::oUI:editParams:text() ), ;
hbide_pathNormalized( ::oUI:editStayIn:text() ), ;
iif( ::oUI:checkCapture :isChecked(), "YES", "" ), ;
iif( ::oUI:checkOpenCons:isChecked(), "YES", "" ), ;
;
hb_ntos( ::oUI:comboToolbarAsgnd:currentIndex() ), ;
iif( ::oUI:checkToolActive:isChecked(), "YES", "NO" ), ;
::oUI:editImage:text(), ;
::oUI:editTooltip:text(), ;
::oUI:comboPlugin:currentText(), ;
iif( ::oUI:checkPlugInit:isChecked(), "YES", "NO" ) ;
}
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:clearList()
::oUI:listNames:clear()
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:populateList( aList )
LOCAL a_
DEFAULT aList TO ::oINI:aTools
FOR EACH a_ IN aList
::oUI:listNames:addItem( a_[ 1 ] )
NEXT
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:populatePlugins( lClear )
LOCAL cDir, aDir, aFile
IF lClear
::oUI:comboPlugin:clear()
ENDIF
::aPlugins := {}
cDir := hb_dirBase() + "plugins" + hb_ps()
aDir := directory( cDir + "*" )
IF !empty( aDir )
FOR EACH aFile IN aDir
::oUI:comboPlugin:addItem( aFile[ 1 ] )
aadd( ::aPlugins, aFile[ 1 ] )
NEXT
::oUI:comboPlugin:setCurrentIndex( -1 )
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:buildToolsButton()
LOCAL a_, qAct
::qToolsMenu := QMenu()
::qToolsMenu:setStyleSheet( GetStyleSheet( "QMenuPop", ::nAnimantionMode ) )
FOR EACH a_ IN ::aTools
qAct := ::qToolsMenu:addAction( a_[ 1 ] )
qAct:connect( "triggered(bool)", {|| ::execTool( a_[ 1 ] ) } )
aadd( ::aAct, qAct )
NEXT
::qToolsButton := QToolButton()
::qToolsButton:setTooltip( "Tools & Utilities" )
::qToolsButton:setIcon( QIcon( hbide_image( "tools" ) ) )
::qToolsButton:setPopupMode( QToolButton_MenuButtonPopup )
::qToolsButton:setMenu( ::qToolsMenu )
::qToolsButton:connect( "clicked()", {|| ::show() } )
RETURN ::qToolsButton
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:execToolByParams( cCmd, cParams, cStartIn, lCapture, lOpen )
LOCAL cArg, lTokened
::oProcess := HbpProcess():new()
::oProcess:output := {|cOut, mp2, oHbp| ::showOutput( cOut, mp2, oHbp ) }
::oProcess:finished := {|nEC , nES, oHbp| ::finished( nEC, nES, oHbp ) }
::oProcess:workingPath := cStartIn
::oProcess:lDetached := !( lCapture )
IF empty( cCmd )
lTokened := .f.
cCmd := hbide_getShellCommand()
cArg := iif( hbide_getOS() == "nix", "", "/C " )
ELSE
lTokened := .t.
cArg := ""
ENDIF
cArg += hbide_parseMacros( cParams )
IF lCapture
IF lOpen
::oDockB2:show()
ENDIF
::oOutputResult:oWidget:clear()
::oOutputResult:oWidget:append( cCmd )
::oOutputResult:oWidget:append( cArg )
::oOutputResult:oWidget:append( hbide_outputLine() )
ENDIF
::oProcess:addArg( cArg, lTokened )
::oProcess:start( cCmd )
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:execTool( ... )
LOCAL nIndex, cCmd, cParams, cStayIn, lCapture, lOpen, aParam, cPlugin, a_
aParam := hb_aParams()
IF Len( aParam ) == 1
IF ( nIndex := ascan( ::aTools, {|e_| e_[ 1 ] == aParam[ 1 ] } ) ) > 0
hb_fNameSplit( ::aTools[ nIndex, 11 ], , @cPlugin )
cCmd := hbide_pathToOSPath( ::aTools[ nIndex, 2 ] )
cParams := ::aTools[ nIndex, 3 ]
cParams := iif( "http://" $ lower( cParams ) .OR. !empty( cPlugin ), cParams, hbide_pathToOSPath( cParams ) )
cParams := hbide_parseMacros( cParams )
cStayIn := hbide_pathToOSPath( ::aTools[ nIndex, 4 ] )
lCapture := ::aTools[ nIndex, 5 ] == "YES"
lOpen := ::aTools[ nIndex, 6 ] == "YES"
ENDIF
ELSEIF Len( aParam ) > 1
asize( aParam, 5 )
DEFAULT aParam[ 1 ] TO ""
DEFAULT aParam[ 2 ] TO ""
DEFAULT aParam[ 3 ] TO ""
DEFAULT aParam[ 4 ] TO ""
DEFAULT aParam[ 5 ] TO ""
cCmd := hbide_pathToOSPath( aParam[ 1 ] )
cParams := aParam[ 2 ]
cParams := iif( "http://" $ lower( cParams ), cParams, hbide_pathToOSPath( cParams ) )
cParams := hbide_parseMacros( cParams )
cStayIn := hbide_pathToOSPath( aParam[ 3 ] )
lCapture := iif( HB_ISLOGICAL( aParam[ 4 ] ), aParam[ 4 ], aParam[ 4 ] == "YES" )
lOpen := iif( HB_ISLOGICAL( aParam[ 5 ] ), aParam[ 5 ], aParam[ 5 ] == "YES" )
ENDIF
IF HB_ISLOGICAL( lCapture )
IF !empty( cPlugin )
a_:= hb_aTokens( cParams, " " )
FOR EACH cParams IN a_
cParams := hbide_evalAsis( cParams )
NEXT
hbide_execPlugin( cPlugin, ::oIde, hb_arrayToParams( a_ ) )
ELSE
::execToolByParams( cCmd, cParams, cStayIn, lCapture, lOpen )
ENDIF
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:showOutput( cOut, mp2, oHbp )
HB_SYMBOL_UNUSED( mp2 )
HB_SYMBOL_UNUSED( oHbp )
hbide_convertBuildStatusMsgToHtml( cOut, ::oOutputResult:oWidget )
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:finished( nEC, nES, oHbp )
HB_SYMBOL_UNUSED( oHbp )
::oOutputResult:oWidget:append( hbide_outputLine() )
::oOutputResult:oWidget:append( "Finished: Exit Code = " + hb_ntos( nEC ) + " Status = " + hb_ntos( nES ) )
RETURN Self
/*----------------------------------------------------------------------*/
STATIC FUNCTION hbide_blockView( oSelf, cView )
RETURN {|| oSelf:execView( cView ) }
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:buildViewsButton()
LOCAL a_, b_, qAct, aSettings, cPath, cView
cPath := ::oINI:getIniPath()
b_:= directory( cPath + "*.ide" )
aSettings := {}
aadd( aSettings, "Browse..." )
aadd( aSettings, "..." )
aadd( aSettings, "Pritpals Favourite" )
aadd( aSettings, "..." )
FOR EACH a_ IN b_
IF ! ( a_[ 1 ] == "settings.ide" ) .AND. ! ( a_[ 1 ] == "tempsettings.ide" )
aadd( aSettings, hbide_pathNormalized( cPath + a_[ 1 ] ) )
ENDIF
NEXT
::qViewsMenu := QMenu()
::qViewsMenu:setStyleSheet( GetStyleSheet( "QMenuPop", ::nAnimantionMode ) )
FOR EACH cView IN aSettings
IF cView == "..."
qAct := ::qViewsMenu:addSeparator()
ELSE
qAct := ::qViewsMenu:addAction( cView )
qAct:connect( "triggered(bool)", hbide_blockView( Self, cView ) )
ENDIF
aadd( ::aSetAct, { qAct, cView } )
NEXT
::qViewsButton := QToolButton()
::qViewsButton:setObjectName( "HbIDE Views" )
::qViewsButton:setTooltip( "HbIDE Views" )
::qViewsButton:setIcon( QIcon( hbide_image( "view_docks" ) ) )
::qViewsButton:setPopupMode( QToolButton_MenuButtonPopup )
::qViewsButton:setMenu( ::qViewsMenu )
::qViewsButton:connect( "clicked()", {|| ::saveView() } )
RETURN ::qViewsButton
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:saveView()
LOCAL cView, qAct
cView := hbide_saveAFile( ::oDlg, "Select a HbIDE Settings File", { { "HbIDE Settings", "*.ide" } }, ::cSetsFolderLast, "ide" )
IF ! empty( cView )
::cSetsFolderLast := cView
cView := lower( hbide_pathNormalized( cView ) )
hbide_saveEnvironment( ::oIde, cView )
IF ascan( ::aSetAct, {|e_| e_[ 2 ] == cView } ) == 0
qAct := ::qViewsMenu:addAction( cView )
qAct:connect( "triggered(bool)", hbide_blockView( Self, cView ) )
aadd( ::aAct, { qAct, cView } )
ENDIF
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:execView( cView )
IF cView == "Browse..."
cView := hbide_fetchAFile( ::oDlg, "Select a HbIDE Settings File", { { "HbIDE Settings", "*.ide" } }, ::cSetsFolderLast, "ide", .f. )
IF empty( cView )
RETURN Self
ENDIF
::cSetsFolderLast := cView
hbide_restEnvironment( ::oIde, cView )
ELSEIF cView == "Pritpals Favourite"
hbide_restEnvironment_byResource( ::oIde, "pritpalsfav" )
ELSE
hbide_restEnvironment( ::oIde, cView )
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:buildPanelsButton()
LOCAL s, a_
::qPanelsMenu := QMenu()
::qPanelsMenu:setStyleSheet( GetStyleSheet( "QMenuPop", ::nAnimantionMode ) )
FOR EACH s IN ::oINI:aViews
a_:= hb_atokens( s, "," )
::addPanelsMenu( a_[ 1 ] )
NEXT
::qPanelsButton := QToolButton()
::qPanelsButton:setTooltip( "Panels" )
::qPanelsButton:setIcon( QIcon( hbide_image( "b_20" ) ) ) //panel_8" ) ) )
::qPanelsButton:setPopupMode( QToolButton_MenuButtonPopup )
::qPanelsButton:setMenu( ::qPanelsMenu )
// ::qPanelsButton:connect( "clicked()", {|| ::oDK:setView( "New..." ) } )
::qPanelsButton:connect( "clicked()", {|| ::managePanels() } )
RETURN ::qPanelsButton
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:addPanelsMenu( cPrompt )
LOCAL qAct
qAct := ::qPanelsMenu:addAction( cPrompt )
qAct:setIcon( QIcon( ::oDK:getPanelIcon( cPrompt ) ) )
qAct:connect( "triggered(bool)", {|| ::oDK:setView( cPrompt ) } )
aadd( ::aPanelsAct, qAct )
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:managePanels()
LOCAL a_
IF empty( ::oUIPnls )
::oUIPnls := ui_panels():new( ::oDlg:oWidget )
::oUIPnls:listOrder:setDragEnabled( .t. )
::oUIPnls:listOrder:setAcceptDrops( .t. )
::oUIPnls:listOrder:setDragDropMode( QAbstractItemView_InternalMove )
::oUIPnls:comboPos:addItem( "Top" )
::oUIPnls:comboPos:addItem( "Bottom" )
::oUIPnls:comboPos:addItem( "Left" )
::oUIPnls:comboPos:addItem( "Right" )
::oUIPnls:comboPos:setCurrentIndex( ::oINI:nPanelsTabPosition )
::oUIPnls:comboShape:addItem( "Round" )
::oUIPnls:comboShape:addItem( "Triangular" )
::oUIPnls:comboShape:setCurrentIndex( ::oINI:nPanelsTabShape )
::oUIPnls : connect( QEvent_Close, {|| ::oUIPnls:hide() } )
::oUIPnls:btnOk : connect( "clicked()" , {|| ::oUIPnls:hide(), ::arrangePanels() } )
::oUIPnls:btnCancel: connect( "clicked()" , {|| ::oUIPnls:hide() } )
ENDIF
::oUIPnls:move( ::qPanelsButton:mapToGlobal( QPoint( 0, 20 ) ) )
::oUIPnls:listOrder:clear()
::oUIPnls:comboDelete:clear()
FOR EACH a_ IN ::oDK:aViewsInfo
::oUIPnls:listOrder:addItem( a_[ 1 ] )
::oUIPnls:comboDelete:addItem( a_[ 1 ] )
NEXT
::oUIPnls:comboDelete:setCurrentIndex( -1 )
::oUIPnls:show()
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:arrangePanels()
LOCAL a_:={}, v_:={}, w_:={}, n, i, cView
LOCAL lOrder := .f.
::oINI:nPanelsTabShape := ::oUIPnls:comboShape:currentIndex()
::oINI:nPanelsTabPosition := ::oUIPnls:comboPos:currentIndex()
/* These are easy */
::oDK:oStackedWidget:setTabShape( ::oINI:nPanelsTabShape )
::oDK:oStackedWidget:setTabPosition( ::oINI:nPanelsTabPosition )
/* Rearrange panels */
FOR i := 1 TO ::oUIPnls:listOrder:count()
cView := ::oUIPnls:listOrder:item( i - 1 ):text()
n := ascan( ::oDK:aViewsInfo, {|e_| e_[ 1 ] == cView } )
aadd( a_, n )
IF n != i
lOrder := .t.
ENDIF
NEXT
IF lOrder
FOR EACH n IN a_
aadd( v_, ::oDK:aViewsInfo[ n ] )
aadd( w_, ::oIde:aViews[ n ] )
NEXT
::oDK:aViewsInfo := v_
::oIde:aViews := w_
ENDIF
/* tobe done at the end after re-order */
IF ! empty( cView := trim( ::oUIPnls:editView:text() ) )
::oDK:setView( cView )
ENDIF
IF ::oUIPnls:comboDelete:currentIndex() >= 0
::deletePanel( ::oUIPnls:comboDelete:currentText() )
ENDIF
/* Reordering needs that HbIDE be re-executed */
IF lOrder
MsgBox( "You will need to close HbIDE for panels re-order to take effect !" )
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeToolsManager:deletePanel( cView )
LOCAL nTab, n, pTab, oEdit
::oDK:setView( cView )
IF ! hbide_getYesNo( "Are you sure to remove - " + cView + " - panel ?" )
RETURN NIL
ENDIF
DO WHILE ::oIde:qTabWidget:count() > 0
pTab := ::oIde:qTabWidget:widget( 0 )
IF ( nTab := ascan( ::oIde:aTabs, {|e_| hbqt_IsEqual( e_[ 1 ]:oWidget, pTab ) } ) ) > 0
oEdit := ::oIde:aTabs[ nTab, TAB_OEDITOR ]
IF ! Empty( oEdit:sourceFile ) .AND. !( ".ppo" == lower( oEdit:cExt ) )
::oSM:closeSource( nTab, .F., .F., .T. ) /* This deletes the tabs also */
ENDIF
ENDIF
ENDDO
n := ascan( ::oDK:aViewsInfo, {|e_| e_[ 1 ] == cView } )
//
::oStackedWidget:oWidget:removeSubWindow( ::oIde:aMdies[ n ] )
::oIde:aMdies[ n ]:setParent( QWidget() ) /* Release memory */
hb_adel( ::oIde:aMdies , n, .t. )
hb_adel( ::oDK:aViewsInfo, n, .t. )
hb_adel( ::oIde:aViews , n, .t. )
RETURN Self
/*----------------------------------------------------------------------*/