Graphics demos: improve Complex elementary functions -> Custom 34/14434/9
Paul Bignier [Thu, 17 Apr 2014 15:07:06 +0000 (17:07 +0200)]
Reworked to fit window on resize.

Change-Id: I64f766f5d5b7ab4ae063362b6cf9dd0db485543a

scilab/modules/graphics/demos/cmplxfunc/demo_custom.dem.sce

index 1b74c69..4cbeefd 100644 (file)
@@ -1,5 +1,6 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2008 - DIGITEO
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
 //
 // This file is released under the 3-clause BSD license. See COPYING-BSD.
 
@@ -7,36 +8,18 @@ funcprot(0);
 
 function demo_custom()
 
-    global margin_x;
-    global margin_y;
-
-    global padding_x;
-    global padding_y;
-
-    global frame_w;
-    global frame_h;
-
-    global plot_w;
-    global plot_h;
-
     // Parameters
     // =========================================================================
 
     frame_w      = 300;     // Frame width
     frame_h      = 765;     // Frame height
 
-    plot_w       = 600;     // Plot width
+    plot_w       = 500;     // Plot width
     plot_h       = frame_h; // Plot height
 
     margin_x     = 15;      // Horizontal margin between each elements
     margin_y     = 15;      // Vertical margin between each elements
 
-    padding_x    = 10;      // Horizontal padding between each elements
-    padding_y    = 10;      // Vertical padding between each elements
-
-    button_w     = 100;     // Button width
-    button_h     = 30;      // Button height
-
     defaultfont  = "arial"; // Default Font
 
     // Figure creation
@@ -45,64 +28,69 @@ function demo_custom()
     axes_w       = 3*margin_x + frame_w + plot_w; // axes width
     axes_h       = 2*margin_y + frame_h;          // axes height (100 => toolbar height)
 
-    demo_fig = figure(100001);
-    clf(demo_fig,"reset");
+    fig_handle = figure( ...
+    "infobar_visible", "off", ...
+    "menubar", "none", ...
+    "toolbar", "none", ...
+    "default_axes", "on", ...
+    "layout", "gridbag", ...
+    "visible", "off", ...
+    "background", -2, ...
+    "figure_position", [0 0], ...
+    "axes_size", [axes_w axes_h], ...
+    "figure_name", _("Customize your complex function"));
+
+    // The plot will be in the right 2/3 of the figure
+    a = gca();
+    a.axes_bounds = [1/3 1 2/3 1];
+    a.tight_limits = "on";
+
+    c = createConstraints("gridbag", [2 1 2 1], [1 1], "vertical", "right");
+    // Create an empty panel on the right to occupy the 3/4 of the screen (figure plot)
+    empty_frame = uicontrol(fig_handle, "style", "frame","constraints", c);
+
+    c = createConstraints("gridbag", [1 1 1 5], [0.25 1], "both", "left", [0 0], [150 0]);
+    u = uicontrol(fig_handle, ...
+    "style", "frame", ...
+    "backgroundcolor", [1 1 1], ...
+    "layout", "border", ...
+    "constraints", c);
+
+    // Add top and bottom empty panels to pad the upcoming control panel
+    c = createConstraints("border", "top", [0 20]);
+    top = uicontrol(u, "style", "frame", "backgroundcolor", [1 1 1], "constraints", c);
+    c = createConstraints("border", "bottom", [0 20]);
+    bottom = uicontrol(u, "style", "frame", "backgroundcolor", [1 1 1], "constraints", c);
+
+    // Border for the control parameters frame
+    b_f_controlParams = createBorderFont("", 18);
+    b_l_controlParams = createBorder("line", "navy", 2);
+    b_controlParams   = createBorder("titled", b_l_controlParams, _("Control panel"), "center", "top", b_f_controlParams, "navy");
+
+    control_frame = uicontrol(u, ...
+    "style", "frame", ...
+    "backgroundcolor", [1 1 1], ...
+    "border", b_controlParams, ...
+    "layout", "gridbag", ...
+    "tag", "control_frame");
+
     demo_viewCode("demo_custom.dem.sce");
 
-    demo_fig.background      = -2;
-    demo_fig.color_map       = jetcolormap(128);
-    demo_fig.figure_position = [0 0];
-    demo_fig.axes_size       = [axes_w axes_h];
-    demo_fig.figure_name     = gettext("Customize your complex function");
+    fig_handle.color_map = jetcolormap(128);
 
     // Frames creation [Control Panel]
     // =========================================================================
 
