Re: IDE proyecto nuevo
Posted: Wed May 13, 2026 8:28 pm
Exclusive forum for HMG, a Free / Open Source xBase WIN32/64 Bits / GUI Development System
http://mail.hmgforum.com/
Code: Select all
// Dom.prg
#include "hmg.ch"
#include "IDE_Unicode.ch"
// ============================================================================
// IDE UNICODE v0.12
// DOM CORE ENGINE
// ============================================================================
STATIC nDomNextID := 1000
// ============================================================================
// DOM CORE
// ============================================================================
FUNCTION DOM_Init()
PUBLIC hDOM := {=>}
// ----------------------------------------------------------------
// CORE
// ----------------------------------------------------------------
hDOM["_data"] := {=>}
hDOM["_watch"] := {=>}
hDOM["_history"] := {}
// ----------------------------------------------------------------
// PROJECT
// ----------------------------------------------------------------
hDOM["project"] := {=>}
hDOM["project"]["name"] := ""
hDOM["project"]["path"] := ""
hDOM["project"]["status"] := "INIT"
hDOM["project"]["modified"] := .F.
hDOM["project"]["containers"] := {}
hDOM["project"]["files"] := {}
// ----------------------------------------------------------------
// EDITOR
// ----------------------------------------------------------------
hDOM["editor"] := {=>}
hDOM["editor"]["active_file"] := ""
hDOM["editor"]["dirty"] := .F.
hDOM["editor"]["encoding"] := "utf8"
// ----------------------------------------------------------------
// UI
// ----------------------------------------------------------------
hDOM["ui"] := {=>}
hDOM["ui"]["tree_selected"] := 0
// ----------------------------------------------------------------
// LANGUAGE
// ----------------------------------------------------------------
hDOM["language"] := "English"
RETURN NIL
// ============================================================================
// DOM GET / SET
// ============================================================================
FUNCTION DomSet( cKey, uValue )
LOCAL uOld := NIL
IF !HB_HHasKey( hDOM["_data"], cKey )
hDOM["_data"][ cKey ] := NIL
ENDIF
uOld := hDOM["_data"][ cKey ]
IF uOld == uValue
RETURN NIL
ENDIF
hDOM["_data"][ cKey ] := uValue
AAdd( hDOM["_history"], { cKey, uOld, uValue } )
RETURN NIL
FUNCTION DomGet( cKey )
IF HB_HHasKey( hDOM["_data"], cKey )
RETURN hDOM["_data"][ cKey ]
ENDIF
RETURN NIL
// ============================================================================
// DOM CREATE EMPTY
// ============================================================================
PROCEDURE DOM_CreateEmpty()
hDOM["project"]["name"] := ""
hDOM["project"]["path"] := ""
hDOM["project"]["status"] := "INIT"
hDOM["project"]["modified"] := .F.
hDOM["project"]["containers"] := {}
hDOM["project"]["files"] := {}
RETURN
// ============================================================================
// DOM LOAD PROJECT
// ============================================================================
PROCEDURE DOM_LoadProject( cProject )
LOCAL cName
IF Empty( cProject )
RETURN
ENDIF
IF !File( cProject )
RETURN
ENDIF
cName := hb_fNameName( cProject )
hDOM["project"]["name"] := cName
hDOM["project"]["path"] := cProject
hDOM["project"]["status"] := "PROJECT"
hDOM["project"]["modified"] := .F.
hDOM["project"]["containers"]:= {}
hDOM["project"]["files"] := {}
DOM_LoadContainers()
RETURN
// ============================================================================
// LOAD CONTAINERS
// ============================================================================
PROCEDURE DOM_LoadContainers()
LOCAL cHBP
LOCAL cBase
LOCAL cDir
LOCAL cFRM
LOCAL cHBC
LOCAL cRC
cHBP := hDOM["project"]["path"]
cBase := hb_fNameName( cHBP )
cDir := hb_fNameDir( cHBP )
IF Right( cDir, 1 ) != "\"
cDir += "\"
ENDIF
cFRM := cDir + cBase + ".frm"
cHBC := cDir + cBase + ".hbc"
cRC := cDir + cBase + ".rc"
// ----------------------------------------------------------------
// REGISTER CONTAINERS
// ----------------------------------------------------------------
DOM_AddContainer( "hbp", cHBP )
IF File( cFRM )
DOM_AddContainer( "frm", cFRM )
ENDIF
IF File( cHBC )
DOM_AddContainer( "hbc", cHBC )
ENDIF
IF File( cRC )
DOM_AddContainer( "rc", cRC )
ENDIF
// ----------------------------------------------------------------
// PARSE
// ----------------------------------------------------------------
DOM_ParseHBP( cHBP )
IF File( cFRM )
DOM_ParseFRM( cFRM )
ENDIF
RETURN
// ============================================================================
// ADD CONTAINER
// ============================================================================
PROCEDURE DOM_AddContainer( cType, cPath )
LOCAL hContainer := {=>}
nDomNextID++
hContainer["id"] := nDomNextID
hContainer["type"] := Lower( cType )
hContainer["path"] := cPath
hContainer["name"] := hb_fNameNameExt( cPath )
hContainer["icon"] := GetFileIconIndex( cPath )
AAdd( hDOM["project"]["containers"], hContainer )
RETURN
// ============================================================================
// PARSE HBP
// ============================================================================
PROCEDURE DOM_ParseHBP( cHBP )
LOCAL cContent , aLines , cLine , nI
LOCAL cDir , cFull , cExt
LOCAL cName
IF !File( cHBP )
RETURN
ENDIF
cDir := hb_fNameDir( cHBP )
IF Right( cDir, 1 ) != "\"
cDir += "\"
ENDIF
cContent := MemoRead( cHBP )
cContent := StrTran( cContent, Chr(13), "" )
aLines := hb_ATokens( cContent, Chr(10) )
FOR nI := 1 TO Len( aLines )
cLine := AllTrim( aLines[nI] )
IF Empty( cLine )
LOOP
ENDIF
IF Left( cLine, 1 ) == "#"
LOOP
ENDIF
IF Left( cLine, 1 ) == "-"
LOOP
ENDIF
cLine := StrTran( cLine, "/", "\" )
//----------------------------------------------------
// FULL PATH
//----------------------------------------------------
IF ":" $ cLine
cFull := cLine
ELSE
cFull := cDir + cLine
ENDIF
cExt := Lower( hb_fNameExt( cFull ) )
cName := hb_fNameNameExt( cFull )
//----------------------------------------------------
// REGISTER FILE
//----------------------------------------------------
IF cExt == ".prg" .OR. ;
cExt == ".c" .OR. ;
cExt == ".cpp"
DOM_AddFile( cFull , "hbp" )
ENDIF
NEXT
RETURN
// ============================================================================
// PARSE FRM
// ============================================================================
PROCEDURE DOM_ParseFRM( cFRM )
LOCAL cContent , aLines , cLine , nI , cDir , cFull , cExt
IF !File( cFRM )
RETURN
ENDIF
cDir := hb_fNameDir( cFRM )
IF Right( cDir, 1 ) != "\"
cDir += "\"
ENDIF
cContent := MemoRead( cFRM )
cContent := StrTran( cContent, Chr(13), "" )
aLines := hb_ATokens( cContent, Chr(10) )
FOR nI := 1 TO Len( aLines )
cLine := AllTrim( aLines[nI ] )
IF Empty( cLine )
LOOP
ENDIF
IF Left( cLine, 1 ) == "#"
LOOP
ENDIF
IF Left( cLine, 1 ) == "-"
LOOP
ENDIF
cLine := StrTran( cLine, "/", "\" )
IF ":" $ cLine
cFull := cLine
ELSE
cFull := cDir + cLine
ENDIF
cExt := Lower( hb_fNameExt( cFull ) )
IF cExt == ".fmg"
DOM_AddFile( cFull, "frm" )
ENDIF
NEXT
RETURN
// ============================================================================
// ADD FILE
// ============================================================================
PROCEDURE DOM_AddFile( cFull, cGroup )
LOCAL hFile := {=>}
LOCAL cName , cExt
IF Empty( cFull )
RETURN
ENDIF
IF DOM_FindFileByPath( cFull ) != NIL
RETURN
ENDIF
cName := hb_fNameNameExt( cFull )
cExt := Lower( hb_fNameExt( cFull ) )
nDomNextID++
hFile["id"] := nDomNextID
hFile["name"] := cName
hFile["path"] := cFull
hFile["ext"] := cExt
hFile["group"] := cGroup
hFile["opened"] := .F.
hFile["dirty"] := .F.
hFile["encoding"]:= "utf8"
hFile["icon"] := GetFileIconIndex( cFull )
DO CASE
CASE cExt == ".prg"
hFile["type"] := "source"
CASE cExt == ".c"
hFile["type"] := "c"
CASE cExt == ".cpp"
hFile["type"] := "cpp"
CASE cExt == ".fmg"
hFile["type"] := "form"
OTHERWISE
hFile["type"] := "unknown"
ENDCASE
AAdd( hDOM["project"]["files"], hFile )
hDOM["project"]["modified"] := .T.
RETURN
// ============================================================================
// FIND FILE
// ============================================================================
FUNCTION DOM_FindFileByPath( cPath )
LOCAL aFiles := hDOM["project"]["files"]
LOCAL nI
FOR nI := 1 TO Len( aFiles )
IF Upper( aFiles[nI]["path"] ) == Upper( cPath )
RETURN aFiles[nI]
ENDIF
NEXT
RETURN NIL
FUNCTION DOM_GetPath( nIndex )
LOCAL aFiles , hFile , nI
IF Empty( nIndex )
RETURN ""
ENDIF
IF !HB_HHasKey( hDOM, "project" )
RETURN ""
ENDIF
IF !HB_HHasKey( hDOM["project"], "files" )
RETURN ""
ENDIF
aFiles := hDOM["project"]["files"]
FOR nI := 1 TO Len( aFiles )
hFile := aFiles[nI]
IF ValType( hFile ) == "H"
IF hb_HGetDef( hFile, "treeid", 0 ) == nIndex
RETURN hb_HGetDef( hFile, "path", "" )
ENDIF
ENDIF
NEXT
RETURN ""
PROCEDURE InitProjectStructure()
hDOM["project_name"] := "Untitled"
hDOM["status"] := "EMPTY"
RETURN
// ============================================================================
// BUILD TREE
// ============================================================================
FUNCTION BuildTreeFromDOM()
LOCAL aContainers := hDOM["project"]["containers"]
LOCAL aFiles := hDOM["project"]["files"]
LOCAL nI , nJ
LOCAL hContainer , hFile
LOCAL nRoot
LOCAL nProject
LOCAL nHBP := 0
LOCAL nFRM := 0
LOCAL nHBC := 0
LOCAL nRC := 0
LOCAL nTreeID
IF .NOT. IsWindowDefined( "Inspector" )
RETURN NIL
ENDIF
DoMethod( "Inspector", "Tree_Project", "DisableUpdate" )
DoMethod( "Inspector", "Tree_Project", "DeleteAllItems" )
// ----------------------------------------------------------------
// INIT
// ----------------------------------------------------------------
IF hDOM["project"]["status"] == "INIT"
DoMethod( ;
"Inspector", ;
"Tree_Project", ;
"AddItem", ;
"IDE Unicode v0.12", ;
0, ;
5 )
DoMethod( ;
"Inspector", ;
"Tree_Project", ;
"AddItem", ;
"No open project", ;
1, ;
6 )
DoMethod( "Inspector", "Tree_Project", "EnableUpdate" )
DoMethod( "Inspector", "Tree_Project", "Refresh" )
RETURN NIL
ENDIF
// ----------------------------------------------------------------
// ROOT
// ----------------------------------------------------------------
DoMethod( ;
"Inspector", ;
"Tree_Project", ;
"AddItem", ;
"IDE Unicode v0.12", ;
0, ;
1 )
nRoot := GetProperty( ;
"Inspector", ;
"Tree_Project", ;
"ItemCount" )
// ----------------------------------------------------------------
// PROJECT
// ----------------------------------------------------------------
DoMethod( ;
"Inspector", ;
"Tree_Project", ;
"AddItem", ;
hDOM["project"]["name"], ;
nRoot, ;
6 )
nProject := GetProperty( ;
"Inspector", ;
"Tree_Project", ;
"ItemCount" )
// ----------------------------------------------------------------
// CONTAINERS
// ----------------------------------------------------------------
FOR nI := 1 TO Len( aContainers )
hContainer := aContainers[nI]
DoMethod( ;
"Inspector", ;
"Tree_Project", ;
"AddItem", ;
hContainer["name"], ;
nProject, ;
hContainer["icon"] )
nTreeID := GetProperty( ;
"Inspector", ;
"Tree_Project", ;
"ItemCount" )
hContainer["treeid"] := nTreeID
DO CASE
CASE hContainer["type"] == "hbp"
nHBP := nTreeID
CASE hContainer["type"] == "frm"
nFRM := nTreeID
CASE hContainer["type"] == "hbc"
nHBC := nTreeID
CASE hContainer["type"] == "rc"
nRC := nTreeID
ENDCASE
NEXT
// ----------------------------------------------------------------
// FILES
// ----------------------------------------------------------------
FOR nJ := 1 TO Len( aFiles )
hFile := aFiles[nJ]
DO CASE
CASE hFile["group"] == "hbp"
IF nHBP > 0
DoMethod( ;
"Inspector", ;
"Tree_Project", ;
"AddItem", ;
hFile["name"], ;
nHBP, ;
hFile["icon"] )
ENDIF
CASE hFile["group"] == "frm"
IF nFRM > 0
DoMethod( ;
"Inspector", ;
"Tree_Project", ;
"AddItem", ;
hFile["name"], ;
nFRM, ;
hFile["icon"] )
ENDIF
CASE hFile["group"] == "hbc"
IF nHBC > 0
DoMethod( ;
"Inspector", ;
"Tree_Project", ;
"AddItem", ;
hFile["name"], ;
nHBC, ;
hFile["icon"] )
ENDIF
CASE hFile["group"] == "rc"
IF nRC > 0
DoMethod( ;
"Inspector", ;
"Tree_Project", ;
"AddItem", ;
hFile["name"], ;
nRC, ;
hFile["icon"] )
ENDIF
ENDCASE
//-------------------------------------------------------------
// CAPTURE REAL TREE ID
//-------------------------------------------------------------
nTreeID := GetProperty( ;
"Inspector", ;
"Tree_Project", ;
"ItemCount" )
hFile["treeid"] := nTreeID
NEXT
// ----------------------------------------------------------------
// EXPAND
// ----------------------------------------------------------------
IF nRoot > 0
DoMethod( "Inspector", "Tree_Project", "Expand", nRoot )
ENDIF
IF nProject > 0
DoMethod( "Inspector", "Tree_Project", "Expand", nProject )
ENDIF
IF nHBP > 0
DoMethod( "Inspector", "Tree_Project", "Expand", nHBP )
ENDIF
IF nFRM > 0
DoMethod( "Inspector", "Tree_Project", "Expand", nFRM )
ENDIF
IF nHBC > 0
DoMethod( "Inspector", "Tree_Project", "Expand", nHBC )
ENDIF
IF nRC > 0
DoMethod( "Inspector", "Tree_Project", "Expand", nRC )
ENDIF
// ----------------------------------------------------------------
// DEFAULT SELECT
// ----------------------------------------------------------------
SetProperty( "Inspector", "Tree_Project", "Value", 1 )
DoMethod( "Inspector", "Tree_Project", "EnableUpdate" )
DoMethod( "Inspector", "Tree_Project", "Refresh" )
ConsoleLog( ;
"UI: Tree rebuilt -> " + ;
hb_ntos( Len( aFiles ) ) + ;
" files", ;
"SUCCESS" )
RETURN NIL
// ============================================================================
// SAVE PROJECT
// ============================================================================
PROCEDURE DOM_SaveProject()
LOCAL cProject := DomGet( "project_path" )
IF Empty( cProject )
RETURN
ENDIF
Project_SyncHBP()
ConsoleLog( "DOM: project saved", "SUCCESS" )
RETURN
PROCEDURE Project_SyncHBP()
LOCAL cProject := DomGet( "project_path" )
LOCAL aModules
LOCAL i
LOCAL cContent := ""
IF Empty( cProject )
RETURN
ENDIF
IF !HB_HHasKey( hDOM, "modules" )
RETURN
ENDIF
aModules := hDOM["modules"]
FOR i := 1 TO Len( aModules )
cContent += aModules[i] + hb_eol()
NEXT
MemoWrit( cProject, cContent )
ConsoleLog( "PROJECT: .hbp synced", "SUCCESS" )
RETURN
// ============================================================================
// ICONS
// ============================================================================
FUNCTION GetFileIconIndex( cFile )
LOCAL cExt := Lower( hb_fNameExt( cFile ) )
LOCAL nIcono := 6
DO CASE
CASE cExt == ".hbp"
nIcono := 1
CASE cExt == ".prg" .OR. cExt == ".c" .OR. cExt == ".cpp"
nIcono := 2
CASE cExt == ".rc"
nIcono := 3
CASE cExt == ".ch" .OR. cExt == ".h"
nIcono := 4
CASE cExt == ".frm"
nIcono := 7
CASE cExt == ".fmg"
nIcono := 8
CASE cExt == ".hbc"
nIcono := 9
CASE Empty( cExt )
nIcono := 5
ENDCASE
RETURN nIcono