2010-10-22 01:01 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)

* contrib/hbide/projectpropertiesex.ui
    % Rearranged: tab names in accordance with new Project Management.

  * contrib/hbide/hbide.hbp
    ! Loaded in hbIDE, added hbide.ch, and saved.

  * contrib/hbide/idemain.prg
  * contrib/hbide/idemisc.prg
  * contrib/hbide/ideprojmanager.prg
    + Implemented: in-demand-since-begining feature to contain 
      anciallary files within the project tree but still keeping 
      compatibility with hbMK2. Also to have single project 
      file with all its contents intact, for GUI and command line
      interface.
      
      It is how it is achieved: a .hbp is loaded in HBP tab "as is"
      except stripping the header part which is readded when the 
      project is saved. The header part is comprised of :
        #
        # $Id$
        #
        
        -3rd=hbide_* contents.

      Rest whole of the on-disk contents of .hbp are made available 
      for editing. When a source is added via Add button, it is checked 
      if it is a compilable source. If not then "-3rd=file=" + filename
      is added at the bottom.

      Compilable sources are recognized by extention:
        ".c,.cpp,.prg,.hbs,.rc,.res,.hbm,.hbc,.qrc,.ui"
      If any is missing, please shout.
      TODO: user defined list of extentions for this purpose.

      The project tree is now more organized and is listed sorted 
      on extention and filename. User can easily locate the source 
      of interest and click to bring it into the editor.

      Please test extensively, I might have left new bugs for sure.
This commit is contained in:
Pritpal Bedi
2010-10-22 08:18:12 +00:00
parent 375224703f
commit 6d3a5d55d8
6 changed files with 226 additions and 55 deletions

View File

@@ -16,6 +16,47 @@
The license applies to all entries newer than 2009-04-28.
*/
2010-10-22 01:01 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbide/projectpropertiesex.ui
% Rearranged: tab names in accordance with new Project Management.
* contrib/hbide/hbide.hbp
! Loaded in hbIDE, added hbide.ch, and saved.
* contrib/hbide/idemain.prg
* contrib/hbide/idemisc.prg
* contrib/hbide/ideprojmanager.prg
+ Implemented: in-demand-since-begining feature to contain
anciallary files within the project tree but still keeping
compatibility with hbMK2. Also to have single project
file with all its contents intact, for GUI and command line
interface.
It is how it is achieved: a .hbp is loaded in HBP tab "as is"
except stripping the header part which is readded when the
project is saved. The header part is comprised of :
#
# $Id$
#
-3rd=hbide_* contents.
Rest whole of the on-disk contents of .hbp are made available
for editing. When a source is added via Add button, it is checked
if it is a compilable source. If not then "-3rd=file=" + filename
is added at the bottom.
Compilable sources are recognized by extention:
".c,.cpp,.prg,.hbs,.rc,.res,.hbm,.hbc,.qrc,.ui"
If any is missing, please shout.
TODO: user defined list of extentions for this purpose.
The project tree is now more organized and is listed sorted
on extention and filename. User can easily locate the source
of interest and click to bring it into the editor.
Please test extensively, I might have left new bugs for sure.
2010-10-21 12:51 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbqt/qtcore/hbqt_hbqslots.cpp
+ Added: "QModelIndex,QModelIndex" constant.

View File

@@ -4,6 +4,7 @@
-3rd=hbide_version=1.0
-3rd=hbide_title=hbide
-3rd=hbide_output=hbide
-inc
-o${hb_name}
@@ -82,3 +83,7 @@ tables.ui
updown_v.ui
hbide.qrc
-3rd=file=hbide.ch

View File

@@ -1099,7 +1099,7 @@ METHOD HbIde:removeProjectTree( aPrj )
/*----------------------------------------------------------------------*/
METHOD HbIde:updateProjectTree( aPrj )
LOCAL oProject, n, oSource, oItem, nProjExists, oP, oParent
LOCAL oProject, n, oSource, oItem, nProjExists, oP, oParent, a_:={}, b_
oProject := IdeProject():new( Self, aPrj )
@@ -1143,12 +1143,18 @@ METHOD HbIde:updateProjectTree( aPrj )
aadd( ::aProjData, { oP, "Project Name", oParent, oProject:title, aPrj, oProject } )
ENDIF
FOR EACH oSource IN oProject:hSources
aadd( a_, { oSource:ext, oSource:file, oSource } )
NEXT
IF !empty( a_ )
asort( a_, , , {|e_,f_| lower( e_[ 1 ] + e_[ 2 ] ) < lower( f_[ 1 ] + f_[ 2 ] ) } )
ENDIF
FOR EACH b_ IN a_
oSource := b_[ 3 ]
oItem := oP:addItem( oSource:file + oSource:ext )
oItem:tooltipText := oSource:original
oItem:oWidget:setIcon( 0, hbide_image( hbide_imageForFileType( oSource:ext ) ) )
aadd( ::aProjData, { oItem, "Source File", oP, oSource:original, oProject:title } )
NEXT
oP:oWidget:sortChildren( 0, Qt_AscendingOrder )
RETURN Self

