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

Page tree

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

Skip to end of metadata
Go to start of metadata

第一步:建立插件源码文件夹

第二步:用IDEA创建这个工程,如图所示的结构

第三步:放入插件开发所需的jar包

第四步:查找到自定义控件所需的几个接口
控件接口:其中b和c都是继a接口的

接口描述编号
com.fr.design.fun.ParameterWidgetOptionProvider参数界面控件接口a
com.fr.design.fun.CellWidgetOptionProvider单元格控件接口b
com.fr.design.fun.FormWidgetOptionProvider表单控件接口c
com.fr.stable.fun.JavaScriptFileHandler用于引入js文件的接口d
com.fr.stable.fun.CssFileHandler用于引入css文件的接口e

第五步:开始建立源文件目录,这个例子的package目录为com.fr.plugin.widget.grid

第六步:建立单元格控件接口的一个实现类com.fr.plugin.widget.grid.CellGridImpl

CellGridImpl
package com.fr.plugin.widget.grid;

import com.fr.design.beans.BasicBeanPane;
import com.fr.design.fun.impl.AbstractCellWidgetOptionProvider;
import com.fr.form.ui.Widget;

public class CellGridImpl extends AbstractCellWidgetOptionProvider {
    
    @Override
    public Class<? extends Widget> classForWidget() {
        return null;
    }

    @Override
    public Class<? extends BasicBeanPane<? extends Widget>> appearanceForWidget() {
        return null;
    }

    @Override
    public String iconPathForWidget() {
        return null;
    }

    @Override
    public String nameForWidget() {
        return null;
    }
}

 

第七步:一个个补充上这个方法的实现,其中的ComboGrid是控件的实现类,CellGridDefinePane是单元格控件的属性设置界面类

 

CellGridImpl
package com.fr.plugin.widget.grid;

import com.fr.design.beans.BasicBeanPane;
import com.fr.design.fun.CellWidgetOptionProvider;
import com.fr.form.ui.Widget;

public class CellGridImpl implements CellWidgetOptionProvider {

    @Override
    public Class<? extends Widget> classForWidget() {
        return ComboGrid.class;
    }

    @Override
    public Class<? extends BasicBeanPane<? extends Widget>> appearanceForWidget() {
        return CellGridDefinePane.class;
    }

    @Override
    public String iconPathForWidget() {
        return "/com/fr/plugin/widget/grid/images/table.png";
    }

    @Override
    public String nameForWidget() {
        return "下拉表格";
    }
}

 

第八步:在plugin.xml中注册上单元格控件接口

<extra-designer>
    <CellWidgetOptionProvider class="com.fr.plugin.widget.grid.CellGridImpl"/>
</extra-designer>

 

第九步:web端展现,我们使用easyui。引入js和css代码接口实现如下

JavaScriptFile
package com.fr.plugin.widget.grid;

import com.fr.stable.fun.impl.AbstractJavaScriptFileHandler;

public class JavaScriptFile extends AbstractJavaScriptFileHandler {

    @Override
    public String[] pathsForFiles() {
        return new String[]{
                "/com/fr/plugin/widget/grid/easyui/jquery.easyui.min.js",
                "/com/fr/plugin/widget/grid/web/combogrid.js"
        };
    }
}
CssFile
package com.fr.plugin.widget.grid;

import com.fr.stable.fun.impl.AbstractCssFileHandler;

public class CssFile extends AbstractCssFileHandler {

    @Override
    public String[] pathsForFiles() {
        return new String[]{
                "/com/fr/plugin/widget/grid/easyui/easyui.css",
                "/com/fr/plugin/widget/grid/easyui/icon.css",
        };
    }
}

 

第十步:在plugin.xml注册上web文件引用接口

<extra-report>
    <JavaScriptFileHandler class="com.fr.plugin.widget.grid.JavaScriptFile"/>
    <CssFileHandler class="com.fr.plugin.widget.grid.CssFile"/>
</extra-report>

 

