Browse Source

迁移到solution下

master
richie 8 years ago
commit
c9cbabe1f9
  1. 5
      build.bat
  2. 118
      build.xml
  3. 25
      plugin.xml
  4. 30
      readme.md
  5. BIN
      screenshots/1.png
  6. BIN
      screenshots/2.png
  7. BIN
      screenshots/3.png
  8. BIN
      screenshots/4.png
  9. BIN
      screenshots/5.png
  10. 19
      src/com/fr/plugin/form/widget/CSSFileLoader.java
  11. 21
      src/com/fr/plugin/form/widget/JavaScriptFileLoader.java
  12. 38
      src/com/fr/plugin/form/widget/conf/RHIframeMarkInForm.java
  13. 127
      src/com/fr/plugin/form/widget/core/RHIframe.java
  14. 122
      src/com/fr/plugin/form/widget/core/RHIframeAttr.java
  15. 40
      src/com/fr/plugin/form/widget/core/RHIframeSource.java
  16. 74
      src/com/fr/plugin/form/widget/core/TemplateSource.java
  17. 65
      src/com/fr/plugin/form/widget/core/URLSource.java
  18. BIN
      src/com/fr/plugin/form/widget/images/rh_iframe.png
  19. 19
      src/com/fr/plugin/form/widget/locale/LocaleFinder.java
  20. 4
      src/com/fr/plugin/form/widget/locale/iframe.properties
  21. 4
      src/com/fr/plugin/form/widget/locale/iframe_zh_CN.properties
  22. 26
      src/com/fr/plugin/form/widget/monitor/RHFunctionProcessor.java
  23. 52
      src/com/fr/plugin/form/widget/ui/RHFramePane.java
  24. 28
      src/com/fr/plugin/form/widget/ui/SourceRadioPane.java
  25. 75
      src/com/fr/plugin/form/widget/ui/TemplateSourcePane.java
  26. 48
      src/com/fr/plugin/form/widget/ui/URLSourcePane.java
  27. 75
      src/com/fr/plugin/form/widget/ui/XRHIframe.java
  28. 45
      src/com/fr/plugin/form/widget/ui/editor/AccessibleRHIframeModelEditor.java
  29. 12
      src/com/fr/plugin/form/widget/ui/editor/RHIframeModelEditor.java
  30. 33
      src/com/fr/plugin/form/widget/ui/editor/RHIframeModelWrapper.java
  31. 13
      src/com/fr/plugin/form/widget/ui/render/RHIframeModelRenderer.java
  32. 233
      src/com/fr/plugin/form/widget/web/widget.rh.iframe.js

5
build.bat

@ -0,0 +1,5 @@
set JAVA_HOME=D:\FineReport\develop\java\jdk1.6u35
set ANT_OPTS=-Xmx512M -Xss100m
D:\FineReport\develop\release\build\ant\bin\ant -f build.xml jar

118
build.xml

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="jar" name="plugin">
<!-- JDK路径,根据自己机器上实际位置修改-->
<property name="jdk.home" value="/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home"/>
<property name="libs" value="${basedir}/lib"/>
<property name="publicLibs" value=""/>
<property name="destLoc" value="."/>
<property name="classes" value="classes"/>
<xmlproperty file="${basedir}/plugin.xml"/>
<property name="current-version" value="${plugin.version}"/>
<!-- 插件版本-->
<property name="plugin-version" value="${current-version}"/>
<!-- 插件名字-->
<property name="plugin-name" value="rh.iframe"/>
<property name="plugin-jar" value="fr-plugin-${plugin-name}-${plugin-version}.jar"/>
<target name="prepare">
<delete dir="${classes}"/>
<delete dir="fr-plugin-${plugin-name}-${plugin-version}"/>
<xmlproperty file="${basedir}/plugin.xml"/>
<delete dir="${destLoc}/${plugin.name}"/>
</target>
<path id="compile.classpath">
<fileset dir="${libs}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${publicLibs}">
<include name="**/*.jar"/>
</fileset>
</path>
<patternset id="resources4Jar">
<exclude name="**/.settings/**"/>
<exclude name=".classpath"/>
<exclude name=".project"/>
<exclude name="**/*.java"/>
<exclude name="**/*.db"/>
<exclude name="**/*.g"/>
<exclude name="**/package.html"/>
</patternset>
<target name="copy_resources">
<echo message="从${resources_from}拷贝图片,JS,CSS等资源文件"/>
<delete dir="tmp"/>
<copy todir="tmp">
<fileset dir="${resources_from}\src">
<patternset refid="resources4Jar"/>
</fileset>
</copy>
<copy todir="${classes}">
<fileset dir="tmp"/>
</copy>
<delete dir="tmp"/>
</target>
<target name="compile_javas">
<echo message="编译${compile_files}下的Java文件"/>
<javac destdir="${classes}" debug="false" optimize="on" source="${source_jdk_version}"
target="${target_jdk_version}"
fork="true" memoryMaximumSize="512m" listfiles="false" srcdir="${basedir}"
executable="${compile_jdk_version}/bin/javac">
<src path="${basedir}/src"/>
<exclude name="**/.svn/**"/>
<compilerarg line="-encoding UTF8 "/>
<classpath refid="compile.classpath"/>
</javac>
</target>
<target name="jar_classes">
<echo message="打Jar包:${jar_name}"/>
<delete file="${basedir}/${jar_name}"/>
<jar jarfile="${basedir}/${jar_name}">
<fileset dir="${classes}">
</fileset>
</jar>
</target>
<target name="super_jar" depends="prepare">
<antcall target="copy_resources">
<param name="resources_from" value="${basedir}"/>
</antcall>
<antcall target="compile_javas">
<param name="source_jdk_version" value="1.6"/>
<param name="target_jdk_version" value="1.6"/>
<param name="compile_jdk_version" value="${jdk.home}"/>
<param name="compile_files" value="${basedir}/src"/>
</antcall>
<echo message="compile plugin success!"/>
<antcall target="jar_classes">
<param name="jar_name" value="${plugin-jar}"/>
</antcall>
<delete dir="${classes}"/>
</target>
<target name="jar" depends="super_jar">
<antcall target="zip"/>
</target>
<target name="zip">
<property name="plugin-folder" value="fr-plugin-${plugin-name}-${plugin-version}"/>
<echo message="----------zip files----------"/>
<mkdir dir="${plugin-folder}"/>
<copy todir="${plugin-folder}">
<fileset dir=".">
<include name="${plugin-jar}"/>
<include name="plugin.xml"/>
</fileset>
</copy>
<zip destfile="${basedir}/${plugin-folder}.zip" basedir=".">
<include name="${plugin-folder}/*.jar"/>
<include name="${plugin-folder}/plugin.xml"/>
</zip>
<xmlproperty file="${basedir}/plugin.xml"/>
<move file="${plugin-folder}.zip" todir="${destLoc}/${plugin.name}"/>
</target>
</project>

