package thaw.plugins.index;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.KeyEvent;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import thaw.core.Config;
import thaw.fcp.FreenetURIHelper;
import thaw.core.I18n;
import thaw.gui.IconBox;
import thaw.core.Logger;
import thaw.fcp.FCPQueueManager;
import thaw.gui.JDragTree;
import thaw.plugins.ToolbarModifier;
/**
* Manages the index tree and its menu (right-click).
*/
public class IndexTree extends java.util.Observable implements MouseListener, ActionListener, javax.swing.event.TreeSelectionListener {
public final static Color SELECTION_COLOR = new Color(190, 190, 190);
public final static Color LOADING_COLOR = new Color(230, 230, 230);
public final static Color LOADING_SELECTION_COLOR = new Color(150, 150, 150);
private JPanel panel;
private JTree tree;
private IndexRoot root;
private JPopupMenu indexFolderMenu;
private Vector indexFolderActions; /* IndexManagementHelper.MenuAction */
// downloadIndexes
// createIndex
// addIndex
// addCategory
// renameCategory
// deleteCategory
// copyKeys
private JPopupMenu indexAndFileMenu; /* hem ... and links ... */
private Vector indexAndFileActions; /* hem ... and links ... */ /* IndexManagementHelper.MenuAction */
private JMenu indexMenu;
// download
// insert
// renameIndex
// delete
// change keys
// copy public key
// copy private key
private JMenu fileMenu;
// addFileAndInsert
// addFileWithoutInserting
// addAKey
private JMenu linkMenu;
// addALink
private JMenu commentMenu;
// readComments
// postComments
private boolean selectionOnly;
private Vector selectedNodes = null;
private DefaultTreeModel treeModel;
private IndexBrowserPanel indexBrowser;
private ToolbarModifier toolbarModifier;
private Vector toolbarActions;
private Vector updatingIndexes;
/**
* @param queueManager Not used if selectionOnly is set to true
* @param config Not used if selectionOnly is set to true (used for lastDestinationDirectory and lastSourceDirectory)
*/
public IndexTree(final String rootName, boolean selectionOnly,
final FCPQueueManager queueManager,
final IndexBrowserPanel indexBrowser,
final Config config) {
this.indexBrowser = indexBrowser;
updatingIndexes = new Vector();
this.selectionOnly = selectionOnly;
panel = new JPanel();
panel.setLayout(new BorderLayout(10, 10));
boolean loadOnTheFly = false;
if (config != null && config.getValue("loadIndexTreeOnTheFly") != null)
loadOnTheFly = Boolean.valueOf(config.getValue("loadIndexTreeOnTheFly")).booleanValue();
root = new IndexRoot(queueManager, indexBrowser, rootName, loadOnTheFly);
treeModel = new DefaultTreeModel(root);
final IndexTreeRenderer treeRenderer = new IndexTreeRenderer();
treeRenderer.setLeafIcon(IconBox.minIndexReadOnly);
if (!selectionOnly) {
tree = new JDragTree(treeModel);
} else {
tree = new JTree(treeModel);
}
tree.addMouseListener(this);
tree.addTreeSelectionListener(this);
tree.setCellRenderer(treeRenderer);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
tree.setExpandsSelectedPaths(true);
// Menus :
JMenuItem item;
indexFolderMenu = new JPopupMenu(I18n.getMessage("thaw.plugin.index.category"));
indexFolderActions = new Vector();
indexAndFileMenu = new JPopupMenu();
indexAndFileActions = new Vector();
item = new JMenuItem("");
indexAndFileMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.NodeNameDisplayer(item));
indexAndFileMenu.addSeparator();
indexMenu = new JMenu(I18n.getMessage("thaw.plugin.index.index"));
indexMenu.setIcon(IconBox.minIndex);
fileMenu = new JMenu(I18n.getMessage("thaw.common.files"));
fileMenu.setIcon(IconBox.minFile);
linkMenu = new JMenu(I18n.getMessage("thaw.plugin.index.links"));
linkMenu.setIcon(IconBox.minLink);
commentMenu = new JMenu(I18n.getMessage("thaw.plugin.index.comment.commentList"));
commentMenu.setIcon(IconBox.minReadComments);
// Folder menu
item = new JMenuItem("");
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.NodeNameDisplayer(item));
indexFolderMenu.addSeparator();
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.addAlreadyExistingIndex"),
IconBox.minIndexReadOnly);
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.IndexReuser(queueManager, indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.addCategory"),
IconBox.minFolderNew);
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.IndexFolderAdder(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.createIndex"), IconBox.minIndexNew);
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.IndexCreator(queueManager, indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.downloadIndexes"),
IconBox.minRefreshAction);
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.IndexDownloader(queueManager, indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.markAllAsSeen"));
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.IndexHasChangedFlagReseter(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.autoSortFolderAction"));
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.IndexSorter(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.sortAlphabetically"));
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.IndexFolderReorderer(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.rename"));
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.IndexRenamer(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.addToBlackList"),
IconBox.minStop);
indexFolderMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexBlackLister(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.delete"), IconBox.minDelete);
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.IndexDeleter(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.copyKeys"), IconBox.minCopy);
indexFolderMenu.add(item);
indexFolderActions.add(new IndexManagementHelper.PublicKeyCopier(item));
// Index menu
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.downloadIndex"),
IconBox.minRefreshAction);
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexDownloader(queueManager, indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.insertIndex"),
IconBox.minInsertions);
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexUploader(queueManager, indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.autoSortAction"));
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexSorter(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.rename"));
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexRenamer(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.exportIndex"),
IconBox.minExportAction);
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexExporter(item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.importIndex"),
IconBox.minImportAction);
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexImporter(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.delete"),
IconBox.minDelete);
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexDeleter(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.addToBlackList"),
IconBox.minStop);
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexBlackLister(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.indexSettings"),
IconBox.minIndexSettings);
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexModifier(queueManager, indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.copyPrivateKey"));
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.PrivateKeyCopier(item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.copyKey"),
IconBox.minCopy);
indexMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.PublicKeyCopier(item));
// File menu
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.addFilesWithInserting"),
IconBox.minInsertions);
fileMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.FileInserterAndAdder(config, queueManager, indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.addFilesWithoutInserting"),
IconBox.minAdd);
fileMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.FileAdder(config, queueManager, indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.addKeys"),
IconBox.minKey);
fileMenu.add(item);
IndexManagementHelper.IndexAction ac = new IndexManagementHelper.KeyAdder(indexBrowser, item);
indexAndFileActions.add(ac);
// Link menu
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.addLink"),
IconBox.minMakeALinkAction);
linkMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.LinkAdder(indexBrowser, item));
// Comment menu
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.comment.readComments"),
IconBox.minReadComments);
commentMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexCommentViewer(indexBrowser, item));
item = new JMenuItem(I18n.getMessage("thaw.plugin.index.comment.add"),
IconBox.minAddComment);
commentMenu.add(item);
indexAndFileActions.add(new IndexManagementHelper.IndexCommentAdder(queueManager, indexBrowser, item));
indexAndFileMenu.add(indexMenu);
indexAndFileMenu.add(fileMenu);
indexAndFileMenu.add(linkMenu);
indexAndFileMenu.add(commentMenu);
updateMenuState(null);
panel.add(new JScrollPane(tree), BorderLayout.CENTER);
// Toolbar
JButton button;
IndexManagementHelper.IndexAction action;
toolbarActions = new Vector();
toolbarModifier = new ToolbarModifier(indexBrowser.getMainWindow());
button = new JButton(IconBox.refreshAction);
button.setToolTipText(I18n.getMessage("thaw.plugin.index.downloadIndexes"));
button.setMnemonic(KeyEvent.VK_R);
action = new IndexManagementHelper.IndexDownloader(queueManager, indexBrowser, button);
action.setTargets(null);
toolbarModifier.addButtonToTheToolbar(button);
toolbarActions.add(action);
button = new JButton(IconBox.folderNew);
button.setToolTipText(I18n.getMessage("thaw.plugin.index.addCategory"));
action = new IndexManagementHelper.IndexFolderAdder(indexBrowser, button);
action.setTargets(null);
toolbarModifier.addButtonToTheToolbar(button);
toolbarActions.add(action);
button = new JButton(IconBox.indexReuse);
button.setToolTipText(I18n.getMessage("thaw.plugin.index.addAlreadyExistingIndex"));
action = new IndexManagementHelper.IndexReuser(queueManager, indexBrowser, button);
action.setTargets(null);
toolbarModifier.addButtonToTheToolbar(button);
toolbarActions.add(action);
button = new JButton(IconBox.indexNew);
button.setToolTipText(I18n.getMessage("thaw.plugin.index.createIndex"));
action = new IndexManagementHelper.IndexCreator(queueManager, indexBrowser, button);
action.setTargets(null);
toolbarModifier.addButtonToTheToolbar(button);
toolbarActions.add(action);
button = new JButton(IconBox.indexSettings);
button.setToolTipText(I18n.getMessage("thaw.plugin.index.indexSettings"));
action = new IndexManagementHelper.IndexModifier(queueManager, indexBrowser, button);
action.setTargets(null);
toolbarModifier.addButtonToTheToolbar(button);
toolbarActions.add(action);
button = new JButton(IconBox.copy);
button.setToolTipText(I18n.getMessage("thaw.plugin.index.copyKeys"));
action = new IndexManagementHelper.PublicKeyCopier(button);
action.setTargets(null);
toolbarModifier.addButtonToTheToolbar(button);
toolbarActions.add(action);
button = new JButton(IconBox.stop);
button.setToolTipText(I18n.getMessage("thaw.plugin.index.addToBlackList"));
button.setMnemonic(KeyEvent.VK_B);
action = new IndexManagementHelper.IndexBlackLister(indexBrowser, button);
action.setTargets(null);
toolbarModifier.addButtonToTheToolbar(button);
toolbarActions.add(action);
button = new JButton(IconBox.delete);
button.setToolTipText(I18n.getMessage("thaw.plugin.index.delete"));
action = new IndexManagementHelper.IndexDeleter(indexBrowser, button);
action.setTargets(null);
if (!selectionOnly)
tree.addKeyListener((IndexManagementHelper.IndexDeleter)action);
toolbarModifier.addButtonToTheToolbar(button);
toolbarActions.add(action);
toolbarModifier.addButtonToTheToolbar(null);
button = new JButton(IconBox.addToIndexAction);
button.setToolTipText(I18n.getMessage("thaw.plugin.index.addFilesWithoutInserting"));
action = new IndexManagementHelper.FileAdder(config, queueManager, indexBrowser, button);
action.setTargets(null);
toolbarModifier.addButtonToTheToolbar(button);
toolbarActions.add(action);
button = new JButton(IconBox.makeALinkAction);
button.setToolTipText(I18n.getMessage("thaw.plugin.index.addLink"));
action = new IndexManagementHelper.LinkAdder(indexBrowser, button);
action.setTargets(null);
toolbarModifier.addButtonToTheToolbar(button);
toolbarActions.add(action);
}
public IndexBrowserPanel getIndexBrowserPanel() {
return indexBrowser;
}
/**
* Used by IndexBrowserPanel when the visibility changed
*/
public ToolbarModifier getToolbarModifier() {
return toolbarModifier;
}
public javax.swing.JComponent getPanel() {
return panel;
}
public void addTreeSelectionListener(final javax.swing.event.TreeSelectionListener tsl) {
tree.addTreeSelectionListener(tsl);
}
public void checkSelection() {
final TreePath[] paths = tree.getSelectionPaths();
if(paths == null)
return;
selectedNodes = new Vector();
for (int i = 0 ; i < paths.length ; i++) {
selectedNodes.add(paths[i].getLastPathComponent());
}
indexBrowser.getDetailPanel().setTargets(selectedNodes);
// Update toolbar
for (final Iterator it = toolbarActions.iterator();
it.hasNext(); ) {
final IndexManagementHelper.IndexAction action = (IndexManagementHelper.IndexAction)it.next();
action.setTargets(selectedNodes);
}
// Update nodes
for (int i = 0 ; i < paths.length ; i++) {
IndexTreeNode selectedNode = (IndexTreeNode)paths[i].getLastPathComponent();
if ((indexBrowser != null) && (selectedNode instanceof Index)) {
indexBrowser.getUnknownIndexList().addLinks(((Index)selectedNode));
if (((Index)selectedNode).hasChanged()) {
((Index)selectedNode).setHasChangedFlag(false);
redraw(paths[i]);
}
if (((Index)selectedNode).hasNewComment()) {
((Index)selectedNode).setNewCommentFlag(false);
redraw(paths[i]);
}
}
}
toolbarModifier.displayButtonsInTheToolbar();
// Notify observers
setChanged();
notifyObservers(selectedNodes); /* will make the toolbar visible */
}
public void updateMenuState(final Vector nodes) {
IndexManagementHelper.IndexAction action;
for(final Iterator it = indexFolderActions.iterator();
it.hasNext();) {
action = (IndexManagementHelper.IndexAction)it.next();
action.setTargets(nodes);
}
for(final Iterator it = indexAndFileActions.iterator();
it.hasNext();) {
action = (IndexManagementHelper.IndexAction)it.next();
action.setTargets(nodes);
}
}
public JTree getTree() {
return tree;
}
public IndexRoot getRoot() {
return root;
}
public void mouseClicked(final MouseEvent e) {
checkSelection();
}
public void mouseEntered(final MouseEvent e) { }
public void mouseExited(final MouseEvent e) { }
public void mousePressed(final MouseEvent e) {
if (!selectionOnly)
showPopupMenu(e);
}
public void mouseReleased(final MouseEvent e) {
if (!selectionOnly)
showPopupMenu(e);
}
protected void showPopupMenu(final MouseEvent e) {
if(e.isPopupTrigger()) {
if(selectedNodes == null)
return;
updateMenuState(selectedNodes);
if(selectedNodes.size() == 1 && selectedNodes.get(0) instanceof IndexFolder) {
indexFolderMenu.show(e.getComponent(), e.getX(), e.getY());
} else if(selectedNodes.size() >= 1) {
indexAndFileMenu.show(e.getComponent(), e.getX(), e.getY());
}
}
}
public IndexTreeNode getSelectedNode() {
final Object obj = tree.getLastSelectedPathComponent();
if (obj == null)
return null;
if (obj instanceof IndexTreeNode)
return (IndexTreeNode)obj;
if (obj instanceof DefaultMutableTreeNode)
return ((IndexTreeNode)(((DefaultMutableTreeNode)obj).getUserObject()));
Logger.notice(this, "getSelectedNode(): Unknow kind of node ?!");
return null;
}
public void actionPerformed(final ActionEvent e) {
}
public void refresh() {
refresh(((IndexTreeNode)null));
}
public void refresh(IndexTreeNode node) {
if (node != null)
node.forceFlagsReload();
if (treeModel != null) {
if (node != null && node.isInTree())
treeModel.reload(node.getTreeNode());
else
treeModel.reload(getRoot().getTreeNode());
}
}
public void refresh(TreePath path) {
Object[] nodes = path.getPath();
for (int i = 0 ; i < nodes.length ; i++)
refresh((IndexTreeNode)(nodes[i]));
}
public void redraw() {
redraw((IndexTreeNode)null);
}
public void redraw(IndexTreeNode node, boolean parents) {
if (!parents)
redraw(node);
else {
while (node != null) {
redraw(node);
node = ((IndexTreeNode)(((MutableTreeNode)node).getParent()));
}
}
}
public void redraw(IndexTreeNode node) {
if (node != null)
node.forceFlagsReload();
if (treeModel != null) {
if (node != null && node.isInTree()) {
treeModel.nodeChanged(node.getTreeNode());
} else {
treeModel.nodeChanged(getRoot().getTreeNode());
}
}
}
public void redraw(TreePath path) {
if (path != null) {
Object[] nodes = (path.getPath());
for (int i = 0 ; i < nodes.length ; i++) {
IndexTreeNode node = (IndexTreeNode)nodes[i];
redraw(node);
}
}
else
redraw(getRoot());
}
/**
* Will find the corresponding index and all its parents, then
* will unfold the tree according to the path to reach the index
* and then select the index. (won't touch filetable / linktable)
*/
public Index selectIndex(int id) {
int nmbFolders;
int[] parentFolders = new int[64];
if (indexBrowser == null
|| indexBrowser.getDb() == null) {
Logger.error(this, "selectIndex() : No access to the db ?!");
return null;
}
try {
synchronized(indexBrowser.getDb().dbLock) {
PreparedStatement st =
indexBrowser.getDb().getConnection().prepareStatement("SELECT folderId FROM indexParents WHERE indexId = ?");
st.setInt(1, id);
ResultSet set = st.executeQuery();
for(nmbFolders = 0 ; set.next() ; nmbFolders++) {
if (set.getObject("folderId") != null)
parentFolders[nmbFolders] = set.getInt("folderId");
else
parentFolders[nmbFolders] = -1;
}
st.close();
if (nmbFolders == 0) {
Logger.error(this, "Unable to select specified index : Not found.");
return null;
}
}
} catch(SQLException e) {
Logger.error(this, "Unable to select specified index because : "+e.toString());
return null;
}
IndexTreeNode[] nodes = new IndexTreeNode[nmbFolders+1 /* +1 for the index */];
nodes[0] = getRoot();
for (int i = 1 ; i < nmbFolders; i++) {
IndexFolder folder= null;
for (int j= 0 ; j < nmbFolders && folder == null; j++) {
if (parentFolders[j] < 0)
continue;
folder = ((IndexFolder)nodes[i-1]).getChildFolder(parentFolders[j]);
}
nodes[i] = folder;
if (folder == null) {
Logger.error(this, "SelectIndex : Woops, something is missing.");
Logger.error(this, "Path found :");
for (int j = 0 ; j < nodes.length && nodes[j] != null ; j++) {
Logger.error(this,
" -> "
+Integer.toString(((IndexTreeNode)nodes[j]).getId())
+ " - "
+nodes[j].toString());
}
return null;
}
}
nodes[nmbFolders] = ((IndexFolder)nodes[nmbFolders-1]).getChildIndex(id);
TreePath path = new TreePath(((Object[])nodes));
tree.setSelectionPath(path);
return ((Index)nodes[nmbFolders]);
}
public class IndexTreeRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 1L;
public IndexTreeRenderer() {
super();
}
public java.awt.Component getTreeCellRendererComponent(final JTree tree,
Object value,
final boolean selected,
final boolean expanded,
final boolean leaf,
final int row,
final boolean hasFocus) {
setBackgroundNonSelectionColor(Color.WHITE);
setBackgroundSelectionColor(IndexTree.SELECTION_COLOR);
setTextNonSelectionColor(Color.BLACK);
setTextSelectionColor(Color.BLACK);
if(value instanceof DefaultMutableTreeNode || value instanceof IndexTreeNode) {
Object o;
if (value instanceof DefaultMutableTreeNode)
o = ((DefaultMutableTreeNode)value).getUserObject();
else
o = value;
if(o instanceof Index) {
final Index index = (Index)o;
if (isIndexUpdating(index)) {
setBackgroundNonSelectionColor(IndexTree.LOADING_COLOR);
setBackgroundSelectionColor(IndexTree.LOADING_SELECTION_COLOR);
}
if (index.downloadSuccessful()) {
if (index.isModifiable()) {
setLeafIcon(IconBox.minIndex);
} else {
setLeafIcon(IconBox.minIndexReadOnly);
}
} else
setLeafIcon(IconBox.minStop);
if (index.isObsolete()) {
setTextNonSelectionColor(Color.RED);
setTextSelectionColor(Color.RED);
}
}
if (o instanceof IndexTreeNode) {
/* Remember that for the index category,
this kind of query is recursive */
boolean hasChanged = ((IndexTreeNode)o).hasChanged();
boolean newComment = ((IndexTreeNode)o).hasNewComment();
boolean publishPrivateKey = ((IndexTreeNode)o).publishPrivateKey();
int style = Font.PLAIN;
if (publishPrivateKey)
style |= Font.ITALIC;
if (hasChanged)
style |= Font.BOLD;
if (style == 0)
style = Font.PLAIN;
setFont(new Font("Dialog", style, 12));
if (newComment)
value = "* "+o.toString();
}
}
return super.getTreeCellRendererComponent(tree,
value,
selected,
expanded,
leaf,
row,
hasFocus);
}
}
public boolean addToRoot(final IndexTreeNode node) {
return addToIndexFolder(root, node);
}
public boolean addToIndexFolder(final IndexFolder target, final IndexTreeNode node) {
if ((node instanceof Index) && alreadyExistingIndex(node.getPublicKey())) {
Logger.notice(this, "Index already added");
return false;
}
node.setParent(target.getId());
target.getTreeNode().insert(node.getTreeNode(), target.getTreeNode().getChildCount());
treeModel.reload(target);
return true;
}
public boolean alreadyExistingIndex(final String key) {
if ((key == null) || (key.length() <= 10))
return false;
String realKey = FreenetURIHelper.getComparablePart(key);
try {
final Connection c = indexBrowser.getDb().getConnection();
PreparedStatement st;
String query;
query = "SELECT id FROM indexes WHERE LOWER(publicKey) LIKE ?";
Logger.info(this, query + " : " + realKey+"%");
st = c.prepareStatement(query);
st.setString(1, realKey+"%");
if (st.execute()) {
final ResultSet results = st.getResultSet();
if (results.next()) {
st.close();
return true;
}
st.close();
}
else
st.close();
} catch(final java.sql.SQLException e) {
Logger.warning(this, "Exception while trying to check if '"+key+"' is already know: '"+e.toString()+"'");
}
return false;
}
/**
* @param node can be null
*/
public void reloadModel(final MutableTreeNode node) {
treeModel.reload(node);
}
public void reloadModel() {
treeModel.reload();
}
/* TODO : Improve this ; quite ugly */
public void addUpdatingIndex(Index index) {
updatingIndexes.add(new Integer(index.getId()));
}
public void removeUpdatingIndex(Index index) {
updatingIndexes.remove(new Integer(index.getId()));
}
public int numberOfUpdatingIndexes() {
return updatingIndexes.size();
}
public boolean isIndexUpdating(Index index) {
return (updatingIndexes.indexOf(new Integer(index.getId())) >= 0);
}
public void valueChanged(TreeSelectionEvent arg0) {
checkSelection();
}
}