' **    SOURCE TREE    **
' COMPILE AS WINDOW TARGET

$use "shlwapi.lib"

' ---------------------------------------------------------------
' INTERNAL SETTINGS
' ---------------------------------------------------------------

'	MAX number of characters in a SUB
$define MAX_SUB_SIZE 30000
'	MAX number of characters in a LINE
$define MAX_LINE_SIZE 2048
'	MAX number of tvitems than the treeview can hold (for avoid an infinite loop if an error happens)
$define MAX_TVITEMS_NUMBER 10000

' ---------------------------------------------------------------
' DECLARATIONS
' ---------------------------------------------------------------

CONST WS_CHILD = 0x40000000
CONST SS_ETCHEDHORZ	= 16
CONST WS_VISIBLE = 0x10000000
CONST TVGN_NEXT						= 1
CONST TVGN_PREVIOUS					= 2
CONST TVGN_PARENT					= 3
CONST TVGN_CHILD					= 4
CONST TVN_FIRST						= -400
CONST TVN_DELETEITEMA				= (TVN_FIRST-9)
CONST TVN_SELCHANGEDA				= (TVN_FIRST-2)
CONST TV_FIRST						= 0x1100
CONST TVM_EXPAND					= (TV_FIRST+2)
CONST TVM_GETCOUNT					= (TV_FIRST+5)
CONST TVM_GETNEXTITEM				= (TV_FIRST+10)
CONST TVM_SORTCHILDREN				= (TV_FIRST+19)
CONST TVM_SORTCHILDRENCB			= (TV_FIRST+21)
CONST TVM_GETITEMA					= (TV_FIRST+12)
CONST TVM_SETITEMA					= (TV_FIRST+13)
CONST TVM_SETBKCOLOR 				= (TV_FIRST+29)
CONST TVE_COLLAPSE					= 0x1
CONST TVE_EXPAND					= 0x2
CONST TVIF_PARAM					= 4
CONST TVIF_HANDLE					= 16
CONST GWL_WNDPROC = (-4)
CONST WM_NOTIFY 				= 0x4E
CONST NM_FIRST					= 0
CONST NM_CLICK 					= (NM_FIRST-2)
CONST NM_DBLCLK 				= (NM_FIRST-3)
CONST NM_RCLICK 				= (NM_FIRST-5)
CONST TVS_HASBUTTONS				= 1
CONST TVS_HASLINES					= 2
CONST TVS_LINESATROOT				= 4

TYPE TVFINDER
	INT actualid
	INT nivel
	INT childhab
	INT tipo ' 1 begin, 2 normal, 3 end
	INT hwndtv ' handle of the treeview
ENDTYPE

TYPE POINT 
    INT x
    INT y
ENDTYPE

TYPE NMHDR
	INT hwndFrom
	INT idfrom
	INT code
ENDTYPE

TYPE TVITEM
	INT mask
	INT hItem
	INT state
	INT stateMask
	POINTER pszText
	INT cchTextMax
	INT iImage
	INT iSelectedImage
	INT cChildren
	INT lParam
ENDTYPE

TYPE NMTREEVIEW
    NMHDR hdr
    UINT action
    TVITEM itemOld
    TVITEM itemNew
    POINT ptDrag
ENDTYPE 

TYPE TVSORTCB
    UINT hParent
    INT lpfnCompare
    INT lParam
ENDTYPE

DECLARE IMPORT, _MoveWindow ALIAS MoveWindow(INT hwnd,INT x,INT y,INT nWidth,INT nHeightINT,INT bRepaint),INT
DECLARE IMPORT, _GetModuleHandle ALIAS GetModuleHandleA(POINTER lpModuleName),INT
DECLARE IMPORT, _CreateWindowEx ALIAS CreateWindowExA(INT dwExStyle,STRING lpClassName,STRING lpWindowName,INT dwStyle,INT x,INT y,INT nWidth,INT nHeight,INT hWndParent,INT hMenu,INT hInstance,POINTER lpParam),INT
DECLARE IMPORT, _SetWindowLong ALIAS SetWindowLongA(INT hwnd,INT nIndex,INT dwNewLong),INT
DECLARE IMPORT, _CallWindowProc ALIAS CallWindowProcA(INT lpPrevWndFunc,INT hWnd,INT Msg,INT wParam,INT lParam),INT
DECLARE "shlwapi.dll",_PathFindFileName ALIAS "PathFindFileNameA"(STRING pszPath),STRING
DECLARE "shlwapi.dll",_PathRemoveFileSpec ALIAS "PathRemoveFileSpecA"(STRING pszPath),INT
DECLARE IMPORT, _LockWindowUpdate ALIAS LockWindowUpdate(INT hwndLock),INT
DECLARE IMPORT, _Sleep ALIAS Sleep(INT dwMilliseconds)