25
plugin.xml

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin>
<id>com.fr.plugin.form.widget.rh.iframe</id>
<name><![CDATA[网页框控件]]></name>
<active>yes</active>
<version>3.2</version>
<env-version>8.0</env-version>
<jartime>2016-01-15</jartime>
<vendor>洪七公</vendor>
<description><![CDATA[网页框控件,仅支持在表单中使用]]></description>
<change-notes><![CDATA[
<p>[2015-12-03]修复再次打开地址设置界面时没有正确选择到选项的问题</p>
<p>[2016-01-13]增加常用的API接口</p>
<p>[2016-01-15]实现功能改进数据统计接口</p>
]]></change-notes>
<extra-core>
<LocaleFinder class="com.fr.plugin.form.widget.locale.LocaleFinder"/>
<JavaScriptFileHandler class="com.fr.plugin.form.widget.JavaScriptFileLoader"/>
</extra-core>
<extra-report>
</extra-report>
<extra-platform/>
<extra-designer>
<FormWidgetOptionProvider class="com.fr.plugin.form.widget.conf.RHIframeMarkInForm"/>
</extra-designer>
</plugin>

30
readme.md

@ -0,0 +1,30 @@
# 表单网页框控件
该插件支持在FineReport V8.0的表单中使用网页框控件
## API接口
1. setValue:(String)v
设置并刷新网页框控件的地址(保留原参数)
2. getValue
获取网页框控件的src地址
3. reset
重置网页框控件并刷新
## 效果图
1. 选择控件界面
![1](screenshots/1.png)
2. 设置控件的地址和参数入口
![2](screenshots/2.png)
3. 设置控件的模板地址界面
![3](screenshots/3.png)
4. 设置控件的网络地址界面
![4](screenshots/4.png)
5. 预览效果
![5](screenshots/5.png)

BIN
screenshots/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
screenshots/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
screenshots/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
screenshots/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
screenshots/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

19
src/com/fr/plugin/form/widget/CSSFileLoader.java

@ -0,0 +1,19 @@
package com.fr.plugin.form.widget;
import com.fr.stable.fun.impl.AbstractCssFileHandler;
/**
* Created by richie on 15/12/2.
*/
public class CSSFileLoader extends AbstractCssFileHandler {
@Override
public int currentAPILevel() {
return CURRENT_LEVEL;
}
@Override
public String[] pathsForFiles() {
return new String[0];
}
}

21
src/com/fr/plugin/form/widget/JavaScriptFileLoader.java

@ -0,0 +1,21 @@
package com.fr.plugin.form.widget;
import com.fr.stable.fun.impl.AbstractJavaScriptFileHandler;
/**
* Created by richie on 15/12/2.
*/
public class JavaScriptFileLoader extends AbstractJavaScriptFileHandler {
@Override
public int currentAPILevel() {
return CURRENT_LEVEL;
}
@Override
public String[] pathsForFiles() {
return new String[]{
"/com/fr/plugin/form/widget/web/widget.rh.iframe.js"
};
}
}

38
src/com/fr/plugin/form/widget/conf/RHIframeMarkInForm.java

