//---------------------------------------------------------------------------

#pragma hdrstop

#include "ComboBoxComponent.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)

#include "DropListScrollBar.cpp"
#include "DropListView.cpp"
#include "CapButton.cpp"

static inline void ValidCtrCheck(TComboBoxComponent *)
{
	new TComboBoxComponent(NULL);
}

namespace Comboboxcomponent
{
	void __fastcall PACKAGE Register()
	{
		TComponentClass classes[1] = {__classid(TComboBoxComponent)};
		RegisterComponents(L"Samples", classes, 0);
	}
}

#define MIN(x, y)           ((x)<(y)?(x):(y))


__fastcall TComboBoxComponent::TComboBoxComponent(TComponent *Owner)
	: CBCapButton(Owner)
{
    m_ClickStat = 0;

	m_IsMouseOver = false;

    ItemHeight = 20;
    ShowItemCount = 5;

    FShowMode = TComboBoxMode(cbShowDown);

    // 初始化下拉列表框
	m_DropListView = new TDropListView(this);
	m_DropListView->Parent = (TWinControl *)Owner;
	m_DropListView->SetDesignVisible(false);
	m_DropListView->Visible = false;

	m_DropListView->OnHide = DoDropListHide;
	m_DropListView->OnShow = DoDropListShow;

	OnMouseEnter = DoMouseEnter;
	OnMouseLeave = DoMouseLeave;
}

__fastcall TComboBoxComponent::~TComboBoxComponent()
{
}

void __fastcall TComboBoxComponent::SetParent(TWinControl* AParent)
{
	m_DropListView->Parent = AParent;
	CBCapButton::Parent = AParent;
}

void __fastcall TComboBoxComponent::SetFontSize( int value )
{
	m_DropListView->SetFontSize(value);
	CBCapButton::SetFontSize(value);
}

void __fastcall TComboBoxComponent::SetFont( String name, int size )
{
	CBCapButton::SetFont(name, size);
	m_DropListView->SetFont(name, size);
}

TComboBoxItem * __fastcall TComboBoxComponent::AddItem(String Caption)
{
	TComboBoxItem * pNewItem = new TComboBoxItem(Caption, DoItemClick);
	m_DropListView->AddItem(pNewItem);

	return pNewItem;
}

TComboBoxItem * __fastcall TComboBoxComponent::GetItem(int Index)
{
	return m_DropListView->GetItem( Index );
}

void __fastcall TComboBoxComponent::Clear()
{
	if(m_DropListView->ItemsCount != 0)
    {
    	m_DropListView->Clear();
    }
}

void __fastcall TComboBoxComponent::DoDropListShow(TObject *Sender)
{
    Down = true;
    m_ClickStat = 1;
}

void __fastcall TComboBoxComponent::DoDropListHide(TObject *Sender)
{
	Down = false;

	if(!m_IsMouseOver)
    {
    	m_ClickStat = 2;
    }
    else
    {
    	m_ClickStat = 3;
    }
}

void __fastcall TComboBoxComponent::DoItemClick(TComboBoxItem* Sender, int Index)
{
    Caption = Sender->Caption;
    if(FOnChange) FOnChange(Sender, Index);
}

void __fastcall TComboBoxComponent::DoMouseEnter(TObject *Sender)
{
    m_IsMouseOver = true;
}

void __fastcall TComboBoxComponent::DoMouseLeave(TObject *Sender)
{
    m_IsMouseOver = false;
}
/*
void __fastcall TComboBoxComponent::CMMouseEnter(TMessage &Message)
{
    m_IsMouseOver = true;
    //TGraphicControl::Dispatch(&Message);
    CBCapButton::DefaultHandler(&Message);
}

void __fastcall TComboBoxComponent::CMMouseLeave(TMessage &Message)
{
    m_IsMouseOver = false;
    //TGraphicControl::Dispatch(&Message);
}
*/
void __fastcall TComboBoxComponent::MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y)
{
    TGraphicControl::MouseDown(Button, Shift, X, Y);

    if(Button != 0) return;

    if(m_ClickStat == 3) return;

    m_DropListView->ItemHeight = FItemHeight;
    m_DropListView->Width = Width;

    TPoint var_Client(0, Height);
    TPoint var_Screen = ClientToScreen(var_Client);

    m_DropListView->Left = var_Screen.X;

    m_DropListView->ShowItemsCount = FShowItemCount;

    if(ShowMode == TComboBoxMode(cbShowUp))
    {
        // 上方显示
        m_DropListView->Top = var_Screen.Y - Height - m_DropListView->ListHeight;
    }
    else
    {
        // 下方显示
        m_DropListView->Top = var_Screen.Y;
    }

    m_DropListView->Show();
}

void __fastcall TComboBoxComponent::MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y)
{
    TGraphicControl::MouseUp(Button, Shift, X, Y);

    if(Button != 0) return;

    if(m_ClickStat == 3) m_ClickStat = 0;
}

int __fastcall TComboBoxComponent::GetDefaultItem()
{
	return m_DropListView->DefItemIndex;
}

int __fastcall TComboBoxComponent::GetItemsCount()
{
    return m_DropListView->ItemsCount;
}

void __fastcall TComboBoxComponent::RemoveItem(int Index)
{
	int var_Count = m_DropListView->ItemsCount;
	if(Index < var_Count && Index >= 0)
    {
        m_DropListView->RemoveItem(Index);
    }
}

void __fastcall TComboBoxComponent::SetDefaultItem(int Value)
{
    int var_Count = m_DropListView->ItemsCount;

    if(Value >= var_Count || Value < 0)
    {
        Value = -1;
        Caption = "";
    }
    else if(var_Count > 0)
    {
        TComboBoxItem *var_Item = m_DropListView->GetItem(Value);
        if(var_Item != NULL)
        {
            Caption = var_Item->Caption;
        }
    }

    m_DropListView->DefItemIndex = Value;
}

void __fastcall TComboBoxComponent::SetItemHeight(int Value)
{
    FItemHeight = Value;
}

void __fastcall TComboBoxComponent::SetShowMode(TComboBoxMode Value)
{
    FShowMode = Value;
}

void __fastcall TComboBoxComponent::SetShowItemCount(int Value)
{
    FShowItemCount = Value;
}
