From b854a4ada2932c2f894a72ab8ebb81e06920ccd9 Mon Sep 17 00:00:00 2001 From: "Jimmy.Zheng" Date: Fri, 23 Sep 2022 13:50:48 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20"Revert=20"REPORT-70593=20=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=8E=A7=E4=BB=B6=E5=90=88=E5=B9=B6=E4=B8=BB=E4=BB=A3?= =?UTF-8?q?=E7=A0=81""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 911ca18f --- .../com/fr/design/gui/core/WidgetOption.java | 7 +- .../HyperlinkGroupPaneActionProvider.java | 2 + .../com/fr/design/report/SelectImagePane.java | 67 ++++++----- .../buttonicon/widget/picture_widget_16.png | Bin 0 -> 1061 bytes .../widget/picture_widget_designer_bg.png | Bin 0 -> 4933 bytes .../designer/creator/XCreatorUtils.java | 2 + .../fr/design/designer/creator/XPicture.java | 74 ++++++++++++ .../com/fr/design/designer/ui/ImgPanel.java | 111 ++++++++++++++++++ .../AccessiblePictureModelEditor.java | 77 ++++++++++++ .../AccessibleUrlLinkModelEditor.java | 57 +++++++++ .../widget/editors/PictureEditor.java | 17 +++ .../widget/editors/UrlLinkEditor.java | 17 +++ .../widget/renderer/PictureRenderer.java | 15 +++ .../widget/renderer/UrlLinkRenderer.java | 16 +++ .../widget/wrappers/PictureModelWrapper.java | 34 ++++++ .../widget/wrappers/UrlLinkModelWrapper.java | 33 ++++++ .../fr/start/module/DesignerActivator.java | 6 +- .../com/fr/start/preload/ImagePreLoader.java | 1 + 18 files changed, 499 insertions(+), 37 deletions(-) rename {designer-realize => designer-base}/src/main/java/com/fr/design/report/SelectImagePane.java (96%) create mode 100644 designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/picture_widget_16.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg.png create mode 100644 designer-form/src/main/java/com/fr/design/designer/creator/XPicture.java create mode 100644 designer-form/src/main/java/com/fr/design/designer/ui/ImgPanel.java create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessiblePictureModelEditor.java create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleUrlLinkModelEditor.java create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/widget/editors/PictureEditor.java create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/widget/editors/UrlLinkEditor.java create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/widget/renderer/PictureRenderer.java create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/widget/renderer/UrlLinkRenderer.java create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/widget/wrappers/PictureModelWrapper.java create mode 100644 designer-form/src/main/java/com/fr/design/mainframe/widget/wrappers/UrlLinkModelWrapper.java diff --git a/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java b/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java index 258f558a7..4c9db5a6a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java +++ b/designer-base/src/main/java/com/fr/design/gui/core/WidgetOption.java @@ -1,6 +1,7 @@ package com.fr.design.gui.core; import com.fr.base.BaseUtils; +import com.fr.base.svg.IconUtils; import com.fr.form.ui.Button; import com.fr.form.ui.CheckBox; import com.fr.form.ui.CheckBoxGroup; @@ -14,6 +15,7 @@ import com.fr.form.ui.ListEditor; import com.fr.form.ui.MultiFileEditor; import com.fr.form.ui.NumberEditor; import com.fr.form.ui.Password; +import com.fr.form.ui.PictureWidget; import com.fr.form.ui.RadioGroup; import com.fr.form.ui.TextArea; import com.fr.form.ui.TextEditor; @@ -142,7 +144,7 @@ public abstract class WidgetOption implements Serializable { */ public static WidgetOption[] getFormWidgetIntance() { return new WidgetOption[]{TEXTEDITOR, LABEL, FREEBUTTON, COMBOBOX, COMBOCHECKBOX, DATEEDITOR, - NUMBEREDITOR, TREECOMBOBOX, RADIOGROUP, CHECKBOXGROUP, TEXTAREA, PASSWORD, CHECKBOX, TREE, MULTI_FILEEDITOR}; + NUMBEREDITOR, TREECOMBOBOX, RADIOGROUP, CHECKBOXGROUP, TEXTAREA, PASSWORD, CHECKBOX, TREE, MULTI_FILEEDITOR,PICTURE}; } public static final WidgetOption DATEEDITOR = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Date"), @@ -214,4 +216,7 @@ public abstract class WidgetOption implements Serializable { public static final WidgetOption IFRAMEDITOR = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Form_Iframe"), BaseUtils.readIcon("/com/fr/web/images/form/resources/iframe_16.png"), IframeEditor.class); + public static final WidgetOption PICTURE = WidgetOptionFactory.createByWidgetClass(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Image"), IconUtils.readIcon("/com/fr/web/images/form/resources/picture_widget_16.png"), + PictureWidget.class); + } diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupPaneActionProvider.java b/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupPaneActionProvider.java index 525bb5b79..be0d8e852 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupPaneActionProvider.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/HyperlinkGroupPaneActionProvider.java @@ -8,6 +8,8 @@ import com.fr.design.designer.TargetComponent; */ public interface HyperlinkGroupPaneActionProvider { + String XML_TAG = "HyperlinkGroupPane"; + /** * 刷新面板展示 * diff --git a/designer-realize/src/main/java/com/fr/design/report/SelectImagePane.java b/designer-base/src/main/java/com/fr/design/report/SelectImagePane.java similarity index 96% rename from designer-realize/src/main/java/com/fr/design/report/SelectImagePane.java rename to designer-base/src/main/java/com/fr/design/report/SelectImagePane.java index bcad15c76..7781233aa 100644 --- a/designer-realize/src/main/java/com/fr/design/report/SelectImagePane.java +++ b/designer-base/src/main/java/com/fr/design/report/SelectImagePane.java @@ -13,22 +13,24 @@ import com.fr.report.cell.Elem; import com.fr.report.cell.cellattr.CellImage; import com.fr.report.cell.painter.CellImagePainter; import com.fr.stable.Constants; - -import javax.swing.BorderFactory; -import javax.swing.ButtonGroup; -import javax.swing.JFileChooser; -import javax.swing.JPanel; -import javax.swing.JScrollPane; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; +import javax.swing.BorderFactory; +import javax.swing.ButtonGroup; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.JScrollPane; /** - * 这个类主要用于插入图片时的设置 - */ + *

这个类主要用于插入图片时的设置

+ *

这个类原本在designer-realize包下面,现在表单也可选择图片,所以应该抽为公用的base包。包名不变,应该不影响插件使用

+ * + * @author Jimmy.Zheng created on 2022/8/11 21:22 + **/ public class SelectImagePane extends BasicPane { private ImagePreviewPane previewPane = null; @@ -39,8 +41,31 @@ public class SelectImagePane extends BasicPane { private UIRadioButton adjustRadioButton = null; private Style imageStyle = null; + ActionListener layoutActionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent evt) { + setImageStyle(); + changeImageStyle(); + } + }; private File imageFile; + /** + * Select picture. + */ + ActionListener selectPictureActionListener = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent evt) { + int returnVal = imageFileChooser + .showOpenDialog(SelectImagePane.this); + if (returnVal != JFileChooser.CANCEL_OPTION) { + File selectedFile = imageFileChooser.getSelectedFile(); + imageFile = selectedFile; + ImgChooseWrapper.getInstance(previewPane, imageFileChooser, imageStyle, null).dealWithImageFile(returnVal); + } + } + }; public SelectImagePane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); @@ -102,23 +127,6 @@ public class SelectImagePane extends BasicPane { imageFileChooser.setMultiSelectionEnabled(false); } - /** - * Select picture. - */ - ActionListener selectPictureActionListener = new ActionListener() { - - @Override - public void actionPerformed(ActionEvent evt) { - int returnVal = imageFileChooser - .showOpenDialog(SelectImagePane.this); - if (returnVal != JFileChooser.CANCEL_OPTION) { - File selectedFile = imageFileChooser.getSelectedFile(); - imageFile = selectedFile; - ImgChooseWrapper.getInstance(previewPane, imageFileChooser, imageStyle, null).dealWithImageFile(returnVal); - } - } - }; - // 调整图片样式,只有水平和垂直对齐以及拉伸。相对于背景,平铺不予考虑。 private void changeImageStyle() { previewPane.setImageStyle(this.imageStyle); @@ -137,15 +145,6 @@ public class SelectImagePane extends BasicPane { } } - ActionListener layoutActionListener = new ActionListener() { - - @Override - public void actionPerformed(ActionEvent evt) { - setImageStyle(); - changeImageStyle(); - } - }; - @Override protected String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Image"); diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/picture_widget_16.png b/designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/picture_widget_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf334ad22a2e3a9985830d225959a6ea40379b0 GIT binary patch literal 1061 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 NL`TL%oDNfH{|_#1j literal 0 HcmV?d00001 diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java index 5e7807698..10a8fbfb1 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java @@ -47,6 +47,7 @@ import com.fr.form.ui.MultiFileEditor; import com.fr.form.ui.NameWidget; import com.fr.form.ui.NumberEditor; import com.fr.form.ui.Password; +import com.fr.form.ui.PictureWidget; import com.fr.form.ui.Radio; import com.fr.form.ui.RadioGroup; import com.fr.form.ui.TextArea; @@ -183,6 +184,7 @@ public class XCreatorUtils { objectMap.put(CardSwitchButton.class, XCardSwitchButton.class); objectMap.put(CardAddButton.class, XCardAddButton.class); objectMap.put(WidgetErrorMarker.class, ErrorCreator.class); + objectMap.put(PictureWidget.class, XPicture.class); } private static void reInitExtra() { diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XPicture.java b/designer-form/src/main/java/com/fr/design/designer/creator/XPicture.java new file mode 100644 index 000000000..7dd23bd4c --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XPicture.java @@ -0,0 +1,74 @@ +package com.fr.design.designer.creator; + +import com.fr.design.designer.ui.ImgPanel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.widget.editors.PictureEditor; +import com.fr.design.mainframe.widget.editors.UrlLinkEditor; +import com.fr.design.mainframe.widget.renderer.PictureRenderer; +import com.fr.design.mainframe.widget.renderer.UrlLinkRenderer; +import com.fr.form.ui.PictureWidget; +import com.fr.general.IOUtils; +import com.fr.stable.ArrayUtils; +import java.awt.Dimension; +import java.awt.Image; +import java.beans.IntrospectionException; +import javax.swing.JComponent; + +/** +* +*

