package eu.jucy.gui.texteditor;
import helpers.GH;
import helpers.PreferenceChangedAdapter;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import logger.LoggerFactory;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import eu.jucy.gui.GUIPI;
import eu.jucy.gui.logeditor.LogEditor;
import eu.jucy.gui.logeditor.LogEditorInput;
import eu.jucy.gui.logeditor.OpenLogEditorHandler;
import uc.IHub;
import uc.protocols.hub.FeedType;
import uihelpers.SUIJob;
public class LabelViewer {
private static Logger logger = LoggerFactory.make();
static {
logger.setLevel(Level.INFO);
}
private static final int HISTORY = 150;
private final CLabel label;
private SimpleDateFormat dateFormat;
private boolean timeStamps;
private final List<Message> messages = new LinkedList<Message>();
private final IHub hub;
private PreferenceChangedAdapter listener;
/**
* constructor that will additionally open an FeedEditor window on DoubleClick
* So specially used for the Feed label below the hub window
*
* @param label
* @param hub
*/
public LabelViewer(CLabel label, IHub hub) {
this.label = label;
this.hub = hub;
refreshSettings();
listener = 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();
refresh();
}
}.schedule();
}
};
if (hub != null) {
label.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent e) {
logger.debug("Open Log editor called");
OpenLogEditorHandler.openFeedLogEditor(LabelViewer.this, LabelViewer.this.hub);
}
});
}
label.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
listener.dispose();
}
});
}
/**
* constructor for normal Label viewer
*
* @param label
*/
public LabelViewer(CLabel label) {
this(label,null);
}
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 void appendMessage(Message m) {
if (!label.isDisposed()) {
String meslabel = m.toString();
if (meslabel.indexOf('\n') != -1) {
meslabel = meslabel.substring(0, meslabel.indexOf('\n'));
}
label.setText(meslabel);
label.setForeground(m.getMessageColor());
String tooltip = null;
for (int i = Math.max(0, messages.size()-5); i < messages.size();i++) {
Message mes = messages.get(i);
if (tooltip == null) {
tooltip = mes.toString();
} else {
tooltip += "\n"+mes.toString();
}
}
label.setToolTipText(tooltip);
appendIfOpen(m);
}
}
/**
* adds message to the StyledText
* @param message - what is to be added
*/
public void addMessage(String message) {
addFeedMessage( FeedType.NONE , message);
}
public void addFeedMessage(final FeedType ft, final String message) {
Message m = new Message(this,message,ft);
messages.add(m);
if (messages.size() > HISTORY) {
messages.remove(0);
}
appendMessage(m);
}
/**
* refreshes the styled text
* used when timeStamps change
*/
public void refresh() {
if (label.isDisposed()) {
return;
}
label.setText("");
LogEditor le = getLogEditorIfOpen();
if (le != null) {
le.clear();
}
for (Message m: messages) {
appendMessage(m);
}
}
private void appendIfOpen(Message m) {
LogEditor le = getLogEditorIfOpen();
if (le != null) {
le.appendFeed(m);
}
}
/**
*
* @return the mathcing logeditor if open .. null otherwise
*/
private LogEditor getLogEditorIfOpen() {
if (hub == null) {
return null;
}
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
if (page == null) {
return null;
}
return (LogEditor)page.findEditor(new LogEditorInput(this,hub));
}
public static class Message {
private final String message;
private final Date received;
private final FeedType ft;
private final LabelViewer label;
private Message(LabelViewer label,String message, FeedType ft) {
this.label = label;
this.message = message;
this.ft = ft;
this.received = new Date();
}
public String toString() {
return (label.timeStamps? label.dateFormat.format(received) : "" )+ft+message;
}
public Color getMessageColor() {
Display display = label.label.getDisplay();
switch(ft) {
case GUI:
return display.getSystemColor(SWT.COLOR_DARK_CYAN);
case KICK:
return display.getSystemColor(SWT.COLOR_BLUE);
case ACTION:
case EVENT:
return display.getSystemColor(SWT.COLOR_DARK_GREEN);
case ERROR:
case FATAL:
case WARN:
return display.getSystemColor(SWT.COLOR_DARK_RED);
case NONE:
case REPORT:
return display.getSystemColor(SWT.COLOR_BLACK);
default:
throw new IllegalStateException();
}
}
}
public CLabel getLabel() {
return label;
}
public List<Message> getMessages() {
return Collections.unmodifiableList(messages);
}
}