Multi Frame Pages

Multi frame pages are a special set of pages. Normal pages represent a generated HTML page - a multi frame page represents a generated HTML frameset page.


What are Multi Frame Pages?

Multi frame pages are a special set of pages. Normal pages represent a generated HTML page - a multi frame page represents a generated HTML frameset page.

A multi frame page does not contain controls but frames in which other pages are positioned. Each frame is associated with an ID (called "target" in this section). A frame may be:

  • a normal HTML page

  • an intelligent Application Designer page

  • a frameset itself containing frames

Multi frame pages are the preferred way of arranging Application Designer pages in a frameset. Besides enhanced possibilities of communication between frames, multi frame pages automatically take care of keeping all Application Designer frames inside the same session.

Definition of Multi Frame Pages

The definition of multi frame pages is done with the Layout Painter. When you create a new layout, a dialog appears in which you select a template. To create a multi frame page, you have to select the "Multi Frame Page" template. The Layout Painter will open just as usual, but instead of having the PAGE control as the highest control, you now see the control MFPAGE. You can reach a number of controls that are related to multi frame page management.

The following controls are "normal frame controls" (they are described below):

  • MFPAGE - the top element of multi frame pages.

  • MFCISFRAME - a frame in which an Application Designer HTML page is loaded.

  • MFHTMLFRAME - a frame in which a normal HTML page is loaded.

  • MFFRAMESET - an area that can be subdivided into frames itself.

The following controls are "workplace controls". The Application Designer workplace is based on these controls.

  • MFWPFUNCTIONS

  • MFWPACTIVEFUNCTIONS

  • MFWPCONTENT

This section covers the following topics:

MFPAGE

The MFPAGE is the top node of every multi frame page. It can be subdivided into frames or framesets.

Basic
separation

Specifies how the corresponding internally used frameset is subdivided: choose "rows" for subdividing into rows, "cols" for subdividing into columns.

Obligatory

rows

cols

sizing

Defines the size of the contained sub-frames. If you have three sub-frames to show up inside the page then you might specify "200,200,*" to specify how the height (if SEPARATION is "rows") or the width (if SEPARATION is "cols") is distributed among the frames.

You can speficy per frame either a pixel value or a "*".

Obligatory  
comment

Comment without any effect on rendering and behaviour. The comment is shown in the layout editor's tree view.

Optional  
Appearance
border

Space between frames contained in the frameset that is internally built up.

Optional

1

2

3

int-value

bordercolor

Sets the border color of the frame set.

Optional

#FF0000

#00FF00

#0000FF

#FFFFFF

#808080

#000000

frameborder

Defines if to display a border around the contained frames. Valid values are "true" or "false".

Optional

true

false

framespacing

Defines the amount of additional space between the frames. Value is a pixel value.

Optional

1

2

3

int-value

framesetstyle

Style passed to the HTML-frameset definition that is internally generated.

Optional

background-color: #FF0000

color: #0000FF

font-weight: bold

MFCISFRAME

The MFCISFRAME represents a frame in which an Application Designer page is shown. The name of the page is passed as a parameter.

Basic
target

Id of the frame. Must be unique inside the frameset page. Must only contain alphanumeric characters.

The id is important! CIS offers certain methods inside the Model-class that allow an adapter to start operations for a certain frame (e.g. openeCIPageInFrame(...)). As part of the parameters of these methods a target-id is passed. The target-id is exactly the id you specifiy with the TARGET property.

Obligatory  
cisurl

URL of the page to be shown inside. Use /project/page.html as syntax, e.g. "/HTMLBasedGUI/empty.html".

Do NOT use only page.html believing that you do not have to specify the project because the multi frame page runs in the same project than the page you want to open - you ALWAYS have to specify the project!

Obligatory  
comment

Comment without any effect on rendering and behaviour. The comment is shown in the layout editor's tree view.

Optional  
Appearance
resizable

Decision if the user is able to resize the frame. This property must be in synch with the definition in the "neighbour frames". If the neighbour frames do not support resizing then it will not be offered to the user as consequence.

Valid values are "true" and "false". Default is "true".

Optional

true

false

withborder

Boolean value defining if the frame has a border on its own. Default is "false".

Optional

true

false

framestyle

Style that is passed to the HTML-FRAME definition that is internally generated.

Optional

background-color: #FF0000

color: #0000FF