第十一步:到这里,把该插件打成jar包并安装,就可以在单元格的控件一栏中看到“下拉表格控件了”
第十二步:为了在参数界面和表单中也要能看到该控件,我们需要额外再写一个实现接口的类,这里不妨写为com.fr.plugin.widget.grid.GridImpl

 

GridImpl
package com.fr.plugin.widget.grid;

import com.fr.design.fun.ParameterWidgetOptionProvider;
import com.fr.design.fun.impl.AbstractFormWidgetOptionProvider;
import com.fr.form.ui.Widget;

public class GridImpl extends AbstractFormWidgetOptionProvider implements ParameterWidgetOptionProvider {
    @Override
    public Class<? extends Widget> classForWidget() {
        return ComboGrid.class;
    }

    @Override
    public Class<?> appearanceForWidget() {
        return XComboGrid.class;
    }

    @Override
    public String iconPathForWidget() {
        return "/com/fr/plugin/widget/grid/images/table.png";
    }

    @Override
    public String nameForWidget() {
        return "下拉表格";
    }
}

 

参数界面(表单)控件与单元格控件实现不同的地方,就在于public Class<?> appearanceForWidget()这个方法,
因为我们可以看到所有的控件,在参数界面和表单中的属性设置是一样的,而在单元格控件中时设置属性是另外一个界面

第十三步:在做好了之后,继续在plugin.xml中注册参数界面和表单控件接口,结合着之前添加的单元格控件接口,如下

<extra-designer>
    <ParameterWidgetOptionProvider class="com.fr.plugin.widget.grid.GridImpl"/>
    <FormWidgetOptionProvider class="com.fr.plugin.widget.grid.GridImpl"/>
    <CellWidgetOptionProvider class="com.fr.plugin.widget.grid.CellGridImpl"/>
</extra-designer>

经过前面13步之后,整个开发就结束了。

完整源码:http://git.oschina.net/fanruan/plugins-free/tree/master/plugin-paragrid


开发要点

1.单元格控件的设置界面类需要继承BasicBeanPane并且需要实现DicPaneAndTreePaneCreator接口
2.表单和参数控件设置界面类需要继承XWidgetCreator类,这里由于和下拉框比较相似,所以继承了XWidgetCreator的子类XWriteAbleRepeatEditor
3.表单和参数控件属性编辑器,分为基本类型(数字、布尔值、字符串)和自定义类型(其他),基本类型是会自定调用系统内置的编辑器,自定义类型则需要继承AbstractPropertyEditor类
4.ComboGrid类public String getXType()方法的返回值要和combogrid.js中注册JS对象的值一致:$.shortcut('combogrid', FR.ComboGrid);
5.控件在web端展现的基本JS结构如下

(function($){
    FR.MyImpl = FR.extend(FR.Widget, {
        _defaultConfig: function () {
            return $.extend(FR.Widget.superclass._defaultConfig.apply(), {
                width : 120,
                height : 24
            });
        },
        _init: function () {
            FR.Widget.superclass._init.apply(this, arguments);
        },
        getValue : function() {
            
        },
        setValue : function(v) {
            
        }
    });
})(jQuery);
  • No labels

4 Comments

  1. 源码中 combogrid.java 文件中 writeXML方法中 writer.attr("valueindex", valueIndex); 应大写,valueIndex,否则将出现显示值索引始终为0的情况.

  2. Anonymous

    Widget的子类,即自定义控件本身能给个例子吗?

    例如某个自定义控件:

    public class MyControl extends Widget implements DataControl {

    @Override
    public String[] dependence(CalculatorProvider calculatorProvider) {

    // 这个函数怎么写?是什么作用?文档和代码都找不到参考。

    }

     

  3. Anonymous

    本身是基于9.0系统的比赛,却拿出来一个8.0的控件当例子,关键是就这个例子还写的跟源码不一致,贵司真是毫无诚意

     

     

  4. 写得相当详细了,开发11看这个文档也丝毫没有压力。