// PopupWindow.cpp : implementation file
//

#include "main.h"
#include "vst.h"
#include "PopupWindow.h"
#include "EditorThread.h"
#include "VstHost.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CVstApp *theApp;

/////////////////////////////////////////////////////////////////////////////
// CPopupWindow

IMPLEMENT_DYNCREATE(CPopupWindow, CFrameWnd)

CPopupWindow::CPopupWindow():
    plug(NULL)
{}

CPopupWindow::~CPopupWindow()
{
	plug->OnEditorClose();
}


BEGIN_MESSAGE_MAP(CPopupWindow, CFrameWnd)
	//{{AFX_MSG_MAP(CPopupWindow)
	ON_WM_ENTERIDLE()
	ON_WM_TIMER()
	ON_WM_MOVE()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPopupWindow message handlers

void CPopupWindow::OnEnterIdle(UINT nWhy, CWnd* pWho) 
{
	CFrameWnd::OnEnterIdle(nWhy, pWho);
	
	// TODO: Add your message handler code here
	if(plug) plug->EditorIdle();		
}

void CPopupWindow::SetPlugin(VSTPlugin *p)
{
    plug = p;

    char tmp[256];
    sprintf(tmp,"vst~ - %s",plug->GetName());

	CreateEx( WS_EX_DLGMODALFRAME,AfxRegisterWndClass(CS_DBLCLKS),tmp,WS_CAPTION|WS_THICKFRAME|WS_POPUP|WS_SYSMENU,0,0,0,0,NULL,NULL,NULL);
    
	plug->Dispatch(effEditOpen , 0 , 0 , m_hWnd , 0.0f  );
/*
	CString str = theApp->GetProfileString( "VSTPos" , plug->GetName() , "10,10");
	int idx = str.Find(",");
	CString x = str.Left( idx );
	CString y = str.Right( idx );
	printf(" index is %d left is %s and right is %s" , idx , x , y);	
*/

	DoInit();

	RECT r = plug->GetEditorRect();
	SetWindowPos(&wndTop,plug->getX(),plug->getY(),(r.right - r.left) + 10 , r.bottom - r.top + 30 , SWP_SHOWWINDOW);
//	ShowWindow( SW_SHOW );		
//	BringWindowToTop();
//	SetFocus();
}


//DEL BOOL CPopupWindow::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
//DEL {
//DEL 	// TODO: Add your specialized code here and/or call the base class
//DEL 	
//DEL 	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
//DEL }

void CPopupWindow::DoInit()
{
//	printf("DoInit\n");
	plug->Dispatch(effEditTop,0,0, 0,0.0f);			
//	printf("Dispatched to the top\n");
	SetTimer(0,25,NULL);
}

void CPopupWindow::OnTimer(UINT nIDEvent) 
{
	plug->Dispatch(effEditIdle, 0, 0, NULL, 0.0f);
	CFrameWnd::OnTimer(nIDEvent);
}

void CPopupWindow::OnMove(int x, int y) 
{
	CFrameWnd::OnMove(x, y);
	if(plug) plug->setPos(x,y);
/*
	{
		char buf[100];
		sprintf( buf , "%d,%d" , x , y );
		theApp->WriteProfileString( "VSTPos" , plug->GetName() , buf );
	}
*/
}


//DEL void CPopupWindow::OnFinalRelease() 
//DEL {
//DEL 	//
//DEL 	CFrameWnd::OnFinalRelease();
//DEL }

void CPopupWindow::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	plug->StopEditing();
	CFrameWnd::OnClose();
}