-    my_frame = uicontrol( ...
-    "parent"              , demo_fig,...
-    "relief"              , "groove",...
-    "style"               , "frame",...
-    "units"               , "pixels",...
-    "position"            , [ margin_x margin_y frame_w frame_h],...
-    "fontname"            , "arial",...
-    "fontunits"           , "points",...
-    "fontsize"            , 13,...
-    "fontweight"          , "bold", ...
-    "horizontalalignment" , "center", ...
-    "background"          , [1 1 1], ...
-    "tag"                 , "frame_control" ...
-    );
-
-    // Frame title
-    my_frame_title = uicontrol( ...
-    "parent"              , demo_fig,...
-    "style"               , "text",...
-    "string"              , "Control Panel",...
-    "units"               , "pixels",...
-    "position"            , [ 30+margin_x margin_y+frame_h-10 frame_w-60 20 ],...
-    "fontname"            , defaultfont,...
-    "fontunits"           , "points",...
-    "fontsize"            , 14,...
-    "horizontalalignment" , "center", ...
-    "background"          , [1 1 1], ...
-    "tag"                 , "title_frame_control" ...
-    );
-
-    // explanatory text
+    // Explanatory text
     // =========================================================================
 
-    my_exptext_w     = frame_w-2*padding_x
-    my_exptext_h     = 350;
-    my_exptext_pos_x = padding_x+margin_x;
-    my_exptext_pos_y = (margin_y+frame_h) - 4*padding_y - my_exptext_h;
-
     my_exptext_string = "";
 
     my_exptext_string = my_exptext_string + "<html>";
 
     my_exptext_string = my_exptext_string + "<center>";
     my_exptext_string = my_exptext_string + "<img src=""file:///"+SCI+"/modules/graphics/demos/cmplxfunc/warning.png"+""">";
-    my_exptext_string = my_exptext_string + "BE CAREFUL NOTHING IS PROTECTED";
+    my_exptext_string = my_exptext_string + "BE CAREFUL, NOTHING IS PROTECTED";
     my_exptext_string = my_exptext_string + "</center>";
 
     my_exptext_string = my_exptext_string + "<hr><br />";
@@ -112,52 +100,68 @@ function demo_custom()
     my_exptext_string = my_exptext_string + "<div style=''text-align:justify; margin-top:5px; width:260;''>";
 
     my_exptext_string = my_exptext_string + "1. define the  function by a correct ";
-    my_exptext_string = my_exptext_string + "string where  the complex var must ";
-    my_exptext_string = my_exptext_string + "be z ; also  as  the function will ";
-    my_exptext_string = my_exptext_string + "be evaluated  on  a matrix  don''t ";
-    my_exptext_string = my_exptext_string + "forget the . to operate in element ";
-    my_exptext_string = my_exptext_string + "wize meaning ; examples :";
+    my_exptext_string = my_exptext_string + "string where the complex var must ";
+    my_exptext_string = my_exptext_string + "be z. Also, as the function will ";
+    my_exptext_string = my_exptext_string + "be evaluated on a matrix, don''t forget ";
+    my_exptext_string = my_exptext_string + "the . to operate elementwise. Examples: ";
 
     my_exptext_string = my_exptext_string + "</div>";
 
 
-    my_exptext_string = my_exptext_string + "<pre>z.^2     (z+1).*(z-1)   (1)./(z+2)</pre>";
-    my_exptext_string = my_exptext_string + "<pre>sqrt(z)  (z+%i).*(z-%i) 1+2*z+z.^2</pre>";
+    my_exptext_string = my_exptext_string + "<pre>    z.^2       (z+1).*(z-1)     (1)./(z+2)</pre>";
+    my_exptext_string = my_exptext_string + "<pre>    sqrt(z)    (z+%i).*(z-%i)   1+2*z+z.^2</pre>";
 
     my_exptext_string = my_exptext_string + "<div style=''text-align:justify; margin-top:5px; width:260;''>";
-    my_exptext_string = my_exptext_string + "2. define the type of the domain string Square or Disk";
+    my_exptext_string = my_exptext_string + "2. define the type of the domain: Square or Disk,";
     my_exptext_string = my_exptext_string + "</div>";
 
 
     my_exptext_string = my_exptext_string + "<div style=''text-align:justify; margin-top:5px; width:260;''>";
-    my_exptext_string = my_exptext_string + "3. define the ""radius"" R of the domain"+ "<br />";
+    my_exptext_string = my_exptext_string + "3. define the ""radius"" R of the domain,"+ "<br />";
     my_exptext_string = my_exptext_string + "</div>";
 
 
     my_exptext_string = my_exptext_string + "<div style=''text-align:justify; margin-top:5px; width:260;''>";
-    my_exptext_string = my_exptext_string + "4. may be your function has a kind of ";
-    my_exptext_string = my_exptext_string + "discontinuity on Ox  or  Oy => put ";
-    my_exptext_string = my_exptext_string + "the string Ox or Oy or No if not";
+    my_exptext_string = my_exptext_string + "4. should your function have some kind of ";
+    my_exptext_string = my_exptext_string + "discontinuity on Ox or Oy => check ";
+    my_exptext_string = my_exptext_string + "Ox or Oy. Otherwise check No.";
     my_exptext_string = my_exptext_string + "</div>";
 
     my_exptext_string = my_exptext_string + "</html>";
 
 
-    // Function definition : frame
+    // Explanatory text : frame
 
+    b_f_expTxt = createBorderFont("", 12);
+    b_l_expTxt = createBorder("line", "navy", 1);
+    b_expTxt   = createBorder("titled", b_l_expTxt, _(""), "center", "top", b_f_expTxt, "navy");
+
+    // Border for the explanatory text frame
+    c = createConstraints("gridbag", [1 1 1 1], [1 1], "both", "upper");
+    my_exptext_frame = uicontrol( ...
+    "parent"              , control_frame,...
+    "style"               , "frame",...
+    "layout"              , "gridbag", ...
+    "border"              , b_expTxt, ...
+    "units"               , "pixels",...
+    "background"          , [1 1 1], ...
+    "constraint"          , c, ...
+    "tag"                 , "my_exptext_frame" ...
+    );
+
+    // Explanatory text : actual text
+
+    c = createConstraints("gridbag", [1 1 1 1], [1 1], "both", "upper");
     my_exptext_box = uicontrol( ...
-    "parent"              , demo_fig,...
-    "relief"              , "groove",...
+    "parent"              , my_exptext_frame,...
     "style"               , "text",...
     "units"               , "pixels",...
     "string"              , my_exptext_string,...
-    "position"            , [ my_exptext_pos_x my_exptext_pos_y my_exptext_w my_exptext_h],...
-    "fontname"            , "arial",...
+    "fontname"            , defaultfont,...
     "fontunits"           , "points",...
     "fontsize"            , 9,...
-    "horizontalalignment" , "left", ...
-    "verticalalignment"   , "top", ...
     "background"          , [1 1 1], ...
+    "constraint"          , c, ...
     "tag"                 , "my_exptext_box" ...
     );
 
@@ -165,276 +169,262 @@ function demo_custom()
     // Function definition
     // =========================================================================
 
-    my_fundef_frame_w     = frame_w-2*padding_x
-    my_fundef_frame_h     = 80;
-    my_fundef_frame_pos_x = padding_x+margin_x;
-    my_fundef_frame_pos_y = my_exptext_pos_y - 2*padding_y - my_fundef_frame_h;
-
     // Function definition : frame
 
+    // Border for the function definition frame
+    b_f_funDef = createBorderFont("", 12);
+    b_l_funDef = createBorder("line", "navy", 1);
+    b_funDef   = createBorder("titled", b_l_funDef, _("Function definition"), "center", "top", b_f_funDef, "navy");
+
+    c = createConstraints("gridbag", [1 2 1 1], [1 1], "both", "upper");
     my_fundef_frame = uicontrol( ...
-    "parent"              , demo_fig,...
-    "relief"              , "groove",...
+    "parent"              , control_frame,...
     "style"               , "frame",...
+    "layout"              , "gridbag", ...
+    "border"              , b_funDef, ...
     "units"               , "pixels",...
-    "position"            , [ my_fundef_frame_pos_x my_fundef_frame_pos_y my_fundef_frame_w my_fundef_frame_h],...
-    "fontname"            , "arial",...
+    "fontname"            , defaultfont,...
     "fontunits"           , "points",...
     "fontsize"            , 13,...
     "fontweight"          , "bold", ...
-    "horizontalalignment" , "center", ...
     "background"          , [1 1 1], ...
+    "constraints"         , c, ...
     "tag"                 , "my_fundef_frame" ...
     );
 
-    // Function definition : Frame title
+    // Function definition : Text "f(z) = "
 
-    my_fundef_frame_title = uicontrol( ...
-    "parent"              , demo_fig,...
-    "style"               , "text",...
-    "string"              , "Function definition",...
-    "units"               , "pixels",...
-    "position"            , [ 70+my_fundef_frame_pos_x my_fundef_frame_pos_y+my_fundef_frame_h-9 my_fundef_frame_w-140 18 ],...
-    "fontname"            , defaultfont,...
-    "fontunits"           , "points",...
-    "fontsize"            , 11,...
-    "horizontalalignment" , "center", ...
-    "background"          , [1 1 1], ...
-    "tag"                 , "my_fundef_frame_title" ...
-    );
+    c = createConstraints("gridbag", [1 1 1 1], [1/12 1], "both", "upper");
+    my_fundef_editbox = uicontrol( ...
+    "parent"             , my_fundef_frame,...
+    "style"              , "text",...
+    "string"              , "f(z) = ", ...
+    "fontname"           , defaultfont,...
+    "fontunits"          , "points",...
+    "fontsize"           , 11,...
+    "background"         , [1 1 1], ...
+    "constraint"         , c, ...
+    "tag"                , "my_fundef_editbox");
 
     // Function definition : Edit box
 
+    c = createConstraints("gridbag", [2 1 1 1], [12 1], "both", "upper");
     my_fundef_editbox = uicontrol( ...
-    "parent"             , demo_fig,...
+    "parent"             , my_fundef_frame,...
     "style"              , "edit",...
-    "position"           , [ my_fundef_frame_pos_x+10 my_fundef_frame_pos_y+my_fundef_frame_h-60 my_fundef_frame_w-25 30],...
-    "horizontalalignment", "left",...
     "fontname"           , defaultfont,...
     "fontunits"          , "points",...
     "fontsize"           , 11,...
     "string"             , "(1)./((z+2).*(2-z))", ...
     "callback"           , "update_fundef()",...
+    "constraint"         , c, ...
     "tag"                , "my_fundef_editbox");
 
+    // Function definition : message bar
+
+    c = createConstraints("gridbag", [1 2 2 1], [1 1], "both", "upper");
+    my_exptext_bar = uicontrol( ...
+    "parent"              , my_fundef_frame,...
+    "style"               , "text",...
+    "string"              , " ", ...
+    "units"               , "pixels",...
+    "fontname"            , defaultfont,...
+    "fontunits"           , "points",...
+    "fontsize"            , 11,...
+    "background"          , [1 1 1], ...
+    "constraint"          , c, ...
+    "tag"                 , "my_funDef_bar" ...
+    );
 
 
     // Domain type
     // =========================================================================
 
-    my_dt_frame_w     = frame_w-2*padding_x
-    my_dt_frame_h     = 60;
-    my_dt_frame_pos_x = padding_x+margin_x;
-    my_dt_frame_pos_y = my_fundef_frame_pos_y - 2*padding_y - my_dt_frame_h;
-
     // Domain type : frame
 
+    // Border for the domain type frame
+    b_f_domain = createBorderFont("", 12);
+    b_l_domain = createBorder("line", "navy", 1);
+    b_domain   = createBorder("titled", b_l_domain, _("Domain type"), "center", "top", b_f_domain, "navy");
+
+    c = createConstraints("gridbag", [1 3 1 1], [1 1], "both", "upper");
     my_dt_frame = uicontrol( ...
-    "parent"              , demo_fig,...
-    "relief"              , "groove",...
+    "parent"              , control_frame,...
     "style"               , "frame",...
+    "layout"              , "gridbag", ...
+    "border"              , b_domain, ...
     "units"               , "pixels",...
-    "position"            , [ my_dt_frame_pos_x my_dt_frame_pos_y my_dt_frame_w my_dt_frame_h],...
-    "fontname"            , "arial",...
+    "fontname"            , defaultfont,...
     "fontunits"           , "points",...
     "fontsize"            , 13,...
     "fontweight"          , "bold", ...
-    "horizontalalignment" , "center", ...
     "background"          , [1 1 1], ...
+    "constraint"          , c, ...
     "tag"                 , "my_dt_frame" ...
     );
 
-    // Domain type : Frame title
-
-    my_dt_frame_title = uicontrol( ...
-    "parent"              , demo_fig,...
-    "style"               , "text",...
-    "string"              , "Domain type",...
-    "units"               , "pixels",...
-    "position"            , [ 100+my_dt_frame_pos_x my_dt_frame_pos_y+my_dt_frame_h-9 my_dt_frame_w-200 18 ],...
-    "fontname"            , defaultfont,...
-    "fontunits"           , "points",...
-    "fontsize"            , 9,...
-    "horizontalalignment" , "center", ...
-    "background"          , [1 1 1], ...
-    "tag"                 , "my_dt_frame_title" ...
-    );
-
     // Domain type : square
 
+    c = createConstraints("gridbag", [1 1 1 1], [1 1], "both", "upper");
     square_radio = uicontrol( ...
-    "parent"             , demo_fig,...
+    "parent"             , my_dt_frame,...
     "style"              , "radiobutton",...
     "string"             , "Square",...
-    "position"           , [ my_dt_frame_pos_x+10 my_dt_frame_pos_y+my_dt_frame_h-42 ((my_dt_frame_w-25)/2) 20],...
-    "horizontalalignment", "left",...
     "fontname"           , defaultfont,...
     "fontunits"          , "points",...
-    "fontsize"           , 10,...
+    "fontsize"           , 11,...
     "value"              , 0, ...
-    "background"          , [1 1 1], ...
+    "background"         , [1 1 1], ...
     "callback"           , "update_domain_type();",...
+    "constraints"        , c, ...
     "tag"                , "square_radio");
 
     // Domain type : Disk
 
+    c = createConstraints("gridbag", [2 1 1 1], [1 1], "both", "upper");
     disk_radio = uicontrol( ...
-    "parent"             , demo_fig,...
+    "parent"             , my_dt_frame,...
     "style"              , "radiobutton",...
     "string"             , "Disk",...
-    "position"           , [ my_dt_frame_pos_x+(my_dt_frame_w/2) my_dt_frame_pos_y+my_dt_frame_h-42 ((my_dt_frame_w-25)/2) 20],...
-    "horizontalalignment", "left",...
     "fontname"           , defaultfont,...
     "fontunits"          , "points",...
-    "fontsize"           , 10,...
+    "fontsize"           , 11,...
     "value"              , 1, ...
     "background"          , [1 1 1], ...
     "callback"           , "update_domain_type();",...
+    "constraints"        , c, ...
     "tag"                , "disk_radio");
 
+
     // Radius of the domain
     // =========================================================================
 
-    my_radius_frame_w     = frame_w-2*padding_x
-    my_radius_frame_h     = 80;
-    my_radius_frame_pos_x = padding_x+margin_x;
-    my_radius_frame_pos_y = my_dt_frame_pos_y - 2*padding_y - my_radius_frame_h;
+    // Radius of the domain : frame
 
-    // Function definition : frame
+    // Border for the radius frame
+    b_f_radius = createBorderFont("", 12);
+    b_l_radius = createBorder("line", "navy", 1);
+    b_radius   = createBorder("titled", b_l_radius, _("Radius of the domain"), "center", "top", b_f_radius, "navy");
 
+    c = createConstraints("gridbag", [1 4 1 1], [1 1], "both", "upper");
     my_radius_frame = uicontrol( ...
-    "parent"              , demo_fig,...
-    "relief"              , "groove",...
+    "parent"              , control_frame,...
     "style"               , "frame",...
+    "layout"              , "gridbag", ...
+    "border"              , b_radius, ...
     "units"               , "pixels",...
-    "position"            , [ my_radius_frame_pos_x my_radius_frame_pos_y my_radius_frame_w my_radius_frame_h],...
-    "fontname"            , "arial",...
+    "fontname"            , defaultfont,...
     "fontunits"           , "points",...
     "fontsize"            , 13,...
     "fontweight"          , "bold", ...
-    "horizontalalignment" , "center", ...
     "background"          , [1 1 1], ...
+    "constraint"          , c, ...
     "tag"                 , "my_radius_frame" ...
     );
 
-    // Function definition : Frame title
-
-    my_radius_frame_title = uicontrol( ...
-    "parent"              , demo_fig,...
-    "style"               , "text",...
-    "string"              , "Radius of the domain",...
-    "units"               , "pixels",...
-    "position"            , [ 50+my_radius_frame_pos_x my_radius_frame_pos_y+my_radius_frame_h-9 my_radius_frame_w-100 18 ],...
-    "fontname"            , defaultfont,...
-    "fontunits"           , "points",...
-    "fontsize"            , 11,...
-    "horizontalalignment" , "center", ...
-    "background"          , [1 1 1], ...
-    "tag"                 , "my_radius_frame_title" ...
-    );
-
-    // Function definition : Edit box
+    // Radius of the domain : Edit box
 
+    c = createConstraints("gridbag", [1 1 1 1], [1 1], "both", "upper");
     my_radius_editbox = uicontrol( ...
-    "parent"             , demo_fig,...
+    "parent"             , my_radius_frame,...
     "style"              , "edit",...
-    "position"           , [ my_radius_frame_pos_x+10 my_radius_frame_pos_y+my_radius_frame_h-60 my_radius_frame_w-25 30],...
-    "horizontalalignment", "left",...
     "fontname"           , defaultfont,...
     "fontunits"          , "points",...
     "fontsize"           , 11,...
     "string"             , "1.9", ...
     "callback"           , "update_radius()",...
+    "constraint"         , c, ...
     "tag"                , "my_radius_editbox");
 
+    // Radius of the domain : message bar
+
+    c = createConstraints("gridbag", [1 2 1 1], [1 1], "both", "upper");
+    my_exptext_bar = uicontrol( ...
+    "parent"              , my_radius_frame,...
+    "style"               , "text",...
+    "string"              , " ", ...
+    "units"               , "pixels",...
+    "fontname"            , defaultfont,...
+    "fontunits"           , "points",...
+    "fontsize"            , 11,...
+    "background"          , [1 1 1], ...
+    "constraint"          , c, ...
+    "tag"                 , "my_radius_bar" ...
+    );
+
 
-    // Cut on axe
+    // Cut on axes
     // =========================================================================
 
-    my_coa_frame_w     = frame_w-2*padding_x
-    my_coa_frame_h     = 60;
-    my_coa_frame_pos_x = padding_x+margin_x;
-    my_coa_frame_pos_y = my_radius_frame_pos_y - 2*padding_y - my_coa_frame_h;
+    // Cut on axes : frame
 
-    // Cut on axe : frame
+    // Border for the cut on axes frame
+    b_f_cut = createBorderFont("", 12);
+    b_l_cut = createBorder("line", "navy", 1);
+    b_cut   = createBorder("titled", b_l_cut, _("Cut on axes"), "center", "top", b_f_cut, "navy");
 
+    c = createConstraints("gridbag", [1 5 1 1], [1 1], "both", "upper");
     my_coa_frame = uicontrol( ...
-    "parent"              , demo_fig,...
-    "relief"              , "groove",...
+    "parent"              , control_frame,...
     "style"               , "frame",...
+    "layout"              , "gridbag", ...
+    "border"              , b_cut, ...
     "units"               , "pixels",...
-    "position"            , [ my_coa_frame_pos_x my_coa_frame_pos_y my_coa_frame_w my_coa_frame_h],...
-    "fontname"            , "arial",...
+    "fontname"            , defaultfont,...
     "fontunits"           , "points",...
     "fontsize"            , 13,...
     "fontweight"          , "bold", ...
-    "horizontalalignment" , "center", ...
     "background"          , [1 1 1], ...
+    "constraint"          , c, ...
     "tag"                 , "my_coa_frame" ...
     );
 
-    // Cut on axe : Frame title
-
-    my_coa_frame_title = uicontrol( ...
-    "parent"              , demo_fig,...
-    "style"               , "text",...
-    "string"              , "Cut on axes",...
-    "units"               , "pixels",...
-    "position"            , [ 100+my_coa_frame_pos_x my_coa_frame_pos_y+my_coa_frame_h-9 my_coa_frame_w-200 18 ],...
-    "fontname"            , defaultfont,...
-    "fontunits"           , "points",...
-    "fontsize"            , 9,...
-    "horizontalalignment" , "center", ...
-    "background"          , [1 1 1], ...
-    "tag"                 , "my_coa_frame_title" ...
-    );
-
-    // Cut on axe : Ox
+    // Cut on axes : Ox
 
+    c = createConstraints("gridbag", [1 1 1 1], [1 1], "both", "upper");
     ox_radio = uicontrol( ...
-    "parent"             , demo_fig,...
+    "parent"             , my_coa_frame,...
     "style"              , "radiobutton",...
     "string"             , "Ox",...
-    "position"           , [ my_coa_frame_pos_x+10 my_coa_frame_pos_y+my_coa_frame_h-42 (my_coa_frame_w-25)/3 20],...
-    "horizontalalignment", "left",...
     "fontname"           , defaultfont,...
     "fontunits"          , "points",...
-    "fontsize"           , 10,...
+    "fontsize"           , 11,...
     "value"              , 0, ...
     "background"         , [1 1 1], ...
     "callback"           , "update_cao();",...
+    "constraint"         , c, ...
     "tag"                , "ox_radio");
 
-    // Cut on axe : Oy
+    // Cut on axes : Oy
 
+    c = createConstraints("gridbag", [2 1 1 1], [1 1], "both", "upper");
     oy_radio = uicontrol( ...
-    "parent"             , demo_fig,...
+    "parent"             , my_coa_frame,...
     "style"              , "radiobutton",...
     "string"             , "Oy",...
-    "position"           , [ my_coa_frame_pos_x+(my_coa_frame_w/3) my_coa_frame_pos_y+my_coa_frame_h-42 (my_coa_frame_w-25)/3 20],...
-    "horizontalalignment", "left",...
     "fontname"           , defaultfont,...
     "fontunits"          , "points",...
-    "fontsize"           , 10,...
+    "fontsize"           , 11,...
     "value"              , 0, ...
     "background"         , [1 1 1], ...
     "callback"           , "update_cao();",...
+    "constraint"          , c, ...
     "tag"                , "oy_radio");
 
-    // Cut on axe : No
+    // Cut on axes : No
 
+    c = createConstraints("gridbag", [3 1 1 1], [1 1], "both", "upper");
     no_radio = uicontrol( ...
-    "parent"             , demo_fig,...
+    "parent"             , my_coa_frame,...
     "style"              , "radiobutton",...
     "string"             , "No",...
-    "position"           , [ my_coa_frame_pos_x+(2*(my_coa_frame_w/3)) my_coa_frame_pos_y+my_coa_frame_h-42 (my_coa_frame_w-25)/3 20],...
-    "horizontalalignment", "left",...
     "fontname"           , defaultfont,...
     "fontunits"          , "points",...
-    "fontsize"           , 10,...
+    "fontsize"           , 11,...
     "value"              , 1, ...
     "background"         , [1 1 1], ...
     "callback"           , "update_cao();",...
+    "constraint"          , c, ...
     "tag"                , "no_radio");
 
     // Default Values
@@ -447,20 +437,19 @@ function demo_custom()
     global my_e;
 
 
-    my_fundef_val      = "(1)./((z+2).*(2-z))";
-    my_dt_val          = "Disk";
-    my_radius          = 1.9;
-    my_typeCut         = "No";
+    my_fundef_val = "(1)./((z+2).*(2-z))";
+    my_dt_val     = "Disk";
+    my_radius     = 1.9;
+    my_typeCut    = "No";
 
-    my_e               = 0.001;
-    theta              = -110;
-    alpha              = 75;
+    my_e          = 0.001;
+    theta         = -110;
+    alpha         = 75;
 
     deff("Z=f(z)","Z="+my_fundef_val);
 
-    demo_fig.immediate_drawing = "off";
     PlotCmplxFunc(my_radius,my_e,my_dt_val,my_typeCut,[40 20],"f",theta,alpha,[0;0]);
-    demo_fig.immediate_drawing = "on";
+    fig_handle.visible = "on";
 
 endfunction
 
@@ -472,7 +461,24 @@ function update_fundef()
     global my_typeCut;
     global my_e;
 
-    my_fundef_val = get(gcbo,"string");
+    my_fundef_val_tmp = get(gcbo,"string");
+
+    if strchr(my_fundef_val_tmp, "z") == "" then
+        updateStatusBar("my_funDef_bar", _("Function should contain ""z"""), [1 0 0]);
+        return
+    end
+
+    try // Try f(z) on a simple matrix
+        ieeeMode = ieee();
+        ieee(2);
+        execstr(strsubst(my_fundef_val_tmp, "z", "[1 2 3; 1 2 3]"));
+        ieee(ieeeMode);
+    catch
+        updateStatusBar("my_funDef_bar", _("Wrong definition of f(z)"), [1 0 0]);
+        return
+    end
+
+    my_fundef_val = my_fundef_val_tmp;
 
     // Delete the old plots
 
