/* Copyright (c) 2002-2012 Croteam Ltd. 
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation


This program 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 General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */

#include "stdafx.h"
#include "SeriousSkaStudio.h"
#include "MainFrm.h"
#include "resource.h"

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

#define LOAD_BAR_STATE( WName, HName, bar, dx, dy)                                      \
	bar.m_Size.cx = (AfxGetApp()->GetProfileInt(_T("General"),_T(WName),dx));             \
	bar.m_Size.cy = (AfxGetApp()->GetProfileInt(_T("General"),_T(HName),dy));             \
  bar.CalcDynamicLayout(0, LM_HORZDOCK)

#define SAVE_BAR_STATE( WName, HName, bar)                                              \
  AfxGetApp()->WriteProfileInt( _T("General"),_T(WName), bar.m_Size.cx);                \
	AfxGetApp()->WriteProfileInt( _T("General"),_T(HName), bar.m_Size.cy)

#define STD_TREEVIEW_WIDTH 230
#define STD_TREEVIEW_HEIGHT 550

IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_ACTIVATEAPP()
	ON_COMMAND(ID_VIEW_TREEVIEW, OnViewTreeview)
	ON_UPDATE_COMMAND_UI(ID_VIEW_TREEVIEW, OnUpdateViewTreeview)
	ON_WM_CLOSE()
	ON_WM_SIZE()
	ON_COMMAND(ID_VIEW_TOOLBAR, OnViewToolbar)
	ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateViewToolbar)
	ON_COMMAND(ID_FILE_CREATE_TEXTURE, OnFileCreateTexture)
	ON_BN_CLICKED(IDC_BT_CLOSE, OnBtClose)
	ON_BN_CLICKED(IDC_BT_CLEAR, OnBtClear)
	ON_COMMAND(ID_VIEW_ERRORLIST, OnViewErrorlist)
	ON_UPDATE_COMMAND_UI(ID_VIEW_ERRORLIST, OnUpdateViewErrorlist)
	//}}AFX_MSG_MAP
	// Global help commands
	ON_COMMAND(ID_HELP_FINDER, CMDIFrameWnd::OnHelpFinder)
	ON_COMMAND(ID_HELP, CMDIFrameWnd::OnHelp)
	ON_COMMAND(ID_CONTEXT_HELP, CMDIFrameWnd::OnContextHelp)
	ON_COMMAND(ID_DEFAULT_HELP, CMDIFrameWnd::OnHelpFinder)
END_MESSAGE_MAP()

