|
Components |
|
| |||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
com.sas.swing.visuals.wizard.Wizard
public class Wizard
Wizard
is a class that provides a framework to develop wizards. The main components contained in the Wizard
are the deck
, the buttonPanel
, and the statusImagePanel
. Factory methods
createWizardPageDeck
, createButtonPanel
, and createStatusImagePanel
are provided to create these components.
The deck
is a WizardPageDeck
object which is responsible for containing and managing the pages in the wizard.
One of the main duties of the deck
is management of the path. The path is a vector of wizard page names that
defines the traversal order of the pages in the wizard.
The framework supports multiple paths through the pages in the wizard by allowing the path to be dynamically changed.
Wizard pages may be added in any order, and then the order the pages are shown may be explicitly managed
through the path
object.
Other responsibilities of the deck
include showing the pages, keeping track of whether a page has been shown
for the first time, whether pages have yet been instantiated, current page number, and total page count.
Pages contained in the Wizard
must implement the WizardPageInterface
interface. WizardPageInterface
contains the following
methods:
showPage
hidePage
cleanup
getPageInfo
isButtonEnabled
getStatusImage
BaseWizardPage
, designed to be subclassed, provides a default implementation of the WizardPageInterface
interface.
The buttonPanel
is a ButtonNavigationPanel
object, which contains buttons used to navigate through
the pages of the Wizard
. It handles the actionEvents generated by the buttons it contains. ActionEvents generated by buttons
having action commands ButtonNavigationPanel.BACK_COMMAND
and ButtonNavigationPanel.NEXT_FINISH_COMMAND
call on
the deck
to show previous and next pages respectively.
The action commands of other buttons firing ActionEvents are forwarded to the Wizard
handleButtonCommand
method for handling there.
The handleButtonCommand
method calls the cancel
, help
, or finish
method, depending on the action command received. Theses methods
should be overridden by Wizard
subclasses to provide the desired functionality. Subclasses of Wizard
that add custom buttons
to the ButtonNavigationPanel
object should override the handleButtonCommand
method to provide needed functionality.
The buttonPanel
, a ButtonNavigationPanel
object, uses a ButtonLayout
layout manager, which allows the spacing between the
buttons to be controlled, as well as providing left or right horizontal alignment. Methods are provided to add custom buttons,
and to remove buttons.
The statusImagePanel
is a JPanel
object used to hold an ImageView
object, in which images may be displayed.
The method setImage
can be used to dynamically change the image, or remove the image altogether.
If the desired behaviour is to have something other than an image shown in the statusImagePanel
, then the
method getStatusImagePanel
is called to obtain the statusImagePanel
object, and then can be used to add other
types of components to it.
A default image can be set for the Wizard
through method setDefaultImage
.
Wizard
pages implement the getStatusImage
method from the WizardPageInterface
interface to return the source for obtaining
the image to be shown, or return null if the desired behaviour is to have the statusImagePanel
empty.
The deck
calls the getStatusImage
method for a page each time it is shown, to display the appropriate image for the page.
The default behaviour for BaseWizardPage
method getStatusImage
is to return the Wizard's
default image.
Since there may be multiple paths through a wizard, then there may be pages in the wizard that are never used, depending
upon the path chosen by the user. The Wizard framework provides delayed page instantiation capability, where the pages are
not created until the time they are shown for the first time. This may be a more efficient option if there are many pages
in the Wizard
that have a low probability of being used. The other option is to have all of the pages created at the
time of Wizard
construction, regardless of whether they will be seen by the user or not.
The default Wizard
constructor will create the pages in advance of being shown. To use the delayed page instantiation option,
the constructor public Wizard(String wizardName, int whenToCreate)
should be used. For example, the following
shows a Wizard
subclass, MyWizard, using delayed page instantiation:
MyWizard wizard = new MyWizard("Wizard Name", Wizard.CREATE_WHEN_SHOWN);
When this delayed instantiation option is chosen, the Wizard
method createNamedPage
must be overridden in the Wizard
subclass,
such as:
public WizardPageInterface createNamedPage(String pageName){
WizardPageInterface page = null;
if( pageName.equals("page1") ){
page = new WizardPage1(this, "Introduction");
}
else if( pageName.equals("page2") ){
page = new WizardPage2(this, "Another Page");
}
...
return page;
}
Adding Pages to the Wizard
:
There are three methods that can be used to add pages to the Wizard
. Each page has a unique, identifying name associated with it.
public void addPage(String pageName, WizardPageInterface page)
public void addPage(String pageName)
public void addPages(String[] pageNames)
If either of the last two methods are used, where the page is added by its identifying name only, then the createNamedPage
must be overridden. Use one of these last two methods to add pages if delayed instantiation is desired.
Setting the path in the Wizard
:
The path contains the wizard page names that define the traversal order of the pages in the wizard. The names of the pages are added to the
path when the pages are added to the wizard through one of the above mentioned addPage methods. The order of the names in the path will be
in the same order as the pages were added.
The path may also be set using the following method:
public void setPath(String[] pageNames)
This method sets the order of traversal of pages in the wizard to that of the order in the pageNames
array,
and then shows the first page in the path in the deck
.
The appendPath
method can be used to dynamically change the path. For example, below is a Wizard
page where the
path changes according to which JCheckBox
the user selects:
public class ChangePathPage extends BaseWizardPage implements ItemListener{
JCheckBox checkBox1, checkBox2;
....
public void itemStateChanged(ItemEvent event){
if(checkBox1.isSelected()){
wizard.appendPath(new String[] {"summary"} );
}
else if(checkBox2.isSelected()){
wizard.appendPath(new String[] {"page8", "page9", "summary"} );
}
...
}
...
}
The appendPath
method first removes any page names following the current page name in the path, and then
appends the names of the pages in the array passed to it on the end.
A page name may only exist in the path one time. Also, any page names appended to the path should have been previously added through
one of the addPage
methods.
Wizard
was designed to extend JPanel
to provide greater flexibilty for containment. Utility method showWizardDialog
is
provided to place the wizard in a JDialog
.
Field Summary | |
---|---|
protected BackAction |
backAction
|
protected ButtonNavigationPanel |
buttonPanel
A ButtonNavigationPanel object that contains and manages the buttons used to navigate through the wizard. |
protected CancelAction |
cancelAction
|
protected boolean |
closeWindowOnCancel
A boolean value indicating if the window containing the wizard should be disposed of when either the cancel button or the close button in the window's title bar are selected, before the cancel method is called. |
static int |
CREATE_IN_ADVANCE
An int value informing the wizard to create all of the pages in advance, before the time they are shown for the first time. |
static int |
CREATE_WHEN_SHOWN
An int value informing the wizard to delay instantiation of pages until the time they are shown for the first time. |
protected java.lang.String |
currentImageSource
The source path or URL for obtaining the current image being displayed in the wizard. |
protected WizardPageDeck |
deck
A WizardPageDeck object that contains and manages all of the wizard pages. |
protected javax.swing.JPanel |
deckAndImagePanel
Container used in the wizard layout that holds the deck and the statusImagePanel |
protected java.lang.String |
defaultImage
The source path or URL for obtaining the default image. |
protected FinishAction |
finishAction
|
protected HelpAction |
helpAction
|
protected ImageView |
imageView
An ImageView object that is used to display images in the statusImagePanel |
protected Next_FinishAction |
next_finishAction
|
protected boolean |
promptOnClose
A boolean value indicating if a message should be displayed when the close button in the title bar of the window containing the wizard is selected. |
static java.lang.String |
RB_KEY
|
protected javax.swing.JPanel |
statusImagePanel
Container used in the wizard layout that may hold an ImageView object, or any other type of component depending upon the requirements of individual wizard pages. |
protected java.lang.String |
titleFormatString
Specifies the format of the wizard title |
protected int |
whenToCreatePage
Flag specifying when the wizard will create the pages. |
protected java.lang.String |
wizardName
The name of this wizard. |
Constructor Summary | |
---|---|
Wizard()
Constructs a Wizard with wizardName set to null, and whenToCreatePage flag set to CREATE_IN_ADVANCE. |
|
Wizard(java.lang.String wizardName)
Constructs a Wizard with the specified wizardName, and whenToCreatePage flag set to CREATE_IN_ADVANCE. |
|
Wizard(java.lang.String wizardName,
int whenToCreate)
Constructs a Wizard with the specified wizardName and whenToCreatePage flag. |
Method Summary | |
---|---|
void |
addPage(java.lang.String pageName)
Adds the name of a page to the wizard, and adds the page name to the end of the path . |
void |
addPage(java.lang.String pageName,
WizardPageInterface page)
Adds a page instance and its corresponding name to the wizard, and adds the page name to the end of the path . |
void |
addPages(java.lang.String[] pageNames)
Adds the page names to the wizard, and to the end of the path . |
void |
appendPath(java.lang.String[] pageNames)
The path defines the traversal order of the pages in the wizard. |
void |
cancel()
This method should be overidden by subclasses to provide the desired functionality when the Cancel button is activated in the ButtonNavigationPanel. |
protected void |
cleanup()
Calls WizardPageInterface method cleanup on individual wizard pages. |
void |
closeWindow()
Disposes of the Window that contains the Wizard |
ButtonNavigationPanel |
createButtonPanel()
Constucts and returns a ButtonNavigationPanel containing buttons used to navigate through the wizard. |
void |
createLayout()
Creates and sets the layout manager for the wizard. |
WizardPageInterface |
createNamedPage(java.lang.String pageName)
This method should be overridden by Wizard subclasses if delayed page instantiation is selected. |
javax.swing.JComponent |
createSeparator()
Returns a separator component used in the wizard layout. |
javax.swing.JPanel |
createStatusImagePanel()
Constructs and returns a JPanel object. |
void |
createVisuals()
Calls method createLayout to create and set the layout manager for the wizard. |
protected ImageView |
createWizardImageView()
Factory method used to create the imageView object. |
WizardPageDeck |
createWizardPageDeck()
Factory method used to construct the deck object. |
int |
displayCancelPrompt()
Displays a confirmation message dialog with Yes and No options. |
void |
enableButtons()
|
void |
finish()
This method should be overidden by subclasses to provide the desired functionality when the Finish button is activated in the ButtonNavigationPanel . |
BackAction |
getBackAction()
|
ButtonNavigationPanel |
getButtonPanel()
Returns the buttonPanel . |
CancelAction |
getCancelAction()
|
boolean |
getCloseWindowOnCancel()
Returns a boolean value indicating if the window containing the wizard should be disposed of when either the cancel button or the close button in the window's title bar are selected, before the cancel method is called. |
java.lang.String |
getCurrentImageSource()
Returns a string specifying the source (location) for obtaining the current image being shown in the statusImagePanel of the wizard, or null if an image
is not currently being displayed. |
java.lang.String |
getCurrentPageName()
Returns the name of the current page being shown in the wizard, or null if the path has not been set. |
java.lang.String |
getDefaultImage()
Returns the source (location) for obtaining the default image for the wizard. |
FinishAction |
getFinishAction()
|
HelpAction |
getHelpAction()
|
Next_FinishAction |
getNext_FinishAction()
|
WizardPageInterface |
getPage(java.lang.String pageName)
Returns a WizardPageInterface object corresponding to its name pageName . |
java.lang.String |
getPageName(WizardPageInterface page)
Returns name of a WizardPageInterface object page . |
java.lang.String[] |
getPath()
|
boolean |
getPromptOnClose()
Returns a boolean value indicating if a message should be displayed when the close button in the title bar of the window containing the wizard is selected. |
javax.swing.JPanel |
getStatusImagePanel()
Returns the statusImagePanel . |
java.lang.String |
getTitle()
Returns the title of the current page being shown in the wizard, or null if the path has not been set. |
java.lang.String |
getTitleFormatString()
Returns the titleFormatString . |
static com.sas.swing.visuals.wizard.WizardDialog |
getWizardDialog(javax.swing.JFrame frame,
Wizard wizard)
Creates and returns a dialog containing wizard . |
java.lang.String |
getWizardName()
Returns the name of the wizard. |
void |
handleButtonCommand(java.lang.String actionCommand)
This method is called when a button in the ButtonNavigationPanel is activated. |
void |
help()
This method should be overidden by subclasses to provide the desired functionality when the Help button is activated in the ButtonNavigationPanel. |
void |
propertyChange(java.beans.PropertyChangeEvent pce)
Processes a PropertyChangeEvent. |
void |
removePage(java.lang.String pageName)
|
void |
setCloseWindowOnCancel(boolean closeAction)
Set whether the window containing the wizard should be disposed of when either the cancel button or the close button in the window's title bar are selected, before the cancel method is called. |
void |
setDefaultImage(java.lang.String imageSource)
Sets the source (location) for obtaining the default image for the wizard. |
void |
setImage(java.lang.String imageSource)
Sets the source on the imageView to imageSource , and adds imageView
to the statusImagePanel . |
void |
setPath(java.lang.String[] pageNames)
The path defines the traversal order of the pages in the wizard. |
void |
setPromptOnClose(boolean promptAction)
Sets whether a message should be displayed when the close button in the title bar of the window containing the wizard is selected. |
void |
setTitleFormatString(java.lang.String titleFormat)
Sets the titleFormatString to the specified titleFormat |
void |
setWizardName(java.lang.String name)
Sets the wizardName to the specified name. |
void |
showPage(java.lang.String pageName)
Shows the page corresponding to the name pageName in the wizard. |
static void |
showWizardDialog(javax.swing.JFrame frame,
Wizard wizard)
Displays a Wizard object in a dialog. |
Field Detail |
---|
public static final java.lang.String RB_KEY
protected BackAction backAction
protected FinishAction finishAction
protected Next_FinishAction next_finishAction
protected CancelAction cancelAction
protected HelpAction helpAction
protected boolean closeWindowOnCancel
protected boolean promptOnClose
public static final int CREATE_WHEN_SHOWN
CREATE_IN_ADVANCE
,
whenToCreatePage
,
Constant Field Valuespublic static final int CREATE_IN_ADVANCE
CREATE_WHEN_SHOWN
,
whenToCreatePage
,
Constant Field Valuesprotected int whenToCreatePage
CREATE_WHEN_SHOWN
,
CREATE_IN_ADVANCE
protected ImageView imageView
statusImagePanel
statusImagePanel
,
currentImageSource
,
defaultImage
protected java.lang.String currentImageSource
getCurrentImageSource()
,
setImage(java.lang.String)
,
statusImagePanel
protected java.lang.String defaultImage
setDefaultImage(java.lang.String)
,
getDefaultImage()
protected java.lang.String wizardName
protected WizardPageDeck deck
protected ButtonNavigationPanel buttonPanel
protected java.lang.String titleFormatString
setTitleFormatString(java.lang.String)
,
getTitleFormatString()
protected javax.swing.JPanel statusImagePanel
statusImagePanel
should be empty.
If the desired behaviour is to have something other than an image shown in this panel, then the method getStatusImagePanel
can be called to obtain the statusImagePanel
object, and then used to add other types of components to it.
WizardPageInterface.getStatusImage()
,
getStatusImagePanel()
protected javax.swing.JPanel deckAndImagePanel
deck
and the statusImagePanel
Constructor Detail |
---|
public Wizard()
wizardName
,
CREATE_IN_ADVANCE
public Wizard(java.lang.String wizardName)
wizardName
- the name of the wizard.wizardName
,
CREATE_IN_ADVANCE
public Wizard(java.lang.String wizardName, int whenToCreate)
wizardName
- the name of the wizard.whenToCreatePage
- int value telling wizard when to create the wizard pages.wizardName
,
CREATE_WHEN_SHOWN
,
CREATE_IN_ADVANCE
Method Detail |
---|
public Next_FinishAction getNext_FinishAction()
public CancelAction getCancelAction()
public HelpAction getHelpAction()
public FinishAction getFinishAction()
public BackAction getBackAction()
public void createLayout()
createVisuals
. Subclasses can override
this method to create and use a different layout manager.
createVisuals()
public void createVisuals()
createLayout
to create and set the layout manager for the wizard. Constructs the Wizard
visual components, and adds them to the Wizard.
The deckAndImagePanel
, a separator, and the buttonPanel
are constructed and added to the Wizard in that order.
The separator and buttonPanel
are created through the factory methods createSeparator
and
createButtonPanel
.
The deck
and statusImagePanel
objects are constructed and added to the deckAndImagePanel
. These objects
are created through factory methods createWizardPageDeck
and createStatusImagePanel
.
createLayout()
,
createStatusImagePanel()
,
createWizardImageView()
,
createSeparator()
,
createButtonPanel()
public void setTitleFormatString(java.lang.String titleFormat)
titleFormat
titleFormatString
,
getTitleFormatString()
,
getTitle()
public java.lang.String getTitleFormatString()
titleFormatString
.
titleFormatString
,
setTitleFormatString(java.lang.String)
,
getTitle()
public void setWizardName(java.lang.String name)
name
- the name of the wizardgetWizardName()
public java.lang.String getWizardName()
setWizardName(java.lang.String)
public void addPage(java.lang.String pageName, WizardPageInterface page)
path
. The page
variable
has a null value if not yet instantiated. Calls WizardPageDeck
method
addPage(String pageName, WizardPageInterface page)
through the deck
object.
Every page must have a unique identifying name, pageName
. WizardPageInterface
objects
may only be added one time, with one name. If a page with the same pageName
was previously added,
or the * page
object was already added under another name, then an IllegalArgumentException is thrown.
pageName
- the name of the pagepage
- the instance of the page corresponding to the name pageNameaddPage(String pageName)
,
addPages(String[] pageNames)
,
deck
public void addPage(java.lang.String pageName)
path
. If delayed creation of pages has been opted for,
then the page corresponding the the name pageName
will be instantiated by
calling the createNamedPage
method at the time the page is initially shown.
The createNamedPage
method must be overridden to add pages in this manner.
If the option to create pages in advance is chosen, then this method first creates the page by
calling the createNamedPage
method and adds it by calling
addPage(String pageName, WizardPageInterface page)
.
If a page with the same pageName
was previously added, an IllegalArgumentException is thrown.
pageName
- the name of the page to be added to the wizard.createNamedPage(String pageName)
,
addPage(String pageName, WizardPageInterface page)
,
addPages(String[] pageNames)
public void addPages(java.lang.String[] pageNames)
path
. If delayed creation of pages has been selected,
then the instantiation of the pages will be delayed until the time they are shown for the
first time. The createNamedPage
method must be overridden to add pages in this manner.
The order of names in the pageNames array is not important, and doesn't affect the order
or traversal of pages in the wizard.
If any of the names in the pageNames
array were previously added, an IllegalArgumentException
is thrown.
pageNames
- array of wizard page names to be added to the wizard.createNamedPage(java.lang.String)
public void removePage(java.lang.String pageName)
WizardPageDeck.removePage(java.lang.String)
public WizardPageInterface createNamedPage(java.lang.String pageName)
pageName
- the name of the page to create an instance of
public void setPath(java.lang.String[] pageNames)
pageNames
array. The first page in the path is shown in the wizard.
pageNames
- an array of page names defining the desired order of the path through the wizardappendPath(java.lang.String[])
public void appendPath(java.lang.String[] pageNames)
pageNames
to the end.
pageNames
- an array of page names to be added to the path following the current
page name, replacing any names currently there.setPath(java.lang.String[])
public java.lang.String[] getPath()
WizardPageDeck.getPath()
public void handleButtonCommand(java.lang.String actionCommand)
If actionCommand
is equal to ButtonNavigationPanel.HELP_COMMAND, the help method is called.
If actionCommand
is equal to ButtonNavigationPanel.CANCEL_COMMAND, the cancel method is called. If closeWindowOnCancel
is set to true, then the window containing the Wizard is disposed of by calling method closeWindow
, and then
the cancel
method is called.
If actionCommand
is equal to ButtonNavigationPanel.NEXT_FINISH_COMMAND, the finish method is called.
actionCommand
- the action command associated with the button that fired an actionEvent.public void enableButtons()
ButtonNavigationPanel.enableButtons()
public void help()
public void cancel()
Wizard
subclasses should call
super.cleanup()
method at the end of this method, to invoke the WizardPageInterface
cleanup
method on the individual wizard pages.
cleanup()
public int displayCancelPrompt()
Returns an int value representing the response to the message dialog. Valid values are JOptionPane.YES_OPTION, and JOptionPane.NO_OPTION.
This method is called from the WizardDialog windowClosing
method if promptOnClose
is
set to true.
If the Yes option in the message dialog is selected, and closeWindowOnCancel
is set to
true, the closeWindow method is called. Then the cancel method is called. If the closeWindowOnCancel
is set to false, then only the cancel method is called.
public void closeWindow()
public void finish()
ButtonNavigationPanel
. Wizard
subclasses should call
super.cleanup()
method at the end of this method, to invoke the WizardPageInterface
cleanup
method
on the individual wizard pages.
cleanup()
protected void cleanup()
WizardPageInterface
method cleanup
on individual wizard pages.
finish()
,
cancel()
public void showPage(java.lang.String pageName)
pageName
in the wizard. If pageName
is not in the current path, an IllegalArgumentException is thrown.
pageName
- the name of the page to be shown in the wizardpublic java.lang.String getPageName(WizardPageInterface page)
page
.
page
- a WizardPageInterface objectpublic WizardPageInterface getPage(java.lang.String pageName)
pageName
.
pageName
- the name of the WizardPageInterface object to returnpublic java.lang.String getCurrentPageName()
public java.lang.String getTitle()
titleFormatString
.
The default titleFormatString
is "{0} -- Step {1} of {2} {3}", where the parameters represent:
Subclasses that change the default titleFormatString
should override this method
to provide correct formatting.
titleFormatString
,
setTitleFormatString(java.lang.String)
,
getTitleFormatString()
,
Message.format(java.util.ResourceBundle, java.lang.String, java.lang.Object[])
public java.lang.String getDefaultImage()
setDefaultImage(java.lang.String)
,
WizardPageInterface.getStatusImage()
public void setDefaultImage(java.lang.String imageSource)
imageSource
- the source path or URL for obtaining the default imagegetDefaultImage()
public java.lang.String getCurrentImageSource()
statusImagePanel
of the wizard, or null if an image
is not currently being displayed.
currentImageSource
public void setImage(java.lang.String imageSource)
imageView
to imageSource
, and adds imageView
to the statusImagePanel
. If imageSource
is null, the imageView
is removed from the statusImagePanel
.
imageSource
- the location for obtaining the image to be shownstatusImagePanel
,
imageView
public ButtonNavigationPanel createButtonPanel()
Wizard subclasses which require different buttons may override this method to create a ButtonNavigationPanel with the appropriate buttons, or may add or remove buttons through the ButtonNavigationPanel addButton and removeButton methods.
buttonPanel
,
ButtonNavigationPanel
,
createVisuals()
public ButtonNavigationPanel getButtonPanel()
buttonPanel
.
buttonPanel
buttonPanel
public javax.swing.JComponent createSeparator()
createVisuals()
public WizardPageDeck createWizardPageDeck()
deck
object. Constructs and returns a WizardPageDeck object.
deck
,
WizardPageDeck
,
createVisuals()
public javax.swing.JPanel createStatusImagePanel()
statusImagePanel
,
createVisuals()
public javax.swing.JPanel getStatusImagePanel()
statusImagePanel
.
statusImagePanel
statusImagePanel
public void propertyChange(java.beans.PropertyChangeEvent pce)
propertyChange
in interface java.beans.PropertyChangeListener
event
- the event indicating what property changedprotected ImageView createWizardImageView()
imageView
object. Returns an WizardImageView object with a black background
color, and transparency set to false.
imageView
,
createVisuals()
public void setCloseWindowOnCancel(boolean closeAction)
closeWindowOnCancel
public boolean getCloseWindowOnCancel()
closeWindowOnCancel
public void setPromptOnClose(boolean promptAction)
method is called to display a message asking the user to verify the close action.
when the close button is sdisplayCancelPromptelected.
promptOnClose
,
displayCancelPrompt()
public boolean getPromptOnClose()
displayCancelPrompt
,
asking the user to verify the close action.
promptOnClose
,
displayCancelPrompt()
public static com.sas.swing.visuals.wizard.WizardDialog getWizardDialog(javax.swing.JFrame frame, Wizard wizard)
wizard
.
frame
- the frame that owns this dialogwizard
- the wizard object to place in this dialogpublic static void showWizardDialog(javax.swing.JFrame frame, Wizard wizard)
Wizard
object in a dialog. The Wizard
object will be centered over the specified frame
.
frame
- the frame that owns this dialogwizard
- the wizard object to show in this dialog
|
Components |
|
| |||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |