package thaw.plugins.miniFrost; import javax.swing.JPanel; import java.util.Observable; import java.awt.BorderLayout; import javax.swing.JList; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JScrollPane; import java.util.Vector; import java.util.Iterator; import javax.swing.AbstractListModel; import javax.swing.DefaultListCellRenderer; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import java.awt.Color; import java.awt.Font; import thaw.gui.IconBox; import thaw.core.I18n; import thaw.plugins.ToolbarModifier; import thaw.plugins.miniFrost.interfaces.BoardFactory; import thaw.plugins.miniFrost.interfaces.Board; /** * It's called BoardTree, but in fact it's just a list.<br/> * Notify each time the selection is changed (board is given in argument) */ public class BoardTree extends Observable implements javax.swing.event.ListSelectionListener, MouseListener { /* X and Y are replaced */ public final static String DRAFTS_STR = "W: X / U : Y"; private JPanel panel; private BoardListModel model; private JList list; private JPopupMenu rightClickMenu; private ToolbarModifier toolbarModifier; private Vector actions; private MiniFrostPanel mainPanel; public final static Color SELECTION_COLOR = new Color(190, 190, 190); public final static Color LOADING_COLOR = new Color(230, 230, 230); public final static Color LOADING_SELECTION_COLOR = new Color(150, 150, 150); private JLabel draftsState; public BoardTree(MiniFrostPanel mainPanel) { this.mainPanel = mainPanel; /* label */ panel = new JPanel(new BorderLayout()); panel.add(new JLabel(I18n.getMessage("thaw.plugin.miniFrost.boards")), BorderLayout.NORTH); /* board list */ model = new BoardListModel(); refresh(); list = new JList(model); list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); list.setCellRenderer(new BoardListRenderer()); list.addListSelectionListener(this); //list.setPreferredSize(new java.awt.Dimension(100, 100)); list.addMouseListener(this); JScrollPane scroll = new JScrollPane(list); scroll.setPreferredSize(new java.awt.Dimension(100, 100)); panel.add(scroll, BorderLayout.CENTER); actions = new Vector(); /* right click menu */ JMenuItem item; rightClickMenu = new JPopupMenu(); item = new JMenuItem(""); rightClickMenu.add(item); actions.add(new BoardManagementHelper.BoardNameDisplayer(item)); rightClickMenu.addSeparator(); item = new JMenuItem(I18n.getMessage("thaw.common.add"), IconBox.minAdd); rightClickMenu.add(item); actions.add(new BoardManagementHelper.BoardAdder(mainPanel, item)); item = new JMenuItem(I18n.getMessage("thaw.common.remove"), IconBox.minDelete); rightClickMenu.add(item); actions.add(new BoardManagementHelper.BoardRemover(mainPanel, item)); item = new JMenuItem(I18n.getMessage("thaw.plugin.miniFrost.loadNewMessages"), IconBox.minRefreshAction); rightClickMenu.add(item); actions.add(new BoardManagementHelper.BoardRefresher(mainPanel, item)); item = new JMenuItem(I18n.getMessage("thaw.plugin.miniFrost.markAsRead"), IconBox.minMarkAsRead); rightClickMenu.add(item); actions.add(new BoardManagementHelper.MarkAllAsRead(mainPanel, item)); item = new JMenuItem(I18n.getMessage("thaw.plugin.miniFrost.newMessage"), IconBox.minMsgNew); rightClickMenu.add(item); actions.add(new BoardManagementHelper.NewMessage(mainPanel, item)); /* toolbar buttons */ JButton button; toolbarModifier = new ToolbarModifier(mainPanel.getPluginCore().getCore().getMainWindow()); button = new JButton(IconBox.add); button.setToolTipText(I18n.getMessage("thaw.common.add")); actions.add(new BoardManagementHelper.BoardAdder(mainPanel, button)); toolbarModifier.addButtonToTheToolbar(button); button = new JButton(IconBox.delete); button.setToolTipText(I18n.getMessage("thaw.common.remove")); actions.add(new BoardManagementHelper.BoardRemover(mainPanel, button)); toolbarModifier.addButtonToTheToolbar(button); button = new JButton(IconBox.refreshAction); button.setToolTipText(I18n.getMessage("thaw.plugin.miniFrost.loadNewMessages")); actions.add(new BoardManagementHelper.BoardRefresher(mainPanel, button)); toolbarModifier.addButtonToTheToolbar(button); button = new JButton(IconBox.markAsRead); button.setToolTipText(I18n.getMessage("thaw.plugin.miniFrost.markAsRead")); actions.add(new BoardManagementHelper.MarkAllAsRead(mainPanel, button)); toolbarModifier.addButtonToTheToolbar(button); button = new JButton(IconBox.msgNew); button.setToolTipText(I18n.getMessage("thaw.plugin.miniFrost.newMessage")); actions.add(new BoardManagementHelper.NewMessage(mainPanel, button)); toolbarModifier.addButtonToTheToolbar(button); /* drafts state */ draftsState = new JLabel(""); updateDraftValues(0, 0); //southPanel.add(new JLabel(""), BorderLayout.CENTER); //southPanel.add(buttonPanel, BorderLayout.WEST); //southPanel.add(draftsState, BorderLayout.SOUTH); panel.add(draftsState, BorderLayout.SOUTH); } public ToolbarModifier getToolbarModifier() { return toolbarModifier; } protected class BoardListRenderer extends DefaultListCellRenderer { /** * */ private static final long serialVersionUID = 6021183532695159257L; private MessageTreeTable messageTreeTable; public BoardListRenderer() { messageTreeTable = mainPanel.getMessageTreeTable(); } public java.awt.Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Board board = (Board)value; String str = board.toString(); int unread = 0; if ( (unread = board.getNewMessageNumber(messageTreeTable.seeUnsigned(), messageTreeTable.seeArchived(), messageTreeTable.getMinTrustLevel())) > 0) str += " ("+Integer.toString(unread)+")"; java.awt.Component c = super.getListCellRendererComponent(list, str, index, isSelected, cellHasFocus); c.setFont(c.getFont().deriveFont((float)13.5)); if (unread > 0) c.setFont(c.getFont().deriveFont(Font.BOLD)); else c.setFont(c.getFont().deriveFont(Font.PLAIN)); if (board.isRefreshing()) { if (isSelected) { c.setBackground(LOADING_SELECTION_COLOR); } else { c.setBackground(LOADING_COLOR); } } else if (isSelected) { c.setBackground(SELECTION_COLOR); } return c; } } protected class BoardListModel extends AbstractListModel { /** * */ private static final long serialVersionUID = 7295609643591087950L; private Vector boardList; public BoardListModel() { super(); boardList = null; } public Vector getBoardList() { synchronized(boardList) { return boardList; } } public void setBoardList(Vector l) { int oldSize = 0; if (boardList != null) { oldSize = boardList.size(); } boardList = l; synchronized(boardList) { if (boardList.size() < oldSize) fireIntervalRemoved(this, boardList.size(), oldSize); if (boardList.size() > oldSize) fireIntervalAdded(this, oldSize, boardList.size()); fireContentsChanged(this, 0, boardList.size()); } } public void refresh(Board board) { synchronized(boardList) { refresh(boardList.indexOf(board)); } } public void refresh(int row) { fireContentsChanged(this, row, row); } public Object getElementAt(int index) { if (boardList == null) return null; synchronized(boardList) { return boardList.get(index); } } public int getSize() { if (boardList == null) return 0; synchronized(boardList) { return boardList.size(); } } } public Vector getBoards() { return model.getBoardList(); } public void refresh() { Vector boards = new Vector(); BoardFactory[] factories = mainPanel.getPluginCore().getFactories(); if (factories != null) { for (int i = 0 ; i < factories.length; i++) { Vector v = factories[i].getBoards(); if (v != null) { boards.addAll(v); } } } java.util.Collections.sort(boards); model.setBoardList(boards); } public void refresh(Board board) { model.refresh(board); } public void refresh(int row) { model.refresh(row); } public void loadState() { } public void saveState() { } public JPanel getPanel() { return panel; } public void updateDraftValues(int waitings, int postings) { String str; str = DRAFTS_STR.replaceAll("X", Integer.toString(waitings)); str = str.replaceAll( "Y", Integer.toString(postings)); draftsState.setText(str); } private Board currentlySelected = null; /** * seems to be called twice */ public void valueChanged(javax.swing.event.ListSelectionEvent e) { Board b = ((Board)list.getSelectedValue()); for (Iterator it = actions.iterator(); it.hasNext();) { ((BoardManagementHelper.BoardAction)it.next()).setTarget(b); } if (b == currentlySelected) return; currentlySelected = b; setChanged(); notifyObservers(b); list.requestFocus(); } public void mouseClicked(final MouseEvent e) { } public void mouseEntered(final MouseEvent e) { } public void mouseExited(final MouseEvent e) { } public void mousePressed(final MouseEvent e) { showPopupMenu(e); } public void mouseReleased(final MouseEvent e) { showPopupMenu(e); } protected void showPopupMenu(final MouseEvent e) { if(e.isPopupTrigger()) { rightClickMenu.show(e.getComponent(), e.getX(), e.getY()); } } }