2010-07-08 19:01 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)

* contrib/hbide/hbide.prg
  * contrib/hbide/idedocks.prg
  * contrib/hbide/ideedit.prg
  * contrib/hbide/ideeditor.prg
  * contrib/hbide/idefunctions.prg
  * contrib/hbide/ideharbourhelp.prg
    + Implemented: Harbour function definitions which are part of 
      Harbour documentation files in /doc/en folders viewable in 
      Documentation Viewer available as code completion lists.
      For this to happen, you must have Harbour's root path 
      provided in Documentation Viewer dialog.
      So, as an example, if definitions are loaded ok, you 
      must see a list of QWeb*() functions as soon as you type "Web"
      in an editing instance.

      Please provide your input what else is missing.
This commit is contained in:
Pritpal Bedi
2010-07-09 02:12:21 +00:00
parent 234bff10c3
commit 94a2b83375
7 changed files with 176 additions and 179 deletions

View File

@@ -16,6 +16,24 @@
The license applies to all entries newer than 2009-04-28.
*/
2010-07-08 19:01 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbide/hbide.prg
* contrib/hbide/idedocks.prg
* contrib/hbide/ideedit.prg
* contrib/hbide/ideeditor.prg
* contrib/hbide/idefunctions.prg
* contrib/hbide/ideharbourhelp.prg
+ Implemented: Harbour function definitions which are part of
Harbour documentation files in /doc/en folders viewable in
Documentation Viewer available as code completion lists.
For this to happen, you must have Harbour's root path
provided in Documentation Viewer dialog.
So, as an example, if definitions are loaded ok, you
must see a list of QWeb*() functions as soon as you type "Web"
in an editing instance.
Please provide your input what else is missing.
2010-07-08 10:21 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbide/hbide.prg
* contrib/hbide/idedocks.prg

View File

@@ -430,7 +430,7 @@ METHOD HbIde:create( aParams )
hbide_loadThemes( Self )
/* Harbour Help Object */
::oHL := ideHarbourHelp():new():create( Self )
// ::oHL := ideHarbourHelp():new():create( Self )
/* DOCKing windows and ancilliary windows */
::oDK := IdeDocks():new():create( Self )
@@ -461,6 +461,9 @@ METHOD HbIde:create( aParams )
/* Edits Manager */
::oEM := IdeEditsManager():new( Self ):create()
/* Harbour Help Object */
::oHL := ideHarbourHelp():new():create( Self )
/* Load Environments */
::oEV := IdeEnvironments():new( Self ):create()
@@ -535,6 +538,8 @@ METHOD HbIde:create( aParams )
::qTabWidget:setCurrentIndex( ::qTabWidget:count() - 1 )
::qTabWidget:setCurrentIndex( val( ::oINI:cRecentTabIndex ) )
::oEM:updateCompleter()
::showApplicationCursor()
qSplash:close()

View File

@@ -570,8 +570,6 @@ METHOD IdeDocks:setViewInitials( cView )
::setView( cView )
HB_TRACE( HB_TR_ALWAYS, cView, ::qTabWidget:count() )
IF ::qTabWidget:count() == 1
::oEM:setSourceVisibleByIndex( 0 )
ELSE

View File

@@ -2201,10 +2201,14 @@ METHOD IdeEdit:parseCodeCompletion( cSyntax )
LOCAL cText, n
IF ::oINI:lCompleteArgumented
cText := trim( cSyntax )
IF ( n := rat( ")", cSyntax ) ) > 0
cText := trim( substr( cSyntax, 1, n ) )
ELSE
cText := trim( cSyntax )
ENDIF
ELSE
IF ( n := at( "(", cSyntax ) ) > 0
cText := trim( substr( cSyntax, 1, n - 1 ) )
cText := trim( substr( cSyntax, 1, n ) )
ELSE
cText := trim( cSyntax )
ENDIF

View File

