/* 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); }