' ---------------------------------------------------------------
' CONTROLS - VARIABLES
' ---------------------------------------------------------------

CONST TREEVIEW_2 = 2
CONST TREEVIEW_4 = 4

WINDOW d1

CONST GROUP_3 = 3
CONST BUTTON_4 = 4
CONST STATIC_1 = 19
CONST STATIC_5 = 5
CONST STATIC_6 = 6
CONST STATIC_7 = 7
CONST STATIC_8 = 8
CONST EDIT_10 = 10
CONST BUTTON_11 = 11
CONST BUTTON_12 = 12
CONST RADIO_2 = 19
CONST RADIO_3 = 20
CONST RADIO_4 = 21
CONST RADIO_5 = 22

DIALOG d2

CREATEDIALOG d2,0,0,322,252,0x80C80080,0,"About Source Tree",&d2_handler
CONTROL d2,@GROUPBOX,"",8,8,305,185,0x50000007,GROUP_3
CONTROL d2,@STATIC,"",16,24,105,97,@CTLSTCBITMAP|@BORDER,STATIC_1
CONTROL d2,@STATIC,"Source Tree",152,24,135,17,0x5000010B,STATIC_5
CONTROL d2,@STATIC,"Version 1.1",152,48,129,17,0x5000010B,STATIC_6
CONTROL d2,@STATIC,"Developed by Fasecero",152,72,128,17,0x5000010B,STATIC_7
CONTROL d2,@STATIC,"",16,136,270,17,0x5000010B,STATIC_8
CONTROL d2,@EDIT,"",32,160,209,21,0x50800805,EDIT_10
CONTROL d2,@BUTTON,">>",256,159,43,25,0x50000000,BUTTON_11
CONTROL d2,@BUTTON,"&OK",128,208,75,33,0x50000000,BUTTON_12
CONTROL d2,@RADIOBUTTON,"Development",152,104,95,21,0x50000009,RADIO_3
CONTROL d2,@RADIOBUTTON,"Icons",250,104,55,20,0x50000009,RADIO_4

CONST STATIC_101 = 121
CONST STATIC_102 = 122

DIALOG d3

CREATEDIALOG d3,0,0,188,98,0x80C00080,0,"Source Tree",&d3_handler
CONTROL d3,@STATIC,"Searching...",59,8,70,20,0x5000010B,STATIC_101
CONTROL d3,@STATIC,"Please wait...",59,28,70,20,0x5000010B,STATIC_102

CONST GROUP_6 = 6
CONST BUTTON_7 = 7

DIALOG d4

CREATEDIALOG d4,0,0,281,229,0x80C80080,0,"Source Tree",&d4_handler
CONTROL d4,@RADIOBUTTON,"IWB/EBasic",56,45,168,20,0x50000009,RADIO_2
CONTROL d4,@RADIOBUTTON,"Creative Basic",56,75,168,20,0x50000009,RADIO_3
CONTROL d4,@RADIOBUTTON,"Aurora",55,104,172,20,0x50000009,RADIO_4
CONTROL d4,@RADIOBUTTON,"C/C++",55,134,185,20,0x50000009,RADIO_5
CONTROL d4,@GROUPBOX," Select the target language ",16,13,250,159,0x50000007,GROUP_6
CONTROL d4,@BUTTON,"&OK",106,185,70,26,0x50000000,BUTTON_7

UINT hbitmap 'bitmap for toolbar
INT tbArray[14] 'control ID's, 0 for a separator
tbArray = 81,0,82,83,0,84,85,0,86,0,87,88,0,89
INT panes[2] 'statusbar
string dirdev,diricons

run = 1

INT Language = 1 ' 1 EB, 2 Creative, 3 Aurora, 4 C/C++
INT ShowParams = 0
INT SearchClasses = 0
STRING LastSourcePath[4]
INT OldProc ' old procedure handle
INT hwndst ' static menubar separator handle
INT tvroot_files ' root tvitem of files
INT tvroot_proc2 ' root tvitem of procedures in TV2
INT tvroot_proc4 ' root tvitem of procedures in TV4
POINTER ProcList = 0 ' linked list of PROCDATA

TYPE PROCDATA
	string name ' sub name
	string nameparams ' sub params
	istring subtext[MAX_SUB_SIZE] ' sub content
	pointer procChildList ' linked list of PROCCHILDDATA
	int level
ENDTYPE

TYPE PROCCHILDDATA
	string name
	istring nameparams[MAX_LINE_SIZE]
	int index
ENDTYPE

TYPE FILEDATA
	string fullpath
ENDTYPE

' ---------------------------------------------------------------
' MAIN LOOP
' ---------------------------------------------------------------

DECLARE EXTERN OnClearAll()

DECLARE EXTERN AuroraCheckFunction(string sline, string sbef), string 
DECLARE EXTERN SearchProcFileAU(string filename, uint itemid)

$INCLUDE "Data.iwb"
$INCLUDE "Control.iwb"
$INCLUDE "Files.iwb"
$INCLUDE "Language.iwb"
$INCLUDE "Program.iwb"
$INCLUDE "Events.iwb"

OPENWINDOW d1,0,0,700,500,0x80CB0080|@SIZE|@HIDDEN|@MINBOX|@MAXBOX|@SYSMENU,0,"Source Tree",&d1_handler
SETWINDOWCOLOR d1, RGB(200,196,200)
SHOWWINDOW d1, @SWSHOW
WAITUNTIL run = 0
END

' ---------------------------------------------------------------
' PROCEDURES
' ---------------------------------------------------------------
SUB d1_handler(),INT
	SELECT @MESSAGE
		CASE @IDCREATE
			/* Initialize any controls here */
			OnInit()
		CASE @IDCLOSEWINDOW
			OnClose()
		CASE @IDCONTROL
			SELECT @CONTROLID
				CASE TREEVIEW_2
				/* respond to control notifications here */
				CASE TREEVIEW_4
				/* respond to control notifications here */
				CASE 81 ' toolbar new 
					IF @NOTIFYCODE = 0 THEN OnClearAll()
				CASE 82 ' toolbar load 
					IF @NOTIFYCODE = 0 THEN OnImport()
				CASE 83 ' toolbar save 
					IF @NOTIFYCODE = 0 THEN OnExport()
				CASE 84 ' toolbar add files 
					IF @NOTIFYCODE = 0 THEN OnAdd()
				CASE 85 ' toolbar delete files
					IF @NOTIFYCODE = 0 THEN OnDelete()
				CASE 86 ' toolbar change language
					IF @NOTIFYCODE = 0 THEN OnChangeLan()
				CASE 87 ' toolbar export to plain text
					IF @NOTIFYCODE = 0 THEN OnExportPlain()
				CASE 88 ' toolbar export to rich text
					IF @NOTIFYCODE = 0 THEN OnExportRich()
				CASE 89 ' toolbar make tree
					IF @NOTIFYCODE = 0 THEN OnMakeTree()
				ENDSELECT
		CASE @IDMENUINIT
			CHECKMENUITEM(d1, 1010, ShowParams)
			CHECKMENUITEM(d1, 1011, SearchClasses)
		CASE @IDMENUPICK
			SELECT @MENUNUM
				CASE 1001: ' new
					OnClearAll()
				CASE 1002: ' load
					OnImport()
				CASE 1003: ' save
					OnExport()
				CASE 1004: ' export to plain file
					OnExportPlain()
				CASE 1005: ' export to rich file
					OnExportRich()
				CASE 1006: ' exit
					OnClose()
				CASE 1007: ' expand tree
					OnExpand()
				CASE 1008: ' collapse
					OnCollapse()
				CASE 1009: ' select language
					OnChangeLan()
				CASE 1010: ' show parameters
					ShowParams = ChangeFlagState(ShowParams)
				CASE 1011: ' search classes
					SearchClasses = ChangeFlagState(SearchClasses)
				CASE 1012: ' about
					OnAbout()
			ENDSELECT
		CASE @IDSIZE
			OnSize()
	ENDSELECT
RETURN 0
ENDSUB

