diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java index 2ae9e13f7..35abeb82c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java @@ -5,20 +5,29 @@ import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.ComparatorUtils; - import com.fr.general.log.Log4jConfig; import com.fr.log.FineLoggerFactory; import com.fr.third.apache.log4j.Level; import com.fr.third.apache.log4j.spi.LoggingEvent; import com.fr.third.apache.log4j.spi.ThrowableInformation; -import javax.swing.*; +import javax.swing.AbstractAction; +import javax.swing.ActionMap; +import javax.swing.InputMap; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JTextPane; +import javax.swing.KeyStroke; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultEditorKit; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -32,57 +41,74 @@ import java.util.Date; import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; public class DesignerLogHandler { - + private static final SimpleDateFormat LOG_SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - protected static final int INFO_INT = Level.INFO.toInt(); - protected static final int ERROR_INT = Level.ERROR.toInt(); - protected static final int WARN_INT = Level.WARN.toInt(); - protected static final int DEBUG_INT = Level.DEBUG.toInt(); + + private static final int INFO_INT = Level.INFO.toInt(); + + private static final int ERROR_INT = Level.ERROR.toInt(); + + private static final int WARN_INT = Level.WARN.toInt(); + + private static final int DEBUG_INT = Level.DEBUG.toInt(); + private static final int GAP_X = -150; + private static final int INFO_GAP_Y = -60; + private static final int ERRO_GAP_Y = -40; + private static final int SERVER_GAP_Y = -20; - + public static DesignerLogHandler getInstance() { + return HOLDER.singleton; } - + private static class HOLDER { + private static DesignerLogHandler singleton = new DesignerLogHandler(); } - + // 所有的面板 private LogHandlerBar caption; + private JCheckBoxMenuItem showInfo; + private JCheckBoxMenuItem showError; + private JCheckBoxMenuItem showServer; + private LogHandlerArea logHandlerArea; - + public DesignerLogHandler() { + logHandlerArea = new LogHandlerArea(); caption = new LogHandlerBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Log")); - + caption.addClearListener(new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { + logHandlerArea.jTextArea.setText(""); caption.clearMessage(); } }); caption.addSelectedListener(new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { + logHandlerArea.jTextArea.requestFocus(); logHandlerArea.jTextArea.selectAll(); } }); ItemListener itemlistener = new ItemListener() { - + @Override public void itemStateChanged(ItemEvent e) { + logHandlerArea.jTextArea.setText(""); caption.clearMessage(); } @@ -94,11 +120,12 @@ public class DesignerLogHandler { showServer = new JCheckBoxMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Log_Level_Error"), true); showServer.addItemListener(itemlistener); caption.addSetListener(new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { + JPopupMenu jPopupMenu = new JPopupMenu(); - + int logLevelInt = Log4jConfig.getInstance().getRootLevel().toInt(); if (logLevelInt <= INFO_INT) { jPopupMenu.add(showInfo); @@ -116,61 +143,72 @@ public class DesignerLogHandler { } }); } - + public JComponent getLogHandlerArea() { + return logHandlerArea; } - + public JComponent getCaption() { + return caption; } - + public void printRemoteLog(String message, Level level, Date date) { + logHandlerArea.printStackTrace(message, level, date); } - + private class LogHandlerArea extends JPanel { - + private static final long serialVersionUID = 8215630927304621660L; + private JTextPane jTextArea; + private JPopupMenu popup; + private UIMenuItem selectAll; + private UIMenuItem copy; + private UIMenuItem clear; - + private LogHandlerArea() { + jTextArea = initLogJTextArea(); this.setLayout(FRGUIPaneFactory.createBorderLayout()); UIScrollPane js = new UIScrollPane(jTextArea); this.add(js, BorderLayout.CENTER); this.setPreferredSize(new Dimension(super.getPreferredSize().width, 150)); - + jTextArea.setEditable(false); jTextArea.setBackground(Color.WHITE); - + popup = new JPopupMenu(); selectAll = new UIMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select_All")); selectAll.addActionListener(popupListener); selectAll.setIcon(BaseUtils.readIcon("/com/fr/design/images/log/selectedall.png")); popup.add(selectAll); - + copy = new UIMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy")); copy.addActionListener(popupListener); copy.setIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); popup.add(copy); - + clear = new UIMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Clear_All")); clear.addActionListener(popupListener); clear.setIcon(BaseUtils.readIcon("/com/fr/design/images/log/clear.png")); popup.add(clear); - + selectAll.setAccelerator(KeyStroke.getKeyStroke('A', DEFAULT_MODIFIER)); copy.setAccelerator(KeyStroke.getKeyStroke('C', DEFAULT_MODIFIER)); clear.setAccelerator(KeyStroke.getKeyStroke('L', DEFAULT_MODIFIER)); - + jTextArea.addMouseListener(new MouseAdapter() { + // check for right click public void mousePressed(MouseEvent event) { + if (event.getButton() == MouseEvent.BUTTON3) { popup.show(jTextArea, event.getX(), event.getY()); checkEnabled(); @@ -178,8 +216,9 @@ public class DesignerLogHandler { } }); } - + private JTextPane initLogJTextArea() { + final JTextPane resultPane = new JTextPane(); InputMap inputMap = resultPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER), DefaultEditorKit.copyAction); @@ -187,15 +226,18 @@ public class DesignerLogHandler { inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_L, DEFAULT_MODIFIER), "clear"); ActionMap actionMap = resultPane.getActionMap(); actionMap.put("clear", new AbstractAction() { + public void actionPerformed(ActionEvent evt) { + resultPane.setText(""); caption.clearMessage(); } }); return resultPane; } - + public void printStackTrace(LoggingEvent event) { + int intLevel = event.getLevel().toInt(); Date date = new Date(event.getTimeStamp()); ThrowableInformation information = event.getThrowableInformation(); @@ -207,27 +249,27 @@ public class DesignerLogHandler { printMessage(event.getRenderedMessage(), intLevel, date, information == null ? null : information.getThrowable()); } } - + public void printStackTrace(String message, Level level, Date date) { + int intLevel = level.toInt(); - int logLevel = Log4jConfig.getInstance().getRootLevel().toInt(); if (intLevel == INFO_INT && showInfo.isSelected()) { printMessage(message, intLevel, date); } else if (intLevel == ERROR_INT && showError.isSelected()) { printMessage(message, intLevel, date); } else if (intLevel == WARN_INT && showServer.isSelected()) { printMessage(message, intLevel, date); - } else if (intLevel == DEBUG_INT && logLevel == DEBUG_INT){ - printMessage(message, intLevel, date); } - + } - + private void printMessage(String message, int intLevel, Date date) { + printMessage(message, intLevel, date, null); } - + private void printMessage(String msg, int intLevel, Date date, Throwable e) { + this.log(LOG_SIMPLE_DATE_FORMAT.format(date) + "\n", 0); String message = appendLocaleMark(msg, intLevel); this.log(message, intLevel); @@ -235,14 +277,15 @@ public class DesignerLogHandler { if (e == null) { return; } - + StackTraceElement[] traceElements = e.getStackTrace(); for (int i = 0; i < traceElements.length; i++) { this.log("\t" + "at " + traceElements[i].toString() + "\n", 0); } } - + private void log(String str, int style) { + SimpleAttributeSet attrSet = new SimpleAttributeSet(); if (style == ERROR_INT) { StyleConstants.setForeground(attrSet, new Color(247, 148, 29)); @@ -264,8 +307,9 @@ public class DesignerLogHandler { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } - + private String appendLocaleMark(String str, int style) { + if (style == ERROR_INT) { str = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Alert") + ":" + str + "\n"; } else if (style == WARN_INT) { @@ -275,8 +319,9 @@ public class DesignerLogHandler { } return str; } - + private void setMessage(String message, int level) { + LogMessageBar.getInstance().setMessage(message); if (level == DesignerLogHandler.INFO_INT && showInfo.isSelected()) { caption.infoAdd(); @@ -286,28 +331,31 @@ public class DesignerLogHandler { caption.serverAdd(); } } - + private void checkEnabled() { + this.selectAll.setEnabled(true); this.copy.setEnabled(true); this.clear.setEnabled(true); - + if (ComparatorUtils.equals(this.jTextArea.getText(), "")) { this.selectAll.setEnabled(false); this.clear.setEnabled(false); } - + if (ComparatorUtils.equals(this.jTextArea.getSelectionStart(), this.jTextArea.getSelectionEnd())) { this.copy.setEnabled(false); } - + if (this.jTextArea.getSelectionStart() == 0 && ComparatorUtils.equals(this.jTextArea.getSelectionEnd(), this.jTextArea.getText().length())) { this.selectAll.setEnabled(false); } } - + ActionListener popupListener = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + if (ComparatorUtils.equals(evt.getActionCommand(), LogHandlerArea.this.selectAll.getText())) { LogHandlerArea.this.jTextArea.selectAll(); } else if (ComparatorUtils.equals(evt.getActionCommand(), LogHandlerArea.this.copy.getText())) { @@ -318,10 +366,11 @@ public class DesignerLogHandler { } } }; - + } - + public void printLoggingEvent(LoggingEvent event) { + logHandlerArea.printStackTrace(event); } }