@@ -483,8 +489,8 @@ function update_fundef()
     a = gca(); delete(a);
     a = gca(); delete(a);
 
-    theta              = -110;
-    alpha              = 75;
+    theta = -110;
+    alpha = 75;
 
     deff("Z=f(z)","Z="+my_fundef_val);
 
@@ -520,8 +526,8 @@ function update_domain_type()
     a = gca(); delete(a);
     a = gca(); delete(a);
 
-    theta              = -110;
-    alpha              = 75;
+    theta = -110;
+    alpha = 75;
 
     deff("Z=f(z)","Z="+my_fundef_val);
 
@@ -549,7 +555,19 @@ function update_radius()
     global my_typeCut;
     global my_e;
 
-    my_radius = evstr(get(gcbo,"string"));
+    try
+        my_radius_tmp = evstr(get(gcbo,"string"));
+    catch
+        updateStatusBar("my_radius_bar", _("Radius should be real and finite"), [1 0 0]);
+        return
+    end
+
+    if ~isscalar(my_radius_tmp) | and(type(my_radius_tmp) <> [1 8]) | ~isreal(my_radius_tmp) | isinf(my_radius_tmp) then
+        updateStatusBar(_("Radius should be real and finite"), [1 0 0]);
+        return
+    else
+        my_radius = my_radius_tmp;
+    end
 
     // Delete the old plots
 
@@ -560,8 +578,8 @@ function update_radius()
     a = gca(); delete(a);
     a = gca(); delete(a);
 
-    theta              = -110;
-    alpha              = 75;
+    theta = -110;
+    alpha = 75;
 
     deff("Z=f(z)","Z="+my_fundef_val);
 
@@ -598,8 +616,8 @@ function update_cao()
     a = gca(); delete(a);
     a = gca(); delete(a);
 
-    theta              = -110;
-    alpha              = 75;
+    theta = -110;
+    alpha = 75;
 
     deff("Z=f(z)","Z="+my_fundef_val);
 
@@ -639,7 +657,7 @@ function []=PlotCmplxFunc(R,e,TypeDomain,TypeCut,n,StrFunc,theta,alpha,DomReal)
 
     // computes the facets
 
-    [xr,yr,zr,xi,yi,zi] = CmplxFacets(R,e,TypeDomain,TypeCut,n,StrFunc)
+    [xr,yr,zr,xi,yi,zi] = CmplxFacets(R,e,TypeDomain,TypeCut,n,StrFunc);
 
     // draw
     // ============================================
@@ -656,22 +674,22 @@ function []=PlotCmplxFunc(R,e,TypeDomain,TypeCut,n,StrFunc,theta,alpha,DomReal)
     Rs = string(R);
 
     if TypeDomain == "Square" then
-        end_title = " Function on [-"+Rs+","+Rs+"]x[-"+Rs+","+Rs+"]"
+        end_title = " function on [-"+Rs+","+Rs+"]x[-"+Rs+","+Rs+"]"
     else
-        end_title = " Function on D(0,R="+Rs+")"
+        end_title = " function on D(0,R="+Rs+")"
     end
 
     if StrFunc == "f" then
-        the_title = "Your Custom (named f) Complex" + end_title;
+        the_title = "Your custom (named f) complex" + end_title;
     else
-        the_title = "The Complex " + StrFunc + end_title;
+        the_title = "The complex " + StrFunc + end_title;
     end
 
     xtitle(the_title);
 
     my_title_axes.title.text       = the_title;
     my_title_axes.title.font_size  = 3;
-    my_title_axes.margins     = [ 0.08 0.08 0.08 0.08 ]
+    my_title_axes.margins     = [ 0.15 0.08 0.08 0.08 ]
 
     // plot Im(z)
     // ============================================
@@ -680,12 +698,13 @@ function []=PlotCmplxFunc(R,e,TypeDomain,TypeCut,n,StrFunc,theta,alpha,DomReal)
     plot3d(xi,yi,zi,theta,alpha,"Re(z)@Im(z)@",[2 6 4]);
 
     my_IM_axes = gca();
