【仅供内部供应商使用,不提供对外解答和培训】

Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

PresentKindProvider主要用于提供数据展现形态的扩展。

比较常见的就是各类条码、二维码形态的扩展。

Image Added

三、接口介绍

Code Block
languagejava
themeEclipse
firstline1
titleTableDataDefineProviderPresentKindProvider.java
linenumberstrue
package com.fr.design.fun;

import com.fr.base.present.Present;
import com.fr.design.beans.FurtherBasicBeanPane;
import com.fr.stable.fun.mark.Mutable;

/**
 * @author richie
 * : richie@date 2015-05-22
 * @since : 8.0
 * 自定义服务器数据集设计界面接口形态类型接口
 */
public interface ServerTableDataDefineProviderPresentKindProvider extends TableDataDefineProvider { Mutable{

    int CURRENT_LEVEL = 1;

    String XMLMARK_TAGSTRING = "ServerTableDataDefineProviderPresentKindProvider";

    /**
     * 形态设置界面
     * @return 形态设置界面
     */
    FurtherBasicBeanPane<? extends Present> appearanceForPresent();

    /**
     * 在形态设置面板上显示的名字
     * @return 名字
     */
    String title();

    /**
     * 该形态对应的类
     * @return 类
     */
    Class<? extends Present> kindOfPresent();

    /**
     * 菜单快捷键
     * @return 快捷点对应的字符
     */
    char mnemonic();
}

TableDataDefineProvider

四、支持版本

...

产品线

...

版本

...

支持情况

...

备注

...


Code Block
languagejava
themeEclipse
firstline1
titleFurtherBasicBeanPane.java
linenumberstrue
collapsetrue
package com.fr.design.beans;

import com.fr.common.annotations.Open;
import com.fr.stable.StringUtils;

@Open
public abstract class FurtherBasicBeanPane<T> extends BasicBeanPane<T> {
    /**
     * 是否是指定类型
     *
     * @param ob 对象
     * @return 是否是指定类型
     */
    public abstract boolean accept(Object ob);

    /**
     * title应该是一个属性,不只是对话框的标题时用到,与其他组件结合时,也会用得到
     *
     * @return 对话框标题
     */
    @Override
    public String title4PopupWindow() {
        return StringUtils.EMPTY;
    }

    /**
     * 重置
     */
    public abstract void reset();

}


Code Block
languagejava
themeEclipse
firstline1
titlePresent.java
linenumberstrue
collapsetrue
package com.fr.base.present;

import com.fr.base.Style;
import com.fr.script.Calculator;
import com.fr.stable.ColumnRow;
import com.fr.stable.DependenceProvider;
import com.fr.stable.script.CalculatorProvider;
import com.fr.stable.script.ExTool;
import com.fr.stable.xml.XMLable;

/**
 * 形态。该类用于处理同事拥有实际值和显示值并且这两个值可能不同的对象。
 */
public interface Present extends DependenceProvider, XMLable {
    String XML_TAG = "Present";

    /**
     * 返回经过形态计算后原来的值的结果
     *
     * @param value      原始值
     * @param calculator 算子
     * @return 形态计算后的结果
     */
    Object present(Object value, Calculator calculator);

    /**
     * 返回经过形态计算后格子的值的结果
     *
     * @param value      原始格子的值
     * @param calculator 算子
     * @param cr         格子所处的行列位置
     * @return 形态计算后的结果
     */
    Object present(Object value, Calculator calculator, ColumnRow cr);

    /**
     * 记录形态中使用的相关格子,当格子值改变后,形态值需要相应做改变
     *
     * @param calculator 算子
     * @param exTool     格子间关系计算工具
     * @param currentCr  当前行列
     * @date 2014-9-21-下午10:51:24
     */
    void analyzeCorrelative(CalculatorProvider calculator, ExTool exTool, ColumnRow currentCr);

    /**
     * 返回形态的原型,比如NormalPresent在设计器界面的渲染是跟其他present区分开的
     *
     * @return 形态的原型
     */
    Object getPresentPrototype();

    /**
     * 处理形态中涉及到的style的改变,传入单元格
     * 形态中处理格子的样式
     *
     * @param cellStyle 单元格的样式
     * @param value     单元格的值
     */
    Style modifyCellStyle(Style cellStyle, Object value);

