forked from fanruan/design
shine
3 years ago
77 changed files with 3321 additions and 1740 deletions
@ -0,0 +1,251 @@ |
|||||||
|
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 static final double SCALE = 1.2; |
||||||
|
|
||||||
|
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); |
||||||
|
this.setModal(true); |
||||||
|
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 = getMaxDimensionWidth(maxWidth, solution); |
||||||
|
return panel; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private int getMaxDimensionWidth(int width, String solution) { |
||||||
|
int maxWidth = GraphHelper.getWidth(solution, DesignUtils.getDefaultGUIFont()); |
||||||
|
if (maxWidth >= width) { |
||||||
|
maxWidth = (int) (SCALE * maxWidth); |
||||||
|
} else { |
||||||
|
maxWidth = width; |
||||||
|
} |
||||||
|
return maxWidth; |
||||||
|
} |
||||||
|
|
||||||
|
@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,453 @@ |
|||||||
|
package com.fr.design.javascript; |
||||||
|
|
||||||
|
import com.fr.base.BaseFormula; |
||||||
|
import com.fr.base.Parameter; |
||||||
|
import com.fr.design.dialog.BasicDialog; |
||||||
|
import com.fr.design.dialog.BasicPane; |
||||||
|
import com.fr.design.dialog.DialogActionAdapter; |
||||||
|
import com.fr.design.dialog.FineJOptionPane; |
||||||
|
import com.fr.design.editor.editor.FormulaEditor; |
||||||
|
import com.fr.design.gui.frpane.ReportletParameterViewPane; |
||||||
|
import com.fr.design.gui.ibutton.UIButton; |
||||||
|
import com.fr.design.gui.ibutton.UIRadioButton; |
||||||
|
import com.fr.design.gui.icheckbox.UICheckBox; |
||||||
|
import com.fr.design.gui.icombobox.UIComboBox; |
||||||
|
import com.fr.design.gui.icombobox.UIComboBoxRenderer; |
||||||
|
import com.fr.design.gui.ilable.UILabel; |
||||||
|
import com.fr.design.gui.itextfield.UITextField; |
||||||
|
import com.fr.design.gui.itree.filetree.TemplateFileTree; |
||||||
|
import com.fr.design.hyperlink.AbstractHyperLinkPane; |
||||||
|
import com.fr.design.i18n.Toolkit; |
||||||
|
import com.fr.design.layout.FRGUIPaneFactory; |
||||||
|
import com.fr.design.layout.TableLayout; |
||||||
|
import com.fr.design.layout.TableLayoutHelper; |
||||||
|
import com.fr.design.mainframe.DesignerContext; |
||||||
|
import com.fr.design.scrollruler.ModLineBorder; |
||||||
|
import com.fr.file.filetree.IOFileNodeFilter; |
||||||
|
import com.fr.general.GeneralUtils; |
||||||
|
import com.fr.js.ExportJavaScript; |
||||||
|
import com.fr.stable.ParameterProvider; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
|
||||||
|
import javax.swing.AbstractButton; |
||||||
|
import javax.swing.BorderFactory; |
||||||
|
import javax.swing.ButtonGroup; |
||||||
|
import javax.swing.DefaultComboBoxModel; |
||||||
|
import javax.swing.JList; |
||||||
|
import javax.swing.JPanel; |
||||||
|
import javax.swing.JScrollPane; |
||||||
|
import javax.swing.SwingUtilities; |
||||||
|
import javax.swing.event.TableModelEvent; |
||||||
|
import javax.swing.event.TableModelListener; |
||||||
|
import java.awt.BorderLayout; |
||||||
|
import java.awt.CardLayout; |
||||||
|
import java.awt.Component; |
||||||
|
import java.awt.Dimension; |
||||||
|
import java.awt.event.ActionEvent; |
||||||
|
import java.awt.event.ActionListener; |
||||||
|
import java.awt.event.ItemEvent; |
||||||
|
import java.awt.event.ItemListener; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
public class ExportJavaScriptPane extends AbstractHyperLinkPane<ExportJavaScript> { |
||||||
|
|
||||||
|
private ExportRadioGroup templateRadioGroup; |
||||||
|
private UIRadioButton currentTemplateRadio; |
||||||
|
private UIRadioButton otherTemplateRadio; |
||||||
|
private UITextField reportPathTextField; |
||||||
|
private UIButton browserButton; |
||||||
|
private UIComboBox exportTypeComboBox; |
||||||
|
private ExportRadioGroup fileNameRadioGroup; |
||||||
|
private UIRadioButton defaultNameRadio; |
||||||
|
private UIRadioButton customNameRadio; |
||||||
|
private FormulaEditor fileNameFormulaEditor; |
||||||
|
private UICheckBox extendParametersCheckBox; |
||||||
|
private ReportletParameterViewPane parameterViewPane; |
||||||
|
|
||||||
|
private static final double p = TableLayout.PREFERRED; |
||||||
|
private static final Map<String, String> EXPORT_TYPES_MAP = new HashMap<>(); |
||||||
|
private static final String CURRENT_TEMPLATE = "current"; |
||||||
|
private static final String DEFAULT_FILENAME = "default"; |
||||||
|
|
||||||
|
|
||||||
|
static { |
||||||
|
EXPORT_TYPES_MAP.put(ExportJavaScript.EXPORT_PDF, Toolkit.i18nText("Fine-Design_Basic_Export_JS_PDF")); |
||||||
|
EXPORT_TYPES_MAP.put(ExportJavaScript.EXPORT_EXCEL_PAGE, Toolkit.i18nText("Fine-Design_Basic_Export_JS_Excel_Page")); |
||||||
|
EXPORT_TYPES_MAP.put(ExportJavaScript.EXPORT_EXCEL_SIMPLE, Toolkit.i18nText("Fine-Design_Basic_Export_JS_Excel_Simple")); |
||||||
|
EXPORT_TYPES_MAP.put(ExportJavaScript.EXPORT_EXCEL_SHEET, Toolkit.i18nText("Fine-Design_Basic_Export_JS_Excel_Sheet")); |
||||||
|
EXPORT_TYPES_MAP.put(ExportJavaScript.EXPORT_WORD, Toolkit.i18nText("Fine-Design_Basic_Export_JS_Word")); |
||||||
|
EXPORT_TYPES_MAP.put(ExportJavaScript.EXPORT_IMAGE, Toolkit.i18nText("Fine-Design_Basic_Export_JS_Image")); |
||||||
|
} |
||||||
|
|
||||||
|
public ExportJavaScriptPane() { |
||||||
|
initComponents(); |
||||||
|
} |
||||||
|
|
||||||
|
private void initComponents() { |
||||||
|
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||||
|
this.setBorder(BorderFactory.createTitledBorder(new ModLineBorder(ModLineBorder.TOP), Toolkit.i18nText("Fine-Design_Basic_Export_JS_Setting"))); |
||||||
|
|
||||||
|
//导出模板+导出方式+导出文件名
|
||||||
|
JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
|
||||||
|
//导出模板
|
||||||
|
JPanel chooseTemplatePane = initChooseTemplatePane(); |
||||||
|
northPane.add(chooseTemplatePane, BorderLayout.NORTH); |
||||||
|
|
||||||
|
//导出方式
|
||||||
|
JPanel exportTypePane = initExportTypePane(); |
||||||
|
northPane.add(exportTypePane, BorderLayout.CENTER); |
||||||
|
|
||||||
|
//导出文件名
|
||||||
|
JPanel fileNamePane = initFileNamePane(); |
||||||
|
northPane.add(fileNamePane, BorderLayout.SOUTH); |
||||||
|
|
||||||
|
//参数
|
||||||
|
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
JPanel paramsPane = initParamsPane(); |
||||||
|
centerPane.add(paramsPane); |
||||||
|
|
||||||
|
this.add(northPane, BorderLayout.NORTH); |
||||||
|
this.add(centerPane, BorderLayout.CENTER); |
||||||
|
} |
||||||
|
|
||||||
|
private JPanel initParamsPane() { |
||||||
|
extendParametersCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Extends_Report_Parameters")); |
||||||
|
parameterViewPane = new ReportletParameterViewPane(getChartParaType(), getValueEditorPane(), getValueEditorPane()); |
||||||
|
parameterViewPane.addTableEditorListener(new TableModelListener() { |
||||||
|
public void tableChanged(TableModelEvent e) { |
||||||
|
List<ParameterProvider> list = parameterViewPane.update(); |
||||||
|
HashSet<String> tempSet = new HashSet<>(); |
||||||
|
for (int i = 0; i < list.size(); i++) { |
||||||
|
if (StringUtils.isEmpty(list.get(i).getName())) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (tempSet.contains(list.get(i).toString())) { |
||||||
|
list.remove(i); |
||||||
|
FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameter_Duplicate_Name") + "!"); |
||||||
|
return; |
||||||
|
} |
||||||
|
tempSet.add(list.get(i).toString()); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
extendParametersCheckBox.addItemListener(new ItemListener() { |
||||||
|
@Override |
||||||
|
public void itemStateChanged(ItemEvent e) { |
||||||
|
parameterViewPane.setVisible(e.getStateChange() == ItemEvent.DESELECTED); |
||||||
|
} |
||||||
|
}); |
||||||
|
JPanel paramsPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
paramsPane.setBorder(BorderFactory.createTitledBorder(new ModLineBorder(ModLineBorder.TOP), Toolkit.i18nText("Fine-Design_Basic_Parameters"))); |
||||||
|
paramsPane.add(extendParametersCheckBox, BorderLayout.NORTH); |
||||||
|
JPanel dynamicPaneWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
dynamicPaneWrapper.add(parameterViewPane); |
||||||
|
paramsPane.add(dynamicPaneWrapper, BorderLayout.CENTER); |
||||||
|
return paramsPane; |
||||||
|
} |
||||||
|
|
||||||
|
private JPanel initFileNamePane() { |
||||||
|
UILabel nameLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Export_JS_Filename") + ":"); |
||||||
|
fileNameRadioGroup = new ExportRadioGroup(); |
||||||
|
defaultNameRadio = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Export_JS_Filename_Default")); |
||||||
|
defaultNameRadio.setSelected(true); |
||||||
|
customNameRadio = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Export_JS_Filename_Custom")); |
||||||
|
addRadioToGroup(fileNameRadioGroup, defaultNameRadio, customNameRadio); |
||||||
|
fileNameFormulaEditor = new FormulaEditor(Toolkit.i18nText("Fine-Design_Report_Parameter_Formula")); |
||||||
|
fileNameRadioGroup.addActionListener(new ActionListener() { |
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent e) { |
||||||
|
if (defaultNameRadio.isSelected()) { |
||||||
|
fileNameFormulaEditor.setEnabled(false); |
||||||
|
} else { |
||||||
|
fileNameFormulaEditor.setEnabled(true); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
Component[][] components = new Component[][]{{nameLabel, defaultNameRadio, customNameRadio, fileNameFormulaEditor}}; |
||||||
|
JPanel fileNameRadioPane = TableLayoutHelper.createTableLayoutPane(components, new double[]{p}, new double[]{p, p, p, p}); |
||||||
|
|
||||||
|
JPanel fileNameTipPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
UILabel fileNameTipLabel = new UILabel("<html><body style=\"color:red\">" + Toolkit.i18nText("Fine-Design_Basic_Export_JS_Title_Tip_Front") + "\\/:*?\"<>|" + Toolkit.i18nText("Fine-Design_Basic_Export_JS_Title_Tip_Back") + "</html>"); |
||||||
|
fileNameTipPane.add(fileNameTipLabel); |
||||||
|
|
||||||
|
JPanel fileNamePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
fileNamePane.add(fileNameRadioPane, BorderLayout.NORTH); |
||||||
|
fileNamePane.add(fileNameTipPane, BorderLayout.CENTER); |
||||||
|
fileNameTipPane.setBorder(BorderFactory.createEmptyBorder(5,2,5,2)); |
||||||
|
fileNamePane.setBorder(BorderFactory.createEmptyBorder(5,2,5,2)); |
||||||
|
return fileNamePane; |
||||||
|
} |
||||||
|
|
||||||
|
private JPanel initExportTypePane() { |
||||||
|
UILabel typeLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Export_JS_Type") + ":"); |
||||||
|
exportTypeComboBox = new UIComboBox(new DefaultComboBoxModel<String>()); |
||||||
|
DefaultComboBoxModel<String> comboBoxModel = (DefaultComboBoxModel<String>) exportTypeComboBox.getModel(); |
||||||
|
String[] allExportTypes = new String[]{ExportJavaScript.EXPORT_PDF, ExportJavaScript.EXPORT_EXCEL_PAGE, ExportJavaScript.EXPORT_EXCEL_SIMPLE, ExportJavaScript.EXPORT_EXCEL_SHEET, ExportJavaScript.EXPORT_WORD, ExportJavaScript.EXPORT_IMAGE}; |
||||||
|
for (int i = 0; i < allExportTypes.length; i++) { |
||||||
|
comboBoxModel.addElement(allExportTypes[i]); |
||||||
|
} |
||||||
|
this.exportTypeComboBox.setRenderer(new UIComboBoxRenderer() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
||||||
|
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||||
|
if (value instanceof String) { |
||||||
|
this.setText(EXPORT_TYPES_MAP.get(value)); |
||||||
|
} |
||||||
|
return this; |
||||||
|
} |
||||||
|
}); |
||||||
|
Component[][] components = new Component[][]{{typeLabel, exportTypeComboBox}}; |
||||||
|
|
||||||
|
JPanel exportTypePane = TableLayoutHelper.createTableLayoutPane(components, new double[]{p}, new double[]{p, p}); |
||||||
|
exportTypePane.setBorder(BorderFactory.createEmptyBorder(5,2,5,2)); |
||||||
|
return exportTypePane; |
||||||
|
} |
||||||
|
|
||||||
|
private JPanel initChooseTemplatePane() { |
||||||
|
UILabel templateLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Export_JS_Template") + ":"); |
||||||
|
templateRadioGroup = new ExportRadioGroup(); |
||||||
|
currentTemplateRadio = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Export_JS_Template_Current")); |
||||||
|
currentTemplateRadio.setSelected(true); |
||||||
|
otherTemplateRadio = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Export_JS_Template_Other")); |
||||||
|
addRadioToGroup(templateRadioGroup, currentTemplateRadio, otherTemplateRadio); |
||||||
|
templateRadioGroup.addActionListener(new ActionListener() { |
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent e) { |
||||||
|
if (currentTemplateRadio.isSelected()) { |
||||||
|
reportPathTextField.setEnabled(false); |
||||||
|
browserButton.setEnabled(false); |
||||||
|
} else { |
||||||
|
reportPathTextField.setEnabled(true); |
||||||
|
browserButton.setEnabled(true); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
Component[][] components = new Component[][]{{templateLabel, currentTemplateRadio, otherTemplateRadio}}; |
||||||
|
JPanel reportletRadioPane = TableLayoutHelper.createTableLayoutPane(components, new double[]{p}, new double[]{p, p, p}); |
||||||
|
|
||||||
|
JPanel reportletNamePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
// 路径输入框
|
||||||
|
reportPathTextField = new UITextField(20); |
||||||
|
reportletNamePane.add(reportPathTextField, BorderLayout.CENTER); |
||||||
|
|
||||||
|
// 选择路径按钮
|
||||||
|
browserButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Select")); |
||||||
|
browserButton.setPreferredSize(new Dimension(browserButton.getPreferredSize().width, 20)); |
||||||
|
reportletNamePane.add(browserButton, BorderLayout.EAST); |
||||||
|
browserButton.addActionListener(new ActionListener() { |
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent evt) { |
||||||
|
final ReportletPane reportletPane = new ReportletPane(); |
||||||
|
reportletPane.setSelectedReportletPath(reportPathTextField.getText()); |
||||||
|
BasicDialog reportletDialog = reportletPane.showWindow(SwingUtilities.getWindowAncestor(ExportJavaScriptPane.this)); |
||||||
|
|
||||||
|
reportletDialog.addDialogActionListener(new DialogActionAdapter() { |
||||||
|
@Override |
||||||
|
public void doOk() { |
||||||
|
reportPathTextField.setText(reportletPane.getSelectedReportletPath()); |
||||||
|
} |
||||||
|
}); |
||||||
|
reportletDialog.setVisible(true); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
JPanel chooseTemplatePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
chooseTemplatePane.add(reportletRadioPane, BorderLayout.NORTH); |
||||||
|
chooseTemplatePane.add(reportletNamePane, BorderLayout.CENTER); |
||||||
|
chooseTemplatePane.setBorder(BorderFactory.createEmptyBorder(0,2,5,2)); |
||||||
|
|
||||||
|
return chooseTemplatePane; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void populateBean(ExportJavaScript ob) { |
||||||
|
if (ob == null) { |
||||||
|
ob = new ExportJavaScript(); |
||||||
|
} |
||||||
|
this.templateRadioGroup.selectIndexButton(ob.isCurrentTemplate() ? 0 : 1); |
||||||
|
if (ob.isCurrentTemplate()) { |
||||||
|
this.reportPathTextField.setEnabled(false); |
||||||
|
this.browserButton.setEnabled(false); |
||||||
|
} else { |
||||||
|
this.reportPathTextField.setEnabled(true); |
||||||
|
this.browserButton.setEnabled(true); |
||||||
|
this.reportPathTextField.setText(ob.getTemplatePath()); |
||||||
|
} |
||||||
|
this.exportTypeComboBox.setSelectedItem(ob.getExportType()); |
||||||
|
this.fileNameRadioGroup.selectIndexButton(ob.isDefaultFileName() ? 0 : 1); |
||||||
|
if (ob.isDefaultFileName()) { |
||||||
|
this.fileNameFormulaEditor.setEnabled(false); |
||||||
|
} else { |
||||||
|
this.fileNameFormulaEditor.setEnabled(true); |
||||||
|
this.fileNameFormulaEditor.setValue(BaseFormula.createFormulaBuilder().build(ob.getFileName())); |
||||||
|
} |
||||||
|
if (ob.isExtendParameters()) { |
||||||
|
this.extendParametersCheckBox.setSelected(true); |
||||||
|
} else { |
||||||
|
this.extendParametersCheckBox.setSelected(false); |
||||||
|
List<ParameterProvider> parameterList = this.parameterViewPane.update(); |
||||||
|
parameterList.clear(); |
||||||
|
ParameterProvider[] parameters = ob.getParameters(); |
||||||
|
this.parameterViewPane.populate(parameters); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExportJavaScript updateBean() { |
||||||
|
ExportJavaScript exportJavaScript = new ExportJavaScript(); |
||||||
|
updateBean(exportJavaScript); |
||||||
|
return exportJavaScript; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void updateBean(ExportJavaScript exportJavaScript) { |
||||||
|
exportJavaScript.setCurrentTemplate(this.currentTemplateRadio.isSelected()); |
||||||
|
exportJavaScript.setTemplatePath(getTemplatePath()); |
||||||
|
exportJavaScript.setExportType(GeneralUtils.objectToString(this.exportTypeComboBox.getSelectedItem())); |
||||||
|
exportJavaScript.setDefaultFileName(this.defaultNameRadio.isSelected()); |
||||||
|
exportJavaScript.setFileName(getFileName()); |
||||||
|
exportJavaScript.setExtendParameters(this.extendParametersCheckBox.isSelected()); |
||||||
|
if (extendParametersCheckBox.isSelected()) { |
||||||
|
exportJavaScript.setParameters(null); |
||||||
|
} else { |
||||||
|
List<ParameterProvider> parameterList = this.parameterViewPane.update(); |
||||||
|
if (!parameterList.isEmpty()) { |
||||||
|
Parameter[] parameters = new Parameter[parameterList.size()]; |
||||||
|
parameterList.toArray(parameters); |
||||||
|
exportJavaScript.setParameters(parameters); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private String getTemplatePath() { |
||||||
|
return currentTemplateRadio.isSelected() ? CURRENT_TEMPLATE : reportPathTextField.getText(); |
||||||
|
} |
||||||
|
|
||||||
|
private String getFileName() { |
||||||
|
return defaultNameRadio.isSelected() ? DEFAULT_FILENAME : fileNameFormulaEditor.getUITextField().getText(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean accept(Object ob) { |
||||||
|
return ob instanceof ExportJavaScript; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void reset() { |
||||||
|
populateBean(null); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public java.lang.String title4PopupWindow() { |
||||||
|
return Toolkit.i18nText("Fine-Design_Basic_Export_JS_Event"); |
||||||
|
} |
||||||
|
|
||||||
|
private void addRadioToGroup(ButtonGroup buttonGroup, UIRadioButton... radios) { |
||||||
|
for (UIRadioButton radio : radios) { |
||||||
|
buttonGroup.add(radio); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class ExportRadioGroup extends ButtonGroup { |
||||||
|
private List<UIRadioButton> radioButtons = new ArrayList<>(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public void add(AbstractButton button) { |
||||||
|
super.add(button); |
||||||
|
|
||||||
|
UIRadioButton radioButton = (UIRadioButton) button; |
||||||
|
radioButtons.add(radioButton); |
||||||
|
} |
||||||
|
|
||||||
|
public void selectIndexButton(int index) { |
||||||
|
if (index < 0 || index > radioButtons.size() - 1) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
UIRadioButton button = radioButtons.get(index); |
||||||
|
button.setSelected(true); |
||||||
|
} |
||||||
|
|
||||||
|
public void addActionListener(ActionListener actionListener) { |
||||||
|
for (UIRadioButton radioButton : radioButtons) { |
||||||
|
radioButton.addActionListener(actionListener); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class ReportletPane extends BasicPane { |
||||||
|
private TemplateFileTree templateReportletTree; |
||||||
|
private JScrollPane t_panel; |
||||||
|
|
||||||
|
private JPanel cardPane; |
||||||
|
|
||||||
|
public ReportletPane() { |
||||||
|
this.setLayout(FRGUIPaneFactory.createM_BorderLayout()); |
||||||
|
|
||||||
|
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
this.add(centerPane, BorderLayout.CENTER); |
||||||
|
|
||||||
|
cardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); |
||||||
|
centerPane.add(cardPane, BorderLayout.CENTER); |
||||||
|
cardPane.setLayout(new CardLayout()); |
||||||
|
templateReportletTree = new TemplateFileTree(); |
||||||
|
IOFileNodeFilter filter = new IOFileNodeFilter(new String[]{".cpt"}); |
||||||
|
templateReportletTree.setFileNodeFilter(filter); |
||||||
|
cardPane.add(t_panel = new JScrollPane(templateReportletTree), "TEMPLATE"); |
||||||
|
|
||||||
|
this.refreshEnv(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查是否符合规范 |
||||||
|
* |
||||||
|
* @throws Exception 抛错 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkValid() throws Exception { |
||||||
|
String path = this.getSelectedReportletPath(); |
||||||
|
if (path == null) { |
||||||
|
throw new Exception(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Function_The_Selected_File_Cannot_Be_Null")); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 刷新Env |
||||||
|
*/ |
||||||
|
public void refreshEnv() { |
||||||
|
this.templateReportletTree.refreshEnv(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String title4PopupWindow() { |
||||||
|
return Toolkit.i18nText("Fine-Design_Basic_Export_JS_Event"); |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 返回选中的Reportlet的路径 |
||||||
|
*/ |
||||||
|
public String getSelectedReportletPath() { |
||||||
|
if (t_panel.isVisible()) { |
||||||
|
return templateReportletTree.getSelectedTemplatePath(); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 选中某Reportlet |
||||||
|
*/ |
||||||
|
public void setSelectedReportletPath(String reportletPath) { |
||||||
|
if (reportletPath == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
templateReportletTree.setSelectedTemplatePath(reportletPath); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package com.fr.env; |
||||||
|
|
||||||
|
import com.fr.general.locale.LocaleCenter; |
||||||
|
import com.fr.general.locale.LocaleMark; |
||||||
|
import com.fr.locale.InterProviderFactory; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
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<>(); |
||||||
|
LocaleMark<String> linkMark = LocaleCenter.getMark(RemoteDesignLocaleMark.class); |
||||||
|
String link = linkMark.getValue(); |
||||||
|
map.put(InterProviderFactory.getProvider().getLocText("Fine-Core_Remote_Design_Change_PassWord"), StringUtils.EMPTY); |
||||||
|
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,28 @@ |
|||||||
|
package com.fr.env.handler; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author hades |
||||||
|
* @version 10.0 |
||||||
|
* Created by hades on 2021/8/11 |
||||||
|
*/ |
||||||
|
public class RefWrapper { |
||||||
|
|
||||||
|
private final Throwable throwable; |
||||||
|
|
||||||
|
private final String link; |
||||||
|
|
||||||
|
|
||||||
|
public RefWrapper(Throwable throwable, String link) { |
||||||
|
this.throwable = throwable; |
||||||
|
this.link = link; |
||||||
|
} |
||||||
|
|
||||||
|
public Throwable getThrowable() { |
||||||
|
return throwable; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLink() { |
||||||
|
return link; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,90 @@ |
|||||||
|
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.RemoteWorkspaceURL; |
||||||
|
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<RefWrapper, ResultWrapper>> testList = new ArrayList<>(); |
||||||
|
|
||||||
|
private final List<Handler<RefWrapper, 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<RefWrapper, ResultWrapper>> list, DesignerWorkspaceInfo workspaceInfo) { |
||||||
|
Throwable throwable = e; |
||||||
|
ResultWrapper wrapper; |
||||||
|
String link = workspaceInfo.getConnection().getUrl() + RemoteWorkspaceURL.SYSTEM_LOGIN_PATH; |
||||||
|
for (Handler<RefWrapper, ResultWrapper> handler : list) { |
||||||
|
wrapper = handler.handle(new RefWrapper(throwable, link)); |
||||||
|
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, workspaceInfo); |
||||||
|
} |
||||||
|
|
||||||
|
public void handleInStart(Throwable e, DesignerWorkspaceInfo workspaceInfo) { |
||||||
|
if (workspaceInfo == null || workspaceInfo.getType() == DesignerWorkspaceType.Local) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
return; |
||||||
|
} |
||||||
|
handle(e, testList, workspaceInfo); |
||||||
|
} |
||||||
|
|
||||||
|
public void handleInTest(Throwable e, DesignerWorkspaceInfo workspaceInfo) { |
||||||
|
handle(e, testList, workspaceInfo); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -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,22 @@ |
|||||||
|
package com.fr.env.handler.impl; |
||||||
|
|
||||||
|
import com.fr.env.handler.Handler; |
||||||
|
import com.fr.env.handler.RefWrapper; |
||||||
|
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<RefWrapper, ResultWrapper> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public ResultWrapper handle(RefWrapper wrapper) { |
||||||
|
Throwable e = wrapper.getThrowable(); |
||||||
|
return new ResultWrapper(!(e instanceof CancellationException), e); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
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.RefWrapper; |
||||||
|
import com.fr.env.handler.ResultWrapper; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import javax.swing.SwingUtilities; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author hades |
||||||
|
* @version 10.0 |
||||||
|
* Created by hades on 2021/8/5 |
||||||
|
*/ |
||||||
|
public class CommonHandler implements Handler<RefWrapper, ResultWrapper> { |
||||||
|
|
||||||
|
private final boolean onSwitch; |
||||||
|
|
||||||
|
public CommonHandler(boolean onSwitch) { |
||||||
|
this.onSwitch = onSwitch; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ResultWrapper handle(RefWrapper wrapper) { |
||||||
|
Throwable e = wrapper.getThrowable(); |
||||||
|
if (e instanceof ExceptionDescriptor) { |
||||||
|
ExceptionDescriptor exceptionDescriptor = (ExceptionDescriptor) e; |
||||||
|
SwingUtilities.invokeLater(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
String link = HelpLink.getLink(exceptionDescriptor.solution()); |
||||||
|
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(StringUtils.isEmpty(link) ? wrapper.getLink() : link). |
||||||
|
setThrowable(e).build(); |
||||||
|
detailErrorLinkDialog.setVisible(true); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
return new ResultWrapper(e); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
package com.fr.env.handler.impl; |
||||||
|
|
||||||
|
import com.fr.env.handler.Handler; |
||||||
|
import com.fr.env.handler.RefWrapper; |
||||||
|
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<RefWrapper, ResultWrapper> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public ResultWrapper handle(RefWrapper wrapper) { |
||||||
|
Throwable e = wrapper.getThrowable(); |
||||||
|
if (e instanceof ExecutionException) { |
||||||
|
return new ResultWrapper(e.getCause()); |
||||||
|
} |
||||||
|
return new ResultWrapper(e); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.fr.env.handler.impl; |
||||||
|
|
||||||
|
import com.fr.base.exception.ExceptionDescriptor; |
||||||
|
import com.fr.env.handler.Handler; |
||||||
|
import com.fr.env.handler.RefWrapper; |
||||||
|
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<RefWrapper, ResultWrapper> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public ResultWrapper handle(RefWrapper wrapper) { |
||||||
|
Throwable e = wrapper.getThrowable(); |
||||||
|
if (!(e instanceof ExceptionDescriptor)) { |
||||||
|
return new ResultWrapper(ExceptionConverter.getInstance().convert(e)) ; |
||||||
|
} |
||||||
|
return new ResultWrapper(e); |
||||||
|
} |
||||||
|
} |
@ -1,23 +1,32 @@ |
|||||||
package com.fr.design.mainframe.widget.arrangement.buttons; |
package com.fr.design.mainframe.widget.arrangement.buttons; |
||||||
|
|
||||||
|
import com.fr.design.event.UIObserver; |
||||||
|
import com.fr.design.event.UIObserverListener; |
||||||
import com.fr.design.gui.ibutton.UIButton; |
import com.fr.design.gui.ibutton.UIButton; |
||||||
import com.fr.design.mainframe.MultiSelectionArrangement; |
import com.fr.design.mainframe.MultiSelectionArrangement; |
||||||
|
|
||||||
public abstract class AbstractMultiSelectionArrangementButton implements MultiSelectionArrangementButton { |
public abstract class AbstractMultiSelectionArrangementButton extends UIButton implements MultiSelectionArrangementButton, UIObserver { |
||||||
|
private static final long serialVersionUID = -2114423583742242771L; |
||||||
protected MultiSelectionArrangement arrangement; |
protected MultiSelectionArrangement arrangement; |
||||||
|
protected UIObserverListener uiObserverListener; |
||||||
|
|
||||||
public AbstractMultiSelectionArrangementButton(MultiSelectionArrangement arrangement) { |
public AbstractMultiSelectionArrangementButton(MultiSelectionArrangement arrangement) { |
||||||
|
super(); |
||||||
this.arrangement = arrangement; |
this.arrangement = arrangement; |
||||||
|
this.setNormalPainted(false); |
||||||
|
this.setBorderPaintedOnlyWhenPressed(true); |
||||||
|
this.setIcon(getIcon()); |
||||||
|
this.setToolTipText(getTipText()); |
||||||
|
this.addActionListener(getActionListener()); |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public UIButton create() { |
public void registerChangeListener(UIObserverListener listener) { |
||||||
UIButton btn = new UIButton(); |
uiObserverListener = listener; |
||||||
btn.setNormalPainted(false); |
} |
||||||
btn.setBorderPaintedOnlyWhenPressed(true); |
|
||||||
btn.setIcon(getIcon()); |
@Override |
||||||
btn.setToolTipText(getTipText()); |
public boolean shouldResponseChangeListener() { |
||||||
btn.addActionListener(getActionListener()); |
return true; |
||||||
return btn; |
|
||||||
} |
} |
||||||
} |
} |
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue