Try c:\Temp\IDEunicodev10 <----- Check that the folder has write permissions
IDE proyecto nuevo
Moderator: Rathinagiri
- danielmaximiliano
- Posts: 2681
- Joined: Fri Apr 09, 2010 4:53 pm
- Location: Argentina
- Contact:
Re: IDE proyecto nuevo
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
- danielmaximiliano
- Posts: 2681
- Joined: Fri Apr 09, 2010 4:53 pm
- Location: Argentina
- Contact:
Re: IDE proyecto nuevo
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.
tengo todavia unas discrepancias entre DOM y el TREE de HMG pero espero corregir estos dias siguiente.. espero les guste esa forma de trabajar
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*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO