| Split views / Examples | |
This example shows how to write an application that handles two split views, each having a left and right pane, with a top level navigation pane that allows the end user to easily switch between the two split views.
This module implements the window creation and the parallel dialogs to control their content.
DEFINE c_arr DYNAMIC ARRAY OF RECORD
            id INTEGER,
            name VARCHAR(30),
            address VARCHAR(100)
  END RECORD,
  c_curr INTEGER
DEFINE o_arr DYNAMIC ARRAY OF RECORD
            id INTEGER,
            info VARCHAR(100),
            deliv DATE
  END RECORD
DEFINE params RECORD
            user_name VARCHAR(30),
            auto_sync CHAR(1)
  END RECORD
  
MAIN
  CLOSE WINDOW SCREEN
  OPEN WINDOW w_navigator WITH 10 ROWS, 80 COLUMNS
       ATTRIBUTES(TYPE=NAVIGATOR)
  START DIALOG d_navigator
  WHILE fgl_eventLoop()
  END WHILE
END MAIN
DIALOG d_navigator()
  MENU
      BEFORE MENU
         CALL customers()
      -- Note that action names must match the window names
      ON ACTION w_customers ATTRIBUTES(TEXT="Customers",IMAGE="customers")
         CALL customers()
      ON ACTION w_orders ATTRIBUTES(TEXT="Orders",IMAGE="orders")
         CALL orders()
      ON ACTION w_params ATTRIBUTES(TEXT="Params",IMAGE="sync")
         CALL params()
  END MENU
END DIALOG
FUNCTION params()
  IF ui.Window.forName("w_params") IS NULL THEN
     OPEN WINDOW w_params WITH FORM "parameters"
     LET params.user_name="Tom"
     LET params.auto_sync="Y"
     DISPLAY BY NAME params.*
     START DIALOG d_params_menu
  END IF 
  CURRENT WINDOW IS w_params
END FUNCTION
DIALOG d_params_menu()
  MENU
    ON ACTION modify ATTRIBUTES(TEXT="Modify")
       CALL edit_params()
    ON ACTION options ATTRIBUTES(TEXT="Options")
       CALL options()
  END MENU
END DIALOG
FUNCTION edit_params() -- This is a modal dialog
  LET int_flag=FALSE
  INPUT BY NAME params.* ATTRIBUTES(WITHOUT DEFAULTS)
  IF NOT int_flag THEN
     -- CALL save_params()
  END IF
END FUNCTION
FUNCTION options()
  MENU "Options" ATTRIBUTES(STYLE="dialog")
    ON ACTION sync ATTRIBUTES(TEXT="Synchronize")
       --
    ON ACTION exit ATTRIBUTES(TEXT="Exit")
       EXIT PROGRAM
    ON ACTION cancel
       EXIT MENU
  END MENU
END FUNCTION
FUNCTION customers()
    IF ui.Window.forName("w_customers") IS NULL THEN
       CALL populate_customers()
       OPEN WINDOW w_customers WITH FORM "customer_list"
            ATTRIBUTES(TYPE=LEFT)
       START DIALOG d_customer_list
       OPEN WINDOW w_customer_detail WITH FORM "customer_detail"
            ATTRIBUTES(TYPE=RIGHT)
       START DIALOG d_customer_detail
    END IF 
    CURRENT WINDOW IS w_customers
END FUNCTION
DIALOG d_customer_list()
  DISPLAY ARRAY c_arr TO c_sr.*
          ATTRIBUTES(ACCESSORYTYPE=DISCLOSUREINDICATOR)
      BEFORE ROW
        CURRENT WINDOW IS w_customer_detail
        TERMINATE DIALOG d_customer_detail
        LET c_curr = arr_curr()
        DISPLAY BY NAME c_arr[c_curr].*
        START DIALOG d_customer_detail
        CURRENT WINDOW IS w_customers
  END DISPLAY
END DIALOG
DIALOG d_customer_detail()
  MENU 
    ON ACTION details
       LET int_flag=FALSE
       INPUT BY NAME c_arr[c_curr].name,
                     c_arr[c_curr].address
             WITHOUT DEFAULTS
       IF NOT int_flag THEN
          DISPLAY BY NAME c_arr[c_curr].*
       END IF
  END MENU
END DIALOG
FUNCTION populate_customers()
  LET c_arr[1].id = 324
  LET c_arr[1].name = "Mike Treeman"
  LET c_arr[1].address = "56 Gamleed st."
  LET c_arr[2].id = 8934
  LET c_arr[2].name = "Stepfan Plombier"
  LET c_arr[2].address = "78 Pokam st."
  LET c_arr[3].id = 451
  LET c_arr[3].name = "Ted Barber"
  LET c_arr[3].address = "1243b Western st."
END FUNCTION
FUNCTION orders()
    IF ui.Window.forName("w_orders") IS NULL THEN
       CALL populate_orders()
       OPEN WINDOW w_orders WITH FORM "order_list"
       START DIALOG d_order_list
    END IF 
    CURRENT WINDOW IS w_orders
END FUNCTION
DIALOG d_order_list()
  DISPLAY ARRAY o_arr TO o_sr.*
  END DISPLAY
END DIALOG
FUNCTION populate_orders()
  LET o_arr[1].id = 43249
  LET o_arr[1].info = "Xmass gifts"
  LET o_arr[1].deliv = MDY(12,23,2011)
  LET o_arr[2].id = 33424
  LET o_arr[2].info = "Dressing items"
  LET o_arr[2].deliv = MDY(2,13,2012)
END FUNCTION
LAYOUT (TEXT="Customers")
TABLE
{
[c1    |c2              ]
}
END
END
ATTRIBUTES
PHANTOM FORMONLY.id;
EDIT c1=FORMONLY.name;
EDIT c2=FORMONLY.address;
END
INSTRUCTIONS
SCREEN RECORD c_sr(FORMONLY.*);
END
LAYOUT (TEXT="Customer details")
GRID
{
Id      [f01               ]
Name    [f02               ]
Address [f03               ]
        [b1_details        ]
}
END
END
ATTRIBUTES
EDIT f01=FORMONLY.id;
EDIT f02=FORMONLY.name, SCROLL;
EDIT f03=FORMONLY.address, SCROLL;
BUTTON b1_details:details,TEXT="Modify details";
END
LAYOUT (TEXT="Orders")
TABLE
{
[c1    |c2              ]
}
END
END
ATTRIBUTES
PHANTOM FORMONLY.id;
EDIT c1=FORMONLY.info;
EDIT c2=FORMONLY.date;
END
INSTRUCTIONS
SCREEN RECORD o_sr(FORMONLY.*);
END
LAYOUT (TEXT="Settings")
GRID
{
User       [f01               ]
Auto sync  [f02               ]
}
END
END
ATTRIBUTES
EDIT f01=FORMONLY.user_name, SCROLL;
CHECKBOX f02=FORMONLY.auto_sync, NOT NULL,
     VALUECHECKED="Y", VALUEUNCHECKED="N";
END