[Oberon] WMDialogs.Mod

Stauber Sven Philipp staubesv at student.ethz.ch
Mon Mar 19 17:10:23 MET 2007


Dear SAGE,
 
I've integrated the change below into WMDialogs.Mod. 
Some questions:
- "UID:" sounds kind of cryptical. What about "User:" or "Username:"?
- Why do you add this extra server... button? An alternative would be to have three editors (user, password, server). That way, the user could always see to what server he's connecting. What do you think?
 
If that's okay for you, I'll put the changes in WMDialogs.Mod (containing the code provided by you) into the next release.
 
BTW: Utilities.Buffer.Add: Thanks for reporting the bug. Bugfix will be contained in the next release.
 
Best regards,
Sven Stauber

________________________________

From: oberon-bounces at lists.inf.ethz.ch on behalf of Yaroslav Romanchenko
Sent: Sat 17.03.2007 18:28
To: oberon list
Subject: [Oberon] WMDialogs.Mod



Folk,

I need to extend base object WMDialogs.Dialog and have to copy into my
module such procedures as InstantiateButton, FindComponent, FindButton
and WireError method because they not exported from module WMDialogs.

And will be useful to have ability to read width an height of dialog
window for more precise positioning (in center of view, for example).
Example of dialog:

    LoginDlg = OBJECT (WMDialogs.Dialog)
    VAR editLogin, editPassword: WMEditors.Editor;
        buttonPanel: WMStandardComponents.Panel;
        server, ok, abort: WMStandardComponents.Button;
        content: WMComponents.VisualComponent;
        width-, height-: LONGINT;
        serverString-: ARRAY 256 OF CHAR;
      
        PROCEDURE &New (serverStr: ARRAY OF CHAR);
        BEGIN
      
            (*serverString := serverStr;*)
            COPY (serverStr, serverString);
          
            errors := FALSE;
            CreateDialog;
            WireDialog;
          
            width := content.bounds.GetWidth ();
            height := content.bounds.GetHeight ();
          
            Init (width, height, FALSE);
            SetContent (content);
          
            IF editLogin # NIL THEN editLogin.SetFocus;
editLogin.SetFocus  END
          
        END New;
      
        PROCEDURE GetServer*(sender, data:PTR);
        VAR
            res: LONGINT;
        BEGIN
            res := QueryString ("Server", serverString);
        END GetServer;

        PROCEDURE CreateDialog;
        VAR
            panel: WMStandardComponents.Panel;
            labelLogin, labelPassword: WMStandardComponents.Label;
            manager: WM.WindowManager;
            windowStyle: WM.WindowStyle;
        CONST
            width = 12 * 18; height = 12 * 9;
            BWidth = 12 * 5; BHeight = 20;
        BEGIN
          
            manager := WM.GetDefaultManager ();
            windowStyle := manager.GetStyle ();          
          
            NEW (panel); panel.bounds.SetExtents (width, height);
            panel.fillColor.Set (windowStyle.bgColor);
            panel.takesFocus.Set (FALSE);
          
            NEW (labelLogin);
            labelLogin.bounds.Set (WMRectangles.MakeRect (12, 12, 12 *
6, 12 + 20));
            labelLogin.SetCaption ("UIN:");
            labelLogin.alignH.Set (WMGraphics.AlignRight);
            panel.AddContent (labelLogin);

            NEW (labelPassword);
            labelPassword.bounds.Set (WMRectangles.MakeRect (12, 12 * 4,
12 * 6, 12 * 4 + 20));
            labelPassword.SetCaption ("Password:");
            labelPassword.alignH.Set (WMGraphics.AlignRight);
            panel.AddContent (labelPassword);
          
            NEW (editLogin); editLogin.uid.SetAOC ("Login");
            editLogin.tv.defaultTextColor.Set (windowStyle.fgColor);
            editLogin.tv.defaultTextBgColor.Set (windowStyle.bgColor);
            editLogin.bounds.Set(WMRectangles.MakeRect (12 * 7, 12,
width - 12, 12 + 20));
            panel.AddContent (editLogin);
            editLogin.multiLine.Set (FALSE); editLogin.tv.borders.Set
