1 #include "studiox_includes.h"
2 #include "trigger_list_edit_dlg.h"
3 
4 extern CString target_class_name;
5 extern CFont NormalFont;
6 
7 enum trigger_list_edit_dlg_test_commands{
8     TEST_ADD_TRIGGER = 1,
9     TEST_DELETE_TRIGGER,
10     TEST_EDIT_TRIGGER,
11     TEST_EDIT_ACTION,
12     TEST_SELETE_ROW,
13     TEST_SAVE_TRIGGER_LIST_EDIT,
14     TEST_CANCEL_TRIGGER_LIST_EDIT
15 };
16 
IMPLEMENT_DYNAMIC(trigger_list_edit_dlg,express_dialog)17 IMPLEMENT_DYNAMIC(trigger_list_edit_dlg, express_dialog)
18 
19 BEGIN_MESSAGE_MAP(trigger_list_edit_dlg, express_dialog)
20     ON_WM_DESTROY()
21     ON_BN_CLICKED(IDC_TRIGGER_ADD_BTN, &trigger_list_edit_dlg::OnAddTrigger)
22     ON_BN_CLICKED(IDC_TRIGGER_DEL_BTN, &trigger_list_edit_dlg::OnDeleteTrigger)
23     ON_BN_CLICKED(IDC_TRIGGER_EDIT_BTN, &trigger_list_edit_dlg::OnEditTrigger)
24     ON_BN_CLICKED(IDC_TRIGGER_ACTION_EDIT_BTN, &trigger_list_edit_dlg::OnEditTriggerAction)
25     ON_MESSAGE(STUDIO_TEST, &trigger_list_edit_dlg::OnTestMessage)
26 END_MESSAGE_MAP()
27 
28 ///////////////////////////////////////////////////////////////////////////////
29 trigger_list_edit_dlg::trigger_list_edit_dlg(int display_index, screen_flow *flow, flow_item *item, CWnd* pParent /*=NULL*/)
30     : express_dialog(trigger_list_edit_dlg::IDD, pParent)
31 {
32     SetTitleText("Edit Trigger List");
33     IconId = IDB_MACRO_PLAYBACK_ICON;
34     mpTriggerFrame = NULL;
35     mpOldFlow = flow;
36     mDisplayIndex = display_index;
37 
38     mItem = *item;
39 
40     trigger_info *trigger = mItem.trigger_list;
41     while (trigger)
42     {
43         mTriggerList.Add(trigger);
44         trigger = trigger->next;
45     }
46 }
47 
48 ///////////////////////////////////////////////////////////////////////////////
~trigger_list_edit_dlg()49 trigger_list_edit_dlg::~trigger_list_edit_dlg()
50 {
51 }
52 
53 ///////////////////////////////////////////////////////////////////////////////
OnDestroy()54 void trigger_list_edit_dlg::OnDestroy()
55 {
56     express_dialog::OnDestroy();
57 
58     mpTriggerFrame->DestroyWindow();
59     delete mpTriggerFrame;
60 }
61 
62 ///////////////////////////////////////////////////////////////////////////////
DoDataExchange(CDataExchange * pDX)63 void trigger_list_edit_dlg::DoDataExchange(CDataExchange* pDX)
64 {
65     express_dialog::DoDataExchange(pDX);
66 }
67 
68 ///////////////////////////////////////////////////////////////////////////////
OnOK()69 void trigger_list_edit_dlg::OnOK()
70 {
71     flow_item *item = mpOldFlow->GetFlowItem(mItem.screen_name);
72 
73     if (item->trigger_list)
74     {
75         delete item->trigger_list;
76     }
77     item->trigger_list = mItem.trigger_list;
78     mItem.trigger_list = NULL;
79 
80     express_dialog::OnOK();
81 }
82 
83 ///////////////////////////////////////////////////////////////////////////////
OnCancel()84 void trigger_list_edit_dlg::OnCancel()
85 {
86     mItem.RemovedAnimationIdFromDictionary(mDisplayIndex);
87 
88     flow_item *item = mpOldFlow->GetFlowItem(mItem.screen_name);
89     if (item)
90     {
91         item->AddAnimationIdToDictionary(mDisplayIndex);
92     }
93 
94     express_dialog::OnCancel();
95 }
96 
97 int bad_wnd_pointers = 0;
98 
99 ///////////////////////////////////////////////////////////////////////////////
OnInitDialog()100 BOOL trigger_list_edit_dlg::OnInitDialog()
101 {
102     CString List_Prompt;
103     CWnd *wnd;
104 
105     express_dialog::OnInitDialog();
106 
107     AddCancelButton();
108     AddSaveButton();
109 
110     CRect rect;
111     CRect list_prompt_rect;
112     GetClientRect(&rect);
113     rect.left += 10;
114     rect.right -= 10;
115     rect.bottom -= (m_status_bar_height + 10);
116 
117     wnd = GetDlgItem(IDC_TRIGGER_LIST_PROMPT);
118     if (wnd)
119     {
120         wnd->GetWindowRect(&list_prompt_rect);
121         ScreenToClient(&list_prompt_rect);
122         rect.top = list_prompt_rect.bottom + 1;
123     }
124     else
125     {
126         bad_wnd_pointers++;
127     }
128 
129     // create trigger frame
130     mpTriggerFrame = new trigger_frame(this, &mTriggerList);
131     mpTriggerFrame->Create(target_class_name, _T("trigger_frame"),
132         WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_TABSTOP, rect, this, 0);
133     mpTriggerFrame->SetWindowPos(GetDlgItem(IDC_TRIGGER_ACTION_EDIT_BTN), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
134 
135     //set source screen name
136     List_Prompt.Format(_T("List of defined triggers for \"%s\":"), mItem.screen_name);
137     SetDlgItemText(IDC_TRIGGER_LIST_PROMPT, List_Prompt);
138 
139     EnableDisableTriggerEditControls();
140 
141     return TRUE;
142 }
143 
144 ///////////////////////////////////////////////////////////////////////////////
OnAddTrigger()145 void trigger_list_edit_dlg::OnAddTrigger()
146 {
147     trigger_info *trigger = new trigger_info;
148     trigger->event_type = 0;
149     trigger_edit_dlg dlg(mDisplayIndex, &mItem, trigger, this);
150 
151     if ((dlg.DoModal() == IDOK) && trigger->event_type)
152     {
153         mTriggerList.Add(trigger);
154 
155         mpTriggerFrame->CreateTriggerRows();
156         mpTriggerFrame->PositionChildren();
157 
158         //select new added trigger
159         mpTriggerFrame->SetSelectedRow(mTriggerList.GetCount() - 1);
160 
161         EnableDisableTriggerEditControls();
162     }
163     else
164     {
165         delete trigger;
166     }
167 }
168 
169 ///////////////////////////////////////////////////////////////////////////////
OnDeleteTrigger()170 void trigger_list_edit_dlg::OnDeleteTrigger()
171 {
172     int index = mpTriggerFrame->GetSelectedRow();
173 
174     if (index < mTriggerList.GetCount())
175     {
176         trigger_info *trigger = mTriggerList.GetAt(index);
177         trigger->RemoveAnimationIdFromDictionary(mDisplayIndex);
178         screen_flow::RemoveTrigger(&mItem, trigger);
179         mTriggerList.RemoveAt(index);
180 
181         mpTriggerFrame->CreateTriggerRows();
182         mpTriggerFrame->PositionChildren();
183 
184         if (index > 0)
185         {
186             mpTriggerFrame->SetSelectedRow(index - 1);
187         }
188     }
189 
190     EnableDisableTriggerEditControls();
191 }
192 
193 ///////////////////////////////////////////////////////////////////////////////
OnEditTrigger()194 void trigger_list_edit_dlg::OnEditTrigger()
195 {
196     int index = mpTriggerFrame->GetSelectedRow();
197 
198     if (mTriggerList.GetCount())
199     {
200         trigger_info *trigger = mTriggerList.GetAt(index);
201         trigger_edit_dlg dlg(mDisplayIndex, &mItem, trigger, this);
202 
203         if (dlg.DoModal() == IDOK)
204         {
205             if (trigger->event_type == 0)
206             {
207                 trigger = mTriggerList.GetAt(index);
208                 screen_flow::RemoveTrigger(&mItem, trigger);
209                 mTriggerList.RemoveAt(index);
210             }
211 
212             mpTriggerFrame->CreateTriggerRows();
213             mpTriggerFrame->PositionChildren();
214         }
215     }
216 }
217 
218 ///////////////////////////////////////////////////////////////////////////////
OnEditTriggerAction()219 void trigger_list_edit_dlg::OnEditTriggerAction()
220 {
221     int index = mpTriggerFrame->GetSelectedRow();
222 
223     if (mTriggerList.GetCount())
224     {
225         trigger_info *trigger = mTriggerList.GetAt(index);
226         trigger_action_edit_dlg dlg(mDisplayIndex, &mItem, trigger, this);
227 
228         if (dlg.DoModal() == IDOK)
229         {
230             mpTriggerFrame->CreateTriggerRows();
231             mpTriggerFrame->PositionChildren();
232         }
233     }
234 }
235 
236 ///////////////////////////////////////////////////////////////////////////////
PreTranslateMessage(MSG * pMsg)237 BOOL trigger_list_edit_dlg::PreTranslateMessage(MSG* pMsg)
238 {
239     // TODO: Add your specialized code here and/or call the base class
240 
241     if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN))
242     {
243         CWnd* focus_owner = GetFocus();
244 
245         if (focus_owner)
246         {
247             switch (focus_owner->GetDlgCtrlID())
248             {
249             case IDC_TRIGGER_ADD_BTN:
250                 OnAddTrigger();
251                 return TRUE;
252 
253             case IDC_TRIGGER_DEL_BTN:
254                 OnDeleteTrigger();
255                 return TRUE;
256 
257             case IDC_TRIGGER_EDIT_BTN:
258                 OnEditTrigger();
259                 return TRUE;
260 
261             case IDC_TRIGGER_ACTION_EDIT_BTN:
262                 OnEditTriggerAction();
263                 return TRUE;
264 
265             default:
266                 break;
267             }
268         }
269     }
270 
271     return express_dialog::PreTranslateMessage(pMsg);
272 }
273 
274 
275 ///////////////////////////////////////////////////////////////////////////////
EnableDisableTriggerEditControls()276 void trigger_list_edit_dlg::EnableDisableTriggerEditControls()
277 {
278     BOOL enable = TRUE;
279     if (mTriggerList.GetCount() == 0)
280     {
281         enable = FALSE;
282 
283         if (GetFocus() == GetDlgItem(IDC_TRIGGER_DEL_BTN))
284         {
285             // Move focus to trigger add button.
286             GetDlgItem(IDC_TRIGGER_ADD_BTN)->SetFocus();
287         }
288     }
289 
290     GetDlgItem(IDC_TRIGGER_DEL_BTN)->EnableWindow(enable);
291     GetDlgItem(IDC_TRIGGER_EDIT_BTN)->EnableWindow(enable);
292     GetDlgItem(IDC_TRIGGER_ACTION_EDIT_BTN)->EnableWindow(enable);
293     mpTriggerFrame->EnableWindow(enable);
294 }
295 
296 ///////////////////////////////////////////////////////////////////////////////
OnTestMessage(WPARAM wParam,LPARAM lParam)297 LRESULT trigger_list_edit_dlg::OnTestMessage(WPARAM wParam, LPARAM lParam)
298 {
299     switch (wParam)
300     {
301     case TEST_ADD_TRIGGER:
302         OnAddTrigger();
303         break;
304 
305     case TEST_DELETE_TRIGGER:
306         OnDeleteTrigger();
307         break;
308 
309     case TEST_EDIT_TRIGGER:
310         OnEditTrigger();
311         break;
312 
313     case TEST_EDIT_ACTION:
314         OnEditTriggerAction();
315         break;
316 
317     case TEST_SELETE_ROW:
318         mpTriggerFrame->SetSelectedRow(lParam);
319         break;
320 
321     case TEST_SAVE_TRIGGER_LIST_EDIT:
322         OnOK();
323         break;
324 
325     case TEST_CANCEL_TRIGGER_LIST_EDIT:
326         OnCancel();
327         break;
328     }
329 
330     return 0;
331 }
332 
333 ///////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(trigger_frame,CWnd)334 BEGIN_MESSAGE_MAP(trigger_frame, CWnd)
335     ON_WM_DESTROY()
336     ON_WM_CREATE()
337     ON_WM_VSCROLL()
338     ON_WM_MOUSEWHEEL()
339     ON_WM_PAINT()
340     ON_WM_SIZE()
341     ON_WM_SETFOCUS()
342 END_MESSAGE_MAP()
343 
344 ///////////////////////////////////////////////////////////////////////////////
345 trigger_frame::trigger_frame(CWnd *parent, CArray<trigger_info *> *trigger_list)
346 {
347     mpTriggerList = trigger_list;
348     mSelectedRow = 0;
349     m_scroll_helper = new CScrollHelper;
350     m_scroll_helper->AttachWnd(this);
351 
352     mRowHeight = GetScaledValue(TRIGGER_ROW_HEIGHT, GetSystemDPI(), GetTextScaler());
353 }
354 
~trigger_frame()355 trigger_frame::~trigger_frame()
356 {
357     if (m_scroll_helper)
358     {
359         delete m_scroll_helper;
360     }
361 }
362 
363 ///////////////////////////////////////////////////////////////////////////////
OnCreate(LPCREATESTRUCT lpCreateStruct)364 int trigger_frame::OnCreate(LPCREATESTRUCT lpCreateStruct)
365 {
366     if (CWnd::OnCreate(lpCreateStruct) == -1)
367         return -1;
368 
369     CreateTriggerRows();
370 
371     return 0;
372 }
373 
374 ///////////////////////////////////////////////////////////////////////////////
OnDestroy()375 void trigger_frame::OnDestroy()
376 {
377     CWnd::OnDestroy();
378 
379     CWnd *child = GetWindow(GW_CHILD);
380 
381     while (child)
382     {
383         child->DestroyWindow();
384         delete child;
385         child = GetWindow(GW_CHILD);
386     }
387 }
388 
389 ///////////////////////////////////////////////////////////////////////////////
OnSize(UINT nType,int cx,int cy)390 void trigger_frame::OnSize(UINT nType, int cx, int cy)
391 {
392     CWnd::OnSize(nType, cx, cy);
393 
394     PositionChildren();
395 }
396 
397 ///////////////////////////////////////////////////////////////////////////////
OnVScroll(UINT nSBCode,UINT nPos,CScrollBar * pScrollBar)398 void trigger_frame::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
399 {
400     // Compute the desired change or delta in scroll position.
401     m_scroll_helper->OnVScroll(nSBCode, nPos, pScrollBar);
402 }
403 
404 ///////////////////////////////////////////////////////////////////////////////
OnMouseWheel(UINT nFlags,short zDelta,CPoint pt)405 BOOL trigger_frame::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
406 {
407     BOOL wasScrolled = m_scroll_helper->OnMouseWheel(nFlags, zDelta, pt);
408     return wasScrolled;
409 }
410 
411 ///////////////////////////////////////////////////////////////////////////////
OnPaint()412 void trigger_frame::OnPaint()
413 {
414     CPaintDC dc(this);
415 
416     CRect rect;
417     CBrush fill_brush(GetSysColor(COLOR_3DFACE));
418     GetClientRect(&rect);
419 
420     dc.FillRect(rect, &fill_brush);
421 }
422 
423 ///////////////////////////////////////////////////////////////////////////////
OnSetFocus(CWnd * pOldWnd)424 void trigger_frame::OnSetFocus(CWnd* pOldWnd)
425 {
426     CWnd::OnSetFocus(pOldWnd);
427 
428     // TODO: Add your message handler code here
429     // Move focus to the selected row
430     AssignFocus(mSelectedRow);
431 }
432 
433 ///////////////////////////////////////////////////////////////////////////////
PreTranslateMessage(MSG * pMsg)434 BOOL trigger_frame::PreTranslateMessage(MSG* pMsg)
435 {
436     int pagesize;
437     CRect rect;
438 
439     // TODO: Add your specialized code here and/or call the base class
440     if (pMsg->message == WM_KEYDOWN)
441     {
442         switch (pMsg->wParam)
443         {
444         case VK_UP:
445             if (mSelectedRow > 0)
446             {
447                 SetSelectedRow(mSelectedRow - 1, TRUE);
448             }
449             return TRUE;
450 
451         case VK_DOWN:
452             if (mSelectedRow < mpTriggerList->GetCount() - 1)
453             {
454                 SetSelectedRow(mSelectedRow + 1, TRUE);
455             }
456             return TRUE;
457 
458         case VK_HOME:
459             if (mSelectedRow > 0)
460             {
461                 SetSelectedRow(0, TRUE);
462             }
463             break;
464 
465         case VK_END:
466             if (mSelectedRow < mpTriggerList->GetCount() - 1)
467             {
468                 SetSelectedRow(mpTriggerList->GetCount() - 1, TRUE);
469             }
470             break;
471 
472         case VK_PRIOR:
473             GetClientRect(&rect);
474             if (m_scroll_helper->Scroll(SB_VERT, -rect.Height()))
475             {
476                 pagesize = rect.Height() / mRowHeight;
477                 SetSelectedRow(max(0, mSelectedRow - pagesize), TRUE);
478             }
479             break;
480 
481         case VK_NEXT:
482             GetClientRect(&rect);
483             if (m_scroll_helper->Scroll(SB_VERT, rect.Height()))
484             {
485                 pagesize = rect.Height() / mRowHeight;
486                 SetSelectedRow(min(mpTriggerList->GetCount() - 1, mSelectedRow + pagesize), TRUE);
487             }
488             break;
489         }
490     }
491 
492     return CWnd::PreTranslateMessage(pMsg);
493 }
494 
495 ///////////////////////////////////////////////////////////////////////////////
AssignFocus(int rowId)496 void trigger_frame::AssignFocus(int rowId)
497 {
498     CWnd* child = GetWindow(GW_CHILD);
499 
500     while (child && rowId)
501     {
502         child = child->GetWindow(GW_HWNDNEXT);
503         rowId--;
504     }
505 
506     // move focus to selected row
507     if (child)
508     {
509         child->SetFocus();
510         child->Invalidate();
511     }
512 }
513 
514 ///////////////////////////////////////////////////////////////////////////////
SetSelectedRow(int rowId,bool assign_focus)515 void trigger_frame::SetSelectedRow(int rowId, bool assign_focus)
516 {
517     if (mSelectedRow != rowId)
518     {
519         mSelectedRow = rowId;
520         SelectedVisible();
521         Invalidate();
522 
523         if (assign_focus)
524         {
525             AssignFocus(rowId);
526         }
527     }
528 }
529 
530 ///////////////////////////////////////////////////////////////////////////////
SelectedVisible()531 void trigger_frame::SelectedVisible()
532 {
533     if (mSelectedRow >= 0)
534     {
535         int min_scroll_value = ((mSelectedRow + 1) * mRowHeight) - m_scroll_helper->GetPageSize().cy;
536         int max_scroll_value = min_scroll_value + m_scroll_helper->GetPageSize().cy - mRowHeight;
537 
538         if (min_scroll_value < 0)
539         {
540             min_scroll_value = 0;
541         }
542 
543         if (max_scroll_value > m_scroll_helper->GetDisplaySize().cy - m_scroll_helper->GetPageSize().cy)
544         {
545             max_scroll_value = m_scroll_helper->GetDisplaySize().cy - m_scroll_helper->GetPageSize().cy;
546         }
547 
548         int current_scroll_value = m_scroll_helper->GetScrollPos().cy;
549         if ((current_scroll_value < min_scroll_value) || (current_scroll_value > max_scroll_value))
550         {
551             // scroll so that selected item is visible
552             m_scroll_helper->SetScrollPos(SB_VERT, min_scroll_value);
553         }
554     }
555 }
556 
557 ///////////////////////////////////////////////////////////////////////////////
CreateTriggerRows()558 void trigger_frame::CreateTriggerRows()
559 {
560     int index;
561     trigger_row *row;
562     CWnd *child = GetWindow(GW_CHILD);
563 
564     while (child)
565     {
566         child->DestroyWindow();
567         delete child;
568         child = GetWindow(GW_CHILD);
569     }
570 
571     int rowcount = mpTriggerList->GetCount();
572     trigger_info* trigger;
573     CString row_name("");
574     for (index = 0; index < rowcount; index++)
575     {
576         row = new trigger_row(this, index, mpTriggerList);
577         trigger = mpTriggerList->GetAt(index);
578         if (trigger)
579         {
580             row_name = trigger->trigger_name;
581         }
582         row->Create(target_class_name, row_name, WS_VISIBLE | WS_CHILD, CRect(0, 0, 0, 0), this, 0);
583         SetControlAccessibleRole(row->GetSafeHwnd(), ROLE_SYSTEM_LISTITEM);
584 
585     }
586 }
587 
588 ///////////////////////////////////////////////////////////////////////////////
PositionChildren()589 void trigger_frame::PositionChildren()
590 {
591     int rowheight;
592     CRect client;
593     GetClientRect(&client);
594     CRect childsize = client;
595     trigger_row *row = (trigger_row *)GetWindow(GW_CHILD);
596 
597     if (row)
598     {
599         rowheight = mRowHeight;
600 
601         childsize.top -= (m_scroll_helper->GetScrollPos()).cy;
602         childsize.bottom = childsize.top + rowheight;
603 
604         while (row)
605         {
606             row->MoveWindow(&childsize);
607             childsize.top += rowheight;
608             childsize.bottom += rowheight;
609             row = (trigger_row *)row->GetWindow(GW_HWNDNEXT);
610         }
611     }
612 
613     m_scroll_helper->SetDisplaySize(0, mpTriggerList->GetCount() * mRowHeight);
614 
615     Invalidate();
616 }
617 
618 
619 ///////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(trigger_row,CWnd)620 BEGIN_MESSAGE_MAP(trigger_row, CWnd)
621     ON_WM_PAINT()
622     ON_WM_LBUTTONDOWN()
623     ON_WM_KILLFOCUS()
624 END_MESSAGE_MAP()
625 
626 ///////////////////////////////////////////////////////////////////////////////
627 trigger_row::trigger_row(CWnd *parent, int Id, CArray<trigger_info *> *trigger_list)
628 {
629     mRowId = Id;
630     frame = (trigger_frame *)parent;
631     mpTriggerList = trigger_list;
632 }
633 
634 ///////////////////////////////////////////////////////////////////////////////
OnPaint()635 void trigger_row::OnPaint()
636 {
637     CPaintDC dc(this);
638     CFont *old_font;
639     CRect boxrect;
640     CBrush brush;
641 
642     GetClientRect(&boxrect);
643 
644     dc.SetBkMode(TRANSPARENT);
645     old_font = dc.SelectObject(&NormalFont);
646     if (mRowId == frame->GetSelectedRow())
647     {
648 
649         //highlight selected item
650         if (GetFocus() == this)
651         {
652             brush.CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
653             dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
654         }
655         else
656         {
657             brush.CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
658             dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
659         }
660 
661         dc.FillRect(&boxrect, &brush);
662     }
663     else
664     {
665         brush.CreateSolidBrush(GetSysColor(COLOR_WINDOW));
666         dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
667         dc.FillRect(&boxrect, &brush);
668     }
669 
670     CPen line_pen;
671     line_pen.CreatePen(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));
672     CPen* old_pen = dc.SelectObject(&line_pen);
673 
674     // Draw control border
675     if (mRowId == 0)
676     {
677         dc.MoveTo(boxrect.left, boxrect.top);
678         dc.LineTo(boxrect.right, boxrect.top);
679     }
680 
681     dc.MoveTo(boxrect.left, boxrect.top);
682     dc.LineTo(boxrect.left, boxrect.bottom - 1);
683     dc.MoveTo(boxrect.right - 1, boxrect.top);
684     dc.LineTo(boxrect.right - 1, boxrect.bottom - 1);
685     dc.MoveTo(boxrect.left, boxrect.bottom - 1);
686     dc.LineTo(boxrect.right, boxrect.bottom - 1);
687     dc.SelectObject(old_pen);
688 
689     trigger_info* trigger = mpTriggerList->GetAt(mRowId);
690     if (trigger)
691     {
692         boxrect.left += 4;
693         dc.DrawText(trigger->trigger_name, boxrect, DT_LEFT | DT_TOP | DT_SINGLELINE | DT_VCENTER);
694     }
695 
696     dc.SelectObject(old_font);
697 }
698 
699 
700 ///////////////////////////////////////////////////////////////////////////////
OnLButtonDown(UINT nFlags,CPoint point)701 void trigger_row::OnLButtonDown(UINT nFlags, CPoint point)
702 {
703     frame->SetSelectedRow(mRowId);
704     frame->SetFocus();
705     CWnd::OnLButtonDown(nFlags, point);
706 }
707 
708 ///////////////////////////////////////////////////////////////////////////////
OnKillFocus(CWnd * pNewWnd)709 void trigger_row::OnKillFocus(CWnd* pNewWnd)
710 {
711     CWnd::OnKillFocus(pNewWnd);
712 
713     Invalidate();
714 }
715