package com.revolsys.swing.logging;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JTabbedPane;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import com.revolsys.awt.WebColors;
import com.revolsys.swing.Icons;
import com.revolsys.swing.SwingUtil;
import com.revolsys.swing.menu.MenuFactory;
/**
* Component to be used as tabComponent;
* Contains a JLabel to show the text and
* a JButton to close the tab it belongs to
*/
public class Log4jTabLabel extends JLabel implements MouseListener, TableModelListener {
private static final long serialVersionUID = 1L;
private static final Icon ANIMATED = Icons.getAnimatedIcon("error_animated.gif");
private static final Icon STATIC = Icons.getIcon("error");
private final JTabbedPane tabs;
private final Log4jTableModel tableModel;
private final MenuFactory menuFactory;
public Log4jTabLabel(final JTabbedPane tabs, final Log4jTableModel tableModel) {
this.tabs = tabs;
this.tableModel = tableModel;
setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 1));
setOpaque(false);
addMouseListener(this);
updateLabel();
this.menuFactory = new MenuFactory();
this.menuFactory.addMenuItem("default", "Delete all messages", "delete",
tableModel::isHasMessages, tableModel::clear);
}
@Override
public void addNotify() {
super.addNotify();
this.tableModel.addTableModelListener(this);
}
@Override
public void mouseClicked(final MouseEvent e) {
}
@Override
public void mouseEntered(final MouseEvent e) {
}
@Override
public void mouseExited(final MouseEvent e) {
}
@Override
public void mousePressed(final MouseEvent event) {
if (event.isPopupTrigger()) {
showMenu(event);
}
}
@Override
public void mouseReleased(final MouseEvent event) {
if (this.tableModel != null) {
this.tableModel.clearHasNewErrors();
updateLabel();
}
if (event.isPopupTrigger()) {
showMenu(event);
} else if (SwingUtil.isLeftButtonAndNoModifiers(event)) {
final int tabIndex = this.tabs.indexOfTabComponent(this);
if (tabIndex != -1) {
this.tabs.setSelectedIndex(tabIndex);
}
}
}
@Override
public void removeNotify() {
super.removeNotify();
this.tableModel.removeTableModelListener(this);
}
private void showMenu(final MouseEvent event) {
this.menuFactory.showMenu(this, event);
}
@Override
public void tableChanged(final TableModelEvent e) {
updateLabel();
this.tabs.repaint();
}
private void updateLabel() {
String text = null;
final int messageCount = this.tableModel.getMessageCount();
if (messageCount != 0) {
text = Integer.toString(messageCount);
}
if (this.tableModel.isHasNewErrors()) {
setFont(SwingUtil.BOLD_FONT);
setForeground(WebColors.Red);
setIcon(ANIMATED);
} else {
setFont(SwingUtil.FONT);
setForeground(WebColors.Black);
setIcon(STATIC);
}
setText(text);
}
}