static UINT indicators[] =
{
  ID_STATUS_BAR_TEXT,
	ID_SEPARATOR,
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

#define STD_DRAGBAR_WIDTH  230
#define STD_DRAGBAR_HEIGHT 230

CMainFrame::CMainFrame()
{
}
CMainFrame::~CMainFrame()
{
}

BOOL _bApplicationActive = TRUE;
void CMainFrame::OnActivateApp(BOOL bActive, DWORD hTask) 
{
  _bApplicationActive = bActive;
	CMDIFrameWnd::OnActivateApp(bActive, hTask);
}

// create main frame
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  // set same styles for use with all toolbars
  CRect rectDummy(0,0,0,0);
  DWORD dwToolBarStyles = TBSTYLE_FLAT | WS_CHILD | WS_VISIBLE | CBRS_SIZE_DYNAMIC | 
                          CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_GRIPPER;

  if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
  // subclass mdiclient
  if (!m_wndMDIClient.SubclassWindow(m_hWndMDIClient)) {
      TRACE ("Failed to subclass MDI client window\n");
      return (-1);
  }                                                       
  // create toolbar IDR_MAINFRAME
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_MAINFRAME) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}
  // create toolbar IDR_NAVIGATION
  if( (!m_wndNavigationToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy,IDW_TOOLBAR_NAVIGATION)) ||
		  (!m_wndNavigationToolBar.LoadToolBar(IDR_NAVIGATION)) )
	{
		TRACE0("Failed to create FX toolbar\n");
		return -1;      // fail to create fx tool bar
	}
  // create toolbar IDR_MANAGE
  if (!m_wndToolBarManage.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy,IDW_TOOLBAR_MANAGE) ||
	!m_wndToolBarManage.LoadToolBar(IDR_MANAGE))
  {
	  TRACE0("Failed to create toolbar\n");
	  return -1;      // fail to create
  }
  // create status bar
  if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

  EnableDocking(CBRS_ALIGN_ANY);
  // enable docking for toolbars
  m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP);
  m_wndNavigationToolBar.EnableDocking(CBRS_ALIGN_TOP);
	m_wndToolBarManage.EnableDocking(CBRS_ALIGN_TOP);
  // dock toolbars
	DockControlBar(&m_wndToolBar);
	DockControlBar(&m_wndNavigationToolBar);
	DockControlBar(&m_wndToolBarManage);


  // Set model instance stretch edit ctrl
  m_wndNavigationToolBar.SetButtonInfo(STRETCH_BUTTON_INDEX, ID_MI_STRETCH, TBBS_SEPARATOR, 40);
  CRect rcEditStretch;
	m_wndNavigationToolBar.GetItemRect(STRETCH_BUTTON_INDEX, &rcEditStretch);
  rcEditStretch.top = 2;
  rcEditStretch.right -= 2;
  rcEditStretch.bottom = rcEditStretch.top + 18;
  if (!m_ctrlMIStretch.Create( WS_VISIBLE|WS_BORDER,
    rcEditStretch, &m_wndNavigationToolBar, ID_MI_STRETCH) )
	{
		TRACE0("Failed to create model instance stretch edit control\n");
		return FALSE;
	}

  m_ctrlMIStretch.SetWindowText(L"1");

  // Initialize dialog bar m_dlgBarTreeView
	if (!theApp.m_dlgBarTreeView.Create(this, IDD_TREEBAR,
		CBRS_LEFT | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE | CBRS_SIZE_DYNAMIC,
		ID_VIEW_TREEVIEW))
	{
		TRACE0("Failed to create dialog bar m_dlgBarTreeView\n");
		return -1;		// fail to create
	}

  if(!theApp.m_dlgErrorList.Create(this,IDD_ERROR_LIST,
		CBRS_BOTTOM/* | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE | CBRS_SIZE_DYNAMIC*/,
    ID_VIEW_ERRORLIST)) {
		TRACE0("Failed to create dialog bar m_dlgErrorList\n");
		return -1;		// fail to create
	}
  theApp.GetErrorList()->InsertColumn(0,L"Error");
  theApp.GetErrorList()->SetImageList( &theApp.m_dlgBarTreeView.m_IconsImageList, LVSIL_SMALL);
  // theApp.m_dlgErrorList.m_Size = theApp.m_dlgErrorList.m_sizeDefault;  
  // theApp.m_dlgErrorList.SetSplitterControlID(IDC_SPLITER_LOG_FRAME);


  theApp.m_dlgBarTreeView.SetWindowText(L"Tree view");
  theApp.m_dlgErrorList.SetWindowText(L"Log");

  theApp.m_dlgBarTreeView.EnableDockingSides(CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT);
  // theApp.m_dlgErrorList.EnableDockingSides(CBRS_ALIGN_BOTTOM);
  //theApp.m_dlgErrorList.dlg_ulEnabledDockingSides = CBRS_ALIGN_BOTTOM;

  theApp.m_dlgBarTreeView.DockCtrlBar();
  // theApp.m_dlgErrorList.DockCtrlBar();
  // DockControlBar(&theApp.m_dlgErrorList);

  // set size of panels in status bar
  m_wndStatusBar.SetPaneInfo(0,ID_STATUS_BAR_TEXT,SBPS_NORMAL,600);
  m_wndStatusBar.SetPaneInfo(1,ID_SEPARATOR,SBPS_STRETCH,100);

  // try to load dialog width and height from reg.
  LOAD_BAR_STATE("TreeView width", "TreeView height", theApp.m_dlgBarTreeView,
    STD_TREEVIEW_WIDTH, STD_TREEVIEW_HEIGHT);
  // try to load toolbars positions
  LoadBarState(_T("General"));

  theApp.bAppInitialized = TRUE;
  return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CMDIFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CMDIFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CMDIFrameWnd::Dump(dc);
}

