menuitem.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /********************************************************************** <BR>
  2. This file is part of Crack dot Com's free source code release of
  3. Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
  4. information about compiling & licensing issues visit this URL</a>
  5. <PRE> If that doesn't help, contact Jonathan Clark at
  6. golgotha_source@usa.net (Subject should have "GOLG" in it)
  7. ***********************************************************************/
  8. #include "menu/menuitem.hh"
  9. #include "window/win_evt.hh"
  10. #include "window/style.hh"
  11. i4_menu_item_class::i4_menu_item_class(const i4_const_str *idle_context_help,
  12. i4_graphical_style_class *hint,
  13. w16 w, w16 h,
  14. i4_event_reaction_class *press,
  15. i4_event_reaction_class *depress,
  16. i4_event_reaction_class *activate,
  17. i4_event_reaction_class *deactivate
  18. ) :
  19. i4_parent_window_class(w,h),
  20. hint(hint)
  21. {
  22. if (idle_context_help)
  23. context_help=new i4_str(*idle_context_help);
  24. else
  25. context_help=0;
  26. send.press=press;
  27. send.depress=depress;
  28. send.activate=activate;
  29. send.deactivate=deactivate;
  30. menu_parent=0;
  31. active=i4_F;
  32. pressed=i4_F;
  33. disabled=i4_F;
  34. }
  35. void i4_menu_item_class::send_event(i4_event_reaction_class *ev, reaction_type type)
  36. {
  37. if (menu_parent)
  38. menu_parent->note_reaction_sent(this, ev, type);
  39. if (ev && ev->event && ev->handler_reference.get())
  40. i4_kernel.send_event(ev->handler_reference.get(), ev->event);
  41. }
  42. void i4_menu_item_class::receive_event(i4_event *ev)
  43. {
  44. i4_parent_window_class::receive_event(ev);
  45. if (!disabled)
  46. {
  47. if (ev->type()==i4_event::MOUSE_BUTTON_UP || ev->type()==i4_event::MOUSE_BUTTON_DOWN)
  48. if (context_help_window.get())
  49. i4_kernel.delete_handler(context_help_window.get());
  50. if (ev->type()==i4_event::WINDOW_MESSAGE)
  51. {
  52. CAST_PTR(w,i4_window_message_class,ev);
  53. switch (w->sub_type)
  54. {
  55. case i4_window_message_class::GOT_KEYBOARD_FOCUS :
  56. case i4_window_message_class::GOT_MOUSE_FOCUS :
  57. {
  58. do_activate();
  59. send_event(send.activate, ACTIVATED);
  60. } break;
  61. case i4_window_message_class::LOST_KEYBOARD_FOCUS :
  62. case i4_window_message_class::LOST_MOUSE_FOCUS :
  63. {
  64. if (context_help_window.get())
  65. {
  66. i4_window_class *w=context_help_window.get();
  67. context_help_window=0;
  68. i4_kernel.delete_handler(w);
  69. }
  70. do_deactivate();
  71. send_event(send.deactivate, DEACTIVATED);
  72. } break;
  73. }
  74. }
  75. else if (ev->type()==i4_event::IDLE_MESSAGE)
  76. do_idle();
  77. }
  78. }
  79. void i4_menu_item_class::do_idle()
  80. {
  81. if (!context_help_window.get() && context_help)
  82. context_help_window=hint->create_quick_context_help(x(), y()+height()+5, *context_help);
  83. }
  84. void i4_menu_item_class::do_activate()
  85. {
  86. if (!active)
  87. {
  88. active=i4_T;
  89. request_redraw();
  90. }
  91. }
  92. void i4_menu_item_class::do_deactivate()
  93. {
  94. if (active)
  95. {
  96. active=i4_F;
  97. request_redraw();
  98. }
  99. }
  100. void i4_menu_item_class::do_disable()
  101. {
  102. if (!disabled)
  103. {
  104. disabled=i4_T;
  105. request_redraw();
  106. }
  107. }
  108. void i4_menu_item_class::do_undisable()
  109. {
  110. if (disabled)
  111. {
  112. disabled=i4_F;
  113. request_redraw();
  114. }
  115. }
  116. void i4_menu_item_class::do_press()
  117. {
  118. if (!pressed)
  119. {
  120. pressed=i4_T;
  121. request_redraw();
  122. }
  123. }
  124. void i4_menu_item_class::do_depress()
  125. {
  126. if (pressed)
  127. {
  128. pressed=i4_F;
  129. request_redraw();
  130. }
  131. }
  132. i4_menu_item_class::~i4_menu_item_class()
  133. {
  134. if (context_help_window.get())
  135. i4_kernel.delete_handler(context_help_window.get());
  136. if (context_help)
  137. delete context_help;
  138. if (send.press)
  139. delete send.press;
  140. if (send.depress)
  141. delete send.depress;
  142. if (send.activate)
  143. delete send.activate;
  144. if (send.deactivate)
  145. delete send.deactivate;
  146. }