package com.limegroup.gnutella.gui.search;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.swing.Icon;
import com.limegroup.gnutella.gui.GUIMediator;
import com.limegroup.gnutella.gui.tables.ChatHolder;
import com.limegroup.gnutella.gui.tables.LimeTableColumn;
import com.limegroup.gnutella.gui.xml.XMLUtils;
import com.limegroup.gnutella.licenses.License;
import com.limegroup.gnutella.settings.SearchSettings;
import com.limegroup.gnutella.xml.LimeXMLSchema;
import com.limegroup.gnutella.xml.LimeXMLSchemaRepository;
import com.limegroup.gnutella.xml.SchemaFieldInfo;
/**
* Simple collection of table columns.
*/
final class SearchTableColumns {
// It is important that all the columns be non static,
// so that the multiple search tables all have their own
// columns.
static final int QUALITY_IDX = 0;
private final LimeTableColumn QUALITY_COLUMN =
new SearchColumn(QUALITY_IDX, "RESULT_PANEL_QUALITY",
55, true, QualityHolder.class);
static final int COUNT_IDX = 1;
private final LimeTableColumn COUNT_COLUMN =
new SearchColumn(COUNT_IDX, "RESULT_PANEL_COUNT",
24, true, Integer.class);
static final int LICENSE_IDX = 2;
private final LimeTableColumn LICENSE_COLUMN =
new SearchColumn(LICENSE_IDX, "RESULT_PANEL_LICENSE",
40, true, License.class);
static final int ICON_IDX = 3;
private final LimeTableColumn ICON_COLUMN =
new SearchColumn(ICON_IDX, "RESULT_PANEL_ICON",
GUIMediator.getThemeImage("question_mark"),
18, true, Icon.class);
static final int NAME_IDX = 4;
private final LimeTableColumn NAME_COLUMN =
new SearchColumn(NAME_IDX, "RESULT_PANEL_NAME",
272, true, ResultNameHolder.class);
static final int TYPE_IDX = 5;
private final LimeTableColumn TYPE_COLUMN =
new SearchColumn(TYPE_IDX, "RESULT_PANEL_TYPE",
42, true, String.class);
static final int SIZE_IDX = 6;
private final LimeTableColumn SIZE_COLUMN =
new SearchColumn(SIZE_IDX, "RESULT_PANEL_SIZE",
53, true, String.class);
static final int SPEED_IDX = 7;
private final LimeTableColumn SPEED_COLUMN =
new SearchColumn(SPEED_IDX, "RESULT_PANEL_SPEED",
61, true, String.class);
static final int CHAT_IDX = 8;
private final LimeTableColumn CHAT_COLUMN =
new SearchColumn(CHAT_IDX, "RESULT_PANEL_CHAT",
40, false, ChatHolder.class);
static final int LOCATION_IDX = 9;
private final LimeTableColumn LOCATION_COLUMN =
new SearchColumn(LOCATION_IDX, "RESULT_PANEL_LOCATION",
86, false, EndpointHolder.class);
static final int VENDOR_IDX = 10;
private final LimeTableColumn VENDOR_COLUMN =
new SearchColumn(VENDOR_IDX, "RESULT_PANEL_VENDOR",
55, false, String.class);
static final int ADDED_IDX = 11;
private final LimeTableColumn ADDED_COLUMN =
new SearchColumn(ADDED_IDX, "RESULT_PANEL_ADDED",
55, false, Date.class);
static final int SPAM_IDX = 12;
private final LimeTableColumn SPAM_COLUMN =
new SearchColumn(SPAM_IDX, "RESULT_PANEL_SPAM",
40, false, Float.class);
/**
* The number of default columns.
*/
static final int DEFAULT_COLUMN_COUNT = 12;
/**
* The number of extra XML columns.
*/
static final int EXTRA_COLUMN_COUNT;
/**
* The actual XML columns.
*/
private final List EXTRA_COLUMNS = new ArrayList();
/**
* The total number of columns.
*/
static final int COLUMN_COUNT;
// initializes EXTRA_COLUMN_COUNT & COLUMN_COUNT.
static {
List columns = new LinkedList();
addColumns(columns);
EXTRA_COLUMN_COUNT = columns.size();
COLUMN_COUNT = EXTRA_COLUMN_COUNT + DEFAULT_COLUMN_COUNT;
}
/**
* Constructs a new SearchTableColumns.
*/
SearchTableColumns() {
addColumns(EXTRA_COLUMNS);
}
/**
* Adds all available XML columns into the list.
*/
private static void addColumns(List columns) {
Collection schemas = LimeXMLSchemaRepository.instance().getAvailableSchemas();
int idx = DEFAULT_COLUMN_COUNT;
for(Iterator i = schemas.iterator(); i.hasNext(); ) {
LimeXMLSchema schema = (LimeXMLSchema)i.next();
String schemaDesc = schema.getDescription();
Iterator fields = schema.getCanonicalizedFields().iterator();
for(; fields.hasNext();) {
SchemaFieldInfo sfi = (SchemaFieldInfo)fields.next();
if(sfi.isHidden())
continue;
String rawName = sfi.getCanonicalizedFieldName();
String dispName = XMLUtils.getResource(rawName);
Class clazz = String.class; //sfi.getJavaType();
boolean visible = sfi.getDefaultVisibility();
int width = sfi.getDefaultWidth();
LimeTableColumn ltc = new SearchColumn(idx, rawName, dispName, width, visible, clazz);
columns.add(ltc);
idx++;
}
}
}
/**
* Gets the column for the specified index.
*/
LimeTableColumn getColumn(int idx) {
switch (idx) {
case QUALITY_IDX: return QUALITY_COLUMN;
case COUNT_IDX: return COUNT_COLUMN;
case ICON_IDX: return ICON_COLUMN;
case NAME_IDX: return NAME_COLUMN;
case TYPE_IDX: return TYPE_COLUMN;
case SIZE_IDX: return SIZE_COLUMN;
case SPEED_IDX: return SPEED_COLUMN;
case CHAT_IDX: return CHAT_COLUMN;
case LOCATION_IDX: return LOCATION_COLUMN;
case VENDOR_IDX: return VENDOR_COLUMN;
case ADDED_IDX: return ADDED_COLUMN;
case LICENSE_IDX: return LICENSE_COLUMN;
case SPAM_IDX: return SPAM_COLUMN;
default:
if (idx == -1 && SearchSettings.moveJunkToBottom()) {
// idx is -1 if BasicDataLineModel is set to unsorted
// (_activeColumn is -1). We must still sort the results
// somehow if 'move junk to bottom' selected!
return QUALITY_COLUMN;
} else if(idx >= DEFAULT_COLUMN_COUNT && idx < COLUMN_COUNT) {
return (LimeTableColumn)EXTRA_COLUMNS.get(idx - DEFAULT_COLUMN_COUNT);
} else {
throw new IllegalStateException("illegal idx: " + idx);
}
}
}
}