#endif //_DEBUG

// Show/hide treeview
void CMainFrame::OnViewTreeview() 
{
	// OnBarCheck();

  if(theApp.m_dlgBarTreeView.IsWindowVisible() )
  {
    ShowControlBar(&theApp.m_dlgBarTreeView, FALSE, FALSE);
    theApp.m_dlgBarTreeView.SetFocus();
  }
  else
  {
    ShowControlBar(&theApp.m_dlgBarTreeView, TRUE, FALSE);
    theApp.m_dlgBarTreeView.m_TreeCtrl.SetFocus();
  }
}
// Update treeview check
void CMainFrame::OnUpdateViewTreeview(CCmdUI* pCmdUI) 
{
  pCmdUI->SetCheck(theApp.m_dlgBarTreeView.IsWindowVisible());
}

// Show/hide error dlg
void CMainFrame::OnViewErrorlist() 
{
  theApp.ShowErrorDlg(!theApp.IsErrorDlgVisible());
}
// Update error dlg
void CMainFrame::OnUpdateViewErrorlist(CCmdUI* pCmdUI) 
{
  pCmdUI->SetCheck(theApp.IsErrorDlgVisible());
}

// close main frame
void CMainFrame::OnClose() 
{
  // try to save all documents before closing them
  POSITION pos = theApp.m_pdtDocTemplate->GetFirstDocPosition();
  while (pos!=NULL)
  {
    CSeriousSkaStudioDoc *pmdCurrent = (CSeriousSkaStudioDoc *)theApp.m_pdtDocTemplate->GetNextDoc(pos);
    if(!pmdCurrent->BeforeDocumentClose()) {
       return;
    }
  }

  // save toolbars positions
  SaveBarState(_T("General"));
  // savedialog width and height in reg
  SAVE_BAR_STATE("TreeView width", "TreeView height", theApp.m_dlgBarTreeView);
	CMDIFrameWnd::OnClose();
}
// resize main frame
void CMainFrame::OnSize(UINT nType, int cx, int cy) 
{
	CMDIFrameWnd::OnSize(nType, cx, cy);
  m_wndStatusBar.SetPaneInfo(0,ID_STATUS_BAR_TEXT,SBPS_NORMAL,cx/1.5);  
}

// show/hide toolbars
void CMainFrame::OnViewToolbar() 
{
	BOOL bVisible = ((m_wndToolBar.GetStyle() & WS_VISIBLE) != 0);
  bVisible &= ((m_wndNavigationToolBar.GetStyle() & WS_VISIBLE) != 0);
  bVisible &= ((m_wndToolBarManage.GetStyle() & WS_VISIBLE) != 0);

  ShowControlBar(&m_wndToolBar, !bVisible, FALSE);
  ShowControlBar(&m_wndNavigationToolBar, !bVisible, FALSE);
  ShowControlBar(&m_wndToolBarManage, !bVisible, FALSE);
}
// update toolbars check
void CMainFrame::OnUpdateViewToolbar(CCmdUI* pCmdUI) 
{
	BOOL bVisible = ((m_wndToolBar.GetStyle() & WS_VISIBLE) != 0);
  bVisible &= ((m_wndNavigationToolBar.GetStyle() & WS_VISIBLE) != 0);
  bVisible &= ((m_wndToolBarManage.GetStyle() & WS_VISIBLE) != 0);
	pCmdUI->SetCheck(bVisible);
}

CTString CMainFrame::CreateTexture()
{
  // call create texture dialog
  CTFileName fnCreated = _EngineGUI.CreateTexture();
  return fnCreated;
}

void CMainFrame::OnFileCreateTexture() 
{
  CreateTexture();
}

void CMainFrame::OnBtClose() 
{
  theApp.ShowErrorDlg(FALSE);
}

void CMainFrame::OnBtClear() 
{
  theApp.GetErrorList()->DeleteAllItems();
  OnBtClose();
}