# 属性编辑器设计指南

## 重要词汇描述
>    attribute   属性 用于描述一个物体的特征<property>.
>    property    特征 是事物的本质,是一个统称.
## 什么是属性编辑器<AttributeEditor>?

   一个对象(Object) 有 属性<attribute>,方法<method>,事件<event> 3种特征<property>
   在面向对象的设计中 将具有相似特征的对象<Object> 用一个类<Class>进行描述,Class可以认为是一个模板
   用这个模板可以创建<new>很多个具有相似特征的对象<Object>.

   为了能够编辑对象的属性<attribute>的值,必须将对象的属性进行描述,使用IAttribute进行描述.

   属性编辑器,就是一个具有UI的组件<Component> 根据IAttribute的描述创建UI并编辑属性.
   一个对象<Object>具有很多个属性,为了能够同时编辑所有的属性,提供了一个 ObjectInspector 组件同时
   编辑一个对象的所有属性.
             收集                        设置                        创建
   [Object] ----->  List<IAttribute>  -------> [ObjectInspector]  -----> List<AttributeEditor>

## 属性编辑器的组成
   1.为了统一描述各种属性编辑器,使用IAttributeEditor接口约束,他描述了所有属性编辑器必须提供的功能.
     - 为编辑器提供一个唯一代码<Code>
     - 返回一个用于界面的UI组件 getDisplayWidget()
     - 返回组件缺省的占用空间代销 getSize()
     - 编辑一个属性 editAttribute()
     - 返回正在编辑的属性 getAttribute()
   2.一个属性编辑器<AttributeEditor>往往具有不同的UI风格和布局,我使用了选项<Option> 用于修改属性编辑器外观和数据
     - 更新编辑器的某一个外观 updateEditorOption(key,value)
   3.为了能够在运行的时候动态修改选项<Option>的值,属性编辑器组件<AttributeEditor> 往往会提供一个 UI组建来修改<Option>的值
     这个UI组建 我称之为 设计器<IEditorDesigner>.
   4.为了能够动态创建属性编辑器 ,属性描述<IAttribute>必须提供足够的信息 <ObjectInspector>才能创建.这个信息
     我称之为编辑器元数据 <IEditorMetaData>.这个元数据提供了能够创建属性编辑器的所有信息.

   以上就是一个属性编辑器的4个主要组成部分.

## 属性编辑器工厂创建属性编辑器
   当我们编写一个属性编辑器时,通过Java的注解提供一个编辑器的描述信息<AttributeEditorInfo>
   项目中提供了很多种属性编辑器,GWT编译器在编译过程中,收集所有AttributeInfo,创建一个全局的属性编辑器描述信息列表
   通过工厂<IAttributeEditorFactory>的方式对外提供查询,创建编辑器.
   这样需要创建一个编辑器的时候可以根据 IAttributeEditorFactory.createEditor(EDITOR_CODE)进行创建.
   属性检查器<ObjectInspector>就是通过这个种方式创建的各个属性编辑器.
    创建编辑器的过程通过一下两个步骤
     1. 根据编辑器代码 通过工厂创建编辑器
     2. 更新编辑器的选项<Option>
     3. 设置IAttribute 让属性编辑器进行编辑.

## 如何描述和持久化一个属性<IAttribute>
   通过上面的描述,可以了解到 通过属性编辑器工厂 可以进行属性编辑器的创建以及对属性的编辑.所以核心是必须提供一个
   做够多的信息描述一个属性<IAttribute>.这些信息分为两类如下
     1. 属性本身的数据
           - 属性名菜 <CODE>
           - 属性的显示名称 <ALT_NAME>
           - 其他数据: 是否只读 缺省值 数据校验规则 图标 描述 等等
     2. 描述属性编辑器元数据 getEditorMetaData()
   系统中有几种方式定义一个属性<IAttribute>
     1. 通过代码创建一个IAttribute,通常用于已经明确了对象的属性
     2. 将这些描述信息通过JSON方式存储在一个和属性相关的数据库记录的字段中
        比如 动态创建的数据库表为了能够编辑他的字段,将字段的描述信息保存在数据库中,可动态创建.
     3. 编写其他组件的时候,可以将这些信息通过注解的方式配置到字段上,系统编译的时候构建一个字段描述信息数据库
        动态创建该组件的时候可以根据此创建相应的编辑器.

 ## 编写一个属性编辑器
    目标时编写一个能够编辑 设定四个边框PADDING的编辑器
    1. 从AbstractAttributeEditor继承一个编辑器类
       public class