图片控件的creator

+* +* @author Jimmy.Zheng created on 2022/8/11 21:16 +**/ +public class XPicture extends XWidgetCreator { + + public XPicture(PictureWidget widget, Dimension dimension) { + super(widget, dimension); + } + + @Override + protected String getIconName() { + return "picture_widget_16.png"; + } + + @Override + public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException { + return (CRPropertyDescriptor[]) ArrayUtils.addAll(super.supportedDescriptor(), new CRPropertyDescriptor[]{ + new CRPropertyDescriptor("picUrl", toData().getClass()) + .setI18NName(Toolkit.i18nText("Fine-Design_Basic_Widget_Type_Image")) + .setEditorClass(PictureEditor.class) + .setRendererClass(PictureRenderer.class) + .putKeyValue("category", "Fine-Design_Basic_Advanced"), + new CRPropertyDescriptor("urlLink", toData().getClass()) + .setI18NName(Toolkit.i18nText("Fine-Design_Basic_Hyperlink")) + .setEditorClass(UrlLinkEditor.class) + .setRendererClass(UrlLinkRenderer.class) + .putKeyValue( + "category", "Fine-Design_Basic_Advanced")}); + } + + @Override + protected JComponent initEditor() { + PictureWidget pictureWidget = (PictureWidget) this.data; + if (this.editor == null) { + this.editor = FRGUIPaneFactory.createBorderLayout_S_Pane(); + Object value = pictureWidget.getPicUrl().getValue(); + ImgPanel imgPanel = new ImgPanel(); + if (value instanceof Image) { + imgPanel.setBackgroundImage((Image) value); + imgPanel.setImageDisplayMode(pictureWidget.getShowType()); + } else { + imgPanel.setBackgroundImage(IOUtils.readImage("com/fr/design/images/form/designer/widget/picture_widget_designer_bg.png")); + imgPanel.setImageDisplayMode(0); + } + this.editor.add(imgPanel, "Center"); + } + return this.editor; + } + + @Override + public boolean canEnterIntoParaPane() { + return false; + } +} diff --git a/designer-form/src/main/java/com/fr/design/designer/ui/ImgPanel.java b/designer-form/src/main/java/com/fr/design/designer/ui/ImgPanel.java new file mode 100644 index 000000000..05aa8ba46 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/designer/ui/ImgPanel.java @@ -0,0 +1,111 @@ +package com.fr.design.designer.ui; + +import com.fr.general.ImageWithSuffix; +import java.awt.Graphics; +import java.awt.Image; +import javax.swing.JComponent; + + +/** +* +*

图片控件中的已选图片展示面板

+* +* @author Jimmy.Zheng created on 2022/8/11 21:17 +**/ +public class ImgPanel extends JComponent { + private static final long serialVersionUID = 1L; + private Image backgroundImage; + private int imageDisplayMode; + private int modeIndex; + + public ImgPanel() { + this(null, 0); + } + + public ImgPanel(Image image, int modeName) { + setBackgroundImage(image); + setImageDisplayMode(modeName); + } + + public void setBackgroundImage(Image image) { + this.backgroundImage = image; + repaint(); + } + + public Image getBackgroundImage() { + return this.backgroundImage; + } + + public void setImageDisplayMode(int modeName) { + if (modeName == 1) { + this.modeIndex = 0; + } + + if (modeName == 0) { + this.imageDisplayMode = 0; + this.modeIndex = 1; + } + + if (modeName == 2) { + this.imageDisplayMode = 2; + this.modeIndex = 2; + } + if (modeName == 4) { + this.imageDisplayMode = 4; + this.modeIndex = 3; + } + repaint(); + } + + public int getImageDisplayMode() { + return this.imageDisplayMode; + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + if (this.backgroundImage != null) { + if (this.backgroundImage instanceof ImageWithSuffix) { + this.backgroundImage = ((ImageWithSuffix) backgroundImage).getImage(); + } + int width = getWidth(); + int height = getHeight(); + int imageWidth = this.backgroundImage.getWidth(this); + int imageHeight = this.backgroundImage.getHeight(this); + + switch (this.modeIndex) { + case 0: + int x = (width - imageWidth) / 2; + int y = (height - imageHeight) / 2; + g.drawImage(this.backgroundImage, x, y, this); + break; + case 1: + for (int ix = 0; ix < width; ix += imageWidth) { + for (int iy = 0; iy < height; iy += imageHeight) { + g.drawImage(this.backgroundImage, ix, iy, this); + } + } + + break; + case 2: + g.drawImage(this.backgroundImage, 0, 0, width, height, this); + break; + case 3: + double sx = 1.0 * width / imageWidth; + double sy = 1.0 * height / imageHeight; + + if (sx > sy) { + sx = sy; + width = (int) (sx * imageWidth); + } else { + sy = sx; + height = (int) (sy * imageHeight); + } + int xx = (getWidth() - width) / 2; + int yy = (getHeight() - height) / 2; + g.drawImage(this.backgroundImage, xx, yy, width, height, this); + } + } + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessiblePictureModelEditor.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessiblePictureModelEditor.java new file mode 100644 index 000000000..9e72b5c2a --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessiblePictureModelEditor.java @@ -0,0 +1,77 @@ +package com.fr.design.mainframe.widget.accessibles; + +import com.fr.base.Style; +import com.fr.design.DesignModelAdapter; +import com.fr.design.designer.creator.XPicture; +import com.fr.design.designer.ui.ImgPanel; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.WidgetPropertyPane; +import com.fr.design.mainframe.widget.wrappers.PictureModelWrapper; +import com.fr.design.report.SelectImagePane; +import com.fr.form.ui.PictureWidget; +import com.fr.general.ComparatorUtils; +import com.fr.report.cell.FloatElement; +import com.fr.report.cell.cellattr.CellImage; +import javax.swing.JComponent; + + +/** +* +*

图片控件的图片选择、编辑器

+* +* @author Jimmy.Zheng created on 2022/8/11 21:13 +**/ +public class AccessiblePictureModelEditor extends UneditableAccessibleEditor { + protected FloatElement element = new FloatElement(); + private PictureWidget pic; + + public AccessiblePictureModelEditor(PictureWidget pic) { + super(new PictureModelWrapper()); + this.pic = pic; + } + + @Override + public FloatElement getValue() { + return (FloatElement) super.getValue(); + } + + @Override + protected void showEditorPane() { + final SelectImagePane imageEditorPane = new SelectImagePane(); + if (super.getValue() != null) { + this.element = ((FloatElement) super.getValue()); + } + this.element.setStyle(Style.getInstance().deriveImageLayout(this.pic.getShowType())); + imageEditorPane.populate(this.element); + final Object oldValue = this.element.getValue(); + final Style oldStyle = this.element.getStyle(); + final String oldname = this.element.getName(); + imageEditorPane.showWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { + @Override + public void doOk() { + CellImage cellImage = imageEditorPane.update(); + if ((!ComparatorUtils.equals(cellImage.getImage(), oldValue)) || (!ComparatorUtils.equals(cellImage.getStyle(), oldStyle))) { + AccessiblePictureModelEditor.this.element.setValue(cellImage.getImage()); + AccessiblePictureModelEditor.this.element.setStyle(cellImage.getStyle()); + AccessiblePictureModelEditor.this.element.setName(imageEditorPane.getSelectedImage() == null ? oldname : imageEditorPane.getSelectedImage().toString()); + AccessiblePictureModelEditor.this.setValue(AccessiblePictureModelEditor.this.element); + AccessiblePictureModelEditor.this.pic.setShowType(cellImage.getStyle().getImageLayout()); + AccessiblePictureModelEditor.this.pic.setPicUrl(element); + ImgPanel p = AccessiblePictureModelEditor.this.getCurrentImgPanel(); + p.setBackgroundImage(cellImage.getBufferImage()); + p.setImageDisplayMode(cellImage.getStyle().getImageLayout()); + AccessiblePictureModelEditor.this.fireStateChanged(); + DesignModelAdapter d = DesignModelAdapter.getCurrentModelAdapter(); + d.fireTargetModified(); + } + } + }).setVisible(true); + } + + private ImgPanel getCurrentImgPanel() { + XPicture xPicture = (XPicture) WidgetPropertyPane.getInstance().getEditingFormDesigner().getSelectionModel().getSelection().getSelectedCreator(); + JComponent editor = (JComponent) xPicture.getComponent(0); + return (ImgPanel) editor.getComponent(0); + } +} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleUrlLinkModelEditor.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleUrlLinkModelEditor.java new file mode 100644 index 000000000..2dd4b5499 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleUrlLinkModelEditor.java @@ -0,0 +1,57 @@ +package com.fr.design.mainframe.widget.accessibles; + +import com.fr.design.DesignModelAdapter; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.gui.frpane.HyperlinkGroupPaneActionProvider; +import com.fr.design.gui.xpane.FormHyperlinkGroupPane; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.widget.wrappers.UrlLinkModelWrapper; +import com.fr.js.NameJavaScriptGroup; +import com.fr.stable.bridge.StableFactory; + +/** + *

表单图片控件的链接编辑器

+ * @author Jimmy + */ +public class AccessibleUrlLinkModelEditor extends UneditableAccessibleEditor { + private FormHyperlinkGroupPane hyperlinkPane; + + public AccessibleUrlLinkModelEditor() { + super(new UrlLinkModelWrapper()); + } + /** + * 原插件使用 + *

DesignerContext.getDesignerFrame().getSelectedJTemplate().getHyperLinkPaneNoPop( + * HyperlinkGroupPaneActionImpl.getInstance()));

获取{@see this.hyperlinkPane} + * 合并插件依赖不到,换种方式 用{@see DesignerActivator将实例注册了} + */ + @Override + protected void showEditorPane() { + if (this.hyperlinkPane == null) { + HyperlinkGroupPaneActionProvider hyperlinkGroupPaneActionProvider = StableFactory.getMarkedInstanceObjectFromClass(HyperlinkGroupPaneActionProvider.XML_TAG,HyperlinkGroupPaneActionProvider.class); + this.hyperlinkPane = (FormHyperlinkGroupPane) DesignerContext.getDesignerFrame().getSelectedJTemplate().getHyperLinkPaneNoPop( + hyperlinkGroupPaneActionProvider); + } + BasicDialog dialog = this.hyperlinkPane.showWindow(DesignerContext.getDesignerFrame()); + dialog.addDialogActionListener(new DialogActionAdapter() { + @Override + public void doOk() { + super.doOk(); + NameJavaScriptGroup hyperlinks = AccessibleUrlLinkModelEditor.this.hyperlinkPane.updateJSGroup(); + AccessibleUrlLinkModelEditor.this.setValue(hyperlinks); + AccessibleUrlLinkModelEditor.this.fireStateChanged(); + DesignModelAdapter d = DesignModelAdapter.getCurrentModelAdapter(); + d.fireTargetModified(); + } + }); + this.hyperlinkPane.populate(getValue()); + + dialog.setVisible(true); + } + + @Override + public NameJavaScriptGroup getValue() { + return (NameJavaScriptGroup) super.getValue(); + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/editors/PictureEditor.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/editors/PictureEditor.java new file mode 100644 index 000000000..c7bbff80a --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/editors/PictureEditor.java @@ -0,0 +1,17 @@ +package com.fr.design.mainframe.widget.editors; + +import com.fr.design.mainframe.widget.accessibles.AccessiblePictureModelEditor; +import com.fr.design.mainframe.widget.accessibles.AccessiblePropertyEditor; +import com.fr.form.ui.PictureWidget; +/** +* +*

图片控件的图片选择、编辑器

+* +* @author Jimmy.Zheng created on 2022/8/11 21:15 +**/ +public class PictureEditor extends AccessiblePropertyEditor { + + public PictureEditor(Object o) { + super(new AccessiblePictureModelEditor((PictureWidget) o)); + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/editors/UrlLinkEditor.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/editors/UrlLinkEditor.java new file mode 100644 index 000000000..195e8f525 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/editors/UrlLinkEditor.java @@ -0,0 +1,17 @@ +package com.fr.design.mainframe.widget.editors; + +import com.fr.design.mainframe.widget.accessibles.AccessiblePropertyEditor; +import com.fr.design.mainframe.widget.accessibles.AccessibleUrlLinkModelEditor; + +/** +* +*

图片控件的链接编辑器

+* +* @author Jimmy.Zheng created on 2022/8/11 21:19 +**/ +public class UrlLinkEditor extends AccessiblePropertyEditor { + + public UrlLinkEditor() { + super(new AccessibleUrlLinkModelEditor()); + } +} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/renderer/PictureRenderer.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/renderer/PictureRenderer.java new file mode 100644 index 000000000..82fcc85b4 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/renderer/PictureRenderer.java @@ -0,0 +1,15 @@ +package com.fr.design.mainframe.widget.renderer; + +import com.fr.design.mainframe.widget.wrappers.PictureModelWrapper; + +/** + *

图片控件的图片编辑器的EncoderCellRenderer

+ * + * @author Jimmy.Zheng created on 2022/8/11 21:29 + **/ +public class PictureRenderer extends EncoderCellRenderer { + + public PictureRenderer() { + super(new PictureModelWrapper()); + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/renderer/UrlLinkRenderer.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/renderer/UrlLinkRenderer.java new file mode 100644 index 000000000..a81187d2d --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/renderer/UrlLinkRenderer.java @@ -0,0 +1,16 @@ +package com.fr.design.mainframe.widget.renderer; + + +import com.fr.design.mainframe.widget.wrappers.UrlLinkModelWrapper; + +/** + *

图片控件的链接编辑器的EncoderCellRenderer

+ * + * @author Jimmy.Zheng created on 2022/8/11 21:29 + **/ +public class UrlLinkRenderer extends EncoderCellRenderer { + + public UrlLinkRenderer() { + super(new UrlLinkModelWrapper()); + } +} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/wrappers/PictureModelWrapper.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/wrappers/PictureModelWrapper.java new file mode 100644 index 000000000..ed9fd0a4a --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/wrappers/PictureModelWrapper.java @@ -0,0 +1,34 @@ +package com.fr.design.mainframe.widget.wrappers; + +import com.fr.design.Exception.ValidationException; +import com.fr.design.designer.properties.Decoder; +import com.fr.design.designer.properties.Encoder; +import com.fr.report.cell.FloatElement; +import com.fr.stable.StringUtils; + +/** + *

图片选择器 {@link com.fr.design.mainframe.widget.accessibles.AccessiblePictureModelEditor}的 Wrapper

+ *

插件中直接移入,未作改动

+ * + * @author Jimmy.Zheng created on 2022/8/11 21:25 + **/ +public class PictureModelWrapper implements Encoder, Decoder { + + @Override + public FloatElement decode(String txt) { + return null; + } + + @Override + public void validate(String txt) throws ValidationException { + // do nothing + } + + @Override + public String encode(FloatElement v) { + if (v != null) { + return v.getName(); + } + return StringUtils.EMPTY; + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/wrappers/UrlLinkModelWrapper.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/wrappers/UrlLinkModelWrapper.java new file mode 100644 index 000000000..a892065ad --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/wrappers/UrlLinkModelWrapper.java @@ -0,0 +1,33 @@ +package com.fr.design.mainframe.widget.wrappers; + +import com.fr.design.Exception.ValidationException; +import com.fr.design.designer.properties.Decoder; +import com.fr.design.designer.properties.Encoder; +import com.fr.js.NameJavaScriptGroup; + +/** + *

链接选择器 {@link com.fr.design.mainframe.widget.accessibles.AccessibleUrlLinkModelEditor}的 Wrapper

+ *

插件中直接移入,未作改动

+ * + * @author Jimmy.Zheng created on 2022/8/11 21:28 + **/ +public class UrlLinkModelWrapper implements Encoder, Decoder { + + @Override + public NameJavaScriptGroup decode(String txt) { + return null; + } + + @Override + public void validate(String txt) throws ValidationException { + // do nothing + } + + @Override + public String encode(NameJavaScriptGroup v) { + if (v.size() > 0) { + return v.getNameHyperlink(0).getName(); + } + return null; + } +} \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index af32f596c..92d1fc6a4 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -41,6 +41,7 @@ import com.fr.design.form.parameter.FormParaDesigner; import com.fr.design.fun.ElementUIProvider; import com.fr.design.gui.controlpane.NameObjectCreator; import com.fr.design.gui.controlpane.NameableCreator; +import com.fr.design.gui.frpane.HyperlinkGroupPaneActionProvider; import com.fr.design.hyperlink.ReportletHyperlinkPane; import com.fr.design.hyperlink.WebHyperlinkPane; import com.fr.design.hyperlink.popup.MobilePopupPane; @@ -55,6 +56,7 @@ import com.fr.design.login.message.DesignerMessageHelper; import com.fr.design.login.socketio.LoginAuthServer; import com.fr.design.mainframe.BaseJForm; import com.fr.design.mainframe.FormHierarchyTreePane; +import com.fr.design.mainframe.HyperlinkGroupPaneActionImpl; import com.fr.design.mainframe.InformationCollector; import com.fr.design.mainframe.JTemplateEvent; import com.fr.design.mainframe.WidgetPropertyPane; @@ -143,14 +145,13 @@ import com.fr.start.common.DesignerStartupPool; import com.fr.task.Once; import com.fr.workspace.WorkContext; import com.fr.xml.ReportXMLUtils; - -import javax.swing.SwingWorker; import java.awt.Image; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; +import javax.swing.SwingWorker; /** * Created by juhaoyu on 2018/1/31. @@ -404,6 +405,7 @@ public class DesignerActivator extends Activator implements Prepare { private static void registerOtherPane() { StableFactory.registerMarkedClass(BBSGuestPaneProvider.XML_TAG, BBSGuestPane.class); + StableFactory.registerMarkedObject(HyperlinkGroupPaneActionProvider.XML_TAG, HyperlinkGroupPaneActionImpl.getInstance()); } /** diff --git a/designer-realize/src/main/java/com/fr/start/preload/ImagePreLoader.java b/designer-realize/src/main/java/com/fr/start/preload/ImagePreLoader.java index 24d23565c..aad478348 100644 --- a/designer-realize/src/main/java/com/fr/start/preload/ImagePreLoader.java +++ b/designer-realize/src/main/java/com/fr/start/preload/ImagePreLoader.java @@ -242,6 +242,7 @@ public class ImagePreLoader { "com/fr/design/images/buttonicon/widget/label_16_normal.svg", "com/fr/web/images/form/resources/button_16.png", "com/fr/design/images/buttonicon/widget/button_16.png", + "com/fr/web/images/form/resources/picture_widget_16.png", "com/fr/design/images/buttonicon/widget/button_16_normal.svg", "com/fr/design/images/buttonicon/widget/files_up.png", "com/fr/design/images/buttonicon/widget/files_up_normal.svg",