Browse Source

Merge branch 'release/10.0' of ssh://cloud.finedevelop.com:7999/~lanlan/design into release/10.0

feature/big-screen
Lanlan 4 years ago
parent
commit
163a09c001
  1. 5
      designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
  2. 5
      designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
  3. 53
      designer-base/src/main/java/com/fr/design/base/clipboard/ClipboardFilter.java
  4. 68
      designer-base/src/main/java/com/fr/design/base/clipboard/DesignerClipboard.java
  5. 34
      designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java
  6. 11
      designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java
  7. 5
      designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java
  8. 45
      designer-base/src/main/java/com/fr/design/fun/ClipboardHandlerProvider.java
  9. 7
      designer-base/src/main/java/com/fr/design/fun/FormAdaptiveConfigUIProcessor.java
  10. 17
      designer-base/src/main/java/com/fr/design/fun/impl/AbstractClipboardHandlerProvider.java
  11. 83
      designer-base/src/main/java/com/fr/design/mainframe/DesignerContext.java
  12. 17
      designer-base/src/main/java/com/fr/design/mainframe/burying/point/AbstractPointCollector.java
  13. 17
      designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java
  14. 2
      designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java
  15. 318
      designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java
  16. 9
      designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBarUI.java
  17. 101
      designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java
  18. 99
      designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleFontConfigPane.java
  19. 20
      designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfoCollector.java
  20. 4
      designer-base/src/main/java/com/fr/design/utils/DesignUtils.java
  21. 5
      designer-base/src/main/java/com/fr/design/utils/DesignerPort.java
  22. 13
      designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java
  23. 62
      designer-base/src/test/java/com/fr/design/base/clipboard/ClipboardFilterTest.java
  24. 75
      designer-base/src/test/java/com/fr/design/base/clipboard/DesignerClipboardTest.java
  25. 29
      designer-base/src/test/java/com/fr/design/base/clipboard/TestClipboardHandlerProvider.java
  26. 19
      designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java
  27. 13
      designer-form/src/main/java/com/fr/design/designer/beans/events/CreatorEventListenerTable.java
  28. 32
      designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java
  29. 30
      designer-form/src/main/java/com/fr/design/designer/creator/XButton.java
  30. 5
      designer-form/src/main/java/com/fr/design/designer/creator/XLabel.java
  31. 4
      designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java
  32. 4
      designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java
  33. 46
      designer-form/src/main/java/com/fr/design/form/util/FontTransformUtil.java
  34. 22
      designer-form/src/main/java/com/fr/design/fun/DesignerEditListenerProvider.java
  35. 17
      designer-form/src/main/java/com/fr/design/fun/impl/AbstractDesignerEditListenerProvider.java
  36. 2
      designer-form/src/main/java/com/fr/design/mainframe/CoverReportPane.java
  37. 2
      designer-form/src/main/java/com/fr/design/mainframe/FormArea.java
  38. 36
      designer-form/src/main/java/com/fr/design/mainframe/template/info/ComponentOperate.java
  39. 36
      designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java
  40. 102
      designer-form/src/test/java/com/fr/design/designer/beans/models/SelectionModelTest.java
  41. 68
      designer-form/src/test/java/com/fr/design/form/util/FontTransformUtilTest.java
  42. 52
      designer-form/src/test/java/com/fr/design/mainframe/template/info/ComponentCreateOperateTest.java
  43. 30
      designer-form/src/test/java/com/fr/design/mainframe/template/info/JFormProcessInfoTest.java
  44. 180
      designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java
  45. 10
      designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java
  46. 7
      designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java
  47. 15
      designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCasePaneDelegate.java
  48. 13
      designer-realize/src/main/java/com/fr/design/mainframe/template/info/JWorkBookProcessInfo.java
  49. 3
      designer-realize/src/main/java/com/fr/design/report/RichTextPane.java
  50. 5
      designer-realize/src/main/java/com/fr/start/LifecycleFatalErrorHandler.java

5
designer-base/src/main/java/com/fr/design/DesignerEnvManager.java

@ -58,6 +58,7 @@ import javax.swing.SwingWorker.StateValue;
import java.awt.Color;
import java.awt.Rectangle;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
@ -206,9 +207,11 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
GeneralContext.setLocale(designerEnvManager.getLanguage());
try {
XMLTools.readFileXML(designerEnvManager, designerEnvManager.getDesignerEnvFile());
} catch (Exception e) {
} catch (FileNotFoundException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
XmlHandler.Self.handle(e);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
// james:如果没有env定义,要设置一个默认的

5
designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java

@ -415,10 +415,7 @@ public class EnvChangeEntrance {
@Override
public void doOk() {
ProcessEventPipe pipe = FineProcessContext.getParentPipe();
if (FineProcessContext.getParentPipe() != null) {
pipe.fire(new CarryMessageEvent(ReportState.ACTIVE.getValue()));
}
FineProcessContext.getParentPipe().fire(new CarryMessageEvent(ReportState.ACTIVE.getValue()));
if (!envListOkAction(envListPane, PopTipStrategy.NOW)) {
DesignerExiter.getInstance().execute();
}

53
designer-base/src/main/java/com/fr/design/base/clipboard/ClipboardFilter.java

@ -0,0 +1,53 @@
package com.fr.design.base.clipboard;
import com.fr.design.fun.ClipboardHandlerProvider;
import com.fr.form.main.ExtraFormClassManager;
import com.fr.plugin.injectable.PluginModule;
import java.util.Set;
/**
* created by Harrison on 2020/05/14
**/
@SuppressWarnings({"rawtypes", "unchecked"})
public abstract class ClipboardFilter {
public static <T> T cut(T selection) {
Class<?> clazz = selection.getClass();
ExtraFormClassManager manager = PluginModule.getAgent(PluginModule.ExtraForm);
Set<ClipboardHandlerProvider> providers = manager.getArray(ClipboardHandlerProvider.XML_TAG);
for (ClipboardHandlerProvider provider : providers) {
if (provider.support(clazz)) {
selection = ((ClipboardHandlerProvider<T>) provider).cut(selection);
}
}
return selection;
}
public static <T> T copy(T selection) {
Class<?> clazz = selection.getClass();
ExtraFormClassManager manager = PluginModule.getAgent(PluginModule.ExtraForm);
Set<ClipboardHandlerProvider> providers = manager.getArray(ClipboardHandlerProvider.XML_TAG);
for (ClipboardHandlerProvider provider : providers) {
if (provider.support(clazz)) {
selection = ((ClipboardHandlerProvider<T>) provider).copy(selection);
}
}
return selection;
}
public static <T> T paste(T selection) {
Class<?> clazz = selection.getClass();
ExtraFormClassManager manager = PluginModule.getAgent(PluginModule.ExtraForm);
Set<ClipboardHandlerProvider> providers = manager.getArray(ClipboardHandlerProvider.XML_TAG);
for (ClipboardHandlerProvider provider : providers) {
if (provider.support(clazz)) {
selection = ((ClipboardHandlerProvider<T>) provider).paste(selection);
}
}
return selection;
}
}

68
designer-base/src/main/java/com/fr/design/base/clipboard/DesignerClipboard.java

@ -0,0 +1,68 @@
package com.fr.design.base.clipboard;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.FlavorListener;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
/**
* created by Harrison on 2020/05/11
**/
public class DesignerClipboard extends Clipboard {
private Clipboard clipboard;
public DesignerClipboard(Clipboard clipboard) {
super(clipboard.getName());
this.clipboard = clipboard;
}
@Override
public synchronized void setContents(Transferable contents, ClipboardOwner owner) {
//处理 contents/owner
Transferable filtered = ClipboardFilter.copy(contents);
clipboard.setContents(filtered, owner);
}
@Override
public synchronized Transferable getContents(Object requestor) {
Transferable contents = clipboard.getContents(requestor);
//处理 contents
Transferable filtered = ClipboardFilter.paste(contents);
return filtered;
}
@Override
public DataFlavor[] getAvailableDataFlavors() {
return clipboard.getAvailableDataFlavors();
}
@Override
public boolean isDataFlavorAvailable(DataFlavor flavor) {
return clipboard.isDataFlavorAvailable(flavor);
}
@Override
public Object getData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
return clipboard.getData(flavor);
}
@Override
public synchronized void addFlavorListener(FlavorListener listener) {
clipboard.addFlavorListener(listener);
}
@Override
public synchronized void removeFlavorListener(FlavorListener listener) {
clipboard.removeFlavorListener(listener);
}
@Override
public synchronized FlavorListener[] getFlavorListeners() {
return clipboard.getFlavorListeners();
}
}

34
designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java

@ -1,12 +1,10 @@
package com.fr.design.data.datapane;
import com.fr.base.BaseUtils;
import com.fr.base.TableData;
import com.fr.data.core.DataCoreUtils;
import com.fr.data.core.db.DBUtils;
import com.fr.data.core.db.TableProcedure;
import com.fr.data.core.db.dialect.DialectFactory;
import com.fr.data.impl.Connection;
import com.fr.data.impl.DBTableData;
import com.fr.data.operator.DataOperator;
import com.fr.design.DesignerEnvManager;
@ -37,6 +35,7 @@ import com.fr.general.IOUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.connection.DBConnectAuth;
import javax.swing.JList;
import javax.swing.JOptionPane;
@ -61,9 +60,10 @@ import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author zhou
@ -210,10 +210,7 @@ public class ChoosePane extends BasicBeanPane<DataBaseItems> implements Refresha
@SuppressWarnings("unchecked")
protected void initDsNameComboBox() {
dsNameComboBox.setRefreshingModel(true);
ConnectionConfig connectionConfig = ConnectionConfig.getInstance();
List<String> dsList = new ArrayList<>();
dsList.addAll(connectionConfig.getConnections().keySet());
FilterableComboBoxModel dsNameComboBoxModel = new FilterableComboBoxModel(dsList);
FilterableComboBoxModel dsNameComboBoxModel = new FilterableComboBoxModel(getHasAuthConnections());
dsNameComboBox.setModel(dsNameComboBoxModel);
dsNameComboBox.setRefreshingModel(false);
}
@ -322,14 +319,31 @@ public class ChoosePane extends BasicBeanPane<DataBaseItems> implements Refresha
return null; // peter:选中了当前的零长度的节点,直接返回.
}
ConnectionConfig connectionConfig = ConnectionConfig.getInstance();
for (Map.Entry<String, Connection> entry : connectionConfig.getConnections().entrySet()) {
if (ComparatorUtils.equals(selectedDSName, entry.getKey())) {
return entry.getValue();
List<String> authConnections = getHasAuthConnections();
for (String name : authConnections) {
if (ComparatorUtils.equals(selectedDSName, name)) {
return connectionConfig.getConnection(name);
}
}
return null;
}
private List<String> getHasAuthConnections() {
List<String> authConnections = new ArrayList<>();
Set<String> allConnections = ConnectionConfig.getInstance().getConnections().keySet();
Collection<String> noAuthConnections = WorkContext.getCurrent().get(DBConnectAuth.class).getNoAuthConnections();
if (noAuthConnections == null) {
return authConnections;
}
for (String name : allConnections) {
if (!noAuthConnections.contains(name)) {
authConnections.add(name);
}
}
return authConnections;
}
/**
* 刷新没多大用而且要刷新也不是这儿刷新
*/

11
designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java

@ -2,6 +2,7 @@ package com.fr.design.data.datapane;
import com.fr.data.TableDataSource;
import com.fr.data.impl.RecursionTableData;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.tabledata.wrapper.ServerTableDataWrapper;
import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper;
@ -70,8 +71,14 @@ public class TreeTableDataComboBox extends UIComboBox {
}
public void setSelectedTableDataByName(String name) {
TableDataWrapper tableDataWrappe = res_map.get(name);
this.getModel().setSelectedItem(tableDataWrappe);
TableDataWrapper tableDataWrapper;
if (res_map.get(name) != null) {
tableDataWrapper = res_map.get(name);
} else {
String changeName = DesignTableDataManager.getChangedDsNameByOldDsName(name);
tableDataWrapper = res_map.get(changeName);
}
this.getModel().setSelectedItem(tableDataWrapper);
}
@Override

5
designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceGenerator.java vendored

@ -72,10 +72,7 @@ public class DesignerWorkspaceGenerator {
enum RemoteHandler {
SELF;
public static void handle(DesignerWorkspaceInfo config) {
ProcessEventPipe eventPipe = FineProcessContext.getParentPipe();
if (eventPipe != null) {
eventPipe.fire(new CarryMessageEvent(ReportState.STOP.getValue()));
}
FineProcessContext.getParentPipe().fire(new CarryMessageEvent(ReportState.STOP.getValue()));
StartErrorMessageCollector.getInstance().record(DesignerErrorMessage.REMOTE_DESIGN_NO_RESPONSE.getId(),
DesignerErrorMessage.REMOTE_DESIGN_NO_RESPONSE.getMessage(),
StringUtils.EMPTY);

45
designer-base/src/main/java/com/fr/design/fun/ClipboardHandlerProvider.java

@ -0,0 +1,45 @@
package com.fr.design.fun;
import com.fr.stable.fun.mark.Mutable;
/**
* created by Harrison on 2020/05/14
**/
public interface ClipboardHandlerProvider<T> extends Mutable {
String XML_TAG = "ClipboardHandlerProvider";
int CURRENT_LEVEL = 1;
/**
* 剪切
*
* @param selection 选中
* @return 处理后的内容
*/
T cut(T selection);
/**
* 复制
*
* @param selection 选中
* @return 处理后的内容
*/
T copy(T selection);
/**
* 粘贴
*
* @param selection 选中
* @return 处理后的内容
*/
T paste(T selection);
/**
* 支持的类型
*
* @param selection 内容
* @return 是否
*/
boolean support(Object selection);
}

7
designer-base/src/main/java/com/fr/design/fun/FormAdaptiveConfigUIProcessor.java

@ -32,5 +32,12 @@ public interface FormAdaptiveConfigUIProcessor extends Immutable {
*/
BufferedImage paintFormElementCaseImage(Dimension size, JComponent elementCasePane);
/**
* 获取新自适应下字体显示的dpi
* @return dpi
*/
int fontResolution();
}

17
designer-base/src/main/java/com/fr/design/fun/impl/AbstractClipboardHandlerProvider.java

@ -0,0 +1,17 @@
package com.fr.design.fun.impl;
import com.fr.design.fun.ClipboardHandlerProvider;
import com.fr.stable.fun.impl.AbstractProvider;
import com.fr.stable.fun.mark.API;
/**
* created by Harrison on 2020/05/14
**/
@API(level = ClipboardHandlerProvider.CURRENT_LEVEL)
public abstract class AbstractClipboardHandlerProvider<T> extends AbstractProvider implements ClipboardHandlerProvider<T> {
@Override
public int currentAPILevel() {
return ClipboardHandlerProvider.CURRENT_LEVEL;
}
}

83
designer-base/src/main/java/com/fr/design/mainframe/DesignerContext.java

@ -4,6 +4,7 @@
package com.fr.design.mainframe;
import com.fr.base.Style;
import com.fr.design.base.clipboard.DesignerClipboard;
import com.fr.design.designer.TargetComponent;
import com.fr.design.dialog.BasicDialog;
import com.fr.log.FineLoggerFactory;
@ -56,41 +57,53 @@ public class DesignerContext {
public static DesignerBean getDesignerBean(String name) {
return beans.get(name) == null ? DesignerBean.NULL : beans.get(name);
}
public static void setDesignerBean(String name, DesignerBean bean) {
beans.put(name, bean);
}
/**
* Gets the Clipboard.
*/
public static Clipboard getClipboard(JComponent comp) {
if (DesignerContext.clipboard == null) {
try {
Action transferAction = TransferHandler.getCutAction();
Method clipMethod = StableUtils.getDeclaredMethod(transferAction.getClass(), "getClipboard", new Class[]{JComponent.class});
clipMethod.setAccessible(true);
return (Clipboard) clipMethod.invoke(transferAction, new Object[]{comp});
} catch (Exception securityException) {
FineLoggerFactory.getLogger().error(securityException.getMessage(), securityException);
//用反射机制,获得TransferHandler的getClipboard
//这样可以保证和TextField直接的copy paste
try {
//控件的Clipboard.
DesignerContext.clipboard = comp.getToolkit().getSystemClipboard();
} catch (Exception exp) {
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
DesignerContext.clipboard = new Clipboard("FR");
}
}
}
return DesignerContext.clipboard;
}
public static void setFormatState(int setformatState) {
public static void setDesignerBean(String name, DesignerBean bean) {
beans.put(name, bean);
}
/**
* get this custom clipboard
*/
public static Clipboard getClipboard(JComponent comp) {
if (DesignerContext.clipboard == null) {
Clipboard clipboard = getClipboard0(comp);
return new DesignerClipboard(clipboard);
}
return DesignerContext.clipboard;
}
/**
* Gets the system Clipboard.
*/
private static Clipboard getClipboard0(JComponent comp) {
Clipboard clipboard = null;
try {
Action transferAction = TransferHandler.getCutAction();
Method clipMethod = StableUtils.getDeclaredMethod(transferAction.getClass(), "getClipboard", new Class[]{JComponent.class});
clipMethod.setAccessible(true);
return (Clipboard) clipMethod.invoke(transferAction, new Object[]{comp});
} catch (Exception securityException) {
FineLoggerFactory.getLogger().error(securityException.getMessage(), securityException);
//用反射机制,获得TransferHandler的getClipboard
//这样可以保证和TextField直接的copy paste
try {
//控件的Clipboard.
clipboard = comp.getToolkit().getSystemClipboard();
} catch (Exception exp) {
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
clipboard = new Clipboard("FR");
}
}
return clipboard;
}
public static void setFormatState(int setformatState) {
formatState = setformatState;
}

17
designer-base/src/main/java/com/fr/design/mainframe/burying/point/AbstractPointCollector.java

@ -5,6 +5,8 @@ import com.fr.base.io.XMLReadHelper;
import com.fr.design.DesignerEnvManager;
import com.fr.design.mainframe.template.info.SendHelper;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ProductConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLTools;
import com.fr.stable.xml.XMLableReader;
@ -121,10 +123,23 @@ public abstract class AbstractPointCollector<T extends AbstractPointInfo> implem
}
}
private File getInfoFile() {
File file = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), getInfoFilePath()));
try {
if (!file.exists()) {
StableUtils.makesureFileExist(file);
}
} catch (Exception ex) {
FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
}
return file;
}
/**
* 获取缓存文件存放路径
*/
protected abstract File getInfoFile();
protected abstract String getInfoFilePath();
protected abstract void addIdleDayCount();
}

17
designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java

@ -8,15 +8,10 @@ import com.fr.design.mainframe.burying.point.AbstractPointCollector;
import com.fr.design.mainframe.template.info.TemplateInfo;
import com.fr.design.mainframe.template.info.TemplateProcessInfo;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ProductConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
import com.fr.third.joda.time.DateTime;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
@ -235,16 +230,8 @@ public class ChartInfoCollector extends AbstractPointCollector<ChartInfo> {
* 获取缓存文件存放路径
*/
@Override
protected File getInfoFile() {
File file = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), XML_FILE_NAME));
try {
if (!file.exists()) {
file.createNewFile();
}
} catch (Exception ex) {
FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
}
return file;
protected String getInfoFilePath() {
return XML_FILE_NAME;
}
@Override

