]> icculus.org git repositories - taylor/freespace2.git/blob - src/fred2/cmdbrief.cpp
Initial revision
[taylor/freespace2.git] / src / fred2 / cmdbrief.cpp
1 /*
2  * $Logfile: /Freespace2/code/FRED2/CmdBrief.cpp $
3  * $Revision$
4  * $Date$
5  * $Author$
6  *
7  * Command Briefing Editor
8  *
9  * $Log$
10  * Revision 1.1  2002/05/03 03:28:08  root
11  * Initial revision
12  *
13  * 
14  * 2     10/07/98 6:28p Dave
15  * Initial checkin. Renamed all relevant stuff to be Fred2 instead of
16  * Fred. Globalized mission and campaign file extensions. Removed Silent
17  * Threat specific code.
18  * 
19  * 1     10/07/98 3:01p Dave
20  * 
21  * 1     10/07/98 3:00p Dave
22  * 
23  * 8     4/30/98 8:23p John
24  * Fixed some bugs with Fred caused by my new cfile code.
25  * 
26  * 7     4/22/98 9:56a Sandeep
27  * 
28  * 6     4/20/98 4:40p Hoffoss
29  * Added a button to 4 editors to play the chosen wave file.
30  * 
31  * 5     4/03/98 12:39p Hoffoss
32  * Changed starting directory for browse buttons in several editors.
33  * 
34  * 4     3/19/98 4:24p Hoffoss
35  * Added remaining support for command brief screen (ANI and WAVE file
36  * playing).
37  * 
38  * 3     3/06/98 2:36p Hoffoss
39  * Placed correct text size limits on edit boxes.
40  * 
41  * 2     3/05/98 3:59p Hoffoss
42  * Added a bunch of new command brief stuff, and asteroid initialization
43  * to Fred.
44  *
45  * $NoKeywords: $
46  */
47
48 #include "stdafx.h"
49 #include <mmsystem.h>
50 #include "fred.h"
51 #include "cmdbrief.h"
52 #include "cfile.h"
53
54 #ifdef _DEBUG
55 #define new DEBUG_NEW
56 #undef THIS_FILE
57 static char THIS_FILE[] = __FILE__;
58 #endif
59
60 /////////////////////////////////////////////////////////////////////////////
61 // cmd_brief_dlg dialog
62
63 cmd_brief_dlg::cmd_brief_dlg(CWnd* pParent /*=NULL*/)
64         : CDialog(cmd_brief_dlg::IDD, pParent)
65 {
66         //{{AFX_DATA_INIT(cmd_brief_dlg)
67         m_ani_filename = _T("");
68         m_text = _T("");
69         m_stage_title = _T("");
70         m_wave_filename = _T("");
71         //}}AFX_DATA_INIT
72 }
73
74 void cmd_brief_dlg::DoDataExchange(CDataExchange* pDX)
75 {
76         CDialog::DoDataExchange(pDX);
77         //{{AFX_DATA_MAP(cmd_brief_dlg)
78         DDX_Text(pDX, IDC_ANI_FILENAME, m_ani_filename);
79         DDX_Text(pDX, IDC_TEXT, m_text);
80         DDX_Text(pDX, IDC_STAGE_TITLE, m_stage_title);
81         DDX_Text(pDX, IDC_WAVE_FILENAME, m_wave_filename);
82         //}}AFX_DATA_MAP
83
84         DDV_MaxChars(pDX, m_text, CMD_BRIEF_TEXT_MAX - 1);
85         DDV_MaxChars(pDX, m_ani_filename, MAX_FILENAME_LEN - 1);
86         DDV_MaxChars(pDX, m_wave_filename, MAX_FILENAME_LEN - 1);
87 }
88
89 BEGIN_MESSAGE_MAP(cmd_brief_dlg, CDialog)
90         //{{AFX_MSG_MAP(cmd_brief_dlg)
91         ON_BN_CLICKED(IDC_NEXT, OnNext)
92         ON_BN_CLICKED(IDC_PREV, OnPrev)
93         ON_BN_CLICKED(IDC_ADD_STAGE, OnAddStage)
94         ON_BN_CLICKED(IDC_INSERT_STAGE, OnInsertStage)
95         ON_BN_CLICKED(IDC_DELETE_STAGE, OnDeleteStage)
96         ON_BN_CLICKED(IDC_BROWSE_ANI, OnBrowseAni)
97         ON_BN_CLICKED(IDC_BROWSE_WAVE, OnBrowseWave)
98         ON_BN_CLICKED(IDC_PLAY, OnPlay)
99         //}}AFX_MSG_MAP
100 END_MESSAGE_MAP()
101
102 /////////////////////////////////////////////////////////////////////////////
103 // cmd_brief_dlg message handlers
104
105 BOOL cmd_brief_dlg::OnInitDialog() 
106 {
107         Cur_cmd_brief = Cmd_briefs;  // default to first cmd briefing
108         m_cur_stage = 0;
109         last_cmd_brief = NULL;
110
111         CDialog::OnInitDialog();
112         m_play_bm.LoadBitmap(IDB_PLAY);
113         ((CButton *) GetDlgItem(IDC_PLAY)) -> SetBitmap(m_play_bm);
114
115         update_data();
116         return TRUE;
117 }
118
119 void cmd_brief_dlg::update_data(int update)
120 {
121         int enable;
122
123         if (update)
124                 UpdateData(TRUE);
125
126         // save previously editing data before we load over it.
127         if (last_cmd_brief && m_last_stage >= 0 && m_last_stage < last_cmd_brief->num_stages) {
128                 char buf[CMD_BRIEF_TEXT_MAX];
129
130                 if (last_cmd_brief->stage[m_last_stage].text)
131                         free(last_cmd_brief->stage[m_last_stage].text);
132
133                 deconvert_multiline_string(buf, m_text, CMD_BRIEF_TEXT_MAX);
134                 last_cmd_brief->stage[m_last_stage].text = strdup(buf);
135                 string_copy(last_cmd_brief->stage[m_last_stage].ani_filename, m_ani_filename, MAX_FILENAME_LEN);
136                 string_copy(last_cmd_brief->stage[m_last_stage].wave_filename, m_wave_filename, MAX_FILENAME_LEN);
137         }
138
139         // load data of new stage into dialog
140         if (Cur_cmd_brief && Cur_cmd_brief->num_stages > 0) {
141                 if (m_cur_stage < 0 || m_cur_stage >= Cur_cmd_brief->num_stages)
142                         m_cur_stage = 0;
143
144                 m_stage_title.Format("Stage %d of %d", m_cur_stage + 1, Cur_cmd_brief->num_stages);
145                 m_text = convert_multiline_string(Cur_cmd_brief->stage[m_cur_stage].text);
146                 m_ani_filename = Cur_cmd_brief->stage[m_cur_stage].ani_filename;
147                 m_wave_filename = Cur_cmd_brief->stage[m_cur_stage].wave_filename;
148                 enable = TRUE;
149
150         } else {
151                 m_stage_title = _T("No stages");
152                 m_text = _T("");
153                 m_ani_filename = _T("");
154                 m_wave_filename = _T("");
155                 enable = FALSE;
156                 m_cur_stage = -1;
157         }
158
159         if (m_cur_stage < Cur_cmd_brief->num_stages - 1)
160                 GetDlgItem(IDC_NEXT) -> EnableWindow(enable);
161         else
162                 GetDlgItem(IDC_NEXT) -> EnableWindow(FALSE);
163
164         if (m_cur_stage)
165                 GetDlgItem(IDC_PREV) -> EnableWindow(enable);
166         else
167                 GetDlgItem(IDC_PREV) -> EnableWindow(FALSE);
168
169         if (Cur_cmd_brief->num_stages >= CMD_BRIEF_STAGES_MAX)
170                 GetDlgItem(IDC_ADD_STAGE) -> EnableWindow(FALSE);
171         else
172                 GetDlgItem(IDC_ADD_STAGE) -> EnableWindow(TRUE);
173
174         if (Cur_cmd_brief->num_stages) {
175                 GetDlgItem(IDC_DELETE_STAGE) -> EnableWindow(enable);
176                 GetDlgItem(IDC_INSERT_STAGE) -> EnableWindow(enable);
177
178         } else {
179                 GetDlgItem(IDC_DELETE_STAGE) -> EnableWindow(FALSE);
180                 GetDlgItem(IDC_INSERT_STAGE) -> EnableWindow(FALSE);
181         }
182
183         GetDlgItem(IDC_WAVE_FILENAME) -> EnableWindow(enable);
184         GetDlgItem(IDC_ANI_FILENAME) -> EnableWindow(enable);
185         GetDlgItem(IDC_BROWSE_ANI) -> EnableWindow(enable);
186         GetDlgItem(IDC_BROWSE_WAVE) -> EnableWindow(enable);
187         GetDlgItem(IDC_TEXT) -> EnableWindow(enable);
188
189         UpdateData(FALSE);
190
191         last_cmd_brief = Cur_cmd_brief;
192         m_last_stage = m_cur_stage;
193 }
194
195 void cmd_brief_dlg::OnOK()
196 {
197         update_data();
198         CDialog::OnOK();
199 }
200
201 void cmd_brief_dlg::OnNext() 
202 {
203         m_cur_stage++;
204         update_data();
205 }
206
207 void cmd_brief_dlg::OnPrev() 
208 {
209         m_cur_stage--;
210         update_data();
211 }
212
213 void cmd_brief_dlg::OnAddStage() 
214 {
215         int i;
216
217         if (Cur_cmd_brief->num_stages >= CMD_BRIEF_STAGES_MAX)
218                 return;
219
220         m_cur_stage = i = Cur_cmd_brief->num_stages++;
221         copy_stage(i - 1, i);
222         update_data(1);
223 }
224
225 void cmd_brief_dlg::OnInsertStage() 
226 {
227         int i, z;
228
229         if (Cur_cmd_brief->num_stages >= CMD_BRIEF_STAGES_MAX)
230                 return;
231
232         if (!Cur_cmd_brief->num_stages) {
233                 OnAddStage();
234                 return;
235         }
236
237         z = m_cur_stage;
238         m_cur_stage = -1;
239         update_data(1);
240         for (i=Cur_cmd_brief->num_stages; i>z; i--)
241                 Cur_cmd_brief->stage[i] = Cur_cmd_brief->stage[i - 1];
242
243         Cur_cmd_brief->num_stages++;
244         copy_stage(z, z + 1);
245         m_cur_stage = z;
246         update_data(0);
247 }
248
249 void cmd_brief_dlg::OnDeleteStage() 
250 {
251         int i, z;
252
253         if (m_cur_stage < 0)
254                 return;
255         
256         Assert(Cur_cmd_brief->num_stages);
257         z = m_cur_stage;
258         m_cur_stage = -1;
259         update_data(1);
260         if (Cur_cmd_brief->stage[z].text)
261                 free(Cur_cmd_brief->stage[z].text);
262
263         for (i=z+1; i<Cur_cmd_brief->num_stages; i++)
264                 Cur_cmd_brief->stage[i-1] = Cur_cmd_brief->stage[i];
265
266         Cur_cmd_brief->num_stages--;
267         m_cur_stage = z;
268         if (m_cur_stage >= Cur_cmd_brief->num_stages)
269                 m_cur_stage = Cur_cmd_brief->num_stages - 1;
270
271         update_data(0);
272 }
273
274 void cmd_brief_dlg::copy_stage(int from, int to)
275 {
276         if ((from < 0) || (from >= Cur_cmd_brief->num_stages)) {
277                 Cur_cmd_brief->stage[to].text = strdup("<Text here>");
278                 strcpy(Cur_cmd_brief->stage[to].ani_filename, "<default>");
279                 strcpy(Cur_cmd_brief->stage[to].wave_filename, "none");
280                 return;
281         }
282
283         Cur_cmd_brief->stage[to] = Cur_cmd_brief->stage[from];
284         Cur_cmd_brief->stage[to].text = strdup(Cur_cmd_brief->stage[from].text);
285 }
286
287 void cmd_brief_dlg::OnBrowseAni() 
288 {
289         int z;
290         CString name;   
291
292         UpdateData(TRUE);
293         z = cfile_push_chdir(CF_TYPE_INTERFACE);
294         CFileDialog dlg(TRUE, "ani", NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR,
295                 "Ani Files (*.ani)|*.ani|Avi Files (*.avi)|*.avi|Both (*.ani, *.avi)|*.ani;*.avi||");
296
297         if (dlg.DoModal() == IDOK) {
298                 m_ani_filename = dlg.GetFileName();
299                 UpdateData(FALSE);
300         }
301
302         if (!z)
303                 cfile_pop_dir();
304 }
305
306 void cmd_brief_dlg::OnBrowseWave() 
307 {
308         int z;
309         CString name;
310
311         UpdateData(TRUE);
312         z = cfile_push_chdir(CF_TYPE_VOICE_CMD_BRIEF);
313         CFileDialog dlg(TRUE, "wav", NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR,
314                 "Wave Files (*.wav)|*.wav||");
315
316         if (dlg.DoModal() == IDOK) {
317                 m_wave_filename = dlg.GetFileName();
318                 UpdateData(FALSE);
319         }
320
321         if (!z)
322                 cfile_pop_dir();
323 }
324
325 BOOL cmd_brief_dlg::DestroyWindow() 
326 {
327         m_play_bm.DeleteObject();
328         return CDialog::DestroyWindow();
329 }
330
331 void cmd_brief_dlg::OnPlay() 
332 {
333         char path[MAX_PATH_LEN + 1];
334         GetDlgItem(IDC_WAVE_FILENAME)->GetWindowText(m_wave_filename);
335
336         int size, offset;
337         cf_find_file_location((char *) (LPCSTR) m_wave_filename, CF_TYPE_ANY, path, &size, &offset );
338
339         PlaySound(path, NULL, SND_ASYNC | SND_FILENAME);
340 }