/* 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. */

// TextureComboBox.cpp : implementation file
//

#include "stdafx.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTextureComboBox

CTextureComboBox::CTextureComboBox()
{
  m_ptdSelectedTexture = NULL;
}

CTextureComboBox::~CTextureComboBox()
{
}

BEGIN_MESSAGE_MAP(CTextureComboBox, CComboBox)
	//{{AFX_MSG_MAP(CTextureComboBox)
	ON_CONTROL_REFLECT(CBN_SELCHANGE, OnSelchange)
	ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropdown)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTextureComboBox message handlers

BOOL CTextureComboBox::OnIdle(LONG lCount)
{
  CModelerView *pModelerView = CModelerView::GetActiveMappingNormalView();

  // if document doesn't exist
  if( pModelerView == NULL)
  {
    // document closed but we had texture on last idle 
    if( m_ptdSelectedTexture != NULL)
    {
      ResetContent();
      AddString( L"None available");
      SetCurSel( 0);
      m_ptdSelectedTexture = NULL;
    }
    return TRUE;
  }

  CModelerDoc *pDoc = (CModelerDoc *) pModelerView->GetDocument();
  INDEX ctTextures = pDoc->m_emEditModel.edm_WorkingSkins.Count();
  // if count of textures changed or model has different texture, reflect change
  if( (GetCount() != ctTextures) || (pModelerView->m_ptdiTextureDataInfo->tdi_TextureData != m_ptdSelectedTexture) )
  {
    if( ctTextures == 0)
    {
      ResetContent();
      AddString( L"None available");
      SetCurSel( 0);
      m_ptdSelectedTexture = NULL;
      return TRUE;
    }
    // remove combo entries, add working textures and select current one
    m_ptdSelectedTexture = pModelerView->m_ptdiTextureDataInfo->tdi_TextureData;
    ResetContent();
    INDEX iTexture=0;
    FOREACHINLIST( CTextureDataInfo, tdi_ListNode, pDoc->m_emEditModel.edm_WorkingSkins, it)
    {
      int iAddedAs = AddString( CString(it->tdi_FileName.FileName()));
      SetItemDataPtr( iAddedAs, &it.Current());
      if( pModelerView->m_ptdiTextureDataInfo == &it.Current())
      {
        SetCurSel( iTexture);
      }
      iTexture++;
    }
  }
  return TRUE;
}

void CTextureComboBox::OnSelchange()
{
  CModelerView *pModelerView = CModelerView::GetActiveView();

  if(pModelerView != NULL)
  {
    // get curently selected combo member
    int iSelectedTexture = GetCurSel();
    // if there is valid member selected
    if( iSelectedTexture != CB_ERR)
    {
      // set new texture ptr for active view
      pModelerView->m_ptdiTextureDataInfo = (CTextureDataInfo *) GetItemDataPtr( iSelectedTexture);
      pModelerView->Invalidate( FALSE);
    }
  }
}

void CTextureComboBox::OnDropdown() 
{
  INDEX ctItems = GetCount();
  if( ctItems == CB_ERR) return;
  
  CRect rectCombo;
  GetWindowRect( &rectCombo);
  
  PIX pixScreenHeight = ::GetSystemMetrics(SM_CYSCREEN);
  PIX pixMaxHeight = pixScreenHeight - rectCombo.top;

  CWnd *pwndParent = GetParent();
  if( pwndParent == NULL) return;
  pwndParent->ScreenToClient( &rectCombo);
  PIX pixNewHeight = GetItemHeight(0)*(ctItems+2);
  rectCombo.bottom = rectCombo.top + ClampUp( pixNewHeight, pixMaxHeight);
  MoveWindow( rectCombo);
}