2
designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java

@ -45,7 +45,7 @@ public class DesignerLogHandler {
private final SimpleDateFormat LOG_SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static final int GAP_X = -150;
private static final int GAP_X = -75;
private static final int INFO_GAP_Y = -60;

318
designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java

@ -2,183 +2,161 @@ package com.fr.design.mainframe.loghandler;
import com.fr.base.BaseUtils;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.ui.util.UIUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.concurrent.atomic.AtomicBoolean;
public class LogHandlerBar extends JPanel implements ItemSelectable {
private static final long serialVersionUID = 1L;
private ItemListener listeners;
private UIButton clear;
private UIButton selectedall;
private UIButton set;
private String text;
private int INFONUM = 0;
private int ERRORNUM = 0;
private int SERVERNUM = 0;
private boolean isWithSerious;
public LogHandlerBar() {
this(null);
}
public LogHandlerBar(String text) {
this.setLayout(new CaptionLayout());
this.setUI(new LogHandlerBarUI());
this.text = text;
clear = new UIButton(BaseUtils.readIcon("com/fr/design/images/log/clear.png"));
clear.setMargin(null);
clear.setOpaque(false);
clear.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
clear.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Clear_All"));
selectedall = new UIButton(BaseUtils.readIcon("com/fr/design/images/log/selectedall.png"));
selectedall.setMargin(null);
selectedall.setOpaque(false);
selectedall.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
selectedall.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select_All"));
set = new UIButton(BaseUtils.readIcon("com/fr/design/images/log/setting.png"));
set.setMargin(null);
set.setOpaque(false);
set.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
set.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"));
this.add(clear);
this.add(selectedall);
this.add(set);
}
public void clearMessage() {
INFONUM = ERRORNUM = SERVERNUM = 0;
repaint();
}
public boolean IsWithSerious() {
return isWithSerious;
}
public void setWithSerious(boolean b) {
this.isWithSerious = b;
}
public void infoAdd() {
INFONUM++;
repaint();
}
public void errorAdd() {
ERRORNUM++;
timerPaint();
}
public void serverAdd() {
SERVERNUM++;
timerPaint();
}
private AtomicBoolean painting = new AtomicBoolean(false);
public void timerPaint() {
if(!painting.get()) {
painting.set(true);
repaint();
painting.set(false);
}
}
public int getInfo() {
return INFONUM;
}
public int getError() {
return ERRORNUM;
}
public int getServer() {
return SERVERNUM;
}
public void addItemListener(ItemListener l) {
listeners = l;
}
public void removeItemListener(ItemListener l) {
listeners = null;
}
protected void fireItemStateChanged(ItemEvent e) {
listeners.itemStateChanged(e);
}
public Object[] getSelectedObjects() {
return new Object[] { text };
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
repaint();
}
public void addClearListener(ActionListener l) {
clear.addActionListener(l);
}
public void addSelectedListener(ActionListener l) {
selectedall.addActionListener(l);
}
public void addSetListener(ActionListener l) {
set.addActionListener(l);
}
private class CaptionLayout implements LayoutManager {
@Override
public void addLayoutComponent(String name, Component comp) {
}
@Override
public void removeLayoutComponent(Component comp) {
}
@Override
public Dimension preferredLayoutSize(Container parent) {
return new Dimension(120, 24);
}
import static com.fr.design.i18n.Toolkit.i18nText;
@Override
public Dimension minimumLayoutSize(Container parent) {
return new Dimension(0, 0);
}
@Override
public void layoutContainer(Container target) {
Insets insets = target.getInsets();
int top = insets.top;
int right = target.getWidth() - insets.right;
clear.setBounds(right - CLEAR_OFFSET, top + TOP_OFFSET, clear.getPreferredSize().width, clear.getPreferredSize().height);
selectedall.setBounds(right - SELECT_OFFSET, top + TOP_OFFSET, selectedall.getPreferredSize().width, selectedall.getPreferredSize().height);
set.setBounds(right - SET_OFFSET, top + TOP_OFFSET, set.getPreferredSize().width, set.getPreferredSize().height);
}
private static final int CLEAR_OFFSET = 130;
private static final int TOP_OFFSET = 4;
private static final int SELECT_OFFSET = 100;
private static final int SET_OFFSET = 70;
}
public class LogHandlerBar extends JPanel implements ItemSelectable {
private static final long serialVersionUID = 1L;
private ItemListener listeners;
private UIButton clear;
private UIButton selectedall;
private UIButton set;
private UILabel normalLabel;
private UILabel alertLabel;
private UILabel seriouslyLabel;
private String text;
private int INFONUM = 0;
private int ERRORNUM = 0;
private int SERVERNUM = 0;
private static final int FLOW_LAYOUT_HGAP = 10;
private static final int FLOW_LAYOUT_VGAP = 5;
private boolean isWithSerious;
public LogHandlerBar() {
this(null);
}
public LogHandlerBar(String text) {
this.setLayout(new FlowLayout(FlowLayout.RIGHT, FLOW_LAYOUT_HGAP, FLOW_LAYOUT_VGAP));
this.setUI(new LogHandlerBarUI());
this.text = text;
clear = new UIButton(BaseUtils.readIcon("com/fr/design/images/log/clear.png"));
clear.setMargin(null);
clear.setOpaque(false);
clear.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
clear.setToolTipText(i18nText("Fine-Design_Basic_Clear_All"));
selectedall = new UIButton(BaseUtils.readIcon("com/fr/design/images/log/selectedall.png"));
selectedall.setMargin(null);
selectedall.setOpaque(false);
selectedall.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
selectedall.setToolTipText(i18nText("Fine-Design_Basic_Select_All"));
set = new UIButton(BaseUtils.readIcon("com/fr/design/images/log/setting.png"));
set.setMargin(null);
set.setOpaque(false);
set.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
set.setToolTipText(i18nText("Fine-Design_Report_Set"));
normalLabel = new UILabel(i18nText("Fine-Design_Basic_NNormal") + "(0)");
alertLabel = new UILabel(i18nText("Fine-Design_Basic_Alert") + "(0)");
seriouslyLabel = new UILabel(i18nText("Fine-Design_Basic_Seriously") + "(0)");
this.add(normalLabel);
this.add(alertLabel);
this.add(seriouslyLabel);
this.add(clear);
this.add(selectedall);
this.add(set);
}
/**
* 更新日志数量统计标签
*/
private void changeLabel() {
UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override
public void run() {
normalLabel.setText(i18nText("Fine-Design_Basic_NNormal") + '(' + getInfo() + ')');
alertLabel.setText(i18nText("Fine-Design_Basic_Alert") + '(' + getError() + ')');
seriouslyLabel.setText(i18nText("Fine-Design_Basic_Seriously") + '(' + getServer() + ')');
}
});
}
public void clearMessage() {
INFONUM = ERRORNUM = SERVERNUM = 0;
changeLabel();
}
public boolean IsWithSerious() {
return isWithSerious;
}
public void setWithSerious(boolean b) {
this.isWithSerious = b;
}
public void infoAdd() {
INFONUM++;
changeLabel();
}
public void errorAdd() {
ERRORNUM++;
changeLabel();
}
public void serverAdd() {
SERVERNUM++;
changeLabel();
}
public int getInfo() {
return INFONUM;
}
public int getError() {
return ERRORNUM;
}
public int getServer() {
return SERVERNUM;
}
public void addItemListener(ItemListener l) {
listeners = l;
}
public void removeItemListener(ItemListener l) {
listeners = null;
}
protected void fireItemStateChanged(ItemEvent e) {
listeners.itemStateChanged(e);
}
public Object[] getSelectedObjects() {
return new Object[]{text};
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
repaint();
}
public void addClearListener(ActionListener l) {
clear.addActionListener(l);
}
public void addSelectedListener(ActionListener l) {
selectedall.addActionListener(l);
}
public void addSetListener(ActionListener l) {
set.addActionListener(l);
}
}

