# Metamodel Description

## CellEditorDeclaration

This enumeration allows to describe the way to declare the cell editor in the table :

- by column
- by row
- by cell

## AxisIndexStyle

This enumeration allows to describe how to display the index of the axis :

- Alphabetic : A, B, C ... Y, Z, AA, AB, ...
- Numeric : 1, 2, 3

## TableNamedElement

abstract object used when an element need to have a name and a description

## TableConfiguration

this object is used to configure the table

### Fields

- type : the type of the table
- iconPath : the icon associated to the table
- cellEditorDeclaration : describe how the cell editor will be declared in the table : They can be declared by row, by column or by cells
- rowAxisProviders : the possible axis providers used for rows for this configuration
- columnAxisProviders : the possible axis providers used for the columns for this configuration
- defaultRowAxisProvider : the axis provider used for row just after the table creation
- defaultColumnAxisProvider : the axis provider used for column just after the table creation

    ????rowAxisProviderConfiguration -> a la bonne place ? -> peut-etre sur un (local)AbstractAxisProvider?
    ????columnAxisProviderConfiguration -> a la bonne place? -> peut-etre sur un (local)AbstractAxisProvider?

### Constraints

    the field defaultRowAxisProvider must references an axis owned by rowAxisProviders
    the field defaultColumnAxisProvider must references an axis owned by columnAxisProviders

## Table

This object represents the model of the table used in Papyrus

### Fields

- invertAxis : indicates if the rows and the columns are inverted
- tableConfiguration : the configuration used for the table
- currentColumnAxisProvider : the current axis provider used for columns
- currentRowAxisProvider : the current axis provider used for rows
- rowAxisProvidersHistory : an history of the axis provider used for rows
- columnAxisProvidersHistory : an history of the axis provider used for columns

### Constraints

- the field currentRowAxisProvider must references an axis owned by rowAxisProviderHistory
- The field currentColumnAxisProvider must references one of axis provider referenced by columnAxisProviderHistory
- the field rowAxisProviderHistory will contains only 1 axisProvider just after the table creation even if the config provides several row axis providers in rowAxisProviders
- the field columnAxisProviderHistory will contains only 1 axisProvider just after the table creation even if the config provides several column axis providers in columnAxisProviders
- the axis providers owned by columnAxisProviderHistory and rowAxisProviderHistory contains only the axis provider already used by the user.

??? localTableConfiguration : must be here?

??? add header in the name of the label configuration????

## AbstractLabelConfiguration

This object allows to store the configuration for the label provider.

### Fields

- labelProviderContext : the context to use to find the label provider to use

## ObjectLabelProviderConfiguration

This label provider can be used for all element displayed in a table

### Fields

- displayIcon : indicates if we want display the icon of the object in the header
- displayLabel : indicates if we want display the label of the object in the header

## FeatureLabelProviderConfiguration

The label provider used for object representing properties/features of others objects

### Fields

- displayIsDerived: indicates if we want display the "/" for the derived feature
- displayType: indicates if we want display the type of the feature
- displayMultiplicity: : indicates if we want display the multiplicity of the feature
- displayName:indicates if the want display the name of the feature

## AbstractAxisProvider

This class stores in an ordered list the IAxis displayed in rows or in columns

# Table Refresh

    There are 2 kinds of refresh in the tables :

1. a refresh of the appearance of the table
   This refresh is done after each command executed in the command stack.
2. a refresh of the rows and columns of the table
   This refresh needs to recalculate the rows and the columns to display before to refresh the table. This refresh is called thanks to listen which listen specific modifications on the model :
   1. add/remove/move/... IAxis inside the model of the table, if the table is not synchronized
   2. add/remove/move/... elements in the display feature if the table is synchronized

# Refresh Rows/Columns to display

A table is managed by 2 CompositeAxisManager one for Rows and one for Columns. These managers refers one or several Axis Manager, identified in the model by an id (AxisManager#managerId). The CompositeAxisManager is used to update the list of the element to display as rows/columns. Here, we need to distinguish 2 kinds of AxisManager

1. the axis manager which provides a contents stored in the model of the table
   the user can reorder and 'mix'/reoder the elements provided by this kind of AxisManager.
   The CompositeAxisManager reads the table model to update the list of the elements to display.
2. the axis manager which provides a contents derived of the (UML) model. These one are dynamic, because they doesn't contribute to the table model.
   the elements can't be mixed with the elements managed by the non-dynamic AxisManager, but they can be reorder 'inside' the Axismanager
   in case of dynamic and non-dynamic AxisManager used on the same axis, the dynamic will always be displayed at the end of the axis.

The distinction between them is done by a boolean 'isDynamic' stored in the AxisManager class