package jdepend.client.ui.property;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import jdepend.framework.exception.JDependException;
import jdepend.framework.log.BusiLogItem;
import jdepend.framework.log.BusiLogListener;
import jdepend.framework.log.BusiLogUtil;
import jdepend.framework.log.DBBusinessLogWriter;
import jdepend.framework.log.Operation;
import jdepend.framework.ui.component.JDependFrame;
import jdepend.framework.ui.component.TableSorter;
import jdepend.framework.ui.util.JTableUtil;
import jdepend.framework.util.BundleUtil;
public final class BusiLogPanel extends JPanel implements BusiLogListener {
private DefaultTableModel model;
private JDependFrame frame;
private int count;
private boolean limit = true;
public static final int interval = 10;// 显示间隔
public BusiLogPanel(final JDependFrame frame) {
this.frame = frame;
this.setLayout(new BorderLayout());
model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
TableSorter sorter = new TableSorter(model);
final JTable table = new JTable(sorter);
final JPopupMenu popupMenu = new JPopupMenu();
JMenuItem clearItem = new JMenuItem("清除");
clearItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
if (JOptionPane.showConfirmDialog(BusiLogPanel.this.frame, "您是否确认删除?", "提示",
JOptionPane.YES_NO_OPTION) == 0) {
clear();
refresh();
}
} catch (JDependException e1) {
e1.printStackTrace();
BusiLogPanel.this.frame.showStatusError(e1.getMessage());
}
}
});
popupMenu.add(clearItem);
JMenuItem refreshItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Refresh));
refreshItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
refresh();
} catch (JDependException e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(frame, "刷新失败", "alert", JOptionPane.ERROR_MESSAGE);
}
}
});
popupMenu.add(refreshItem);
popupMenu.addSeparator();
final JMenuItem allItem = new JMenuItem("显示全部");
final JMenuItem partItem = new JMenuItem("显示部分");
allItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
limit = false;
try {
refresh();
resetPopupMenu(popupMenu, allItem, partItem);
} catch (JDependException e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(frame, "刷新失败", "alert", JOptionPane.ERROR_MESSAGE);
}
}
});
refreshItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
limit = true;
try {
refresh();
resetPopupMenu(popupMenu, allItem, partItem);
} catch (JDependException e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(frame, "刷新失败", "alert", JOptionPane.ERROR_MESSAGE);
}
}
});
if (limit) {
popupMenu.add(allItem);
} else {
popupMenu.add(partItem);
}
JMenuItem saveAsItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_SaveAs));
saveAsItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JTableUtil.exportTableToExcel(table);
}
});
popupMenu.add(saveAsItem);
table.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(java.awt.event.MouseEvent e) {
if (e.getButton() == 3) {
popupMenu.show((Component) e.getSource(), e.getX(), e.getY());
}
}
});
model.addColumn("用户名");
model.addColumn("操作");
model.addColumn("时间");
sorter.setTableHeader(table.getTableHeader());
try {
this.refresh();
} catch (JDependException e) {
e.printStackTrace();
}
final JScrollPane pane = new JScrollPane(table);
pane.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(java.awt.event.MouseEvent e) {
if (e.getButton() == 3) {
popupMenu.show((Component) e.getSource(), e.getX(), e.getY());
}
}
});
this.add(BorderLayout.CENTER, pane);
// 设置Listener
BusiLogUtil.getInstance().addLogListener(this);
// 定时触发refresh
(new Timer()).schedule(new LogTask(this), 2000, 5000);
}
private void resetPopupMenu(JPopupMenu popupMenu, JMenuItem allItem, JMenuItem partItem) {
if (limit) {
popupMenu.remove(partItem);
popupMenu.add(allItem);
} else {
popupMenu.remove(allItem);
popupMenu.add(partItem);
}
}
private void clear() throws JDependException {
DBBusinessLogWriter.deleteAll();
}
private void refresh() throws JDependException {
model.setRowCount(0);
Object[] row;
for (BusiLogItem item : DBBusinessLogWriter.getAllLogItems(limit)) {
row = new Object[3];
row[0] = item.username;
row[1] = item.operation;
row[2] = item.getCreatedate();
model.addRow(row);
}
count = 0;
}
public boolean isLimit() {
return limit;
}
public void setLimit(boolean limit) {
this.limit = limit;
}
class LogTask extends TimerTask {
private BusiLogPanel busiLogPanel;
public LogTask(BusiLogPanel busiLogPanel) {
this.busiLogPanel = busiLogPanel;
}
@Override
public void run() {
busiLogPanel.refresh1();
}
}
@Override
public void onBusiLog(String id, String userName, Operation operation) {
refresh1();
}
private synchronized void refresh1() {
if (++count >= interval) {
try {
this.refresh();
} catch (JDependException e) {
e.printStackTrace();
}
}
}
}