/*
* Copyright 2003-2010 Tufts University Licensed under the
* Educational Community License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS"
* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package tufts.vue;
import tufts.vue.gui.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.border.*;
public class ProviderListCellRenderer extends DefaultListCellRenderer
{
private edu.tufts.vue.dsm.OsidFactory factory = null;
private final Icon myComputerIcon = VueResources.getImageIcon("dataSourceMyComputer");
private final Icon savedResourcesIcon = VueResources.getImageIcon("dataSourceSavedResources");
private final Icon remoteIcon = VueResources.getImageIcon("dataSourceRemote");
private final Icon checkedIcon = VueResources.getImageIcon("addLibrary.checkMarkIcon");
private final ImageIcon waitIcon = VueResources.getImageIcon("waitIcon");
private final Icon rssIcon = VueResources.getImageIcon("dataSourceRSS");
private static String LOADING = VueResources.getString("addLibrary.loading.label");
private static String MY_COMPUTER = VueResources.getString("addLibrary.mycomputer.label");
private static String MY_SAVED_CONTENT = "My Saved Content";
private JPanel mRow = new JPanel();
private JPanel mLabelPanel = new JPanel();
private JLabel mLabel = new DefaultListCellRenderer();
private JLabel mIconLabel = new JLabel();
private JLabel waitLabel;
private JLabel checkedLabel;
private Component blankArea;
private Border DividerBorder = new MatteBorder(1,0,0,0, Color.gray);
private Border EmptyDividerBorder = new EmptyBorder(1,0,0,0);
private Color AlternateRowColor = VueResources.getColor("gui.dataSourceList.alternateRowColor", 237,243,253);
private Vector checklist = new Vector(50);
private int waitingMode = -1;
public ProviderListCellRenderer()
{
try {
factory = edu.tufts.vue.dsm.impl.VueOsidFactory.getInstance();
} catch (Throwable t) {
}
checkedLabel = new JLabel();
checkedLabel.setIcon(checkedIcon);
mRow.setLayout(new BoxLayout(mRow, BoxLayout.X_AXIS));
mRow.setOpaque(true);
// mLabelPanel.setMinimumSize(new Dimension(5, mLabelPanel.getHeight()));
// mLabelPanel.setPreferredSize(new Dimension(5, mLabelPanel.getHeight()));
mLabel.setMinimumSize(new Dimension(5, mLabel.getHeight()));
mLabel.setPreferredSize(new Dimension(5, mLabel.getHeight()));
mLabelPanel.setLayout(new BorderLayout());
mLabelPanel.add(mLabel,BorderLayout.CENTER);
waitLabel = new JLabel();
waitLabel.setDoubleBuffered(true);
waitLabel.setIcon(waitIcon);
blankArea = Box.createRigidArea(new Dimension(16,16));
mRow.add(Box.createHorizontalStrut(GUI.WidgetInsets.left));
mRow.add(blankArea);
//mRow.add(Box.createHorizontalStrut(GUI.WidgetInsets.left));
//mRow.add(mLabel);
mRow.add(Box.createHorizontalStrut(GUI.WidgetInsets.right));
mRow.add(mLabelPanel);
mRow.add(Box.createHorizontalStrut(GUI.WidgetInsets.left));
mRow.add(mIconLabel);
mRow.add(Box.createHorizontalStrut(GUI.WidgetInsets.left));
}
public void setChecked(int index)
{
checklist.set(index,new Boolean(true));
}
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean selected,
boolean cellHasFocus)
{
//-------------------------------------------------------
// Set the background colors for selection
//-------------------------------------------------------
Color bg;
if (selected) {
bg = GUI.getTextHighlightColor();
} else {
if (index % 2 == 0)
bg = list.getBackground();
else
bg = AlternateRowColor;
}
/* if (index == waitingMode)
{
mRow.remove(1);
waitIcon.setImageObserver(mRow);
mRow.add(waitLabel,1);
}
else
{
mRow.remove(1);
mRow.add(blankArea,1);
}
*/
if (checklist.size() == 0 || checklist.size() <= index)
checklist.add(index,new Boolean(false));
if (((Boolean)checklist.get(index)).booleanValue() && mRow.getComponent(1) != waitLabel)
{
mRow.remove(1);
mRow.add(checkedLabel,1);
}
if (!((Boolean)checklist.get(index)).booleanValue() && mRow.getComponent(1) != waitLabel)
{
mRow.remove(1);
mRow.add(blankArea,1);
}
mRow.setBackground(bg);
waitLabel.setBackground(bg);
mLabelPanel.setBackground(bg);
mLabel.setBackground(bg);
mIconLabel.setBackground(bg);
//-------------------------------------------------------
// Set the checkbox, label & icon
//-------------------------------------------------------
//mCheckBox.invisible = true;
String displayName = null;
if (value instanceof org.osid.provider.Provider) {
org.osid.provider.Provider provider = (org.osid.provider.Provider)value;
displayName = provider.getDisplayName();
//mCheckBox.invisible = false;
//mCheckBox.setSelected(datasource.isIncludedInSearch());
// TODO: cache or maybe return a path in place of an image for getIcon16x16
try {
org.osid.shared.PropertiesIterator propertiesIterator = provider.getProperties();
while (propertiesIterator.hasNextProperties()) {
org.osid.shared.Properties props = propertiesIterator.nextProperties();
org.osid.shared.ObjectIterator objectIterator = props.getKeys();
while (objectIterator.hasNextObject()) {
String key = (String)objectIterator.nextObject();
try {
if (key.equals("icon16x16")) {
String path = factory.getResourcePath((String)props.getProperty(key));
mIconLabel.setIcon(new javax.swing.ImageIcon(path));
break;
}
} catch (Throwable t) {
mIconLabel.setIcon(remoteIcon);
break;
}
}
}
} catch (Throwable t) {
}
/*if (datasource.isOnline())
namePanel.add(onlineLabel, BorderLayout.EAST);
} else {
namePanel.add(offlineLabel, BorderLayout.EAST);
}*/
mRow.setBorder(EmptyDividerBorder);
} else if (value instanceof String) {
String s = (String)value;
mRow.setBorder(DividerBorder);
displayName = s;
if (s.equals(MY_COMPUTER)) {
mIconLabel.setIcon(myComputerIcon);
} else if (s.equals(MY_SAVED_CONTENT)) {
mIconLabel.setIcon(savedResourcesIcon);
} else if (s.startsWith("FTP")) {
mIconLabel.setIcon(remoteIcon);
} else if (s.startsWith("RSS")) {
mIconLabel.setIcon(rssIcon);
} else if (s.equals(LOADING)) {
displayName = LOADING;
mIconLabel.setIcon(null);
} else {
mIconLabel.setIcon(null);
}
} else {
mRow.setBorder(DividerBorder);
}
/* if (value == ProviderList.IndicatedDragOverValue)
mLabel.setForeground(Color.red);
else */ if (selected)
mLabel.setForeground(Color.black);
//mLabel.setForeground(SystemColor.textHighlightText);
else
mLabel.setForeground(Color.black);
mLabel.setText(displayName);
return mRow;
}
public void invokeWaitingMode(int index)
{
waitingMode = index;
}
public void endWaitingMode()
{
waitingMode = -1;
}
public void clearAllChecked()
{
for (int i =0; i < checklist.size(); i++)
checklist.set(i,new Boolean(false));
}
}