font-weight: bold

bordercolor

Sets the border color of the frame set.

Optional

#FF0000

#00FF00

#0000FF

#FFFFFF

#808080

#000000

marginheight

Defines top and bottom margin height. Value is a pixel value. Default is "0".

Optional

1

2

3

int-value

marginwidth

Defines left and right margin width. Value is a pixel value. Default is "0".

Optional

1

2

3

int-value

withownborder

Flag that indicates if started pages show an own border. Default is false.

Optional

true

false

Unload Behaviour
unloadbehaviour

Reaction that CIS should take if the page inside the frame is closed. Possible values are "NOTHING" for doing nothing and "REMOVESESSION" for removing the session on server side.

Do not define this property just "by accident" but leave it to the default ("NOTHING").

You only switch to "REMOVESESSION" if you want that the server side session is destroyed when leaving the page. This is the case if you have one page that clearly indicates the closing of a session at the point of time when the page is closed.

Optional

NOTHING

REMOVESESSION

Applications can change the page that is shown inside the MFCISFRAME by using the method Adapter.openCISPageInTarget(...).

MFHTMLFRAME

The MFHTMLFRAME represents a frame in which a normal HTML page is shown. This page can be a static HTML page or any URL - e.g. a URL referring to a certain JSP page.

Basic
target

Id of the frame. Must be unique inside the frameset page. Must only contain alphanumeric characters.

The id is important! CIS offers certain methods inside the Model-class that allow an adapter to start operations for a certain frame (e.g. openeCIPageInFrame(...)). As part of the parameters of these methods a target-id is passed. The target-id is exactly the id you specifiy with the TARGET property.

Obligatory  
url

URL to be opened inside the frame. The URL can be defined relative to the multi frame page or can be defined in an absolute way..

Example: You can define "../HTMLBasedGUI/workplace/header2.html" - or "http://www.softwareag.com".

Obligatory  
comment

Comment without any effect on rendering and behaviour. The comment is shown in the layout editor's tree view.

Optional  
Appearance
resizable

Decision if the user is able to resize the frame. This property must be in synch with the definition in the "neighbour frames". If the neighbour frames do not support resizing then it will not be offered to the user as consequence.

Valid values are "true" and "false". Default is "true".

Optional

true

false

withborder

Boolean value defining if the frame has a border on its own. Default is "false".

Optional

true

false

scrolling

Boolean that indicates whether the frame can be scrolled. Default is true.

Optional

true

false

framestyle

Style that is passed to the HTML-FRAME definition that is internally generated.

Optional

background-color: #FF0000

color: #0000FF

font-weight: bold

bordercolor

Sets the border color of the frame set.

Optional

#FF0000

#00FF00

#0000FF

#FFFFFF

#808080

#000000

marginheight

Defines top and bottom margin height. Value is a pixel value. Default is "0".

Optional

1

2

3

int-value

marginwidth

Defines left and right margin width. Value is a pixel value. Default is "0".

Optional

1

2

3

int-value

MFFRAMESET

The MFFRAMESET represents a frame that is internally again divided into frames. The MFFRAMESET definition decides whether to divide into rows or columns, and how to size the inner frames.

Basic
target

Id of the frame. Must be unique inside the frameset page. Must only contain alphanumeric characters.

The id is important! CIS offers certain methods inside the Model-class that allow an adapter to start operations for a certain frame (e.g. openeCIPageInFrame(...)). As part of the parameters of these methods a target-id is passed. The target-id is exactly the id you specifiy with the TARGET property.

Obligatory  
separation

Specifies how the corresponding internally used frameset is subdivided: choose "rows" for subdividing into rows, "cols" for subdividing into columns.

Obligatory

rows

cols

sizing

Defines the size of the contained sub-frames. If you have three sub-frames to show up inside the page then you might specify "200,200,*" to specify how the height (if SEPARATION is "rows") or the width (if SEPARATION is "cols") is distributed among the frames.

You can speficy per frame either a pixel value or a "*".

Obligatory  
comment

Comment without any effect on rendering and behaviour. The comment is shown in the layout editor's tree view.

Optional  
Appearance
border

Space between frames contained in the frameset that is internally built up.

Optional

1

2

3

int-value

bordercolor

Sets the border color of the frame set.

Optional

#FF0000

#00FF00

#0000FF

#FFFFFF