View File

@@ -2195,3 +2195,40 @@ FUNCTION app_image( cName )
RETURN hbide_image( cName )
/*----------------------------------------------------------------------*/
FUNCTION hbide_isCompilerSource( cSource, cIncList )
LOCAL cExt
DEFAULT cIncList TO ".c,.cpp,.prg,.hbs,.rc,.res,.hbm,.hbc,.qrc,.ui"
cIncList := lower( cIncList )
hb_FNameSplit( cSource, , , @cExt )
RETURN lower( cExt ) $ cIncList
/*----------------------------------------------------------------------*/
FUNCTION hbide_prepareSourceForHbp( cSource )
IF ! empty( cSource ) .AND. !( left( cSource,1 ) $ "-#" ) .AND. ! lower( left( cSource, 5 ) ) == "-3rd="
IF ! hbide_isCompilerSource( cSource )
RETURN "-3rd=file=" + cSource
ENDIF
ENDIF
RETURN cSource
/*----------------------------------------------------------------------*/
FUNCTION hbide_synchronizeForHbp( aHbp )
LOCAL s
LOCAL txt_:={}
FOR EACH s IN aHbp
aadd( txt_, hbide_prepareSourceForHbp( s ) )
NEXT
RETURN txt_
/*----------------------------------------------------------------------*/

View File

