#include <windows.h>
#include <assert.h>
#include <commctrl.h>
#include <string.h>
#include "config.h"
#include "pandlg/pandlg.h"

static INT_PTR CALLBACK dlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  BOOL ret;
  CONFIG * config = (CONFIG *)GetProp(hDlg, L"CONFIG") ;
  switch(uMsg)
  {
  case WM_COMMAND:
    if((LOWORD(wParam)==IDOK)||(LOWORD(wParam)==IDCANCEL))
    {
      ret = config->dlgProc(hDlg, uMsg, wParam, lParam) ;
      CONFIG_dialog_end(config) ;
      return ret ;
    }
    break ;

  case WM_DESTROY:
	if (config->dialog)
	{
	  ret = config->dlgProc(hDlg, uMsg, wParam, lParam);
	  CONFIG_dialog_end(config);
	  return ret;
	}
	break;

  case WM_SYSCOMMAND:
    if(wParam==SC_CLOSE)
    {
      ret = config->dlgProc(hDlg, uMsg, wParam, lParam) ;
      CONFIG_dialog_end(config) ;
      return ret ;
    }
    break ;

  default:
    break;
  }

  return config->dlgProc(hDlg, uMsg, wParam, lParam) ;
}

void CONFIG_dialog_show(CONFIG *config, HWND hWnd, HINSTANCE hInst, int page, int left, int top)
{
  HPROPSHEETPAGE hpsp[9];
  PROPSHEETHEADER psh = {0};

  if(!config->dialog)
  {
    /*if(config->iswinamp){
        hpsp[0] = CreateConfigPage5(hInst, config);
        hpsp[1] = CreateConfigPage7(hInst, config);
        hpsp[2] = CreateConfigPage1(hInst, config);
        hpsp[3] = CreateConfigPage2(hInst, config);
        hpsp[4] = CreateConfigPage3(hInst, config);
        hpsp[5] = CreateConfigPage4(hInst, config);
        hpsp[6] = CreateConfigPage6(hInst, config);
        hpsp[7] = CreateConfigPage8(hInst, config);
        hpsp[8] = CreateConfigPageA(hInst, config);
    }
    else*/
    {
        hpsp[0] = CreateConfigPage5(hInst, config);
        hpsp[1] = CreateConfigPage7(hInst, config);
        hpsp[2] = CreateConfigPage2(hInst, config);
        hpsp[3] = CreateConfigPage3(hInst, config);
        hpsp[4] = CreateConfigPage8(hInst, config);
        hpsp[5] = CreateConfigPageA(hInst, config);
    }

    psh.dwSize = sizeof(PROPSHEETHEADER);
    psh.dwFlags = PSH_MODELESS ;
    psh.hwndParent = hWnd;
    psh.hInstance = hInst;
    psh.pszIcon = NULL;
    psh.pszCaption = /*config->iswinamp?L"MSXplug for Winamp"
                                     :*/L"MSXplug for KbMediaPlayer";
    psh.nPages = /*config->iswinamp?9:*/6;
    psh.phpage = hpsp;

    config->dialog = (HWND)PropertySheet(&psh) ;
    SetProp(config->dialog, L"CONFIG", config) ;
    config->dlgProc = (DLGPROC)SetWindowLongPtr(config->dialog,GWLP_WNDPROC,(LPARAM)dlgProc) ;
    if(!config->pandlg) config->pandlg = PANDLG_new(hInst, config);
  }
  //by Kobarin
  //前回のウィンドウ位置と選択中のページを復元
  //画面外のはみ出しチェックは呼び出し側で行う
  PropSheet_SetCurSel(config->dialog,0, page) ;
  SetWindowPos(config->dialog, HWND_TOPMOST, left, top, 0, 0, SWP_NOSIZE);
  //ここまで
}

void CONFIG_dialog_end(CONFIG *config)
{
  if(!config->dialog) return ;
  //追加 by Kobarin
  extern LONG GetTopLeftFromHwnd(HWND hWnd);//左上座標
  config->topleft = GetTopLeftFromHwnd(config->dialog);
  HWND hCur = PropSheet_GetTabControl(config->dialog);
  int page = TabCtrl_GetCurSel(hCur);//選択中のページ
  config->prop_page = page;
  //ここまで
  RemoveProp(config->dialog,L"CONFIG") ;
  SetWindowLongPtr(config->dialog,GWLP_WNDPROC,(LPARAM)config->dlgProc) ;
  DestroyWindow(config->dialog) ;
  config->dialog = NULL ;
}