/* Anakrino - .NET Reflection Browser
 * Copyright (C) 2001-2002  Jay Freeman (saurik)
*/

/*
 *        Redistribution and use in source and binary
 * forms, with or without modification, are permitted
 * provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the
 *    above copyright notice, this list of conditions
 *    and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the
 *    above copyright notice, this list of conditions
 *    and the following disclaimer in the documentation
 *    and/or other materials provided with the
 *    distribution.
 * 3. The name of the author may not be used to endorse
 *    or promote products derived from this software
 *    without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef ANAKRINO_TREEBROWSER_H
#define ANAKRINO_TREEBROWSER_H

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include "IconOffsets.h"

#include "anakrino/IBinder.h"
#include "anakrino/IBrowser.h"

namespace Anakrino {

enum NodeState {
	Irrelevant,
	Shrunk,
	Stretched
};

enum NodeMode {
	NamespaceMode = 1,
	ReferencesMode
};

struct Node {
	NodeState state;
	const Metallurgy::Token *token;
	int mode;
	int trade;

	Node(const Metallurgy::Token *token, int mode = 0, int trade = -1) :
		state(Irrelevant),
		token(token),
		mode(mode),
		trade(trade)
	{}
};

class TreeBrowser :
	public CWindowImpl<TreeBrowser, CTreeViewCtrlEx>,
	public IBrowser
{
  protected:
	IBinder *binder;
	//CBrush backing;

  public:
	BEGIN_MSG_MAP(TreeBrowser)
		MSG_WM_CONTEXTMENU(OnContextMenu)
		//MSG_WM_CTLCOLORSTATIC(OnCtlColorStatic)
		REFLECTED_NOTIFY_CODE_HANDLER(NM_RCLICK, OnRClick)
		REFLECTED_NOTIFY_CODE_HANDLER(TVN_GETDISPINFO, OnGetDispInfo)
		REFLECTED_NOTIFY_CODE_HANDLER(TVN_ITEMEXPANDING, OnItemExpanding)
		REFLECTED_NOTIFY_CODE_HANDLER(TVN_ITEMEXPANDED, OnItemExpanded)
		REFLECTED_NOTIFY_CODE_HANDLER(TVN_SELCHANGED, OnSelChanged)
	END_MSG_MAP()

	static int CALLBACK TokenCompare(LPARAM lhs, LPARAM rhs, LPARAM param) {
		Node *lnode = (Node *) lhs;
		Node *rnode = (Node *) rhs;
		if (lnode == NULL || rnode == NULL)
			return (lnode == NULL) ? -1 : 1;
		IBinder *binder = (IBinder *) param;
		return binder->CompareToken(lnode->token, rnode->token);
	}

	void TokenSort(HTREEITEM item) {
		TVSORTCB sort;
		sort.hParent = item;
		sort.lpfnCompare = TokenCompare;
		sort.lParam = (LPARAM) binder;
		SortChildrenCB(&sort);
	}

	void Insert(CTreeItem tParent, const Metallurgy::Field *mField);
	void Insert(CTreeItem tParent, const Metallurgy::Method *mMethod);
	void Insert(CTreeItem tParent, const Metallurgy::Module *mModule);

	void OnContextMenu(HWND /*hWnd*/, CPoint ptMousePos);

	/*HBRUSH OnCtlColorStatic(HDC wParam, HWND lParam) {
		backing.CreateSolidBrush(RGB(255,255,255));
		return backing;
	}*/

	LRESULT OnRClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/);
	LRESULT OnGetDispInfo(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/);
	LRESULT OnItemExpanding(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/);
	LRESULT OnItemExpanded(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/);
	LRESULT OnSelChanged(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/);
};

}

#endif//ANAKRINO_TREEBROWSER_H