divider.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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 "gui/divider.hh"
  9. #include "window/style.hh"
  10. #include "window/win_evt.hh"
  11. void i4_divider_class::reparent(i4_image_class *draw_area, i4_parent_window_class *parent)
  12. {
  13. if (parent && (w_attached && width()!=parent->width() ||
  14. h_attached && height()!=parent->height()))
  15. {
  16. int nw=w_attached ? parent->width() : width();
  17. int nh=h_attached ? parent->height() : height();
  18. resize(nw,nw);
  19. }
  20. i4_parent_window_class::reparent(draw_area, parent);
  21. }
  22. void i4_divider_class::resize(w16 new_width, w16 new_height)
  23. {
  24. if (w_attached && parent)
  25. new_width=parent->width();
  26. if (h_attached && parent)
  27. new_height=parent->height();
  28. i4_parent_window_class::resize(new_width, new_height);
  29. int x1,y1,x2,y2;
  30. get_drag_area(x1,y1,x2,y2);
  31. if (split_up_down)
  32. {
  33. if (w1.get())
  34. {
  35. remove_child(w1.get());
  36. if (y1<0) y1=0;
  37. w1->resize(new_width, y1);
  38. add_child(0,0,w1.get());
  39. }
  40. if (w2.get())
  41. {
  42. remove_child(w2.get());
  43. int nh=new_height-y2;
  44. if (nh<0) nh=0;
  45. w2->resize(w, nh);
  46. add_child(0,y2+1, w2.get());
  47. }
  48. }
  49. else
  50. {
  51. if (w1.get())
  52. {
  53. remove_child(w1.get());
  54. if (x1<0) x1=0;
  55. w1->resize(x1, new_height);
  56. add_child(0,0,w1.get());
  57. }
  58. if (w2.get())
  59. {
  60. remove_child(w2.get());
  61. int nw=new_width-x2;
  62. if (nw<0) nw=0;
  63. w2->resize(nw, new_height);
  64. add_child(x2+1,0, w2.get());
  65. }
  66. }
  67. }
  68. void i4_divider_class::get_drag_area(int &x1, int &y1, int &x2, int &y2)
  69. {
  70. w32 l,r,t,b;
  71. style->get_out_deco_size(l,t,r,b);
  72. if (split_up_down)
  73. {
  74. int vbh=t+b;
  75. y1=split_value-vbh/2;
  76. y2=y1+vbh-1;
  77. x1=0; x2=width()-1;
  78. }
  79. else
  80. {
  81. int vbw=l+r;
  82. x1=split_value-vbw/2;
  83. x2=x1+vbw-1;
  84. y1=0;
  85. y2=height()-1;
  86. }
  87. }
  88. i4_divider_class::i4_divider_class(int w, int h,
  89. i4_bool split_up_down,
  90. int split_x_or_y,
  91. i4_window_class *window1,
  92. i4_window_class *window2,
  93. i4_graphical_style_class *style,
  94. int window1_min_size,
  95. int window2_min_size)
  96. : split_up_down(split_up_down),
  97. split_value(split_x_or_y),
  98. style(style),
  99. i4_parent_window_class(w,h),
  100. min1(window1_min_size),
  101. min2(window2_min_size)
  102. {
  103. w1=window1;
  104. w2=window2;
  105. if (w==-1)
  106. {
  107. w_attached=i4_T;
  108. w=0;
  109. }
  110. else
  111. w_attached=i4_F;
  112. if (h==-1)
  113. {
  114. h=0;
  115. h_attached=i4_T;
  116. }
  117. else
  118. h_attached=i4_F;
  119. dragging=i4_F;
  120. if (split_x_or_y==-1)
  121. {
  122. if (split_up_down)
  123. split_value=h/2;
  124. else
  125. split_value=w/2;
  126. }
  127. w1=window1;
  128. w2=window2;
  129. add_child(0,0, window1);
  130. add_child(0,0, window2);
  131. resize(w,h);
  132. }
  133. void i4_divider_class::parent_draw(i4_draw_context_class &context)
  134. {
  135. int x1,y1,x2,y2;
  136. get_drag_area(x1,y1,x2,y2);
  137. local_image->add_dirty(x1,y1,x2,y2, context);
  138. style->draw_out_deco(local_image, x1,y1, x2,y2, i4_F, context);
  139. }
  140. void i4_divider_class::receive_event(i4_event *ev)
  141. {
  142. switch (ev->type())
  143. {
  144. case i4_event::MOUSE_BUTTON_DOWN :
  145. {
  146. CAST_PTR(bev, i4_mouse_button_down_event_class, ev);
  147. if (bev->left())
  148. {
  149. int x1,y1,x2,y2;
  150. get_drag_area(x1,y1,x2,y2);
  151. if (bev->x>=x1 && bev->x<=x2 &&
  152. bev->y>=y1 && bev->y<=y2)
  153. {
  154. dragging=i4_T;
  155. i4_window_request_mouse_grab_class grab(this);
  156. i4_kernel.send_event(parent, &grab);
  157. }
  158. else i4_parent_window_class::receive_event(ev);
  159. }
  160. else i4_parent_window_class::receive_event(ev);
  161. } break;
  162. case i4_event::MOUSE_BUTTON_UP :
  163. {
  164. CAST_PTR(bev, i4_mouse_button_up_event_class, ev);
  165. if (dragging && bev->left())
  166. {
  167. dragging=i4_F;
  168. i4_window_request_mouse_ungrab_class ungrab(this);
  169. i4_kernel.send_event(parent, &ungrab);
  170. }
  171. else i4_parent_window_class::receive_event(ev);
  172. } break;
  173. case i4_event::MOUSE_MOVE :
  174. {
  175. CAST_PTR(mev, i4_mouse_move_event_class, ev);
  176. if (dragging)
  177. {
  178. if (split_up_down)
  179. {
  180. if (mev->y!=split_value && mev->y>min1 && height()-mev->y>min2)
  181. {
  182. split_value=mev->y;
  183. resize(width(), height());
  184. }
  185. }
  186. else if (mev->y!=split_value && mev->x>min1 && width()-mev->x>min2)
  187. {
  188. split_value=mev->x;
  189. resize(width(), height());
  190. }
  191. }
  192. else i4_parent_window_class::receive_event(ev);
  193. } break;
  194. default:
  195. i4_parent_window_class::receive_event(ev);
  196. }
  197. }