/*
* FileCellRenderer.java - renders table cells for the VFS browser
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 1999 Jason Ginchereau
* Portions copyright (C) 2001, 2003 Slava Pestov
* Portions copyright (C) 2007 Matthieu Casanova
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit.browser;
//{{{ Imports
import java.awt.*;
import java.awt.font.*;
import java.util.Random;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
import org.gjt.sp.jedit.io.FavoritesVFS;
import org.gjt.sp.jedit.io.VFSFile;
import org.gjt.sp.jedit.*;
//}}}
/**
* Local filesystem VFS.
* @version $Id: FileCellRenderer.java 21831 2012-06-18 22:54:17Z ezust $
*/
public class FileCellRenderer extends DefaultTableCellRenderer
{
public static Icon fileIcon = GUIUtilities.loadIcon(jEdit.getProperty("vfs.browser.file.icon"));
public static Icon openFileIcon = GUIUtilities.loadIcon(jEdit.getProperty("vfs.browser.open-file.icon"));
public static Icon dirIcon = GUIUtilities.loadIcon(jEdit.getProperty("vfs.browser.dir.icon"));
public static Icon openDirIcon = GUIUtilities.loadIcon(jEdit.getProperty("vfs.browser.open-dir.icon"));
public static Icon filesystemIcon = GUIUtilities.loadIcon(jEdit.getProperty("vfs.browser.filesystem.icon"));
public static Icon loadingIcon = GUIUtilities.loadIcon(jEdit.getProperty("vfs.browser.loading.icon"));
//{{{ FileCellRenderer constructor
public FileCellRenderer()
{
plainFont = UIManager.getFont("Tree.font");
if(plainFont == null)
plainFont = jEdit.getFontProperty("metal.secondary.font");
boldFont = plainFont.deriveFont(Font.BOLD);
} //}}}
//{{{ getTableCellRendererComponent() method
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column)
{
super.getTableCellRendererComponent(table,value,isSelected,
hasFocus,row,column);
if(value instanceof VFSDirectoryEntryTableModel.Entry)
{
VFSDirectoryEntryTableModel.Entry entry =
(VFSDirectoryEntryTableModel.Entry)value;
VFSFile file = entry.dirEntry;
setFont(file.getType() == VFSFile.FILE
? plainFont : boldFont);
this.isSelected = isSelected;
this.file = file;
if(column == 0)
{
// while its broken to have a null
// symlinkPath, some older plugins
// might...
String path;
if(file.getSymlinkPath() == null)
path = file.getPath();
else
path = file.getSymlinkPath();
openBuffer = jEdit._getBuffer(path) != null;
setIcon(showIcons
? getIconForFile(file,entry.expanded,
openBuffer) : null);
if (file instanceof FavoritesVFS.Favorite)
{
FavoritesVFS.Favorite favorite = (FavoritesVFS.Favorite) file;
setText(favorite.getLabel());
}
else
{
setText(file.getName());
}
int state;
if(file.getType() == VFSFile.FILE)
state = ExpansionToggleBorder.STATE_NONE;
else if(entry.expanded)
state = ExpansionToggleBorder.STATE_EXPANDED;
else
state = ExpansionToggleBorder.STATE_COLLAPSED;
setBorder(new ExpansionToggleBorder(
state,entry.level));
}
else
{
VFSDirectoryEntryTableModel model = (VFSDirectoryEntryTableModel)table.getModel();
String extAttr = model.getExtendedAttribute(column);
openBuffer = false;
setIcon(null);
setText(file.getExtendedAttribute(extAttr));
setBorder(new EmptyBorder(1,1,1,1));
}
}
return this;
} //}}}
//{{{ paintComponent() method
public void paintComponent(Graphics g)
{
if(!isSelected)
{
Color color = file.getColor();
setForeground(color == null
? UIManager.getColor("Tree.foreground")
: color);
}
super.paintComponent(g);
if(openBuffer)
{
Font font = getFont();
FontMetrics fm = getFontMetrics(font);
int x, y;
if(getIcon() == null)
{
x = 0;
y = fm.getAscent() + 2;
}
else
{
x = getIcon().getIconWidth() + getIconTextGap();
y = Math.max(fm.getAscent() + 2,16);
}
Insets border = getBorder().getBorderInsets(this);
x += border.left;
g.setColor(getForeground());
g.drawLine(x,y,x + fm.stringWidth(getText()),y);
}
} //}}}
//{{{ getIconForFile() method
/**
* @since jEdit 4.3pre2
*/
public static Icon getIconForFile(VFSFile file,
boolean expanded)
{
return getIconForFile(file,expanded,
jEdit._getBuffer(file.getSymlinkPath()) != null);
} //}}}
//{{{ getIconForFile() method
public static Icon getIconForFile(VFSFile file,
boolean expanded, boolean openBuffer)
{
if (defaultIcons)
return file.getDefaultIcon(expanded, openBuffer);
return file.getIcon(expanded, openBuffer);
} //}}}
//{{{ Package-private members
Font plainFont;
Font boldFont;
boolean showIcons;
private static boolean defaultIcons = true;
//{{{ propertiesChanged() method
void propertiesChanged()
{
showIcons = jEdit.getBooleanProperty("vfs.browser.showIcons");
defaultIcons = jEdit.getBooleanProperty("vfs.browser.useDefaultIcons");
} //}}}
//{{{ getEntryWidth() method
int getEntryWidth(VFSDirectoryEntryTableModel.Entry entry,
Font font, FontRenderContext fontRenderContext)
{
String name = entry.dirEntry.getName();
int width = (int)font.getStringBounds(name,fontRenderContext)
.getWidth();
width += ExpansionToggleBorder.ICON_WIDTH
+ entry.level * ExpansionToggleBorder.LEVEL_WIDTH
+ 3;
if(showIcons)
{
width += fileIcon.getIconWidth();
width += getIconTextGap();
}
return width;
} //}}}
//}}}
//{{{ Private members
private boolean openBuffer;
private boolean isSelected;
private VFSFile file;
//}}}
//{{{ ExpansionToggleBorder class
static class ExpansionToggleBorder implements Border
{
static final Icon COLLAPSE_ICON;
static final Icon EXPAND_ICON;
static final int ICON_WIDTH;
static final int LEVEL_WIDTH = 10;
static final int STATE_NONE = 0;
static final int STATE_COLLAPSED = 1;
static final int STATE_EXPANDED = 2;
//{{{ ExpansionToggleBorder constructor
ExpansionToggleBorder(int state, int level)
{
this.state = state;
this.level = level;
} //}}}
//{{{ paintBorder() method
public void paintBorder(Component c, Graphics g,
int x, int y, int width, int height)
{
// paint the opposite icon of what the state is
switch(state)
{
case STATE_COLLAPSED:
EXPAND_ICON.paintIcon(c,g,
x + level * LEVEL_WIDTH + 2,
y + (height - EXPAND_ICON.getIconHeight()) / 2);
break;
case STATE_EXPANDED:
COLLAPSE_ICON.paintIcon(c,g,
x + level * LEVEL_WIDTH + 2,
y + (height - COLLAPSE_ICON.getIconHeight()) / 2);
break;
}
} //}}}
//{{{ getBorderInsets() method
public Insets getBorderInsets(Component c)
{
return new Insets(1,level * LEVEL_WIDTH
+ ICON_WIDTH + 4,1,1);
} //}}}
//{{{ isBorderOpaque() method
public boolean isBorderOpaque()
{
return false;
} //}}}
//{{{ isExpansionToggle() method
public static boolean isExpansionToggle(int level, int x)
{
return (x >= level * LEVEL_WIDTH)
&& (x <= level * LEVEL_WIDTH + ICON_WIDTH);
} //}}}
//{{{ Private members
private int state;
private int level;
static
{
COLLAPSE_ICON = GUIUtilities.loadIcon(jEdit.getProperty("vfs.browser.collapse.icon"));
EXPAND_ICON = GUIUtilities.loadIcon(jEdit.getProperty("vfs.browser.expand.icon"));
ICON_WIDTH = Math.max(COLLAPSE_ICON.getIconWidth(), EXPAND_ICON.getIconWidth());
} //}}}
} //}}}
}