
; Template for program using standard Win32 headers

format PE GUI 4.0
entry start

include 'encoding\utf8.inc'
include 'win32ax.inc'


SQLITE_OK	= 0d
SQLITE_ERROR	= 1d
SQLITE_INTERNAL = 2d
SQLITE_ROW	= 100d
SQLITE_DONE	= 101d

ID_CLOSE = 1001h
ID_OPEN = 1002h
ID_EXIT = 1003h

section '.text' code readable executable

  start:

	invoke	GetModuleHandle,0
	mov	[wc.hInstance],eax
	invoke	LoadIcon,0,IDI_APPLICATION
	mov	[wc.hIcon],eax
	invoke	LoadCursor,0,IDC_ARROW
	mov	[wc.hCursor],eax
	invoke	RegisterClass,wc
	test	eax,eax
	jz	error

	invoke	CreateWindowEx,0,'FASMWIN32','SQLite Example',WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,300,200,NULL,NULL,[wc.hInstance],NULL
	test	eax,eax
	jz	error

  msg_loop:
	invoke	GetMessage,msg,NULL,0,0
	cmp	eax,1
	jb	end_loop
	jne	msg_loop
	invoke	TranslateMessage,msg
	invoke	DispatchMessage,msg
	jmp	msg_loop

  error:
	invoke	MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK

  end_loop:
	invoke	ExitProcess,[msg.wParam]

proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam
	cmp	[wmsg],WM_DESTROY
	je	.wmdestroy
	cmp	[wmsg],WM_CREATE
	je	.wmcreate
	cmp	[wmsg],WM_COMMAND
	je	.wmcommand
  .defwndproc:
	invoke	DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
	jmp	.finish
  .wmdestroy:
	invoke	PostQuitMessage,0
	xor	eax,eax
	jmp	.finish
  .wmcreate:
	;create menu
	invoke	CreateMenu
	mov	[hMenubar],eax
	invoke	CreateMenu
	mov	[hFile],eax
		
	invoke	AppendMenu,[hMenubar],MF_POPUP,[hFile],'&File'

	invoke	AppendMenu,[hFile],MF_STRING,ID_OPEN,'&Open'
	invoke	AppendMenu,[hFile],MF_STRING,ID_CLOSE,'&Close'
	invoke	AppendMenu,[hFile],MF_STRING,ID_EXIT,'&Exit'

	invoke	SetMenu,[hwnd],[hMenubar]

	;enable  MENU Buttons
	invoke	EnableMenuItem,[hFile],ID_OPEN,MF_ENABLED
	;disable MENU Buttons
	invoke	EnableMenuItem,[hFile],ID_CLOSE,MF_GRAYED

	invoke	InitCommonControlsEx,icc
	test	eax,eax
	jnz	@f
	invoke	MessageBox,NULL,'Error in InitCommonControlsEx',NULL,MB_ICONERROR+MB_OK
	jmp	end_loop
     @@:

	;create listview
	invoke	CreateWindowEx,WS_EX_CLIENTEDGE,\
				sListView,\
				NULL,\
				WS_VISIBLE+WS_CHILD+WS_TABSTOP+WS_BORDER+LVS_ALIGNLEFT+LVS_NOSORTHEADER+LVS_REPORT+LVS_SHOWSELALWAYS,\
				10,\
				10,\
				275,\
				130,\
				[hwnd],\
				NULL,\
				[wc.hInstance],\
				NULL
	mov	[hListView],eax
	;get listview ID
	invoke	GetDlgCtrlID,[hListView]
	mov	[idListView],eax
	;adjust listview style
	invoke	SendMessage,[hListView],LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT
	;insert columns
	invoke	SendMessage,[hListView],LVM_INSERTCOLUMN,0,lvc1
	invoke	SendMessage,[hListView],LVM_INSERTCOLUMN,1,lvc2

  .wmcommand:

	;verifica o item clicado no menu
	mov	eax,[wparam]
	and	eax,0FFFFh
	cmp	eax,ID_EXIT  ;verifica se foi clicado no menu->Sair
	je	.wmdestroy
	cmp	eax,ID_OPEN ;verifica se foi clicado no menu->Abrir
	je	.open
	cmp	eax,ID_CLOSE ;verifica se foi clicado no menu->Fechar
	je	.close
	invoke	DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
	jmp	.finish
	;================================
	;     MENU -> OPEN DATABASE
	;================================
     .open:
	mov	eax,[hwnd]
	mov	[lpofn.hwndOwner],eax
	invoke	RtlZeroMemory,lpstrFile,MAX_PATH
	invoke	GetOpenFileName,lpofn
	test	eax,eax
	jz	.quit

	;open database
	cinvoke sqlite3_open,[lpofn.lpstrFile],hDb
	cmp	eax,SQLITE_OK
	jne	.quit
	;prepare query
	cinvoke sqlite3_prepare,[hDb],'SELECT FIRST_NAME FROM NAMES ORDER BY FIRST_NAME;',-1,hStmt,NULL
	cmp	eax,SQLITE_OK
	jne	.quit

     @@:
	cinvoke sqlite3_step,[hStmt]
	cmp	eax,SQLITE_DONE
	je	@f
	cmp	eax,SQLITE_ROW
	jne	@f

	;+++++++++++++++++++++++++++++++++++++++++++++++++

	invoke	RtlZeroMemory,szBuffer,MAX_PATH
	invoke	RtlZeroMemory,szBuffer2,MAX_PATH

	mov	dword[lvi + LV_ITEM.iItem],9999d
	cinvoke sqlite3_column_bytes,[hStmt],0
	mov	[ibytes],eax
	cinvoke sqlite3_column_text,[hStmt],0

	invoke	MultiByteToWideChar,CP_UTF8,0,eax,[ibytes],szBuffer,MAX_PATH
	invoke	WideCharToMultiByte,CP_ACP,0,szBuffer,[ibytes],szBuffer2,MAX_PATH,NULL,NULL
	lea	eax,[szBuffer2]
	mov	[lvi + LV_ITEM.pszText],eax
	invoke	SendMessage,[hListView],LVM_INSERTITEM,0,lvi
	jmp	@b

	;+++++++++++++++++++++++++++++++++++++++++++++++++

     @@:
	;enable  MENU Buttons
	invoke	EnableMenuItem,[hFile],ID_CLOSE,MF_ENABLED
	;disable MENU Buttons
	invoke	EnableMenuItem,[hFile],ID_OPEN,MF_GRAYED
	jmp	.quit

     .close:
	cinvoke sqlite3_close,[hDb]
	;clear listview items
	invoke	SendMessage,[hListView],LVM_DELETEALLITEMS,0,0
	;enable  MENU Buttons
	invoke	EnableMenuItem,[hFile],ID_OPEN,MF_ENABLED
	;disable MENU Buttons
	invoke	EnableMenuItem,[hFile],ID_CLOSE,MF_GRAYED
  .quit:
	xor	eax,eax
  .finish:
	ret
