Serious-Engine/Sources/WorldEditor/CtrlBrowseFile.cpp
2016-03-11 18:20:51 -06:00

203 lines
6.1 KiB
C++

/* 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. */
// CtrlBrowseFile.cpp : implementation file
//
#include "stdafx.h"
#include "CtrlBrowseFile.h"
#ifdef _DEBUG
#undef new
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCtrlBrowseFile
CCtrlBrowseFile::CCtrlBrowseFile()
{
}
CCtrlBrowseFile::~CCtrlBrowseFile()
{
}
void CCtrlBrowseFile::SetDialogPtr( CPropertyComboBar *pDialog)
{
m_pDialog = pDialog;
}
BEGIN_MESSAGE_MAP(CCtrlBrowseFile, CButton)
//{{AFX_MSG_MAP(CCtrlBrowseFile)
ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCtrlBrowseFile message handlers
CTFileName CCtrlBrowseFile::GetIntersectingFile()
{
// obtain curently active document
CWorldEditorDoc *pDoc = theApp.GetDocument();
ASSERT( pDoc != NULL);
// obtain curently selected property ID
CPropertyID *ppidProperty = m_pDialog->GetSelectedProperty();
if( ppidProperty == NULL ||
!((ppidProperty->pid_eptType == CEntityProperty::EPT_FILENAME) ||
(ppidProperty->pid_eptType == CEntityProperty::EPT_FILENAMENODEP)) ) return CTString("");
// lock selection's dynamic container
pDoc->m_selEntitySelection.Lock();
// file name to contain selection intersecting file
CTFileName fnIntersectingFile;
CTFileNameNoDep fnIntersectingFileNoDep;
// for each of the selected entities
FOREACHINDYNAMICCONTAINER(pDoc->m_selEntitySelection, CEntity, iten)
{
// obtain property ptr
CEntityProperty *pepProperty = iten->PropertyForName( ppidProperty->pid_strName);
// if this is first entity in dynamic container
if( pDoc->m_selEntitySelection.Pointer(0) == iten)
{
if( m_bFileNameNoDep)
{
fnIntersectingFileNoDep = ENTITYPROPERTY( &*iten, pepProperty->ep_slOffset, CTFileNameNoDep);
}
else
{
fnIntersectingFile = ENTITYPROPERTY( &*iten, pepProperty->ep_slOffset, CTFileName);
}
}
else
{
if( m_bFileNameNoDep)
{
CTFileNameNoDep fnCurrentFileNoDep = ENTITYPROPERTY( &*iten, pepProperty->ep_slOffset, CTFileNameNoDep);
if( fnCurrentFileNoDep != fnIntersectingFileNoDep)
{
fnIntersectingFileNoDep = CTString("");
break;
}
}
else
{
CTFileName fnCurrentFile = ENTITYPROPERTY( &*iten, pepProperty->ep_slOffset, CTFileName);
if( fnCurrentFile != fnIntersectingFile)
{
fnIntersectingFile = CTString("");
break;
}
}
}
}
// unlock selection's dynamic container
pDoc->m_selEntitySelection.Unlock();
if( m_bFileNameNoDep)
{
return fnIntersectingFileNoDep;
}
else
{
return fnIntersectingFile;
}
}
void CCtrlBrowseFile::OnClicked()
{
// don't do anything if document doesn't exist
if( theApp.GetDocument() == NULL) return;
// obtain curently active document
CWorldEditorDoc *pDoc = theApp.GetDocument();
// obtain curently selected property ID
CPropertyID *ppidProperty = m_pDialog->GetSelectedProperty();
if( ppidProperty == NULL) return;
// file name to contain selection intersecting file
CTFileName fnIntersectingFile = GetIntersectingFile();
// call file requester
CTFileName fnChoosedFile;
if( fnIntersectingFile.FileExt() == ".mdl")
{
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
FILTER_MDL FILTER_ALL FILTER_END,
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
}
else if( fnIntersectingFile.FileExt() == ".tex")
{
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
FILTER_TEX FILTER_ALL FILTER_END,
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
}
else if( fnIntersectingFile.FileExt() == ".wav")
{
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
FILTER_WAV FILTER_ALL FILTER_END,
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
}
else if( fnIntersectingFile.FileExt() == ".smc")
{
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
FILTER_SMC FILTER_ALL FILTER_END,
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
}
else
{
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
FILTER_ALL FILTER_MDL FILTER_TEX FILTER_WAV FILTER_END,
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
}
if( fnChoosedFile == "") return;
// for each of the selected entities
FOREACHINDYNAMICCONTAINER(pDoc->m_selEntitySelection, CEntity, iten)
{
// obtain property ptr
CEntityProperty *penpProperty = iten->PropertyForName( ppidProperty->pid_strName);
// discard old entity settings
iten->End();
// set new file name value
if( m_bFileNameNoDep)
{
ENTITYPROPERTY( &*iten, penpProperty->ep_slOffset, CTFileNameNoDep) =
(CTFileNameNoDep) fnChoosedFile;
}
else
{
ENTITYPROPERTY( &*iten, penpProperty->ep_slOffset, CTFileName) = fnChoosedFile;
}
// apply new entity settings
iten->Initialize();
}
// mark that document is changed
pDoc->SetModifiedFlag( TRUE);
pDoc->UpdateAllViews( NULL);
pDoc->m_chSelections.MarkChanged();
// reload data to dialog
m_pDialog->UpdateData( FALSE);
}