@ -0,0 +1,38 @@
package com.fr.plugin.form.widget.conf;
import com.fr.design.fun.impl.AbstractFormWidgetOptionProvider;
import com.fr.form.ui.Widget;
import com.fr.general.Inter;
import com.fr.plugin.form.widget.core.RHIframe;
import com.fr.plugin.form.widget.ui.XRHIframe;
/**
* Created by richie on 15/12/2.
*/
public class RHIframeMarkInForm extends AbstractFormWidgetOptionProvider {
@Override
public int currentAPILevel() {
return CURRENT_LEVEL;
}
@Override
public Class<? extends Widget> classForWidget() {
return RHIframe.class;
}
@Override
public Class<?> appearanceForWidget() {
return XRHIframe.class;
}
@Override
public String iconPathForWidget() {
return "/com/fr/plugin/form/widget/images/rh_iframe.png";
}
@Override
public String nameForWidget() {
return Inter.getLocText("Plugin-RH_Iframe_Name");
}
}

127
src/com/fr/plugin/form/widget/core/RHIframe.java

@ -0,0 +1,127 @@
package com.fr.plugin.form.widget.core;
import com.fr.form.ui.FieldEditor;
import com.fr.general.xml.GeneralXMLTools;
import com.fr.json.JSONArray;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.plugin.ExtraClassManager;
import com.fr.plugin.form.widget.monitor.RHFunctionProcessor;
import com.fr.script.Calculator;
import com.fr.stable.core.NodeVisitor;
import com.fr.stable.fun.FunctionProcessor;
import com.fr.stable.script.CalculatorProvider;
import com.fr.stable.web.Repository;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
import com.fr.web.core.SessionIDInfor;
import javax.servlet.http.HttpServletRequest;
/**
* Created by richie on 15/12/2.
*/
public class RHIframe extends FieldEditor {
private boolean overflowX = true;
private boolean overflowY = true;
private RHIframeAttr attr = new RHIframeAttr();
public RHIframe() {
}
public RHIframeAttr getAttr() {
return attr;
}
public void setAttr(RHIframeAttr attr) {
this.attr = attr;
}
public boolean isOverflowX() {
return overflowX;
}
public void setOverflowX(boolean overflowX) {
this.overflowX = overflowX;
}
public boolean isOverflowY() {
return overflowY;
}
public void setOverflowY(boolean overflowY) {
this.overflowY = overflowY;
}
@Override
public JSONObject createJSONConfig(Repository repo, Calculator c, NodeVisitor nodeVisitor) throws JSONException {
JSONObject jo = super.createJSONConfig(repo, c, nodeVisitor);
attr.mixConfig(jo, c, repo.getHttpServletRequest());
jo.put("showOverFlowX", overflowX);
jo.put("showOverFlowY", overflowY);
FunctionProcessor processor = ExtraClassManager.getInstance().getFunctionProcessor();
if (processor != null){
processor.recordFunction(RHFunctionProcessor.getInstance());
}
return jo;
}
@Override
public JSONArray createJSONData(SessionIDInfor sessionIDInfor, Calculator c, HttpServletRequest req) throws Exception {
JSONArray ja = super.createJSONData(sessionIDInfor, c, req);
attr.mixJSONData(ja, sessionIDInfor, c);
return ja;
}
@Override
public String getXType() {
return "rh.iframe";
}
@Override
public boolean isEditor() {
return false;
}
@Override
public String[] supportedEvents() {
return new String[0];
}
@Override
public String[] dependence(CalculatorProvider ca) {
return new String[0];
}
@Override
public void readXML(XMLableReader reader) {
super.readXML(reader);
if (reader.isChildNode()) {
String nodeName = reader.getTagName();
if ("Attr".equals(nodeName)) {
this.overflowX = reader.getAttrAsBoolean("scrollX", true);
this.overflowY = reader.getAttrAsBoolean("scrollY", true);
} else if (RHIframeAttr.XML_TAG.equals(nodeName)) {
this.attr = (RHIframeAttr) GeneralXMLTools.readXMLable(reader);
}
}
}
@Override
public void writeXML(XMLPrintWriter writer) {
super.writeXML(writer);
writer.startTAG("Attr");
writer.attr("scrollX", overflowX);
writer.attr("scrollY", overflowY);
writer.end();
if (attr != null) {
GeneralXMLTools.writeXMLable(writer, attr, RHIframeAttr.XML_TAG);
}
}
}

122
src/com/fr/plugin/form/widget/core/RHIframeAttr.java

@ -0,0 +1,122 @@
package com.fr.plugin.form.widget.core;
import com.fr.base.Formula;
import com.fr.base.ParameterMapNameSpace;
import com.fr.general.FArray;
import com.fr.general.xml.GeneralXMLTools;
import com.fr.json.JSONArray;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.script.Calculator;
import com.fr.stable.CodeUtils;
import com.fr.stable.ParameterProvider;
import com.fr.stable.UtilEvalError;
import com.fr.stable.js.WidgetName;
import com.fr.stable.script.NameSpace;
import com.fr.stable.xml.*;
import com.fr.web.core.SessionIDInfor;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
/**
* Created by richie on 15/12/2.
*/
public class RHIframeAttr implements XMLable {
public static final String XML_TAG = "RHIframeAttr";
private RHIframeSource source;
private ParameterProvider[] parameters;
public RHIframeSource getSource() {
return source;
}
public void setSource(RHIframeSource source) {
this.source = source;
}
public ParameterProvider[] getParameters() {
return parameters;
}
public void setParameters(ParameterProvider[] parameters) {
this.parameters = parameters;
}
public void mixConfig(JSONObject jo, Calculator c, HttpServletRequest req) throws JSONException {
if (source != null) {
jo.put("src", source.getCalculatedUrl(c, req));
}
}
public void mixJSONData(JSONArray ja, SessionIDInfor sessionIDInfor, Calculator c) throws JSONException, UtilEvalError {
NameSpace ns = ParameterMapNameSpace.create(sessionIDInfor.getParameterMap4Execute());
c.pushNameSpace(ns);
for (int i = 0; i < (parameters == null ? 0 : parameters.length); i++) {
Object obj = parameters[i].getValue();
if (obj instanceof Formula) {
String content = ((Formula) obj).getContent();
obj = c.evalValue(content);
}
JSONObject jo = new JSONObject();
if (obj instanceof String) {
obj = CodeUtils.cjkEncode((String) obj);
jo.put(parameters[i].getName(), obj);
} else if (obj instanceof FArray) {
obj = ((FArray) obj).cjkEncode();
jo.put(parameters[i].getName(), obj);
} else if (obj instanceof WidgetName) {
jo.put("widgetName", ((WidgetName) obj).getName());
} else {
// 还可以是数字啊什么的
jo.put(parameters[i].getName(), obj);
}
ja.put(jo);
}
}
@Override
public void readXML(XMLableReader reader) {
if (reader.isChildNode()) {
String tmpName = reader.getTagName();
if (ParameterProvider.ARRAY_XML_TAG.equals(tmpName)) {//读取Parameters.
final List<ParameterProvider> tmpParameterList = new ArrayList<ParameterProvider>();
reader.readXMLObject(new XMLReadable() {
public void readXML(XMLableReader reader) {
if (ParameterProvider.XML_TAG.equals(reader.getTagName())) {
tmpParameterList.add(StableXMLUtils.readParameter(reader));
}
}
});
//转换数组.
if (!tmpParameterList.isEmpty()) {
this.parameters = tmpParameterList.toArray(new ParameterProvider[tmpParameterList.size()]);
}
} else if (tmpName.equals(RHIframeSource.XML_TAG)) {
this.source = (RHIframeSource) GeneralXMLTools.readXMLable(reader);
}
}
}
@Override
public void writeXML(XMLPrintWriter writer) {
if (source != null) {
GeneralXMLTools.writeXMLable(writer, source, RHIframeSource.XML_TAG);
}
StableXMLUtils.writeParameters(writer, parameters);
}
@Override
public Object clone() throws CloneNotSupportedException {
RHIframeAttr cloned = (RHIframeAttr)super.clone();
cloned.source = source;
cloned.parameters = parameters;
return cloned;
}
}

40
src/com/fr/plugin/form/widget/core/RHIframeSource.java

