75 changed files with 1235 additions and 225 deletions
@ -0,0 +1,25 @@ |
|||||||
|
package com.fr.design.editlock; |
||||||
|
|
||||||
|
|
||||||
|
import com.fr.report.LockItem; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Yvan |
||||||
|
* @version 10.0 |
||||||
|
* Created by Yvan on 2021/1/20 |
||||||
|
* 定义数据连接的checker |
||||||
|
*/ |
||||||
|
public class ConnectionLockChangeChecker extends EditLockChangeChecker{ |
||||||
|
|
||||||
|
private static class Holder { |
||||||
|
private static final ConnectionLockChangeChecker INSTANCE = new ConnectionLockChangeChecker(); |
||||||
|
} |
||||||
|
|
||||||
|
public static ConnectionLockChangeChecker getInstance() { |
||||||
|
return ConnectionLockChangeChecker.Holder.INSTANCE; |
||||||
|
} |
||||||
|
|
||||||
|
public ConnectionLockChangeChecker() { |
||||||
|
this.lockItem = LockItem.CONNECTION; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,73 @@ |
|||||||
|
package com.fr.design.editlock; |
||||||
|
|
||||||
|
import com.fr.concurrent.NamedThreadFactory; |
||||||
|
import com.fr.design.ui.util.UIUtil; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.workspace.WorkContext; |
||||||
|
import com.fr.workspace.server.lock.editlock.EditLockOperator; |
||||||
|
import com.fr.report.LockItem; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.concurrent.Executors; |
||||||
|
import java.util.concurrent.ScheduledExecutorService; |
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Yvan |
||||||
|
* @version 10.0 |
||||||
|
* Created by Yvan on 2021/1/19 |
||||||
|
* 判断当前设计器在远程设计服务器中的锁状态是否发生了改变 |
||||||
|
*/ |
||||||
|
public abstract class EditLockChangeChecker { |
||||||
|
|
||||||
|
private static final int INTERVAL = 30000; |
||||||
|
private ScheduledExecutorService scheduler; |
||||||
|
protected LockItem lockItem; |
||||||
|
private boolean isLocked = false; |
||||||
|
private List<EditLockChangeListener> listeners = new ArrayList<>(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 轮询任务,如果是远程设计状态,每隔30s查询一次相应lockItem的锁状态是否改变 |
||||||
|
*/ |
||||||
|
public void start() { |
||||||
|
this.scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("EditLockChangeChecker")); |
||||||
|
this.scheduler.scheduleAtFixedRate(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
// 判断是否为远程设计环境
|
||||||
|
if (!WorkContext.getCurrent().isLocal()) { |
||||||
|
try { |
||||||
|
EditLockOperator operator = WorkContext.getCurrent().get(EditLockOperator.class); |
||||||
|
boolean locked = operator.isLocked(lockItem); |
||||||
|
if (isLocked != locked) { |
||||||
|
isLocked = locked; |
||||||
|
fireChange(); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, 0, INTERVAL, TimeUnit.MILLISECONDS); |
||||||
|
} |
||||||
|
|
||||||
|
public void stop() { |
||||||
|
this.scheduler.shutdown(); |
||||||
|
} |
||||||
|
|
||||||
|
public void addEditLockChangeListener(EditLockChangeListener listener) { |
||||||
|
this.listeners.add(listener); |
||||||
|
} |
||||||
|
|
||||||
|
private void fireChange() { |
||||||
|
UIUtil.invokeLaterIfNeeded(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
for (EditLockChangeListener listener : EditLockChangeChecker.this.listeners) { |
||||||
|
listener.updateLockedState(new EditLockChangeEvent(isLocked)); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package com.fr.design.editlock; |
||||||
|
|
||||||
|
import java.util.EventObject; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Yvan |
||||||
|
* @version 10.0 |
||||||
|
* Created by Yvan on 2021/1/20 |
||||||
|
*/ |
||||||
|
public class EditLockChangeEvent extends EventObject { |
||||||
|
|
||||||
|
private boolean isLocked; |
||||||
|
|
||||||
|
/** |
||||||
|
* @param source 锁状态发生了改变,且当前锁状态就是source |
||||||
|
*/ |
||||||
|
public EditLockChangeEvent(boolean source) { |
||||||
|
super(source); |
||||||
|
this.isLocked = source; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isLocked() { |
||||||
|
return isLocked; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.fr.design.editlock; |
||||||
|
|
||||||
|
import java.util.EventListener; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Yvan |
||||||
|
* @version 10.0 |
||||||
|
* Created by Yvan on 2021/1/20 |
||||||
|
*/ |
||||||
|
public interface EditLockChangeListener extends EventListener { |
||||||
|
/** |
||||||
|
* 锁定状态改变后执行的动作 |
||||||
|
* @param event 事件 |
||||||
|
*/ |
||||||
|
void updateLockedState(EditLockChangeEvent event); |
||||||
|
} |
@ -0,0 +1,81 @@ |
|||||||
|
package com.fr.design.editlock; |
||||||
|
|
||||||
|
import com.fr.base.svg.IconUtils; |
||||||
|
import com.fr.base.svg.SVGLoader; |
||||||
|
import com.fr.design.dialog.FineJOptionPane; |
||||||
|
import com.fr.design.i18n.Toolkit; |
||||||
|
import com.fr.design.mainframe.DesignerContext; |
||||||
|
import com.fr.general.IOUtils; |
||||||
|
import com.fr.workspace.WorkContext; |
||||||
|
import com.fr.workspace.server.lock.editlock.EditLockOperator; |
||||||
|
import com.fr.report.LockItem; |
||||||
|
import org.jetbrains.annotations.Nullable; |
||||||
|
|
||||||
|
import javax.swing.Icon; |
||||||
|
import javax.swing.JOptionPane; |
||||||
|
import java.awt.Image; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Yvan |
||||||
|
* @version 10.0 |
||||||
|
* Created by Yvan on 2021/1/20 |
||||||
|
* 关于编辑锁定的一些常量和静态方法 |
||||||
|
*/ |
||||||
|
public class EditLockUtils { |
||||||
|
|
||||||
|
/** |
||||||
|
* 数据连接锁定标志 |
||||||
|
*/ |
||||||
|
public static final Icon CONNECTION_LOCKED_ICON = IconUtils.readIcon("/com/fr/design/images/m_web/connection_locked"); |
||||||
|
|
||||||
|
/** |
||||||
|
* 小锁图片 |
||||||
|
*/ |
||||||
|
public static final @Nullable Image LOCKED_IMAGE = SVGLoader.load("/com/fr/design/images/m_web/locked_normal.svg"); |
||||||
|
|
||||||
|
/** |
||||||
|
* 提示弹窗中的提示标志 |
||||||
|
*/ |
||||||
|
public static final Icon TOOLTIPS_ICON = IOUtils.readIcon("/com/fr/design/images/m_web/warningIcon.png"); |
||||||
|
|
||||||
|
/** |
||||||
|
* 数据连接锁定中 |
||||||
|
*/ |
||||||
|
public static final String CONNECTION_LOCKED_TOOLTIPS = Toolkit.i18nText("Fine_Designer_Remote_Design_Data_Connection_Locked"); |
||||||
|
|
||||||
|
/** |
||||||
|
* 服务器数据集锁定中 |
||||||
|
*/ |
||||||
|
public static final String SERVER_TABLEDATA_LOCKED_TOOLTIPS = Toolkit.i18nText("Fine_Designer_Remote_Design_Server_TableData_Locked"); |
||||||
|
|
||||||
|
/** |
||||||
|
* 提示弹窗中的提示信息 |
||||||
|
*/ |
||||||
|
public static final String LOCKED_MESSAGE = Toolkit.i18nText("Fine_Designer_Remote_Design_Locked_Message"); |
||||||
|
|
||||||
|
/** |
||||||
|
* 提示弹窗中的标题 |
||||||
|
*/ |
||||||
|
public static final String TOOLTIPS = Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Title_Hint"); |
||||||
|
|
||||||
|
/** |
||||||
|
* 已经被锁,跳出弹窗提示 |
||||||
|
*/ |
||||||
|
public static void showLockMessage() { |
||||||
|
FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), EditLockUtils.LOCKED_MESSAGE, EditLockUtils.TOOLTIPS, JOptionPane.INFORMATION_MESSAGE, EditLockUtils.TOOLTIPS_ICON); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean lock(LockItem lockItem) { |
||||||
|
return WorkContext.getCurrent().get(EditLockOperator.class).lock(lockItem); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean unlock(LockItem lockItem) { |
||||||
|
return WorkContext.getCurrent().get(EditLockOperator.class).unlock(lockItem); |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isLocked(LockItem lockItem) { |
||||||
|
EditLockOperator operator = WorkContext.getCurrent().get(EditLockOperator.class); |
||||||
|
// 启动过程中UILockButton初始化的时候会调用这个方法,但是此时workObjectPool中还没有对象,会报npe
|
||||||
|
return operator != null && operator.isLocked(lockItem); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
package com.fr.design.editlock; |
||||||
|
|
||||||
|
import com.fr.report.LockItem; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Yvan |
||||||
|
* @version 10.0 |
||||||
|
* Created by Yvan on 2021/1/20 |
||||||
|
* 服务器数据集的checker |
||||||
|
*/ |
||||||
|
public class ServerTableDataLockChangeChecker extends EditLockChangeChecker{ |
||||||
|
private static class Holder { |
||||||
|
private static final ServerTableDataLockChangeChecker INSTANCE = new ServerTableDataLockChangeChecker(); |
||||||
|
} |
||||||
|
|
||||||
|
public static ServerTableDataLockChangeChecker getInstance() { |
||||||
|
return ServerTableDataLockChangeChecker.Holder.INSTANCE; |
||||||
|
} |
||||||
|
|
||||||
|
public ServerTableDataLockChangeChecker() { |
||||||
|
this.lockItem = LockItem.SERVER_TABLE_DATA; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
package com.fr.design.fun; |
||||||
|
|
||||||
|
/** |
||||||
|
* 设计器生命周期接口 |
||||||
|
* |
||||||
|
* @author hades |
||||||
|
* @version 10.0 |
||||||
|
* Created by hades on 2021/1/26 |
||||||
|
*/ |
||||||
|
public interface DesignerLifecycleMonitor { |
||||||
|
|
||||||
|
String MARK_STRING = "DesignerLifecycleMonitor"; |
||||||
|
|
||||||
|
int CURRENT_LEVEL = 1; |
||||||
|
|
||||||
|
/** |
||||||
|
* 设计器启动之前 |
||||||
|
*/ |
||||||
|
void beforeStart(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 设计器启动完成 界面出现之后 |
||||||
|
*/ |
||||||
|
void afterStart(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 设计器关闭退出之前 |
||||||
|
*/ |
||||||
|
void beforeStop(); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
package com.fr.design.fun; |
||||||
|
|
||||||
|
/** |
||||||
|
* 设计器所有端口获取 |
||||||
|
* |
||||||
|
* @author hades |
||||||
|
* @version 10.0 |
||||||
|
* Created by hades on 2021/1/18 |
||||||
|
*/ |
||||||
|
public interface DesignerPortProvider { |
||||||
|
|
||||||
|
String MARK_STRING = "DesignerPortProvider"; |
||||||
|
|
||||||
|
int CURRENT_LEVEL = 1; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 设计器自身端口 |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
int messagePort(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 内置服务器端口 |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
int embeddedServerPort(); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,24 @@ |
|||||||
|
package com.fr.design.gui.frpane; |
||||||
|
|
||||||
|
import com.fr.design.gui.ispinner.UISpinner; |
||||||
|
import com.fr.design.gui.ispinner.chart.UISpinnerWithPercent; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Bjorn |
||||||
|
* @version 10.0 |
||||||
|
* Created by Bjorn on 2021-01-21 |
||||||
|
*/ |
||||||
|
public class UINumberDragPaneWithPercent extends UINumberDragPane { |
||||||
|
|
||||||
|
public UINumberDragPaneWithPercent(double minValue, double maxValue) { |
||||||
|
super(minValue, maxValue); |
||||||
|
} |
||||||
|
|
||||||
|
public UINumberDragPaneWithPercent(double minValue, double maxValue, double dierta) { |
||||||
|
super(minValue, maxValue, dierta); |
||||||
|
} |
||||||
|
|
||||||
|
protected UISpinner createUISpinner(double minValue, double maxValue, double dierta) { |
||||||
|
return new UISpinnerWithPercent(minValue, maxValue, dierta, minValue); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
package com.fr.design.gui.ibutton; |
||||||
|
|
||||||
|
import com.fr.design.editlock.EditLockChangeEvent; |
||||||
|
import com.fr.design.editlock.EditLockChangeListener; |
||||||
|
import com.fr.design.editlock.EditLockUtils; |
||||||
|
import com.fr.report.LockItem; |
||||||
|
|
||||||
|
import javax.swing.Icon; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Yvan |
||||||
|
* @version 10.0 |
||||||
|
* Created by Yvan on 2021/1/20 |
||||||
|
*/ |
||||||
|
public class UILockButton extends UIButton implements EditLockChangeListener { |
||||||
|
|
||||||
|
/** |
||||||
|
* 锁定状态图标 |
||||||
|
*/ |
||||||
|
private Icon lockedIcon; |
||||||
|
/** |
||||||
|
* 正常状态图标 |
||||||
|
*/ |
||||||
|
private Icon normalIcon; |
||||||
|
/** |
||||||
|
* 锁定状态的提示信息 |
||||||
|
*/ |
||||||
|
private String lockedTooltips; |
||||||
|
/** |
||||||
|
* 正常状态的提示信息 |
||||||
|
*/ |
||||||
|
private String normalTooltips; |
||||||
|
|
||||||
|
public UILockButton(Icon lockedIcon, Icon normalIcon, String lockedTooltips, String normalTooltips) { |
||||||
|
super(); |
||||||
|
this.lockedIcon = lockedIcon; |
||||||
|
this.normalIcon = normalIcon; |
||||||
|
this.lockedTooltips = lockedTooltips; |
||||||
|
this.normalTooltips = normalTooltips; |
||||||
|
init(); |
||||||
|
} |
||||||
|
|
||||||
|
private void init() { |
||||||
|
boolean locked = EditLockUtils.isLocked(LockItem.CONNECTION); |
||||||
|
this.setIcon(locked ? lockedIcon : normalIcon); |
||||||
|
this.setToolTipText(locked ? lockedTooltips : normalTooltips); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void updateLockedState(EditLockChangeEvent event) { |
||||||
|
this.setIcon(event.isLocked() ? lockedIcon : normalIcon); |
||||||
|
this.setToolTipText(event.isLocked() ? lockedTooltips : normalTooltips); |
||||||
|
this.repaint(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
package com.fr.design.gui.imenu; |
||||||
|
|
||||||
|
import com.fr.design.editlock.EditLockChangeEvent; |
||||||
|
import com.fr.design.editlock.EditLockChangeListener; |
||||||
|
import com.fr.report.LockItem; |
||||||
|
|
||||||
|
import javax.swing.Action; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Yvan |
||||||
|
* @version 10.0 |
||||||
|
* Created by Yvan on 2021/1/20 |
||||||
|
*/ |
||||||
|
public class UILockMenuItem extends UIMenuItem implements EditLockChangeListener { |
||||||
|
|
||||||
|
/** |
||||||
|
* 锁定状态的提示信息 |
||||||
|
*/ |
||||||
|
private String lockedTooltips; |
||||||
|
/** |
||||||
|
* 正常状态的提示信息 |
||||||
|
*/ |
||||||
|
private String normalTooltips; |
||||||
|
|
||||||
|
/** |
||||||
|
* 当前锁定项 |
||||||
|
*/ |
||||||
|
private LockItem lockItem; |
||||||
|
|
||||||
|
public UILockMenuItem(Action action, String lockedTooltips, String normalTooltips, LockItem lockItem) { |
||||||
|
super(action); |
||||||
|
this.lockedTooltips = lockedTooltips; |
||||||
|
this.normalTooltips = normalTooltips; |
||||||
|
this.lockItem = lockItem; |
||||||
|
setUI(new UILockMenuItemUI()); |
||||||
|
} |
||||||
|
|
||||||
|
public LockItem getLockItem() { |
||||||
|
return lockItem; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void updateLockedState(EditLockChangeEvent event) { |
||||||
|
this.setToolTipText(event.isLocked() ? lockedTooltips : normalTooltips); |
||||||
|
this.repaint(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
package com.fr.design.gui.imenu; |
||||||
|
|
||||||
|
import com.fr.design.editlock.EditLockUtils; |
||||||
|
|
||||||
|
import javax.swing.JMenuItem; |
||||||
|
import java.awt.Graphics; |
||||||
|
import java.awt.Rectangle; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Yvan |
||||||
|
* @version 10.0 |
||||||
|
* Created by Yvan on 2021/1/20 |
||||||
|
*/ |
||||||
|
public class UILockMenuItemUI extends UIMenuItemUI{ |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) { |
||||||
|
super.paintText(g, menuItem, textRect, text); |
||||||
|
// 除了绘制text之外,还需要画一下锁定图标
|
||||||
|
UILockMenuItem lockMenuItem = (UILockMenuItem) menuItem; |
||||||
|
if (EditLockUtils.isLocked(lockMenuItem.getLockItem())) { |
||||||
|
int width = menuItem.getWidth(); |
||||||
|
int height = menuItem.getHeight(); |
||||||
|
g.drawImage(EditLockUtils.LOCKED_IMAGE, (int) Math.round(width * 0.9), (int) Math.round(height * 0.1), 16, 16, null); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package com.fr.design.gui.ispinner.chart; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Bjorn |
||||||
|
* @version 10.0 |
||||||
|
* Created by Bjorn on 2021-01-21 |
||||||
|
*/ |
||||||
|
public class UISpinnerWithPercent extends UISpinnerWithUnit { |
||||||
|
|
||||||
|
private static final String UNIT = "%"; |
||||||
|
|
||||||
|
public UISpinnerWithPercent(double minValue, double maxValue, double dierta, double defaultValue) { |
||||||
|
super(minValue, maxValue, dierta, defaultValue, UNIT); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.fr.design.gui.ispinner.chart; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Bjorn |
||||||
|
* @version 10.0 |
||||||
|
* Created by Bjorn on 2021-01-21 |
||||||
|
*/ |
||||||
|
public class UISpinnerWithPx extends UISpinnerWithUnit { |
||||||
|
|
||||||
|
private static final String UNIT = "px"; |
||||||
|
|
||||||
|
public UISpinnerWithPx(double defaultValue) { |
||||||
|
this(0, Double.MAX_VALUE, 1, defaultValue); |
||||||
|
} |
||||||
|
|
||||||
|
public UISpinnerWithPx(double minValue, double maxValue, double dierta, double defaultValue) { |
||||||
|
super(minValue, maxValue, dierta, defaultValue, UNIT); |
||||||
|
this.getTextField().canFillNegativeNumber(false); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.fr.design.gui.ispinner.chart; |
||||||
|
|
||||||
|
import com.fr.design.gui.ispinner.UISpinner; |
||||||
|
import com.fr.design.gui.itextfield.UINumberField; |
||||||
|
import com.fr.design.gui.itextfield.UINumberFieldWithUnit; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Bjorn |
||||||
|
* @version 10.0 |
||||||
|
* Created by Bjorn on 2021-01-20 |
||||||
|
*/ |
||||||
|
public class UISpinnerWithUnit extends UISpinner { |
||||||
|
|
||||||
|
private String unit; |
||||||
|
|
||||||
|
public UISpinnerWithUnit(double minValue, double maxValue, double dierta, double defaultValue, String unit) { |
||||||
|
this.unit = unit; |
||||||
|
init(minValue, maxValue, dierta); |
||||||
|
getTextField().setValue(defaultValue); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected UINumberField initNumberField() { |
||||||
|
return new UINumberFieldWithUnit(3, unit); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,114 @@ |
|||||||
|
package com.fr.design.gui.itextfield; |
||||||
|
|
||||||
|
import com.fr.base.Utils; |
||||||
|
import com.fr.general.ComparatorUtils; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.Comparator; |
||||||
|
import java.util.LinkedHashSet; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Set; |
||||||
|
import java.awt.Toolkit; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Bjorn |
||||||
|
* @version 10.0 |
||||||
|
* Created by Bjorn on 2021-01-20 |
||||||
|
* 这个控件不会限制输入的数字大小,但是同样不允许输入数字之外的字符 |
||||||
|
*/ |
||||||
|
public class UINumberFieldWithUnit extends UINumberField { |
||||||
|
|
||||||
|
private String unit; |
||||||
|
|
||||||
|
private List<String> unitList = new ArrayList<>(); |
||||||
|
|
||||||
|
public UINumberFieldWithUnit(int columns, String unit) { |
||||||
|
super(columns); |
||||||
|
this.unit = unit; |
||||||
|
initUnitList(); |
||||||
|
} |
||||||
|
|
||||||
|
//对单位的字符进行组合
|
||||||
|
private void initUnitList() { |
||||||
|
char[] chars = unit.toCharArray(); |
||||||
|
Set<String> set = new LinkedHashSet<>(); |
||||||
|
initUnitList(chars, 0, StringUtils.EMPTY, set); |
||||||
|
unitList.addAll(set); |
||||||
|
Collections.sort(unitList, Comparator.comparing(String::length)); |
||||||
|
} |
||||||
|
|
||||||
|
private void initUnitList(char[] chars, int index, String str, Set<String> set) { |
||||||
|
if (index == chars.length) { |
||||||
|
return; |
||||||
|
} |
||||||
|
for (int i = index; i < chars.length; i++) { |
||||||
|
String newStr = str + chars[i]; |
||||||
|
set.add(newStr); |
||||||
|
initUnitList(chars, i + 1, newStr, set); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void setFieldDocument() { |
||||||
|
setDocument(new NumberDocumentNoLimit()); |
||||||
|
} |
||||||
|
|
||||||
|
public void setValue(double value) { |
||||||
|
this.setText(Utils.doubleToString(value) + unit); |
||||||
|
} |
||||||
|
|
||||||
|
public double getValue() throws NumberFormatException { |
||||||
|
try { |
||||||
|
String text = this.getText(); |
||||||
|
if (StringUtils.isEmpty(text)) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
return Double.parseDouble(text.replace(getEndString(text), StringUtils.EMPTY)); |
||||||
|
} catch (NumberFormatException numberFormatException) { |
||||||
|
return UINumberField.ERROR_VALUE; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private String getEndString(String text) { |
||||||
|
int size = unitList.size(); |
||||||
|
for (int i = size - 1; i >= 0; i--) { |
||||||
|
String unit = unitList.get(i); |
||||||
|
if (text.endsWith(unit)) { |
||||||
|
return unit; |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
return StringUtils.EMPTY; |
||||||
|
} |
||||||
|
|
||||||
|
class NumberDocumentNoLimit extends NumberDocument { |
||||||
|
|
||||||
|
public boolean checkString(int offset, String s, String str) { |
||||||
|
return (ComparatorUtils.equals(s, "F") |
||||||
|
|| ComparatorUtils.equals(s, "f") |
||||||
|
|| ComparatorUtils.equals(s, "D") |
||||||
|
|| ComparatorUtils.equals(s, "d") |
||||||
|
|| (ComparatorUtils.equals(s, ".") && getMaxDecimalLength() == 0)); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
protected boolean isOverMaxOrMinValue(String strIntPart, String strDecPart, String strNew) { |
||||||
|
return super.isOverMaxOrMinValue(strIntPart, strDecPart, strNew.replaceFirst(getEndString(strNew), StringUtils.EMPTY)); |
||||||
|
} |
||||||
|
|
||||||
|
protected boolean checkNumber(String strValue, boolean isMinus) { |
||||||
|
try { |
||||||
|
if (ComparatorUtils.equals(strValue, StringUtils.EMPTY) || ComparatorUtils.equals(strValue, "-")) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
Double.parseDouble(strValue.replaceFirst(getEndString(strValue), StringUtils.EMPTY)); |
||||||
|
} catch (Exception e) { |
||||||
|
Toolkit.getDefaultToolkit().beep(); |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
package com.fr.design.monitor; |
||||||
|
|
||||||
|
import com.fr.design.fun.DesignerLifecycleMonitor; |
||||||
|
import com.fr.stable.bridge.StableFactory; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author hades |
||||||
|
* @version 10.0 |
||||||
|
* Created by hades on 2021/1/27 |
||||||
|
*/ |
||||||
|
public class DesignerLifecycleMonitorContext { |
||||||
|
|
||||||
|
private static DesignerLifecycleMonitor monitor; |
||||||
|
|
||||||
|
static { |
||||||
|
DesignerLifecycleMonitor designerLifecycleMonitor = StableFactory.getMarkedInstanceObjectFromClass(DesignerLifecycleMonitor.MARK_STRING, DesignerLifecycleMonitor.class); |
||||||
|
if (designerLifecycleMonitor != null) { |
||||||
|
monitor = designerLifecycleMonitor; |
||||||
|
} else { |
||||||
|
monitor = new EmptyDesignerLifecycleMonitor(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static DesignerLifecycleMonitor getMonitor() { |
||||||
|
return monitor; |
||||||
|
} |
||||||
|
|
||||||
|
static class EmptyDesignerLifecycleMonitor implements DesignerLifecycleMonitor { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void beforeStart() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void afterStart() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void beforeStop() { |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
package com.fr.design.port; |
||||||
|
|
||||||
|
import com.fr.design.fun.DesignerPortProvider; |
||||||
|
import com.fr.stable.bridge.StableFactory; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author hades |
||||||
|
* @version 10.0 |
||||||
|
* Created by hades on 2021/1/27 |
||||||
|
*/ |
||||||
|
public class DesignerPortContext { |
||||||
|
|
||||||
|
private static int messagePort = -1; |
||||||
|
|
||||||
|
private static int embeddedServerPort = -1; |
||||||
|
|
||||||
|
static { |
||||||
|
DesignerPortProvider designerPortProvider = StableFactory.getMarkedInstanceObjectFromClass(DesignerPortProvider.MARK_STRING, DesignerPortProvider.class); |
||||||
|
if (designerPortProvider != null) { |
||||||
|
messagePort = designerPortProvider.messagePort(); |
||||||
|
embeddedServerPort = designerPortProvider.embeddedServerPort(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static int getMessagePort() { |
||||||
|
return messagePort; |
||||||
|
} |
||||||
|
|
||||||
|
public static int getEmbeddedServerPort() { |
||||||
|
return embeddedServerPort; |
||||||
|
} |
||||||
|
} |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 959 B |
After Width: | Height: | Size: 1.2 KiB |
Loading…
Reference in new issue