9
designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBarUI.java

@ -1,5 +1,7 @@
package com.fr.design.mainframe.loghandler;
import javax.swing.JComponent;
import javax.swing.plaf.ComponentUI;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.FontMetrics;
@ -11,9 +13,6 @@ import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.plaf.ComponentUI;
public class LogHandlerBarUI extends ComponentUI implements MouseListener, FocusListener {
@ -99,10 +98,6 @@ public class LogHandlerBarUI extends ComponentUI implements MouseListener, Focus
if (button.getText() != null) {
g.drawString(button.getText(), textLeadingGap, y);
}
g.drawString(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_NNormal") + '(' + button.getInfo() + ')', button.getWidth() - 310, y);
g.drawString(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Alert") + '(' + button.getError() + ')', button.getWidth() - 250, y);
g.drawString(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Seriously") + '(' + button.getServer() + ')', button.getWidth() - 190, y);
}
/**

101
designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java

@ -2,29 +2,53 @@ package com.fr.design.mainframe.mobile.ui;
import com.fr.base.background.ColorBackground;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.designer.IntervalConstants;
import com.fr.design.gui.icombobox.LineComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ispinner.UISpinner;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.style.color.ColorSelectBox;
import com.fr.design.style.color.NewColorSelectBox;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.form.ui.Widget;
import com.fr.form.ui.mobile.MobileStyle;
import com.fr.general.FRFont;
import com.fr.invoke.Reflect;
import com.fr.stable.Constants;
import javax.swing.*;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
public class MobileStyleDefinePane extends BasicBeanPane<MobileStyle> {
public class MobileStyleDefinePane extends BasicBeanPane<MobileStyle> {
private final static int[] BORDER_LINE_STYLE_ARRAY = new int[]{
Constants.LINE_NONE,
Constants.LINE_THIN, //1px
Constants.LINE_MEDIUM, //2px
Constants.LINE_THICK, //3px
};
private static final int NORMAL_COMBO_WIDTH = 152;
private Widget widget;
private MobileStyleCustomDefinePane customBeanPane;
private Class<? extends MobileStyle> mobileStyleClazz;
private ColorSelectBox colorSelectBox;
private Color titleColor = new Color(47, 142, 241);
private JPanel commomPane;
private LineComboBox borderType;
private NewColorSelectBox borderColor;
private UISpinner borderRadius;
private MobileStyleFontConfigPane fontConfigPane;
MobileStyleDefinePane(Widget widget, Class<? extends MobileStyleCustomDefinePane> customBeanPaneClass,
Class<? extends MobileStyle> mobileStyleClazz) {
@ -40,6 +64,14 @@ public class MobileStyleDefinePane extends BasicBeanPane<MobileStyle> {
if(ob.getBackground() != null) {
colorSelectBox.setSelectObject(((ColorBackground)ob.getBackground()).getColor());
}
borderType.setSelectedLineStyle(ob.getBorderType());
if (ob.getBorderColor() != null) {
borderColor.setSelectObject(ob.getBorderColor());
}
borderRadius.setValue(ob.getBorderRadius());
if (ob.getFont() != null) {
fontConfigPane.populateBean(ob.getFont());
}
}
@Override
@ -48,6 +80,10 @@ public class MobileStyleDefinePane extends BasicBeanPane<MobileStyle> {
this.widget.setMobileStyle(mobileStyle);
this.customBeanPane.updateBean();
mobileStyle.setBackground(ColorBackground.getInstance(colorSelectBox.getSelectObject()));
mobileStyle.setBorderType(borderType.getSelectedLineStyle());
mobileStyle.setBorderColor(borderColor.getSelectObject());
mobileStyle.setBorderRadius(borderRadius.getValue());
mobileStyle.setFont(fontConfigPane.updateBean());
return mobileStyle;
}
@ -64,7 +100,7 @@ public class MobileStyleDefinePane extends BasicBeanPane<MobileStyle> {
private void createGeneralPane() {
createPreviewPane();
createBackgroundPane();
createCommonPane();
}
private void createPreviewPane() {
@ -79,29 +115,49 @@ public class MobileStyleDefinePane extends BasicBeanPane<MobileStyle> {
}
}
private void createBackgroundPane() {
JPanel backgroundPane = new JPanel();
backgroundPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 5));
backgroundPane.setPreferredSize(new Dimension(500, 65));
private void createCommonPane() {
TitledBorder titledBorder = createTitledBorder(Toolkit.i18nText("Fine-Design_Mobile_Common_Attribute"));
backgroundPane.setBorder(titledBorder);
commomPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10);
commomPane.setBorder(titledBorder);
this.add(commomPane, BorderLayout.NORTH);
UILabel colorSelectLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Widget_Background"), UILabel.RIGHT);
colorSelectLabel.setPreferredSize(new Dimension(65, 20));
createBackgroundPane();
createBorderPane();
createFontPane();
}
colorSelectBox = new ColorSelectBox(152);
private void createBackgroundPane() {
colorSelectBox = new ColorSelectBox(NORMAL_COMBO_WIDTH);
colorSelectBox.addSelectChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
}
});
backgroundPane.add(colorSelectLabel);
backgroundPane.add(colorSelectBox);
JPanel backgroundPane = createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_Background")), colorSelectBox);
commomPane.add(backgroundPane);
}
this.add(backgroundPane, BorderLayout.NORTH);
private void createBorderPane() {
borderType = new LineComboBox(BORDER_LINE_STYLE_ARRAY);
borderType.setSelectedLineStyle(Constants.LINE_THIN);
borderType.setPreferredSize(new Dimension(NORMAL_COMBO_WIDTH + 15, 20));
borderColor = new NewColorSelectBox(NORMAL_COMBO_WIDTH);
borderColor.addSelectChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
}
});
borderRadius = new UISpinner(0, Integer.MAX_VALUE, 1, 2);
borderRadius.setPreferredSize(new Dimension(NORMAL_COMBO_WIDTH + 20, 20));
commomPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderType")), borderType));
commomPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderColor")), borderColor));
commomPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderRadius")), borderRadius));
}
private void createFontPane() {
fontConfigPane = new MobileStyleFontConfigPane();
commomPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_Font")), fontConfigPane));
}
private void createCustomPane() {
@ -109,6 +165,7 @@ public class MobileStyleDefinePane extends BasicBeanPane<MobileStyle> {
TitledBorder titledBorder = createTitledBorder(Toolkit.i18nText("Fine-Design_Report_Set"));
configPane.setBorder(titledBorder);
JPanel container = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10);
configPane.add(this.customBeanPane, BorderLayout.CENTER);
this.add(configPane, BorderLayout.CENTER);
@ -119,4 +176,14 @@ public class MobileStyleDefinePane extends BasicBeanPane<MobileStyle> {
titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 12));
return titledBorder;
}
private UILabel createConfigLabel(String title) {
UILabel label = new UILabel(title + ":", UILabel.RIGHT);
label.setPreferredSize(new Dimension(75, 20));
return label;
}
private JPanel createLeftRightComponentsPane(Component... components) {
return TableLayoutHelper.createGapTableLayoutPane(new Component[][]{components}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM);
}
}

99
designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleFontConfigPane.java

@ -0,0 +1,99 @@
package com.fr.design.mainframe.mobile.ui;
import com.fr.base.BaseUtils;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.gui.ibutton.UIToggleButton;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.i18n.Toolkit;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.FRFont;
import com.fr.stable.Constants;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.util.Vector;
public class MobileStyleFontConfigPane extends JPanel {
private static final int MAX_FONT_SIZE = 18;
private static final int MIN_FONT_SIZE = 12;
private static final Dimension BUTTON_SIZE = new Dimension(20, 18);
public static Vector<Integer> getFontSizes() {
Vector<Integer> FONT_SIZES = new Vector<Integer>();
for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++) {
FONT_SIZES.add(i);
}
return FONT_SIZES;
}
private UIComboBox fontSizeComboBox;
private UIToggleButton underline;
private UIToggleButton italic;
private UIToggleButton bold;
public MobileStyleFontConfigPane() {
this.initComponent();
}
private void initComponent() {
fontSizeComboBox = new UIComboBox(getFontSizes());
fontSizeComboBox.setSelectedItem(16);
fontSizeComboBox.setPreferredSize(new Dimension(60, 20));
fontSizeComboBox.setEditable(true);
underline = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/underline.png"));
italic = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png"));
bold = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png"));
this.setButtonsTips();
this.setButtonsSize(BUTTON_SIZE);
Component[] components_font = new Component[]{
fontSizeComboBox, underline, italic, bold
};
JPanel buttonPane = new JPanel(new BorderLayout());
buttonPane.add(GUICoreUtils.createFlowPane(components_font, FlowLayout.LEFT, LayoutConstants.HGAP_LARGE));
this.setLayout(new BorderLayout(0,0));
this.add(buttonPane, BorderLayout.CENTER);
}
private void setButtonsTips() {
underline.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Underline"));
italic.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Italic"));
bold.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bold"));
}
private void setButtonsSize(Dimension size) {
underline.setPreferredSize(size);
italic.setPreferredSize(size);
bold.setPreferredSize(size);
}
public void populateBean(FRFont frFont) {
fontSizeComboBox.setSelectedItem(frFont.getSize());
bold.setSelected(frFont.isBold());
italic.setSelected(frFont.isItalic());
underline.setSelected(frFont.getUnderline() != Constants.LINE_NONE);
}
public FRFont updateBean() {
int style = Font.PLAIN;
style += this.bold.isSelected() ? Font.BOLD : Font.PLAIN;
style += this.italic.isSelected() ? Font.ITALIC : Font.PLAIN;
return FRFont.getInstance(
FRFont.DEFAULT_FONTNAME,
style,
Float.parseFloat(fontSizeComboBox.getSelectedItem().toString()),
Color.BLACK,
underline.isSelected() ? Constants.LINE_THIN : Constants.LINE_NONE
);
}
}

20
designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfoCollector.java

@ -5,13 +5,10 @@ import com.fr.design.mainframe.burying.point.AbstractPointInfo;
import com.fr.json.JSON;
import com.fr.json.JSONFactory;
import com.fr.json.JSONObject;
import com.fr.stable.ProductConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -26,7 +23,7 @@ public class TemplateInfoCollector extends AbstractPointCollector<TemplateInfo>
private static final String XML_TEMPLATE_INFO_LIST = "TemplateInfoList";
private static final String XML_FILE_NAME = "tpl.info";
private static TemplateInfoCollector instance;
private DesignerOpenHistory designerOpenHistory;
private DesignerOpenHistory designerOpenHistory = DesignerOpenHistory.getInstance();
//记录指定模板最新的模板耗时信息ID
private Map<String, Long> latestTemplateInfo;
@ -99,14 +96,6 @@ public class TemplateInfoCollector extends AbstractPointCollector<TemplateInfo>
return latestTemplateInfo.getTemplateCreateTime();
}
/**
* 获取缓存文件存放路径
*/
@Override
protected File getInfoFile() {
return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), XML_FILE_NAME));
}
/**
* 更新 day_count打开设计器却未编辑模板的连续日子
*/
@ -172,6 +161,13 @@ public class TemplateInfoCollector extends AbstractPointCollector<TemplateInfo>
writer.end();
}
/**
* 获取缓存文件存放路径
*/
@Override
protected String getInfoFilePath() {
return XML_FILE_NAME;
}
@Override
public void sendPointInfo() {

4
designer-base/src/main/java/com/fr/design/utils/DesignUtils.java

@ -291,10 +291,8 @@ public class DesignUtils {
if (isDisplaySimSun(defaultLocale)) {
guiFRFont = getNamedFont("SimSun");
} else if (isDisplayDialog(defaultLocale)) {
} else {
guiFRFont = getNamedFont("Dialog");
} else {
guiFRFont = getNamedFont("Tahoma");
}
//先初始化的设计器locale, 后初始化lookandfeel.如果顺序改了, 这边也要调整.

5
designer-base/src/main/java/com/fr/design/utils/DesignerPort.java

@ -90,10 +90,7 @@ public class DesignerPort implements XMLReadable, XMLWriter {
}
public void resetPort() {
ProcessEventPipe eventPipe = FineProcessContext.getParentPipe();
if (eventPipe != null) {
eventPipe.fire(new CarryMessageEvent(ReportState.STOP.getValue()));
}
FineProcessContext.getParentPipe().fire(new CarryMessageEvent(ReportState.STOP.getValue()));
TipDialog dialog = new TipDialog(null,
StringUtils.EMPTY,
Toolkit.i18nText("Fine-Design_Port_Found_Port_Conflict"),

13
designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java

@ -62,6 +62,7 @@ public class FineEmbedServerActivator extends Activator {
tomcat.setPort(DesignerEnvManager.getEnvManager().getEmbedServerPort());
// 设置解码uri使用的字符编码
tomcat.getConnector().setURIEncoding(EncodeConstants.ENCODING_UTF_8);
setMaxPostSize();
String docBase = new File(WorkContext.getCurrent().getPath()).getParent();
//内置的上下文使用工程目录比如webroot
@ -79,6 +80,18 @@ public class FineEmbedServerActivator extends Activator {
context.addServletContainerInitializer(initializer, classes);
}
// tomcat的maxPostSize会影响到post参数获取,默认2M
private void setMaxPostSize() {
if (System.getProperty("tomcat-maxPostSize") != null) {
try {
tomcat.getConnector().setMaxPostSize(Integer.parseInt(System.getProperty("tomcat-maxPostSize")));
} catch (Exception e) {
FineLoggerFactory.getLogger().error("maxPostSize error: " + e.getMessage(), e);
}
}
}
private void stopServerActivator() {

62
designer-base/src/test/java/com/fr/design/base/clipboard/ClipboardFilterTest.java

@ -0,0 +1,62 @@
package com.fr.design.base.clipboard;
import com.fr.design.fun.ClipboardHandlerProvider;
import com.fr.form.main.ExtraFormClassManager;
import com.fr.plugin.injectable.PluginModule;
import com.fr.stable.fun.mark.Mutable;
import org.easymock.EasyMock;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.HashSet;
import java.util.Set;
@PrepareForTest(PluginModule.class)
@RunWith(PowerMockRunner.class)
public class ClipboardFilterTest {
@Before
public void setUp() throws Exception {
Set<Mutable> providers = new HashSet<>();
providers.add(new TestClipboardHandlerProvider<Object>());
ExtraFormClassManager formClassManager = EasyMock.mock(ExtraFormClassManager.class);
EasyMock.expect(formClassManager.getArray(ClipboardHandlerProvider.XML_TAG))
.andReturn(providers)
.anyTimes();
EasyMock.replay(formClassManager);
PowerMock.mockStatic(PluginModule.class);
EasyMock.expect(PluginModule.getAgent(PluginModule.ExtraForm))
.andReturn(formClassManager)
.anyTimes();
PowerMock.replayAll();
}
@After
public void tearDown() throws Exception {
PowerMock.resetAll();
}
@Test
public void testClipboard() {
ClipboardFilter.cut("cut");
String paste1 = ClipboardFilter.paste("paste");
Assert.assertNull(paste1);
ClipboardFilter.copy("copy");
String paste2 = ClipboardFilter.paste("paste");
Assert.assertNull(paste2);
}
}

75
designer-base/src/test/java/com/fr/design/base/clipboard/DesignerClipboardTest.java

@ -0,0 +1,75 @@
package com.fr.design.base.clipboard;
import com.fr.design.fun.ClipboardHandlerProvider;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.dnd.ArrayListTransferable;
import com.fr.form.main.ExtraFormClassManager;
import com.fr.plugin.injectable.PluginModule;
import com.fr.stable.fun.mark.Mutable;
import com.fr.third.guava.collect.Lists;
import org.easymock.EasyMock;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import javax.swing.JPanel;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
@PrepareForTest(PluginModule.class)
@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.swing.*")
public class DesignerClipboardTest {
@Before
public void setUp() throws Exception {
Set<Mutable> providers = new HashSet<>();
ExtraFormClassManager formClassManager = EasyMock.mock(ExtraFormClassManager.class);
EasyMock.expect(formClassManager.getArray(ClipboardHandlerProvider.XML_TAG))
.andReturn(providers)
.anyTimes();
EasyMock.replay(formClassManager);
PowerMock.mockStatic(PluginModule.class);
EasyMock.expect(PluginModule.getAgent(PluginModule.ExtraForm))
.andReturn(formClassManager)
.anyTimes();
PowerMock.replayAll();
}
@After
public void tearDown() throws Exception {
PowerMock.resetAll();
}
@Test
public void testClipboard() throws Exception {
JPanel panel = new JPanel();
Clipboard clipboard = DesignerContext.getClipboard(panel);
ArrayList<String> transferData = Lists.newArrayList("test", "test2");
ArrayListTransferable transferable = new ArrayListTransferable(transferData);
clipboard.setContents(transferable, null);
Transferable filterTransferable = clipboard.getContents(null);
DataFlavor[] flavors = transferable.getTransferDataFlavors();
ArrayList<String> transferData2 = (ArrayList<String>) filterTransferable.getTransferData(flavors[0]);
Assert.assertEquals(transferData.get(0), transferData2.get(0));
}
}

29
designer-base/src/test/java/com/fr/design/base/clipboard/TestClipboardHandlerProvider.java

@ -0,0 +1,29 @@
package com.fr.design.base.clipboard;
import com.fr.design.fun.impl.AbstractClipboardHandlerProvider;
/**
* created by Harrison on 2020/05/15
**/
class TestClipboardHandlerProvider<T> extends AbstractClipboardHandlerProvider<T> {
@Override
public T cut(T selection) {
return selection;
}
@Override
public T copy(T selection) {
return selection;
}
@Override
public T paste(T selection) {
return null;
}
@Override
public boolean support(Object selection) {
return true;
}
}

19
designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java

@ -42,7 +42,7 @@ import com.fr.van.chart.drillmap.designer.data.comp.MapDataTree;
import com.fr.workspace.WorkContext;
import javax.swing.BorderFactory;
import javax.swing.JOptionPane;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
@ -51,6 +51,8 @@ import javax.swing.event.PopupMenuListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import java.util.ArrayList;
import java.util.List;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
@ -61,8 +63,6 @@ import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Mitisky on 16/5/11.
@ -280,14 +280,12 @@ public class VanChartMapSourceChoosePane extends JPanel implements UIObserver {
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
String selected = Utils.objectToString(gisLayer.getSelectedItem());
ZoomLevel zoomSelected = (ZoomLevel) zoomLevel.getSelectedItem();
gisLayer.removeAllItems();
for (String item : MapLayerConfigManager.getLayerItems()) {
gisLayer.addItem(item);
}
gisLayer.setModel(new DefaultComboBoxModel(MapLayerConfigManager.getLayerItems()));
gisLayer.setSelectedItem(selected);
zoomLevel.setSelectedItem(zoomSelected);
}
});
@ -346,10 +344,7 @@ public class VanChartMapSourceChoosePane extends JPanel implements UIObserver {
} else {
levels = ZOOM_LEVELS;
}
zoomLevel.removeAllItems();
for (int i = 0; i < levels.length; i++) {
zoomLevel.addItem(levels[i]);
}
zoomLevel.setModel(new DefaultComboBoxModel(levels));
}

13
designer-form/src/main/java/com/fr/design/designer/beans/events/CreatorEventListenerTable.java

@ -1,10 +1,14 @@
package com.fr.design.designer.beans.events;
import com.fr.design.designer.creator.XComponent;
import com.fr.design.fun.DesignerEditListenerProvider;
import com.fr.form.main.ExtraFormClassManager;
import com.fr.general.ComparatorUtils;
import com.fr.plugin.injectable.PluginModule;
import javax.swing.SwingUtilities;
import java.util.ArrayList;
import java.util.Set;
public class CreatorEventListenerTable {
@ -28,6 +32,7 @@ public class CreatorEventListenerTable {
}
private void fireCreatorModified(final DesignerEvent evt) {
for (int i = 0; i < listeners.size(); i++) {
final DesignerEditListener listener = listeners.get(i);
SwingUtilities.invokeLater(new Runnable() {
@ -37,6 +42,14 @@ public class CreatorEventListenerTable {
}
});
}
//触发插件的事件
ExtraFormClassManager manager = PluginModule.getAgent(PluginModule.ExtraForm);
Set<DesignerEditListenerProvider> providers = manager.getArray(DesignerEditListenerProvider.XML_TAG);
for (DesignerEditListenerProvider provider : providers) {
provider.fireCreatorModified(evt);
}
}
public void fireCreatorModified(XComponent creator, int eventID) {

32
designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java

@ -1,12 +1,19 @@
package com.fr.design.designer.beans.models;
import com.fr.common.inputevent.InputEventBaseOnOS;
import com.fr.design.base.clipboard.ClipboardFilter;
import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.beans.location.Direction;
import com.fr.design.designer.beans.location.Location;
import com.fr.design.designer.creator.*;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.creator.XWParameterLayout;
import com.fr.design.designer.creator.cardlayout.XWCardLayout;
import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout;
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout;
@ -19,7 +26,9 @@ import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.stable.ArrayUtils;
import java.awt.*;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
@ -110,9 +119,12 @@ public class SelectionModel {
*/
public void cutSelectedCreator2ClipBoard() {
if (hasSelectionComponent()) {
selection.cut2ClipBoard(clipboard);
designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_CUTED);
designer.repaint();
FormSelection cutSelection = ClipboardFilter.cut(selection);
if (cutSelection != null) {
cutSelection.cut2ClipBoard(clipboard);
designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_CUTED);
designer.repaint();
}
}
}
@ -121,7 +133,10 @@ public class SelectionModel {
*/
public void copySelectedCreator2ClipBoard() {
if (!selection.isEmpty()) {
selection.copy2ClipBoard(clipboard);
FormSelection copySelection = ClipboardFilter.copy(selection);
if (copySelection != null) {
copySelection.copy2ClipBoard(clipboard);
}
}
}
@ -131,7 +146,8 @@ public class SelectionModel {
* @return
*/
public boolean pasteFromClipBoard() {
if (!clipboard.isEmpty()) {
FormSelection pasteSelection = ClipboardFilter.paste(clipboard);
if (pasteSelection != null && !pasteSelection.isEmpty()) {
if (!hasSelectedPasteSource()) {
//未选
unselectedPaste();
@ -258,11 +274,11 @@ public class SelectionModel {
designer.removeParaComponent();
}
removeCreatorFromContainer(creator, creator.getWidth(), creator.getHeight());
FormDesignerUtils.removeWidgetProcessInfo(creator.toData());
creator.deleteRelatedComponent(creator, designer);
creator.removeAll();
// 清除被选中的组件
selection.reset();
FormDesignerUtils.removeWidgetProcessInfo(creator.toData());
}

30
designer-form/src/main/java/com/fr/design/designer/creator/XButton.java

@ -3,8 +3,8 @@
*/
package com.fr.design.designer.creator;
import com.fr.base.ScreenResolution;
import com.fr.base.background.GradientBackground;
import com.fr.design.form.util.FontTransformUtil;
import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.mainframe.widget.editors.ButtonTypeEditor;
@ -40,13 +40,13 @@ import java.beans.IntrospectionException;
* @since 6.5.3
*/
public class XButton extends XWidgetCreator {
public final static Background DEFAULTBG = new GradientBackground(new Color(247,247,247),new Color(210,210,210), GradientBackground.TOP2BOTTOM);
public final static Font DEFAULTFT = new Font("Song_TypeFace",0,12);
public final static Color DEFAULTFOREGROUNDCOLOR = Color.BLACK;
private Background bg;
private UILabel contentLabel;
public XButton(Button widget, Dimension initSize) {
this(new FreeButton(widget),initSize);
}
@ -54,11 +54,11 @@ public class XButton extends XWidgetCreator {
public XButton(FreeButton widget, Dimension initSize) {
super(widget, initSize);
}
public XButton(FormSubmitButton widget, Dimension initSize) {
super(widget, initSize);
}
public Background getContentBackground() {
return bg;
}
@ -74,7 +74,7 @@ public class XButton extends XWidgetCreator {
public void setContentLabel(UILabel contentLabel) {
this.contentLabel = contentLabel;
}
/**
*根据下拉框选择返回按钮样式的默认设置或自定义设置列表
* @return 列表
@ -148,7 +148,7 @@ public class XButton extends XWidgetCreator {
FreeButton button = (FreeButton) data;
if (button.getFont() != null) {
contentLabel.setFont(button.getFont().applyResolutionNP(
ScreenResolution.getScreenResolution()));
FontTransformUtil.getDesignerFontResolution()));
contentLabel.setForeground(button.getFont().getForeground());
}
}
@ -205,7 +205,7 @@ public class XButton extends XWidgetCreator {
protected UILabel initContentLabel() {
return new UILabel();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
@ -218,15 +218,15 @@ public class XButton extends XWidgetCreator {
bg.paint(g, new Rectangle2D.Double(0, 0, panelSize.getWidth(), panelSize.getHeight()));
}
}
public void setButtonText(String text) {
contentLabel.setText(text);
}
private void checkButonType() {
UILabel l = contentLabel;
FreeButton button = (FreeButton) data;
if (!button.isCustomStyle()) {
l.setBorder(BorderFactory.createLineBorder(new Color(148, 148, 148)));
bg = DEFAULTBG;
@ -240,7 +240,7 @@ public class XButton extends XWidgetCreator {
editor.add(l,BorderLayout.CENTER);
if (button.getFont() != null) {
contentLabel.setFont(button.getFont().applyResolutionNP(
ScreenResolution.getScreenResolution()));
FontTransformUtil.getDesignerFontResolution()));
contentLabel.setForeground(button.getFont().getForeground());
}
l.setBounds(0, 0, button.getButtonWidth() == 0 ? this.getWidth() : button.getButtonWidth(), button
@ -248,7 +248,7 @@ public class XButton extends XWidgetCreator {
bg = button.getInitialBackground();
}
}
@Override
protected void initXCreatorProperties() {
super.initXCreatorProperties();
@ -257,7 +257,7 @@ public class XButton extends XWidgetCreator {
FreeButton button = (FreeButton) data;
l.setText(button.getText());
if (button.isCustomStyle() && button.getFont() != null) {
l.setFont(button.getFont().applyResolutionNP(ScreenResolution.getScreenResolution()));
l.setFont(button.getFont().applyResolutionNP(FontTransformUtil.getDesignerFontResolution()));
l.setForeground(button.getFont().getForeground());
}
@ -303,7 +303,7 @@ public class XButton extends XWidgetCreator {
checkButonType();
if (button.getFont() != null) {
contentLabel.setFont(button.getFont().applyResolutionNP(
ScreenResolution.getScreenResolution()));
FontTransformUtil.getDesignerFontResolution()));
contentLabel.setForeground(button.getFont().getForeground());
}

5
designer-form/src/main/java/com/fr/design/designer/creator/XLabel.java

@ -4,9 +4,9 @@
package com.fr.design.designer.creator;
import com.fr.base.BaseUtils;
import com.fr.base.ScreenResolution;
import com.fr.base.Style;
import com.fr.design.border.UIRoundedBorder;
import com.fr.design.form.util.FontTransformUtil;
import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.mainframe.widget.editors.FontEditor;
@ -98,7 +98,8 @@ public class XLabel extends XWidgetCreator {
.toString(), Style.getInstance(label.getFont()).deriveHorizontalAlignment(label.getTextalign())
.deriveVerticalAlignment(label.isVerticalCenter() ? SwingConstants.CENTER : SwingConstants.TOP)
.deriveTextStyle(label.isWrap() ? Style.TEXTSTYLE_WRAPTEXT : Style.TEXTSTYLE_SINGLELINE),
ScreenResolution.getScreenResolution());
FontTransformUtil.getDesignerFontResolution());
}
}

4
designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java

@ -111,7 +111,7 @@ public class XWAbsoluteLayout extends XLayoutContainer {
private void initPercent(WAbsoluteLayout widget) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension scrnsize = toolkit.getScreenSize();
double screenValue = FRScreen.getByDimension(scrnsize).getValue();
double screenValue = FRScreen.getDesignScreenByDimension(scrnsize).getValue();
if (!AssistUtils.equals(screenValue, FormArea.DEFAULT_SLIDER)) {
this.setContainerPercent(screenValue / FormArea.DEFAULT_SLIDER);
}
@ -247,7 +247,7 @@ public class XWAbsoluteLayout extends XLayoutContainer {
*/
@Override
public void updateChildBound(int minHeight) {
double prevContainerPercent = FRScreen.getByDimension(toData().getDesigningResolution()).getValue() / FormArea.DEFAULT_SLIDER;
double prevContainerPercent = FRScreen.getDesignScreenByDimension(toData().getDesigningResolution()).getValue() / FormArea.DEFAULT_SLIDER;
if (toData().getCompState() == 0 && !AssistUtils.equals(containerPercent, prevContainerPercent)) {
for (int i = 0; i < this.getComponentCount(); i++) {
XCreator creator = getXCreator(i);

4
designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java

@ -72,7 +72,7 @@ public class XWFitLayout extends XLayoutContainer {
private void initPercent(){
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension scrnsize = toolkit.getScreenSize();
double screenValue = FRScreen.getByDimension(scrnsize).getValue();
double screenValue = FRScreen.getDesignScreenByDimension(scrnsize).getValue();
if (!AssistUtils.equals(FormArea.DEFAULT_SLIDER, screenValue)) {
this.setContainerPercent(screenValue / FormArea.DEFAULT_SLIDER);
}
@ -1331,4 +1331,4 @@ public class XWFitLayout extends XLayoutContainer {
}
}
}
}
}

46
designer-form/src/main/java/com/fr/design/form/util/FontTransformUtil.java

@ -0,0 +1,46 @@
package com.fr.design.form.util;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.fun.FormAdaptiveConfigUIProcessor;
import com.fr.stable.Constants;
import com.fr.stable.unit.PT;
/**
* Created by kerry on 2020-04-16
*/
public class FontTransformUtil {
/**
* 获取设计器字体显示dpi
* @return dpi
*/
public static int getDesignerFontResolution() {
int dpi = Constants.FR_PAINT_RESOLUTION;
FormAdaptiveConfigUIProcessor adaptiveConfigUI = ExtraDesignClassManager.getInstance().getSingle(FormAdaptiveConfigUIProcessor.MARK_STRING);
if (adaptiveConfigUI != null) {
dpi = adaptiveConfigUI.fontResolution();
}
return dpi;
}
/**
* pt值转px
* @param value pt值
* @return px值
*/
public static double pt2px(double value) {
return PT.pt2pix(value, getDesignerFontResolution());
}
/**
* px值转pt
* @param value px值
* @return pt值
*/
public static double px2pt(double value) {
return value * (double) Constants.DEFAULT_FONT_PAINT_RESOLUTION / (double) getDesignerFontResolution();
}
}

22
designer-form/src/main/java/com/fr/design/fun/DesignerEditListenerProvider.java

@ -0,0 +1,22 @@
package com.fr.design.fun;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.stable.fun.mark.Mutable;
/**
* created by Harrison on 2020/05/14
**/
public interface DesignerEditListenerProvider extends Mutable {
String XML_TAG = "DesignerEditListenerProvider";
int CURRENT_LEVEL = 1;
/**
* 触发设计器事件
*
* @param evt 事件
*/
void fireCreatorModified(DesignerEvent evt);
}

17
designer-form/src/main/java/com/fr/design/fun/impl/AbstractDesignerEditListenerProvider.java

@ -0,0 +1,17 @@
package com.fr.design.fun.impl;
import com.fr.design.fun.DesignerEditListenerProvider;
import com.fr.stable.fun.impl.AbstractProvider;
import com.fr.stable.fun.mark.API;
/**
* created by Harrison on 2020/05/14
**/
@API(level = DesignerEditListenerProvider.CURRENT_LEVEL)
public abstract class AbstractDesignerEditListenerProvider extends AbstractProvider implements DesignerEditListenerProvider {
@Override
public int currentAPILevel() {
return DesignerEditListenerProvider.CURRENT_LEVEL;
}
}

2
designer-form/src/main/java/com/fr/design/mainframe/CoverReportPane.java

@ -63,7 +63,7 @@ public class CoverReportPane extends CoverPane implements HelpDialogHandler{
// controlMode = IOUtils.readIcon(IconPathConstants.TD_EL_SHARE_CLOSE_ICON_PATH);
controlButton.setVisible(false);
helpDialog = new WidgetHelpDialog(DesignerContext.getDesignerFrame(), helpMsg);
double screenValue = FRScreen.getByDimension(Toolkit.getDefaultToolkit().getScreenSize()).getValue();
double screenValue = FRScreen.getDesignScreenByDimension(Toolkit.getDefaultToolkit().getScreenSize()).getValue();
int offsetX = 0;
if (screenValue < FormArea.DEFAULT_SLIDER) {
offsetX = (int) ((1 - screenValue / FormArea.DEFAULT_SLIDER)

2
designer-form/src/main/java/com/fr/design/mainframe/FormArea.java

@ -220,7 +220,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent {
private void initCalculateSize() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension scrnsize = toolkit.getScreenSize();
this.screenValue = FRScreen.getByDimension(scrnsize).getValue();
this.screenValue = FRScreen.getDesignScreenByDimension(scrnsize).getValue();
XLayoutContainer root = FormArea.this.designer.getRootComponent();
// 7.1.1不放缩放滑块,但表单大小仍按屏幕分辨率调整
// slidePane.populateBean(screenValue);

36
designer-form/src/main/java/com/fr/design/mainframe/template/info/ComponentOperate.java

@ -1,10 +1,17 @@
package com.fr.design.mainframe.template.info;
import com.fr.design.gui.core.WidgetOption;
import com.fr.form.ui.ChartEditor;
import com.fr.form.ui.ElementCaseEditor;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WCardLayout;
import com.fr.form.ui.container.WScaleLayout;
import com.fr.form.ui.container.WTitleLayout;
import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout;
import com.fr.form.ui.widget.CRBoundsWidget;
import com.fr.general.ComparatorUtils;
import com.fr.json.JSONObject;
/**
@ -20,9 +27,20 @@ public abstract class ComponentOperate implements TemplateOperate {
private Widget widget;
public ComponentOperate(Widget widget) {
this.widget = widget;
Widget innerWidget = widget;
if (innerWidget.acceptType(WScaleLayout.class)) {
Widget crBoundsWidget = ((WScaleLayout) innerWidget).getBoundsWidget();
innerWidget = ((CRBoundsWidget) crBoundsWidget).getWidget();
} else if (innerWidget.acceptType(WTitleLayout.class)) {
CRBoundsWidget crBoundsWidget = ((WTitleLayout) innerWidget).getBodyBoundsWidget();
innerWidget = crBoundsWidget.getWidget();
} else if (innerWidget.acceptType(WCardMainBorderLayout.class)){
innerWidget = ((WCardMainBorderLayout) widget).getCardPart();
}
this.widget = innerWidget;
}
@Override
public JSONObject toJSONObject() {
JSONObject jo = new JSONObject();
@ -50,6 +68,11 @@ public abstract class ComponentOperate implements TemplateOperate {
Widget {
@Override
protected boolean acceptType(Widget widget) {
for (WidgetOption widgetOption : WidgetOption.getFormWidgetIntance()) {
if (ComparatorUtils.equals(widget.getClass(), widgetOption.widgetClass())) {
return true;
}
}
return false;
}
},
@ -62,7 +85,7 @@ public abstract class ComponentOperate implements TemplateOperate {
Absolute {
@Override
protected boolean acceptType(Widget widget) {
return widget.acceptType(WAbsoluteLayout.class);
return widget.acceptType(WAbsoluteLayout.class) && !widget.acceptType(WAbsoluteBodyLayout.class);
}
};
@ -76,5 +99,14 @@ public abstract class ComponentOperate implements TemplateOperate {
}
return Widget;
}
public static boolean supportComponent(Widget widget) {
for (ComponentType componentType : values()) {
if (componentType.acceptType(widget)) {
return true;
}
}
return false;
}
}
}

36
designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java

@ -1,6 +1,7 @@
package com.fr.design.mainframe.template.info;
import com.fr.base.iofile.attr.ExtendSharableAttrMark;
import com.fr.chart.chartattr.ChartCollection;
import com.fr.form.FormElementCaseProvider;
import com.fr.form.main.Form;
@ -21,6 +22,7 @@ import com.fr.report.cell.DefaultTemplateCellElement;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -61,12 +63,21 @@ public class JFormProcessInfo extends TemplateProcessInfo<Form> {
// 获取模板控件数
public int getWidgetCount() {
int widgetCount = 0;
for (int i = 0; i < template.getContainer().getWidgetCount(); i++) {
WLayout wl = (WLayout) template.getContainer().getWidget(i);
widgetCount += wl.getWidgetCount();
}
return widgetCount;
final AtomicInteger widgetCount = new AtomicInteger();
Form.traversalWidget(this.template.getContainer(), new WidgetGather() {
@Override
public void dealWith(Widget widget) {
if (ComponentOperate.ComponentType.supportComponent(widget)) {
widgetCount.incrementAndGet();
}
}
@Override
public boolean dealWithAllCards() {
return true;
}
}, null);
return widgetCount.get();
}
@Override
@ -167,7 +178,7 @@ public class JFormProcessInfo extends TemplateProcessInfo<Form> {
public boolean useParaPane() {
return this.template.getParaContainer() != null;
}
@Override
public JSONArray getComponentsInfo() {
JSONArray ja = new JSONArray();
@ -177,10 +188,10 @@ public class JFormProcessInfo extends TemplateProcessInfo<Form> {
this.componentProcessInfoMap.clear();
return ja;
}
@Override
public JSONArray getReuseCmpList() {
final JSONArray jo = JSONArray.create();
WLayout container = this.template.getContainer();
WidgetUtil.bfsTraversalWidget(container, new WidgetUtil.BfsWidgetGather<AbstractBorderStyleWidget>() {
@ -197,7 +208,7 @@ public class JFormProcessInfo extends TemplateProcessInfo<Form> {
}, AbstractBorderStyleWidget.class);
return jo;
}
@Override
public void updateTemplateOperationInfo(TemplateOperate templateOperate) {
if (ComparatorUtils.equals(ComponentCreateOperate.OPERATE_TYPE, templateOperate.getOperateType())) {
@ -207,7 +218,7 @@ public class JFormProcessInfo extends TemplateProcessInfo<Form> {
addComponentRemoveInfo(templateOperate.toJSONObject());
}
}
private void addComponentCreateInfo(JSONObject jsonObject) {
String componentID = jsonObject.getString("componentID");
componentProcessInfoMap.put(componentID, jsonObject);
@ -215,6 +226,9 @@ public class JFormProcessInfo extends TemplateProcessInfo<Form> {
private void addComponentRemoveInfo(JSONObject jsonObject) {
String componentID = jsonObject.getString("componentID");
if (componentID == null){
return;
}
JSONObject info = componentProcessInfoMap.get(componentID);
if (info == null) {
info = jsonObject;

102
designer-form/src/test/java/com/fr/design/designer/beans/models/SelectionModelTest.java

@ -0,0 +1,102 @@
package com.fr.design.designer.beans.models;
import com.fr.design.designer.beans.events.CreatorEventListenerTable;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.fun.ClipboardHandlerProvider;
import com.fr.design.fun.impl.AbstractClipboardHandlerProvider;
import com.fr.design.mainframe.FormDesigner;
import com.fr.form.main.ExtraFormClassManager;
import com.fr.plugin.injectable.PluginModule;
import com.fr.stable.fun.mark.Mutable;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import java.util.HashSet;
import java.util.Set;
@PrepareForTest(PluginModule.class)
@SuppressStaticInitializationFor({"com.fr.design.mainframe.FormDesigner"})
@PowerMockIgnore("javax.swing.*")
@RunWith(PowerMockRunner.class)
public class SelectionModelTest {
@Before
public void setUp() throws Exception {
AbstractClipboardHandlerProvider provider = EasyMock.mock(AbstractClipboardHandlerProvider.class);
EasyMock.expect(provider.cut(EasyMock.anyObject())).andAnswer(new IAnswer<Object>() {
@Override
public Object answer() throws Throwable {
return null;
}
}).anyTimes();
EasyMock.expect(provider.copy(EasyMock.anyObject())).andAnswer(new IAnswer<Object>() {
@Override
public Object answer() throws Throwable {
return EasyMock.getCurrentArguments()[0];
}
}).anyTimes();
EasyMock.expect(provider.support(EasyMock.anyObject())).andReturn(true).anyTimes();
EasyMock.expect(provider.paste(EasyMock.anyObject())).andReturn(null).anyTimes();
EasyMock.replay(provider);
Set<Mutable> providers = new HashSet<>();
providers.add(provider);
ExtraFormClassManager formClassManager = EasyMock.mock(ExtraFormClassManager.class);
EasyMock.expect(formClassManager.getArray(ClipboardHandlerProvider.XML_TAG))
.andReturn(providers)
.anyTimes();
EasyMock.expect(formClassManager.getArray("DesignerEditListenerProvider"))
.andReturn(new HashSet<Mutable>())
.anyTimes();
EasyMock.replay(formClassManager);
PowerMock.mockStatic(PluginModule.class);
EasyMock.expect(PluginModule.getAgent(PluginModule.ExtraForm))
.andReturn(formClassManager)
.anyTimes();
PowerMock.replayAll();
}
@After
public void tearDown() throws Exception {
PowerMock.resetAll();
}
@Test
public void testPaste() {
FormDesigner formDesigner = EasyMock.partialMockBuilder(FormDesigner.class).createMock();
XCreator xCreator = EasyMock.mock(XCreator.class);
EasyMock.expect(xCreator.acceptType(EasyMock.anyObject(Class[].class))).andReturn(true).anyTimes();
CreatorEventListenerTable table = new CreatorEventListenerTable();
Whitebox.setInternalState(formDesigner, "edit", table);
EasyMock.replay(formDesigner, xCreator);
SelectionModel model = new SelectionModel(formDesigner);
model.cutSelectedCreator2ClipBoard();
boolean paste1 = model.pasteFromClipBoard();
Assert.assertFalse(paste1);
model.setSelectedCreator(xCreator);
model.copySelectedCreator2ClipBoard();
boolean paste2 = model.pasteFromClipBoard();
Assert.assertFalse(paste2);
}
}

68
designer-form/src/test/java/com/fr/design/form/util/FontTransformUtilTest.java

@ -0,0 +1,68 @@
package com.fr.design.form.util;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.fun.FormAdaptiveConfigUIProcessor;
import com.fr.stable.Constants;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
/**
* Created by kerry on 2020-05-14
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(ExtraDesignClassManager.class)
public class FontTransformUtilTest {
@Test
public void testGetDesignerFontResolution() {
mockEnvironment(Constants.DEFAULT_FONT_PAINT_RESOLUTION);
Assert.assertEquals(Constants.DEFAULT_FONT_PAINT_RESOLUTION, FontTransformUtil.getDesignerFontResolution());
mockEnvironment(Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION);
Assert.assertEquals(Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION, FontTransformUtil.getDesignerFontResolution());
}
@Test
public void testPt2px() {
mockEnvironment(Constants.DEFAULT_FONT_PAINT_RESOLUTION);
Assert.assertEquals(12, (int) FontTransformUtil.pt2px(12));
mockEnvironment(Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION);
Assert.assertEquals(16, (int) FontTransformUtil.pt2px(12));
}
@Test
public void testPx2pt() {
mockEnvironment(Constants.DEFAULT_FONT_PAINT_RESOLUTION);
Assert.assertEquals(12, (int) FontTransformUtil.px2pt(12));
mockEnvironment(Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION);
Assert.assertEquals(9, (int) FontTransformUtil.px2pt(12));
}
private void mockEnvironment(int dpi) {
ExtraDesignClassManager mockDesignManager = EasyMock.mock(ExtraDesignClassManager.class);
EasyMock.expect(mockDesignManager.getSingle(FormAdaptiveConfigUIProcessor.MARK_STRING))
.andReturn(mockProcessor(dpi)).anyTimes();
EasyMock.replay(mockDesignManager);
PowerMock.mockStatic(ExtraDesignClassManager.class);
EasyMock.expect(ExtraDesignClassManager.getInstance()).andReturn(mockDesignManager).once();
PowerMock.replayAll(ExtraDesignClassManager.class);
}
private FormAdaptiveConfigUIProcessor mockProcessor(int dpi) {
FormAdaptiveConfigUIProcessor processor = EasyMock.mock(FormAdaptiveConfigUIProcessor.class);
EasyMock.expect(processor.fontResolution()).andReturn(dpi).once();
EasyMock.replay(processor);
return processor;
}
}

52
designer-form/src/test/java/com/fr/design/mainframe/template/info/ComponentCreateOperateTest.java

@ -1,19 +1,59 @@
package com.fr.design.mainframe.template.info;
import com.fr.form.ui.CardAddButton;
import com.fr.form.ui.CardSwitchButton;
import com.fr.form.ui.ChartEditor;
import com.fr.form.ui.ElementCaseEditor;
import com.fr.form.ui.FreeButton;
import com.fr.form.ui.TextEditor;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WCardLayout;
import com.fr.form.ui.container.WScaleLayout;
import com.fr.form.ui.container.WTitleLayout;
import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout;
import com.fr.form.ui.widget.CRBoundsWidget;
import com.fr.general.ComparatorUtils;
import com.fr.json.JSONObject;
import org.junit.Assert;
import org.junit.Test;
import java.awt.Rectangle;
/**
* Created by kerry on 2020-05-08
*/
public class ComponentCreateOperateTest {
@Test
public void testConstructor() {
ElementCaseEditor caseEditor = new ElementCaseEditor();
caseEditor.setWidgetName("report0");
caseEditor.setWidgetID("xxxx0");
WTitleLayout wTitleLayout = new WTitleLayout();
wTitleLayout.addBody(caseEditor, new Rectangle());
ComponentOperate componentOperate0 = new ComponentCreateOperate(caseEditor);
ComponentOperate componentOperate1 = new ComponentCreateOperate(wTitleLayout);
ComparatorUtils.equals(componentOperate0.toJSONObject(), componentOperate1.toJSONObject());
WScaleLayout scaleLayout = new WScaleLayout();
TextEditor textEditor = new TextEditor();
scaleLayout.addWidget(new CRBoundsWidget(textEditor, new Rectangle()));
ComponentOperate componentOperate3 = new ComponentCreateOperate(scaleLayout);
ComponentOperate componentOperate4 = new ComponentCreateOperate(textEditor);
ComparatorUtils.equals(componentOperate3.toJSONObject(), componentOperate4.toJSONObject());
WCardMainBorderLayout wCardMainBorderLayout = new WCardMainBorderLayout();
WCardLayout wCardLayout = new WCardLayout();
wCardMainBorderLayout.addCenter(wCardLayout);
ComponentOperate componentOperate5 = new ComponentCreateOperate(wCardMainBorderLayout);
ComponentOperate componentOperate6 = new ComponentCreateOperate(wCardLayout);
ComparatorUtils.equals(componentOperate5.toJSONObject(), componentOperate6.toJSONObject());
}
@Test
public void testToJSONObject() {
Widget button = new FreeButton();
@ -35,4 +75,16 @@ public class ComponentCreateOperateTest {
Assert.assertEquals(ComponentOperate.ComponentType.Absolute, ComponentOperate.ComponentType.parseType(new WAbsoluteLayout()));
Assert.assertEquals(ComponentOperate.ComponentType.TabLayout, ComponentOperate.ComponentType.parseType(new WCardLayout()));
}
@Test
public void testSupportComponent() {
Assert.assertTrue(ComponentOperate.ComponentType.supportComponent(new FreeButton()));
Assert.assertTrue(ComponentOperate.ComponentType.supportComponent(new ElementCaseEditor()));
Assert.assertTrue(ComponentOperate.ComponentType.supportComponent(new ChartEditor()));
Assert.assertTrue(ComponentOperate.ComponentType.supportComponent(new WAbsoluteLayout()));
Assert.assertTrue(ComponentOperate.ComponentType.supportComponent(new WCardLayout()));
Assert.assertFalse(ComponentOperate.ComponentType.supportComponent(new CardSwitchButton()));
Assert.assertFalse(ComponentOperate.ComponentType.supportComponent(new CardAddButton()));
Assert.assertFalse(ComponentOperate.ComponentType.supportComponent(new WAbsoluteBodyLayout()));
}
}

30
designer-form/src/test/java/com/fr/design/mainframe/template/info/JFormProcessInfoTest.java

@ -6,6 +6,7 @@ import com.fr.form.ui.CardSwitchButton;
import com.fr.form.ui.ChartEditor;
import com.fr.form.ui.ElementCaseEditor;
import com.fr.form.ui.FreeButton;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WBorderLayout;
import com.fr.form.ui.container.WCardLayout;
@ -142,8 +143,37 @@ public class JFormProcessInfoTest {
JSONArray ja = jFormProcessInfo.getComponentsInfo();
Assert.assertEquals(2, ja.size());
Reflect.on(jFormProcessInfo).call("addComponentCreateInfo", new ComponentCreateOperate(button1).toJSONObject());
FreeButton button3 = new FreeButton();
Reflect.on(jFormProcessInfo).call("addComponentRemoveInfo", new ComponentDeleteOperate(button3).toJSONObject());
Assert.assertEquals(1, jFormProcessInfo.getComponentsInfo().size());
ja = jFormProcessInfo.getComponentsInfo();
Assert.assertEquals(0, ja.size());
}
@Test
public void testGetWidgetCount() {
Form form = new Form();
WBorderLayout borderLayout = new WBorderLayout();
form.setContainer(borderLayout);
WFitLayout fitLayout = new WFitLayout();
borderLayout.addCenter(fitLayout);
fitLayout.addWidget(new FreeButton());
fitLayout.addWidget(new ElementCaseEditor());
JFormProcessInfo jFormProcessInfo = new JFormProcessInfo(form);
Assert.assertEquals(2, jFormProcessInfo.getWidgetCount());
fitLayout.addWidget(new ChartEditor());
Assert.assertEquals(3, jFormProcessInfo.getWidgetCount());
fitLayout.addWidget(new WAbsoluteBodyLayout());
Assert.assertEquals(3, jFormProcessInfo.getWidgetCount());
fitLayout.addWidget(new CardSwitchButton());
Assert.assertEquals(3, jFormProcessInfo.getWidgetCount());
fitLayout.addWidget(new ChartEditor());
Assert.assertEquals(4, jFormProcessInfo.getWidgetCount());
}
}

180
designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java

@ -1,5 +1,5 @@
/**
*
*
*/
package com.fr.design.cell.editor;
@ -8,6 +8,7 @@ import com.fr.base.BaseUtils;
import com.fr.base.Utils;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.form.util.FontTransformUtil;
import com.fr.design.formula.FormulaFactory;
import com.fr.design.formula.UIFormula;
import com.fr.design.gui.ibutton.UIButton;
@ -21,7 +22,6 @@ import com.fr.design.style.color.UIToolbarColorButton;
import com.fr.general.FRFont;
import com.fr.log.FineLoggerFactory;
import com.fr.report.cell.cellattr.core.RichTextConverter;
import com.fr.stable.Constants;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
@ -71,17 +71,17 @@ public class RichTextToolBar extends BasicPane{
private UIToggleButton superPane;
private UIToggleButton subPane;
private UIToggleButton formulaPane;
//外部传进来的
private RichTextEditingPane textPane;
public RichTextToolBar() {
this.initComponents();
}
public RichTextToolBar(RichTextEditingPane textPane) {
this.textPane = textPane;
this.initComponents();
}
@ -96,14 +96,14 @@ public class RichTextToolBar extends BasicPane{
//添加到工具栏
addToToolBar();
}
private void initAllButton(){
fontNameComboBox = new UIComboBox(Utils.getAvailableFontFamilyNames4Report());
fontNameComboBox.setPreferredSize(new Dimension(144, 20));
fontSizeComboBox = new UIComboBox(FRFontPane.getFontSizes());
colorSelectPane = new UIToolbarColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/foreground.png"));
colorSelectPane.set4Toolbar();
bold = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png"));
italic = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png"));
underline = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/underline.png"));
@ -120,7 +120,7 @@ public class RichTextToolBar extends BasicPane{
//绑定监听器
bindListener();
}
private void setAllButtonStyle(){
setButtonStyle(bold);
setButtonStyle(italic);
@ -129,7 +129,7 @@ public class RichTextToolBar extends BasicPane{
setButtonStyle(superPane);
setButtonStyle(formulaPane);
}
private void setButtonStyle(UIButton button){
button.setNormalPainted(false);
button.setBackground(null);
@ -137,10 +137,10 @@ public class RichTextToolBar extends BasicPane{
button.setPreferredSize(BUTTON_SIZE);
button.setBorderPaintedOnlyWhenPressed(true);
}
private void addToToolBar(){
this.setLayout(new FlowLayout(FlowLayout.LEFT));
this.add(fontNameComboBox);
this.add(fontSizeComboBox);
this.add(bold);
@ -151,14 +151,14 @@ public class RichTextToolBar extends BasicPane{
this.add(subPane);
this.add(formulaPane);
}
private void bindListener(){
FRFont defaultFont = (this.textPane != null) ? FRFont.getInstance(this.textPane.getFont()) : RichTextPane.DEFAUL_FONT;
fontNameComboBox.addItemListener(fontNameItemListener);
fontNameComboBox.setSelectedItem(defaultFont.getFontName());
fontSizeComboBox.addItemListener(fontSizeItemListener);
fontSizeComboBox.setSelectedItem(scaleDown(defaultFont.getSize()));
bold.addActionListener(blodChangeAction);
italic.addActionListener(itaChangeAction);
underline.addActionListener(underlineChangeAction);
@ -166,7 +166,7 @@ public class RichTextToolBar extends BasicPane{
superPane.addActionListener(superChangeAction);
colorSelectPane.addColorChangeListener(colorChangeAction);
formulaPane.addActionListener(formulaActionListener);
//选中文字的监听器
textPane.addCaretListener(textCareListener);
textPane.addMouseListener(setMouseCurrentStyle);
@ -192,32 +192,32 @@ public class RichTextToolBar extends BasicPane{
subPane.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Sub_Script"));
formulaPane.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula"));
}
/**
* 移除输入监听
* 用于populate时, 插入字符串, 那时不需要插入监听
*
*
*
* @date 2015-1-5-下午5:13:04
*
*
*/
public void removeInputListener(){
this.textPane.getDocument().removeDocumentListener(inputListener);
}
/**
* 增加输入监听事件
*
*
*
* @date 2015-1-5-下午5:13:26
*
*
*/
public void addInputListener(){
this.textPane.getDocument().addDocumentListener(inputListener);
}
private ActionListener blodChangeAction = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean isBold = RichTextToolBar.this.bold.isSelected();
@ -227,9 +227,9 @@ public class RichTextToolBar extends BasicPane{
setCharacterAttributes(RichTextToolBar.this.textPane, attr, false);
}
};
private ActionListener itaChangeAction = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean isIta = RichTextToolBar.this.italic.isSelected();
@ -239,9 +239,9 @@ public class RichTextToolBar extends BasicPane{
setCharacterAttributes(RichTextToolBar.this.textPane, attr, false);
}
};
private ActionListener underlineChangeAction = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean isUnder = RichTextToolBar.this.underline.isSelected();
@ -252,7 +252,7 @@ public class RichTextToolBar extends BasicPane{
}
};
private ActionListener subChangeAction = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean isSub = RichTextToolBar.this.subPane.isSelected();
@ -263,7 +263,7 @@ public class RichTextToolBar extends BasicPane{
}
};
private ActionListener superChangeAction = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean isSuper = RichTextToolBar.this.superPane.isSelected();
@ -273,7 +273,7 @@ public class RichTextToolBar extends BasicPane{
setCharacterAttributes(RichTextToolBar.this.textPane, attr, false);
}
};
private ChangeListener colorChangeAction = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
@ -285,13 +285,13 @@ public class RichTextToolBar extends BasicPane{
setCharacterAttributes(RichTextToolBar.this.textPane, attr, false);
}
};
// 设置文本区选择文本的样式
private void setCharacterAttributes(JEditorPane editor, AttributeSet attr,
boolean replace) {
//注意不要失焦
textPane.requestFocus();
// 取得选择文本的起始位置和结束位置
int start = editor.getSelectionStart();
int end = editor.getSelectionEnd();
@ -303,19 +303,19 @@ public class RichTextToolBar extends BasicPane{
doc.setCharacterAttributes(start, end - start, attr, replace);
}
}
private ItemListener fontSizeItemListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
int fontSize = (Integer) RichTextToolBar.this.fontSizeComboBox.getSelectedItem();
fontSize = scaleUp(fontSize);
fontSize= scaleUp(fontSize);
// 调用setCharacterAttributes函数设置文本区选择文本的字体
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setFontSize(attr, fontSize);
setCharacterAttributes(RichTextToolBar.this.textPane, attr, false);
}
};
private ItemListener fontNameItemListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
@ -326,7 +326,7 @@ public class RichTextToolBar extends BasicPane{
setCharacterAttributes(RichTextToolBar.this.textPane, attr, false);
}
};
private ActionListener formulaActionListener = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
final UIFormula formulaPane = FormulaFactory.createFormulaPane();
@ -348,7 +348,7 @@ public class RichTextToolBar extends BasicPane{
}).setVisible(true);
}
};
private int roundUp(double num){
String numStr = Double.toString(num);
numStr = new BigDecimal(numStr).setScale(0, BigDecimal.ROUND_HALF_UP).toString();
@ -356,7 +356,7 @@ public class RichTextToolBar extends BasicPane{
}
private CaretListener textCareListener = new CaretListener() {
//根据选中部分的文字样式, 来动态显示工具栏上按钮的状态
private void setSelectedCharStyle(int start, int end, StyledDocument doc){
boolean isBold = true;
@ -367,11 +367,11 @@ public class RichTextToolBar extends BasicPane{
String fontName_1st = null;
int fontSize_1st = 0;
Color fontColor_1st = null;
for (int i = start; i < end; i++) {
Element ele = doc.getCharacterElement(i);
AttributeSet attrs = ele.getAttributes();
//粗体
isBold = isBold && StyleConstants.isBold(attrs);
//斜体
@ -382,22 +382,22 @@ public class RichTextToolBar extends BasicPane{
isSubscript = isSubscript && StyleConstants.isSubscript(attrs);
//上标
isSuperscript = isSuperscript && StyleConstants.isSuperscript(attrs);
if(i == start){
fontName_1st = (String) attrs.getAttribute(StyleConstants.FontFamily);
fontSize_1st = (Integer) attrs.getAttribute(StyleConstants.FontSize);
fontName_1st = (String) attrs.getAttribute(StyleConstants.FontFamily);
fontSize_1st = (Integer) attrs.getAttribute(StyleConstants.FontSize);
fontColor_1st = (Color) attrs.getAttribute(StyleConstants.Foreground);
fontColor_1st = fontColor_1st == null ? Color.BLACK : fontColor_1st;
}
}
setButtonSelected(isBold, isItalic, isUnderline, isSubscript, isSuperscript,
setButtonSelected(isBold, isItalic, isUnderline, isSubscript, isSuperscript,
fontName_1st, fontSize_1st, fontColor_1st);
}
//动态显示工具栏上按钮的状态
private void setButtonSelected(boolean isBold, boolean isItalic, boolean isUnderline,
boolean isSubscript, boolean isSuperscript, String fontName_1st,
private void setButtonSelected(boolean isBold, boolean isItalic, boolean isUnderline,
boolean isSubscript, boolean isSuperscript, String fontName_1st,
int fontSize_1st, Color fontColor_1st){
bold.setSelected(isBold);
italic.setSelected(isItalic);
@ -412,75 +412,75 @@ public class RichTextToolBar extends BasicPane{
fontSizeComboBox.addItemListener(fontSizeItemListener);
selectColorPane(fontColor_1st);
}
private void selectColorPane(Color color){
colorSelectPane.removeColorChangeListener(colorChangeAction);
colorSelectPane.setColor(color);
colorSelectPane.addColorChangeListener(colorChangeAction);
}
@Override
public void caretUpdate(CaretEvent e) {
StyledDocument doc = (StyledDocument) textPane.getDocument();
// 取得选择文本的起始位置和结束位置
int start = textPane.getSelectionStart();
int end = textPane.getSelectionEnd();
//如果没有选定字符
if(end == start){
return;
}
setSelectedCharStyle(start, end, doc);
}
};
//设置当前光标位样式
private MouseListener setMouseCurrentStyle = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
StyledDocument doc = (StyledDocument) textPane.getDocument();
// 取得选择文本的起始位置和结束位置
int start = textPane.getSelectionStart();
int end = textPane.getSelectionEnd();
if(start != end){
return;
}
setToLastCharStyle(end, doc);
}
//如果默认不选字符, 那么设置为最后一个字符的样式
private void setToLastCharStyle(int end, StyledDocument doc){
if(textPane.isUpdating()){
return;
}
//取前一个字符的样式
Element ele = doc.getCharacterElement(end - 1);
AttributeSet attrs = ele.getAttributes();
populateToolBar(attrs);
}
};
/**
* 从样式中更新工具栏上的按钮状态
*
*
* @param attrs 样式
*
*
*
* @date 2015-1-5-下午5:12:33
*
*
*/
public void populateToolBar(AttributeSet attrs){
int size = scaleDown(StyleConstants.getFontSize(attrs));
fontNameComboBox.setSelectedItem(StyleConstants.getFontFamily(attrs));
fontSizeComboBox.setSelectedItem(size);
bold.setSelected(StyleConstants.isBold(attrs));
italic.setSelected(StyleConstants.isItalic(attrs));
underline.setSelected(StyleConstants.isUnderline(attrs));
@ -491,31 +491,23 @@ public class RichTextToolBar extends BasicPane{
colorSelectPane.setColor(foreGround);
colorSelectPane.repaint();
}
//pt转为px =*4/3
private int scaleUp(int fontSize){
return scale(fontSize, true);
private int scaleUp(int fontSize) {
return (int) FontTransformUtil.pt2px(fontSize);
}
//px转pt = *3/4
private int scaleDown(int fontSize){
return scale(fontSize, false);
}
private int scale(int fontSize, boolean isUp){
double dpi96 = Constants.FR_PAINT_RESOLUTION;
double dpi72 = Constants.DEFAULT_FONT_PAINT_RESOLUTION;
double scale = isUp ? (dpi96 / dpi72) : (dpi72 / dpi96);
return roundUp(fontSize * scale);
private int scaleDown(int fontSize) {
return (int) FontTransformUtil.px2pt(fontSize);
}
private DocumentListener inputListener = new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
//标志正在更新内容
@ -523,7 +515,7 @@ public class RichTextToolBar extends BasicPane{
final MutableAttributeSet attr = updateStyleFromToolBar();
final int start = textPane.getSelectionStart();
int end = textPane.getSelectionEnd();
if (start != end) {
textPane.finishUpdating();
return;
@ -538,19 +530,19 @@ public class RichTextToolBar extends BasicPane{
}
});
}
//根据Style来显示populate按钮
private void changeContentStyle(int start, MutableAttributeSet attr){
changeContentStyle(start, attr, 1);
}
private void changeContentStyle(int start, MutableAttributeSet attr, int contentLength){
// 将所选文本设置为新的样式,replace为false表示不覆盖原有的样式
StyledDocument doc = (StyledDocument) textPane.getDocument();
doc.setCharacterAttributes(start, contentLength, attr, false);
textPane.finishUpdating();
}
//将界面上的设置赋值给输入的字符
private MutableAttributeSet updateStyleFromToolBar(){
final boolean isBold = bold.isSelected();
@ -561,7 +553,7 @@ public class RichTextToolBar extends BasicPane{
final String fontName = (String) fontNameComboBox.getSelectedItem();
final int fontSize = scaleUp((Integer) fontSizeComboBox.getSelectedItem());
final Color foreGround = colorSelectPane.getColor() == null ? Color.BLACK : colorSelectPane.getColor();
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setBold(attr, isBold);
StyleConstants.setItalic(attr, isItalic);
@ -571,7 +563,7 @@ public class RichTextToolBar extends BasicPane{
StyleConstants.setForeground(attr, foreGround);
StyleConstants.setFontFamily(attr, fontName);
StyleConstants.setFontSize(attr, fontSize);
return attr;
}
@ -581,7 +573,7 @@ public class RichTextToolBar extends BasicPane{
private int inputStart = NOT_INITED;
private static final int JDK_6 = 6;
private static final int JDK_7 = 7;
@Override
public void changedUpdate(DocumentEvent e) {
//这边需要注意, jdk1.6和1.7对于输入法的处理逻辑不一样, jdk6时直接在输入法中输入一大段中文
@ -595,7 +587,7 @@ public class RichTextToolBar extends BasicPane{
StyledDocument doc = (StyledDocument) textPane.getDocument();
final String content;
initFlag(doc);
final int start = textPane.getSelectionStart();
final int inputLen = start - inputStart;
//检测输入内容
@ -604,7 +596,7 @@ public class RichTextToolBar extends BasicPane{
} catch (BadLocationException e1) {
return;
}
//中文输入法, 默认输入字符会被输入法的框截取住, jtextpane得到是一个空格, 此时不做处理
if(StringUtils.isBlank(content) || inputLen <= 0){
return;
@ -613,7 +605,7 @@ public class RichTextToolBar extends BasicPane{
setContentStyle(inputLen);
}
}
private void setContentStyle(final int inputLen){
//缓存下Start, 下面要用来设置样式
final int _start = inputStart;
@ -632,15 +624,15 @@ public class RichTextToolBar extends BasicPane{
}
});
}
private boolean isUpdating(){
return inputStart == UPDATING;
}
private void startUpdating(){
inputStart = UPDATING;
}
//初始标记状态, 用于记录中文输入法多个字符同时输入的问题
private void initFlag(StyledDocument doc){
if(inputStart != NOT_INITED){
@ -648,7 +640,7 @@ public class RichTextToolBar extends BasicPane{
}
inputStart = textPane.getSelectionStart() - 1;
}
//重置标记状态
private void resetFlag(){
inputStart = NOT_INITED;

10
designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java

@ -918,9 +918,7 @@ public abstract class ElementCasePane<T extends TemplateElementCase> extends Tar
actionMap.put("paste", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
if (paste()) {
QuickEditorRegion.getInstance().populate(getCurrentEditor());
fireTargetModified();
QuickEditorRegion.getInstance().populate(getCurrentEditor());
afterPasteAction();
}
}
});
@ -942,6 +940,12 @@ public abstract class ElementCasePane<T extends TemplateElementCase> extends Tar
});
}
protected void afterPasteAction() {
QuickEditorRegion.getInstance().populate(getCurrentEditor());
fireTargetModified();
QuickEditorRegion.getInstance().populate(getCurrentEditor());
}
/**
* 是否列表头可见
*

7
designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java

@ -38,6 +38,7 @@ import com.fr.stable.ArrayUtils;
import javax.swing.JPanel;
import java.awt.BorderLayout;
/**
* 类说明: 设计面板中最上方的"插入" "单元格"下拉列表Menu模块.
*
@ -113,6 +114,12 @@ public class ElementCasePaneDelegate extends ElementCasePane<WorkSheet> {
}
}
@Override
protected void afterPasteAction() {
refreshPropertyPanes();
repaint();
}
@Override
protected boolean supportRepeatedHeaderFooter() {
return true;

15
designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCasePaneDelegate.java

@ -1,8 +1,5 @@
package com.fr.design.mainframe.form;
import javax.swing.JComponent;
import javax.swing.JPanel;
import com.fr.design.DesignState;
import com.fr.design.actions.UpdateAction;
import com.fr.design.actions.core.ActionFactory;
@ -11,7 +8,6 @@ import com.fr.design.actions.form.FormECColumnsAction;
import com.fr.design.actions.form.FormECFrozenAction;
import com.fr.design.event.TargetModifiedEvent;
import com.fr.design.event.TargetModifiedListener;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.gui.frpane.HyperlinkGroupPane;
import com.fr.design.mainframe.*;
import com.fr.design.mainframe.cell.QuickEditorRegion;
@ -22,13 +18,14 @@ import com.fr.design.menu.ToolBarDef;
import com.fr.design.present.ConditionAttributesGroupPane;
import com.fr.form.main.Form;
import com.fr.grid.Grid;
import com.fr.js.NameJavaScriptGroup;
import com.fr.page.ReportSettingsProvider;
import com.fr.report.elementcase.TemplateElementCase;
import com.fr.report.worksheet.FormElementCase;
import com.fr.design.selection.SelectionEvent;
import com.fr.design.selection.SelectionListener;
import javax.swing.JComponent;
import javax.swing.JPanel;
/**
*/
public class FormElementCasePaneDelegate extends ElementCasePane<FormElementCase>{
@ -72,6 +69,12 @@ public class FormElementCasePaneDelegate extends ElementCasePane<FormElementCase
EastRegionContainerPane.getInstance().updateCellElementState(isSelectedOneCell());
}
@Override
protected void afterPasteAction() {
refreshPropertyPanes();
repaint();
}
@Override
protected boolean supportRepeatedHeaderFooter() {
return true;

13
designer-realize/src/main/java/com/fr/design/mainframe/template/info/JWorkBookProcessInfo.java

@ -101,6 +101,9 @@ public class JWorkBookProcessInfo extends TemplateProcessInfo<WorkBook> {
for (int i = 0; i < columnLength; i++) {
for (int j = 0; j < rowLength; j++) {
TemplateCellElement templateCellElement = templateElementCase.getTemplateCellElement(i, j);
if (templateCellElement == null) {
continue;
}
Object value = templateCellElement.getValue();
if (isTestCell(value, templateCellElement.getStyle())) {
return true;
@ -129,20 +132,20 @@ public class JWorkBookProcessInfo extends TemplateProcessInfo<WorkBook> {
}
return parameterAttr.getParameterUI() != null;
}
@Override
public JSONArray getComponentsInfo() {
return new JSONArray();
}
@Override
public JSONArray getReuseCmpList() {
return JSONArray.create();
}
@Override
public void updateTemplateOperationInfo(TemplateOperate templateOption) {
}
}

3
designer-realize/src/main/java/com/fr/design/report/RichTextPane.java

@ -1,6 +1,7 @@
package com.fr.design.report;
import com.fr.base.BaseFormula;
import com.fr.base.FRContext;
import com.fr.base.Style;
import com.fr.design.cell.editor.RichTextToolBar;
import com.fr.design.dialog.BasicPane;
@ -36,7 +37,7 @@ public class RichTextPane extends BasicPane {
//12号字体有个奇怪的bug, 字体下部分渲染会截断一部分, 换其他字体没问题, 字体改大小也没问题.
//直接弄个jtexarea放到jframe里也有同样问题, 不知道是字体渲染bug还是jdk问题
public static final FRFont DEFAUL_FONT = FRFont.getInstance().applySize(13);
public static final FRFont DEFAUL_FONT = FRContext.getDefaultValues().getFRFont().applySize(13);
private RichTextEditingPane textPane;
//用于populate时动态更新按钮

5
designer-realize/src/main/java/com/fr/start/LifecycleFatalErrorHandler.java

@ -49,10 +49,7 @@ public class LifecycleFatalErrorHandler {
public void handle(FineLifecycleFatalError fatal) {
SplashContext.getInstance().hide();
ProcessEventPipe eventPipe = FineProcessContext.getParentPipe();
if (eventPipe != null) {
eventPipe.fire(new CarryMessageEvent(ReportState.STOP.getValue()));
}
FineProcessContext.getParentPipe().fire(new CarryMessageEvent(ReportState.STOP.getValue()));
map.get(fatal.getErrorType()).handle(fatal);
}

Loading…
Cancel
Save