Scripts/Splitter

Splitter control for dynamically resizing boundary between two or more controls. It has a vertical and horizontal variety. It is capable of having multiple splitters in one window.

Constructor boxed parameters:
   [0] splitter control ID
   [1] left/top adjacent control ids (space delimited string or boxed list)
   [2] right/bottom adjacent control ids

Horizontal variety is signaled by the trailing h in the splitter id.

It is very easy to use, as event hook-up is done automatically. For example, the following window is produced by the script below:

split.png

Implementation

Below is the component code rendered in Literate style.

There are two variants: line dragging and real-time resize. Most of the code is the same, so only the differences are defined separately. Some definitions are only present in one variant.

Line Dragging

This verion will drag a line before resize, which happens on mouse release.

«split.ijs»= Line drag version
NB. split.ijs - splitter control
«main»

Real-Time Resize

In real-time resize, the related controls are resized while the mouse is still dragging the splitter.

«splitreal.ijs»= Real-time resize
NB. splitreal.ijs - splitter control, real-time resize
«main»

Common

The main structure of the component.

«main»=
NB. http://www.jsoftware.com/pipermail/general/2003-October/014971.html
NB. 07/14/2003 Oleg Kobchenko
NB. 07/15/2006 Oleg Kobchenko - j601, componentized
NB. 08/16/2006 Oleg Kobchenko - real-time resize
NB. 03/23/2007 Oleg Kobchenko - literate

«imports and locale declarations»

«globals»

«create and destroy»

«events»

«logic»

jgl2 locale is inserted for access to 2D routines.

«imports and locale declarations»=
require'gl2'

coclass 'psplit'
coinsert'jgl2'

Here we define utility verbs and global configurable settings.

«globals»=
wfopen=: ;:^:(0=L.)
crot=: [:  ,  _2 |.\  ]
irot=: [: ,./ _2 ]\"1 ]

FG=: 3#127
BG=: 210 200 190

Create parameters include control ID, controls before and controls after. Control events are assigned in the parent form.

«create and destroy»=
create=: 3 : 0
  HZ=:'h'={: ID=: 0{::y
  LC=:  wfopen    1{::y
  RC=:  wfopen    2{::y
  nm=. >coname''
  pn=. >{:<;._2 wd'qp'
  (pn,'_',ID,'_paint__COCREATOR')   =: ('paint_',  nm,'_')~
  (pn,'_',ID,'_mbldown__COCREATOR') =: ('mbldown_',nm,'_')~
  (pn,'_',ID,'_mblup__COCREATOR')   =: ('mblup_',  nm,'_')~
  «move event»
  CAPT=: ''
)

destroy=: codestroy

For realsplit we track mouse move events.

and need a corresponding event handler.

Handlers of the events assigned in parent form.

«events»=
paint=: 3 : 0
  glclear''
  glcursor HZ { IDC_SIZEWE,IDC_SIZENS
  glpen 0,0 [ glbrush glrgb BG
  glrect 0 0 , glqwh''
  glpen 1,0 [ glrgb FG
  wh=. <. , (|.^:HZ 0.25 0.75,:0.4 0.6) * glqwh''
  gllines (irot^:HZ 0 2  0 3 ,:1 2 1 3) { wh
)

mbldown=: 3 : 0
  glsel ID      NB. is it really necessary?
  «set capture»
  CAPT=: HZ{".sysdata__COCREATOR
)

mblup=: 3 : 0
  if. 0=#CAPT do. return. end.
  glcapture 0
  «release capture»
  CAPT=: ''
)

«mouse move»

where in line dragging split we show horizontal or vertical line

moving the controls only on release

and hidden capture for real-time resize,

while nothing needs to be done on release.

The logic supports event processing.

«logic»=
move=: 3 : 0
     LC setp crot^:HZ 0 0, y, 0
 (< ID) setp crot^:HZ y,0  0  0
     RC setp crot^:HZ y,0,-y, 0
)

setp=: 4 : 0"0 1
  pos=. ".wd'qchildxywhx ',>x
  wd'setxywhx ',(>x),' ',":pos+y
)

Example

Usage is the same for both versions.

«test.ijs»=
require '~user/split.ijs'   NB. or 'splitreal.ijs'

TEST=: 0 : 0
pc test;
xywh 6 6 44 61;cc ok button bottommove;cn "OK";
xywh 6 69 44 14;cc b1 button topmove bottommove;
xywh 6 86 44 14;cc b2 button topmove bottommove;
xywh 51 6 3 94;cc splitv isigraph bottommove;
xywh 55 6 111 28;cc b3 button rightmove;
xywh 169 6 31 28;cc b4 button leftmove rightmove;
xywh 54 35 146 3;cc splith isigraph rightmove;
xywh 55 39 145 62;cc cancel button rightmove bottommove;cn "Cancel";
pas 6 6;pcenter;
rem form end;
)

test_run=: 3 : 0
  wd TEST
  spv=: 'psplit' conew~ 'splitv';'ok b1 b2';'b3 splith cancel'
  sph=: 'psplit' conew~ 'splith';'b3 b4'   ;'cancel'
  wd 'pshow;'
)

test_close=: 3 : 0
  destroy__spv''
  destroy__sph''
  wd'pclose'
)

test_run''

CategoryLiterate
Contributed by OlegKobchenko

last edited 2008-02-07 07:29:10 by OlegKobchenko