#require <Classes/ActiveBasic/Windows/UI/ButtonBase.ab>

Namespace ActiveBasic
Namespace Windows
Namespace UI

Enum CheckState
	Unchecked = BST_UNCHECKED
	Checked = BST_CHECKED
	Indeterminate = BST_INDETERMINATE
End Enum

/*!
@date 2008/07/13
@brief	チェックボックスを表すクラス。
@author Egtra
*/
Class CheckBox
	Inherits ButtonBase
Protected
	Override Sub GetCreateStruct(ByRef cs As CREATESTRUCT)
		Super.GetCreateStruct(cs)
		cs.style Or= BS_AUTOCHECKBOX
	End Sub
Public
	/*!
	@brief チェックされているかどうかの取得。
	@retval true チェックされているもしくは第3状態
	@retval false チェックされていない
	*/
	Const Function Checked() As Boolean
		Checked = SendMessage(BM_GETCHECK) > 0
	End Function

	/*!
	@brief チェックされているかどうかの設定。
	@param[in] check チェックを入れるならtrue, 外すならfalse。
	*/
	Sub Checked(check As Boolean)
		SendMessage(BM_SETCHECK, check As WPARAM, 0)
	End Sub

	/*!
	@brief チェック状態の取得
	*/
	Const Function State() As CheckState
		Dim ret = SendMessage(BM_GETCHECK)
/*
		If ret = BST_UNCHECKED Or ret = BST_CHECKED Or ret = BST_INDETERMINATE Then
			State = ret As CheckState
*/
		If ret = BST_CHECKED Then
			State = CheckState.Checked
		ElseIf ret = BST_INDETERMINATE Then
			State = CheckState.Indeterminate
		Else
			State = CheckState.Unchecked
		End If
	End Function

	/*!
	@brief チェック状態の設定
	*/
	Sub State(state As CheckState)
		SendMessage(BM_SETCHECK, state As WPARAM, 0)
	End Sub

	/*!
	@brief クリック時に自動で状態変化するかどうかの取得。
	@retval true 自動変化する
	@retval false 自動変化しない
	*/
	Function AutoCheck() As Boolean
		AutoCheck = autoCheck(Style)
	End Function

	/*!
	@brief クリック時に自動で状態変化するどうかの設定。
	@param[in] check 自動で変化させるならTrue、そうでないならFalse。
	*/
	Sub AutoCheck(autoCheck As Boolean)
		If autoCheck Then
			Style = Style Or BS_AUTOCHECKBOX
		Else
			Style = (Style And (Not BS_AUTOCHECKBOX)) Or BS_CHECKBOX
		End If
	End Sub

	/*!
	@brief 3状態目を使用するどうかの設定。
	@param[in] useThreeState 3状態目を使用するならTrue、そうでないならFalse。
	*/
	Sub ThreeState(useThreeState As Boolean)
		Dim oldStyle = This.Style
		Dim style = oldStyle And (Not 7)
		Dim buttonType = oldStyle And 7
		If useThreeState = threeState(buttonType) Then
			Exit Sub
		End If
		If useThreeState Then
			If buttonType = BS_AUTOCHECKBOX Then
				style Or= BS_AUTO3STATE
			Else
				style Or= BS_3STATE
			End If
		Else
			If buttonType = BS_AUTO3STATE Then
				style Or= BS_AUTOCHECKBOX
			Else
				style Or= BS_CHECKBOX
			End If
		End If
		Style = style
	End Sub

	/*!
	@brief 3状態目を使用しているかどうかの取得。
	*/
	Function ThreeState() As Boolean
		ThreeState = threeState(Style)
	End Function
Private
	Static Function threeState(style As DWord) As Boolean
		style And= 7
		Return style = BS_3STATE Or style = BS_AUTO3STATE
	End Function

	Static Function autoCheck(style As DWord) As Boolean
		style And= 7
		Return (style = BS_AUTOCHECKBOX Or style = BS_AUTO3STATE)
	End Function
End Class

End Namespace 'UI
End Namespace 'Widnows
End Namespace 'ActiveBasic
