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