SUB d1plus_handler(hWnd:INT,uMsg:INT,wParam:INT,lParam:INT),INT
	pointer fdata
	SETTYPE fdata, FILEDATA
	uint itemid 
	SELECT uMsg
        CASE WM_NOTIFY
			SELECT INT(wParam)
				CASE TREEVIEW_2
					SELECT *<NMHDR>lparam.code
						CASE TVN_DELETEITEMA
							itemid = *<NMTREEVIEW>lparam.itemOld.hItem
							fdata = tvGetItemData(d1, TREEVIEW_2, itemid)
							IF fdata THEN
								DELETE fdata
							ENDIF
						CASE TVN_SELCHANGEDA
							OnSelectionChangedtv2(lParam)
						CASE NM_DBLCLK
							itemid = tvGetSelectedItem(d1, TREEVIEW_2)
							IF itemid THEN
								fdata = tvGetItemData(d1, TREEVIEW_2, itemid)
								IF fdata THEN SYSTEM #fdata.fullpath 
							ENDIF
					ENDSELECT
				CASE TREEVIEW_4
					SELECT *<NMHDR>lparam.code
						CASE TVN_SELCHANGEDA
							OnSelectionChangedtv4(lParam)
					ENDSELECT
			ENDSELECT
	ENDSELECT
	RETURN _CallWindowProc(OldProc,hWnd,uMsg,wParam,lParam)
ENDSUB

SUB d2_handler(),INT
	SELECT @MESSAGE
		CASE @IDINITDIALOG
			CENTERWINDOW d2
			/* Initialize any controls here */
			dirdev = "http://www.ionicwind.com/"
			diricons = "http://www.everaldo.com/crystal/"
			SETCONTROLTEXT d2, STATIC_8, "Compiler: EBASIC              "
			SETCONTROLCOLOR d2, EDIT_10, 0, RGB(242,242,230)
			SETCONTROLTEXT d2, EDIT_10, dirdev
			SETCONTROLTEXT d2, STATIC_1, GETSTARTPATH + "about.bmp"
			SETSTATE d2, RADIO_3, 1
		CASE @IDCLOSEWINDOW
			CLOSEDIALOG d2,@IDOK
		CASE @IDCONTROL
			SELECT @CONTROLID
				CASE BUTTON_4
					IF @NOTIFYCODE = 0
						/*button clicked*/
					ENDIF
				CASE EDIT_10
				/* respond to edit notifications here */
				CASE BUTTON_11
					IF @NOTIFYCODE = 0
						/*button clicked*/
						IF GETSTATE(d2, RADIO_3) THEN SYSTEM(dirdev) ELSE SYSTEM(diricons)
					ENDIF
				CASE BUTTON_12
					IF @NOTIFYCODE = 0
						/*button clicked*/
						CLOSEDIALOG d2,@IDOK
					ENDIF
				CASE RADIO_3
					IF @NOTIFYCODE = 0
						/*button clicked*/
						SETCONTROLTEXT d2, STATIC_8, "Compiler: EBASIC              "
						SETCONTROLTEXT d2, EDIT_10, dirdev
					ENDIF
				CASE RADIO_4
					IF @NOTIFYCODE = 0
						/*button clicked*/
						SETCONTROLTEXT d2, STATIC_8, "Icons: Crystal Icons          "
						SETCONTROLTEXT d2, EDIT_10, diricons
					ENDIF
			ENDSELECT
	ENDSELECT
RETURN 0
ENDSUB

SUB d3_handler(),INT
	SELECT @MESSAGE
		CASE @IDINITDIALOG
			CENTERWINDOW d3
			/* Initialize any controls here */
		CASE @IDCLOSEWINDOW
			CLOSEDIALOG d3,@IDOK
	ENDSELECT
RETURN 0
ENDSUB

SUB d4_handler(),INT
	SELECT @MESSAGE
		CASE @IDINITDIALOG
			CENTERWINDOW d4
			/* Initialize any controls here */
			SETSTATE d4, Language+18, 1
			ENABLECONTROL d4, RADIO_5, 0
		CASE @IDCLOSEWINDOW
			CLOSEDIALOG d4,@IDOK
		CASE @IDCONTROL
			SELECT @CONTROLID
				CASE RADIO_2
					IF @NOTIFYCODE = 0
						/*button clicked*/
						Language = 1
					ENDIF
				CASE RADIO_3
					IF @NOTIFYCODE = 0
						/*button clicked*/
						Language = 2
					ENDIF
				CASE RADIO_4
					IF @NOTIFYCODE = 0
						/*button clicked*/
						Language = 3
					ENDIF
				CASE RADIO_5
					IF @NOTIFYCODE = 0
						/*button clicked*/
						Language = 4
					ENDIF
				CASE BUTTON_7
					IF @NOTIFYCODE = 0
						/*button clicked*/
						StatusShowLan()
						CLOSEDIALOG d4,@IDOK
					ENDIF
			ENDSELECT
	ENDSELECT
RETURN 0
ENDSUB
