package com.aionemu.packetsamurai.gui.logrepo; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JSplitPane; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.tree.TreePath; import org.jdesktop.swingx.JXTreeTable; import com.aionemu.packetsamurai.gui.logrepo.FileSystemPanel.LogFileNode; import com.aionemu.packetsamurai.logrepo.LogFile; import com.aionemu.packetsamurai.logrepo.LogRepository; import com.aionemu.packetsamurai.logrepo.RemoteLogRepositoryBackend; /** * * @author Ulysses R. Ribeiro * */ @SuppressWarnings("serial") public class LogFilesTab extends JPanel implements ComponentListener { private JSplitPane _outerSplitPane; private FileSystemPanel _localFileSystem = new FileSystemPanel("Logs Filesystem"); private LogDetailsPanel _logDetailsPane = new LogDetailsPanel("Log Details"); private MiddlePanel _middlePanel = new MiddlePanel(); private boolean _localLoaded, _remoteLoaded; public LogFilesTab() { _localFileSystem.getFileTree().getSelectionModel().addListSelectionListener(new LogSelectionListener(_localFileSystem.getFileTree())); this.setLayout(new GridBagLayout()); GridBagConstraints cons = new GridBagConstraints(); this.addComponentListener(this); _outerSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); _outerSplitPane.setLeftComponent(getLocalFileSystemPanel()); _outerSplitPane.setRightComponent(_middlePanel); cons.fill = GridBagConstraints.BOTH; cons.weightx = 1.0; cons.weighty = 1.0; // same weight for each size _outerSplitPane.setResizeWeight(0.5); this.add(_outerSplitPane, cons); // makes each side with same desired size so that the split happens exactly in the middle this.getLocalFileSystemPanel().setPreferredSize(_middlePanel.getPreferredSize()); } class MiddlePanel extends JPanel { private JSplitPane _outSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); private JSplitPane _inSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); private TransferPanel _downloadsPanel = new TransferPanel("Downloads", true); private TransferPanel _uploadsPanel = new TransferPanel("Uploads", false); public MiddlePanel() { this.setLayout(new GridBagLayout()); GridBagConstraints cons = new GridBagConstraints(); RemoteLogRepositoryBackend.getInstance().setDownloadListener(_downloadsPanel); RemoteLogRepositoryBackend.getInstance().setUploadListener(_uploadsPanel); _inSplitPane.setTopComponent(_downloadsPanel); _inSplitPane.setBottomComponent(_uploadsPanel); _inSplitPane.setResizeWeight(0.5); _outSplitPane.setTopComponent(_logDetailsPane); _outSplitPane.setBottomComponent(_inSplitPane); _outSplitPane.setResizeWeight(0.6); cons.fill = GridBagConstraints.BOTH; cons.weightx = 1.0; cons.weighty = 1.0; this.add(_outSplitPane, cons); } } public void showLocalLogs() { for (LogFile logFile : LogRepository.getInstance().getLocalLogs()) { try { logFile.loadHeaders(); this.getLocalFileSystemPanel().addLogFile(logFile); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Failed Loading/Adding local log ("+logFile.getName()+"), skipped.\nReason: "+e.getLocalizedMessage(), "WARNING", JOptionPane.WARNING_MESSAGE); } } } public void addLogDownload(LogFile logFile) { if (RemoteLogRepositoryBackend.getInstance().isConnected()) { RemoteLogRepositoryBackend.getInstance().enqueueDownload(logFile); JProgressBar jpb = new JProgressBar(); jpb.setStringPainted(true); jpb.setString("Requesting"); this._middlePanel._downloadsPanel.addRow(new JLabel(logFile.getName()), jpb); } } public void addLogUpload(LogFile logFile) { if (RemoteLogRepositoryBackend.getInstance().isConnected()) { RemoteLogRepositoryBackend.getInstance().enqueueUpload(logFile); JProgressBar jpb = new JProgressBar(); jpb.setStringPainted(true); jpb.setString("Requesting"); this._middlePanel._uploadsPanel.addRow(new JLabel(logFile.getName()), jpb); } } public FileSystemPanel getLocalFileSystemPanel() { return _localFileSystem; } public void addLogFile(LogFile logFile) { _localFileSystem.addLogFile(logFile); } public boolean removeLogFile(LogFile logFile) { return _localFileSystem.removeLogFile(logFile); } public void componentShown(ComponentEvent e) { synchronized (this) { // load LogRepository.getInstance(); if (!_localLoaded) { Thread t = new Thread() { public void run() { LogRepository.getInstance().refreshLocalLogs(); LogFilesTab.this.showLocalLogs(); _localLoaded = true; } }; t.start(); } if (RemoteLogRepositoryBackend.getInstance().isConnected() && !_remoteLoaded) { Thread t = new Thread() { public void run() { LogRepository.getInstance().refreshRemoteLogs(); _remoteLoaded = true; } }; t.start(); } } } public void componentResized(ComponentEvent e) { //nothing } public void componentMoved(ComponentEvent e) { //nothing } public void componentHidden(ComponentEvent e) { //nothing } public class LogSelectionListener implements ListSelectionListener { private JXTreeTable _table; public LogSelectionListener(JXTreeTable table) { _table = table; } public void valueChanged(ListSelectionEvent e) { TreePath tp = _table.getPathForRow(_table.getSelectedRow()); if (tp != null && tp.getLastPathComponent() instanceof LogFileNode) { _logDetailsPane.showDetails(((LogFileNode) tp.getLastPathComponent()).getLogFile()); } } } }