    /**
     * 对当前形态中涉及到的单元格值进行预处理
     *
     * @param value      值
     * @param calculator 算子
     */
    void valuePretreatment(Object value, CalculatorProvider calculator);

}


Code Block
languagejava
themeEclipse
firstline1
titlePainter.java
linenumberstrue
collapsetrue
package com.fr.base;

import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.stable.core.NodeVisitor;
import com.fr.stable.html.Tag;
import com.fr.stable.web.Repository;
import com.fr.stable.xml.XMLable;

import java.awt.*;

/**
 * 用于绘画图形的基本接口
 */
public interface Painter extends XMLable {

	/**
	 * 根据指定的图形上下文、目标图形的宽度和高度、屏幕分辨率以及样式画出目标图形
	 *
	 * @param g		  图形上下文
	 * @param width	  目标图形的宽度
	 * @param height	 目标图形的高度
	 * @param resolution 屏幕分辨率
	 * @param style	  样式
	 */
	void paint(Graphics g, int width, int height, int resolution, Style style);

    /**
     * 将Painter以JSON形式输出
     * @param visitor 访问者
     * @param repo 网络请求上细纹
     * @param width 宽度
     * @param height 高度
     * @return JSON对象
     */
    JSONObject toJSONObject(NodeVisitor visitor, Repository repo, int width, int height) throws JSONException ;

	/**
	 * 将Painter以JSON形式输出
	 * @param visitor 访问者
	 * @param repo 网络请求上细纹
	 * @param width 宽度
	 * @param height 高度
	 * @param style 样式
	 * @return JSON对象
	 */
	JSONObject toJSONObject(NodeVisitor visitor, Repository repo, int width, int height, Style style) throws JSONException ;

	/**
	 * 画出图形,生成 img 标签,加入上层 tag
	 * @param repo 网络请求上细纹
	 * @param width 宽度
	 * @param height 高度
	 * @param style 样式
	 * @param tag 上层 html 标签
	 * @return JSON对象
	 */
	void paintTag(Repository repo, int width, int height, Style style, Tag tag);
}


四、支持版本

产品线

版本

支持情况

备注

FR8.0支持
FR9.0支持
FR10.0支持

五、插件注册

Code Block
languagexml
themeEclipse
firstline1
titleplugin.xml
linenumberstrue
<extra-designer>
        <ServerTableDataDefineProvider<PresentKindProvider class="your class name"/>
</extra-designer>


六、原理说明

当数据集类型选择列表被触发时,会调用TableDataCreatorProducer#createReportTableDataCreator方法。此时,会读取所有插件中申明的ServerTableDataDefineProvider实例。因为该接口对应的服务其数据集添加是在设计器上操作的,而实际数据集的计算是属于服务器的功能范畴,所以ServerTableDataDefineProvider还有个作用就是解耦,对于一个具体的服务器数据集最终会把tabledata的class名保存到finedb中(注:9.0及更低版本保存到datasources.xml)。PresentPane加载形态类型列表是会从插件中读取声明的PresentKindProvider接口实例并生成选择list,选中实例后会调用appearanceForPresent生成对应的UI,最终通过序列化把形态配置保存到cpt/frm中。计算时再反序列化生效。

七、特殊限制说明

iconPathForTableData :返回的图标路径(如:PresentKindProvider接口方法功能都比较明确,而且是个桥梁性质的接口,实现比较简单。需要注意的是在实现Present接口时,通常我们把形态分为,图片类/com/demo/hg/resources/images/main.png)。需要注意,因为这个接口没有做图片的统一缩放,所以需要开发者自己准备好16*16(px)大小的图标。否则会显得很不协调。

classForTableData: 接口需要返回一个TableData接口类。实际开发时为了方便开发提高效率和稳定性,要求开发者全部继承AbstractParameterTableData[注意点]

classForInitTableData:这个接口如果已经实现了classForTableData的话,目前没有什么实质性的作用,不过一般要求开发者保留性的与classForTableData返回相同的class。

html类/以及其他类 一共3种形式。

且PresentKindProvider接口根据原则上来说,都可以被自定义函数接口+函数形态进行覆盖。所以开发者在遇到形态的需求的时候,不要盲目的就选择PresentKindProvider接口,需要仔细确认面对的场景和要求,是否可以直接用更简单的函数接口即可满足要求。避免开发资源的浪费

八、常用链接

demo地址:demo-tablepresent-datakind-defineprovider

TableDataDefineProvider

UniversalServerTableDataProvider


九、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。

demo-tabledatashow-redispresent