// MainCategory.cpp :
// メインウインドウの左側のカテゴリボックス

#include "stdafx.h"
#include "RNSF7.h"
#include "MainWindow.h"
#include "MainCategory.h"
#include "MainNavigator.h"
#include "MainListview.h"

static WNDPROC OrgCategoryTreeViewProc;
HTREEITEM htSearch, htRoot;

// リストビュー内で押されたEnterキーをぶんどる
LRESULT CALLBACK NewCategoryTreeViewProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam)
{
	switch (mes) {
		case WM_KEYDOWN:
			switch( wParam ) {
				case VK_TAB:
				case VK_RETURN:
					SetFocus( hMainListView );
			}
			break;

		case WM_LBUTTONUP:
			SendMessage( GetParent(hWnd), mes, wParam, lParam );
			break;

		case WM_MOUSEMOVE:
			{
				HWND hParent = GetParent(hWnd);
				POINT po;
				po.x = LOWORD(lParam);  // horizontal position of cursor 
				po.y = HIWORD(lParam);  // vertical position of cursor 

				ClientToScreen(hWnd, &po);
				rebarMove( hParent, (int)wParam, &po );
				MoveMouseOnNavigator( hParent, -1, -1 );
			}
			break;
	}

	return (CallWindowProc(OrgCategoryTreeViewProc, hWnd, mes, wParam, lParam));
}

// ツリービューに項目を追加(nLevelは1か2のみ指定可能らしい)
// (まず最初に hwndTV = NULL にして呼び出すこと)
HTREEITEM AddItemToTree(HWND hwndTV, LPSTR lpszItem, int nLevel, int iImageOpen, int iImageClose, int id)
{
	TVITEM tvi;
	TVINSERTSTRUCT tvins;
	static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST;
	static HTREEITEM hPrevRootItem = NULL;
	static HTREEITEM hPrevLev2Item = NULL;

	if ( hwndTV == NULL ) { // tvins.hInsertAfterに入れるためのデータを初期化
		hPrevRootItem = hPrevLev2Item = NULL;
        return hPrev = (HTREEITEM)TVI_FIRST;
	}

	tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

	// テキストを設定
	tvi.pszText = lpszItem;
	tvi.cchTextMax = lstrlen(lpszItem);

	// 選択時・非選択時のアイコン番号を設定
	tvi.iImage = iImageClose;
	tvi.iSelectedImage = iImageOpen;

	// 任意のデータを設定
	tvi.lParam = (LPARAM)id;

	tvins.item = tvi;
	tvins.hInsertAfter = hPrev;

	// 親フォルダとなるデータを設定（ただし、レベル２までしか対応していないようだ）
	if ( nLevel == 1 )
		tvins.hParent = TVI_ROOT;
	else if ( nLevel == 2 )
		tvins.hParent = hPrevRootItem;
	else
		tvins.hParent = hPrevLev2Item;

	// アイテムを追加(SendMessage)
	hPrev = (HTREEITEM)SendMessage(hwndTV, TVM_INSERTITEM, 0, (LPARAM)&tvins);

	// 次回追加時のためにハンドルを保存
	if ( nLevel == 1 )
		hPrevRootItem = hPrev;
	else if ( nLevel == 2 )
		hPrevLev2Item = hPrev;

	return hPrev;
}

// カテゴリ表示用リストビューコントロールの生成
HWND createCategoryTreeView(HWND hWnd)
{
	HWND		hCategoryTreeView;
	int			n, i;

	hCategoryTreeView = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "TreeView",
				          WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | TVS_HASLINES | TVS_SHOWSELALWAYS/* | TVS_LINESATROOT | TVS_HASBUTTONS */,
						  0, 0, 0, 0, hWnd, (HMENU)IDC_CATEGORYTREEVIEW, hInst, NULL);

	if( !hCategoryTreeView ) {
		return NULL;
	}

	// 小さいアイコンをツリービューのイメージに追加する
	TreeView_SetImageList(hCategoryTreeView, himlTreeSmall, TVSIL_NORMAL);

	if ( categorys ) {
		TreeView_DeleteAllItems( hCategoryTreeView );

		// 関数を初期化(staticな変数を初期化するため)
		AddItemToTree(NULL, 0, 0, 0, 0, 0);

		// nを最終番号にセット
		for(n=0 ; categorys[n] ; n++)
			;

		// メモリ確保
		ListView_SetItemCount(hCategoryTreeView, n+2);

		// ルート要素を追加
		htRoot = AddItemToTree( hCategoryTreeView, "すべてのカテゴリ", 1, 1, 1, -1 );

		// 各カテゴリを追加
		for(i=0 ; i<n ; i++) {
			AddItemToTree( hCategoryTreeView, categorys[i], 2, 3, 0, i );
		}

		// 最終項目は検索結果表示用
		htSearch = AddItemToTree( hCategoryTreeView, "検索結果:スクリプト検索(Ctrl+F)の結果を表示します", 1, 2, 2, -2 );

		// ルート要素にカーソルを与え、ルート要素を展開する
		TreeView_SelectItem( hCategoryTreeView, htRoot );
		TreeView_Expand( hCategoryTreeView, htRoot, TVE_EXPAND );

	}

	OrgCategoryTreeViewProc = (WNDPROC)GetWindowLongPtr(hCategoryTreeView, GWLP_WNDPROC);
	SetWindowLongPtr(hCategoryTreeView, GWLP_WNDPROC, (LONG_PTR)NewCategoryTreeViewProc); // Enter,TABキーを受け取るためのフック

	return hCategoryTreeView;
}