-    my_IM_axes.axes_bounds = [0.1, 0.05, 1, 0.5];
+    my_IM_axes.axes_bounds = [0.16, 0.05, 1, 0.5];
     my_IM_plot             = my_IM_axes.children;
     my_IM_plot.color_flag  = 1;
 
     xtitle("Im("+StrFunc+"(z))");
-    my_IM_axes.margins     = [0.2, 0.2, 0.2, 0.2];
+    my_IM_axes.margins      = [0.2, 0.2, 0.2, 0.2];
+    my_IM_axes.cube_scaling = "on";
 
     // plot Re(z) + the real restriction
     // ============================================
@@ -694,13 +713,13 @@ function []=PlotCmplxFunc(R,e,TypeDomain,TypeCut,n,StrFunc,theta,alpha,DomReal)
     plot3d(xr,yr,zr,theta,alpha,"Re(z)@Im(z)@",[2 6 4]);
 
     my_RE_axes = gca();
-    my_RE_axes.axes_bounds = [0.1, 0.5, 1, 0.5];
-    my_RE_axes.margins      = [ 0.2 0.2 0.2 0.2 ];
+    my_RE_axes.axes_bounds = [0.16, 0.5, 1, 0.5];
     my_RE_plot             = my_RE_axes.children;
     my_RE_plot.color_flag  = 1;
 
     xtitle("Re("+StrFunc+"(z))");
-    my_RE_axes.margins     = [ 0.2 0.2 0.2 0.2 ];
+    my_RE_axes.margins      = [0.2, 0.2, 0.2, 0.2];
+    my_RE_axes.cube_scaling = "on";
 
     // real function in yellow
     // ============================================
@@ -769,6 +788,32 @@ function [xr,yr,zr,xi,yi,zi] = CmplxFacets(R,e,TypeDomain,TypeCut,n,StrFunc)
 
 endfunction
 
+// =============================================================================
+// updateStatusBar
+// + Update the string in the text frame
+// =============================================================================
+function updateStatusBar(tag,msg, msg_color)
+    time_active = 2; //Time the message is active in s
+
+    if argn(2) == 0 then
+        set(tag, "String", " ");
+        return
+    end
+
+    h = gcf();
+    set(tag, "Foregroundcolor", msg_color, "String", msg);
+
+    delta_time = 0;
+    timer()
+    while delta_time < time_active
+        delta_time = delta_time + timer();
+    end
+
+    if is_handle_valid(h)
+        updateStatusBar();
+    end
+endfunction
+
 funcprot(1);
 
 demo_custom();