package org.korsakow.ide.ui.resourceexplorer;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import java.util.Timer;
import javax.swing.JComboBox;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TreeModelListener;
import javax.swing.table.TableCellEditor;
import javax.swing.tree.TreeSelectionModel;
import org.korsakow.ide.lang.LanguageBundle;
import org.korsakow.ide.resources.ResourceProperty;
import org.korsakow.ide.ui.components.KTreeTable;
import org.korsakow.ide.ui.components.tree.FolderNode;
import org.korsakow.ide.ui.components.tree.KNode;
import org.korsakow.ide.ui.controller.action.RenameAction;
import org.korsakow.ide.util.UIUtil;
import com.sun.swingx.treetable.TreeTableModel;
public class ResourceTreeTable extends KTreeTable
{
protected TreeModelListener treeListener;
public ResourceTreeTable()
{
super(new DefaultResourceTreeTableModel(new FolderNode("/")));
getTree().putClientProperty("doNotCancelPopup", new JComboBox().getClientProperty("doNotCancelPopup"));
setTreeCellRenderer(new ResourceTreeCellRenderer());
setRootVisible(false);
setShowGrid(true);
setDragEnabled(true);
setEditable(true);
// resourceTreeTable.getColumnModel().getColumn(resourceTreeTable.getTreeTableModel().getHierarchicalColumn()).setCellEditor(new KTreeTreeCellEditor());
// resourceTree.setCellEditor(new KTreeTreeCellEditor(resourceTree, (ResourceTreeCellRenderer)resourceTree.getCellRenderer()));
getSelectionModel().setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
setDefaultEditor(TreeTableModel.class, new ResourceTreeTableCellEditor(this));
setDefaultRenderer(Object.class, new ResourceTreeTableCellRenderer());
getColumnModel().getColumn(0).setIdentifier(ResourceProperty.NAME);
getColumnModel().getColumn(0).setHeaderValue(LanguageBundle.getString("resourcebrowser.columns.name.label"));
setRowHeight(18); // this used to be not set, but the snu icon at this time (2009/07/01) was getting cut off
initListeners();
}
@Override
public boolean isCellEditable(int row, int column)
{
KNode cell = getNodeAt(row);
if (column != 0)
return false;
// if (cell instanceof FolderNode == false)
// return false;
if (cell == getRootNode())
return false;
return true;
}
public KNode getEditingNode()
{
TableCellEditor editor = getCellEditor();
if (editor instanceof ResourceTreeTableCellEditor)
return ((ResourceTreeTableCellEditor)editor).getEditingNode();
return null;
}
@Override
public ResourceTreeTableModel getTreeTableModel()
{
return (ResourceTreeTableModel)super.getTreeTableModel();
}
public void setExternalTreeListener ( TreeModelListener tListener ) {
treeListener = tListener;
ResourceTreeTableModel tModel = this.getTreeTableModel();
tModel.addTreeModelListener(treeListener);
}
public void setTreeTableModel(ResourceTreeTableModel model)
{
List<?> identifiers = ((DefaultResourceTreeTableModel)getTreeTableModel()).getColumnIdentifiers();
model.setColumnIdentifiers(identifiers);
if ( treeListener != null ) model.addTreeModelListener( treeListener );
super.setTreeTableModel(model);
}
protected void initListeners()
{
final RenameAfterDelayedClickAdapter mama = new RenameAfterDelayedClickAdapter(this);
addMouseListener(mama);
getSelectionModel().addListSelectionListener(mama);
}
private static class RenameAfterDelayedClickAdapter extends MouseAdapter implements ListSelectionListener
{
private final ResourceTreeTable tree;
private Timer timer;
public RenameAfterDelayedClickAdapter(ResourceTreeTable tree)
{
super();
this.tree = tree;
}
private boolean isSelection = false;
@Override
public void mousePressed(MouseEvent event) {
cancel();
}
private void cancel()
{
if (timer != null) {
timer.cancel();
timer = null;
}
}
@Override
public void mouseReleased(MouseEvent event) {
if (!UIUtil.isRegularSingleClick(event)) {
cancel();
return;
}
if (!isSelection) {
if (tree.getSelectedNode() != null) {
// haha, for some reason using javax.swing.Timer here didn't work. editing would start and
// then promptly stop
if (timer != null)
timer.cancel();
timer = UIUtil.runUITaskLater(new Runnable() {
public void run() {
new RenameAction(tree).actionPerformed(null);
}
}, 1000);
}
}
isSelection = false;
}
public void valueChanged(ListSelectionEvent e) {
isSelection = true;
}
}
}