#808080

#000000

frameborder

Defines if to display a border around the contained frames. Valid values are "true" or "false".

Optional

true

false

framespacing

Defines the amount of additional space between the frames. Value is a pixel value.

Optional

1

2

3

int-value

framesetstyle

Style passed to the HTML-frameset definition that is internally generated.

Optional

background-color: #FF0000

color: #0000FF

font-weight: bold

Example

The example that will be built in this section produces the following output:

Example Output

When selecting a customer on the left, the customer detail screen is displayed on the right:

Customer Detail

When the user selects another record on the left, the screen on the right is updated accordingly.

This section covers the following topics:

The Multi Frame Page Around

First let us have a look at the multi frame page itself. The layout definition is as follows:

<mfpage separation="rows" sizing="70,*">
    <mfhtmlframe target="HEADER" 
                 url="../HTMLBasedGUI/workplace/welcome.html" 
                 resizable="true" 
                 withborder="false" 
                 scrolling="false" 
                 framestyle="border: 1px #808080 solid">
    </mfhtmlframe>
    <mfframeset target="AROUND" 
                separation="cols" 
                sizing="200,*">
        <mfcisframe target="INNERLEFT" 
                   cisurl="/cisdemos/25_mfinnerleft.html" 
                   framestyle="border-right: 1px solid #808080; 
                   border-bottom: 1px solid #808080">
        </mfcisframe>
        <mfcisframe target="INNERRIGHT" 
                     cisurl="/HTMLBasedGUI/empty.html" 
                     framestyle="border: 1px solid #808080">
        </mfcisframe>
    </mfframeset>
</mfpage

The page is subdivided into three frames: "HEADER", "INNERLEFT" and "INNERRIGHT". Two of them are Application Designer frames, one is an HTML frame. Every frame is pointing to a certain page.

The Left Frame

The INNERLEFT frame's page displays a text grid and lets the user select from the list of items. The layout definition is:

<page model="MFInnerLeftAdapter">
    <pagebody horizdist="false" takefullheight="true">
        <itr height="100%" fixlayout="true" width="100%">
            <textgrid2 griddataprop="customers" width="100%" height="100%" selectprop="selected" 
                       singleselect="true" hscroll="true" directselectmethod="onSelect" 
                       directselectevent="onclick">
                <column name="Id" property="id" width="100">
                </column>
                <column name="Name" property="name" width="400">
                </column>
            </textgrid2>
        </itr>
    </pagebody>
</page>

The adapter implementation is done in the following way:

import com.softwareag.cis.server.Adapter;
import com.softwareag.cis.server.ServerLog;
import com.softwareag.cis.server.util.TEXTGRIDCollection;

public class MFInnerLeftAdapter 
	extends Adapter
{
	// ------------------------------------------------------------------------
	// inner classes
	// ------------------------------------------------------------------------
	
	public class CustomerInfo
	{
            boolean m_selected;
            String m_id;
            String m_name;
            public String getId() { return m_id; }
            public String getName() { return m_name; }
            public boolean getSelected() { return m_selected; }
            public void setId(String string) { m_id = string; }
            public void setName(String string) { m_name = string; }
            public void setSelected(boolean b) { m_selected = b; }
	}
	// ------------------------------------------------------------------------
	// members
	// ------------------------------------------------------------------------

	TEXTGRIDCollection m_customers = new TEXTGRIDCollection();
	
	// ------------------------------------------------------------------------
	// property access
	// ------------------------------------------------------------------------

	public TEXTGRIDCollection getCustomers() { return m_customers; }
	
	// ------------------------------------------------------------------------
	// public methods
	// ------------------------------------------------------------------------
	
	public void init()
	{
		super.init();
		for (int i=0; i<40; i++)
		{
			CustomerInfo info = new CustomerInfo();
			ci.setId(""+i);
			ci.setName("Customer " + i);
			m_customers.add(ci);
		}
	}
	
	public void onSelect()
	{
		try
		{
			CustomerInfo info = (CustomerInfo)m_customers.findLastSelectedItem();
			// prepare adapter of right frame
			MFInnerRightAdapter mfira = 
                        (MFInnerRightAdapter)findAdapter(MFInnerRightAdapter.class);
			mfira.prepare(ci.getId());
			// preload adapter so that only one request is executed
			includeAdapterInResponse("../_DevelopersGuide/mfinnerright.html",false);
			// refersh target
			refreshTarget("INNERRIGHT");
		}
		catch (Throwable t) { ServerLog.appendException(t); }
	}
}

The class contains the following:

  • An inner class for the text grid items.

  • An init method for filling the text grid.

  • A onSelect() method that is called when the user selects a text grid line.

The "critical" lines of code are inside the onSelect() method. Inside the method

  • the selected line is determined,

  • the adapter of the right neighbor screen is prepared so that it shows the data of the selected line,

  • the right page is switched to the detail page (if first call) or

  • the right page is refreshed to present the correct adapter information.

The Right Frame

The right frame is loaded with /HTMLBasedGUI/empty.html first. With the first selection in the text grid, the detail page is opened inside the right frame. Afterwards, the detail page is refreshed to update its content.

Communication between Frames

You already saw some methods in the previous section enabling one frame to open pages in another frame and to refresh information of other frames.

This section covers the following topics:

API inside the Adapter Class

The following table shows a summary of functions that you can reach in your adapter class which inherits from com.softwareag.cis.server.Adapter. See the JavaDoc documentation for implementation details.

Method Description
openCISPageInTarget(...)

Opens a certain Application Designer HTML page inside a certain frame which is identified by its target ID. There is a set of methods with different parameter notation.

The default method just needs to know the page URL and the ID of the frame. Other methods expect more information, e.g. if you want to open the Application Designer page in a different subsession.

refreshTarget(...)

Refreshes the target's frame content. This method is to be used if you want the target frame not to change its page but to update its content.

In the example in the previous section, this method is used after having updated the right frame's adapter on the server side.

invokeMethodInTarget(...)

Invokes a method in the target frame's Application Designer HTML page. The call is triggered from the client - for example, imagine that a button supporting the method is pressed in the target frame's Application Designer HTML page.

sizeTarget(...)

Manipulate the size of the target. Each target gets a certain size by the frame set definition on top of it (e.g. if the frame set definition has a sizing of "200,300,*", then the second frame has a size of "300". You can change the size of a target by using this method.

Pay Attention to Request Processing

Be aware of the request processing in the browser: only the page which sends a request (e.g. the left page in the example) is the active page and will process the response. All other pages living in neighboring frames are by default not affected.

Consequence: if you want to change or refresh these pages, you have to explicitly do so using the API presented in one of the previous sections.

Important:
The adapter that processes the request is the one to call the API methods.

Session Management (I)

Maybe you have already tried to build multi frame pages on your own, using HTML framesets:

...
...
<frameset cols="*,*">
  <frame src="../servlet/StartCISPage?PAGEURL=/project/left.html">
  <frame src="../servlet/StartCISPage?PAGEURL=/project/right.html">
</frameset>
...
...

If so, you will have seen that in each of the frames, the Application Designer page will be opened correctly. However, both pages are running in independent sessions (not subsessions).

Opening the same pages using Application Designer’s MF* controls (MFFRAMESET, MFCISPAGE) will keep both pages inisde the same session and subsession.

Note:
Details on session management are provided in the section Session Management.

Session Management (II)

When communicating between frames, e.g. by using the method Adapter.openCISPageInTarget(), the default is that the page that is opened in another target will be opened in the same session/subsession as the one that initiated the frame communication. Session ID and subsession ID are taken over by default.

There are certain variants of the openCISPageInTarget() method that allow to control the management of a subsession in a more fine granular way: you may pass as parameter the ID of the subsession in which a page should be opened in another page; i.e. you can explicitly decouple the other frame’s subsession from your own one.

The workplace that comes with Application Designer makes use of this: every time you open a content window, this content is managed in its own subsession, being decoupled from the workplace’s subsessions and being decoupled from other content pages’ subsessions.

Use these functions with care: typically all application adapters should run in one subsession, and only an "outside function" (such as the workplace management) should take care of starting various contents in various subsessions.

Combination with Normal Application Designer Pages

There is no problem to integrate multi frame pages into other Application Designer pages. The mechanisms described in the section Embedding Pages into Pages are valid for both normal Application Designer pages and multi frame Application Designer pages.

This means:

  • You can embed multi frame pages into normal Application Designer pages via the SUBCISPAGE2 control.

  • You can embed multi frame pages into normal Application Designer pages via the ROWTABSUBPAGES control.