endp



section '.data' data readable writeable

  _class TCHAR 'FASMWIN32',0
  _error TCHAR 'Startup failed.',0
  _size  TCHAR '30',0

  sText      rw 30d
  slView     rw 30d

  sListView  TCHAR 'SysListView32',0
  sEdit      TCHAR 'Edit',0
  sColumn1   TCHAR 'Column1',0
  sColumn2   TCHAR 'Column2',0
  szdatabase TCHAR 'dbteste.db',0
  szSql      TCHAR 'SELECT FIRST_NAME FROM NAMES ORDER BY FIRST_NAME;',0
  lpstrFilter TCHAR 'SQLite3 database file(*.db)',0,'*.db',0,0


  hWnd	      dd 0
  hListView   dd ?
  idListView  dd ?
  hEdit       dd ?
  oldEditProc dd ?
  index       dd ?
  hFont       dd ?
  hDb	      dd ?
  hStmt       dd ?
  hMenubar    dd ?
  hFile       dd ?
  SubItem     RECT LVIR_BOUNDS,1,0,0
  lvRECT      RECT ?
  ibytes      dd ?

  lpstrFile   dw MAX_PATH dup (0)
  szBuffer    dw MAX_PATH dup (0)
  szBuffer2    dw MAX_PATH dup (0)



  wc		WNDCLASS  0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
  lvc1		LV_COLUMN LVCF_TEXT+LVCF_FMT+LVCF_WIDTH,LVCFMT_CENTER,100,sColumn1,16
  lvc2		LV_COLUMN LVCF_TEXT+LVCF_FMT+LVCF_WIDTH,LVCFMT_CENTER,150,sColumn2,16
  lvi		LV_ITEM   LVIF_TEXT,0,NULL,NULL,NULL,sListView,14,NULL,NULL,NULL
  lvs		LV_ITEM   LVIF_TEXT,0,1,NULL,NULL,sListView,14,NULL,NULL,NULL
  lvs_listview	LV_ITEM   LVIF_TEXT,0,1,NULL,NULL,slView,30,NULL,NULL,NULL
  icc		INITCOMMONCONTROLSEX 8,ICC_LISTVIEW_CLASSES


  lpofn 	OPENFILENAME sizeof.OPENFILENAME,0,0,lpstrFilter,0,0,1,lpstrFile,MAX_PATH,0,NULL,NULL,NULL,OFN_EXPLORER+OFN_FILEMUSTEXIST+OFN_PATHMUSTEXIST,0,0,0,0,0,0


  msg	      MSG

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
	  user32,'USER32.DLL',\
	  comctl32,'COMCTL32.DLL',\
	  comdlg32,'COMDLG32.DLL',\
	  sqlite,'sqlite3.dll'

  include 'api\kernel32.inc'
  include 'api\user32.inc'
  include 'api\comctl32.inc'
  include 'api\comdlg32.inc'

  import  sqlite,\
	  sqlite3_open,'sqlite3_open',\
	  sqlite3_prepare,'sqlite3_prepare',\
	  sqlite3_step,'sqlite3_step',\
	  sqlite3_column_text,'sqlite3_column_text',\
	  sqlite3_column_bytes,'sqlite3_column_bytes',\
	  sqlite3_finalize,'sqlite3_finalize',\
	  sqlite3_close,'sqlite3_close'
