// 7 february 2014
package main

import (
	"syscall"
	"unsafe"
)

// TODO filter out commctrl.h stuff because the combobox and listbox stuff has values that differ between windows versions and bleh
// either that or switch to ComboBoxEx and ListView because they might not have that problem???

var (
	user32 = syscall.NewLazyDLL("user32.dll")
	kernel32 = syscall.NewLazyDLL("kernel32.dll")
	gdi32 = syscall.NewLazyDLL("gdi32.dll")
)

type HANDLE uintptr
type HWND HANDLE
type HBRUSH HANDLE
type HMENU HANDLE

const (
	NULL = 0
	FALSE = 0			// from windef.h
	TRUE = 1			// from windef.h
)

type ATOM uint16

// TODO pull the thanks for these three from the old wingo source
// TODO put these in windows.go
type WPARAM uintptr
type LPARAM uintptr
type LRESULT uintptr

func (w WPARAM) LOWORD() uint16 {
	// according to windef.h
	return uint16(w & 0xFFFF)
}

func (w WPARAM) HIWORD() uint16 {
	// according to windef.h
	return uint16((w >> 16) & 0xFFFF)
}

func LPARAMFromString(str string) LPARAM {
	return LPARAM(unsafe.Pointer(syscall.StringToUTF16Ptr(str)))
}

// microsoft's header files do this
func MAKEINTRESOURCE(what uint16) uintptr {
	return uintptr(what)
}

// TODO adorn error messages with which step failed?
func getText(hwnd HWND) (text string, err error) {
	var tc []uint16

	length, err := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0)
	if err != nil {
		return "", err
	}
	tc = make([]uint16, length + 1)
	_, err = SendMessage(hwnd,
		WM_GETTEXT,
		WPARAM(length + 1),
		LPARAM(unsafe.Pointer(&tc[0])))
	if err != nil {
		return "", err
	}
	return syscall.UTF16ToString(tc), nil
}