@@ -228,14 +228,46 @@ METHOD IdeEditsManager:create( oIde )
::oIde:qProtoList := QStringList():new()
::oIde:qCompModel := QStringListModel():new()
::oIde:qCompleter := QCompleter():new()
::connect( ::qCompleter, "activated(QString)", {|p| ::execEvent( "qcompleter_activated", p ) } )
::updateCompleter()
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeEditsManager:updateCompleter()
LOCAL aFun := ::oFN:getFunctionPrototypes()
LOCAL aHrb := ::oHL:getFunctionPrototypes()
LOCAL n, s, a_, k_:={}
::disconnect( ::qCompleter, "activated(QString)", {|p| ::execEvent( "qcompleter_activated", p ) } )
FOR EACH a_ IN { aFun, aHrb }
FOR EACH s IN a_
s := trim( s )
IF ::oINI:lCompletionWithArgs
IF ascan( k_, s ) == 0
aadd( k_, s )
ENDIF
ELSE
IF ( n := at( "(", s ) ) == 0
IF ( n := at( " ", s ) ) > 0
aadd( k_, substr( s, 1, n - 1 ) )
ELSE
aadd( k_, trim( s ) )
ENDIF
ELSE
aadd( k_, substr( s, 1, n - 1 ) )
ENDIF
ENDIF
NEXT
NEXT
asort( k_, , , {|e,f| lower( e ) < lower( f ) } )
::qProtoList:clear()
aeval( k_, {|e| ::qProtoList:append( e ) } )
::qCompModel:setStringList( ::qProtoList )
::qCompleter:setModel( ::qCompModel )
@@ -246,6 +278,8 @@ METHOD IdeEditsManager:updateCompleter()
QListView():from( ::qCompleter:popup() ):setAlternatingRowColors( .t. )
::connect( ::qCompleter, "activated(QString)", {|p| ::execEvent( "qcompleter_activated", p ) } )
RETURN Self
/*----------------------------------------------------------------------*/

View File

@@ -125,6 +125,7 @@ CLASS IdeFunctions INHERIT IdeObject
METHOD clearProjects()
METHOD getMarkedProjects()
METHOD enableControls( lEnable )
METHOD getFunctionPrototypes()
ENDCLASS
@@ -591,7 +592,7 @@ METHOD IdeFunctions:consolidateList()
/*----------------------------------------------------------------------*/
METHOD IdeFunctions:populateTable()
LOCAL oTbl, qItm, a_, n, s, k_:={}
LOCAL oTbl, qItm, a_, n
LOCAL qApp := QApplication():new()
::clear( .t. )
@@ -616,34 +617,23 @@ METHOD IdeFunctions:populateTable()
::oUI:q_labelEntries:setText( "Entries: " + hb_ntos( n ) )
NEXT
FOR EACH a_ IN ::aList
s := a_[ 2 ]
IF ::oINI:lCompletionWithArgs
aadd( k_, trim( s ) )
ELSE
IF ( n := at( "(", s ) ) == 0
IF ( n := at( " ", s ) ) > 0
aadd( k_, substr( s, 1, n - 1 ) )
ELSE
aadd( k_, trim( s ) )
ENDIF
ELSE
aadd( k_, substr( s, 1, n - 1 ) )
ENDIF
ENDIF
NEXT
asort( k_, , , {|e,f| lower( e ) < lower( f ) } )
::qProtoList:clear()
aeval( k_, {|e| ::qProtoList:append( e ) } )
::oEM:updateCompleter()
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeFunctions:getFunctionPrototypes()
LOCAL aProto := {}, a_
FOR EACH a_ IN ::aList
aadd( aProto, alltrim( a_[ 2 ] ) )
NEXT
RETURN aProto
/*----------------------------------------------------------------------*/
STATIC FUNCTION hbide_abbrFuncType( cFunc )
LOCAL cAbbr := ""

View File

