Browse Source
* 'feature/10.0' of ssh://code.fineres.com:7999/~fanglei/design10.0: (37 commits) REPORT-55795 【10.0.19】报错规范——设计器远程设计连接部分 fix 单元测试 无jira 解决冲突 错误提交回退 无jira 解决冲突 错误提交回退 REPORT-55795 【10.0.19】报错规范——设计器远程设计连接部分 CHART-20142 所有抽出去的protected public方法 都保留 因为可能被插件或者oem什么的用到 REPORT-56080 图表双击无法进入图表编辑页 REPORT-55060 数据集预览支持复制 REPORT-55060 数据集预览支持复制 REPORT-55060 数据集预览支持复制 CHART-18786 feat:表格组件 解决冲突 无jira 解决冲突 update feat:其他组合图不需要类型界面,自定义组合图需要 refactor:plugin use 10.0 not compatible xxx copy from 10.0 code feat:类型和特性面板如果没有其他设置项 则拿掉 merge merge:REPORT-49986 【10.0.16】性能优化之阻塞EDT线程时优化 fix merge:REPORT-51958 远程环境检测及同步 merge:REPORT-53626 设计器启动异常 merge:REPORT-53229 补上空格 ...feature/10.0
方磊
3 years ago
90 changed files with 2207 additions and 1072 deletions
@ -0,0 +1,24 @@
|
||||
package com.fr.design.base.clipboard; |
||||
|
||||
import java.util.List; |
||||
|
||||
public class ClipboardHelper { |
||||
public static String formatExcelString(List<List<Object>> table) { |
||||
StringBuffer stringBuffer = new StringBuffer(); |
||||
|
||||
for (int row = 0; row < table.size(); row++) { |
||||
List<Object> rowValue = table.get(row); |
||||
for (int col = 0; col < rowValue.size(); col++) { |
||||
Object cell = rowValue.get(col); |
||||
stringBuffer.append(cell); |
||||
if (col != rowValue.size() - 1) { |
||||
stringBuffer.append("\t"); |
||||
} |
||||
} |
||||
if (row != table.size() - 1) { |
||||
stringBuffer.append("\n"); |
||||
} |
||||
} |
||||
return stringBuffer.toString(); |
||||
} |
||||
} |
@ -0,0 +1,203 @@
|
||||
package com.fr.design.data.datapane.preview; |
||||
|
||||
import com.fr.design.base.clipboard.ClipboardHelper; |
||||
import com.fr.design.gui.itable.SortableJTable; |
||||
import com.fr.design.gui.itable.TableSorter; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.os.OperatingSystem; |
||||
|
||||
import javax.swing.table.TableCellRenderer; |
||||
import java.awt.*; |
||||
import java.awt.datatransfer.Clipboard; |
||||
import java.awt.datatransfer.StringSelection; |
||||
import java.awt.datatransfer.Transferable; |
||||
import java.awt.event.KeyAdapter; |
||||
import java.awt.event.KeyEvent; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.util.ArrayList; |
||||
import java.util.Collections; |
||||
import java.util.Comparator; |
||||
|
||||
public class CopyableJTable extends SortableJTable { |
||||
|
||||
//区域选中用到的定位数据
|
||||
public int startRow = -1; |
||||
public int startCol = -1; |
||||
public int endRow = -1; |
||||
public int endCol = -1; |
||||
//单元格不连续多选用到的定位数据
|
||||
java.util.List<Point> pointList = new ArrayList<>(); |
||||
//shift键是否被按下
|
||||
public boolean isShiftDown = false; |
||||
//control\command键是否被按下
|
||||
public boolean isControlDown = false; |
||||
//是否可以复制
|
||||
public boolean isCopy = true; |
||||
int ctrlKeyCode = 17; |
||||
int cKeyCode = 67; |
||||
int shiftKeyCode = 16; |
||||
int commandKeyCode = 157; |
||||
//选中单元格的背景色
|
||||
Color selectBackGround = new Color(54, 133, 242, 63); |
||||
|
||||
|
||||
public CopyableJTable(TableSorter tableModel) { |
||||
super(tableModel); |
||||
initListener(); |
||||
} |
||||
|
||||
private void initListener() { |
||||
CopyableJTable self = this; |
||||
this.addMouseMotionListener(new java.awt.event.MouseAdapter() { |
||||
@Override |
||||
public void mouseDragged(MouseEvent evt) { |
||||
int row = self.rowAtPoint(evt.getPoint()); |
||||
int col = self.columnAtPoint(evt.getPoint()); |
||||
if (self.updateEndPoint(row, col)) { |
||||
self.repaint(); |
||||
} |
||||
} |
||||
}); |
||||
this.addMouseListener(new MouseAdapter() { |
||||
public void mousePressed(MouseEvent e) { |
||||
int row = self.rowAtPoint(e.getPoint()); |
||||
int col = self.columnAtPoint(e.getPoint()); |
||||
if (!self.isControlDown) { |
||||
self.clearPoint(); |
||||
} |
||||
if (self.isShiftDown) { |
||||
self.clearPoint(); |
||||
} else { |
||||
self.updateStartPoint(row, col); |
||||
} |
||||
self.addPoint(row, col); |
||||
self.updateEndPoint(row, col); |
||||
|
||||
self.repaint(); |
||||
} |
||||
|
||||
}); |
||||
this.addKeyListener(new KeyAdapter() { |
||||
@Override |
||||
public void keyPressed(KeyEvent e) { |
||||
if (isControlKey(e)) { |
||||
isControlDown = true; |
||||
} else if (e.getKeyCode() == shiftKeyCode) { |
||||
isShiftDown = true; |
||||
} else if (e.getKeyCode() == cKeyCode) { |
||||
if (isControlDown && isCopy) { |
||||
self.copy(); |
||||
isCopy = false; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void keyReleased(KeyEvent e) { |
||||
if (isControlKey(e)) { |
||||
isControlDown = false; |
||||
isCopy = true; |
||||
} else if (e.getKeyCode() == shiftKeyCode) { |
||||
isShiftDown = false; |
||||
} |
||||
} |
||||
|
||||
private boolean isControlKey(KeyEvent e) { |
||||
if (e.getKeyCode() == ctrlKeyCode) { |
||||
return true; |
||||
} |
||||
if (e.getKeyCode() == commandKeyCode && OperatingSystem.isMacos()) { |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { |
||||
Component comp = super.prepareRenderer(renderer, row, column); |
||||
if (isChoose(row, column)) { |
||||
comp.setBackground(selectBackGround); |
||||
} else { |
||||
comp.setBackground(this.getBackground()); |
||||
} |
||||
return comp; |
||||
} |
||||
|
||||
|
||||
private boolean updateEndPoint(int row, int col) { |
||||
if (endRow != row || endCol != col) { |
||||
endRow = row; |
||||
endCol = col; |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
private boolean updateStartPoint(int row, int col) { |
||||
if (startRow != row || startCol != col) { |
||||
startRow = row; |
||||
startCol = col; |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
private void addPoint(int row, int col) { |
||||
pointList.add(new Point(row, col)); |
||||
} |
||||
|
||||
private void clearPoint() { |
||||
pointList = new ArrayList<>(); |
||||
} |
||||
|
||||
private void copy() { |
||||
FineLoggerFactory.getLogger().info("copy cell value"); |
||||
java.util.List<java.util.List<Object>> table = new ArrayList<>(); |
||||
if ((startRow != endRow || startCol != endCol) && |
||||
Math.min(startRow, endRow) > -1 && Math.min(startCol, endCol) > -1) { |
||||
for (int i = Math.min(startRow, endRow); i <= Math.max(startRow, endRow); i++) { |
||||
table.add(new ArrayList<>()); |
||||
for (int j = Math.min(startCol, endCol); j <= Math.max(startCol, endCol); j++) { |
||||
Object text = this.getValueAt(i, j); |
||||
table.get(i - Math.min(startRow, endRow)).add(text); |
||||
} |
||||
} |
||||
} else if (pointList.size() > 0) { |
||||
Collections.sort(pointList, Comparator.comparing(Point::getX).thenComparing(Point::getY)); |
||||
int startRow = pointList.get(0).x; |
||||
int currentRow = startRow; |
||||
table.add(new ArrayList<>()); |
||||
for (Point point : pointList) { |
||||
while (currentRow < point.x) { |
||||
table.add(new ArrayList<>()); |
||||
currentRow++; |
||||
} |
||||
Object text = this.getValueAt(point.x, point.y); |
||||
table.get(currentRow - startRow).add(text); |
||||
} |
||||
} |
||||
|
||||
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); |
||||
Transferable tText = new StringSelection(ClipboardHelper.formatExcelString(table)); |
||||
clip.setContents(tText, null); |
||||
} |
||||
|
||||
private boolean isChoose(int row, int col) { |
||||
if (row >= Math.min(startRow, endRow) && row <= Math.max(startRow, endRow)) { |
||||
if (col >= Math.min(startCol, endCol) && col <= Math.max(startCol, endCol)) { |
||||
return true; |
||||
} |
||||
} |
||||
for (Point point : pointList) { |
||||
if (point.x == row && point.y == col) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,239 @@
|
||||
package com.fr.design.dialog; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
import com.fr.design.dialog.link.MessageWithLink; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.icontainer.UIScrollPane; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itextarea.UITextArea; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.utils.DesignUtils; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.stable.StringUtils; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Dialog; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.Frame; |
||||
import java.awt.Point; |
||||
import java.awt.Window; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.io.PrintWriter; |
||||
import java.io.StringWriter; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingUtilities; |
||||
|
||||
/** |
||||
* 带链接的错误详情弹窗 |
||||
* |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/8/2 |
||||
*/ |
||||
public class UIDetailErrorLinkDialog extends UIDialog { |
||||
|
||||
private static final Color LINK_COLOR = new Color(51, 152, 253); |
||||
private static final int GAP_5 = 5; |
||||
private static final int GAP_10 = 10; |
||||
private static final String TAG_A_START = "<a>"; |
||||
private static final String TAG_A_END = "</a>"; |
||||
|
||||
private final Dimension dimension = new Dimension(300, 180); |
||||
|
||||
public static Builder newBuilder() { |
||||
return new Builder(); |
||||
} |
||||
|
||||
private UIDetailErrorLinkDialog(Frame parent, Builder builder) { |
||||
super(parent); |
||||
init(builder); |
||||
} |
||||
|
||||
private UIDetailErrorLinkDialog(Dialog parent, Builder builder) { |
||||
super(parent); |
||||
init(builder); |
||||
} |
||||
|
||||
private void init(Builder builder) { |
||||
this.setTitle(builder.title); |
||||
// 顶部 图标和提示
|
||||
UILabel errorIcon = new UILabel(IOUtils.readIcon("com/fr/design/images/lookandfeel/Information_Icon_Error_32x32.png")); |
||||
UILabel errorInfo= new UILabel(builder.reason); |
||||
JPanel topPane = new JPanel(new FlowLayout(FlowLayout.LEFT, GAP_10, GAP_5)); |
||||
topPane.add(errorIcon); |
||||
topPane.add(errorInfo); |
||||
|
||||
// 中部 详细内容
|
||||
JPanel contentPane = new JPanel(new BorderLayout()); |
||||
contentPane.setBorder(BorderFactory.createEmptyBorder(0, GAP_5,0,0)); |
||||
UILabel errorCodeLabel = new UILabel(Toolkit.i18nText("Fine_Design_Basic_Error_Code", builder.errorCode)); |
||||
UILabel link = new UILabel(Toolkit.i18nText("Fine_Design_Basic_Show_Error_Stack")); |
||||
link.setForeground(LINK_COLOR); |
||||
link.addMouseListener(new MouseAdapter() { |
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
StringWriter stackTraceWriter = new StringWriter(); |
||||
builder.throwable.printStackTrace(new PrintWriter(stackTraceWriter)); |
||||
StackPane stackPane = new StackPane(stackTraceWriter.toString()); |
||||
BasicDialog dialog = stackPane.showLargeWindow(UIDetailErrorLinkDialog.this, null); |
||||
dialog.setVisible(true); |
||||
} |
||||
}); |
||||
contentPane.add(errorCodeLabel, BorderLayout.NORTH); |
||||
contentPane.add(createComponent(builder), BorderLayout.CENTER); |
||||
contentPane.add(link, BorderLayout.SOUTH); |
||||
|
||||
// 确定 + 取消
|
||||
JPanel actionPane = new JPanel(new FlowLayout(FlowLayout.RIGHT, GAP_10, GAP_10)); |
||||
actionPane.add(createButton(Toolkit.i18nText("Fine-Design_Report_OK"))); |
||||
actionPane.add(createButton(Toolkit.i18nText("Fine-Design_Basic_Cancel"))); |
||||
this.getContentPane().add(topPane, BorderLayout.NORTH); |
||||
this.getContentPane().add(contentPane, BorderLayout.CENTER); |
||||
this.getContentPane().add(actionPane, BorderLayout.SOUTH); |
||||
this.setSize(dimension); |
||||
this.setResizable(false); |
||||
GUICoreUtils.centerWindow(this); |
||||
} |
||||
|
||||
private UIButton createButton(String content) { |
||||
UIButton button = new UIButton(content); |
||||
button.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
UIDetailErrorLinkDialog.this.dispose(); |
||||
} |
||||
}); |
||||
return button; |
||||
} |
||||
|
||||
private JComponent createComponent(Builder builder) { |
||||
JPanel panel = new JPanel(new BorderLayout()); |
||||
boolean existDetailReason = StringUtils.isNotEmpty(builder.detailReason); |
||||
int maxWidth = dimension.width; |
||||
if (existDetailReason) { |
||||
String message = Toolkit.i18nText("Fine_Design_Basic_Detail_Error_Info", builder.detailReason); |
||||
UILabel label = new UILabel(message); |
||||
maxWidth = Math.max(maxWidth, GraphHelper.getWidth(message, label.getFont())); |
||||
panel.add(label, BorderLayout.NORTH); |
||||
} |
||||
String solution = existDetailReason ? builder.solution : Toolkit.i18nText("Fine_Design_Basic_Detail_Error_Info", builder.solution); |
||||
if (builder.solution.contains(TAG_A_START)) { |
||||
String[] solutionP1 = solution.split(TAG_A_START); |
||||
String[] solutionP2 = solutionP1[1].split(TAG_A_END); |
||||
MessageWithLink messageWithLink; |
||||
if (solutionP2.length == 2) { |
||||
messageWithLink = new MessageWithLink(solutionP1[0], solutionP2[0], builder.link, solutionP2[1]); |
||||
} else { |
||||
messageWithLink = new MessageWithLink(solutionP1[0], solutionP2[0], builder.link); |
||||
} |
||||
|
||||
panel.add(messageWithLink, BorderLayout.CENTER); |
||||
} else { |
||||
UILabel solutionLabel = new UILabel(solution); |
||||
panel.add(solutionLabel, BorderLayout.CENTER); |
||||
} |
||||
dimension.width = Math.max(maxWidth, GraphHelper.getWidth(solution, DesignUtils.getDefaultGUIFont())); |
||||
return panel; |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void checkValid() throws Exception { |
||||
// do nothing
|
||||
} |
||||
|
||||
class StackPane extends BasicPane { |
||||
|
||||
public StackPane(String stack) { |
||||
setLayout(new BorderLayout()); |
||||
UITextArea textArea = new UITextArea(); |
||||
textArea.setEditable(false); |
||||
textArea.setText(stack); |
||||
UIScrollPane scrollPane = new UIScrollPane(textArea); |
||||
add(scrollPane); |
||||
// 滚动条默认在顶部
|
||||
SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
scrollPane.getViewport().setViewPosition(new Point(0, 0)); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Toolkit.i18nText("Fine_Design_Basic_Error_Stack"); |
||||
} |
||||
} |
||||
|
||||
public static class Builder { |
||||
private Window window; |
||||
private String title; |
||||
private String reason; |
||||
private String errorCode; |
||||
private String detailReason; |
||||
private String solution; |
||||
private String link; |
||||
private Throwable throwable; |
||||
|
||||
private Builder() { |
||||
|
||||
} |
||||
|
||||
public Builder setTitle(String title) { |
||||
this.title = title; |
||||
return this; |
||||
} |
||||
|
||||
public Builder setReason(String reason) { |
||||
this.reason = reason; |
||||
return this; |
||||
} |
||||
|
||||
public Builder setErrorCode(String errorCode) { |
||||
this.errorCode = errorCode; |
||||
return this; |
||||
} |
||||
|
||||
public Builder setSolution(String solution) { |
||||
this.solution = solution; |
||||
return this; |
||||
} |
||||
|
||||
public Builder setDetailReason(String detailReason) { |
||||
this.detailReason = detailReason; |
||||
return this; |
||||
} |
||||
|
||||
public Builder setThrowable(Throwable throwable) { |
||||
this.throwable = throwable; |
||||
return this; |
||||
} |
||||
|
||||
public Builder setWindow(Window window) { |
||||
this.window = window; |
||||
return this; |
||||
} |
||||
|
||||
public Builder setLink(String link) { |
||||
this.link = link; |
||||
return this; |
||||
} |
||||
|
||||
public UIDetailErrorLinkDialog build() { |
||||
if (this.window instanceof Frame) { |
||||
return new UIDetailErrorLinkDialog((Frame) window, this); |
||||
} else { |
||||
return new UIDetailErrorLinkDialog((Dialog) window, this); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,16 @@
|
||||
package com.fr.design.gui.chart; |
||||
|
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
|
||||
import java.util.EventListener; |
||||
|
||||
/** |
||||
* @author shine |
||||
* @version 10.0 |
||||
* Created by shine on 2021/5/26 |
||||
*/ |
||||
public interface ChartEditPaneActionListener extends EventListener { |
||||
|
||||
void attributeChange(ChartCollection chartCollection); |
||||
|
||||
} |
@ -0,0 +1,278 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import com.fr.design.DesignState; |
||||
import com.fr.design.base.mode.DesignModeContext; |
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.file.MutilTempalteTabPane; |
||||
import com.fr.design.file.NewTemplatePane; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.imenu.UIMenuHighLight; |
||||
import com.fr.design.gui.itoolbar.UILargeToolbar; |
||||
import com.fr.design.gui.itoolbar.UIToolbar; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.toolbar.ToolBarMenuDock; |
||||
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.border.MatteBorder; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.Insets; |
||||
import java.util.ArrayList; |
||||
|
||||
/** |
||||
* @author shine |
||||
* @version 10.0 |
||||
* Created by shine on 2021/4/6 |
||||
*/ |
||||
public class CenterRegionContainerPane extends JPanel { |
||||
|
||||
private static volatile CenterRegionContainerPane THIS; |
||||
|
||||
private static final int LEFT_ALIGN_GAP = -5; |
||||
|
||||
private DesktopCardPane centerTemplateCardPane; |
||||
|
||||
private JPanel toolbarPane;//撤销重做 等工具栏 + 模板tab标签 + maybe have cpt 字体
|
||||
|
||||
private JComponent toolbarComponent;//cpt 字体 等工具栏
|
||||
|
||||
private JPanel eastPane;//=largeToolbar+eastCenterPane
|
||||
private UILargeToolbar largeToolbar;//预览
|
||||
|
||||
private JPanel eastCenterPane;//=combineUp + templateTabPane
|
||||
|
||||
private UIToolbar combineUp;//撤销重做 等工具栏
|
||||
|
||||
private JPanel templateTabPane;//新建模板 + 模板tab标签
|
||||
private NewTemplatePane newWorkBookPane;//新建模板button
|
||||
|
||||
|
||||
public static CenterRegionContainerPane getInstance() { |
||||
if (THIS == null) { |
||||
synchronized (CenterRegionContainerPane.class) { |
||||
if (THIS == null) { |
||||
THIS = new CenterRegionContainerPane(); |
||||
} |
||||
} |
||||
} |
||||
return THIS; |
||||
} |
||||
|
||||
public CenterRegionContainerPane() { |
||||
|
||||
toolbarPane = new JPanel() { |
||||
|
||||
@Override |
||||
public Dimension getPreferredSize() { |
||||
|
||||
Dimension dim = super.getPreferredSize(); |
||||
// dim.height = TOOLBAR_HEIGHT;
|
||||
return dim; |
||||
} |
||||
}; |
||||
toolbarPane.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
eastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
eastPane.add(largeToolbar = getToolBarMenuDock().createLargeToolbar(), BorderLayout.WEST); |
||||
eastCenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
combineUpTooBar(); |
||||
eastCenterPane.add(combineUp, BorderLayout.NORTH); |
||||
templateTabPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
templateTabPane.add(newWorkBookPane = getToolBarMenuDock().getNewTemplatePane(), BorderLayout.WEST); |
||||
templateTabPane.add(MutilTempalteTabPane.getInstance(), BorderLayout.CENTER); |
||||
eastCenterPane.add(templateTabPane, BorderLayout.CENTER); |
||||
|
||||
eastPane.add(eastCenterPane, BorderLayout.CENTER); |
||||
toolbarPane.add(eastPane, BorderLayout.NORTH); |
||||
toolbarPane.add(new UIMenuHighLight(), BorderLayout.SOUTH); |
||||
|
||||
this.setLayout(new BorderLayout()); |
||||
this.add(centerTemplateCardPane = new DesktopCardPane(), BorderLayout.CENTER); |
||||
this.add(toolbarPane, BorderLayout.NORTH); |
||||
|
||||
} |
||||
|
||||
private ToolBarMenuDock getToolBarMenuDock() { |
||||
return DesignerContext.getDesignerFrame().getToolBarMenuDock(); |
||||
} |
||||
|
||||
/** |
||||
* 创建上工具栏 |
||||
*/ |
||||
private void combineUpTooBar() { |
||||
combineUp = new UIToolbar(FlowLayout.LEFT); |
||||
combineUp.setBorder(new MatteBorder(new Insets(0, LEFT_ALIGN_GAP, 1, 0), UIConstants.LINE_COLOR)); |
||||
combineUp.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 2)); |
||||
setUpUpToolBar(null); |
||||
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* 重置上工具栏 |
||||
*/ |
||||
private void resetCombineUpTooBar(JComponent[] toolbar4Form, ToolBarMenuDockPlus plus) { |
||||
combineUp.removeAll(); |
||||
setUpUpToolBar(toolbar4Form); |
||||
plus.insertToCombineUpToolbar(combineUp); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 填充上工具栏的中的工具 |
||||
* |
||||
* @param toolbar4Form 目标组件 |
||||
*/ |
||||
private void setUpUpToolBar(@Nullable JComponent[] toolbar4Form) { |
||||
UIButton[] fixButtons = getToolBarMenuDock().createUp(); |
||||
for (UIButton fixButton : fixButtons) { |
||||
combineUp.add(fixButton); |
||||
} |
||||
if (!DesignModeContext.isAuthorityEditing()) { |
||||
combineUp.addSeparator(new Dimension(2, 16)); |
||||
if (toolbar4Form != null) { |
||||
for (JComponent jComponent : toolbar4Form) { |
||||
combineUp.add(jComponent); |
||||
} |
||||
} |
||||
//添加检测按钮
|
||||
addCheckButton(); |
||||
} |
||||
//添加分享按钮
|
||||
addShareButton(); |
||||
//添加插件中的按钮
|
||||
addExtraButtons(); |
||||
} |
||||
|
||||
|
||||
private void addExtraButtons() { |
||||
|
||||
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (jt == null) { |
||||
return; |
||||
} |
||||
|
||||
|
||||
UIButton[] extraButtons = jt.createExtraButtons(); |
||||
for (UIButton extraButton : extraButtons) { |
||||
combineUp.add(extraButton); |
||||
} |
||||
if (extraButtons.length > 0) { |
||||
combineUp.addSeparator(new Dimension(2, 16)); |
||||
} |
||||
} |
||||
|
||||
private void addCheckButton() { |
||||
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (jt == null) { |
||||
return; |
||||
} |
||||
combineUp.addSeparator(new Dimension(2, 16)); |
||||
UIButton[] checkButtons = jt.createCheckButton(); |
||||
for (UIButton checkButton : checkButtons) { |
||||
combineUp.add(checkButton); |
||||
} |
||||
} |
||||
|
||||
private void addShareButton() { |
||||
|
||||
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (jt == null) { |
||||
return; |
||||
} |
||||
|
||||
combineUp.addSeparator(new Dimension(2, 16)); |
||||
UIButton[] shareButtons = jt.createShareButton(); |
||||
for (UIButton shareButton : shareButtons) { |
||||
combineUp.add(shareButton); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 检查 |
||||
* |
||||
* @param flag 组件是否可见 |
||||
* @param al 组件名称 |
||||
*/ |
||||
protected void checkCombineUp(boolean flag, ArrayList<String> al) { |
||||
//Yvan: 检查当前是否为WORK_SHEET状态,因为只有WORK_SHEET中含有格式刷组件,此时是不需要进行checkComponentsByNames的
|
||||
JTemplate<?, ?> jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (jTemplate != null) { |
||||
// 第一个条件满足后还需要添加一重判断,判断是编辑报表块还是参数面板,编辑报表块时则直接return
|
||||
if (jTemplate.getMenuState() == DesignState.WORK_SHEET && !jTemplate.isUpMode()) { |
||||
return; |
||||
} |
||||
combineUp.checkComponentsByNames(flag, al); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 重置相关的工具条. |
||||
* |
||||
* @param plus 工具条中相关信息 |
||||
*/ |
||||
protected void resetToolkitByPlus(ToolBarMenuDockPlus plus, ToolBarMenuDock ad) { |
||||
|
||||
resetCombineUpTooBar(ad.resetUpToolBar(plus), plus); |
||||
|
||||
if (toolbarComponent != null) { |
||||
toolbarPane.remove(toolbarComponent); |
||||
} |
||||
|
||||
// 颜色,字体那些按钮的工具栏
|
||||
toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); |
||||
|
||||
if (plus.hasToolBarPane()) { |
||||
this.add(toolbarPane, BorderLayout.NORTH); |
||||
} else { |
||||
this.remove(toolbarPane); |
||||
} |
||||
|
||||
resetByDesignMode(); |
||||
} |
||||
|
||||
private void resetByDesignMode() { |
||||
if (DesignModeContext.isDuchampMode()) { |
||||
eastPane.remove(largeToolbar); |
||||
eastCenterPane.remove(templateTabPane); |
||||
centerTemplateCardPane.refresh(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); |
||||
} else { |
||||
eastPane.add(largeToolbar, BorderLayout.WEST); |
||||
eastCenterPane.add(templateTabPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
} |
||||
|
||||
JComponent getToolbarComponent() { |
||||
|
||||
return this.toolbarComponent; |
||||
} |
||||
|
||||
/** |
||||
* 判断是否在权限编辑状态,若是在权限编辑状态,则需要有虚线框和关闭突变 |
||||
*/ |
||||
protected void needToAddAuhtorityPaint() { |
||||
newWorkBookPane.setButtonGray(DesignModeContext.isAuthorityEditing()); |
||||
|
||||
} |
||||
|
||||
|
||||
protected DesktopCardPane getCenterTemplateCardPane() { |
||||
|
||||
return centerTemplateCardPane; |
||||
} |
||||
|
||||
protected void refreshUIToolBar() { |
||||
if (toolbarComponent instanceof UIToolbar) { |
||||
((UIToolbar ) toolbarComponent).refreshUIToolBar(); |
||||
} |
||||
combineUp.refreshUIToolBar(); |
||||
getToolBarMenuDock().updateEnable(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,83 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import com.fr.design.file.TemplateTreePane; |
||||
import com.fr.design.gui.itree.filetree.TemplateFileTree; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.tree.DefaultMutableTreeNode; |
||||
import java.util.ArrayList; |
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author shine |
||||
* @version 10.0 |
||||
* Created by shine on 2021/5/7 |
||||
*/ |
||||
public class JTemplateNameHelper { |
||||
|
||||
private static final int PREFIX_NUM = 3000; |
||||
|
||||
private static short currentIndex = 0;// 此变量用于多次新建模板时,让名字不重复
|
||||
|
||||
public static String newTemplateNameByIndex(String prefix) { |
||||
// 用于获取左侧模板的文件名,如左侧已包含"WorkBook1.cpt, WorkBook12.cpt, WorkBook177.cpt"
|
||||
// 那么新建的文件名将被命名为"WorkBook178.cpt",即取最大数+1
|
||||
TemplateFileTree tt = TemplateTreePane.getInstance().getTemplateFileTree(); |
||||
DefaultMutableTreeNode gen = (DefaultMutableTreeNode) tt.getModel().getRoot(); |
||||
String[] str = new String[gen.getChildCount()]; |
||||
|
||||
List<Integer> reportNum = new ArrayList<>(); |
||||
for (int j = 0; j < gen.getChildCount(); j++) { |
||||
str[j] = gen.getChildAt(j).toString(); |
||||
//返回文件名中的index(算法中没有再匹配文件后缀了,因为DefaultMutableTreeNode中已经匹配过了)
|
||||
Integer index = getFileNameIndex(prefix, str[j]); |
||||
if (index != null) { |
||||
reportNum.add(index); |
||||
} |
||||
} |
||||
Collections.sort(reportNum); |
||||
int idx = reportNum.size() > 0 ? reportNum.get(reportNum.size() - 1) + 1 : 1; |
||||
|
||||
idx = idx + currentIndex; |
||||
currentIndex++; |
||||
return prefix + idx; |
||||
} |
||||
|
||||
/** |
||||
* @return java.lang.Integer WorkBook11.cpt则返回11,如果没有找到index返回null |
||||
* @Description 返回文件名中的index |
||||
* @param: prefix 前缀 |
||||
* @param: fileName 文件名称全名 |
||||
* @Author Henry.Wang |
||||
* @Date 2021/4/9 11:13 |
||||
**/ |
||||
private static Integer getFileNameIndex(String prefix, String fileName) { |
||||
char[] chars = new char[fileName.length()]; |
||||
int i = 0; |
||||
for (; i < fileName.length(); i++) { |
||||
char c = fileName.charAt(i); |
||||
//匹配前缀
|
||||
if (i < prefix.length()) { |
||||
if (c != prefix.charAt(i)) { |
||||
return null; |
||||
} |
||||
} else { |
||||
if (c == '.') { |
||||
break; |
||||
} else { |
||||
//匹配0~9
|
||||
if (c < 48 || c > 57) { |
||||
return null; |
||||
} |
||||
chars[i - prefix.length()] = c; |
||||
} |
||||
} |
||||
} |
||||
String s = new String(chars).substring(0, i - prefix.length()); |
||||
if (StringUtils.isBlank(s)) { |
||||
return null; |
||||
} |
||||
return Integer.valueOf(s); |
||||
} |
||||
} |
@ -0,0 +1,144 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import com.fr.design.DesignState; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.ExtraDesignClassManager; |
||||
import com.fr.design.fun.TitlePlaceProcessor; |
||||
import com.fr.design.gui.imenu.UIMenuHighLight; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.loghandler.LogMessageBar; |
||||
import com.fr.design.mainframe.toolbar.ToolBarMenuDock; |
||||
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; |
||||
import com.fr.design.menu.MenuManager; |
||||
import com.fr.design.os.impl.SupportOSImpl; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.plugin.context.PluginContext; |
||||
import com.fr.plugin.injectable.PluginModule; |
||||
import com.fr.plugin.manage.PluginFilter; |
||||
import com.fr.plugin.observer.PluginEvent; |
||||
import com.fr.plugin.observer.PluginEventListener; |
||||
import com.fr.stable.os.support.OSBasedAction; |
||||
import com.fr.stable.os.support.OSSupportCenter; |
||||
|
||||
import javax.swing.JMenuBar; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingUtilities; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.FlowLayout; |
||||
|
||||
/** |
||||
* @author shine |
||||
* @version 10.0 |
||||
* Created by shine on 2021/4/6 |
||||
*/ |
||||
public class NorthRegionContainerPane extends JPanel { |
||||
|
||||
private static volatile NorthRegionContainerPane THIS; |
||||
|
||||
private JMenuBar menuBar; |
||||
|
||||
public static NorthRegionContainerPane getInstance() { |
||||
if (THIS == null) { |
||||
synchronized (NorthRegionContainerPane.class) { |
||||
if (THIS == null) { |
||||
THIS = new NorthRegionContainerPane(); |
||||
} |
||||
} |
||||
} |
||||
return THIS; |
||||
} |
||||
|
||||
public NorthRegionContainerPane() { |
||||
|
||||
ToolBarMenuDock ad = DesignerContext.getDesignerFrame().getToolBarMenuDock(); |
||||
|
||||
this.setLayout(new BorderLayout()); |
||||
this.add(new UIMenuHighLight(), BorderLayout.SOUTH); |
||||
this.add(initNorthEastPane(ad), BorderLayout.EAST); |
||||
} |
||||
|
||||
/** |
||||
* @param ad 菜单栏 |
||||
* @return panel |
||||
*/ |
||||
protected JPanel initNorthEastPane(final ToolBarMenuDock ad) { |
||||
//hugh: private修改为protected方便oem的时候修改右上的组件构成
|
||||
//顶部日志+登陆按钮
|
||||
final JPanel northEastPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
//优先级为-1,保证最后全面刷新一次
|
||||
GeneralContext.listenPluginRunningChanged(new PluginEventListener(-1) { |
||||
|
||||
@Override |
||||
public void on(PluginEvent event) { |
||||
|
||||
refreshNorthEastPane(northEastPane, ad); |
||||
SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
if (DesignerContext.getDesignerFrame() == null) { |
||||
return; |
||||
} |
||||
DesignerContext.getDesignerFrame().refresh(); |
||||
DesignerContext.getDesignerFrame().repaint(); |
||||
} |
||||
}); |
||||
} |
||||
}, new PluginFilter() { |
||||
|
||||
@Override |
||||
public boolean accept(PluginContext context) { |
||||
|
||||
return context.contain(PluginModule.ExtraDesign); |
||||
} |
||||
}); |
||||
refreshNorthEastPane(northEastPane, ad); |
||||
return northEastPane; |
||||
} |
||||
|
||||
private void refreshNorthEastPane(final JPanel northEastPane, final ToolBarMenuDock ad) { |
||||
|
||||
northEastPane.removeAll(); |
||||
northEastPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0)); |
||||
northEastPane.add(LogMessageBar.getInstance()); |
||||
TitlePlaceProcessor processor = ExtraDesignClassManager.getInstance().getSingle(TitlePlaceProcessor.MARK_STRING); |
||||
if (processor != null) { |
||||
final Component[] bbsLoginPane = {null}; |
||||
OSSupportCenter.buildAction(new OSBasedAction() { |
||||
@Override |
||||
public void execute(Object... objects) { |
||||
bbsLoginPane[0] = ad.createBBSLoginPane(); |
||||
} |
||||
}, SupportOSImpl.USERINFOPANE); |
||||
processor.hold(northEastPane, LogMessageBar.getInstance(), bbsLoginPane[0]); |
||||
} |
||||
northEastPane.add(ad.createAlphaFinePane()); |
||||
if (!DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isEnabled()) { |
||||
ad.createAlphaFinePane().setVisible(false); |
||||
} |
||||
northEastPane.add(ad.createNotificationCenterPane()); |
||||
|
||||
OSSupportCenter.buildAction(new OSBasedAction() { |
||||
@Override |
||||
public void execute(Object... objects) { |
||||
northEastPane.add(ad.createBBSLoginPane()); |
||||
} |
||||
}, SupportOSImpl.USERINFOPANE); |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 重置相关的工具条. |
||||
* |
||||
* @param plus 工具条中相关信息 |
||||
*/ |
||||
void resetToolkitByPlus(ToolBarMenuDockPlus plus, ToolBarMenuDock ad) { |
||||
DesignState designState = new DesignState(plus); |
||||
MenuManager.getInstance().setMenus4Designer(designState); |
||||
if (menuBar == null) { |
||||
this.add(menuBar = ad.createJMenuBar(plus), BorderLayout.CENTER); |
||||
} else { |
||||
ad.resetJMenuBar(menuBar, plus); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,32 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.env.DesignerWorkspaceInfo; |
||||
import com.fr.general.locale.LocaleCenter; |
||||
import com.fr.general.locale.LocaleMark; |
||||
import com.fr.locale.InterProviderFactory; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/8/9 |
||||
*/ |
||||
public class HelpLink { |
||||
|
||||
public static String getLink(String solution) { |
||||
Map<String, String> map = new HashMap<>(); |
||||
String currentName = DesignerEnvManager.getEnvManager().getCurEnvName(); |
||||
DesignerWorkspaceInfo workspaceInfo = DesignerEnvManager.getEnvManager().getWorkspaceInfo(currentName); |
||||
LocaleMark<String> linkMark = LocaleCenter.getMark(RemoteDesignLocaleMark.class); |
||||
String link = linkMark.getValue(); |
||||
map.put(InterProviderFactory.getProvider().getLocText("Fine-Core_Remote_Design_Change_PassWord"), workspaceInfo.getConnection().getUrl() + RemoteWorkspaceURL.SYSTEM_LOGIN_PATH); |
||||
map.put(InterProviderFactory.getProvider().getLocText("Fine-Core_Remote_Design_Cert_Error_Solution"), link); |
||||
map.put(InterProviderFactory.getProvider().getLocText("Fine-Core_Remote_Design_Connection_Unknown_Error_Solution"), link); |
||||
map.put(InterProviderFactory.getProvider().getLocText("Fine-Core_Remote_Design_NetWork_Connection_Error_Solution"), link); |
||||
return map.get(solution); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,36 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.locale.LocaleMark; |
||||
import java.util.HashMap; |
||||
import java.util.Locale; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/8/9 |
||||
*/ |
||||
public class RemoteDesignLocaleMark implements LocaleMark<String> { |
||||
|
||||
private Map<Locale, String> map = new HashMap<>(); |
||||
private static final String REMOTE_DESIGN_CN = CloudCenter.getInstance().acquireUrlByKind("help.remote.design.zh_CN", "https://help.fanruan.com/finereport/doc-view-3925.html"); |
||||
private static final String REMOTE_DESIGN_EN = CloudCenter.getInstance().acquireUrlByKind("help.remote.design.en_US", "https://help.fanruan.com/finereport-en/doc-view-3862.html"); |
||||
|
||||
|
||||
public RemoteDesignLocaleMark() { |
||||
map.put(Locale.CHINA, REMOTE_DESIGN_CN); |
||||
map.put(Locale.KOREA, REMOTE_DESIGN_EN); |
||||
map.put(Locale.JAPAN, REMOTE_DESIGN_EN); |
||||
map.put(Locale.US, REMOTE_DESIGN_EN); |
||||
map.put(Locale.TAIWAN, REMOTE_DESIGN_CN); |
||||
} |
||||
|
||||
@Override |
||||
public String getValue() { |
||||
String result = map.get(GeneralContext.getLocale()); |
||||
return result == null ? REMOTE_DESIGN_CN : result; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,16 @@
|
||||
package com.fr.env.handler; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/8/5 |
||||
*/ |
||||
public interface Handler<T, R> { |
||||
|
||||
/** |
||||
* @param t |
||||
* @return 是否需要继续处理 |
||||
*/ |
||||
R handle(T t); |
||||
|
||||
} |
@ -0,0 +1,88 @@
|
||||
package com.fr.env.handler; |
||||
|
||||
import com.fr.design.EnvChangeEntrance; |
||||
import com.fr.design.dialog.FineJOptionPane; |
||||
import com.fr.design.env.DesignerWorkspaceInfo; |
||||
import com.fr.design.env.DesignerWorkspaceType; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.env.handler.impl.CancelHandler; |
||||
import com.fr.env.handler.impl.CommonHandler; |
||||
import com.fr.env.handler.impl.ExecutionHandler; |
||||
import com.fr.env.handler.impl.UnexpectedHandler; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import javax.swing.UIManager; |
||||
|
||||
|
||||
import static javax.swing.JOptionPane.ERROR_MESSAGE; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/8/5 |
||||
*/ |
||||
public class RemoteDesignExceptionHandler { |
||||
|
||||
private static final RemoteDesignExceptionHandler INSTANCE = new RemoteDesignExceptionHandler(); |
||||
|
||||
public static RemoteDesignExceptionHandler getInstance() { |
||||
return INSTANCE; |
||||
} |
||||
|
||||
private final List<Handler<Throwable, ResultWrapper>> testList = new ArrayList<>(); |
||||
|
||||
private final List<Handler<Throwable, ResultWrapper>> switchList = new ArrayList<>(); |
||||
|
||||
private RemoteDesignExceptionHandler() { |
||||
// 要保证顺序
|
||||
testList.add(new CancelHandler()); |
||||
testList.add(new ExecutionHandler()); |
||||
testList.add(new UnexpectedHandler()); |
||||
testList.add(new CommonHandler(false)); |
||||
|
||||
switchList.add(new CancelHandler()); |
||||
switchList.add(new ExecutionHandler()); |
||||
switchList.add(new UnexpectedHandler()); |
||||
switchList.add(new CommonHandler(true)); |
||||
} |
||||
|
||||
public void handle(Throwable e, List<Handler<Throwable, ResultWrapper>> list) { |
||||
Throwable throwable = e; |
||||
ResultWrapper wrapper; |
||||
for (Handler<Throwable, ResultWrapper> handler : list) { |
||||
wrapper = handler.handle(throwable); |
||||
throwable = wrapper.getThrowable(); |
||||
if (!wrapper.isNext()) { |
||||
break; |
||||
} |
||||
} |
||||
FineLoggerFactory.getLogger().error(throwable.getMessage(), throwable); |
||||
} |
||||
|
||||
public void handleInSwitch(Throwable e, DesignerWorkspaceInfo workspaceInfo) { |
||||
if (workspaceInfo == null || workspaceInfo.getType() == DesignerWorkspaceType.Local) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
FineJOptionPane.showMessageDialog(EnvChangeEntrance.getInstance().getDialog(), |
||||
Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"), |
||||
Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), |
||||
ERROR_MESSAGE, |
||||
UIManager.getIcon("OptionPane.errorIcon")); |
||||
return; |
||||
} |
||||
handle(e, switchList); |
||||
} |
||||
|
||||
public void handleInStart(Throwable e, DesignerWorkspaceInfo workspaceInfo) { |
||||
if (workspaceInfo == null || workspaceInfo.getType() == DesignerWorkspaceType.Local) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
return; |
||||
} |
||||
handle(e, testList); |
||||
} |
||||
|
||||
public void handleInTest(Throwable e) { |
||||
handle(e, testList); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,30 @@
|
||||
package com.fr.env.handler; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/8/5 |
||||
*/ |
||||
public class ResultWrapper { |
||||
|
||||
private final boolean next; |
||||
|
||||
private final Throwable throwable; |
||||
|
||||
public ResultWrapper(Throwable throwable) { |
||||
this(true, throwable); |
||||
} |
||||
|
||||
public ResultWrapper(boolean next, Throwable e) { |
||||
this.next = next; |
||||
this.throwable = e; |
||||
} |
||||
|
||||
public boolean isNext() { |
||||
return next; |
||||
} |
||||
|
||||
public Throwable getThrowable() { |
||||
return throwable; |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.fr.env.handler.impl; |
||||
|
||||
import com.fr.env.handler.Handler; |
||||
import com.fr.env.handler.ResultWrapper; |
||||
import java.util.concurrent.CancellationException; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/8/5 |
||||
*/ |
||||
public class CancelHandler implements Handler<Throwable, ResultWrapper> { |
||||
|
||||
@Override |
||||
public ResultWrapper handle(Throwable e) { |
||||
return new ResultWrapper(!(e instanceof CancellationException), e); |
||||
} |
||||
} |
@ -0,0 +1,48 @@
|
||||
package com.fr.env.handler.impl; |
||||
|
||||
import com.fr.base.exception.ExceptionDescriptor; |
||||
import com.fr.design.EnvChangeEntrance; |
||||
import com.fr.design.dialog.UIDetailErrorLinkDialog; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.env.HelpLink; |
||||
import com.fr.env.handler.Handler; |
||||
import com.fr.env.handler.ResultWrapper; |
||||
import javax.swing.SwingUtilities; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/8/5 |
||||
*/ |
||||
public class CommonHandler implements Handler<Throwable, ResultWrapper> { |
||||
|
||||
private final boolean onSwitch; |
||||
|
||||
public CommonHandler(boolean onSwitch) { |
||||
this.onSwitch = onSwitch; |
||||
} |
||||
|
||||
@Override |
||||
public ResultWrapper handle(Throwable e) { |
||||
if (e instanceof ExceptionDescriptor) { |
||||
ExceptionDescriptor exceptionDescriptor = (ExceptionDescriptor) e; |
||||
SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
UIDetailErrorLinkDialog detailErrorLinkDialog = UIDetailErrorLinkDialog.newBuilder(). |
||||
setWindow(onSwitch ? DesignerContext.getDesignerFrame() : EnvChangeEntrance.getInstance().getDialog()). |
||||
setErrorCode(exceptionDescriptor.errorCode()). |
||||
setReason(exceptionDescriptor.reason()). |
||||
setSolution(exceptionDescriptor.solution()). |
||||
setDetailReason(exceptionDescriptor.detailReason()). |
||||
setTitle(Toolkit.i18nText("Fine-Design_Basic_Connection_Failed")). |
||||
setLink(HelpLink.getLink(exceptionDescriptor.solution())). |
||||
setThrowable(e).build(); |
||||
detailErrorLinkDialog.setVisible(true); |
||||
} |
||||
}); |
||||
} |
||||
return new ResultWrapper(e); |
||||
} |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fr.env.handler.impl; |
||||
|
||||
import com.fr.env.handler.Handler; |
||||
import com.fr.env.handler.ResultWrapper; |
||||
import java.util.concurrent.ExecutionException; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/8/5 |
||||
*/ |
||||
public class ExecutionHandler implements Handler<Throwable, ResultWrapper> { |
||||
|
||||
@Override |
||||
public ResultWrapper handle(Throwable e) { |
||||
if (e instanceof ExecutionException) { |
||||
return new ResultWrapper(e.getCause()); |
||||
} |
||||
return new ResultWrapper(e.getCause()); |
||||
} |
||||
} |
@ -0,0 +1,24 @@
|
||||
package com.fr.env.handler.impl; |
||||
|
||||
import com.fr.base.exception.ExceptionDescriptor; |
||||
import com.fr.env.handler.Handler; |
||||
import com.fr.env.handler.ResultWrapper; |
||||
import com.fr.workspace.engine.convert.ExceptionConverter; |
||||
|
||||
/** |
||||
* 出现预料之外的情况异常处理器 |
||||
* |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/8/5 |
||||
*/ |
||||
public class UnexpectedHandler implements Handler<Throwable, ResultWrapper> { |
||||
|
||||
@Override |
||||
public ResultWrapper handle(Throwable e) { |
||||
if (!(e instanceof ExceptionDescriptor)) { |
||||
return new ResultWrapper(ExceptionConverter.getInstance().convert(e)) ; |
||||
} |
||||
return new ResultWrapper(e); |
||||
} |
||||
} |
@ -0,0 +1,23 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import junit.framework.TestCase; |
||||
|
||||
/** |
||||
* @author shine |
||||
* @version 10.0 |
||||
* Created by shine on 2021/5/8 |
||||
*/ |
||||
public class JTemplateNameHelperTest extends TestCase { |
||||
|
||||
public void testNewTemplateNameByIndex() { |
||||
|
||||
String name = JTemplateNameHelper.newTemplateNameByIndex("TEST"); |
||||
|
||||
assertEquals("TEST1", name); |
||||
|
||||
String name1 = JTemplateNameHelper.newTemplateNameByIndex("TEST"); |
||||
|
||||
assertEquals("TEST2", name1); |
||||
|
||||
} |
||||
} |
@ -0,0 +1,38 @@
|
||||
package com.fr.design.chart.fun.impl; |
||||
|
||||
import com.fr.chart.charttypes.ChartTypeManager; |
||||
import com.fr.chartx.attr.ChartProvider; |
||||
import com.fr.design.ChartTypeInterfaceManager; |
||||
import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; |
||||
|
||||
/** |
||||
* @author shine |
||||
* @version 10.0 |
||||
* Created by shine on 2020/7/8 |
||||
*/ |
||||
public class DefaultChartTypePane<T extends ChartProvider> extends AbstractChartTypePane<T> { |
||||
|
||||
@Override |
||||
protected String[] getTypeIconPath() { |
||||
return ChartTypeInterfaceManager.getInstance().getDemoImagePath(this.getPlotID()); |
||||
} |
||||
|
||||
@Override |
||||
protected String[] getTypeTipName() { |
||||
return ChartTypeInterfaceManager.getInstance().getSubName(this.getPlotID()); |
||||
} |
||||
|
||||
public ChartProvider getDefaultChart() { |
||||
return ChartTypeManager.getInstance().getChartTypes(this.getPlotID())[0]; |
||||
} |
||||
|
||||
public String title4PopupWindow() { |
||||
return ChartTypeInterfaceManager.getInstance().getName(this.getPlotID()); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(T ob) { |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,15 @@
|
||||
package com.fr.design.chart.fun.impl; |
||||
|
||||
import com.fr.design.ChartTypeInterfaceManager; |
||||
|
||||
/** |
||||
* @author shine |
||||
* @version 10.0 |
||||
* Created by shine on 2021/6/25 |
||||
*/ |
||||
public class InvisibleChartTypePane extends DefaultChartTypePane { |
||||
@Override |
||||
public String title4PopupWindow() { |
||||
return ChartTypeInterfaceManager.TYPE_PANE_DEFAULT_TITLE; |
||||
} |
||||
} |
@ -1,112 +0,0 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import com.fr.chart.base.MapSvgAttr; |
||||
import com.fr.chart.base.MapSvgXMLHelper; |
||||
import com.fr.chart.chartglyph.MapShapeValue; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.chart.series.PlotSeries.AbstrctMapAttrEditPane; |
||||
import com.fr.design.chart.series.PlotSeries.MapCustomPane; |
||||
import com.fr.design.chart.series.PlotSeries.MapDefiAreaNamePane; |
||||
import com.fr.design.gui.frpane.UITabbedPane; |
||||
|
||||
import com.fr.stable.CoreConstants; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 7.1.1 |
||||
* Date: 14/12/2 |
||||
* Time: 下午7:17 |
||||
*/ |
||||
public class MapEditPane extends BasicBeanPane<MapSvgAttr>{ |
||||
|
||||
private UITabbedPane tabbedPane; |
||||
private MapCustomPane areaPane ; |
||||
// private MapCustomPane pointPane;
|
||||
private MapDefiAreaNamePane namedPane; |
||||
private String currentMapName; |
||||
private AbstrctMapAttrEditPane editingPane; |
||||
|
||||
private ChangeListener tabbedChangeListener = new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
switch ( tabbedPane.getSelectedIndex()){ |
||||
case 1: |
||||
namedPane.populateMapAttr(editingPane.updateCurrentAttr()); |
||||
editingPane = namedPane; |
||||
break; |
||||
default: |
||||
areaPane.populateMapAttr(editingPane.updateCurrentAttr()); |
||||
editingPane = areaPane; |
||||
} |
||||
} |
||||
} ; |
||||
|
||||
public MapEditPane(){ |
||||
initTabbedPane(); |
||||
this.setLayout(new BorderLayout()); |
||||
this.add(tabbedPane,BorderLayout.CENTER); |
||||
} |
||||
|
||||
private void initTabbedPane(){ |
||||
tabbedPane = new UITabbedPane(); |
||||
areaPane = new MapCustomPane(false); |
||||
// pointPane = new MapCustomPane(false);
|
||||
namedPane= new MapDefiAreaNamePane(false); |
||||
areaPane.setImageSelectType(MapShapeValue.AREA); |
||||
// pointPane.setImageSelectType(MapShapeValue.POINT);
|
||||
tabbedPane.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Image_Area"),areaPane); |
||||
// tabbedPane.add(com.fr.design.i18n.Toolkit.i18nText("FR-Chart-Map_ImagePoint"),pointPane);
|
||||
tabbedPane.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Map_Corresponding_Fields"),namedPane); |
||||
editingPane = areaPane; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(MapSvgAttr ob) { |
||||
if(!StringUtils.isEmpty(ob.getName()) && !MapSvgXMLHelper.getInstance().containsMapName(ob.getName())){ |
||||
MapSvgAttr mapSvgAttr = new MapSvgAttr(); |
||||
mapSvgAttr.setFilePath(MapSvgXMLHelper.customMapPath()+ CoreConstants.SEPARATOR+ob.getName()+".svg"); |
||||
MapSvgXMLHelper.getInstance().addNewSvgMaps(ob.getName(), mapSvgAttr); |
||||
} |
||||
|
||||
currentMapName = ob.getName(); |
||||
if(editingPane == null){ |
||||
editingPane = areaPane; |
||||
} |
||||
editingPane.populateMapAttr(ob); |
||||
tabbedPane.addChangeListener(tabbedChangeListener); |
||||
} |
||||
|
||||
public String getCurrentMapName(){ |
||||
return currentMapName; |
||||
} |
||||
|
||||
public void setCurrentMapName(String currentMapName){ |
||||
this.currentMapName = currentMapName; |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public MapSvgAttr updateBean() { |
||||
MapSvgAttr currentAttr = editingPane.updateCurrentAttr(); |
||||
currentMapName =currentAttr != null ? currentAttr.getName() : currentMapName; |
||||
MapSvgAttr attr = MapSvgXMLHelper.getInstance().getMapAttr(currentMapName); |
||||
if(attr != null ){ |
||||
MapSvgXMLHelper.getInstance().removeNewMapAttr(currentMapName); |
||||
MapSvgXMLHelper.getInstance().pushMapAttr(currentMapName,currentAttr); |
||||
return currentAttr; |
||||
}else{ |
||||
return MapSvgXMLHelper.getInstance().getNewMapAttr(currentMapName); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,26 @@
|
||||
package com.fr.design.mainframe.chart.mode; |
||||
|
||||
import com.fr.common.annotations.Open; |
||||
|
||||
/** |
||||
* @author shine |
||||
* @version 10.0 |
||||
* Created by shine on 2021/6/4 |
||||
*/ |
||||
@Open |
||||
public class ChartEditContext { |
||||
|
||||
private static ChartEditMode current = ChartEditMode.NORMAL; |
||||
|
||||
public static void switchTo(ChartEditMode mode) { |
||||
current = mode; |
||||
} |
||||
|
||||
public static boolean duchampMode() { |
||||
return current == ChartEditMode.DUCHAMP; |
||||
} |
||||
|
||||
public static boolean normalMode() { |
||||
return current == ChartEditMode.NORMAL; |
||||
} |
||||
} |
@ -0,0 +1,12 @@
|
||||
package com.fr.design.mainframe.chart.mode; |
||||
|
||||
/** |
||||
* @author shine |
||||
* @version 10.0 |
||||
* Created by shine on 2021/6/4 |
||||
*/ |
||||
//todo:refactor 弹出框图表没有单元格数据源,就不用一层层传下去了
|
||||
public enum ChartEditMode { |
||||
NORMAL, |
||||
DUCHAMP |
||||
} |
Loading…
Reference in new issue