1 // sprite_edit_dialog.cpp : implementation file
2 //
3 
4 #include "studiox_includes.h"
5 #include "stdafx.h"
6 #include "sprite_edit_dialog.h"
7 #include "afxdialogex.h"
8 #include "import_sprite_frames_dlg.h"
9 
10 #define MAX_SPRITE_FRAMES     256
11 #define FRAME_INFO_NOT_EQUAL  65535
12 
13 #define READ_FRAME_FIELD(id, str, val)     \
14             GetDlgItemText(id, str);       \
15             if (str.IsEmpty())             \
16             {                              \
17                 val = FRAME_INFO_NOT_EQUAL;\
18             }
19 
20 #define SET_FRAME_FIELD(id, value)             \
21             if (value != FRAME_INFO_NOT_EQUAL) \
22             {                                  \
23                 SetDlgItemInt(id, value);      \
24             }                                  \
25             else                               \
26             {                                  \
27                 GetDlgItem(id)->SetWindowText(L"");\
28             }
29 
30 #define SET_VAL(target, source)                \
31             if (source != FRAME_INFO_NOT_EQUAL)\
32             {                                  \
33                 target = source;               \
34             }
35 
36 #define CHECK_EQUAL(target, source)            \
37             if (target != source)              \
38             {                                  \
39                 target = FRAME_INFO_NOT_EQUAL; \
40             }
41 
42 enum sprite_edit_dlg_test_commands {
43     TEST_EDIT_FRAME = 1,
44     TEST_EDIT_NUM_FRAMES,
45     TEST_SET_ALPHA,
46     TEST_SET_XOFFSET,
47     TEST_SET_YOFFSET,
48     TEST_SET_DELAY,
49     TEST_CHECK_APPLY_TO_ALL_FRAMES,
50     TEST_IMPORT_FRAMES,
51     TEST_SAVE,
52     TEST_CANCEL
53 };
54 
55 
BEGIN_MESSAGE_MAP(sprite_edit_dialog,express_dialog)56 BEGIN_MESSAGE_MAP(sprite_edit_dialog, express_dialog)
57     ON_WM_CREATE()
58     ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_NUM_FRAMES, &sprite_edit_dialog::OnDeltaposSpinNumFrames)
59     ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_EDIT_FRAME, &sprite_edit_dialog::OnDeltaposSpinEditFrame)
60     ON_EN_KILLFOCUS(IDC_NUM_FRAMES, &sprite_edit_dialog::OnEnKillfocusNumFrames)
61     ON_EN_KILLFOCUS(IDC_EDIT_FRAME, &sprite_edit_dialog::OnEnKillfocusEditFrame)
62     ON_EN_KILLFOCUS(IDC_ALPHA_VALUE, &sprite_edit_dialog::OnEnKillfocusAlphaValue)
63     ON_EN_KILLFOCUS(IDC_X_OFFSET, &sprite_edit_dialog::OnEnKillfocusXOffset)
64     ON_EN_KILLFOCUS(IDC_Y_OFFSET, &sprite_edit_dialog::OnEnKillfocusYOffset)
65     ON_EN_KILLFOCUS(IDC_DELAY, &sprite_edit_dialog::OnEnKillfocusDelay)
66     ON_BN_CLICKED(IDC_APPLY_TO_ALL_FRAMES, OnClickApplyToAllFrames)
67     ON_BN_CLICKED(IDC_IMPORT_FRAMES, OnImportFrames)
68     ON_BN_CLICKED(IDCANCEL, OnCancel)
69     ON_MESSAGE(STUDIO_TEST, OnTestMessage)
70 END_MESSAGE_MAP()
71 
72 
73 // sprite_edit_dialog dialog
74 
75 ///////////////////////////////////////////////////////////////////////////////
76 sprite_edit_dialog::sprite_edit_dialog(widget_info *info, CWnd* pParent /*=NULL*/)
77 	: express_dialog(sprite_edit_dialog::IDD, pParent)
78 {
79     int index;
80 
81     IconId = IDB_PROPS_VIEW;
82     SetTitleText("Edit Sprite Frames");
83 
84     mpInfo = info;
85     mTempInfo = *info;
86 
87     // allcate MAX_FRAMES, so we don't have to keep resizing the array
88     // every time the user adds or removes frames.
89     GX_SPRITE_FRAME *old_frames = mTempInfo.ewi.sprite.framelist;
90     mTempInfo.ewi.sprite.framelist = new GX_SPRITE_FRAME[MAX_SPRITE_FRAMES];
91     memset(mTempInfo.ewi.sprite.framelist, 0, MAX_SPRITE_FRAMES * sizeof(GX_SPRITE_FRAME));
92 
93     for (index = 0; index < mTempInfo.ewi.sprite.frame_count; index++)
94     {
95         mTempInfo.ewi.sprite.framelist[index] = old_frames[index];
96     }
97     if (mTempInfo.ewi.sprite.frame_count == 0)
98     {
99         mTempInfo.ewi.sprite.frame_count = 1;
100     }
101     delete [] old_frames;
102     mEditFrame = 0;
103 }
104 
105 ///////////////////////////////////////////////////////////////////////////////
~sprite_edit_dialog()106 sprite_edit_dialog::~sprite_edit_dialog()
107 {
108 }
109 
110 ///////////////////////////////////////////////////////////////////////////////
OnOK()111 void sprite_edit_dialog::OnOK()
112 {
113     // copy my temp info to widget info
114     ReadFrameFields();
115 
116     express_dialog::OnOK();
117 
118     GX_SPRITE_FRAME *old_frames = mpInfo->ewi.sprite.framelist;
119     mpInfo->ewi.sprite.framelist = mTempInfo.ewi.sprite.framelist;
120     mTempInfo.ewi.sprite.framelist = NULL;
121     delete [] old_frames;
122     mpInfo->ewi.sprite.frame_count = mTempInfo.ewi.sprite.frame_count;
123     mTempInfo.ewi.sprite.frame_count = 0;
124     mpInfo->ewi.sprite.apply_to_all_frames = mTempInfo.ewi.sprite.apply_to_all_frames;
125 }
126 
127 ///////////////////////////////////////////////////////////////////////////////
SelectDropListItem(CComboBox * box,long val)128 void sprite_edit_dialog::SelectDropListItem(CComboBox* box, long val)
129 {
130     int box_index;
131 
132     for (box_index = 0; box_index < box->GetCount(); box_index++)
133     {
134         if (box->GetItemData(box_index) == val)
135         {
136             box->SetCurSel(box_index);
137         }
138     }
139 }
140 
141 ///////////////////////////////////////////////////////////////////////////////
SetFrameFields()142 void sprite_edit_dialog::SetFrameFields()
143 {
144     int alpha = mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_alpha;
145     int xoffset = mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_x_offset;
146     int yoffset = mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_y_offset;
147     int delay = mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_delay;
148     int bg_operation_sel = mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_background_operation;
149 
150     if (mTempInfo.ewi.sprite.apply_to_all_frames)
151     {
152         for (int index = 0; index < mTempInfo.ewi.sprite.frame_count; index++)
153         {
154             if (index == mEditFrame)
155             {
156                 continue;
157             }
158             CHECK_EQUAL(alpha, mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_alpha);
159             CHECK_EQUAL(xoffset, mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_x_offset);
160             CHECK_EQUAL(yoffset, mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_y_offset);
161             CHECK_EQUAL(delay, mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_delay);
162             CHECK_EQUAL(bg_operation_sel, mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_background_operation);
163         }
164     }
165 
166     SET_FRAME_FIELD(IDC_ALPHA_VALUE, alpha);
167     SET_FRAME_FIELD(IDC_X_OFFSET, xoffset);
168     SET_FRAME_FIELD(IDC_X_OFFSET, xoffset);
169     SET_FRAME_FIELD(IDC_Y_OFFSET, yoffset);
170     SET_FRAME_FIELD(IDC_DELAY, delay);
171 
172     SelectDropListItem(&mPixelmapCombo, mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_pixelmap);
173 
174     CString diff_operation(L"<different operations>");
175     int index = mBackgroundCombo.FindString(0, diff_operation);
176 
177     if (bg_operation_sel != FRAME_INFO_NOT_EQUAL)
178     {
179         if (index >= 0)
180         {
181             mBackgroundCombo.DeleteString(index);
182         }
183     }
184     else
185     {
186         if (index < 0)
187         {
188             int sel = mBackgroundCombo.InsertString(-1, diff_operation);
189             mBackgroundCombo.SetItemData(sel, FRAME_INFO_NOT_EQUAL);
190         }
191     }
192 
193     SelectDropListItem(&mBackgroundCombo, bg_operation_sel);
194 }
195 
196 ///////////////////////////////////////////////////////////////////////////////
ReadFrameFields()197 void sprite_edit_dialog::ReadFrameFields()
198 {
199     if (mTempInfo.ewi.sprite.framelist)
200     {
201         int alpha = GetDlgItemInt(IDC_ALPHA_VALUE);
202         int xoffset = GetDlgItemInt(IDC_X_OFFSET);
203         int yoffset = GetDlgItemInt(IDC_Y_OFFSET);
204         int delay = GetDlgItemInt(IDC_DELAY);
205         int cursel = mBackgroundCombo.GetCurSel();
206         int background_operation = mBackgroundCombo.GetItemData(cursel);
207         CString str;
208         int index;
209         int frame_count;
210 
211         if (mTempInfo.ewi.sprite.apply_to_all_frames)
212         {
213             READ_FRAME_FIELD(IDC_ALPHA_VALUE, str, alpha);
214             READ_FRAME_FIELD(IDC_X_OFFSET, str, xoffset);
215             READ_FRAME_FIELD(IDC_Y_OFFSET, str, yoffset);
216             READ_FRAME_FIELD(IDC_DELAY, str, delay);
217 
218             index = 0;
219             frame_count = mTempInfo.ewi.sprite.frame_count;
220         }
221         else
222         {
223             cursel = mPixelmapCombo.GetCurSel();
224             mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_pixelmap = mPixelmapCombo.GetItemData(cursel);
225 
226             index = mEditFrame;
227             frame_count = index + 1;
228         }
229 
230         while (index < frame_count)
231         {
232             SET_VAL(mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_alpha, alpha);
233             SET_VAL(mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_x_offset, xoffset);
234             SET_VAL(mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_y_offset, yoffset);
235             SET_VAL(mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_delay, delay);
236             SET_VAL(mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_background_operation, background_operation);
237 
238             index++;
239         }
240     }
241 }
242 
243 ///////////////////////////////////////////////////////////////////////////////
DoDataExchange(CDataExchange * pDX)244 void sprite_edit_dialog::DoDataExchange(CDataExchange* pDX)
245 {
246     CDialog::DoDataExchange(pDX);
247     DDX_Control(pDX, IDC_SPIN_NUM_FRAMES, mSpinNumFrames);
248     DDX_Control(pDX, IDC_SPIN_EDIT_FRAME, mSpinEditFrame);
249     DDX_Control(pDX, IDC_NUM_FRAMES, mNumFramesField);
250     DDX_Control(pDX, IDC_EDIT_FRAME, mEditFrameField);
251     DDX_Control(pDX, IDC_BACKGROUND_COMBO, mBackgroundCombo);
252     DDX_Control(pDX, IDC_PIXELMAP_COMBO, mPixelmapCombo);
253     DDX_Control(pDX, IDC_X_OFFSET, mXOffsetEdit);
254     DDX_Control(pDX, IDC_Y_OFFSET, mYOffsetEdit);
255 
256     if (pDX->m_bSaveAndValidate)
257     {
258         ReadFrameFields();
259     }
260     else
261     {
262         mXOffsetEdit.EnableNumberCheck();
263         mXOffsetEdit.EnableNegativeValue();
264 
265         mYOffsetEdit.EnableNumberCheck();
266         mYOffsetEdit.EnableNegativeValue();
267 
268         mSpinNumFrames.SetRange(1, MAX_SPRITE_FRAMES);
269         mSpinNumFrames.SetPos32(mTempInfo.ewi.sprite.frame_count);
270         mSpinEditFrame.SetRange(1, mTempInfo.ewi.sprite.frame_count);
271         mSpinEditFrame.SetPos32(1);
272         SetDlgItemInt(IDC_NUM_FRAMES, mTempInfo.ewi.sprite.frame_count);
273         SetDlgItemInt(IDC_EDIT_FRAME, 1);
274 
275         CString resname;
276 
277         int index;
278         index = mBackgroundCombo.AddString(_T("No Operation"));
279         mBackgroundCombo.SetItemData(index, 0);
280 
281         index = mBackgroundCombo.AddString(_T("Restore first pixelmap"));
282         mBackgroundCombo.SetItemData(index, 1);
283 
284         index = mBackgroundCombo.AddString(_T("Solid Color Fill"));
285         mBackgroundCombo.SetItemData(index, 2);
286 
287 
288         mBackgroundCombo.ShowWindow(SW_SHOW);
289 
290         int pixelmap_id = 1;
291         mPixelmapCombo.AddString(_T("None"));
292         studiox_project* project = GetOpenProject();
293 
294         if (!project)
295         {
296             return;
297         }
298 
299         int active_display = GetProjectView()->GetActiveDisplay();
300         int active_theme = project->mDisplays[active_display].active_theme;
301 
302         for (pixelmap_id = 1; pixelmap_id < project->CountResources(active_display, RES_TYPE_PIXELMAP); pixelmap_id++)
303         {
304             project->GetResourceName(active_display, RES_TYPE_PIXELMAP, pixelmap_id, resname);
305 
306             if (!resname.IsEmpty())
307             {
308                 index = mPixelmapCombo.AddString(resname);
309                 mPixelmapCombo.SetItemData(index, pixelmap_id);
310             }
311         }
312 
313         if (mpInfo->pixelmap_id[NORMAL_PIXELMAP_INDEX])
314         {
315         	// Disable frame count and pixelmap edit.
316             GetDlgItem(IDC_NUM_FRAMES)->EnableWindow(FALSE);
317             GetDlgItem(IDC_SPIN_NUM_FRAMES)->EnableWindow(FALSE);
318             GetDlgItem(IDC_PIXELMAP_COMBO)->EnableWindow(FALSE);
319             GetDlgItem(IDC_IMPORT_FRAMES)->EnableWindow(FALSE);
320         }
321 
322         if (mTempInfo.ewi.sprite.apply_to_all_frames)
323         {
324             ((CButton*)GetDlgItem(IDC_APPLY_TO_ALL_FRAMES))->SetCheck(TRUE);
325             GetDlgItem(IDC_EDIT_FRAME)->EnableWindow(FALSE);
326             GetDlgItem(IDC_PIXELMAP_COMBO)->EnableWindow(FALSE);
327         }
328 
329         SetFrameFields();
330     }
331 }
332 
333 
334 // sprite_edit_dialog message handlers
335 
336 ///////////////////////////////////////////////////////////////////////////////
OnDeltaposSpinNumFrames(NMHDR * pNMHDR,LRESULT * pResult)337 void sprite_edit_dialog::OnDeltaposSpinNumFrames(NMHDR *pNMHDR, LRESULT *pResult)
338 {
339     LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
340     // TODO: Add your control notification handler code here
341 
342     int oldval = pNMUpDown ->iPos;
343     int newval = oldval + pNMUpDown->iDelta;
344     int current_val;
345 
346     if (oldval <= MAX_SPRITE_FRAMES && oldval >= 1)
347     {
348         if (newval <= 0)
349         {
350             newval = 1;
351         }
352         else
353         {
354             if (newval > MAX_SPRITE_FRAMES)
355             {
356                 newval = MAX_SPRITE_FRAMES;
357             }
358         }
359         SetDlgItemInt(IDC_NUM_FRAMES, newval);
360         mTempInfo.ewi.sprite.frame_count = newval;
361 
362         if (newval < oldval)
363         {
364             current_val = mSpinEditFrame.GetPos32();
365 
366             if (mSpinEditFrame.GetPos32() > newval)
367             {
368                 mSpinEditFrame.SetPos32(newval);
369                 SetDlgItemInt(IDC_EDIT_FRAME, newval);
370                 mEditFrame = newval - 1;
371                 SetFrameFields();
372             }
373         }
374         else
375         {
376             // clear out the new entry
377             memset(&mTempInfo.ewi.sprite.framelist[newval - 1], 0, sizeof(GX_SPRITE_FRAME));
378             mTempInfo.ewi.sprite.framelist[newval - 1].gx_sprite_frame_alpha = 255;
379             mTempInfo.ewi.sprite.framelist[newval - 1].gx_sprite_frame_delay = 5;
380         }
381         mSpinEditFrame.SetRange(1, newval);
382         mSpinEditFrame.Invalidate();
383     }
384 
385     *pResult = 0;
386 }
387 
388 ///////////////////////////////////////////////////////////////////////////////
OnDeltaposSpinEditFrame(NMHDR * pNMHDR,LRESULT * pResult)389 void sprite_edit_dialog::OnDeltaposSpinEditFrame(NMHDR *pNMHDR, LRESULT *pResult)
390 {
391     LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
392     // TODO: Add your control notification handler code here
393     int upper;
394     int lower;
395 
396     mSpinEditFrame.GetRange(lower, upper);
397 
398     int oldval = pNMUpDown ->iPos;
399     int newval = oldval + pNMUpDown->iDelta;
400 
401     // save the current name, update to new name, if the value is within
402     // limits
403     if (oldval <= upper && oldval >= lower &&
404         newval <= upper && newval >= lower)
405     {
406 
407         // Read and save current frame values
408         ReadFrameFields();
409         SetDlgItemInt(IDC_EDIT_FRAME, newval);
410 
411         // switch to new frame
412         mEditFrame = newval - 1;
413         SetFrameFields();
414     }
415 
416     *pResult = 0;
417 }
418 
419 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusNumFrames()420 void sprite_edit_dialog::OnEnKillfocusNumFrames()
421 {
422     int newval = GetDlgItemInt(IDC_NUM_FRAMES);
423 
424     int oldval = mTempInfo.ewi.sprite.frame_count;
425 
426     if ((newval >= 1) && (newval <= MAX_SPRITE_FRAMES))
427     {
428 
429         mTempInfo.ewi.sprite.frame_count = newval;
430 
431         if (newval < oldval)
432         {
433             if (mEditFrame > newval)
434             {
435                 mSpinEditFrame.SetPos32(newval);
436                 SetDlgItemInt(IDC_EDIT_FRAME, newval);
437                 mEditFrame = newval - 1;
438                 SetFrameFields();
439             }
440         }
441         else
442         {
443             // clear out the new entry
444             for (int index = oldval; index < newval; index++)
445             {
446                 memset(&mTempInfo.ewi.sprite.framelist[index], 0, sizeof(GX_SPRITE_FRAME));
447                 mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_alpha = 255;
448                 mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_delay = 5;
449             }
450         }
451         mSpinEditFrame.SetRange(1, newval);
452         mSpinEditFrame.Invalidate();
453     }
454     else
455     {
456         SetDlgItemInt(IDC_NUM_FRAMES, oldval);
457 
458         char msg[255];
459         sprintf_s(msg, sizeof(msg), "Invalid value for Number of Frames. Valid range is from 1 to %d.", MAX_SPRITE_FRAMES);
460         ErrorMsg(msg, this);
461         GetDlgItem(IDC_NUM_FRAMES)->SetFocus();
462     }
463 }
464 
465 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusEditFrame()466 void sprite_edit_dialog::OnEnKillfocusEditFrame()
467 {
468     int newval = GetDlgItemInt(IDC_EDIT_FRAME);
469 
470     int max_frame_id = GetDlgItemInt(IDC_NUM_FRAMES);
471 
472     if ((newval >= 1) && (newval <= max_frame_id))
473     {
474         // Read and save current frame values
475         ReadFrameFields();
476 
477         // switch to new frame
478         mEditFrame = newval - 1;
479         SetFrameFields();
480     }
481     else
482     {
483         SetDlgItemInt(IDC_EDIT_FRAME, mEditFrame + 1);
484         ErrorMsg("Selected frame must be between 1 and the total number of frames", this);
485         GetDlgItem(IDC_EDIT_FRAME)->SetFocus();
486     }
487 }
488 
489 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusAlphaValue()490 void sprite_edit_dialog::OnEnKillfocusAlphaValue()
491 {
492     // TODO: Add your control notification handler code here
493     int val = GetDlgItemInt(IDC_ALPHA_VALUE);
494     if (val < 0 || val > 255)
495     {
496         SetDlgItemInt(IDC_ALPHA_VALUE, mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_alpha);
497     }
498 }
499 
500 
501 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusXOffset()502 void sprite_edit_dialog::OnEnKillfocusXOffset()
503 {
504     // TODO: Add your control notification handler code here
505     int val = GetDlgItemInt(IDC_X_OFFSET);
506     if (val < -65535 || val > 65535)
507     {
508         SetDlgItemInt(IDC_X_OFFSET, mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_x_offset);
509     }
510 }
511 
512 
513 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusYOffset()514 void sprite_edit_dialog::OnEnKillfocusYOffset()
515 {
516     // TODO: Add your control notification handler code here
517     int val = GetDlgItemInt(IDC_Y_OFFSET);
518     if (val < -65535 || val > 65535)
519     {
520         SetDlgItemInt(IDC_Y_OFFSET, mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_y_offset);
521     }
522 }
523 
524 
525 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusDelay()526 void sprite_edit_dialog::OnEnKillfocusDelay()
527 {
528     // TODO: Add your control notification handler code here
529     int val = GetDlgItemInt(IDC_DELAY);
530     if (val < 0 || val > 999)
531     {
532         SetDlgItemInt(IDC_DELAY, mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_delay);
533     }
534 }
535 
536 ///////////////////////////////////////////////////////////////////////////////
OnClickApplyToAllFrames()537 void sprite_edit_dialog::OnClickApplyToAllFrames()
538 {
539     ReadFrameFields();
540 
541     if (((CButton*)GetDlgItem(IDC_APPLY_TO_ALL_FRAMES))->GetCheck() == BST_CHECKED)
542     {
543         mTempInfo.ewi.sprite.apply_to_all_frames = TRUE;
544         GetDlgItem(IDC_EDIT_FRAME)->EnableWindow(FALSE);
545         GetDlgItem(IDC_PIXELMAP_COMBO)->EnableWindow(FALSE);
546     }
547     else
548     {
549         mTempInfo.ewi.sprite.apply_to_all_frames = FALSE;
550         GetDlgItem(IDC_EDIT_FRAME)->EnableWindow(TRUE);
551         GetDlgItem(IDC_PIXELMAP_COMBO)->EnableWindow(TRUE);
552     }
553 
554     SetFrameFields();
555 }
556 
557 ///////////////////////////////////////////////////////////////////////////////
SetFrameCount(int frame_count)558 void sprite_edit_dialog::SetFrameCount(int frame_count)
559 {
560     if (frame_count <= 0)
561     {
562         return;
563     }
564 
565     if (frame_count > MAX_SPRITE_FRAMES)
566     {
567         frame_count = MAX_SPRITE_FRAMES;
568     }
569 
570     int oldval = mTempInfo.ewi.sprite.frame_count;
571 
572     SetDlgItemInt(IDC_NUM_FRAMES, frame_count);
573     mTempInfo.ewi.sprite.frame_count = frame_count;
574 
575     if (frame_count < oldval)
576     {
577         if (mSpinEditFrame.GetPos32() > frame_count)
578         {
579             mSpinEditFrame.SetPos32(frame_count);
580             SetDlgItemInt(IDC_EDIT_FRAME, frame_count);
581             mEditFrame = frame_count - 1;
582             SetFrameFields();
583         }
584     }
585     else
586     {
587         for (int index = oldval; index < frame_count; index++)
588         {
589             // clear out the new entry
590             memset(&mTempInfo.ewi.sprite.framelist[index], 0, sizeof(GX_SPRITE_FRAME));
591             mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_alpha = 255;
592             mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_delay = 5;
593         }
594     }
595     mSpinEditFrame.SetRange(1, frame_count);
596     mSpinEditFrame.Invalidate();
597 }
598 
599 ///////////////////////////////////////////////////////////////////////////////
OnImportFrames()600 void sprite_edit_dialog::OnImportFrames()
601 {
602     import_sprite_frames_dlg dlg(this);
603 
604     if (dlg.DoModal() == IDOK)
605     {
606         CArray<CString> *name_list = dlg.GetFrameNameList();
607         if (!name_list || name_list->IsEmpty())
608         {
609             return;
610         }
611 
612         int count = name_list->GetCount();
613 
614         if (count)
615         {
616             if (count > MAX_SPRITE_FRAMES)
617             {
618                 count = MAX_SPRITE_FRAMES;
619             }
620 
621             SetFrameCount(count);
622 
623             studiox_project* project = GetOpenProject();
624             int active_display = GetProjectView()->GetActiveDisplay();
625 
626             CString name;
627 
628             for(int index = 0; index < count; index++)
629             {
630                 name = name_list->GetAt(index);
631 
632                 mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_pixelmap = project->GetResourceId(active_display, RES_TYPE_PIXELMAP, name);
633 
634                 if (index == mEditFrame)
635                 {
636                     mPixelmapCombo.SelectString(0, name);
637                 }
638             }
639         }
640     }
641 }
642 
643 ///////////////////////////////////////////////////////////////////////////////
OnInitDialog()644 BOOL sprite_edit_dialog::OnInitDialog()
645 {
646     express_dialog::OnInitDialog();
647 
648     // TODO:  Add extra initialization here
649     AddCancelButton();
650     AddSaveButton();
651 
652 
653     return TRUE;  // return TRUE unless you set the focus to a control
654     // EXCEPTION: OCX Property Pages should return FALSE
655 }
656 
657 
PreTranslateMessage(MSG * pMsg)658 BOOL sprite_edit_dialog::PreTranslateMessage(MSG* pMsg)
659 {
660     // TODO: Add your specialized code here and/or call the base class
661     CWnd* focus_owner = GetFocus();
662 
663     if (focus_owner)
664     {
665         int ctrl_id = focus_owner->GetDlgCtrlID();
666 
667         switch (ctrl_id)
668         {
669         case IDC_NUM_FRAMES:
670         case IDC_EDIT_FRAME:
671         case IDC_ALPHA_VALUE:
672         case IDC_DELAY:
673             if ((pMsg->message == WM_CHAR) && isprint(pMsg->wParam))
674             {
675                 if (pMsg->wParam < '0' || pMsg->wParam > '9')
676                 {
677                     ErrorMsg("Unacceptable Character. You can only type a number here.", this);
678                     return TRUE;
679                 }
680             }
681             break;
682         }
683     }
684 
685     return express_dialog::PreTranslateMessage(pMsg);
686 }
687 
688 //////////////////////////////////////////////////////////////////////////////
OnTestMessage(WPARAM wParam,LPARAM lParam)689 LRESULT sprite_edit_dialog::OnTestMessage(WPARAM wParam, LPARAM lParam)
690 {
691     CWnd* pWnd;
692     CString string;
693 
694     switch (wParam)
695     {
696     case TEST_EDIT_FRAME:
697         pWnd = GetDlgItem(IDC_EDIT_FRAME);
698         if (pWnd)
699         {
700             CStringArray param;
701             CString id;
702 
703 
704             SplitString(GetTestingParam(0), ',', &param);
705             id = param.GetAt(0);
706             string = param.GetAt(1);
707 
708             pWnd->SetWindowText(id);
709             SendMessage(WM_COMMAND, MAKEWPARAM(IDC_EDIT_FRAME, EN_KILLFOCUS), (LPARAM)((CEdit*)pWnd)->m_hWnd);
710 
711 
712             pWnd = GetDlgItem(IDC_PIXELMAP_COMBO);
713             ((CComboBox*)pWnd)->SelectString(-1, string);
714             SendMessage(WM_COMMAND, MAKEWPARAM(IDC_PIXELMAP_COMBO, CBN_SELCHANGE), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
715         }
716         break;
717 
718     case TEST_EDIT_NUM_FRAMES:
719         pWnd = GetDlgItem(IDC_NUM_FRAMES);
720         string.Format(_T("%d"), lParam);
721         pWnd->SetWindowText(string);
722         SendMessage(WM_COMMAND, MAKEWPARAM(IDC_NUM_FRAMES, EN_KILLFOCUS), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
723         break;
724 
725     case TEST_SET_ALPHA:
726         pWnd = GetDlgItem(IDC_ALPHA_VALUE);
727         string.Format(_T("%d"), lParam);
728         pWnd->SetWindowText(string);
729         SendMessage(WM_COMMAND, MAKEWPARAM(IDC_ALPHA_VALUE, EN_KILLFOCUS), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
730         break;
731 
732     case TEST_SET_XOFFSET:
733         pWnd = GetDlgItem(IDC_X_OFFSET);
734         string.Format(_T("%d"), lParam);
735         pWnd->SetWindowText(string);
736         SendMessage(WM_COMMAND, MAKEWPARAM(IDC_X_OFFSET, EN_KILLFOCUS), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
737         break;
738 
739     case TEST_SET_YOFFSET:
740         pWnd = GetDlgItem(IDC_Y_OFFSET);
741         string.Format(_T("%d"), lParam);
742         pWnd->SetWindowText(string);
743         SendMessage(WM_COMMAND, MAKEWPARAM(IDC_Y_OFFSET, EN_KILLFOCUS), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
744         break;
745 
746     case TEST_SET_DELAY:
747         pWnd = GetDlgItem(IDC_DELAY);
748         string.Format(_T("%d"), lParam);
749         pWnd->SetWindowText(string);
750         SendMessage(WM_COMMAND, MAKEWPARAM(IDC_DELAY, EN_KILLFOCUS), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
751         break;
752 
753     case TEST_CHECK_APPLY_TO_ALL_FRAMES:
754     {
755         CButton *button = (CButton *)GetDlgItem(IDC_APPLY_TO_ALL_FRAMES);
756         button->SetCheck(lParam);
757         SendMessage(WM_COMMAND, MAKEWPARAM(IDC_APPLY_TO_ALL_FRAMES, BN_CLICKED), (LPARAM)button->m_hWnd);
758     }
759         break;
760 
761     case TEST_IMPORT_FRAMES:
762         OnImportFrames();
763         break;
764 
765     case TEST_SAVE:
766         OnOK();
767         break;
768 
769     case TEST_CANCEL:
770         OnCancel();
771         break;
772     }
773 
774     return 0;
775 }
776 
777