diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java index 5e8199d95..683b38e01 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -8,7 +8,7 @@ import com.fr.design.border.UITitledBorder; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.ipasswordfield.UIPassWordField; +import com.fr.design.gui.ipasswordfield.UIPasswordFieldWithFixedLength; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.layout.FRGUIPaneFactory; @@ -24,8 +24,18 @@ import com.fr.general.ComparatorUtils; import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; @@ -108,7 +118,7 @@ public class JDBCDefPane extends JPanel { urlTextField = new UITextField(15); userNameTextField = new UITextField(15); userNameTextField.setName(USER_NAME); - passwordTextField = new UIPassWordField(15); + passwordTextField = new UIPasswordFieldWithFixedLength(15); dbtypeButton = new UIButton("."); dbtypeButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Click_Get_Default_URL")); dbtypeButton.addActionListener(dbtypeButtonActionListener); diff --git a/designer-base/src/main/java/com/fr/design/gui/ipasswordfield/UIPasswordFieldWithFixedLength.java b/designer-base/src/main/java/com/fr/design/gui/ipasswordfield/UIPasswordFieldWithFixedLength.java new file mode 100644 index 000000000..c1cb98ca3 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ipasswordfield/UIPasswordFieldWithFixedLength.java @@ -0,0 +1,106 @@ +package com.fr.design.gui.ipasswordfield; + +import com.fr.stable.StringUtils; +import org.jetbrains.annotations.NotNull; + +import javax.swing.text.Document; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * @author Yvan + * @version 10.0 + * Created by Yvan on 2020-08-11 + * 有固定长度的"*"回显的密码框,避免泄露密码长度 + */ +public class UIPasswordFieldWithFixedLength extends UIPassWordField { + /** + * 展示密码,为固定8位长度的特殊字符"*"组成 + */ + private static final String DISPLAY_PASSWORD = "********"; + + /** + * 实际密码 + */ + private String realPassword; + + /** + * 用于判断是否清空密码 + */ + private boolean clearPassword; + + public UIPasswordFieldWithFixedLength() { + this(null, null, 0); + } + + public UIPasswordFieldWithFixedLength(String text) { + this(null, text, 0); + } + + public UIPasswordFieldWithFixedLength(int columns) { + this(null, null, columns); + } + + public UIPasswordFieldWithFixedLength(String text, int columns) { + this(null, text, columns); + } + + public UIPasswordFieldWithFixedLength(Document doc, String txt, int columns) { + super(doc, txt, columns); + initRealPassword(txt); + } + + /** + * 为realPassword赋初值并添加一个鼠标单击事件 + */ + public void initRealPassword(String text) { + this.realPassword = text == null ? StringUtils.EMPTY : text; + this.clearPassword = true; + addShowFixedLengthPasswordListener(); + } + + /** + * 当鼠标点击密码框,第一次做出键入动作时,清空显示密码与实际密码,用户需要重新输入密码 + */ + private void addShowFixedLengthPasswordListener() { + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + UIPasswordFieldWithFixedLength.this.clearPassword = true; + } + }); + this.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (clearPassword) { + UIPasswordFieldWithFixedLength.this.setText(StringUtils.EMPTY); + UIPasswordFieldWithFixedLength.this.clearPassword = false; + UIPasswordFieldWithFixedLength.this.updateUI(); + } + } + }); + } + + @Override + public void setText(@NotNull String t) { + this.realPassword = t; + // 看到代码中有些场景是将密码置为空字符串的,所以在这里加个判断 + if (StringUtils.isEmpty(t)) { + super.setText(t); + } else { + super.setText(DISPLAY_PASSWORD); + } + } + + @Override + public char[] getPassword() { + //如果用户刚清空密码框,并输入了新密码,则返回输入内容,否则返回realPassword + String text = new String(super.getPassword()); + if (!StringUtils.isEmpty(text) && StringUtils.isEmpty(realPassword)) { + return text.toCharArray(); + } + return realPassword.toCharArray(); + } +} diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java index bc32385b7..54cfddc8d 100644 --- a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java +++ b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java @@ -13,6 +13,7 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ipasswordfield.UIPassWordField; +import com.fr.design.gui.ipasswordfield.UIPasswordFieldWithFixedLength; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; @@ -26,7 +27,17 @@ import com.fr.workspace.WorkContext; import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.engine.exception.WorkspaceAuthException; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.JTextPane; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; +import javax.swing.ToolTipManager; +import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @@ -96,7 +107,7 @@ public class RemoteEnvPane extends BasicBeanPane { /** * 密码 */ - private UIPassWordField passwordInput = new UIPassWordField(); + private UIPassWordField passwordInput = new UIPasswordFieldWithFixedLength(); /** * 是否记住密码 */ @@ -108,7 +119,7 @@ public class RemoteEnvPane extends BasicBeanPane { /** * https密钥 */ - private UIPassWordField certSecretKeyInput = new UIPassWordField(); + private UIPassWordField certSecretKeyInput = new UIPasswordFieldWithFixedLength(); /** * 选择证书文件按钮 */ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ja_JP.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ja_JP.png new file mode 100644 index 000000000..3a22b64a6 Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ja_JP.png differ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ko_KR.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ko_KR.png new file mode 100644 index 000000000..3041f446b Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ko_KR.png differ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_zh.png similarity index 100% rename from designer-base/src/main/resources/com/fr/design/images/reportcolumns/col.png rename to designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_zh.png diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_zh_TW.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_zh_TW.png new file mode 100644 index 000000000..1ce2bb297 Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_zh_TW.png differ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ja_JP.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ja_JP.png new file mode 100644 index 000000000..83480d429 Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ja_JP.png differ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ko_KR.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ko_KR.png new file mode 100644 index 000000000..e10509a1f Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ko_KR.png differ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_zh.png similarity index 100% rename from designer-base/src/main/resources/com/fr/design/images/reportcolumns/row.png rename to designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_zh.png diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_zh_TW.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_zh_TW.png new file mode 100644 index 000000000..935d1059d Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_zh_TW.png differ diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java index b7974fb6e..589028ae5 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java @@ -63,6 +63,8 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent private AutoProgressBar connectionBar; private SwingWorker worker; + private static final String MESSAGE = Toolkit.i18nText("Fine-Design_Chart_Auto_No_Match"); + public AutoChartTypePane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); initButtonGroup(); @@ -226,6 +228,9 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent chartResultModel.addElement(autoChartIcon); } chartViewList.setSelectedIndex(0); + } else { + FineJOptionPane.showMessageDialog(AutoChartTypePane.this, MESSAGE, + Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.INFORMATION_MESSAGE, UIManager.getIcon("OptionPane.informationIcon")); } } catch (Exception e) { if (!(e instanceof CancellationException)) { diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java index c30679e0e..c504a5064 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java @@ -102,22 +102,22 @@ public class AutoTypeCalculate { } private static boolean isNumberData(List values) { - for (String value : values) { - if (!isNumberData(value)) { - return false; + for (Pattern pattern : dataPatterns) { + if (isNumberData(values, pattern)) { + return true; } } - return true; + return false; } - private static boolean isNumberData(String value) { - for (Pattern pattern : dataPatterns) { + private static boolean isNumberData(List values, Pattern pattern) { + for (String value : values) { Matcher matcher = pattern.matcher(value); - if (matcher.matches()) { - return true; + if (!matcher.matches()) { + return false; } } - return false; + return true; } private static List calculateField(String tableName, List columns) { diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/AddingModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/AddingModel.java index 637279bf2..c0b6cd400 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/AddingModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/AddingModel.java @@ -133,13 +133,13 @@ public class AddingModel { Rectangle rect = ComponentUtils.getRelativeBounds(container); if (!ComparatorUtils.equals(container.getOuterLayout(), container.getBackupParent())) { added = container.getLayoutAdapter().addBean(creator, - x + designer.getArea().getHorizontalValue(), - y + designer.getArea().getVerticalValue()); + x + designer.getHorizontalScaleValue(), + y + designer.getVerticalScaleValue() ); return added; } added = container.getLayoutAdapter().addBean(creator, - x + designer.getArea().getHorizontalValue() - rect.x, - y + designer.getArea().getVerticalValue() - rect.y); + x + designer.getHorizontalScaleValue() - rect.x, + y + designer.getVerticalScaleValue() - rect.y); return added; } } diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java index 1e7badb8a..c5150baa5 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java @@ -300,6 +300,13 @@ public class StateModel { int y = getMouseXY(e).y; Rectangle bounds = createCurrentBounds(x, y); + // 有参数面板时 要考虑下参数面板的高度影响 + int yOffset = 0; + XLayoutContainer paramComponent = designer.getParaComponent(); + if (paramComponent != null) { + yOffset = paramComponent.getHeight(); + } + bounds.y = Math.max(bounds.y - yOffset, 0); if ((x != currentX) || (y != currentY)) { ArrayList creators = getHotspotCreators(bounds, designer.getRootComponent()); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java index 6909207c3..7718e266f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java @@ -86,7 +86,6 @@ public class XCardAddButton extends XButton { @Override public void respondClick(EditingMouseListener editingMouseListener, MouseEvent e){ FormDesigner designer = editingMouseListener.getDesigner(); - designer.fireTargetModified(); // addbutton对应的XWCardLayout和XWCardTagLayout暂未存入到xml中,重新打开之后先根据父子层获取 if(cardLayout == null && tagLayout ==null ){ @@ -112,6 +111,8 @@ public class XCardAddButton extends XButton { showNewTab(editingMouseListener,index); tagLayout.setTabsAndAdjust(); LayoutUtils.layoutRootContainer(designer.getRootComponent()); + + designer.fireTargetModified(); } @Override diff --git a/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java b/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java index 3754e5109..183c0b08c 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java @@ -11,7 +11,13 @@ import com.fr.design.designer.beans.location.Direction; import com.fr.design.designer.beans.location.Location; import com.fr.design.designer.beans.models.SelectionModel; import com.fr.design.designer.beans.models.StateModel; -import com.fr.design.designer.creator.*; +import com.fr.design.designer.creator.XChartEditor; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XCreatorUtils; +import com.fr.design.designer.creator.XEditorHolder; +import com.fr.design.designer.creator.XElementCase; +import com.fr.design.designer.creator.XLayoutContainer; +import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.creator.cardlayout.XCardSwitchButton; import com.fr.design.designer.creator.cardlayout.XWCardLayout; import com.fr.design.form.util.XCreatorConstants; @@ -22,14 +28,20 @@ import com.fr.design.icon.IconPathConstants; import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.LayoutUtils; - import com.fr.share.ShareConstants; import com.fr.stable.Constants; - import com.fr.stable.StringUtils; -import javax.swing.*; + +import javax.swing.BorderFactory; +import javax.swing.JComponent; +import javax.swing.JPopupMenu; +import javax.swing.JWindow; +import javax.swing.SwingUtilities; import javax.swing.event.MouseInputAdapter; -import java.awt.*; +import java.awt.Color; +import java.awt.Container; +import java.awt.Cursor; +import java.awt.Rectangle; import java.awt.event.MouseEvent; /** @@ -165,10 +177,13 @@ public class EditingMouseListener extends MouseInputAdapter { if (designer.isDrawLineMode()) { designer.updateDrawLineMode(e); } else { + int relativeX = Math.max(0, designer.getRelativeX(e.getX())); + int relativeY = Math.max(0, designer.getRelativeY(e.getY())); + if (selectionModel.hasSelectionComponent() && selectionModel.getSelection().getRelativeBounds().contains( - designer.getArea().getHorizontalValue() + e.getX(), - designer.getArea().getVerticalValue() + e.getY())) { + designer.getHorizontalScaleValue() + relativeX, + designer.getVerticalScaleValue() + relativeY)) { lastPressEvent = e; lastXCreator = selectionModel.getSelection().getSelectedCreator(); } else { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java index 68ea5c2b8..26547229b 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java @@ -409,8 +409,8 @@ public class FormDesignerUI extends ComponentUI { clipg = g.create( -designer.getHorizontalScaleValue(), -designer.getVerticalScaleValue() + designer.getParaHeight(), - (int) ((parent.getSize().width + designer.getArea().getHorizontalValue()) / designer.getScale()), - (int) ((parent.getSize().height + designer.getArea().getVerticalValue()) / designer.getScale())); + parent.getSize().width + designer.getHorizontalScaleValue(), + parent.getSize().height + designer.getVerticalScaleValue()); designer.paintContent(clipg); paintWatermark((Graphics2D) clipg); @@ -435,8 +435,8 @@ public class FormDesignerUI extends ComponentUI { Graphics clipg1; clipg1 = g.create(-designer.getHorizontalScaleValue(), -designer.getVerticalScaleValue(), - (int) ((parent.getSize().width + designer.getArea().getHorizontalValue()) / designer.getScale()), - (int) ((designer.getParaHeight() + designer.getArea().getVerticalValue()) / designer.getScale())); + parent.getSize().width + designer.getHorizontalScaleValue(), + designer.getParaHeight() + designer.getVerticalScaleValue()); designer.paintPara(clipg1); clipg1.dispose();