(WMRectangles.MakeRect(5, 2, 3, 2));
            editLogin.tv.showBorder.Set (TRUE);
          
            NEW (editPassword); editPassword.uid.SetAOC ("Password");
            editPassword.tv.defaultTextColor.Set (windowStyle.fgColor);
            editPassword.tv.defaultTextBgColor.Set (windowStyle.bgColor);
            editPassword.tv.isPassword.Set (TRUE);
            editPassword.bounds.Set (WMRectangles.MakeRect (12 * 7, 12 *
4, width - 12, 12 * 4 + 20));
            panel.AddContent (editPassword);
            editPassword.multiLine.Set (FALSE);
editPassword.tv.borders.Set (WMRectangles.MakeRect(5, 2, 3, 2));
            editPassword.tv.showBorder.Set (TRUE);
          
            NEW (buttonPanel);
            buttonPanel.bounds.SetHeight (BHeight);
            buttonPanel.alignment.Set (WMComponents.AlignBottom);
            panel.AddContent (buttonPanel);

            abort := InstantiateButton (WMDialogs.AbortBtnId, "Abort");
buttonPanel.AddContent (abort);
            abort.bounds.SetWidth (BWidth); abort.alignment.Set
(WMComponents.AlignRight);
          
            ok := InstantiateButton (WMDialogs.OkBtnId, "Ok");
buttonPanel.AddContent (ok);
            ok.bounds.SetWidth (BWidth); ok.alignment.Set
(WMComponents.AlignRight);
          
            NEW (server); server.caption.SetAOC ("Server...");
            buttonPanel.AddContent (server);
            server.bounds.SetWidth (BWidth);
            server.alignment.Set (WMComponents.AlignRight);

            content := panel
        END CreateDialog;
      
        PROCEDURE WireDialog;
        VAR c: WMComponents.Component;
        BEGIN
            c := FindComponent (content, "Login");
            IF (c # NIL) & (c IS WMEditors.Editor) THEN editLogin := c
(WMEditors.Editor) END;
          
            IF editLogin = NIL THEN
                WireError ("LoginDlg", "Required component 'Login' not
found."); RETURN
            END;
          
            c := FindComponent (content, "Password");
            IF (c # NIL) & (c IS WMEditors.Editor) THEN editPassword :=
c (WMEditors.Editor) END;
          
            IF editPassword = NIL THEN
                WireError ("LoginDlg", "Required component 'Password'
not found."); RETURN
            END;
          
            ok := FindButton (content, WMDialogs.OkBtnId);
            abort := FindButton (content, WMDialogs.AbortBtnId);
            IF ok = NIL THEN WireError ("LoginDlg", "Required component
'Ok' not found."); RETURN END;
            IF abort = NIL THEN WireError ("LoginDlg", "Required
component 'Abort' not found."); RETURN END;
          
            ok.onClick.Add (Ok);
            abort.onClick.Add (Abort);
            editLogin.onEnter.Add (Ok);
            editPassword.onEnter.Add (Ok);
            server.onClick.Add (GetServer);
        END WireDialog;
      
        PROCEDURE WireError(detectedBy, msg: ARRAY OF CHAR);
        BEGIN
            errors := TRUE;
            Out.String ("WMDialogs - Wiring error : ");
            Out.String(detectedBy); Out.String(" - "); Out.String(msg);
Out.Ln;
        END WireError;
  
    END LoginDlg;

PROCEDURE QueryLogin*(caption: ARRAY OF CHAR;
    VAR server, login, password: ARRAY OF CHAR) : LONGINT;
VAR
    ld: LoginDlg;
    vp: WM.ViewPort;
BEGIN
    NEW(ld, server);
    IF ~ld.errors THEN
        ld.SetTitle(Utilities.NewString(caption));
ld.editLogin.SetAsString(login); ld.editLogin.tv.SelectAll();
        vp := WM.GetDefaultView ();
        ld.x := (ENTIER (vp.range.r - vp.range.l) - ld.width) DIV 2;
        ld.y := (ENTIER (vp.range.b - vp.range.t) - ld.height) DIV 2;
ld.Show;
        IF ld.result = WMDialogs.ResOk THEN
            ld.editLogin.GetAsString(login);
            ld.editPassword.GetAsString(password);
            (*server := ld.serverString;*)
            COPY (ld.serverString, server);
        END;
        RETURN ld.result
    ELSE RETURN WMDialogs.ResDialogFailure
    END
END QueryLogin;

--
Cheers, SAGE
http://sage.h15.ru/

--
Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
https://lists.inf.ethz.ch/mailman/listinfo/oberon




More information about the Oberon mailing list