/*
* Copyright (C) 2011 Ives van der Flaas
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package be.ac.ua.comp.scarletnebula.gui;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Collection;
import javax.swing.BorderFactory;
import javax.swing.JList;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import org.jdesktop.swingx.JXList;
import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.decorator.AbstractHighlighter;
import org.jdesktop.swingx.decorator.ComponentAdapter;
import org.jdesktop.swingx.decorator.HighlightPredicate;
import be.ac.ua.comp.scarletnebula.core.Server;
/**
* JList that displays JLabels as items in the list. This will allow me to
* display an image next to the text (for server status).
*
* @author ives
*
*/
public class ServerList extends JXList implements ComponentListener {
private final class RollOverHighlighter extends AbstractHighlighter {
private final ServerCellRenderer serverCellRenderer;
private RollOverHighlighter(final HighlightPredicate predicate,
final ServerCellRenderer serverCellRenderer) {
super(predicate);
this.serverCellRenderer = serverCellRenderer;
}
@Override
protected Component doHighlight(final Component arg0,
final ComponentAdapter arg1) {
final JXPanel objectToBeRendered = (JXPanel) arg0;
serverCellRenderer.onRollOver(objectToBeRendered);
return objectToBeRendered;
}
}
private final class ClearSelectionMouseAdapter extends MouseAdapter {
private void testClearSelection(final MouseEvent e) {
final JList list = (JList) e.getSource();
final Point currentPos = e.getPoint();
for (int i = 0; i < list.getModel().getSize(); i++) {
final Rectangle r = list.getCellBounds(i, i);
if (r.contains(currentPos)) {
return;
}
}
list.clearSelection();
}
@Override
public void mousePressed(final MouseEvent e) {
testClearSelection(e);
}
@Override
public void mouseReleased(final MouseEvent e) {
testClearSelection(e);
}
}
private static final long serialVersionUID = 1L;
ServerListModel serverListModel;
public ServerList(final ServerListModel serverListModel) {
super(serverListModel);
this.serverListModel = serverListModel;
setLayoutOrientation(JList.HORIZONTAL_WRAP);
setVisibleRowCount(-1);
setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
final ServerCellRenderer serverCellRenderer = new ServerCellRenderer();
setCellRenderer(serverCellRenderer);
setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
addComponentListener(this);
setRolloverEnabled(true);
addHighlighter(new RollOverHighlighter(
HighlightPredicate.ROLLOVER_CELL, serverCellRenderer));
getActionMap().remove("find"); // JXlist registers its own find, we'll
// provide our version later.
addMouseListener(new ClearSelectionMouseAdapter());
}
@Override
public void clearSelection() {
setSelectedIndices(new int[0]);
}
public Collection<Server> getSelectedServers() {
final int indices[] = getSelectedIndices();
return serverListModel.getVisibleServersAtIndices(indices);
}
@Override
public void componentResized(final ComponentEvent e) {
final JList list = (JList) e.getSource();
final JViewport viewport = (JViewport) list.getParent();
final Dimension newSize = viewport.getExtentSize();
final int totalWidth = newSize.width - list.getInsets().left
- list.getInsets().right - 1;
final int serverCount = totalWidth / 200;
if (serverCount == 0) {
return;
}
final int serverWidth = totalWidth / serverCount;
list.setFixedCellHeight(100);
list.setFixedCellWidth(serverWidth);
list.revalidate();
list.repaint();
}
@Override
public void componentMoved(final ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentShown(final ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentHidden(final ComponentEvent e) {
// TODO Auto-generated method stub
}
public boolean startNewServerServerSelected() {
final int indices[] = getSelectedIndices();
for (final int index : indices) {
if (serverListModel.getVisibleServerAtIndex(index) == null) {
return true;
}
}
return false;
}
}