package org.concord.otrunk.util;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import org.concord.framework.otrunk.OTObject;
import org.concord.framework.otrunk.view.OTJComponentViewContext;
import org.concord.framework.otrunk.view.OTViewContext;
import org.concord.swing.CustomDialog;
public class ObjectChooserUtil
{
public static OTObject selectObjectFromViewContext(Component parent,
OTJComponentViewContext viewContext, Object[] omitObjectsAndClasses)
{
if (viewContext == null) {
System.err.println("Error selecting object: OTJComponentViewContext is null");
return null;
}
return showSelectionDialog(parent,
getObjectsFromContext(viewContext, omitObjectsAndClasses));
}
public static OTObject selectObjectFromSharedObjects(Component parent,
OTViewContext viewContext, Class<?> filter)
{
return showSelectionDialog(parent, getObjectFromSharedObjects(viewContext, filter));
}
public static OTObject selectObjectFromSharedObjects(Component parent,
OTSharingManager sharingManager, Class<?> filter)
{
return showSelectionDialog(parent, sharingManager.getAllSharedObjects(filter));
}
public static OTObject selectObjectFromContextAndShared(Component parent,
OTJComponentViewContext jViewContext, OTViewContext viewContext,
Object[] omitObjectsAndClasses)
{
Vector<OTObject> allObjects = getObjectsFromContext(jViewContext, omitObjectsAndClasses);
Vector<OTObject> objectsFromShared = getObjectFromSharedObjects(viewContext, null);
for (int i = 0; i < objectsFromShared.size(); i++) {
allObjects.add(objectsFromShared.get(i));
}
return showSelectionDialog(parent, allObjects);
}
public static OTObject selectObject(Component parent, Vector<OTObject> objects)
{
return showSelectionDialog(parent, objects);
}
private static Vector<OTObject> getObjectsFromContext(OTJComponentViewContext viewContext,
Object[] omitObjectsAndClasses)
{
Object[] objects = viewContext.getAllObjects();
final Vector<OTObject> cleanedObjects = new Vector<OTObject>();
for (int i = 0; i < objects.length; i++) {
if (objects[i] instanceof OTObject) {
OTObject obj = (OTObject) objects[i];
if (!contains(omitObjectsAndClasses, obj)) {
cleanedObjects.add(obj);
}
}
}
return cleanedObjects;
}
private static Vector<OTObject> getObjectFromSharedObjects(OTViewContext viewContext,
Class<?> filter)
{
OTSharingManager sharingManager =
(OTSharingManager) viewContext.getViewService(OTSharingManager.class);
if (sharingManager == null) {
System.err.println("Cannot create sharing manager from " + viewContext);
return null;
}
return sharingManager.getAllSharedObjects(filter);
}
private static OTObject showSelectionDialog(Component parent, Vector<OTObject> objects)
{
OTObjectTableModel otObjectTableModel = new OTObjectTableModel(objects);
final JTable table = new JTable(otObjectTableModel);
table.setGridColor(Color.LIGHT_GRAY);
table.setRowSelectionAllowed(true);
table.setPreferredScrollableViewportSize(new Dimension(400, 100));
JScrollPane scroll = new JScrollPane(table);
JLabel instr = new JLabel("Select an object:");
JPanel selectPanel = new JPanel(new BorderLayout());
selectPanel.add(instr, BorderLayout.NORTH);
selectPanel.add(scroll, BorderLayout.CENTER);
int retValue =
CustomDialog.showOKCancelDialog(parent, selectPanel, "Object Selection", true, true);
if (retValue == CustomDialog.OK_OPTION) {
int selectedIndex = table.getSelectedRow();
return otObjectTableModel.getObjectAt(selectedIndex);
} else {
return null;
}
}
private static boolean contains(Object[] objectsAndClasses, Object obj)
{
if (objectsAndClasses == null) {
return false;
}
for (int i = 0; i < objectsAndClasses.length; i++) {
if (objectsAndClasses[i] instanceof Class) {
// FIXME I'm pretty sure the following two statements are the same
// perhaps they were intended to be reversed so it would check if the
// obj is an instance of a class, or if the object class is a super class of
// any of the classes?
if (((Class<?>) objectsAndClasses[i]).isInstance(obj)
|| ((Class<?>) objectsAndClasses[i]).isAssignableFrom(obj.getClass()))
return true;
} else {
if (objectsAndClasses[i] == obj)
return true;
}
}
return false;
}
private static class OTObjectTableModel extends AbstractTableModel
{
private String[] columnNames = { "Class", "Name", "ID" };
private Vector<OTObject> otObjects;
public OTObjectTableModel(Vector<OTObject> otObjects)
{
this.otObjects = otObjects;
}
public int getColumnCount()
{
return 3;
}
public int getRowCount()
{
return otObjects.size();
}
public Object getValueAt(int rowIndex, int columnIndex)
{
OTObject obj = (OTObject) otObjects.get(rowIndex);
if (columnIndex == 0) {
String[] classPath = obj.otClass().getName().split("\\.");
return classPath[classPath.length - 1];
} else if (columnIndex == 1) {
return obj.getName();
} else {
return obj.getGlobalId().toExternalForm();
}
}
public OTObject getObjectAt(int rowIndex)
{
return (OTObject) otObjects.get(rowIndex);
}
public String getColumnName(int col)
{
return columnNames[col];
}
public boolean isCellEditable(int row, int col)
{
return false;
}
}
}