/* =========================================================================== Doom 3 GPL Source Code Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code"). Doom 3 Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Doom 3 Source Code 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 Doom 3 Source Code. If not, see . In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #include "../../idlib/precompiled.h" #pragma hdrstop #include "../../game/game.h" #include "../../sys/win32/win_local.h" #include "../../sys/win32/rc/common_resource.h" #include "../../sys/win32/rc/PDAEditor_resource.h" #include "../comafx/DialogName.h" #include "DialogPDAEditor.h" #ifdef ID_DEBUG_MEMORY #undef new #undef DEBUG_NEW #define DEBUG_NEW new #endif ///////////////////////////////////////////////////////////////////////////// // CCDialogPDAEditor dialog CDialogPDAEditor *g_PDAEditorDialog = NULL; CDialogPDAEditor::CDialogPDAEditor(CWnd* pParent /*=NULL*/) : CDialog(CDialogPDAEditor::IDD, pParent) { //{{AFX_DATA_INIT(CDialogPDAEditor) //}}AFX_DATA_INIT } void CDialogPDAEditor::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDialogPDAEditor) DDX_Control( pDX, IDC_LIST_PDAS, pdaList ); DDX_Control( pDX, IDC_LIST_EMAIL, emailList ); DDX_Control( pDX, IDC_LIST_AUDIO, audioList ); DDX_Control( pDX, IDC_LIST_VIDEO, videoList ); DDX_Text( pDX, IDC_EDIT_FULLNAME, fullName ); DDX_Text( pDX, IDC_EDIT_SHORTNAME, shortName ); DDX_Text( pDX, IDC_EDIT_POST, post ); DDX_Text( pDX, IDC_EDIT_TITLE, title ); DDX_Text( pDX, IDC_EDIT_SECURITY, security ); DDX_Text( pDX, IDC_EDIT_IDNUM, idnum ); DDX_Control( pDX, IDC_BUTTON_SAVE, saveButton ); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDialogPDAEditor, CDialog) //{{AFX_MSG_MAP(CDialogPDAEditor) ON_LBN_SELCHANGE( IDC_LIST_PDAS, OnSelChangePDA ) ON_BN_CLICKED( IDC_BUTTON_SAVE, OnBtnClickedSave ) ON_BN_CLICKED( IDC_BUTTON_RANDOMID, OnBtnClickedRandom ) ON_BN_CLICKED( IDC_BUTTON_PDA_ADD, OnBtnClickedPDAAdd ) ON_BN_CLICKED( IDC_BUTTON_PDA_DEL, OnBtnClickedPDADel ) ON_BN_CLICKED( IDC_BUTTON_EMAIL_ADD, OnBtnClickedEmailAdd ) ON_BN_CLICKED( IDC_BUTTON_EMAIL_EDIT, OnBtnClickedEmailEdit ) ON_BN_CLICKED( IDC_BUTTON_EMAIL_DELETE, OnBtnClickedEmailDel ) ON_BN_CLICKED( IDC_BUTTON_AUDIO_ADD, OnBtnClickedAudioAdd ) ON_BN_CLICKED( IDC_BUTTON_AUDIO_EDIT, OnBtnClickedAudioEdit ) ON_BN_CLICKED( IDC_BUTTON_AUDIO_DELETE, OnBtnClickedAudioDel ) ON_BN_CLICKED( IDC_BUTTON_VIDEO_ADD, OnBtnClickedVideoAdd ) ON_BN_CLICKED( IDC_BUTTON_VIDEO_EDIT, OnBtnClickedVideoEdit ) ON_BN_CLICKED( IDC_BUTTON_VIDEO_DELETE, OnBtnClickedVideoDel ) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDialogPDAEditor message handlers void PDAEditorInit( const idDict *spawnArgs ) { if ( renderSystem->IsFullScreen() ) { common->Printf( "Cannot run the PDA editor in fullscreen mode.\n" "Set r_fullscreen to 0 and vid_restart.\n" ); return; } if ( g_PDAEditorDialog == NULL ) { InitAfx(); g_PDAEditorDialog = new CDialogPDAEditor(); } if ( g_PDAEditorDialog->GetSafeHwnd() == NULL ) { g_PDAEditorDialog->Create(IDD_DIALOG_PDA_EDITOR); /* // FIXME: restore position CRect rct; g_PDAEditorDialog->SetWindowPos( NULL, rct.left, rct.top, 0,0, SWP_NOSIZE ); */ } idKeyInput::ClearStates(); g_PDAEditorDialog->ShowWindow( SW_SHOW ); g_PDAEditorDialog->SetFocus(); if ( spawnArgs ) { // select PDA based on spawn args const char *name = spawnArgs->GetString( "pda" ); idDeclPDA *decl = static_cast( const_cast( declManager->FindType( DECL_PDA, name ) ) ); // FIXME: select this PDA } } void PDAEditorRun( void ) { #if _MSC_VER >= 1300 MSG *msg = AfxGetCurrentMessage(); // TODO Robert fix me!! #else MSG *msg = &m_msgCur; #endif while( ::PeekMessage(msg, NULL, NULL, NULL, PM_NOREMOVE) ) { // pump message if ( !AfxGetApp()->PumpMessage() ) { } } } void PDAEditorShutdown( void ) { delete g_PDAEditorDialog; g_PDAEditorDialog = NULL; } void CDialogPDAEditor::OnActivate( UINT nState, CWnd *pWndOther, BOOL bMinimized ) { CDialog::OnActivate( nState, pWndOther, bMinimized ); if ( nState != WA_INACTIVE ) { } } void CDialogPDAEditor::OnMove( int x, int y ) { if ( GetSafeHwnd() ) { CRect rct; GetWindowRect( rct ); // FIXME: save position } CDialog::OnMove( x, y ); } void CDialogPDAEditor::OnDestroy() { com_editors &= ~EDITOR_PDA; return CDialog::OnDestroy(); } BOOL CDialogPDAEditor::OnInitDialog() { CDialog::OnInitDialog(); // Indicate the PDA dialog is opened com_editors |= EDITOR_PDA; PopulatePDAList(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } BOOL CDialogPDAEditor::PreTranslateMessage(MSG* pMsg) { return CDialog::PreTranslateMessage(pMsg); } void CDialogPDAEditor::PopulatePDAList() { pdaList.ResetContent(); int i; int num = declManager->GetNumDecls(DECL_PDA); for ( i=0; i < num; i++ ) { const idDeclPDA *pda = dynamic_cast( declManager->DeclByIndex(DECL_PDA, i) ); pdaList.AddString( pda->GetName() ); } } void CDialogPDAEditor::OnSelChangePDA() { int i, num; int index = pdaList.GetCurSel(); if ( index < 0 ) { return; } const idDeclPDA *pda = dynamic_cast( declManager->DeclByIndex(DECL_PDA, index) ); if ( !pda ) { return; } CString windowTitle; windowTitle.Format("PDA Editor - %s", pda->GetName()); idFile *file = fileSystem->OpenFileAppend( pda->GetFileName() ); if ( file ) { fileSystem->CloseFile(file); saveButton.EnableWindow( true ); } else { windowTitle += " [Read Only]"; saveButton.EnableWindow( false ); } SetWindowText( windowTitle ); emailList.ResetContent(); num = pda->GetNumEmails(); for ( i=0; i < num; i++ ) { emailList.AddString( pda->GetEmailByIndex( i )->GetSubject() ); } audioList.ResetContent(); num = pda->GetNumAudios(); for ( i=0; i < num; i++ ) { audioList.AddString( pda->GetAudioByIndex( i )->GetAudioName() ); } videoList.ResetContent(); num = pda->GetNumVideos(); for ( i=0; i < num; i++ ) { videoList.AddString( pda->GetVideoByIndex( i )->GetVideoName() ); } fullName = pda->GetFullName(); shortName = pda->GetPdaName(); post = pda->GetPost(); title = pda->GetTitle(); security = pda->GetSecurity(); idnum = pda->GetID(); UpdateData( FALSE ); } void CDialogPDAEditor::OnBtnClickedSave() { UpdateData(); int index = pdaList.GetCurSel(); if ( index < 0 ) { return; } const idDeclPDA *pdaConst = dynamic_cast( declManager->DeclByIndex(DECL_PDA, index) ); if ( pdaConst ) { idDeclPDA *pda = const_cast(pdaConst); CString declText = "\n"; declText += "pda "; declText += pda->GetName(); declText += " {\n"; declText += "\tname \t\t\"" + shortName + "\"\n"; declText += "\tfullname\t\t\"" + fullName + "\"\n"; declText += "\ticon \t\t\"\"\n"; declText += "\tid \t\t\"" + idnum + "\"\n"; declText += "\tpost \t\t\"" + post + "\"\n"; declText += "\ttitle \t\t\"" + title + "\"\n"; declText += "\tsecurity\t\t\"" + security + "\"\n"; for ( int i = 0; i < pda->GetNumEmails(); i++ ) { declText += "\tpda_email\t\t\""; declText += pda->GetEmailByIndex(i)->GetName(); declText += "\"\n"; } for ( int i = 0; i < pda->GetNumAudios(); i++ ) { declText += "\tpda_audio\t\t\""; declText += pda->GetAudioByIndex(i)->GetName(); declText += "\"\n"; } for ( int i = 0; i < pda->GetNumVideos(); i++ ) { declText += "\tpda_video\t\t\""; declText += pda->GetVideoByIndex(i)->GetName(); declText += "\"\n"; } declText += "}"; pda->SetText( declText ); pda->ReplaceSourceFileText(); pda->Invalidate(); } } void CDialogPDAEditor::OnBtnClickedRandom() { idnum.Format("%d-%02X", 1000+(rand()%8999), (rand()%255)); UpdateData( FALSE ); } class CDialogPDAAdd : public CDialog { public: CDialogPDAAdd() : CDialog(IDD_DIALOG_PDA_ADD) {} CString name; void OnOK() { GetDlgItemText( IDC_EDIT1, name ); CDialog::OnOK(); } }; void CDialogPDAEditor::OnBtnClickedPDAAdd() { CDialogPDAAdd dlg; if ( dlg.DoModal() == IDOK ) { dlg.name.MakeLower(); idDecl *decl = declManager->CreateNewDecl( DECL_PDA, dlg.name, "newpdas/" + dlg.name + ".pda" ); decl->ReplaceSourceFileText(); decl->Invalidate(); PopulatePDAList(); pdaList.SelectString( 0, dlg.name ); OnSelChangePDA(); } } void CDialogPDAEditor::OnBtnClickedPDADel() { } void CDialogPDAEditor::OnBtnClickedEmailAdd() { int index = pdaList.GetCurSel(); if ( index < 0 ) { return; } const idDeclPDA *pda = dynamic_cast( declManager->DeclByIndex(DECL_PDA, index) ); if ( pda ) { CString name; // Search for an unused name int newIndex = pda->GetNumEmails(); do { name.Format("%s_email_%d", pda->GetName(), newIndex++); } while ( declManager->FindType(DECL_EMAIL, name, false) != NULL ); CDialogPDAEditEmail addDlg; addDlg.SetName(name); if ( addDlg.DoModal() == IDOK ) { idDeclEmail *email = static_cast(declManager->CreateNewDecl(DECL_EMAIL, name, pda->GetFileName())); email->SetText( addDlg.GetDeclText() ); email->ReplaceSourceFileText(); email->Invalidate(); pda->AddEmail( name ); // Get it again to reparse const idDeclEmail *emailConst = static_cast( declManager->FindType( DECL_EMAIL, name) ); emailList.AddString( emailConst->GetSubject() ); // Save the pda to include this email in the list // This has a side-effect of saving any other changes, but I don't really care right now OnBtnClickedSave(); } } } void CDialogPDAEditor::OnBtnClickedEmailEdit() { int index = pdaList.GetCurSel(); if ( index < 0 ) { return; } const idDeclPDA *pda = dynamic_cast( declManager->DeclByIndex(DECL_PDA, index) ); if ( pda ) { index = emailList.GetCurSel(); if ( index < 0 ) { return; } CDialogPDAEditEmail editDlg; editDlg.SetEmail( pda->GetEmailByIndex( index ) ); if ( editDlg.DoModal() == IDOK ) { idDeclEmail *email = const_cast( pda->GetEmailByIndex( index ) ); email->SetText( editDlg.GetDeclText() ); email->ReplaceSourceFileText(); email->Invalidate(); // Get it again to reparse email = const_cast( pda->GetEmailByIndex( index ) ); emailList.DeleteString( index ); emailList.InsertString( index, email->GetSubject() ); } } } void CDialogPDAEditor::OnBtnClickedEmailDel() { } void CDialogPDAEditor::OnBtnClickedAudioAdd() { } void CDialogPDAEditor::OnBtnClickedAudioEdit() { } void CDialogPDAEditor::OnBtnClickedAudioDel() { } void CDialogPDAEditor::OnBtnClickedVideoAdd() { } void CDialogPDAEditor::OnBtnClickedVideoEdit() { } void CDialogPDAEditor::OnBtnClickedVideoDel() { } CDialogPDAEditEmail::CDialogPDAEditEmail(CWnd* pParent /*=NULL*/) : CDialog(CDialogPDAEditEmail::IDD, pParent) { //{{AFX_DATA_INIT(CDialogPDAEditEmail) //}}AFX_DATA_INIT } void CDialogPDAEditEmail::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDialogPDAEditEmail) DDX_Text( pDX, IDC_EDIT_TO, to ); DDX_Text( pDX, IDC_EDIT_FROM, from ); DDX_Text( pDX, IDC_EDIT_DATE, date ); DDX_Text( pDX, IDC_EDIT_SUBJECT, subject ); DDX_Text( pDX, IDC_EDIT_BODY, body ); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDialogPDAEditEmail, CDialog) //{{AFX_MSG_MAP(CDialogPDAEditEmail) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDialogPDAEditor message handlers BOOL CDialogPDAEditEmail::OnInitDialog() { CDialog::OnInitDialog(); SetWindowText( "Editing Email: " + name ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDialogPDAEditEmail::SetName( CString &_name ) { name = _name; } void CDialogPDAEditEmail::SetEmail( const idDeclEmail *email ) { to = email->GetTo(); from = email->GetFrom(); date = email->GetDate(); subject = email->GetSubject(); body = email->GetBody(); body.Replace("\n", "\r\n"); name = email->GetName(); if ( IsWindow( m_hWnd ) ) { UpdateData(FALSE); } } CString CDialogPDAEditEmail::GetDeclText() { CString mungedBody = body; mungedBody.Replace("\r\n\r\n", "\\n\\n\"\n\n\""); mungedBody.Replace("\r\n", "\\n\"\n\""); CString declText; declText += "\n"; declText += "email " + name + " {\n"; declText += "\tto \t\t\"" + to + "\"\n"; declText += "\tfrom \t\t\"" + from + "\"\n"; declText += "\tdate \t\t\"" + date + "\"\n"; declText += "\tsubject\t\t\"" + subject + "\"\n"; declText += "\ttext {\n"; declText += "\"" + mungedBody + "\"\n"; declText += "\t}\n"; declText += "}"; return declText; }