package org.limewire.ui.swing.library.sharing;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JCheckBox;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import org.jdesktop.application.Resource;
import org.limewire.friend.api.Network;
import org.limewire.ui.swing.util.GuiUtils;
import org.limewire.ui.swing.util.I18n;
class LibrarySharingEditableRendererEditor extends JCheckBox implements TableCellRenderer, TableCellEditor {
private @Resource Font font;
private @Resource Color fontColor;
private @Resource Color backgroundColor;
private @Resource Icon checkedCheckBox;
private @Resource Icon uncheckedCheckBox;
private final List<CellEditorListener> listeners = new ArrayList<CellEditorListener>();
private EditableSharingData data;
public LibrarySharingEditableRendererEditor() {
GuiUtils.assignResources(this);
setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
setIcon(uncheckedCheckBox);
setSelectedIcon(checkedCheckBox);
setOpaque(false);
setIconTextGap(6);
setFont(font);
setFocusPainted(false);
setForeground(fontColor);
addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if(data != null) {
data.setSelected(isSelected());
}
stopCellEditing();
}
});
setBackground(backgroundColor);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int row, int column) {
if(value instanceof EditableSharingData) {
data = (EditableSharingData) value;
setText(textFor(data));
setSelected(data.isSelected());
setToolTipText(getToolTipText(data));
} else {
setText("");
setSelected(false);
setToolTipText("");
}
return this;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
if(value instanceof EditableSharingData) {
EditableSharingData data = (EditableSharingData) value;
setText(textFor(data));
setSelected(data.isSelected());
setToolTipText(getToolTipText(data));
} else {
setText("");
setSelected(false);
setToolTipText("");
}
return this;
}
private String getToolTipText(EditableSharingData data) {
if(data.getFriend() != null) {
if(data.getFriend().getNetwork().getType() != Network.Type.FACEBOOK) {
return data.getFriend().getRenderName() + " <" + data.getFriend().getId() + ">";
} else {
return data.getFriend().getRenderName();
}
} else {
return I18n.tr("{0} friends from other accounts", data.getIds().size());
}
}
private String textFor(EditableSharingData data) {
if(data.getFriend() != null) {
return data.getFriend().getRenderName();
} else {
return I18n.tr("{0} friends from other accounts", data.getIds().size());
}
}
@Override
public void addCellEditorListener(CellEditorListener lis) {
synchronized (listeners) {
if (!listeners.contains(lis))
listeners.add(lis);
}
}
@Override
public void cancelCellEditing() {
synchronized (listeners) {
for (int i = 0, N = listeners.size(); i < N; i++) {
listeners.get(i).editingCanceled(new ChangeEvent(this));
}
}
}
@Override
public Object getCellEditorValue() {
return null;
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return true;
}
@Override
public void removeCellEditorListener(CellEditorListener lis) {
synchronized (listeners) {
if (listeners.contains(lis))
listeners.remove(lis);
}
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
@Override
public boolean stopCellEditing() {
synchronized (listeners) {
for (int i = 0, N = listeners.size(); i < N; i++) {
listeners.get(i).editingStopped(new ChangeEvent(this));
}
}
return true;
}
}