@@ -122,6 +122,8 @@ CLASS IdeDocFunction
DATA oTVItem
DATA cSourceTxt INIT ""
DATA lOk INIT .f.
METHOD new() INLINE Self
ENDCLASS
@@ -147,6 +149,10 @@ CLASS IdeHarbourHelp INHERIT IdeObject
DATA hIndex INIT {=>}
DATA aProtoTypes INIT {}
DATA lLoadedProto INIT .f.
DATA aFuncDefs INIT {}
METHOD new( oIde )
METHOD create( oIde )
METHOD show()
@@ -175,6 +181,8 @@ CLASS IdeHarbourHelp INHERIT IdeObject
METHOD parseTextFile( cTextFile, oParent )
METHOD jumpToFunction( cFunction )
METHOD getDocFunction( acBuffer )
METHOD getFunctionPrototypes()
METHOD pullDefinitions( acBuffer )
ENDCLASS
@@ -193,6 +201,8 @@ METHOD IdeHarbourHelp:create( oIde )
DEFAULT oIde TO ::oIde
::oIde := oIde
::cPathInstall := ::cWrkHarbour
RETURN Self
/*----------------------------------------------------------------------*/
@@ -212,6 +222,8 @@ METHOD IdeHarbourHelp:show()
::populateRootInfo()
::refreshDocTree()
::oEM:updateCompleter()
ENDIF
RETURN Self
@@ -487,6 +499,7 @@ METHOD IdeHarbourHelp:execEvent( nMode, p, p1 )
CASE "buttonRefresh_clicked"
::refreshDocTree()
::oEM:updateCompleter()
EXIT
CASE "buttonPrint_clicked"
@@ -756,155 +769,24 @@ METHOD IdeHarbourHelp:populateIndex()
/*----------------------------------------------------------------------*/
METHOD IdeHarbourHelp:getDocFunction( acBuffer )
LOCAL a_, s, oFunc, nPart, lIsFunc
METHOD IdeHarbourHelp:pullDefinitions( acBuffer )
LOCAL a_, s, nPart, oFunc
LOCAL lIsFunc := .f.
LOCAL aFn := {}
IF hb_isArray( acBuffer )
a_:= acBuffer
ELSE
a_:= hbide_memoTOarray( acBuffer )
IF hb_fileExists( acBuffer )
a_:= hbide_readSource( acBuffer )
ELSE
a_:= hbide_memoTOarray( acBuffer )
ENDIF
ENDIF
oFunc := IdeDocFunction():new()
lIsFunc := .f.
FOR EACH s IN a_
DO CASE
CASE "$DOC$" $ s
lIsFunc := .t.
CASE "$END$" $ s
EXIT
CASE "$TEMPLATE$" $ s
nPart := DOC_FUN_TEMPLATE
CASE "$FUNCNAME$" $ s .OR. "$NAME$" $ s
nPart := DOC_FUN_FUNCNAME
CASE "$CATEGORY$" $ s
nPart := DOC_FUN_CATEGORY
CASE "$SUBCATEGORY$" $ s
nPart := DOC_FUN_SUBCATEGORY
CASE "$ONELINER$" $ s
nPart := DOC_FUN_ONELINER
CASE "$SYNTAX$" $ s
nPart := DOC_FUN_SYNTAX
CASE "$ARGUMENTS$" $ s
nPart := DOC_FUN_ARGUMENTS
CASE "$RETURNS$" $ s
nPart := DOC_FUN_RETURNS
CASE "$DESCRIPTION$" $ s
nPart := DOC_FUN_DESCRIPTION
CASE "$EXAMPLES$" $ s
nPart := DOC_FUN_EXAMPLES
CASE "$TESTS$" $ s
nPart := DOC_FUN_TESTS
CASE "$FILES$" $ s
nPart := DOC_FUN_FILES
CASE "$STATUS$" $ s
nPart := DOC_FUN_STATUS
CASE "$PLATFORMS$" $ s .OR. "$COMPLIANCE$" $ s
nPart := DOC_FUN_PLATFORMS
CASE "$SEEALSO$" $ s
nPart := DOC_FUN_SEEALSO
CASE "$VERSION$" $ s
nPart := DOC_FUN_VERSION
CASE "$INHERITS" $ s
nPart := DOC_FUN_INHERITS
CASE "$METHODS" $ s
nPart := DOC_FUN_METHODS
CASE "$EXTERNALLINK" $ s
nPart := DOC_FUN_EXTERNALLINK
OTHERWISE
IF ! lIsFunc
LOOP // It is a fake line not within $DOC$ => $END$ block
ENDIF
s := substr( s, 9 )
SWITCH nPart
CASE DOC_FUN_BEGINS
EXIT
CASE DOC_FUN_TEMPLATE
oFunc:cTemplate := s
EXIT
CASE DOC_FUN_FUNCNAME
oFunc:cName := alltrim( s )
EXIT
CASE DOC_FUN_CATEGORY
oFunc:cCategory := alltrim( s )
EXIT
CASE DOC_FUN_SUBCATEGORY
oFunc:cSubCategory := alltrim( s )
EXIT
CASE DOC_FUN_ONELINER
oFunc:cOneLiner := s
EXIT
CASE DOC_FUN_SYNTAX
aadd( oFunc:aSyntax , s )
EXIT
CASE DOC_FUN_ARGUMENTS
aadd( oFunc:aArguments , s )
EXIT
CASE DOC_FUN_RETURNS
aadd( oFunc:aReturns , s )
EXIT
CASE DOC_FUN_DESCRIPTION
aadd( oFunc:aDescription, s )
EXIT
CASE DOC_FUN_EXAMPLES
aadd( oFunc:aExamples , s )
EXIT
CASE DOC_FUN_TESTS
aadd( oFunc:aTests , s )
EXIT
CASE DOC_FUN_FILES
aadd( oFunc:aFiles , s )
EXIT
CASE DOC_FUN_STATUS
oFunc:cStatus := alltrim( s )
EXIT
CASE DOC_FUN_PLATFORMS
oFunc:cPlatForms := alltrim( s )
EXIT
CASE DOC_FUN_SEEALSO
oFunc:cSeaAlso := alltrim( s )
EXIT
CASE DOC_FUN_INHERITS
oFunc:cInherits := alltrim( s )
EXIT
CASE DOC_FUN_METHODS
aadd( oFunc:aMethods , s )
EXIT
CASE DOC_FUN_VERSION
oFunc:cVersion := alltrim( s )
EXIT
CASE DOC_FUN_EXTERNALLINK
oFunc:cExternalLink := alltrim( s )
EXIT
OTHERWISE
nPart := DOC_FUN_NONE
EXIT
ENDSWITCH
ENDCASE
NEXT
IF ! lIsFunc
oFunc := NIL
ENDIF
RETURN oFunc
/*----------------------------------------------------------------------*/
METHOD IdeHarbourHelp:parseTextFile( cTextFile, oParent )
LOCAL a_, s, nPart, oFunc, oTWItem
LOCAL lIsFunc := .f.
LOCAL cIcon := hbide_image( "dc_function" )
LOCAL aFn := {}
LOCAL nParsed := ascan( ::aFuncByFile, {|e_| e_[ 1 ] == cTextFile } )
IF nParsed == 0
IF .t.
nPart := DOC_FUN_NONE
a_:= hbide_readSource( cTextFile )
FOR EACH s IN a_
DO CASE
@@ -915,15 +797,7 @@ METHOD IdeHarbourHelp:parseTextFile( cTextFile, oParent )
CASE "$END$" $ s
IF lIsFunc
lIsFunc := .f.
nPart := DOC_FUN_ENDS
oTWItem := QTreeWidgetItem():new()
oTWItem:setText( 0, oFunc:cName )
oTWItem:setIcon( 0, cIcon )
oTWItem:setTooltip( 0, oFunc:cName )
oParent:addChild( oTWItem )
aadd( ::aNodes, { oTWItem, "Function", oParent, cTextFile + "<::>" + oFunc:cName, oFunc:cName } )
aadd( ::aFunctions, { cTextFile, oFunc:cName, oFunc, oTWItem, NIL, lower( oFunc:cName ) } )
oFunc:lOk := .t.
aadd( aFn, oFunc )
ENDIF
@@ -1040,7 +914,29 @@ METHOD IdeHarbourHelp:parseTextFile( cTextFile, oParent )
ENDSWITCH
ENDCASE
NEXT
ENDIF
RETURN aFn
/*----------------------------------------------------------------------*/
METHOD IdeHarbourHelp:parseTextFile( cTextFile, oParent )
LOCAL aFn, oFunc, oTWItem
LOCAL cIcon := hbide_image( "dc_function" )
LOCAL nParsed := ascan( ::aFuncByFile, {|e_| e_[ 1 ] == cTextFile } )
IF nParsed == 0
IF !empty( aFn := ::pullDefinitions( cTextFile ) )
FOR EACH oFunc IN aFn
oTWItem := QTreeWidgetItem():new()
oTWItem:setText( 0, oFunc:cName )
oTWItem:setIcon( 0, cIcon )
oTWItem:setTooltip( 0, oFunc:cName )
oParent:addChild( oTWItem )
aadd( ::aNodes, { oTWItem, "Function", oParent, cTextFile + "<::>" + oFunc:cName, oFunc:cName } )
aadd( ::aFunctions, { cTextFile, oFunc:cName, oFunc, oTWItem, NIL, lower( oFunc:cName ) } )
NEXT
ENDIF
aadd( ::aFuncByFile, { cTextFile, aFn } )
ENDIF
@@ -1048,6 +944,58 @@ METHOD IdeHarbourHelp:parseTextFile( cTextFile, oParent )
/*----------------------------------------------------------------------*/
METHOD IdeHarbourHelp:getDocFunction( acBuffer )
LOCAL aFn
IF !empty( aFn := ::pullDefinitions( acBuffer ) )
RETURN aFn[ 1 ]
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD IdeHarbourHelp:getFunctionPrototypes()
LOCAL a_, cFolder, aFN, oFunc, cNFolder
LOCAL aPaths := {}
LOCAL aDocs := {}
LOCAL aProto := {}
IF !empty( ::cPathInstall )
IF ! ::lLoadedProto
hbide_fetchSubPaths( @aPaths, ::cPathInstall, .t. )
FOR EACH cFolder IN aPaths
cNFolder := hbide_pathNormalized( cFolder, .t. )
IF ( "/doc" $ cNFolder ) .OR. ( "/doc/en" $ cNFolder )
aadd( aDocs, cFolder )
ENDIF
NEXT
FOR EACH cFolder IN aDocs
FOR EACH a_ IN directory( cFolder + "*.txt" )
IF a_[ 5 ] != "D"
aFn := ::pullDefinitions( cFolder + a_[ 1 ] )
FOR EACH oFunc IN aFn
IF hb_isObject( oFunc )
IF !empty( oFunc:aSyntax )
aadd( aProto, oFunc:aSyntax[ 1 ] ) //hbide_arrayToMemoEx( oFunc:aSyntax ) )
ENDIF
ENDIF
NEXT
ENDIF
NEXT
NEXT
::aProtoTypes := aProto
::lLoadedProto := .t.
ENDIF
ENDIF
RETURN ::aProtoTypes
/*----------------------------------------------------------------------*/
METHOD IdeHarbourHelp:updateViewer( aHtm )
::oUI:q_browserView:setHTML( hbide_arrayToMemo( aHtm ) )