@ -0,0 +1,73 @@
|
||||
package com.fr.design.gui.icombobox; |
||||
|
||||
import com.fr.log.FineLoggerFactory; |
||||
|
||||
import javax.swing.JTree; |
||||
import javax.swing.SwingWorker; |
||||
import javax.swing.tree.TreeCellRenderer; |
||||
import java.util.concurrent.FutureTask; |
||||
|
||||
/** |
||||
* 模糊搜索前需执行完前置任务的TreeComboBox |
||||
* @author Lucian.Chen |
||||
* @version 10.0 |
||||
* Created by Lucian.Chen on 2021/4/14 |
||||
*/ |
||||
public class SearchPreTaskTreeComboBox extends FRTreeComboBox { |
||||
|
||||
/** |
||||
* 模糊搜索前任务 |
||||
*/ |
||||
private FutureTask<Void> preSearchTask; |
||||
|
||||
public SearchPreTaskTreeComboBox(JTree tree, TreeCellRenderer renderer, boolean editable) { |
||||
super(tree, renderer, editable); |
||||
} |
||||
|
||||
public FutureTask<Void> getPreSearchTask() { |
||||
return preSearchTask; |
||||
} |
||||
|
||||
public void setPreSearchTask(FutureTask<Void> preSearchTask) { |
||||
this.preSearchTask = preSearchTask; |
||||
} |
||||
|
||||
protected UIComboBoxEditor createEditor() { |
||||
return new SearchPreTaskComboBoxEditor(this); |
||||
} |
||||
|
||||
private class SearchPreTaskComboBoxEditor extends FrTreeSearchComboBoxEditor { |
||||
|
||||
public SearchPreTaskComboBoxEditor(FRTreeComboBox comboBox) { |
||||
super(comboBox); |
||||
} |
||||
|
||||
protected void changeHandler() { |
||||
if (isSetting()) { |
||||
return; |
||||
} |
||||
setPopupVisible(true); |
||||
// 模糊搜索异步
|
||||
new SwingWorker<Void, Void>() { |
||||
@Override |
||||
protected Void doInBackground() { |
||||
FutureTask<Void> task = getPreSearchTask(); |
||||
try { |
||||
// 确保模糊搜索前任务执行完成后,再进行模糊搜索
|
||||
if (task != null) { |
||||
task.get(); |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
if (task != null) { |
||||
// 任务执行后置空,否则会被别的操作重复触发
|
||||
setPreSearchTask(null); |
||||
} |
||||
search(); |
||||
return null; |
||||
} |
||||
}.execute(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,173 @@
|
||||
package com.fr.design.mainframe.check; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.dialog.FineJOptionPane; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.file.FILE; |
||||
import com.fr.file.FileNodeFILE; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.rpc.ExceptionHandler; |
||||
import com.fr.rpc.RPCInvokerExceptionInfo; |
||||
import com.fr.workspace.WorkContext; |
||||
import com.fr.workspace.server.check.TemplateChecker; |
||||
|
||||
import javax.swing.BoxLayout; |
||||
import javax.swing.JDialog; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingUtilities; |
||||
import javax.swing.SwingWorker; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.WindowAdapter; |
||||
import java.awt.event.WindowEvent; |
||||
import java.util.Set; |
||||
import java.util.concurrent.ExecutionException; |
||||
|
||||
import static javax.swing.JOptionPane.OK_CANCEL_OPTION; |
||||
import static javax.swing.JOptionPane.OK_OPTION; |
||||
import static javax.swing.JOptionPane.WARNING_MESSAGE; |
||||
|
||||
public class CheckButton extends UIButton { |
||||
|
||||
private UILabel message; |
||||
private UIButton okButton; |
||||
private JDialog dialog; |
||||
private UILabel uiLabel; |
||||
|
||||
public CheckButton() { |
||||
this.setIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/check.png")); |
||||
this.setToolTipText(Toolkit.i18nText("Fine_Designer_Check_Font")); |
||||
this.set4ToolbarButton(); |
||||
this.addActionListener(checkListener); |
||||
} |
||||
|
||||
private ActionListener checkListener = new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
|
||||
// Try check
|
||||
final SwingWorker<Set<String>, Void> checkThread = new SwingWorker<Set<String>, Void>() { |
||||
@Override |
||||
protected Set<String> doInBackground() throws Exception { |
||||
// 返回校验结果
|
||||
return check(DesignerContext.getDesignerFrame().getSelectedJTemplate()); |
||||
} |
||||
|
||||
@Override |
||||
protected void done() { |
||||
try { |
||||
Set<String> set = get(); |
||||
if (set == null) { |
||||
return; |
||||
} |
||||
if(set.isEmpty()) { |
||||
okButton.setEnabled(true); |
||||
uiLabel.setIcon(BaseUtils.readIcon("com/fr/design/images/correct.png")); |
||||
message.setText("<html>" + Toolkit.i18nText("Fine_Designer_Check_Font_Success") + "</html>"); |
||||
} else { |
||||
dialog.dispose(); |
||||
StringBuilder textBuilder = new StringBuilder(); |
||||
textBuilder.append(Toolkit.i18nText("Fine_Designer_Check_Font_Missing_Font")).append("\n"); |
||||
for (String font : set) { |
||||
textBuilder.append(font).append("\n"); |
||||
} |
||||
String areaText = textBuilder.toString(); |
||||
CheckFontInfoDialog dialog = new CheckFontInfoDialog(DesignerContext.getDesignerFrame(), areaText); |
||||
dialog.setVisible(true); |
||||
} |
||||
} catch (InterruptedException | ExecutionException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
JTemplate jtemplate = DesignerContext.getDesignerFrame().getSelectedJTemplate(); |
||||
if (jtemplate == null || jtemplate.getEditingFILE() == null) { |
||||
return; |
||||
} |
||||
FILE currentTemplate = jtemplate.getEditingFILE(); |
||||
if(currentTemplate instanceof FileNodeFILE){ |
||||
checkThread.execute(); |
||||
}else { |
||||
//模板不在报表环境下,提示保存
|
||||
int selVal = FineJOptionPane.showConfirmDialog( |
||||
DesignerContext.getDesignerFrame(), |
||||
Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Message"), |
||||
Toolkit.i18nText("Fine_Designer_Check_Font"), |
||||
OK_CANCEL_OPTION, |
||||
WARNING_MESSAGE); |
||||
|
||||
if (OK_OPTION == selVal) { |
||||
//保存成功才执行检测
|
||||
if (jtemplate.saveAsTemplate2Env()) { |
||||
checkThread.execute(); |
||||
} |
||||
} |
||||
} |
||||
initDialogPane(); |
||||
okButton.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
dialog.dispose(); |
||||
} |
||||
}); |
||||
|
||||
dialog.addWindowListener(new WindowAdapter() { |
||||
public void windowClosed(WindowEvent e) { |
||||
checkThread.cancel(true); |
||||
} |
||||
}); |
||||
|
||||
dialog.setVisible(true); |
||||
dialog.dispose(); |
||||
} |
||||
}; |
||||
|
||||
private Set<String> check(JTemplate jtemplate) { |
||||
String path = jtemplate.getEditingFILE().getEnvFullName(); |
||||
Set<String> fontSet = WorkContext.getCurrent().get(TemplateChecker.class, new ExceptionHandler<Void>() { |
||||
|
||||
@Override |
||||
public Void callHandler(RPCInvokerExceptionInfo rpcInvokerExceptionInfo) { |
||||
uiLabel.setIcon(BaseUtils.readIcon("com/fr/design/images/error.png")); |
||||
message.setText("<html>" + Toolkit.i18nText("Fine_Designer_Check_Font_Upgrade") + "</html>"); |
||||
okButton.setEnabled(true); |
||||
return null; |
||||
} |
||||
}).checkFont(path); |
||||
return fontSet; |
||||
} |
||||
|
||||
private void initDialogPane() { |
||||
message = new UILabel(); |
||||
message.setText(Toolkit.i18nText("Fine-Designer_Check_Font_Checking") + "..."); |
||||
uiLabel = new UILabel(); |
||||
okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK")); |
||||
okButton.setEnabled(false); |
||||
dialog = new JDialog(); |
||||
dialog.setTitle(Toolkit.i18nText("Fine_Designer_Check_Font")); |
||||
dialog.setModal(true); |
||||
dialog.setSize(new Dimension(268, 118)); |
||||
JPanel jp = new JPanel(); |
||||
JPanel upPane = new JPanel(); |
||||
JPanel downPane = new JPanel(); |
||||
uiLabel = new UILabel(BaseUtils.readIcon("com/fr/design/images/waiting.png")); |
||||
upPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10)); |
||||
upPane.add(uiLabel); |
||||
upPane.add(message); |
||||
downPane.setLayout(new FlowLayout(FlowLayout.CENTER, 6, 0)); |
||||
downPane.add(okButton); |
||||
jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); |
||||
jp.add(upPane); |
||||
jp.add(downPane); |
||||
dialog.add(jp); |
||||
dialog.setResizable(false); |
||||
dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor(this)); |
||||
} |
||||
} |
@ -0,0 +1,139 @@
|
||||
package com.fr.design.mainframe.check; |
||||
|
||||
import com.fr.design.dialog.link.MessageWithLink; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.IOUtils; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JDialog; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JScrollPane; |
||||
import javax.swing.JTextArea; |
||||
import javax.swing.UIManager; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Cursor; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.util.Locale; |
||||
|
||||
/** |
||||
* 字体缺失检测的具体结果对话框 |
||||
* |
||||
*/ |
||||
public class CheckFontInfoDialog extends JDialog implements ActionListener { |
||||
|
||||
private JPanel topPanel; |
||||
private JPanel upInTopPanel; |
||||
private JPanel downInTopPanel; |
||||
private JPanel hiddenPanel; |
||||
private JPanel bottomPanel; |
||||
|
||||
private UILabel imageLabel; |
||||
private UILabel directUiLabel; |
||||
private UILabel detailLabel; |
||||
|
||||
public CheckFontInfoDialog(Frame parent, String areaText) { |
||||
super(parent,true); |
||||
//提示信息
|
||||
JPanel imagePanel = new JPanel(); |
||||
imageLabel = new UILabel(IOUtils.readIcon("com/fr/design/images/warnings/warning32.png")); |
||||
imagePanel.add(imageLabel); |
||||
|
||||
JPanel messagePanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); |
||||
MessageWithLink linkMessage = new MessageWithLink(Toolkit.i18nText("Fine_Designer_Check_Font_Message"), |
||||
Toolkit.i18nText("Fine_Designer_Check_Font_Install_Font"), |
||||
CloudCenter.getInstance().acquireUrlByKind("help.install.font", "https://help.fanruan.com/finereport/doc-view-3999.html")); |
||||
linkMessage.setPreferredSize(new Dimension(380, 31)); |
||||
messagePanel.add(linkMessage); |
||||
|
||||
// 查看详情按钮
|
||||
directUiLabel = new UILabel(); |
||||
directUiLabel.setIcon(UIManager.getIcon("OptionPane.narrow.right")); |
||||
detailLabel = new UILabel(); |
||||
detailLabel.setText(Toolkit.i18nText("Fine_Designer_Look_Detail")); |
||||
|
||||
upInTopPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
upInTopPanel.add(imageLabel, BorderLayout.WEST); |
||||
upInTopPanel.add(messagePanel, BorderLayout.CENTER); |
||||
|
||||
downInTopPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
downInTopPanel.add(directUiLabel, BorderLayout.WEST); |
||||
downInTopPanel.add(detailLabel, BorderLayout.CENTER); |
||||
|
||||
topPanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); |
||||
topPanel.add(upInTopPanel, BorderLayout.NORTH); |
||||
topPanel.add(downInTopPanel, BorderLayout.SOUTH); |
||||
|
||||
//中间的详情展示(可隐藏)
|
||||
hiddenPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
hiddenPanel.setBorder(BorderFactory.createEmptyBorder(0,12,0,12)); |
||||
JScrollPane scrollPane = new JScrollPane(); |
||||
JTextArea checkArea = new JTextArea(areaText); |
||||
scrollPane.setViewportView(checkArea); |
||||
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); |
||||
checkArea.setEnabled(false); |
||||
hiddenPanel.add(scrollPane); |
||||
hiddenPanel.setVisible(false); |
||||
|
||||
downInTopPanel.addMouseListener(new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
if (hiddenPanel.isVisible()) { |
||||
hiddenPanel.setVisible(false); |
||||
CheckFontInfoDialog.this.setSize(new Dimension(380, 185)); |
||||
detailLabel.setText(Toolkit.i18nText("Fine_Designer_Look_Detail")); |
||||
directUiLabel.setIcon(UIManager.getIcon("OptionPane.narrow.right")); |
||||
} else { |
||||
CheckFontInfoDialog.this.setSize(new Dimension(380, 280)); |
||||
hiddenPanel.setVisible(true); |
||||
detailLabel.setText(Toolkit.i18nText("Fine_Designer_Hide_Detail")); |
||||
directUiLabel.setIcon(UIManager.getIcon("OptionPane.narrow.down")); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void mouseEntered(MouseEvent e) { |
||||
detailLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseExited(MouseEvent e) { |
||||
detailLabel.setCursor(Cursor.getDefaultCursor()); |
||||
} |
||||
}); |
||||
|
||||
//底部的按钮面板
|
||||
UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK")); |
||||
JPanel buttonPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
buttonPanel.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); |
||||
buttonPanel.add(okButton, BorderLayout.EAST); |
||||
okButton.addActionListener(this); |
||||
bottomPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
bottomPanel.add(buttonPanel); |
||||
|
||||
this.setTitle(Toolkit.i18nText("Fine_Designer_Check_Font")); |
||||
this.setResizable(false); |
||||
|
||||
this.add(topPanel, BorderLayout.NORTH); |
||||
this.add(hiddenPanel, BorderLayout.CENTER); |
||||
this.add(bottomPanel, BorderLayout.SOUTH); |
||||
this.setSize(new Dimension(GeneralContext.getLocale().equals(Locale.US)? 400:380, 185)); |
||||
|
||||
GUICoreUtils.centerWindow(this); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
this.dispose(); |
||||
} |
||||
} |
After Width: | Height: | Size: 386 B |
Before Width: | Height: | Size: 942 B After Width: | Height: | Size: 736 B |
After Width: | Height: | Size: 785 B |
After Width: | Height: | Size: 768 B |
After Width: | Height: | Size: 1011 B |
After Width: | Height: | Size: 942 B |