commit c9cbabe1f90da4ef414847832063c244e7387bed
Author: richie
Date: Mon Mar 28 16:36:49 2016 +0800
迁移到solution下
diff --git a/build.bat b/build.bat
new file mode 100644
index 0000000..c9109f6
--- /dev/null
+++ b/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
\ No newline at end of file
diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..7d1d9e4
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugin.xml b/plugin.xml
new file mode 100644
index 0000000..fcfd216
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,25 @@
+
+ com.fr.plugin.form.widget.rh.iframe
+
+ yes
+ 3.2
+ 8.0
+ 2016-01-15
+ 洪七公
+
+ [2015-12-03]修复再次打开地址设置界面时没有正确选择到选项的问题
+ [2016-01-13]增加常用的API接口
+ [2016-01-15]实现功能改进数据统计接口
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..5927b28
--- /dev/null
+++ b/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)
\ No newline at end of file
diff --git a/screenshots/1.png b/screenshots/1.png
new file mode 100644
index 0000000..50745d0
Binary files /dev/null and b/screenshots/1.png differ
diff --git a/screenshots/2.png b/screenshots/2.png
new file mode 100644
index 0000000..f78f9d8
Binary files /dev/null and b/screenshots/2.png differ
diff --git a/screenshots/3.png b/screenshots/3.png
new file mode 100644
index 0000000..e7714c4
Binary files /dev/null and b/screenshots/3.png differ
diff --git a/screenshots/4.png b/screenshots/4.png
new file mode 100644
index 0000000..50e9a11
Binary files /dev/null and b/screenshots/4.png differ
diff --git a/screenshots/5.png b/screenshots/5.png
new file mode 100644
index 0000000..3dfa5cb
Binary files /dev/null and b/screenshots/5.png differ
diff --git a/src/com/fr/plugin/form/widget/CSSFileLoader.java b/src/com/fr/plugin/form/widget/CSSFileLoader.java
new file mode 100644
index 0000000..db1b864
--- /dev/null
+++ b/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];
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/JavaScriptFileLoader.java b/src/com/fr/plugin/form/widget/JavaScriptFileLoader.java
new file mode 100644
index 0000000..d019c96
--- /dev/null
+++ b/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"
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/conf/RHIframeMarkInForm.java b/src/com/fr/plugin/form/widget/conf/RHIframeMarkInForm.java
new file mode 100644
index 0000000..641916a
--- /dev/null
+++ b/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");
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/core/RHIframe.java b/src/com/fr/plugin/form/widget/core/RHIframe.java
new file mode 100644
index 0000000..e7f17fd
--- /dev/null
+++ b/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);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/core/RHIframeAttr.java b/src/com/fr/plugin/form/widget/core/RHIframeAttr.java
new file mode 100644
index 0000000..7cd7126
--- /dev/null
+++ b/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 tmpParameterList = new ArrayList();
+
+ 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;
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/core/RHIframeSource.java b/src/com/fr/plugin/form/widget/core/RHIframeSource.java
new file mode 100644
index 0000000..c690aa1
--- /dev/null
+++ b/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();
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/core/TemplateSource.java b/src/com/fr/plugin/form/widget/core/TemplateSource.java
new file mode 100644
index 0000000..f5c5cec
--- /dev/null
+++ b/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();
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/core/URLSource.java b/src/com/fr/plugin/form/widget/core/URLSource.java
new file mode 100644
index 0000000..c5133f0
--- /dev/null
+++ b/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();
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/images/rh_iframe.png b/src/com/fr/plugin/form/widget/images/rh_iframe.png
new file mode 100644
index 0000000..2893833
Binary files /dev/null and b/src/com/fr/plugin/form/widget/images/rh_iframe.png differ
diff --git a/src/com/fr/plugin/form/widget/locale/LocaleFinder.java b/src/com/fr/plugin/form/widget/locale/LocaleFinder.java
new file mode 100644
index 0000000..714918b
--- /dev/null
+++ b/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";
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/locale/iframe.properties b/src/com/fr/plugin/form/widget/locale/iframe.properties
new file mode 100644
index 0000000..dbba2ff
--- /dev/null
+++ b/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
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/locale/iframe_zh_CN.properties b/src/com/fr/plugin/form/widget/locale/iframe_zh_CN.properties
new file mode 100644
index 0000000..c34a236
--- /dev/null
+++ b/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
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/monitor/RHFunctionProcessor.java b/src/com/fr/plugin/form/widget/monitor/RHFunctionProcessor.java
new file mode 100644
index 0000000..1f38cc4
--- /dev/null
+++ b/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";
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/ui/RHFramePane.java b/src/com/fr/plugin/form/widget/ui/RHFramePane.java
new file mode 100644
index 0000000..5a9977e
--- /dev/null
+++ b/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 radioPane;
+ private UITableEditorPane 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(model);
+ add(editorPane, BorderLayout.CENTER);
+
+ }
+
+ public RHIframeAttr update() {
+ RHIframeAttr attr = new RHIframeAttr();
+ attr.setSource(radioPane.updateBean());
+ java.util.List 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());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/ui/SourceRadioPane.java b/src/com/fr/plugin/form/widget/ui/SourceRadioPane.java
new file mode 100644
index 0000000..b6e5fc0
--- /dev/null
+++ b/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{
+
+ @Override
+ protected List> initPaneList() {
+ List> list = new ArrayList>();
+ list.add(new TemplateSourcePane());
+ list.add(new URLSourcePane());
+ return list;
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return "Source";
+ }
+
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/ui/TemplateSourcePane.java b/src/com/fr/plugin/form/widget/ui/TemplateSourcePane.java
new file mode 100644
index 0000000..812dbca
--- /dev/null
+++ b/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 {
+
+ 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());
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/ui/URLSourcePane.java b/src/com/fr/plugin/form/widget/ui/URLSourcePane.java
new file mode 100644
index 0000000..a89543a
--- /dev/null
+++ b/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 {
+
+ 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());
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/ui/XRHIframe.java b/src/com/fr/plugin/form/widget/ui/XRHIframe.java
new file mode 100644
index 0000000..72bdeee
--- /dev/null
+++ b/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";
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/ui/editor/AccessibleRHIframeModelEditor.java b/src/com/fr/plugin/form/widget/ui/editor/AccessibleRHIframeModelEditor.java
new file mode 100644
index 0000000..d72ee64
--- /dev/null
+++ b/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();
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/ui/editor/RHIframeModelEditor.java b/src/com/fr/plugin/form/widget/ui/editor/RHIframeModelEditor.java
new file mode 100644
index 0000000..35a6db9
--- /dev/null
+++ b/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());
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/ui/editor/RHIframeModelWrapper.java b/src/com/fr/plugin/form/widget/ui/editor/RHIframeModelWrapper.java
new file mode 100644
index 0000000..7cea685
--- /dev/null
+++ b/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, Decoder {
+ @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;
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/ui/render/RHIframeModelRenderer.java b/src/com/fr/plugin/form/widget/ui/render/RHIframeModelRenderer.java
new file mode 100644
index 0000000..eb02900
--- /dev/null
+++ b/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());
+ }
+}
\ No newline at end of file
diff --git a/src/com/fr/plugin/form/widget/web/widget.rh.iframe.js b/src/com/fr/plugin/form/widget/web/widget.rh.iframe.js
new file mode 100644
index 0000000..8d0f33f
--- /dev/null
+++ b/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 = $("