IDE proyecto nuevo

HMG en Español

Moderator: Rathinagiri

User avatar
danielmaximiliano
Posts: 2681
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: IDE proyecto nuevo

Post by danielmaximiliano »

RPC wrote: Tue May 12, 2026 10:01 am Compile ---->>>> Downloads/IDEunicodev10
Try c:\Temp\IDEunicodev10 <----- Check that the folder has write permissions :ugeek:
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
danielmaximiliano
Posts: 2681
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: IDE proyecto nuevo

Post by danielmaximiliano »

Hola a todos:
llegue en un punto que el trabajo del IDEUnicode v0.10 se complicaba decidi cambiar DOM estudiando el IDE de Lazarus con lo que siempre me senti identificado.
asi que busque en mi yahoo mail mi viejo proyecto en turbo pascal llamado Tilos (un arbol de sudamerica) que era un sistema POS (point of Sale) ahi tenia a la tienda y sus sectores de venta, stock , expedicion y productos.
cuando entraba un producto nuevo o reposicion este producto afectaba las distintas secciones de la tienda, asi que en base a ese diseño decidi modificar el IDE siguiendo ese concepto que hice en en 1994.
les dejo la seccion de DOM y como lo estoy implementando porque me ahorra mucho escribir codigo sin equivocarme.

Hello everyone: I reached a point where working with IDEUnicode v0.10 was becoming too complicated, so I decided to change the DOM by studying the Lazarus IDE, with which I've always felt a connection.

So I looked in my Yahoo Mail for my old Turbo Pascal project called Tilos (a South American tree), which was a POS (Point of Sale) system. It had the store and its sales, stock, shipping, and product sections.
When a new product arrived or was restocked, it affected the different sections of the store. Based on that design, I decided to modify the IDE following the concept I created back in 1994. I'm sharing the DOM section and how I'm implementing it because it saves me a lot of time writing code without making mistakes.

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
tengo todavia unas discrepancias entre DOM y el TREE de HMG pero espero corregir estos dias siguiente.. espero les guste esa forma de trabajar
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
quartz565
Posts: 674
Joined: Mon Oct 01, 2012 12:37 pm
Location: Thessaloniki, Greece
Contact:

Re: IDE proyecto nuevo

Post by quartz565 »

Gracias Daniel!
Best Regards,
Nikos.

os: Windows Server 2019 - 64
User avatar
Steed
Posts: 450
Joined: Sat Dec 12, 2009 3:40 pm

Re: IDE proyecto nuevo

Post by Steed »

Gracias
Post Reply