C:\Life Game\Para4or6\Extended_Dialogs\ExtendedCommonDialogs.pro C:\Temp\Extended_Dialogs\ExtendedCommonDialogs.pro
1% 2014 Ferenc Nagy Budapest, Hungary 1% 2014 Ferenc Nagy Budapest, Hungary
2  2 
3implement extendedCommonDialogs 3implement extendedCommonDialogs
4    open core,vpi,vpiDomains,vpiCommonDialogs 4    open core,vpi,vpiDomains,vpiCommonDialogs
5  5 
6class facts 6class facts
7    ask_result:integer := 0. 7    ask_result:integer := 0.
8    default: positive :=0. 8    default: positive :=0.
9    right: integer:=265. %<== Fact for determination of the necessary width. 9    right: integer:=265. %<== Fact for determination of the necessary width.
10    bottom:integer:=0. %<== Fact for determination of the necessary bottom. 10    bottom:integer:=0. %<== Fact for determination of the necessary bottom.
11   
12constants  
13   % Alignment of button titles.  
14   alignment :wsflag = wsf_AlignCenter.  
15   
16class facts - height_correction % 2016.04.24.  
17    % Height factor.  
18   height_factor : real  :=1.5.  
19   % Fixed additon to text height.  
20   height_plus  : positive:= 5.  
21    % Vertical gap between buttons.  
22   vertical_gap : positive := 10.  
23   
24clauses 11clauses
25    ask(Title, Prompt, ButtonTitlesList,Default) = ask_result :- 12    ask(Title, Prompt, ButtonTitlesList,Default) = ask_result :-
26        L=list::length(ButtonTitlesList), 13        L=list::length(ButtonTitlesList),
27        bottom:=2,  14        bottom:=40+20*L, 
28        Parent=vpi::getParentWindow(), 15        Parent=vpi::getParentWindow(),
29        ParentFont=winGetFont(Parent), 16        ParentFont=winGetFont(Parent),
30        fontGetAttrs(ParentFont,_,_)=FontName, 17        fontGetAttrs(ParentFont,_,_)=FontName,
31        Flags=[wsf_Group,wsf_TabStop,alignment ],  18        Static=ctl( 
  19            wdef(wc_Text,rct(2,2,152,20*L),
  20                Prompt,u_DlgBase),10001,[wsf_AlignCenter]),
  21        Flags=[wsf_Group,wsf_TabStop,wsf_AlignCenter ],
32        FlagsD=[wsf_Default|Flags], 22        FlagsD=[wsf_Default|Flags],
33        winGetTextExtent(Parent,"WW",WW,_),  
34        Ctl_List= 23        Ctl_List=
  24            [
35            [ CtlI ||  25            CtlI 
  26            ||
36            I=std::fromTo(0,L-1), 27            I=std::fromTo(0,L-1),
37            if I=Default then FlagsI=FlagsD else FLagsI=Flags end if, 28            if I=Default then FlagsI=FlagsD else FLagsI=Flags end if,
38            ButtonTitle=list::nth(convert(positive,I),ButtonTitlesList), 29            ButtonTitle=list::nth(convert(positive,I),ButtonTitlesList),
39            % 2016.04.01. These lines determine the necessary with and height of the buttons based on the estimated text extent. 30            % 2016.04.01. These lines determine the necessary with and height of the buttons based on the estimated text extent.
40            winGetTextExtent(Parent,ButtonTitle,WT,H),  31            winGetTextExtent(Parent,ButtonTitle,W,H), 
41            Right=155+WT+WW,  32            Right=math::max(210,165+W), 
42            Top=bottom,  33            Bottom=17+math::max(H+5,20)*I, 
43            Bottom=bottom+math::round(H*height_factor)+height_plus,  
44            right:=math::max(Right,right), 34            right:=math::max(Right,right),
  35            bottom:=math::max(bottom,Bottom),
45            CtlI=ctl( 36            CtlI=ctl(
46                    wdef(wc_PushButton,rct(155,Top,Right,Bottom),ButtonTitle,u_DlgBase),  37                    wdef(wc_PushButton,rct(155,5+20*I,Right,Bottom),ButtonTitle,u_DlgBase), 
47                    I,FlagsI),  
48            bottom:=Bottom+vertical_gap  
49            ],  
50        % 2016.04.24. Equalize control widths.  
51        Mod_Ctl_List =  
52            [ Mod_Ctl ||  
53                ctl(  
54                    wdef(wc_PushButton,rct(Left0,Top0,_Right0,Bottom0),ButtonTitle,u_DlgBase),  
55                    I,FlagsI) in Ctl_List,  
56                Mod_Ctl=ctl(  
57                    wdef(wc_PushButton,rct(Left0,Top0,right,Bottom0),ButtonTitle,u_DlgBase),  
58                    I,FlagsI) 38                    I,FlagsI)
59            ], 39            ],
60        % 2016.04.01. Final stretch of the window rectangle. 40        % 2016.04.01. Final stretch of the window rectangle.
61        RCT=rct(50,40,right+60,bottom+40),  41        RCT=rct(50,40,right+60,bottom+10), 
62        Static=ctl(  
63            wdef(wc_Text,rct(2,2,152,bottom-2),  
64                Prompt,u_DlgBase),10001,[alignment]),  
65        FontDef=dlgFont( 42        FontDef=dlgFont(
66            wdef(wd_Modal,RCT,Title,u_DlgBase),FontName,8,[wsf_TitleBar]), 43            wdef(wd_Modal,RCT,Title,u_DlgBase),FontName,8,[wsf_TitleBar]),
67        default:=math::min(L-1,Default), 44        default:=math::min(L-1,Default),
68        _ = vpi::winCreateDynDialog(Parent,[FontDef,Static|Mod_Ctl_List],  45        _ = vpi::winCreateDynDialog(Parent,[FontDef,Static|Ctl_List], 
69            dlg_ask_eh,gui_api::lNull). 46            dlg_ask_eh,gui_api::lNull).
70  47 
71class predicates 48class predicates
72    dlg_ask_eh : ehandler. 49    dlg_ask_eh : ehandler.
73clauses 50clauses
74    dlg_ask_eh(Win,e_Create(_))=gui_api::rNull :- 51    dlg_ask_eh(Win,e_Create(_))=gui_api::rNull :-
75        H=winGetCtlHandle(Win,convert(ctlId,default)), 52        H=winGetCtlHandle(Win,convert(ctlId,default)),
76        winSetFocus(H). 53        winSetFocus(H).
77  54 
78    dlg_ask_eh(Win,e_Control(I,_,_,_CtrlInfo)) = gui_api::rNull:- 55    dlg_ask_eh(Win,e_Control(I,_,_,_CtrlInfo)) = gui_api::rNull:-
79        ask_result := I, 56        ask_result := I,
80        vpi::winDestroy(Win). 57        vpi::winDestroy(Win).
81  58 
82end implement extendedCommonDialogs 59end implement extendedCommonDialogs