// 25 february 2014
package ui

import (
	"fmt"
//	"syscall"
	"unsafe"
)

// pretty much every constant here except _WM_USER is from commctrl.h
// TODO for all: filter out constants not available in Windows 2000

// InitCommonControlsEx constants.
const (
	_ICC_LISTVIEW_CLASSES = 0x00000001
	_ICC_TREEVIEW_CLASSES = 0x00000002
	_ICC_BAR_CLASSES = 0x00000004
	_ICC_TAB_CLASSES = 0x00000008
	_ICC_UPDOWN_CLASS = 0x00000010
	_ICC_PROGRESS_CLASS = 0x00000020
	_ICC_HOTKEY_CLASS = 0x00000040
	_ICC_ANIMATE_CLASS = 0x00000080
	_ICC_WIN95_CLASSES = 0x000000FF
	_ICC_DATE_CLASSES = 0x00000100
	_ICC_USEREX_CLASSES = 0x00000200
	_ICC_COOL_CLASSES = 0x00000400
	_ICC_INTERNET_CLASSES = 0x00000800
	_ICC_PAGESCROLLER_CLASS = 0x00001000
	_ICC_NATIVEFNTCTL_CLASS = 0x00002000
	_ICC_STANDARD_CLASSES = 0x00004000
	_ICC_LINK_CLASS = 0x00008000
)

var (
	_initCommonControlsEx = comctl32.NewProc("InitCommonControlsEx")
)

func initCommonControls() (err error) {
	var icc struct {
		dwSize	uint32
		dwICC	uint32
	}

	icc.dwSize = uint32(unsafe.Sizeof(icc))
	icc.dwICC = _ICC_PROGRESS_CLASS
	r1, _, err := _initCommonControlsEx.Call(uintptr(unsafe.Pointer(&icc)))
	if r1 == _FALSE {		// failure
		// TODO does it set GetLastError()?
		return fmt.Errorf("error initializing Common Controls (comctl32.dll): %v", err)
	}
	return nil
}

// Common Controls class names.
const (
	_PROGRESS_CLASS = "msctls_progress32"
)

// Shared Common Controls styles.
const (
	_WM_USER = 0x0400
	_CCM_FIRST = 0x2000
	_CCM_SETBKCOLOR = (_CCM_FIRST + 1)
)

// Progress Bar styles.
const (
	_PBS_SMOOTH = 0x01
	_PBS_VERTICAL = 0x04
)

// Progress Bar messages.
const (
	_PBM_SETRANGE = (_WM_USER + 1)
	_PBM_SETPOS = (_WM_USER + 2)
	_PBM_DELTAPOS = (_WM_USER + 3)
	_PBM_SETSTEP = (_WM_USER + 4)
	_PBM_STEPIT = (_WM_USER + 5)
	_PBM_SETRANGE32 = (_WM_USER + 6)
	_PBM_GETRANGE = (_WM_USER + 7)
	_PBM_GETPOS = (_WM_USER + 8)
	_PBM_SETBARCOLOR = (_WM_USER + 9)
	_PBM_SETBKCOLOR = _CCM_SETBKCOLOR
)