2 * $Logfile: /Freespace2/code/FRED2/CmdBrief.cpp $
7 * Command Briefing Editor
10 * Revision 1.1 2002/05/03 03:28:08 root
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.
19 * 1 10/07/98 3:01p Dave
21 * 1 10/07/98 3:00p Dave
23 * 8 4/30/98 8:23p John
24 * Fixed some bugs with Fred caused by my new cfile code.
26 * 7 4/22/98 9:56a Sandeep
28 * 6 4/20/98 4:40p Hoffoss
29 * Added a button to 4 editors to play the chosen wave file.
31 * 5 4/03/98 12:39p Hoffoss
32 * Changed starting directory for browse buttons in several editors.
34 * 4 3/19/98 4:24p Hoffoss
35 * Added remaining support for command brief screen (ANI and WAVE file
38 * 3 3/06/98 2:36p Hoffoss
39 * Placed correct text size limits on edit boxes.
41 * 2 3/05/98 3:59p Hoffoss
42 * Added a bunch of new command brief stuff, and asteroid initialization
57 static char THIS_FILE[] = __FILE__;
60 /////////////////////////////////////////////////////////////////////////////
61 // cmd_brief_dlg dialog
63 cmd_brief_dlg::cmd_brief_dlg(CWnd* pParent /*=NULL*/)
64 : CDialog(cmd_brief_dlg::IDD, pParent)
66 //{{AFX_DATA_INIT(cmd_brief_dlg)
67 m_ani_filename = _T("");
69 m_stage_title = _T("");
70 m_wave_filename = _T("");
74 void cmd_brief_dlg::DoDataExchange(CDataExchange* pDX)
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);
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);
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)
102 /////////////////////////////////////////////////////////////////////////////
103 // cmd_brief_dlg message handlers
105 BOOL cmd_brief_dlg::OnInitDialog()
107 Cur_cmd_brief = Cmd_briefs; // default to first cmd briefing
109 last_cmd_brief = NULL;
111 CDialog::OnInitDialog();
112 m_play_bm.LoadBitmap(IDB_PLAY);
113 ((CButton *) GetDlgItem(IDC_PLAY)) -> SetBitmap(m_play_bm);
119 void cmd_brief_dlg::update_data(int update)
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];
130 if (last_cmd_brief->stage[m_last_stage].text)
131 free(last_cmd_brief->stage[m_last_stage].text);
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);
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)
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;
151 m_stage_title = _T("No stages");
153 m_ani_filename = _T("");
154 m_wave_filename = _T("");
159 if (m_cur_stage < Cur_cmd_brief->num_stages - 1)
160 GetDlgItem(IDC_NEXT) -> EnableWindow(enable);
162 GetDlgItem(IDC_NEXT) -> EnableWindow(FALSE);
165 GetDlgItem(IDC_PREV) -> EnableWindow(enable);
167 GetDlgItem(IDC_PREV) -> EnableWindow(FALSE);
169 if (Cur_cmd_brief->num_stages >= CMD_BRIEF_STAGES_MAX)
170 GetDlgItem(IDC_ADD_STAGE) -> EnableWindow(FALSE);
172 GetDlgItem(IDC_ADD_STAGE) -> EnableWindow(TRUE);
174 if (Cur_cmd_brief->num_stages) {
175 GetDlgItem(IDC_DELETE_STAGE) -> EnableWindow(enable);
176 GetDlgItem(IDC_INSERT_STAGE) -> EnableWindow(enable);
179 GetDlgItem(IDC_DELETE_STAGE) -> EnableWindow(FALSE);
180 GetDlgItem(IDC_INSERT_STAGE) -> EnableWindow(FALSE);
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);
191 last_cmd_brief = Cur_cmd_brief;
192 m_last_stage = m_cur_stage;
195 void cmd_brief_dlg::OnOK()
201 void cmd_brief_dlg::OnNext()
207 void cmd_brief_dlg::OnPrev()
213 void cmd_brief_dlg::OnAddStage()
217 if (Cur_cmd_brief->num_stages >= CMD_BRIEF_STAGES_MAX)
220 m_cur_stage = i = Cur_cmd_brief->num_stages++;
221 copy_stage(i - 1, i);
225 void cmd_brief_dlg::OnInsertStage()
229 if (Cur_cmd_brief->num_stages >= CMD_BRIEF_STAGES_MAX)
232 if (!Cur_cmd_brief->num_stages) {
240 for (i=Cur_cmd_brief->num_stages; i>z; i--)
241 Cur_cmd_brief->stage[i] = Cur_cmd_brief->stage[i - 1];
243 Cur_cmd_brief->num_stages++;
244 copy_stage(z, z + 1);
249 void cmd_brief_dlg::OnDeleteStage()
256 Assert(Cur_cmd_brief->num_stages);
260 if (Cur_cmd_brief->stage[z].text)
261 free(Cur_cmd_brief->stage[z].text);
263 for (i=z+1; i<Cur_cmd_brief->num_stages; i++)
264 Cur_cmd_brief->stage[i-1] = Cur_cmd_brief->stage[i];
266 Cur_cmd_brief->num_stages--;
268 if (m_cur_stage >= Cur_cmd_brief->num_stages)
269 m_cur_stage = Cur_cmd_brief->num_stages - 1;
274 void cmd_brief_dlg::copy_stage(int from, int to)
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");
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);
287 void cmd_brief_dlg::OnBrowseAni()
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||");
297 if (dlg.DoModal() == IDOK) {
298 m_ani_filename = dlg.GetFileName();
306 void cmd_brief_dlg::OnBrowseWave()
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||");
316 if (dlg.DoModal() == IDOK) {
317 m_wave_filename = dlg.GetFileName();
325 BOOL cmd_brief_dlg::DestroyWindow()
327 m_play_bm.DeleteObject();
328 return CDialog::DestroyWindow();
331 void cmd_brief_dlg::OnPlay()
333 char path[MAX_PATH_LEN + 1];
334 GetDlgItem(IDC_WAVE_FILENAME)->GetWindowText(m_wave_filename);
337 cf_find_file_location((char *) (LPCSTR) m_wave_filename, CF_TYPE_ANY, path, &size, &offset );
339 PlaySound(path, NULL, SND_ASYNC | SND_FILENAME);