Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "Scout/Concepts/CodeType"

 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{ScoutPage|cat=Concepts}}
+
The Scout documentation has been moved to https://eclipsescout.github.io/.
 
+
A CodeType is a structure to represent a tree key-{{ScoutLink|Concepts|Code|code}} association. They are used in {{ScoutLink|Concepts|SmartField|SmartField}} and {{ScoutLink|Concepts|SmartColumn|SmartColumn}}.
+
 
+
* implements: {{ScoutJavadoc|ICodeType<T>|I}}
+
* extends: {{ScoutJavadoc|AbstractCodeType<T>|C}}
+
 
+
 
+
==Description==
+
CodeType are used in {{ScoutLink|Concepts|SmartField|SmartField}} to let the user choose between a finish list of values. The value stored by the field correspond to the key of the selected code.
+
 
+
[[Image:Scout_SmartField_Hierarchy_SWT.png]]
+
 
+
A CodeType can be seen as a tree of {{ScoutLink|Concepts|Code|Codes}}. Each code associate to the key (the {{ScoutProp|Id}}) other properties: among others a {{ScoutProp|Text}} and an {{ScoutProp|IconId}}.
+
 
+
In order to have the same resolving mechanism (getting the display text of a key) CodeType are also used in {{ScoutLink|Concepts|SmartColumn|SmartColumn}}. To chose multiple value of the list, the fields {{ScoutLink|Concepts|ListBox|ListBox}} (flat CodeType) and {{ScoutLink|Concepts|TreeBox|TreeBox}} (hierarchical CodeType) can be used.
+
 
+
 
+
=== Organisation of the codes ===
+
The codes are organized in a tree. Therefore a CodeType can have one or more child codes at the root level, and each code can have other child codes. In lot of cases a list of codes (meaning a tree containing only leafs at the first level) is sufficient to cover most of the need.
+
 
+
Child codes are ordered in their parent code. This is realized with the {{ScoutLink|Concepts|Order Annotation|order annotation}}.
+
 
+
 
+
=== Type of the key ===
+
The type of the key is defined by its generic parameter <code><T></code>. It is very common to use a type from the <code>java.lang.*</code> package (like <code>Integer</code> or <code>String</code>) but any Java Object is suitable. It must:
+
* implements <code>Serializable</code>
+
* have correctly implemented <code>equals()</code> and <code>hashCode()</code> functions
+
* present in the server and the client
+
 
+
There is no obligation to have the same type for the {{ScoutProp|Id}} between the codes of a CodeType (meaning the same generic type parameter for the codes inner-class). However it is a good practice to have the same type between the codes of a CodeType, because the Id are used as value of {{ScoutLink|Concepts|SmartField|SmartFields}}. Therefore the generic parameter describing the type of value of a  SmartField must be compatible with the type of the codes contained in the CodeType.
+
 
+
 
+
==Using a CodeType==
+
=== SmartField or SmartColumn ===
+
{{ScoutProp|CodeType}} in a SmartField (or SmartColumn).
+
 
+
<source lang="java">
+
public class YesOrNoSmartField extends AbstractSmartField<Boolean> {
+
  // other configuration of properties.
+
  @Override
+
  protected Class<? extends ICodeType<?>> getConfiguredCodeType(){
+
    return YesOrNoCodeType.class;
+
  }
+
}
+
</source>
+
 
+
If the SmartField (or SmartColumn) works with a CodeType, a specific LookupCall is instantiated to get the LookupRows based on the Codes contained in a CodeType.
+
 
+
===Accessing a code directly ===
+
Scout-runtime will handle the instantiation and the caching of CodeTypes.
+
 
+
This function returns the text corresponding to the key using a CodeType:
+
<source lang="java">
+
  public String getColorName(String key){
+
    ICode c = CODES.getCodeType(ColorCodeType.class).getCode(key);
+
    if(c != null) {
+
      return c.getText();
+
    }
+
    return null;
+
  }
+
}
+
</source>
+
 
+
 
+
==  Static CodeType ==
+
=== Java Code and structure ===
+
[[Image:Scout_CodeType_Structure.png]]
+
 
+
The common way to define a CodeType is to extend AbstractCodeType. Each code is an inner-class extending AbstractCode. Like usual the properties of Codes and CodeTypes can be set with {{ScoutLink|Concepts|GetConfigured Methods|getConfiguredXxxxxx()}}  methods.
+
 
+
{{ScoutLink|Concepts|CodeType/Example|See the Java Code}} of a simple <code>YesOrNoCodeType</code> having just two codes:
+
* <code>YesOrNoCodeType.YesCode</code>
+
* <code>YesOrNoCodeType.NoCode</code>
+
 
+
 
+
=== With the SDK ===
+
The SDK provides some help to generate CodeTypes and Codes. The CodeType appears in the {{ScoutLink|SDK|Explorer View|Explorer View}} in the '''Enumerations''' folder under {{ScoutLink|Concepts|Shared Plug-In|shared}}.
+
 
+
[[Image:ScoutSDK_CodeType.png]]
+
 
+
It is possible to add a new CodeType using a wizard.
+
 
+
 
+
==  Dynamic CodeType ==
+
Code types are not necessary hardcoded. It is possible to implement other mechanisms to load CodeType dynamically.
+
 
+
The description of the Codes can come from a database or from an XML files. If you want to do so, you just need to implement the method corresponding to the event {{ScoutEvent|LoadCodes}}.
+
 
+
{{note|TODO| Describe good organization of classes to load codeType from an XML File or a Database. With small UML graph}}
+
 
+
It is possible to use the static and the dynamic approach together. In this case, if there is a conflict (2 codes for the same id) the event {{ScoutEvent|OverwriteCode}} is triggered.
+
 
+
 
+
 
+
'''Note for advanced users:'''
+
 
+
Each CodeType is instantiated for
+
* each language
+
* each partition
+
 
+
Note: A drawback that the CodeType Class is not aware of the language and the partition it is instantiate for. Only the  {{ScoutJavadoc|CodeTypeStore|C}} that manage the CodeType instances knows for which language and which partition they have been instantiated.
+
 
+
 
+
== See Also ==
+
* {{ScoutLink|Concepts|Code|Code}}
+
* {{ScoutLink|Concepts|LookupCall|Lookup Call}}
+
* {{ScoutLink|Concepts|Shared Plug-In|Shared Plug-In}}
+

Latest revision as of 05:02, 14 March 2024

The Scout documentation has been moved to https://eclipsescout.github.io/.

Back to the top