//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
//
//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
//
//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//

//  File   : SALOMEDS_Attributes.idl
//  Author : Yves FRICAUD
//  $Header: /home/server/cvs/KERNEL/KERNEL_SRC/idl/SALOMEDS_Attributes.idl,v 1.10.2.3.2.2 2010-04-22 10:15:33 ouv Exp $
//
/*! \file SALOMEDS_Attributes.idl 
    \brief This file contains a set of interfaces
    for the attributes which can be assigned to SObject
*/
#ifndef _SALOMEDS_AttributesIDL_
#define _SALOMEDS_AttributesIDL_

#include "SALOMEDS.idl"

module SALOMEDS
{
  //! Sequence of double values
  typedef sequence <double> DoubleSeq;
  //! Sequence of long values
  typedef sequence <long>   LongSeq;
  //! Sequence of string values
  typedef sequence <string> StringSeq;

  /*!
    \brief Represents the color based on RGB palette.
    
    Used by different interfaces to specify the color attributes of different items.
  */
  struct Color {
    //! Red component of the color
    double R;
    //! Green component of the color
    double G;
    //! Blue component  of the color
    double B;
  };

  //==========================================================================
  /*!
    \brief Attribute allowing to store a real value

    <em>See \ref example1 for an example of this attribute usage in batchmode of %SALOME application.</em>

    \sa AttributeInteger, AttributeString
  */
  //==========================================================================
  interface AttributeReal : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return attribute value
    */
    double Value();
    /*!
      \brief Sets the value of the attribute
      \param value value being set to the attribute
    */
    void   SetValue(in double value);

  };

  //==========================================================================
  /*!
    \brief Attribute allowing to store an %integer value

    <em>See \ref example17 for an example of this attribute usage in batchmode of %SALOME application.</em>

    \sa AttributeReal, AttributeString
  */
  //==========================================================================
  interface AttributeInteger : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return attribute value
    */
    long   Value();

    /*!
      \brief Sets the value of the attribute
      \param value value being set to the attribute
    */
    void   SetValue(in long value);
  };

  //==========================================================================
  /*!
    \brief Attribute allowing to store a sequence of real values.
    \note The indices in the sequence start from 1.

    <em>See \ref example3 for an example of this attribute usage in batchmode of %SALOME application.</em>

    \sa AttributeSequenceOfInteger
  */
  //==========================================================================
  interface AttributeSequenceOfReal : GenericAttribute
  {
    /*!
      \brief Initialization of the attribute with initial data.
      \param other sequence of values assigned to the attribute
    */
    void      Assign (in DoubleSeq other);
    /*! 
      \brief Returns the sequence of values stored in the attribute.
      \return sequence of values
    */
    DoubleSeq CorbaSequence();
    /*!
      \brief Adds new value to the end of the sequence.
      \param value value being added to the sequence
    */
    void      Add (in double value);
    /*!
      \brief Removes a value by the specified \a index
             from the sequence stored in the attribute.
      \param index index of the value in the sequence to be removed
    */
    void      Remove(in long index);
    /*!
      \brief Sets new value to the sequence by the specified \a index.
      \param index index in the sequence
      \param value new value being set to the sequence by specified \a index
    */
    void      ChangeValue(in long index, in double value);
    /*!
      \brief Returns a value in the sequence specified by its \a index.
      \param index index in the sequence
      \return value specified by \a index
    */
    double    Value(in short index);
    /*!
      \brief Returns the length of the sequence stored in the attribute.
      \return sequence length
    */
    long      Length();
  };
  
  //==========================================================================
  /*!
    \brief Attribute allowing to store a sequence of %integer values.
    \note The indices in the sequence start from 1.

    <em>See \ref example4 for an example of this attribute usage in batchmode of %SALOME application.</em>

    \sa AttributeSequenceOfReal
   */
  //==========================================================================
  interface AttributeSequenceOfInteger : GenericAttribute
  {
    /*!
      \brief Initialization of the attribute with initial data.
      \param other sequence of values assigned to the attribute
    */
    void      Assign (in LongSeq other);
    /*! 
      \brief Returns the sequence of values stored in the attribute.
      \return sequence of values
    */
    LongSeq   CorbaSequence();
    /*!
      \brief Adds new value to the end of the sequence.
      \param value value being added to the sequence
    */
    void      Add (in long value);
    /*!
      \brief Removes an value by the specified \a index
             from the sequence stored in the attribute.
      \param index index of the value in the sequence to be removed
    */
    void      Remove(in long index);
    /*!
      \brief Sets new value to the sequence by the specified \a index.
      \param index index in the sequence
      \param value new value being set to the sequence by specified \a index
    */
    void      ChangeValue(in long index, in long value);
    /*!
      \brief Returns a value in the sequence specified by its \a index.
      \param index index in the sequence
      \return value specified by \a index
    */
    long      Value(in short index);
    /*!
      \brief Returns the length of the sequence stored in the attribute.
      \return sequence length
    */
    long      Length();
  };

  //==========================================================================
  /*!
    \brief Name attribute

    The attribute stores a string value, which corresponds to the name of the SObject
    or to the name of corresponding %object.

    <em>See \ref example5 for an example of this attribute usage in batchmode of %SALOME application.</em>
    
    \sa AttributeComment
  */
  //==========================================================================
  interface AttributeName : GenericAttribute
  {
    /*!
      \brief Returns the value assigned to the attribute.
      \return attribute value
    */
    string Value();
    /*!
      \brief Sets the value of the attribute (name of a SObject).
      \param value value being set to the attribute
    */
    void   SetValue(in string value);
  };

  //==========================================================================
  /*!
    \brief Comment attribute

    The attribute stores a string value containing supplementary information about
    the SObject. In particular it contains the data type of the %SComponent.
    
    <em>See \ref example6 for an example of this attribute usage in batchmode of %SALOME application.</em>
      
    \sa AttributeName
  */
  //==========================================================================
  interface AttributeComment : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return attribute value
    */
    string Value();
    /*!
      \brief Sets the value of the attribute (description of a SObject).
      \param value value being set to the attribute
    */
    void   SetValue(in string value);
  };

  //==========================================================================
  /*!
    \brief String attribute
    
    The attribute stores a string value containing arbitrary information.
    \sa AttributeInteger, AttributeReal
  */
  //==========================================================================
  interface AttributeString : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return attribute value
    */
    string Value();
    /*!
      \brief Sets the value of the attribute.
      \param value value being set to the attribute
    */
    void   SetValue(in string value);
  };

  //==========================================================================
  /*!
    \brief IOR attribute
    
    The attribute stores a string value identifying a runtime %object. 
    In particular it contains CORBA Interoperable Object Reference.

    <em>See \ref example19 for an example of this method usage in batchmode of %SALOME application.</em>

    \sa AttributePersistentRef
  */
  //==========================================================================
  interface AttributeIOR : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return attribute value
    */
    string Value();
    /*!
      \brief Sets the value of the attribute (IOR of a SObject).
      \param value value being set to the attribute.
    */
    void   SetValue(in string value);
  };

  //==========================================================================
  /*!
    \brief Persistent reference attribute
    
    The attribute stores a persistent identifier of the %object. It is a part
    of SALOME persistence mechanism .

    <em>See \ref example7 for an example of this method usage in batchmode of %SALOME application.</em>

    \sa AttributeIOR
  */
  //==========================================================================
  interface AttributePersistentRef : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return attribute value
    */
    string Value();
    /*!
      \brief Sets the value of the attribute.
      \param value Value being set to the attribute
    */
    void   SetValue(in string value);
  };

  //==========================================================================
  /*!
    \brief External file definition.
    
    The attribute stores a path to an external file.
    
    \sa AttributeFileType
  */
  //==========================================================================
  interface AttributeExternalFileDef: GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return attribute value
    */
    string Value();
    /*!
      \brief Sets the value of the attribute.
      \param value value being set to the attribute
    */
    void   SetValue(in string value);
  };

  //==========================================================================
  /*!
    \brief External file type definition.

    The attribute stores an external file type.

    \sa AttributeExternalFileDef
  */
  //==========================================================================
  interface AttributeFileType: GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return attribute value
    */
    string Value();
    /*!
      \brief Sets the value of the attribute.
      \param value value being set to the attribute
    */
    void   SetValue(in string value);
  };

  //==========================================================================
  // Presentation attributes (parameters of the object displaying in the Object browser)
  //==========================================================================

  //==========================================================================
  /*!
    \brief Drawable flag attribute.

    This presentation attribute specifies if the parent SObject should be displayed
    in the study tree in the Object browser.

    If this attribute is defined for the parent %object and set to \c false, the item
    is not displayed in the Object browser. By default, the item is always displayed.

    <em>See \ref example8 for an example of this attribute usage in batchmode of %SALOME application.</em>

    \sa AttributeExpandable, AttributeSelectable
  */
  //==========================================================================
  interface AttributeDrawable : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return \c true if the item is drawable or \c false otherwise
    */
    boolean IsDrawable();
    /*!
      \brief Sets the value of the attribute.
      \param value value being set to the attribute (\c true if item should be drawable or \c false otherwise)
    */
    void    SetDrawable(in boolean value);
  };

  //==========================================================================
  /*!
    \brief Selectable flag attribute.

    This presentation attribute specifies if the parent SObject is selectable
    by the user in the Object browser.
    If this attribute is defined for the parent %object and set to \c false, the item
    is not selectable in the Object browser. By default, the item is always selectable.

    <em>See \ref example9 for an example of this attribute usage in batchmode of %SALOME application.</em>

    \sa AttributeDrawable, AttributeExpandable
  */
  //==========================================================================
  interface AttributeSelectable : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return \c true if the item is selectable or \c false otherwise
    */
    boolean IsSelectable();
    /*!
      \brief Sets the value of the attribute.
      \param value value being set to the attribute (\c true if item should be selectable or \c false otherwise)
    */
    void    SetSelectable(in boolean value);
  };

  //==========================================================================
  /*!
    \brief Expandable flag attribute.

    This presentation attribute specifies if the parent SObject can be expanded
    by the user in the Object browser (to show its child objects).
    If this attribute is defined for the parent %object and set to \c false, the item
    is not expandable in the Object browser. By default, the item is always expandable
    (if it has children).
    
    <em>See \ref example10 for an example of this attribute usage in batchmode of %SALOME application.</em>

    \sa AttributeDrawable, AttributeSelectable
  */
  //==========================================================================
  interface AttributeExpandable : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return \c true if the item is expandable or \c false otherwise
    */
    boolean IsExpandable();
    /*!
      \brief Sets the value of the attribute.
      \param value value being set to the attribute (\c true if item should be expandable or \c false otherwise)
    */
    void    SetExpandable(in boolean value);
  };

  //==========================================================================
  /*!
    \brief Flags attribute.

    The interface is intended for storing different %object attributes that
    have only two states: 0 (\c false) or 1 (\c true).
    \note The interpretation of the flag values attribute is a matter of the user.
    \note The total number of flags which can be stored in a single attribute
    is defined by the size of CORBA::Long data type.
  */
  //==========================================================================

  interface AttributeFlags : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return set of flags currently set to the attribute
    */
    long    GetFlags();
    /*!
      \brief Sets the value of the attribute.
      \param flags new set of flags to be stored in the attribute
    */
    void    SetFlags(in long flags);
    /*!
      \brief Test the value for the specified flag or set of flags.
      \param flags flag or set of flags being tested.
      \return \c true if all bits correspoding to the \a flags are currently set or \c false otherwise
    */
    boolean Get(in long flags);
    /*!
      \brief Set/clear specific flag or set of flags.
      \param flags flag or set of flags being set / cleared
      \param value \c true if all bits correspoding to the \a flags should be set
              or \c false if flag(s) should be cleared
    */
    void    Set(in long flags, in boolean value);
  };

  //==========================================================================
  /*!
    \brief Graphic attribute.

    This interface is intended for storing information about graphical representation
    of the %object in different views.
  */
  //==========================================================================
  interface AttributeGraphic : GenericAttribute
  {
    /*!
      \brief Set / clear visibility flag of the parent SObject for the view
             specified by \a viewId.
      \param viewId view identifier
      \param value visibility flag value being set to the attribute
    */
    void     SetVisibility(in long viewId, in boolean value);
    /*!
      \brief Get visibility flag of the parent SObject for the view
             specified by \a viewId.
      \param viewId view identifier
      \return visibility flag currently set to the attribute for the specified view
    */
    boolean  GetVisibility(in long viewId);
  };  

  //==========================================================================
  /*!
    \brief Opened flag Attribute
    \warning Deprecated interface. Not used since version 3.0.

    This presentation attribute specifies if the item corresponding to the
    parent SObject in the Object browser is currently opened (expanded) or no.
  */
  //==========================================================================
  interface AttributeOpened : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \obsolete
      \return \c true if the item is opened (expanded) in the Object browser or \c false otherwise
    */
    boolean IsOpened();
    /*!
      \brief Sets the value of the attribute.
      \obsolete
      \param value value being set to the attribute (\c true if item should 
                   be opened (expanded) or \c false otherwise)
    */
    void    SetOpened(in boolean value);
  };

  //==========================================================================
  /*!
    \brief Text color attribute.

    This attribute allows to specify the text color to be used to render the item
    in the Object browser. If the attribute is not set for the SObject, default
    value (GUI specific) is used.

    <em>See \ref example12 for an example of this attribute usage in batchmode of %SALOME application.</em>

    \sa AttributeTextHighlightColor, AttributePixMap
  */
  //==========================================================================
  interface AttributeTextColor : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return text color assigned to the attribute
    */
    Color  TextColor();
    /*!
      \brief Sets the value of the attribute.
      \param value text color value being set to the attribute
    */
    void   SetTextColor(in Color value);
  };

  //==========================================================================
  /*!
    \brief Text highlight color attribute.
    
    This attribute allows to specify the highlight color to be used to render
    the item in the Object browser (used only when the item is selected).
    If the attribute is not set for the SObject, default value (GUI specific) is used.

    <em>See \ref example13 for an example of this attribute usage in batchmode of %SALOME application.</em>

    \sa AttributeTextColor, AttributePixMap
  */
  //==========================================================================
  interface AttributeTextHighlightColor : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return highlight color assigned to the attribute
    */
    Color  TextHighlightColor();
    /*!
      \brief Sets the value of the attribute.
      \param value highlight color value being set to the attribute
    */
    void   SetTextHighlightColor(in Color value);
  };

  //==========================================================================
  /*!
    \brief Icon attribute.
    
    This attribute is used to specifiy the name (file name) of an icon which
    should be drawn in the Object browser when rendering an item.

    <em>See \ref example14 for an example of this attribute usage in batchmode of %SALOME application.</em>

    \sa AttributeTextColor, AttributeTextHighlightColor
  */
  //==========================================================================
  interface AttributePixMap : GenericAttribute
  {
    /*!
      Checks if the pixmap is assigned to the attribute.
      \return \c true if an icon file name is set to the attribute
    */
    boolean HasPixMap();
    /*!
      \brief Returns the value of the attribute.
      \return icon file name assigned to the attribute (empty string if not set)
    */
    string  GetPixMap();
    /*!
      \brief Sets the value of the attribute.
      \param icom file name being set to the attribute
    */
    void    SetPixMap(in string value);
  };

  //==========================================================================
  /*!
    \brief Tree node attribute.

    By specifying the tree node attributes for the SObjects it is possible to
    create internal auxillary %object tree with its own structure and identifier.

    Since each such tree is specfied by the unique identifier, it is possible
    to create as many trees as it is required.
    
    <em>See \ref example18 for an example of usage of this attribute in batchmode of %SALOME application.</em>
  */
  //==========================================================================
  interface AttributeTreeNode : GenericAttribute
  {
    /*!
      \brief Assigns the father tree node to this tree node.
      \param father tree node attribute being set as a parent of this tree node
    */
    void              SetFather(in AttributeTreeNode father);
    /*!
      \brief Checks if father tree node attribute is set for this tree node.
      \return \c true if father tree node attribute is defined or \c false otherwise
    */
    boolean           HasFather();
    /*!
      \brief Returns the father tree node of this tree node.
      \return father tree node attribute
    */
    AttributeTreeNode GetFather();
    /*!
      \brief Assigns the previous sibling tree node to this tree node.
      \param sibling tree node attribute being set as a previous sibling of this tree node
    */
    void              SetPrevious(in AttributeTreeNode sibling);
    /*!
      \brief Checks if previous sibling tree node attribute is set for this tree node.
      \return \c true if previous sibling tree node attribute is defined or \c false otherwise
    */
    boolean           HasPrevious();
    /*!
      \brief Returns the previous sibling tree node of this tree node.
      \return previous sibling tree node attribute
    */
    AttributeTreeNode GetPrevious();
    /*!
      \brief Assigns the next sibling tree node to this tree node.
      \param sibling tree node attribute being set as a next sibling of this tree node
    */
    void              SetNext(in AttributeTreeNode sibling);
    /*!
      \brief Checks if next sibling tree node attribute is set for this tree node.
      \return \c true if next sibling tree node attribute is defined or \c false otherwise
    */
    boolean           HasNext();
    /*!
      \brief Returns the next sibling tree node of this tree node.
      \return next sibling tree node attribute
    */
    AttributeTreeNode GetNext();
    /*!
      \brief Sets the specified tree node as a first child of this tree node.
      \param child tree node attribute being set filrst child of this tree node
    */
    void              SetFirst(in AttributeTreeNode child);
    /*!
      \brief Checks if first child tree node attribute is set for this tree node.
      \return \c true if first child tree node attribute is defined or \c false otherwise
    */
    boolean           HasFirst();
    /*!
      \brief Returns the first child tree node of this tree node.
      \return first child tree node attribute
    */
    AttributeTreeNode GetFirst();
    /*!
      \brief Sets identifier of the parent tree to this tree node.
      \note All tree nodes which belong to the same tree, should have the same identifier.
      \param ID identifier (arbitrary non-empty string) being set for this tree node
    */
    void              SetTreeID(in string ID);
    /*!
      \brief Returns identifier of the parent tree.
      \return parent tree identifier
    */
    string            GetTreeID();
    /*!
      \brief Appends specified tree node to the end of the children list of this tree node.
      \param child tree node being added to the list of children
    */
    void              Append(in AttributeTreeNode child);
    /*!
      \brief Puts specified tree node to the beginning of the children list of this tree node.
      \param child tree node being added to the list of children
    */
    void              Prepend(in AttributeTreeNode child);
    /*!
      \brief Insert specified tree node as a previous child in the parent tree node's children list.
      \param child tree node being inserted to the parent tree node
    */
    void              InsertBefore(in AttributeTreeNode child);
    /*!
      \brief Insert specified tree node as a next child in the parent tree node's children list.
      \param child tree node being inserted to the parent tree node
    */
    void              InsertAfter(in AttributeTreeNode child);
    /*!
      \brief Removes this tree node.
    */
    void              Remove();
    /*!
      \brief Returns the depth of the tree node in the tree structure. The resulting value
      it equal to the number of the fathers of this tree node.
      \note The depth of the root tree node is 0.
      \return tree node's depth
    */
    long              Depth();
    /*!
      \brief Checks if the tree node is a root of the tree.
      \return \c true if it is a root tree node or \c false otherwise
    */
    boolean           IsRoot();
    /*!
      \brief Checks if the tree node is a descendant of the specified tree node.
      \param other tree node that is tested for being ancestor of this tree node
      \return \c true if this node is descendant of the \a other node or \c false otherwise
    */
    boolean           IsDescendant(in AttributeTreeNode other);
    /*!
      \brief Checks if this tree node is a parent of the specified tree node \a other.
      \param other tree node that is tested for being father of this tree node
      \return \c true if this node is father of the \a other node or \c false otherwise
    */
    boolean           IsFather(in AttributeTreeNode other);
    /*!
      \brief Checks if this tree node is a child of the specified tree node \a other.
      \param other tree node that is tested for being child of this tree node
      \return \c true if this node is child of the \a other node or \c false otherwise
    */
    boolean           IsChild(in AttributeTreeNode other);
    /*!
      \brief Returns string identifier of the owner SObject (e.g. "0:1:2").
      \return string entry of the owner SObject
    */
    string            Label();
  };

  //==========================================================================
  /*!
    \brief Local identifier attribute
    
    This attribute can be used for identification of the SObject (for example by type).

    <em>See \ref example15 for an example of this atrtibute usage in batchmode of %SALOME application.</em>

    \sa AttributeUserID
  */
  //==========================================================================
  interface AttributeLocalID : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return attribute value
    */
    long   Value();
    /*!
      \brief Sets the value of the attribute
      \param value value being set to the attribute
    */
    void   SetValue(in long value);
  };

  //==========================================================================
  /*!
    \brief Attribute storing GUID.
    
    This attribute can be used to store arbitrary GUID. Attribute allowing to store GUID.
    In contrast to any other atribute (e.g. AttributeLocalID), it is possible to
    define as many GUID attributes for the same SObject as it is required provided that
    they have different GUID values.

    \sa AttributeLocalID
  */
  //==========================================================================
  interface AttributeUserID : GenericAttribute
  {
    /*!
      \brief Returns the value of the attribute.
      \return attribute value
    */
    string Value();
    /*!
      \brief Sets the value of the attribute
      \param value value being set to the attribute
    */
    void   SetValue(in string value);
  };

  //==========================================================================
  /*!
    \brief Back references attribute.
    \internal

   This attribute is used to store back references to all the SObjects that refer
   to the owner SObject.
   
   This attribute is used for inner purposes (in particular, for performance 
   optimization).
  */
  //==========================================================================

  interface AttributeTarget : GenericAttribute
  {
    /*!
      Adds specified SObject to the list of SObjects which refer to the owner SObject.
      \param refobj %SObject being added to the list
    */
    void          Add(in SObject refobj);
    /*!
      Returns a list of SObjects which refer to the owner SObject.
      \return list of SObject referencing to the owher SObject
    */
    SALOMEDS::Study::ListOfSObject Get();
    /*!
      Removes specified SObject from the list of SObjects which refer to the owner SObject.
      \param refobj %SObject being removed to the list
    */
    void          Remove(in SObject anObject);
  };
  
  //==========================================================================
  /*!
    \brief Generic table attribute.

    Used as base interface for the AttributeTableOfInteger, AttributeTableOfReal
    and AttributeTableOfString. Provides functions which are common for all table
    attributes.

    \note The indices of rows and columns in the table start from 1.
    \sa AttributeTableOfInteger, AttributeTableOfReal, AttributeTableOfString
  */
  //==========================================================================

  interface AttributeTable : GenericAttribute
  {
    //! This exception is raised when an invalid (out of range) index is passed as parameter.
    exception IncorrectIndex {};
    //! This exception is raised when sequence of incorrect length is passed as parameter.
    exception IncorrectArgumentLength {};

    //! Sort order
    enum SortOrder { 
      AscendingOrder,  //!< The items are sorted ascending
      DescendingOrder  //!< The items are sorted descending
    };

    //! Sort policy (specifies how empty cells are taken into account when sorting)
    enum SortPolicy {
      EmptyLowest,     //!< Empty cells are considered as lowest values
      EmptyHighest,    //!< Empty cells are considered as highest values
      EmptyFirst,      //!< Empty cells are always first
      EmptyLast,       //!< Empty cells are always last
      EmptyIgnore      //!< Empty cells are ignored (stay at initial positions)
    };

    /*!
      \brief Sets the main title of the table.
      \param title title being set to the table
      \sa GetTitle()
    */
    void SetTitle(in string title);
    /*!
      \brief Returns the title of the table.
      \return table title (empty string if not set)
      \sa SetTitle()
    */
    string GetTitle();
    /*!
      \brief Sets the title of a row with specified index.

      Raises an exception if \a row is out of range.

      \param row row index
      \param title title being set to the row
      \sa GetRowTitle()
    */
    void SetRowTitle(in long row, in string title) raises(IncorrectIndex);
    /*!
      \brief Returns the title of a row with specified index.

      Raises an exception if \a row is out of range.

      \param row row index
      \return row title (empty string if not set)
      \sa SetRowTitle()
    */
    string GetRowTitle(in long row) raises(IncorrectIndex);
    /*!
      \brief Sets the titles for all rows in the table.

      Raises an exception if length of the \a titles parameter is not equal
      to the number of rows in the table.

      \param titles titles being set to the table rows
      \sa GetRowTitles()
    */
    void SetRowTitles(in StringSeq titles) raises(IncorrectArgumentLength);
    /*!
      \brief Returns the titles of all rows of the table.
      \return list of all rows titles
      \sa SetRowTitles()
    */
    StringSeq GetRowTitles();
    /*!
      \brief Sets the title of a column with specified index.

      Raises an exception if \a column is out of range.

      \param column column index
      \param title title being set to the column
      \sa GetColumnTitle()
    */
    void SetColumnTitle(in long column, in string title) raises(IncorrectIndex);
    /*!
      \brief Returns the title of a column with specified index.

      Raises an exception if \a column is out of range.

      \param column column index
      \return column title (empty string if not set)
      \sa SetColumnTitle()
    */
    string GetColumnTitle(in long column) raises(IncorrectIndex);
    /*!
      \brief Sets the titles for all columns in the table.

      Raises an exception if length of the \a titles parameter is not equal
      to the number of columns in the table.

      \param titles titles being set to the table columns
      \sa GetColumnTitles()
    */
    void SetColumnTitles(in StringSeq titles) raises(IncorrectArgumentLength);
    /*!
      \brief Returns the titles of all columns of the table.
      \return list of all columns titles
      \sa SetColumnTitles()
    */
    StringSeq GetColumnTitles();
    /*!
      \brief Assigns the unit label to the row with specified index.

      Raises an exception if \a row is out of range.

      \param row row index
      \param unit unit label being set to the row
      \sa GetRowUnit()
    */
    void SetRowUnit(in long row, in string unit) raises(IncorrectIndex);
    /*!
      \brief Returns the unit label of a row with specified index.

      Raises an exception if \a row is out of range.

      \param row row index
      \return row unit label (empty string if not set)
      \sa SetRowUnit()
    */
    string GetRowUnit(in long row) raises(IncorrectIndex);
    /*!
      \brief Sets the unit labels for all rows in the table.

      Raises an exception if length of the \a units parameter is not equal
      to the number of rows in the table.

      \param units unit labels being set to the table rows
      \sa GetRowUnits()
    */
    void SetRowUnits(in StringSeq units) raises(IncorrectArgumentLength);
    /*!
      \brief Returns the unit labels of all rows of the table.
      \return list of all rows unit labels
      \sa SetRowUnits()
    */
    StringSeq GetRowUnits();
    /*!
      \brief Returns the number of rows of the table.
      \return rows count
      \sa GetNbColumns()
    */
    long GetNbRows();
    /*!
      \brief Returns the number of columns of the table.
      \return columns count
      \sa GetNbRows(), SetNbColumns()
    */
    long GetNbColumns();
    /*!
      \brief Check if the value is set for the cell with specified \a row and \a column indices.
      \param row    row index
      \param column column index
      \return \c true if value is set for the specified cell or \c false otherwise
              (or if row/column index is/are out of range)
    */
    boolean HasValue(in long row, in long column);
    /*!
      \brief Clear value in the specified table cell.
      
      Raises an exception if \a row or \a column is out of range.

      \param row    row index
      \param column column index
      \sa HasValue()
    */
    void RemoveValue(in long row, in long column) raises(IncorrectIndex);
    /*!
      \brief Sets the maximum number of colums in the table.

      If new number of columns is less than the current one, the table is truncated
      (extra columns are removed).

      \note It is recommended to set number of columns before assigning data to the table.

      \param columns total number of columns being set for the table
      \sa GetNbColumns()
    */
    void SetNbColumns(in long columns);
    /*!
      \brief Returns the indices of the columns in the specified \a row for which
      values are set.

      Raises an exception if \a row is out of range.

      \param row    row index
      \return list of column indices
    */
    LongSeq GetRowSetIndices(in long row) raises(IncorrectIndex);
    /*!
      \brief Sort values in the specified table row.
      
      Sort order is specified by the \a order parameter. The \a policy
      specifies how to process empty cells (put to the first place, ignore, etc).

      Raises an exception if \a row is out of range.

      \note Other table rows are not affected.
      
      \param row row index
      \param order sort order (ascending/descending)
      \param policy sort policy (specifies how to process empty cells)
      \return list of mixed column indices
    */
    LongSeq SortRow(in long row, in SortOrder order, in SortPolicy policy) raises(IncorrectIndex);
    /*!
      \brief Sort values in the specified table column.
      
      Sort order is specified by the \a order parameter. The \a policy
      specifies how to process empty cells (put to the first place, ignore, etc).

      Raises an exception if \a column is out of range.

      \note Other table columns are not affected.
      
      \param column column index
      \param order sort order (ascending/descending)
      \param policy sort policy (specifies how to process empty cells)
      \return list of mixed row indices
    */
    LongSeq SortColumn(in long column, in SortOrder order, in SortPolicy policy) raises(IncorrectIndex);
    /*!
      \brief Sort table columns by the specified row.
      
      All the table columns are sorted according to the values in the specified
      row. Sort order is specified by the \a order parameter. The \a policy
      specifies how to process empty cells (put to the first place, ignore, etc).
      
      Raises an exception if \a row is out of range.

      \param row row index
      \param order sort order (ascending/descending)
      \param policy sort policy (specifies how to process empty cells)
      \return list of mixed column indices
    */
    LongSeq SortByRow(in long row, in SortOrder order, in SortPolicy policy) raises(IncorrectIndex);
    /*!
      \brief Sort table rows by the specified column.
      
      All the table rows are sorted according to the values in the specified
      column. Sort order is specified by the \a order parameter. The \a policy
      specifies how to process empty cells (put to the first place, ignore, etc).
      
      Raises an exception if \a column is out of range.

      \param column column index
      \param order sort order (ascending/descending)
      \param policy sort policy (specifies how to process empty cells)
      \return list of mixed row indices
    */
    LongSeq SortByColumn(in long column, in SortOrder order, in SortPolicy policy) raises(IncorrectIndex);
    /*!
      \brief Swap values in two table cells.

      Raises an exception if any specified index is out of range.

      \param row1    first cell's row index
      \param column1 first cell's column index
      \param row2    second cell's row index
      \param column2 second cell's column index
    */
    void SwapCells(in long row1, in long column1, in long row2, in long column2) raises(IncorrectIndex);
    /*!
      \brief Swap two table rows.

      Raises an exception if any \a row1 or \a row2 is out of range.

      \param row1 first row's index
      \param row2 second row's index
    */
    void SwapRows(in long row1, in long row2) raises(IncorrectIndex);
    /*!
      \brief Swap two table columns.

      Raises an exception if any \a column1 or \a column2 is out of range.

      \param column1 first column's index
      \param column2 second column's index
    */
    void SwapColumns(in long column1, in long column2) raises(IncorrectIndex);
    /*!
      \brief Reads a table from a byte stream.
      \param fileStream byte stream
      \return \c true if table is successfully read or \c false otherwise
      \sa SaveToFile()
    */
    boolean ReadFromFile(in SALOMEDS::TMPFile fileStream);
    /*!
      \brief Saves a table into a byte stream.
      \return byte stream with table representation
      \sa ReadFromFile()
    */
    SALOMEDS::TMPFile SaveToFile();
  };

  //==========================================================================
  /*!
    \brief Table of %integer values

    This attribute allows to store a table of %integer values. It is possible 
    to specify titles for rows and columns. In addition, the unis labels can be
    assigned to the rows. And finally, the table iself can have title.

    \note The indices of rows and columns in the table start from 1.

    <em>See \ref example21 for an example of usage of this attribute in batchmode of %SALOME application.</em>

    \sa AttributeTable, AttributeTableOfReal, AttributeTableOfString
  */
  //==========================================================================

  interface AttributeTableOfInteger : AttributeTable
  {
    /*!
      \brief Appends new row to the table.
      
      If the length of the \a data parameter is greater than current number of columns
      in the table, the table is automatically resized.
      
      \param data sequence of values which will be set as elements of the added row
      \sa SetRow(), GetRow(), AddColumn()
    */
    void AddRow(in LongSeq data) raises(IncorrectArgumentLength);
    /*!
      \brief Replaces all the elements of the specified \a row with new values.

      Raises an exception if \a row is out of range or if the length of the
      \a data parameter is not equal to the number of columns in the table.

      \param row row index
      \param data sequence of values being set as values of the row
      \sa GetRow(), AddRow(), SetColumn()
    */
    void SetRow(in long row, in LongSeq data) raises(IncorrectArgumentLength, IncorrectIndex);
    /*!
      \brief Returns all the values of the specified row in the table.

      Raises an exception if \a row is out of range.
      
      \note For empty cells 0 value is returned.

      \param row row index
      \return sequence of values which are set as elements of the row.
      \sa SetRow(), AddRow()
    */
    LongSeq GetRow(in long row) raises(IncorrectIndex);
    /*!
      \brief Appends new column to the table.
      
      If the length of the \a data parameter is greater than current number of rows
      in the table, the table is automatically resized.
      
      \param data sequence of values which will be set as elements of the added column
      \sa SetColumn(), GetColumn(), AddRow()
    */
    void AddColumn(in LongSeq data) raises(IncorrectArgumentLength);
    /*!
      \brief Replaces all the elements of the specified column with new values.

      Raises an exception if \a column is out of range or if the length of the
      \a data parameter is not equal to the number of rows in the table.

      \param column column index
      \param data sequence of values being set as values of the column
      \sa GetColumn(), AddColumn(), SetRow()
    */
    void SetColumn(in long column, in LongSeq data) raises(IncorrectArgumentLength, IncorrectIndex);
    /*!
      \brief Returns all the values of the specified column in the table.

      Raises an exception if \a column is out of range.
      
      \note For empty cells 0 value is returned.
      
      \param column column index
      \return sequence of values which are set as elements of the column.
      \sa SetColumn(), AddColumn()
    */
    LongSeq GetColumn(in long column) raises(IncorrectIndex);
    /*!
      \brief Puts a value to the table cell specified by \a row and \a column indices.

      If the \a row and/or \a column parameter(s) are greater than current number of rows/columns
      in the table, the table is automatically resized.
      
      \param value  value being set to the table cell
      \param row    row index
      \param column column index
      \sa GetValue(), HasValue()
    */
    void PutValue(in long value, in long row, in long column) raises(IncorrectIndex);
    /*!
      \brief Returns the value from the cell table.

      Raises an exception if \a row or \a column is out of range or 
      if value is not set for the specified table cell.
      
      \param row    row index
      \param column column index
      \return value assigned to the table cell
      \sa PutValue(), HasValue()
    */
    long GetValue(in long row, in long column) raises(IncorrectIndex);
  };

  //==========================================================================
  /*!
    \brief Table of real values

    This attribute allows to store a table of real values. It is possible 
    to specify titles for rows and columns. In addition, the unis labels can be
    assigned to the rows. And finally, the table iself can have title.

    \note The indices of rows and columns in the table start from 1.

    <em>See \ref example22 for an example of usage of this attribute in batchmode of %SALOME application.</em>

    \sa AttributeTable, AttributeTableOfInteger, AttributeTableOfString
  */
  //==========================================================================

  interface AttributeTableOfReal : AttributeTable
  {
    /*!
      \brief Appends new row to the table.
      
      If the length of the \a data parameter is greater than current number of columns
      in the table, the table is automatically resized.
      
      \param data sequence of values which will be set as elements of the added row
      \sa SetRow(), GetRow(), AddColumn()
    */
    void AddRow(in DoubleSeq data) raises(IncorrectArgumentLength);
    /*!
      \brief Replaces all the elements of the specified \a row with new values.

      Raises an exception if \a row is out of range or if the length of the
      \a data parameter is not equal to the number of columns in the table.

      \param row row index
      \param data sequence of values being set as values of the row
      \sa GetRow(), AddRow(), SetColumn()
    */
    void SetRow(in long row, in DoubleSeq data) raises(IncorrectArgumentLength, IncorrectIndex);
    /*!
      \brief Returns all the values of the specified row in the table.

      Raises an exception if \a row is out of range.
      
      \note For empty cells 0.0 value is returned.
      
      \param row row index
      \return sequence of values which are set as elements of the row.
      \sa SetRow(), AddRow()
    */
    DoubleSeq GetRow(in long row) raises(IncorrectIndex);
    /*!
      \brief Appends new column to the table.
      
      If the length of the \a data parameter is greater than current number of rows
      in the table, the table is automatically resized.
      
      \param data sequence of values which will be set as elements of the added column
      \sa SetColumn(), GetColumn(), AddRow()
    */
    void AddColumn(in DoubleSeq data) raises(IncorrectArgumentLength);
    /*!
      \brief Replaces all the elements of the specified column with new values.

      Raises an exception if \a column is out of range or if the length of the
      \a data parameter is not equal to the number of rows in the table.

      \param column column index
      \param data sequence of values being set as values of the column
      \sa GetColumn(), AddColumn(), SetRow()
    */
    void SetColumn(in long column, in DoubleSeq data) raises(IncorrectArgumentLength, IncorrectIndex);
    /*!
      \brief Returns all the values of the specified column in the table.

      Raises an exception if \a column is out of range.
      
      \note For empty cells 0.0 value is returned.

      \param column column index
      \return sequence of values which are set as elements of the column.
      \sa SetColumn(), AddColumn()
    */
    DoubleSeq GetColumn(in long column) raises(IncorrectIndex);
    /*!
      \brief Puts a value to the table cell specified by \a row and \a column indices.

      If the \a row and/or \a column parameter(s) are greater than current number of rows/columns
      in the table, the table is automatically resized.
      
      \param value  value being set to the table cell
      \param row    row index
      \param column column index
      \sa GetValue(), HasValue()
    */
    void PutValue(in double value, in long row, in long volumn) raises(IncorrectIndex);
    /*!
      \brief Returns the value from the cell table.

      Raises an exception if \a row or \a column is out of range or 
      if value is not set for the specified table cell.
      
      \param row    row index
      \param column column index
      \return value assigned to the table cell
      \sa PutValue(), HasValue()
    */
    double GetValue(in long row, in long column) raises(IncorrectIndex);
  };

  //==========================================================================
  /*!
    \brief Table of string values

    This attribute allows to store a table of string values. It is possible 
    to specify titles for rows and columns. In addition, the unis labels can be
    assigned to the rows. And finally, the table iself can have title.

    \note The indices of rows and columns in the table start from 1.
    \sa AttributeTable, AttributeTableOfInteger, AttributeTableOfReal
  */
  //==========================================================================
  interface AttributeTableOfString : AttributeTable
  {
    /*!
      \brief Appends new row to the table.
      
      If the length of the \a data parameter is greater than current number of columns
      in the table, the table is automatically resized.
      
      \param data sequence of values which will be set as elements of the added row
      \sa SetRow(), GetRow(), AddColumn()
    */
    void AddRow(in StringSeq data) raises(IncorrectArgumentLength);
    /*!
      \brief Replaces all the elements of the specified \a row with new values.

      Raises an exception if \a row is out of range or if the length of the
      \a data parameter is not equal to the number of columns in the table.

      \param row row index
      \param data sequence of values being set as values of the row
      \sa GetRow(), AddRow(), SetColumn()
    */
    void SetRow(in long row, in StringSeq data) raises(IncorrectArgumentLength, IncorrectIndex);
    /*!
      \brief Returns all the values of the specified row in the table.

      Raises an exception if \a row is out of range.
      
      \note For empty cells empty string is returned.

      \param row row index
      \return sequence of values which are set as elements of the row.
      \sa SetRow(), AddRow()
    */
    StringSeq GetRow(in long row) raises(IncorrectIndex);
    /*!
      \brief Appends new column to the table.
      
      If the length of the \a data parameter is greater than current number of rows
      in the table, the table is automatically resized.
      
      \param data sequence of values which will be set as elements of the added column
      \sa SetColumn(), GetColumn(), AddRow()
    */
    void AddColumn(in StringSeq data) raises(IncorrectArgumentLength);
    /*!
      \brief Replaces all the elements of the specified column with new values.

      Raises an exception if \a column is out of range or if the length of the
      \a data parameter is not equal to the number of rows in the table.

      \param column column index
      \param data sequence of values being set as values of the column
      \sa GetColumn(), AddColumn(), SetRow()
    */
    void SetColumn(in long column, in StringSeq data) raises(IncorrectArgumentLength, IncorrectIndex);
    /*!
      \brief Returns all the values of the specified column in the table.

      Raises an exception if \a column is out of range.
      
      \note For empty cells empty string is returned.

      \param column column index
      \return sequence of values which are set as elements of the column.
      \sa SetColumn(), AddColumn()
    */
    StringSeq GetColumn(in long column) raises(IncorrectIndex);
    /*!
      \brief Puts a value to the table cell specified by \a row and \a column indices.

      If the \a row and/or \a column parameter(s) are greater than current number of rows/columns
      in the table, the table is automatically resized.
      
      \param value  value being set to the table cell
      \param row    row index
      \param column column index
      \sa GetValue(), HasValue()
    */
    void PutValue(in string value, in long row, in long column) raises(IncorrectIndex);
    /*!
      \brief Returns the value from the cell table.

      Raises an exception if \a row or \a column is out of range or 
      if value is not set for the specified table cell.
      
      \param row    row index
      \param column column index
      \return value assigned to the table cell
      \sa PutValue(), HasValue()
    */
    string GetValue(in long row, in long column) raises(IncorrectIndex);
  };

  //==========================================================================
  /*!
    \brief %Study properties attribute
    
    This attribute is used to store study properties: user name, creation date,
    creation mode, modified flag, locked flag.

    <em>See \ref example20 for an example of usage of this attribute in batchmode of %SALOME application.</em>
  */
  //==========================================================================
  interface AttributeStudyProperties : GenericAttribute
  {
    /*!
      \brief Sets the name of the study author to the attribute.
      \param author study author name
    */
    void SetUserName(in string author);
    /*!
      \brief Returns the name of the study author.
      \return study author name (empty string if not set)
    */
    string GetUserName();
    /*!
      \brief Sets creation date of the study.
      \param minute minutes part of the date
      \param hour   hour part of the date
      \param day    day number part of the date
      \param month  month part of the date
      \param year   year part of the date
    */
    void SetCreationDate(in long minute, in long hour, in long day, in long month, in long year);
    /*!
      \brief Returns creation date of the study.
      \param minute used to return minutes part of the date (undefined if creation date is not set)
      \param hour   used to return hour part of the date (undefined if creation date is not set)
      \param day    used to return day number part of the date (undefined if creation date is not set)
      \param month  used to return month part of the date (undefined if creation date is not set)
      \param year   used to return year part of the date (undefined if creation date is not set)
      \return \c true if creation date is set or \c false otherwise
    */
    boolean GetCreationDate(out long minute, out long hour, out long day, out long month, out long year);
    /*!
      \brief Sets creation mode of the study.
      \note Creation mode must be either "from scratch" or "copy from".
      \param mode creation mode description
    */
    void SetCreationMode(in string mode);
    /*!
      \brief Returns creation mode of the study.
      
      \brief The following values are allowed for creation mode: "from scratch", "copy from",
      empty string (if not set).

      \return creation mode description
    */
    string GetCreationMode();
    /*!
      \brief Sets the number of transactions executed after the last saving of the study.
      \param modified transaction count
    */
    void SetModified(in long modified);
    /*!
      \brief Check if study has been modified since last saving operation.
      \return \c true, if the study has been modified and not saved or \c false otherwise
    */
    boolean IsModified();
    /*!
      \brief Returns the number of transactions executed after the last saving of the study.
      \return transaction count
    */
    long GetModified();
    /*!
      \brief Lock/unlock the study for modifications.
      \note This parameter is not recursive.
      \note If the study is locked, any attempt to modify study contents leads to the raising
      of the LockProtection exception.
      \param lock \c true if study should be locked or \c false if study should be unlocked
    */
    void SetLocked(in boolean lock);
    /*!
      \brief Check if study is locked.
      \return \c true if study is locked or \c false otherwise
    */
    boolean IsLocked();
    /*!
      \brief Appends modification record to the list of study modifications.
      \param author author of the modification
      \param minute minutes part of the modification date
      \param hour   hour part of the modification date
      \param day    day number part of the modification date
      \param month  month part of the modification date
      \param year   year part of the modification date
    */
    void SetModification(in string author, in long minute, in long hour, in long day, in long month, in long year);
    /*!
      \brief Returns list of all the study modification records.
      \param authors     used to return authors of the modification records
      \param minutes     used to return minutes parts of the modification records
      \param hours       used to return hour parts of the modification records
      \param days        used to return day number parts of the modification records
      \param months      used to return month parts of the modification records
      \param years       used to return year parts of the modification records
      \param withCreator \c true if creation record should be also added to the resulting list or \c false otherwise
    */
    void GetModificationsList(out StringSeq authors, out LongSeq minutes, out LongSeq hours, out LongSeq days, out LongSeq months, out LongSeq years, in boolean withCreator);
  };

  //==========================================================================
  /*!
    \brief Python %object attribute

    This attribute is used to store pyton objects as a sequence of characters.
  */
  //==========================================================================
  interface AttributePythonObject : GenericAttribute
  {
    /*!
      \brief Sets a Python %object converted into a sequence of characters to the attribute.
      \param pyObject sequence of characters representing the encoded Python %object
      \param isScript if \c true, the \a pyObject parameter specifies a Python script
    */
    void SetObject(in string pyObject, in boolean isScript);
    /*!
      \brief Returns a Python %object stored in the attribute as a sequence of characters.
      \return encoded Python %object stored in the attribute (empty string if not set)
    */
    string GetObject();
    /*!
      \brief Check if the value stored in the attribute is a Python script
      \return \c true if the sequence of characters stored in the attribute corresponds
      to a Python script or \c false otherwise
    */
    boolean IsScript();
  };

  //==========================================================================
  /*!
    \brief Parameter attribute
    
    This attribute is a universal container of arbitrary data of basic types
    (%integer, real, string, array, etc).
    
    Each parameter is identified by the unique name. Only one value of the
    specific type can be assigned to the parameter, though it is allowed to
    assign values of different types to the same name.
  */
  //==========================================================================
  interface AttributeParameter : GenericAttribute
  {
    //! This exception is raised when an invalid identifier is passed as parameter.
    exception InvalidIdentifier {};

    /*!
      \brief Associates %integer value with the unique identifier.
      \param ID    parameter name
      \param value parameter value
    */
    void SetInt(in string ID, in long value);
    /*!
      \brief Returns %integer value associated with the specified identifier.

      Raises an exception if %integer parameter is not set for the specified
      parameter.

      \param ID parameter name
      \return   %integer value assigned to the parameter
    */
    long GetInt(in string ID) raises(InvalidIdentifier);
    /*!
      \brief Associates real value with the unique identifier.
      \param ID    parameter name
      \param value parameter value
    */
    void SetReal(in string ID, in double value);
    /*!
      \brief Returns real value associated with the specified identifier.

      Raises an exception if real parameter is not set for the specified
      parameter.

      \param ID parameter name
      \return   real value assigned to the parameter
    */
    double GetReal(in string ID) raises(InvalidIdentifier);
    /*!
      \brief Associates string value with the unique identifier.
      \param ID    parameter name
      \param value parameter value
    */
    void SetString(in string ID, in string value);
    /*!
      \brief Returns string value associated with the specified identifier.

      Raises an exception if string parameter is not set for the specified
      parameter.

      \param ID parameter name
      \return   string value assigned to the parameter
    */
    string GetString(in string ID) raises(InvalidIdentifier);
    /*!
      \brief Associates boolean value with the unique identifier.
      \param ID    parameter name
      \param value parameter value
    */
    void SetBool(in string ID, in boolean value);
    /*!
      \brief Returns boolean value associated with the specified identifier.

      Raises an exception if boolean parameter is not set for the specified
      parameter.

      \param ID parameter name
      \return   boolean value assigned to the parameter
    */
    boolean GetBool(in string ID) raises(InvalidIdentifier);
    /*!
      \brief Associates real array value with the unique identifier.
      \param ID    parameter name
      \param value parameter value
    */
    void SetRealArray(in string ID, in DoubleSeq value);
    /*!
      \brief Returns real array value associated with the specified identifier.

      Raises an exception if real array parameter is not set for the specified
      parameter.

      \param ID parameter name
      \return   real array value assigned to the parameter
    */
    DoubleSeq GetRealArray(in string ID) raises(InvalidIdentifier);
    /*!
      \brief Associates %integer array value with the unique identifier.
      \param ID    parameter name
      \param value parameter value
    */
    void SetIntArray(in string ID, in LongSeq value);
    /*!
      \brief Returns %integer array value associated with the specified identifier.

      Raises an exception if %integer array parameter is not set for the specified
      parameter.

      \param ID parameter name
      \return   %integer array value assigned to the parameter
    */
    LongSeq GetIntArray(in string ID) raises(InvalidIdentifier);
    /*!
      \brief Associates string array value with the unique identifier.
      \param ID    parameter name
      \param value parameter value
    */
    void SetStrArray(in string ID, in StringSeq value);
    /*!
      \brief Returns string array value associated with the specified identifier.

      Raises an exception if string array parameter is not set for the specified
      parameter.

      \param ID parameter name
      \return   string array value assigned to the parameter
    */
    StringSeq GetStrArray(in string ID) raises(InvalidIdentifier);
    /*!
      \brief Checks if the value of specified type is set for the identifier.
      \param ID    parameter name
      \param ptype parameter type [0(%integer), 1(real), 2(boolean), 3(string), 
                   4(real array), 5(%integer array), 6(string array)]
      \returns \c true if the value of type \a ptype is associated with the parameter \a ID
    */
    boolean IsSet(in string ID, in long ptype);
    /*!
      \brief Removes value of specified type from the named parameter.
      \param ID    parameter name
      \param ptype parameter type [0(%integer), 1(real), 2(boolean), 3(string), 
                   4(real array), 5(%integer array), 6(string array)]
      \return \c true if value is successfully removed or \c false otherwise
    */
    boolean RemoveID(in string ID, in long ptype);
    /*!
      \brief Returns a father attribute of this attribute.
      \return father parameter attribute
    */
    AttributeParameter GetFather();
    /*!
      \brief Check if this attribute has parent parameter attribute.
      \return \c true if this attribute has parent parameter attribute
    */
    boolean HasFather();
    /*!
      \brief Check if this attribute is a root (top-level) parameter attribute.
      \return \c true if this attribute is a root parameter attribute
    */
    boolean IsRoot();
    /*!
      \brief Clears the content of the attribute.
    */
    void Clear();
    /*!   
      \brief Returns a sequence of parameters identifiers of the specified type
      stored in the attribute.
      \param ptype parameter type [0(%integer), 1(real), 2(boolean), 3(string), 
                   4(real array), 5(%integer array), 6(string array)]
      \return list of parameters identifier
    */ 
    StringSeq GetIDs(in long ptype);
  };
};
#endif
