package eu.jucy.gui.logeditor; import helpers.GH; import helpers.PreferenceChangedAdapter; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.Layout; import org.apache.log4j.Level; import org.apache.log4j.PatternLayout; import org.apache.log4j.spi.LoggingEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import uihelpers.SUIJob; import eu.jucy.gui.GUIPI; import eu.jucy.gui.GuiAppender; import eu.jucy.gui.UCMessageEditor; import eu.jucy.gui.texteditor.LabelViewer; import eu.jucy.gui.texteditor.LabelViewer.Message; public class LogEditor extends UCMessageEditor { public static final String ID = "eu.jucy.gui.logeditor"; private StyledText styledText; private SimpleDateFormat dateFormat; private boolean timeStamps; private PreferenceChangedAdapter pca; private Layout severe = new PatternLayout("%-5p %F Line:%L \t\t %m%n"); @Override public void createPartControl(Composite parent) { parent.setLayout(new FillLayout()); styledText = new StyledText(parent, SWT.WRAP | SWT.V_SCROLL | SWT.READ_ONLY | SWT.MULTI | SWT.BORDER); styledText.addModifyListener(new ModifyListener() { //scrolls down public void modifyText(ModifyEvent e) { styledText.setSelection(styledText.getCharCount()); } }); setText(styledText); refreshSettings(); if (getLabelViewer() == null) { for (LoggingEvent e:GuiAppender.get().getLastMessages()) { append(e); } } else { LabelViewer lab = getLabelViewer(); for (Message m:lab.getMessages()) { appendFeed(m); } } pca = new PreferenceChangedAdapter(GUIPI.get(),GUIPI.timeStampFormat,GUIPI.timeStamps) { @Override public void preferenceChanged(String preference, String oldValue,String newValue) { new SUIJob() { @Override public void run() { refreshSettings(); } }.schedule(); } }; } private void refreshSettings() { String format = GUIPI.get(GUIPI.timeStampFormat); if (format == null || GH.isEmpty(format)) { dateFormat = new SimpleDateFormat(); } else { dateFormat = new SimpleDateFormat(format); } timeStamps = GUIPI.getBoolean(GUIPI.timeStamps); } private LabelViewer getLabelViewer() { return ((LogEditorInput)getEditorInput()).getSource(); } @Override public void clear() { styledText.setText(""); } public void dispose() { if (pca != null) { pca.dispose(); } } @Override public void setFocus() { styledText.setFocus(); } public void append(LoggingEvent event) { boolean error = event.getLevel().isGreaterOrEqual(Level.WARN); boolean heavyError = event.getLevel().isGreaterOrEqual(Level.ERROR); boolean fatalError = event.getLevel().isGreaterOrEqual(Level.FATAL); int startpos = styledText.getCharCount(); String text = "\n"+ (error?severe.format(event): (timeStamps? dateFormat.format(new Date(event.timeStamp)) : "" )+event.getRenderedMessage()); Display display = styledText.getDisplay(); styledText.append(text); StyleRange styleRange = new StyleRange(); styleRange.start = startpos; styleRange.length = text.length(); styleRange.fontStyle = error ? SWT.BOLD: SWT.NORMAL; styleRange.foreground =error ?display.getSystemColor(SWT.COLOR_RED):styledText.getForeground() ; if (heavyError) { styleRange.background = display.getSystemColor(SWT.COLOR_BLACK); } if (fatalError) { styleRange.underline = true; } styledText.setStyleRange(styleRange); } /** * * @param mes - a feed message */ public void appendFeed(Message mes) { int startpos = styledText.getCharCount(); String text = "\n"+ mes.toString(); styledText.append(text); StyleRange styleRange = new StyleRange(); styleRange.start = startpos; styleRange.length = text.length(); styleRange.foreground = mes.getMessageColor(); styledText.setStyleRange(styleRange); } }