@@ -270,6 +270,9 @@ CLASS IdeProjManager INHERIT IdeObject
METHOD synchronizeAlienProject( cProjFileName )
METHOD outputText( cText )
METHOD runAsScript()
METHOD insertHeader( aHdr, aHbp )
METHOD stripHeader( aHbp )
METHOD moveLine( nDirection )
ENDCLASS
@@ -488,7 +491,6 @@ METHOD IdeProjManager:pullHbpData( cHbp )
/* PRJ_PRP_FLAGS */
FOR EACH s IN aOptns
//HB_TRACE( HB_TR_DEBUG, "FLAGS ", s )
IF !empty( s )
aadd( a2_0, s )
ENDIF
@@ -496,10 +498,16 @@ METHOD IdeProjManager:pullHbpData( cHbp )
/* PRJ_PRP_SOURCES */
FOR EACH s IN aFiles
//HB_TRACE( HB_TR_DEBUG, "SOURCE ", s )
aadd( a3_0, s )
NEXT
/* Check sources which are not compilable but make-up source list */
FOR EACH s IN a3rd
IF "file=" == lower( left( s, 5 ) )
aadd( a3_0, hbide_stripRoot( cHome, alltrim( substr( s, 6 ) ) ) )
ENDIF
NEXT
/* Properties */
FOR EACH s IN a1_0
aadd( a1_1, s )
@@ -521,13 +529,14 @@ METHOD IdeProjManager:pullHbpData( cHbp )
NEXT
ENDIF
RETURN { { a1_0, a1_1 }, { a2_0, a2_1 }, { a3_0, a3_1 }, { a4_0, a4_1 } }
RETURN { { a1_0, a1_1 }, { a2_0, a2_1 }, { a3_0, a3_1 }, { a4_0, a4_1 }, hbide_readSource( cHbp ) }
/*----------------------------------------------------------------------*/
METHOD IdeProjManager:save( lCanClose )
LOCAL a_, lOk, txt_, nAlready
LOCAL c3rd := "-3rd="
LOCAL hdr_:= {}
* Validate certain parameters before continuing ... (vailtom)
@@ -549,44 +558,45 @@ METHOD IdeProjManager:save( lCanClose )
txt_:= {}
//
aadd( txt_, c3rd + "hbide_version=" + "1.0" )
aadd( hdr_, c3rd + "hbide_version=" + "1.0" )
//
IF ::oUI:q_comboPrjType:currentIndex() != 0
aadd( txt_, c3rd + "hbide_type=" + { "Executable", "Lib", "Dll" }[ ::oUI:q_comboPrjType:currentIndex() + 1 ] )
aadd( hdr_, c3rd + "hbide_type=" + { "Executable", "Lib", "Dll" }[ ::oUI:q_comboPrjType:currentIndex() + 1 ] )
ENDIF
IF ! Empty( ::oUI:q_editPrjTitle :text() )
aadd( txt_, c3rd + "hbide_title=" + hbide_space2amp( ::oUI:q_editPrjTitle :text() ) )
aadd( hdr_, c3rd + "hbide_title=" + hbide_space2amp( ::oUI:q_editPrjTitle :text() ) )
ENDIF
IF ! Empty( ::oUI:q_editWrkFolder :text() )
aadd( txt_, c3rd + "hbide_workingfolder=" + hbide_space2amp( ::oUI:q_editWrkFolder :text() ) )
aadd( hdr_, c3rd + "hbide_workingfolder=" + hbide_space2amp( ::oUI:q_editWrkFolder :text() ) )
ENDIF
IF ! Empty( ::oUI:q_editDstFolder :text() )
aadd( txt_, c3rd + "hbide_destinationfolder=" + hbide_space2amp( ::oUI:q_editDstFolder :text() ) )
aadd( hdr_, c3rd + "hbide_destinationfolder=" + hbide_space2amp( ::oUI:q_editDstFolder :text() ) )
ENDIF
IF ! Empty( ::oUI:q_editOutName :text() )
aadd( txt_, c3rd + "hbide_output=" + hbide_space2amp( ::oUI:q_editOutName :text() ) )
aadd( hdr_, c3rd + "hbide_output=" + hbide_space2amp( ::oUI:q_editOutName :text() ) )
ENDIF
IF ! Empty( ::oUI:q_editLaunchParams:text() )
aadd( txt_, c3rd + "hbide_launchparams=" + hbide_space2amp( ::oUI:q_editLaunchParams:text() ) )
aadd( hdr_, c3rd + "hbide_launchparams=" + hbide_space2amp( ::oUI:q_editLaunchParams:text() ) )
ENDIF
IF ! Empty( ::oUI:q_editLaunchExe :text() )
aadd( txt_, c3rd + "hbide_launchprogram=" + hbide_space2amp( ::oUI:q_editLaunchExe :text() ) )
aadd( hdr_, c3rd + "hbide_launchprogram=" + hbide_space2amp( ::oUI:q_editLaunchExe :text() ) )
ENDIF
IF ! Empty( ::oUI:q_editBackup :text() )
aadd( txt_, c3rd + "hbide_backupfolder=" + hbide_space2amp( ::oUI:q_editBackup :text() ) )
aadd( hdr_, c3rd + "hbide_backupfolder=" + hbide_space2amp( ::oUI:q_editBackup :text() ) )
ENDIF
IF ::oUI:q_checkXhb:isChecked()
aadd( txt_, c3rd + "hbide_xhb=" + iif( ::oUI:q_checkXhb:isChecked(), "YES", "NO" ) )
aadd( hdr_, c3rd + "hbide_xhb=" + iif( ::oUI:q_checkXhb:isChecked(), "YES", "NO" ) )
ENDIF
IF ::oUI:q_checkXpp:isChecked()
aadd( txt_, c3rd + "hbide_xpp=" + iif( ::oUI:q_checkXpp:isChecked(), "YES", "NO" ) )
aadd( hdr_, c3rd + "hbide_xpp=" + iif( ::oUI:q_checkXpp:isChecked(), "YES", "NO" ) )
ENDIF
IF ::oUI:q_checkClp:isChecked()
aadd( txt_, c3rd + "hbide_clp=" + iif( ::oUI:q_checkClp:isChecked(), "YES", "NO" ) )
aadd( hdr_, c3rd + "hbide_clp=" + iif( ::oUI:q_checkClp:isChecked(), "YES", "NO" ) )
ENDIF
aadd( txt_, " " )
a_:= hbide_memoToArray( ::oUI:q_editFlags:toPlainText() ) ; aeval( a_, {|e| aadd( txt_, e ) } )
aadd( txt_, " " )
a_:= hbide_memoToArray( ::oUI:q_editSources:toPlainText() ) ; aeval( a_, {|e| aadd( txt_, e ) } )
a_:= hbide_synchronizeForHbp( hbide_memoToArray( ::oUI:q_editSources:toPlainText() ) )
a_:= ::insertHeader( hdr_, a_ )
aeval( a_, {|e| aadd( txt_, e ) } )
aadd( txt_, " " )
::cSaveTo := ::oUI:q_editPrjLoctn:text() + ::pathSep + ::oUI:q_editOutName:text() + ".hbp"
@@ -626,37 +636,66 @@ METHOD IdeProjManager:save( lCanClose )
/*----------------------------------------------------------------------*/
METHOD IdeProjManager:updateHbp( iIndex )
LOCAL a_, txt_, s, cExt
METHOD IdeProjManager:insertHeader( aHdr, aHbp )
LOCAL txt_:={}
IF iIndex != 3
RETURN nil
aadd( txt_, "#" )
aadd( txt_, "# $Id$" )
aadd( txt_, "#" )
aadd( txt_, "" )
aeval( aHdr, {|e| aadd( txt_, e ) } )
aadd( txt_, "" )
aeval( aHbp, {|e| aadd( txt_, e ) } )
aadd( txt_, "" )
RETURN txt_
/*----------------------------------------------------------------------*/
METHOD IdeProjManager:stripHeader( aHbp )
LOCAL nStart, n, s
LOCAL a_:= {}
FOR EACH s IN aHbp
n := s:__enumIndex()
s := alltrim( s )
IF left( s, 1 ) == "#" .AND. n <= 3
nStart := n
LOOP
ENDIF
IF empty( s )
LOOP
ENDIF
IF ! ( "-3rd=hbide_" $ s )
nStart := n
EXIT
ENDIF
NEXT
IF ! empty( nStart )
FOR EACH s IN aHbp
IF s:__enumIndex() < nStart
LOOP
ENDIF
aadd( a_, s )
NEXT
ELSE
RETURN aHbp
ENDIF
txt_:= {}
RETURN a_
/* Flags */
a_:= hb_atokens( ::oUI:q_editFlags:toPlainText(), _EOL )
FOR EACH s IN a_
s := alltrim( s )
IF !( "#" == left( s,1 ) ) .and. !empty( s )
aadd( txt_, s )
ENDIF
NEXT
aadd( txt_, " " )
/*----------------------------------------------------------------------*/
METHOD IdeProjManager:updateHbp( iIndex )
LOCAL txt_
IF iIndex != 3
RETURN NIL
ENDIF
/* Sources */
a_:= hb_atokens( ::oUI:q_editSources:toPlainText(), _EOL )
FOR EACH s IN a_
s := alltrim( s )
IF !( "#" == left( s,1 ) ) .and. !empty( s )
hb_FNameSplit( s, , , @cExt )
IF lower( cExt ) $ ".c,.cpp,.prg,.rc,.res"
aadd( txt_, s )
ENDIF
ENDIF
NEXT
aadd( txt_, " " )
txt_:= hbide_synchronizeForHbp( hb_atokens( ::oUI:q_editSources:toPlainText(), _EOL ) )
/* Final assault */
::oUI:q_editHbp:setPlainText( hbide_arrayToMemo( txt_ ) )
@@ -717,7 +756,7 @@ METHOD IdeProjManager:fetchProperties()
::oUI:q_checkClp :setChecked( ::oProject:isClp )
::oUI:q_editFlags :setPlainText( hbide_arrayToMemo( ::aPrjProps[ PRJ_PRP_FLAGS , 1 ] ) )
::oUI:q_editSources :setPlainText( hbide_arrayToMemo( ::aPrjProps[ PRJ_PRP_SOURCES , 1 ] ) )
::oUI:q_editSources :setPlainText( hbide_arrayToMemo( ::stripHeader( ::aPrjProps[ 5 ] ) ) )
::oUI:q_editLaunchParams:setText( ::oProject:launchParams )
::oUI:q_editLaunchExe:setText( ::oProject:launchProgram )
@@ -751,17 +790,26 @@ METHOD IdeProjManager:buildInterface()
::oUI:q_buttonBackup :setIcon( cLukupPng )
::oUI:q_buttonSelect :setIcon( hbide_image( "open" ) )
::oUI:q_buttonUp :setIcon( hbide_image( "dc_up" ) )
::oUI:q_buttonDown :setIcon( hbide_image( "dc_down" ) )
::oUI:q_buttonSort :setIcon( hbide_image( "sort" ) )
::oUI:q_buttonSortZA :setIcon( hbide_image( "sortdescend" ) )
::oUI:q_buttonSortOrg:setIcon( hbide_image( "invertcase" ) )
::oUI:q_buttonSort :hide()
::oUI:q_buttonSortZA :hide()
::oUI:q_buttonSortOrg:hide()
::oUI:q_buttonCn :connect( "clicked()", {|| ::lSaveOK := .f., ::oPropertiesDock:hide() } )
::oUI:q_buttonSave :connect( "clicked()", {|| ::lSaveOK := .t., ::save( .F. ) } )
::oUI:q_buttonSaveExit :connect( "clicked()", {|| ::lSaveOK := .t., ::save( .T. ) } )
::oUI:q_buttonSelect :connect( "clicked()", {|| ::addSources() } )
::oUI:q_buttonSort :connect( "clicked()", {|| ::sortSources( "az" ) } )
::oUI:q_buttonSortZA :connect( "clicked()", {|| ::sortSources( "za" ) } )
::oUI:q_buttonSortOrg :connect( "clicked()", {|| ::sortSources( "org" ) } )
::oUI:q_buttonUp :connect( "clicked()", {|| ::moveLine( -1 ) } )
::oUI:q_buttonDown :connect( "clicked()", {|| ::moveLine( +1 ) } )
// ::oUI:q_buttonSort :connect( "clicked()", {|| ::sortSources( "az" ) } )
// ::oUI:q_buttonSortZA :connect( "clicked()", {|| ::sortSources( "za" ) } )
// ::oUI:q_buttonSortOrg :connect( "clicked()", {|| ::sortSources( "org" ) } )
::oUI:q_tabWidget :connect( "currentChanged(int)", {|p| ::updateHbp( p ) } )
::oUI:q_buttonChoosePrjLoc:connect( "clicked()", {|| ::PromptForPath( 'editPrjLoctn' , 'Choose Project Location...' ) } )
::oUI:q_buttonChooseWd :connect( "clicked()", {|| ::PromptForPath( 'editWrkFolder', 'Choose Working Folder...' ) } )
@@ -810,6 +858,9 @@ METHOD IdeProjManager:buildInterface()
::oUI:setTabOrder( ::oUI:q_buttonSaveExit , ::oUI:q_buttonSave )
::oUI:setTabOrder( ::oUI:q_buttonSave , ::oUI:q_buttonCn )
::oUI:q_tabHbp:hide()
::oUI:q_tabFlags:hide()
RETURN Self
/*----------------------------------------------------------------------*/
@@ -859,7 +910,7 @@ METHOD IdeProjManager:synchronizeAlienProject( cProjFileName )
METHOD IdeProjManager:sortSources( cMode )
LOCAL a_, cTyp, s, d_, n
LOCAL aSrc := { ".prg", ".ch", ".c", ".cpp", ".h", ".obj", ".o", ".lib", ".a", ".rc", ".res" }
LOCAL aTxt := { {} , {} , {} , {} , {} , {} , {} , {} , {} , {}, {} }
LOCAL aTxt := { {} , {} , {} , {} , {} , {} , {} , {} , {} , {} , {} }
LOCAL aRst := {}
a_:= hbide_memoToArray( ::oUI:q_editSources:toPlainText() )
@@ -948,8 +999,20 @@ METHOD IdeProjManager:isValidProjectLocation( lTell )
/*----------------------------------------------------------------------*/
METHOD IdeProjManager:moveLine( nDirection )
IF nDirection == -1
ELSE
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeProjManager:addSources()
LOCAL aFiles, a_, b_, s
LOCAL aFiles, a_, b_, s, cHome
IF ::isValidProjectLocation( .t. )
IF !empty( aFiles := ::oSM:selectSource( "openmany", , , ::oUI:q_editPrjLoctn:text() ) )
@@ -958,9 +1021,11 @@ METHOD IdeProjManager:addSources()
b_:={}
aeval( aFiles, {|e| aadd( b_, e ) } )
cHome := ::oUI:q_editPrjLoctn:text()
FOR EACH s IN b_
s := hbide_prepareSourceForHbp( hbide_stripRoot( cHome, s ) )
IF ascan( a_, s ) == 0
aadd( a_, hbide_stripRoot( ::oUI:q_editPrjLoctn:text(), s ) )
aadd( a_, s )
ENDIF
NEXT

View File

@@ -278,7 +278,7 @@ p, li { white-space: pre-wrap; }
</widget>
<widget class="QWidget" name="tabFiles">
<attribute name="title">
<string>Sources</string>
<string>HBP</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="1" colspan="11">
@@ -344,6 +344,20 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QToolButton" name="buttonUp">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QToolButton" name="buttonDown">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabFlags">
@@ -371,13 +385,16 @@ p, li { white-space: pre-wrap; }
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabHbp">
<attribute name="title">
<string>hbp</string>
<string>Sources</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">