1:- module(pce_select_set_item, []).
2:- use_module(library(pce)).
3:- use_module(library(pce_util)).
4
5resource(back,    image, image('16x16/back.xpm')).
6resource(forward, image, image('16x16/forward.xpm')).
7
8:- pce_begin_class(select_set_item, dialog_group,
9                   "Select objects from a set").
10
11initialise(SSI, Name:name, Width:[int], Height:[int]) :->
12    send_super(SSI, initialise, Name, group),
13    send(SSI, attribute, hor_stretch, 100),
14    send(SSI, attribute, ver_stretch, 100),
15    send(SSI, attribute, ver_shrink, 100),
16    send(SSI, display, new(LB, list_browser(@default, Width, Height))),
17    send(LB, name, left),
18    send(LB, multiple_selection, @on),
19    send(SSI, display, new(RB, list_browser(@default, Width, Height))),
20    send(RB, name, right),
21    send(RB, multiple_selection, @on),
22    send(SSI, display, new(Back, button(back))),
23    send(Back, label, image(resource(back))),
24    send(SSI, display, new(Forw, button(forward))),
25    send(Forw, label, image(resource(forward))),
26    get(LB?area, size, size(BW, BH)),
27    send(SSI, size, size(BW*2+50, BH)),
28    send(SSI, layout_dialog).
29
30layout_dialog(SSI) :->
31    get(SSI, size, size(TW, TH)),
32    (   get(SSI, border, size(BW, BH))
33    ->  true
34    ;   get(SSI, gap, size(BW, BH))
35    ),
36    get(SSI, member, left, LB),
37    get(SSI, member, right, RB),
38    get(SSI, member, forward, B1),
39    get(SSI, member, back, B2),
40    BrowserSep = 50,
41    BrowserWidth is (TW-2*BW-BrowserSep)//2,
42    BrowserHeight is (TH-2*BH),
43    send(LB, do_set,
44         BW, BH,
45         BrowserWidth, BrowserHeight),
46    send(RB, do_set,
47         BW+BrowserWidth+BrowserSep, BH,
48         BrowserWidth, BrowserHeight),
49    get(B1, size, size(B1W, B1H)),
50    ButtonW is BW + BrowserWidth + (BrowserSep-B1W)//2,
51    B1Y is BH + (BrowserHeight-2*B1H-15)/2,
52    B2Y is B1Y + B1H + 15,
53    send(B1, set, ButtonW, B1Y),
54    send(B2, set, ButtonW, B2Y).
55
56forward(SSI) :->
57    "Move objects from left to right"::
58    get(SSI, member, left, LB),
59    get(SSI, member, right, RB),
60    get(LB, selection, Chain),
61    send(Chain, for_all, message(RB, append, @arg1)),
62    send(RB, sort).
63
64back(SSI) :->
65    "Move objects from right to left"::
66    get(SSI, member, left, LB),
67    get(SSI, member, right, RB),
68    get(RB, selection, Chain),
69    send(Chain, for_all, message(LB, append, @arg1)),
70    send(LB, sort).
71
72append(SSI, DI:dict_item) :->
73    "Append item to the set to select from"::
74    get(SSI, member, left, LB),
75    send(LB, append, DI).
76
77clear(SSI) :->
78    "Clear left browser"::
79    get(SSI, member, left, LB),
80    send(LB, clear).
81
82selection(SSI, Items:chain) :<-
83    "Get currently selected items"::
84    get(SSI, member, right, RB),
85    get(RB, members, Items).
86
87:- pce_end_class(select_set_item).
88
89
90/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
91test :-
92        D = @d,
93        free(D),
94        new(D, dialog),
95        send(D, append, new(S, select_set_item(files))),
96        expand_file_name('*.train', Files),
97        send_list(S, append, Files),
98        send(D, resize_message, message(D, layout, D?size)),
99        send(D, append, button(ok,
100                               message(@prolog, portray_object,
101                                       S?selection))),
102        send(D, append, button(cancel, message(D, destroy))),
103        send(D, open).
104- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
105
106
107
108