/*
 * Drag List control
 *
 * Copyright 1999 Eric Kohl
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * NOTES
 *   This is just a dummy control. An author is needed! Any volunteers?
 *   I will only improve this control once in a while.
 *     Eric <ekohl@abo.rhein-zeitung.de>
 *
 * TODO:
 *   - Everything.
 */

#include "commctrl.h"
#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(commctrl);


static DWORD dwLastScrollTime = 0;

/***********************************************************************
 *		MakeDragList (COMCTL32.13)
 */
BOOL WINAPI MakeDragList (HWND hwndLB)
{
    FIXME("(%p)\n", hwndLB);


    return FALSE;
}

/***********************************************************************
 *		DrawInsert (COMCTL32.15)
 */
VOID WINAPI DrawInsert (HWND hwndParent, HWND hwndLB, INT nItem)
{
    FIXME("(%p %p %d)\n", hwndParent, hwndLB, nItem);


}

/***********************************************************************
 *		LBItemFromPt (COMCTL32.14)
 */
INT WINAPI LBItemFromPt (HWND hwndLB, POINT pt, BOOL bAutoScroll)
{
    RECT rcClient;
    INT nIndex;
    DWORD dwScrollTime;

    FIXME("(%p %ld x %ld %s)\n",
	   hwndLB, pt.x, pt.y, bAutoScroll ? "TRUE" : "FALSE");

    ScreenToClient (hwndLB, &pt);
    GetClientRect (hwndLB, &rcClient);
    nIndex = (INT)SendMessageA (hwndLB, LB_GETTOPINDEX, 0, 0);

    if (PtInRect (&rcClient, pt))
    {
	/* point is inside -- get the item index */
	while (TRUE)
	{
	    if (SendMessageA (hwndLB, LB_GETITEMRECT, nIndex, (LPARAM)&rcClient) == LB_ERR)
		return -1;

	    if (PtInRect (&rcClient, pt))
		return nIndex;

	    nIndex++;
	}
    }
    else
    {
	/* point is outside */
	if (!bAutoScroll)
	    return -1;

	if ((pt.x > rcClient.right) || (pt.x < rcClient.left))
	    return -1;

	if (pt.y < 0)
	    nIndex--;
	else
	    nIndex++;

	dwScrollTime = GetTickCount ();

	if ((dwScrollTime - dwLastScrollTime) < 200)
	    return -1;

	dwLastScrollTime = dwScrollTime;

	SendMessageA (hwndLB, LB_SETTOPINDEX, (WPARAM)nIndex, 0);
    }

    return -1;
}


#if 0
static LRESULT CALLBACK
DRAGLIST_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

    return FALSE;
}
#endif



