package gui.forms;
import gui.listeners.ListenerName;
import thread.heartbeat.UserManager;
import util.settings.Settings;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
/**
* @author Nick K
*/
public class GUIViewerList extends JFrame {
private boolean isFiltering = false;
private DefaultTreeModel defaultModel;
public DefaultMutableTreeNode staff, admins, global_mods, mods, viewers, default_root, filtered_root;
public GUIViewerList(String channel) {
initComponents(channel);
if (UserManager.toUpdate != null) UserManager.toUpdate.setEndIn(0L);//force an update
}
public enum ViewerType {
STAFF,
ADMIN,
GLOBAL_MOD,
MOD,
VIEWER
}
public Enumeration<TreePath> getExpandedDescendants() {
return viewerTree.getExpandedDescendants(viewerTree.getPathForRow(0));
}
public Enumeration<TreePath> beforePaths() {
return getExpandedDescendants();
}
public int beforeScroll() {
return scrollPane.getVerticalScrollBar().getValue();
}
public synchronized void updateCategory(ViewerType type, HashSet<String> names) {
final DefaultMutableTreeNode node;
switch (type) {
case STAFF:
node = staff;
break;
case ADMIN:
node = admins;
break;
case MOD:
node = mods;
break;
case VIEWER:
node = viewers;
break;
case GLOBAL_MOD:
node = global_mods;
break;
default:
node = null;
break;
}
if (node != null) {
node.removeAllChildren();
if (!names.isEmpty()) {
names.stream().sorted().forEach(s -> node.add(new DefaultMutableTreeNode(s)));
}
}
}
public synchronized void updateRoot(Enumeration<TreePath> userPath, int scrollAmount) {
default_root.removeAllChildren();
if (staff.getChildCount() > 0) default_root.add(staff);
if (admins.getChildCount() > 0) default_root.add(admins);
if (global_mods.getChildCount() > 0) default_root.add(global_mods);
if (mods.getChildCount() > 0) default_root.add(mods);
default_root.add(viewers);
if (!isFiltering) defaultModel.reload(default_root);
if (userPath != null) {
while (userPath.hasMoreElements()) {
viewerTree.expandPath(userPath.nextElement());
}
}
scrollPane.getVerticalScrollBar().setValue(scrollAmount);
}
private synchronized void setViewerTreeModel(DefaultTreeModel model) {
viewerTree.setModel(model);
viewerTree.validate();
}
public synchronized void buildFilteredModel(String text) {
filtered_root.removeAllChildren();
ArrayList<DefaultMutableTreeNode> rows = new ArrayList<>();
if (staff.getChildCount() > 0) {
DefaultMutableTreeNode filtered = new DefaultMutableTreeNode("Staff");
filterNode(staff, text, filtered);
if (filtered.getChildCount() > 0) {
filtered_root.add(filtered);
rows.add(filtered);
}
}
if (admins.getChildCount() > 0) {
DefaultMutableTreeNode filtered = new DefaultMutableTreeNode("Admins");
filterNode(admins, text, filtered);
if (filtered.getChildCount() > 0) {
filtered_root.add(filtered);
rows.add(filtered);
}
}
if (global_mods.getChildCount() > 0) {
DefaultMutableTreeNode filtered = new DefaultMutableTreeNode("Global Moderators");
filterNode(global_mods, text, filtered);
if (filtered.getChildCount() > 0) {
filtered_root.add(filtered);
rows.add(filtered);
}
}
if (mods.getChildCount() > 0) {
DefaultMutableTreeNode filtered = new DefaultMutableTreeNode("Moderators");
filterNode(mods, text, filtered);
if (filtered.getChildCount() > 0) {
filtered_root.add(filtered);
rows.add(filtered);
}
}
if (viewers.getChildCount() > 0) {
DefaultMutableTreeNode filtered = new DefaultMutableTreeNode("Viewers");
filterNode(viewers, text, filtered);
if (filtered.getChildCount() > 0) {
filtered_root.add(filtered);
rows.add(filtered);
}
}
setViewerTreeModel(new DefaultTreeModel(filtered_root));
for (DefaultMutableTreeNode row : rows) {
TreePath tp = new TreePath(row.getPath());
viewerTree.expandPath(tp);
}
}
private synchronized void filterNode(DefaultMutableTreeNode node, String text, DefaultMutableTreeNode filtered) {
for (int i = 0; i < node.getChildCount(); i++) {
DefaultMutableTreeNode nameNode = (DefaultMutableTreeNode) node.getChildAt(i);
String name = (String) nameNode.getUserObject();
if (name.startsWith(text)) {
filtered.add(new DefaultMutableTreeNode(name));
}
}
}
@Override
public void setVisible(boolean b) {
setAlwaysOnTop(Settings.alwaysOnTop.getValue());
super.setVisible(b);
}
private void initComponents(String channel) {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
// Generated using JFormDesigner Evaluation license - Nick K
searchBar = new JTextField();
scrollPane = new JScrollPane();
viewerTree = new JTree();
//======== this ========
setTitle("Viewers");
setIconImage(new ImageIcon(getClass().getResource("/image/icon.png")).getImage());
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setResizable(true);
Container contentPane = getContentPane();
//---- searchBar ----
searchBar.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
String text = searchBar.getText();
if (text != null) {
text = text.trim();
if (text.length() > 0) {
if (!isFiltering) {
isFiltering = true;
}
buildFilteredModel(text);
} else {
isFiltering = false;
setViewerTreeModel(defaultModel);
}
} else {
isFiltering = false;
setViewerTreeModel(defaultModel);
}
}
});
//======== scrollPane2 ========
{
//---- viewerTree ---
default_root = new DefaultMutableTreeNode(channel);
defaultModel = new DefaultTreeModel(default_root);
filtered_root = new DefaultMutableTreeNode(channel);
viewerTree.setShowsRootHandles(true);
staff = new DefaultMutableTreeNode("Staff");
admins = new DefaultMutableTreeNode("Admins");
global_mods = new DefaultMutableTreeNode("Global Moderators");
mods = new DefaultMutableTreeNode("Moderators");
viewers = new DefaultMutableTreeNode("Viewers");
setViewerTreeModel(defaultModel);
viewerTree.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
TreePath selPath = viewerTree.getPathForLocation(e.getX(), e.getY());
if (selPath != null && selPath.getPathCount() == 3) {
//should be a name
DefaultMutableTreeNode nameNode = (DefaultMutableTreeNode) selPath.getLastPathComponent();
ListenerName.createUserPopup(channel, nameNode.getUserObject().toString(), viewerTree, e.getX(), e.getY());
}
}
}
});
scrollPane.setViewportView(viewerTree);
}
setMinimumSize(new Dimension(250, 490));
GroupLayout contentPaneLayout = new GroupLayout(contentPane);
contentPane.setLayout(contentPaneLayout);
contentPaneLayout.setHorizontalGroup(
contentPaneLayout.createParallelGroup()
.addComponent(searchBar, GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE)
.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE)
);
contentPaneLayout.setVerticalGroup(
contentPaneLayout.createParallelGroup()
.addGroup(GroupLayout.Alignment.TRAILING, contentPaneLayout.createSequentialGroup()
.addComponent(searchBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 423, Short.MAX_VALUE))
);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
GUIMain.viewerLists.remove(channel);
}
});
pack();
setLocationRelativeTo(getOwner());
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
// Generated using JFormDesigner Evaluation license - Nick K
private JTextField searchBar;
private JTree viewerTree;
private JScrollPane scrollPane;
}