@ -0,0 +1,40 @@
package com.fr.plugin.form.widget.core;
import com.fr.script.Calculator;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLable;
import com.fr.stable.xml.XMLableReader;
import javax.servlet.http.HttpServletRequest;
/**
* Created by richie on 15/12/2.
*/
public class RHIframeSource implements XMLable {
public static final String XML_TAG = "RHIframeSource";
public String toString() {
return "source";
}
@Override
public void readXML(XMLableReader reader) {
}
@Override
public void writeXML(XMLPrintWriter writer) {
}
public String getCalculatedUrl(Calculator calculator, HttpServletRequest req) {
return null;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

74
src/com/fr/plugin/form/widget/core/TemplateSource.java

@ -0,0 +1,74 @@
package com.fr.plugin.form.widget.core;
import com.fr.base.TemplateUtils;
import com.fr.data.NetworkHelper;
import com.fr.general.Inter;
import com.fr.script.Calculator;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
import javax.servlet.http.HttpServletRequest;
/**
* Created by richie on 15/12/2.
*/
public class TemplateSource extends RHIframeSource {
private String path;
public TemplateSource() {
}
public TemplateSource(String path) {
this.path = path;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@Override
public String getCalculatedUrl(Calculator calculator, HttpServletRequest req) {
try {
String realPath = TemplateUtils.render(path, calculator);
if (realPath.contains(".cpt")) {
return NetworkHelper.createServletURL(req) + "?reportlet=" + realPath;
} else if (realPath.contains(".frm")) {
return NetworkHelper.createServletURL(req) + "?formlet=" + realPath;
}
} catch (Exception e) {
return null;
}
return null;
}
@Override
public String toString() {
return Inter.getLocText("Plugin_RH_Iframe_Template_Path");
}
@Override
public void readXML(XMLableReader reader) {
super.readXML(reader);
if (reader.isChildNode()) {
String nodeName = reader.getTagName();
if ("Attr".equals(nodeName)) {
this.path = reader.getAttrAsString("path", null);
}
}
}
@Override
public void writeXML(XMLPrintWriter writer) {
super.writeXML(writer);
writer.startTAG("Attr");
writer.attr("path", path);
writer.end();
}
}

65
src/com/fr/plugin/form/widget/core/URLSource.java

@ -0,0 +1,65 @@
package com.fr.plugin.form.widget.core;
import com.fr.base.TemplateUtils;
import com.fr.general.Inter;
import com.fr.script.Calculator;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
import javax.servlet.http.HttpServletRequest;
/**
* Created by richie on 15/12/2.
*/
public class URLSource extends RHIframeSource {
private String url;
public URLSource() {
}
public URLSource(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String getCalculatedUrl(Calculator calculator, HttpServletRequest req) {
try {
return TemplateUtils.render(url, calculator);
} catch (Exception e) {
return null;
}
}
@Override
public String toString() {
return Inter.getLocText("Plugin_RH_Iframe_Url");
}
@Override
public void readXML(XMLableReader reader) {
super.readXML(reader);
if (reader.isChildNode()) {
String nodeName = reader.getTagName();
if ("Attr".equals(nodeName)) {
this.url = reader.getAttrAsString("url", null);
}
}
}
@Override
public void writeXML(XMLPrintWriter writer) {
super.writeXML(writer);
writer.startTAG("Attr");
writer.attr("url", url);
writer.end();
}
}

BIN
src/com/fr/plugin/form/widget/images/rh_iframe.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

19
src/com/fr/plugin/form/widget/locale/LocaleFinder.java

@ -0,0 +1,19 @@
package com.fr.plugin.form.widget.locale;
import com.fr.stable.fun.impl.AbstractLocaleFinder;
/**
* Created by richie on 15/12/2.
*/
public class LocaleFinder extends AbstractLocaleFinder {
@Override
public int currentAPILevel() {
return CURRENT_LEVEL;
}
@Override
public String find() {
return "com/fr/plugin/form/widget/locale/iframe";
}
}

4
src/com/fr/plugin/form/widget/locale/iframe.properties

@ -0,0 +1,4 @@
Plugin-RH_Iframe_Name=Iframe
Plugin-RH_Iframe_Value=Address
Plugin_RH_Iframe_Template_Path=Template Path
Plugin_RH_Iframe_Url=URL

4
src/com/fr/plugin/form/widget/locale/iframe_zh_CN.properties

@ -0,0 +1,4 @@
Plugin-RH_Iframe_Name=\u7F51\u9875\u6846
Plugin-RH_Iframe_Value=\u5730\u5740\u548C\u53C2\u6570
Plugin_RH_Iframe_Template_Path=\u6A21\u677F\u8DEF\u5F84
Plugin_RH_Iframe_Url=\u7F51\u7EDC\u8DEF\u5F84

26
src/com/fr/plugin/form/widget/monitor/RHFunctionProcessor.java

@ -0,0 +1,26 @@
package com.fr.plugin.form.widget.monitor;
import com.fr.stable.fun.FunctionHelper;
import com.fr.stable.fun.impl.AbstractFunctionProcessor;
/**
* Created by richie on 15/12/3.
*/
public class RHFunctionProcessor extends AbstractFunctionProcessor {
private static RHFunctionProcessor instance = new RHFunctionProcessor();
public static RHFunctionProcessor getInstance() {
return instance;
}
@Override
public int getId() {
return FunctionHelper.generateFunctionID("com.fr.plugin.form.widget.rh.iframe");
}
@Override
public String getLocaleKey() {
return "Plugin-RH_Iframe_Name";
}
}

52
src/com/fr/plugin/form/widget/ui/RHFramePane.java

@ -0,0 +1,52 @@
package com.fr.plugin.form.widget.ui;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.frpane.UIRadioPane;
import com.fr.design.gui.itableeditorpane.ParameterTableModel;
import com.fr.design.gui.itableeditorpane.UITableEditorPane;
import com.fr.general.Inter;
import com.fr.plugin.form.widget.core.RHIframeAttr;
import com.fr.plugin.form.widget.core.RHIframeSource;
import com.fr.stable.ParameterProvider;
import java.awt.*;
/**
* Created by richie on 15/12/2.
*/
public class RHFramePane extends BasicPane {
private UIRadioPane<RHIframeSource> radioPane;
private UITableEditorPane<ParameterProvider> editorPane;
@Override
protected String title4PopupWindow() {
return Inter.getLocText("Plugin-RH_Iframe_Value");
}
public RHFramePane() {
setLayout(new BorderLayout());
radioPane = new SourceRadioPane();
radioPane.setPreferredSize(new Dimension(200, 60));
add(radioPane, BorderLayout.NORTH);
ParameterTableModel model = new ParameterTableModel();
editorPane = new UITableEditorPane<ParameterProvider>(model);
add(editorPane, BorderLayout.CENTER);
}
public RHIframeAttr update() {
RHIframeAttr attr = new RHIframeAttr();
attr.setSource(radioPane.updateBean());
java.util.List<ParameterProvider> list = editorPane.update();
attr.setParameters(list.toArray(new ParameterProvider[list.size()]));
return attr;
}
public void populate(RHIframeAttr attr) {
if (attr != null) {
radioPane.populateBean(attr.getSource());
editorPane.populate(attr.getParameters());
}
}
}

28
src/com/fr/plugin/form/widget/ui/SourceRadioPane.java

@ -0,0 +1,28 @@
package com.fr.plugin.form.widget.ui;
import com.fr.design.beans.FurtherBasicBeanPane;
import com.fr.design.gui.frpane.UIRadioPane;
import com.fr.plugin.form.widget.core.RHIframeSource;
import java.util.ArrayList;
import java.util.List;
/**
* Created by richie on 15/12/2.
*/
public class SourceRadioPane extends UIRadioPane<RHIframeSource>{
@Override
protected List<FurtherBasicBeanPane<? extends RHIframeSource>> initPaneList() {
List<FurtherBasicBeanPane<? extends RHIframeSource>> list = new ArrayList<FurtherBasicBeanPane<? extends RHIframeSource>>();
list.add(new TemplateSourcePane());
list.add(new URLSourcePane());
return list;
}
@Override
protected String title4PopupWindow() {
return "Source";
}
}

75
src/com/fr/plugin/form/widget/ui/TemplateSourcePane.java

@ -0,0 +1,75 @@
package com.fr.plugin.form.widget.ui;
import com.fr.design.beans.FurtherBasicBeanPane;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.gui.itree.filetree.ReportletPane;
import com.fr.plugin.form.widget.core.TemplateSource;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Created by richie on 15/12/2.
*/
public class TemplateSourcePane extends FurtherBasicBeanPane<TemplateSource> {
private UITextField textField;
public TemplateSourcePane() {
setLayout(new BorderLayout());
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setPreferredSize(new Dimension(30, 20));
add(contentPane, BorderLayout.NORTH);
textField = new UITextField();
UIButton btn = new UIButton("...");
btn.setPreferredSize(new Dimension(30, 20));
contentPane.add(textField, BorderLayout.CENTER);
contentPane.add(btn, BorderLayout.EAST);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final ReportletPane reportletPane = new ReportletPane();
reportletPane.setSelectedReportletPath(textField.getText());
BasicDialog reportletDialog = reportletPane.showWindow(SwingUtilities.getWindowAncestor(TemplateSourcePane.this));
reportletDialog.addDialogActionListener(new DialogActionAdapter() {
public void doOk() {
textField.setText(reportletPane.getSelectedReportletPath());
}
});
reportletDialog.setVisible(true);
}
});
}
@Override
public boolean accept(Object ob) {
return ob instanceof TemplateSource;
}
@Override
public String title4PopupWindow() {
return "模板路径";
}
@Override
public void reset() {
}
@Override
public void populateBean(TemplateSource ob) {
textField.setText(ob.getPath());
}
@Override
public TemplateSource updateBean() {
return new TemplateSource(textField.getText());
}
}

48
src/com/fr/plugin/form/widget/ui/URLSourcePane.java

@ -0,0 +1,48 @@
package com.fr.plugin.form.widget.ui;
import com.fr.design.beans.FurtherBasicBeanPane;
import com.fr.design.formula.TinyFormulaPane;
import com.fr.plugin.form.widget.core.URLSource;
import java.awt.*;
/**
* Created by richie on 15/12/2.
*/
public class URLSourcePane extends FurtherBasicBeanPane<URLSource> {
private TinyFormulaPane formulaPane;
public URLSourcePane() {
setLayout(new BorderLayout());
formulaPane = new TinyFormulaPane();
add(formulaPane, BorderLayout.CENTER);
}
@Override
public boolean accept(Object ob) {
return ob instanceof URLSource;
}
@Override
public String title4PopupWindow() {
return "网络路径";
}
@Override
public void reset() {
}
@Override
public void populateBean(URLSource ob) {
if (ob != null) {
formulaPane.populateBean(ob.getUrl());
}
}
@Override
public URLSource updateBean() {
return new URLSource(formulaPane.updateBean());
}
}

75
src/com/fr/plugin/form/widget/ui/XRHIframe.java

@ -0,0 +1,75 @@
package com.fr.plugin.form.widget.ui;
import com.fr.design.designer.creator.CRPropertyDescriptor;
import com.fr.design.designer.creator.XWidgetCreator;
import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.widget.editors.WidgetValueEditor;
import com.fr.general.Inter;
import com.fr.plugin.form.widget.core.RHIframe;
import com.fr.plugin.form.widget.ui.editor.RHIframeModelEditor;
import com.fr.plugin.form.widget.ui.render.RHIframeModelRenderer;
import com.fr.stable.ArrayUtils;
import javax.swing.*;
import java.awt.*;
import java.beans.IntrospectionException;
/**
* Created by richie on 15/12/2.
*/
public class XRHIframe extends XWidgetCreator {
public XRHIframe(RHIframe widget, Dimension initSize) {
super(widget, initSize);
}
@Override
public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException {
return (CRPropertyDescriptor[]) ArrayUtils.addAll(super.supportedDescriptor(), new CRPropertyDescriptor[]{
new CRPropertyDescriptor("attr", this.toData().getClass())
.setI18NName(Inter.getLocText("Plugin-RH_Iframe_Value"))
.setEditorClass(RHIframeModelEditor.class)
.setRendererClass(RHIframeModelRenderer.class),
new CRPropertyDescriptor("overflowX", this.data.getClass()).setI18NName(
Inter.getLocText("Preference-Horizontal_Scroll_Bar_Visible")).putKeyValue(
XCreatorConstants.PROPERTY_CATEGORY, "Advanced"),
new CRPropertyDescriptor("overflowY", this.data.getClass()).setI18NName(
Inter.getLocText("Preference-Vertical_Scroll_Bar_Visible")).putKeyValue(
XCreatorConstants.PROPERTY_CATEGORY, "Advanced")});
}
@Override
protected JComponent initEditor() {
if (editor == null) {
editor = FRGUIPaneFactory.createBorderLayout_S_Pane();
UITextField address = new UITextField();
editor.add(address, BorderLayout.NORTH);
JPanel contentPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
contentPane.setBackground(Color.white);
editor.add(contentPane, BorderLayout.CENTER);
}
return editor;
}
@Override
public Dimension initEditorSize() {
return new Dimension(160, 80);
}
/**
* 该组件是否可以拖入参数面板
* 这里控制 网页预定义控件在工具栏不显示
*
* @return 是则返回true
*/
public boolean canEnterIntoParaPane() {
return false;
}
@Override
public String getIconPath() {
return "/com/fr/plugin/form/widget/images/rh_iframe.png";
}
}

45
src/com/fr/plugin/form/widget/ui/editor/AccessibleRHIframeModelEditor.java

@ -0,0 +1,45 @@
package com.fr.plugin.form.widget.ui.editor;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.mainframe.widget.accessibles.UneditableAccessibleEditor;
import com.fr.plugin.form.widget.core.RHIframeAttr;
import com.fr.plugin.form.widget.ui.RHFramePane;
import javax.swing.*;
/**
* Created by richie on 15/12/2.
*/
public class AccessibleRHIframeModelEditor extends UneditableAccessibleEditor {
private RHFramePane rhFramePane;
public AccessibleRHIframeModelEditor() {
super(new RHIframeModelWrapper());
}
@Override
protected void showEditorPane() {
if (rhFramePane == null) {
rhFramePane = new RHFramePane();
}
BasicDialog dlg = rhFramePane.showWindow(SwingUtilities.getWindowAncestor(this));
rhFramePane.populate(getValue());
dlg.addDialogActionListener(new DialogActionAdapter() {
@Override
public void doOk() {
RHIframeAttr zTreeNode = rhFramePane.update();
setValue(zTreeNode);
fireStateChanged();
}
});
dlg.setVisible(true);
}
@Override
public RHIframeAttr getValue() {
return (RHIframeAttr) super.getValue();
}
}

12
src/com/fr/plugin/form/widget/ui/editor/RHIframeModelEditor.java

@ -0,0 +1,12 @@
package com.fr.plugin.form.widget.ui.editor;
import com.fr.design.mainframe.widget.accessibles.AccessiblePropertyEditor;
/**
* Created by richie on 15/12/2.
*/
public class RHIframeModelEditor extends AccessiblePropertyEditor {
public RHIframeModelEditor() {
super(new AccessibleRHIframeModelEditor());
}
}

33
src/com/fr/plugin/form/widget/ui/editor/RHIframeModelWrapper.java

@ -0,0 +1,33 @@
package com.fr.plugin.form.widget.ui.editor;
import com.fr.design.Exception.ValidationException;
import com.fr.design.designer.properties.Decoder;
import com.fr.design.designer.properties.Encoder;
import com.fr.plugin.form.widget.core.RHIframeAttr;
import com.fr.plugin.form.widget.core.RHIframeSource;
/**
* Created by richie on 15/12/2.
*/
public class RHIframeModelWrapper implements Encoder<RHIframeAttr>, Decoder<RHIframeAttr> {
@Override
public RHIframeAttr decode(String txt) {
return null;
}
@Override
public void validate(String txt) throws ValidationException {
}
@Override
public String encode(RHIframeAttr v) {
if (v != null) {
RHIframeSource source = v.getSource();
if (source != null) {
return source.toString();
}
}
return null;
}
}

13
src/com/fr/plugin/form/widget/ui/render/RHIframeModelRenderer.java

@ -0,0 +1,13 @@
package com.fr.plugin.form.widget.ui.render;
import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer;
import com.fr.plugin.form.widget.ui.editor.RHIframeModelWrapper;
/**
* Created by richie on 15/12/2.
*/
public class RHIframeModelRenderer extends EncoderCellRenderer {
public RHIframeModelRenderer() {
super(new RHIframeModelWrapper());
}
}

233
src/com/fr/plugin/form/widget/web/widget.rh.iframe.js

@ -0,0 +1,233 @@
/**
* @class FR.RHIframe
* @extends FR.BaseEditor
*/
(function($){
FR.RHIframe = FR.extend(FR.BaseEditor, {
_defaultConfig: function () {
return $.extend(FR.RHIframe.superclass._defaultConfig.apply(), {
baseName: 'rh.iframe',
baseClass: 'rh.iframe',
widgetName: "",
src: "",
width: "100%",
height: "100%",
showOverFlowX: true,
showOverFlowY: true
});
},
_init: function () {
FR.RHIframe.superclass._init.apply(this, arguments);
this.initData();
// 控件属性
var o = this.options;
this.editComp = this.element.css({
width: '100%',
height: '100%'
});
o.iframeName = o.widgetName || this.createNoRepeatName();
this.$iframe = $("<iframe name=" + o.iframeName + " id="
+ o.iframeName + ">").addClass(o.baseClass).attr({
width : '100%',
height : '100%',
frameborder: 0,
scrolling: !o.showOverFlowX && !o.showOverFlowY
? 'no'
: 'yes'
}).appendTo(this.editComp);
// 这里滚动条的设置 跟子页面的设置有关
// 如果嵌入的是我们的报表或者表单 window的尺寸都是100%那就取了iframe的大小
// 如果报表或表单内容尺寸超过的话 就会出现滚动条 那么就改下子元素 这时一般不跨域
this.$iframe[0].onload = function () {
if (!o.showOverFlowX || !o.showOverFlowY) {
try { // 可能跨域 那就不用管了
if (this.contentWindow) {
var doc = this.contentWindow.document;
var cc = $('.content-container', $(doc));
if (cc.length > 0) {
setOverflow(cc);
} else {
// 有可能是表单 html和body都要设置
setOverflow($(doc.documentElement));
setOverflow($(doc.body));
}
function setOverflow(cc) {
if (!o.showOverFlowX) {
cc.css('overflow-x', 'hidden');
}
if (!o.showOverFlowY) {
cc.css('overflow-y', 'hidden');
}
}
}
} catch (e) {
console && console.log("error");
}
}
}
// IE里面需要设置rowspan为1才能正常显示....否则会跳过n行不显示,chrome应该是bug,一会儿好一会儿不好
if ($.browser.msie && (this.$iframe.parent()).is("div")
&& (this.$iframe.parent().parent()).is("td")
&& (this.$iframe.parent().parent().attr("widget")) != null
&& (this.$iframe.parent().parent().parent()).is("tr")) {
// this.$iframe.parent().parent().attr('rowspan', '1');
// 上面这么搞有问题的,IE7或IE8杂项下,合并单元格中的网页框控件会只显示在第一行的,改成下面
this.$iframe.parent().height("");
} else {
this.$iframe.css('overflow-x', o.showOverFlowX ? 'auto' : 'hidden');
this.$iframe.css('overflow-y', o.showOverFlowY ? 'auto' : 'hidden');
}
if (o.controlAttr) {
this.setValue(o.controlAttr);
} else if (o.src) {
this._loadIframeByGet();
}
if (o.disabled) {
this._addDisableMask();
}
},
createNoRepeatName: function () {
var len = $('iframe' + this.options.baseClass).length;
while ($('iframe[name=' + this.options.baseName + len + ']').length !== 0) {
len++;
}
return this.options.baseName + len;
},
// richer:以get的方式获取ifram的参数
_loadIframeByGet: function () {
var src = this.options.src, self = this;
// 获取参数组
if (this.options.data) {
//bug:63869这个遍历没有必要下面都有ifelse了
//for (var i = 0, len = this.options.data.getLength(); i < len; i++) {
// var params = this.options.data.getRecord(i).getContent();
// src = src.appendQuery(params);
//}
var waitForInitComplete = [];
for (var i = 0, len = this.options.data.getLength(); i < len; i++) {
var params = this.options.data.getRecord(i).getContent();
if (typeof params == 'object' && params.widgetName && this.options.form) {
var w = this.options.form.getWidgetByName(params.widgetName);
if (w) {
var para = {};
para[params.widgetName] = w.getValue();
src = src.appendQuery(para);
} else {
waitForInitComplete.push(params.widgetName);
}
} else {
src = src.appendQuery(params);
}
}
if (waitForInitComplete.length > 1) {
var form = this.options.form;
form.on(FR.Events.AFTERINIT, function () {
for (var c = 0; c < waitForInitComplete.length; c++) {
var name = waitForInitComplete[c];
var para = {};
para[name] = form.getWidgetByName(name).getValue();
src = src.appendQuery(para);
}
self._changeIframe(src);
});
}
}
this._changeIframe(src);
},
/**
* 添加一层遮罩层用于屏蔽iframe内容的可用性
* @private
*/
_addDisableMask: function () {
this.mask = $('<span/>').css({
backgroundColor : '#66B9FF',
height: this.options.height,
width: this.options.width,
left: this.element.offset().left
}).appendTo(this.element);
},
/**
* 设置网页框控件的地址并重新加载页面(保留原参数)
* @param {String} v 新的地址
*/
setValue : function(v) {
this.options.src = v;
this._loadIframeByGet();
},
/**
* 获取网页框的src地址
* @returns {String} 地址
*/
getValue: function () {
return this.$iframe.attr("src");
},
_dealValueWithEvents: function (src) {
this.options.src = src;
this._changeIframe(src);
},
/**
* 改变iframe的src指向的地址
* @param src 新的地址
* @private
*/
_changeIframe: function (src) {
this.$iframe.attr("src", src);
},
/**
* 加载指定的url
* @param url 网页地址
*/
loadUrl : function(url) {
this.$iframe.attr("src", url);
},
setEnable: function (enable) {
FR.RHIframe.superclass.setEnable.apply(this, arguments);
if (enable) {
if (this.mask) {
this.mask.remove();
}
} else {
if (this.mask) {
this.mask.show();
} else {
this._addDisableMask();
}
}
},
doResize: function (give) {
FR.RHIframe.superclass.doResize.apply(this, arguments);
if (this.submitForm) {
this.submitForm.submit();
}
},
/**
* 重置网页框控件
*/
reload: function () {
this.options.data.clearData();
this._loadIframeByGet();
}
});
$.shortcut('rh.iframe', FR.RHIframe);
})(jQuery);
Loading…
Cancel
Save