package org.korsakow.ide.ui.dialogs;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.KeyStroke;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import org.korsakow.domain.interf.IMedia;
import org.korsakow.ide.lang.LanguageBundle;
import org.korsakow.ide.resources.MediaProperty;
import org.korsakow.ide.ui.components.tree.KNode;
import org.korsakow.ide.ui.components.tree.ResourceNode;
import org.korsakow.ide.ui.resourceexplorer.ResourceTreeCellRenderer;
import org.korsakow.ide.ui.resourceexplorer.ResourceTreeTable;
import org.korsakow.ide.ui.resourceexplorer.ResourceTreeTableModel;
import org.korsakow.ide.util.UIUtil;
public class MissingMediaDialog extends JDialog
{
private static class FileNode extends KNode
{
private final String cachedName;
public FileNode(String path)
{
this(new File(path));
}
public FileNode(File file) {
super(file.getAbsolutePath());
cachedName = file.getName();
}
public String getFilename()
{
return cachedName;
}
}
private static class MyTreeCellRenderer extends ResourceTreeCellRenderer
{
@Override
public Component getTreeCellRendererComponent(JTree tree, KNode value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus)
{
super.getTreeCellRendererComponent(tree, value.getName(), selected, expanded, leaf, row, hasFocus);
if (value instanceof FileNode) {
FileNode fileNode = (FileNode)value;
setText(fileNode.getFilename());
}
return this;
}
}
private static class MyTreeTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer
{
@Override
public Component getTableCellRendererComponent(
JTable table, // the list
Object value, // value to display
boolean isSelected, // is the cell selected
boolean cellHasFocus, // is the cell selected
int row, // column index
int column) // column index
{
super.getTableCellRendererComponent(table, value, isSelected, cellHasFocus, row, column);
if (value instanceof FileNode) {
setText(((FileNode)value).getName());
} else {
setText("");
}
return this;
}
}
private final Collection<IMedia> mediaCache = new HashSet<IMedia>();
private ResourceTreeTable tree;
private ResourceTreeTableModel treeModel;
private final JTextArea messageLabel = new JTextArea();
private final JButton findMissingButton = new JButton(LanguageBundle.getString("missingmediadialog.findmissing.label"));
private final JButton closeButton = new JButton(LanguageBundle.getString("missingmediadialog.close.label"));
public MissingMediaDialog(JFrame parent)
{
super(parent);
initUI();
initListeners();
}
@Override
public void setVisible(boolean visible)
{
super.setVisible(true);
}
public void setMessage(String msg)
{
messageLabel.setText(msg);
}
public void addMissingItem(IMedia item)
{
addMissingItem(item, Collections.EMPTY_LIST);
}
public void setPossibleMatches(IMedia item, Collection<File> possibleMatches)
{
KNode itemNode = treeModel.findResource(item.getId());
for (File match : possibleMatches)
{
KNode fileNode = new FileNode(match.getAbsolutePath());
itemNode.add(fileNode);
}
}
public void addMissingItem(IMedia item, Collection<File> possibleMatches)
{
KNode itemNode = ResourceNode.create(item);
setPossibleMatches(item, possibleMatches);
treeModel.appendNode(itemNode, treeModel.getRoot());
mediaCache.add(item);
}
public void removeMissingItem(IMedia item)
{
treeModel.remove(item.getId());
mediaCache.remove(item);
}
public Collection<IMedia> getMissingMedia()
{
return new HashSet<IMedia>(mediaCache);
}
public void expandAll()
{
tree.expandNode(tree.getRootNode());
tree.expandAllRecursive();
}
private void initUI()
{
// setLayout(new BoxLayout());
Box mainPanel = Box.createVerticalBox();
JPanel panel;
Box box;
add(mainPanel);
//panel = new JPanel();
//panel.setLayout(new BorderLayout());
mainPanel.add(messageLabel);
//panel.add(messageLabel);
messageLabel.setLineWrap(true);
messageLabel.setEditable(false);
messageLabel.setBackground(new JLabel().getBackground());
messageLabel.setMaximumSize(new Dimension(Integer.MAX_VALUE, messageLabel.getPreferredSize().height));
mainPanel.add(Box.createVerticalGlue());
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBorder(new TitledBorder(LanguageBundle.getString("missingmediadialog.missing.label")));
mainPanel.add(panel);
tree = new ResourceTreeTable();
tree.setTreeCellRenderer(new MyTreeCellRenderer());
tree.setDefaultRenderer(Object.class, new MyTreeTableCellRenderer());
treeModel = tree.getTreeTableModel();
tree.setRootVisible(false);
panel.add(new JScrollPane(tree));
UIUtil.addColumn(tree, LanguageBundle.getString("resourcebrowser.columns.filename.label"), MediaProperty.FILENAME);
mainPanel.add(Box.createVerticalGlue());
box = Box.createHorizontalBox();
mainPanel.add(box);
box.add(Box.createHorizontalGlue());
box.add(findMissingButton);
box.add(Box.createHorizontalStrut(20));
box.add(closeButton);
box.add(Box.createHorizontalStrut(5));
getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "escape");
getRootPane().getActionMap().put("escape", new AbstractAction()
{
public void actionPerformed(ActionEvent event) {
closeButton.doClick();
}
});
}
private void initListeners()
{
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
onCloseAction();
}
});
}
public void setFindMissingAction(ActionListener action)
{
findMissingButton.addActionListener(action);
}
private void onCloseAction()
{
dispose();
}
}