/* *------------------------------------------------------------------------------ * Copyright (C) 2006-2015 University of Dundee. All rights reserved. * * * 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 * (at your option) 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.agents.treeviewer.util; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Rectangle; import javax.swing.Icon; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.JViewport; import javax.swing.tree.DefaultTreeCellRenderer; import org.openmicroscopy.shoola.agents.treeviewer.IconManager; import org.openmicroscopy.shoola.agents.treeviewer.browser.Browser; import org.openmicroscopy.shoola.agents.treeviewer.browser.BrowserFactory; import org.openmicroscopy.shoola.agents.util.browser.SmartFolder; import org.openmicroscopy.shoola.agents.util.browser.TreeFileSet; import org.openmicroscopy.shoola.agents.util.browser.TreeImageDisplay; import org.openmicroscopy.shoola.agents.util.browser.TreeImageTimeSet; import org.openmicroscopy.shoola.agents.util.dnd.DnDTree; import org.openmicroscopy.shoola.agents.util.EditorUtil; import org.openmicroscopy.shoola.util.ui.UIUtilities; import omero.gateway.model.DataObject; import omero.gateway.model.DatasetData; import omero.gateway.model.ExperimenterData; import omero.gateway.model.FileAnnotationData; import omero.gateway.model.FileData; import omero.gateway.model.GroupData; import omero.gateway.model.ImageData; import omero.gateway.model.PlateData; import omero.gateway.model.ProjectData; import omero.gateway.model.PlateAcquisitionData; import omero.gateway.model.ScreenData; import omero.gateway.model.TagAnnotationData; /** * Determines and sets the icon corresponding to a data object. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author <br>Andrea Falconi      * <a href="mailto:a.falconi@dundee.ac.uk"> * a.falconi@dundee.ac.uk</a> * @version 2.2 * @since OME2.2 */ public class TreeCellRenderer extends DefaultTreeCellRenderer { /** Reference to the <code>Image</code> icon. */ private static final Icon IMAGE_ICON; /** Reference to the <code>Image</code> icon. */ private static final Icon IMAGE_ANNOTATED_ICON; /** Reference to the <code>Image</code> icon. */ private static final Icon IMAGE_NOT_OWNED_ICON; /** Reference to the <code>Image</code> icon. */ private static final Icon IMAGE_ANNOTATED_NOT_OWNED_ICON; /** Reference to the <code>Image</code> icon. */ private static final Icon IMAGE_UNREGISTERED_ICON; /** Reference to the <code>Dataset</code> icon. */ private static final Icon DATASET_ICON; /** Reference to the <code>Dataset</code> icon. */ private static final Icon DATASET_ANNOTATED_ICON; /** Reference to the <code>Dataset</code> icon. */ private static final Icon DATASET_TO_REFRESH_ICON; /** Reference to the <code>Dataset</code> icon. */ private static final Icon DATASET_ANNOTATED_TO_REFRESH_ICON; /** Reference to the <code>Dataset</code> icon. */ private static final Icon DATASET_NOT_OWNED_ICON; /** Reference to the <code>Dataset</code> icon. */ private static final Icon DATASET_ANNOTATED_NOT_OWNED_ICON; /** Reference to the <code>Dataset</code> icon. */ private static final Icon DATASET_TO_REFRESH_NOT_OWNED_ICON; /** Reference to the <code>Dataset</code> icon. */ private static final Icon DATASET_ANNOTATED_TO_REFRESH_NOT_OWNED_ICON; /** Reference to the <code>Project</code> icon. */ private static final Icon PROJECT_NOT_OWNED_ICON; /** Reference to the <code>Project</code> icon. */ private static final Icon PROJECT_ANNOTATED_NOT_OWNED_ICON; /** Reference to the <code>Project</code> icon. */ private static final Icon PROJECT_TO_REFRESH_NOT_OWNED_ICON; /** Reference to the <code>Project</code> icon. */ private static final Icon PROJECT_ANNOTATED_TO_REFRESH_NOT_OWNED_ICON; /** Reference to the <code>Project</code> icon. */ private static final Icon PROJECT_ICON; /** Reference to the <code>Project</code> icon. */ private static final Icon PROJECT_ANNOTATED_ICON; /** Reference to the <code>Project</code> icon. */ private static final Icon PROJECT_TO_REFRESH_ICON; /** Reference to the <code>Project</code> icon. */ private static final Icon PROJECT_ANNOTATED_TO_REFRESH_ICON; /** Reference to the <code>Screen</code> icon. */ private static final Icon SCREEN_ICON; /** Reference to the <code>Screen</code> icon. */ private static final Icon SCREEN_ANNOTATED_ICON; /** Reference to the <code>Screen</code> icon. */ private static final Icon SCREEN_TO_REFRESH_ICON; /** Reference to the <code>Screen</code> icon. */ private static final Icon SCREEN_ANNOTATED_TO_REFRESH_ICON; /** Reference to the <code>Screen</code> icon. */ private static final Icon SCREEN_NOT_OWNED_ICON; /** Reference to the <code>Screen</code> icon. */ private static final Icon SCREEN_ANNOTATED_NOT_OWNED_ICON; /** Reference to the <code>Screen</code> icon. */ private static final Icon SCREEN_TO_REFRESH_NOT_OWNED_ICON; /** Reference to the <code>Screen</code> icon. */ private static final Icon SCREEN_ANNOTATED_TO_REFRESH_NOT_OWNED_ICON; /** Reference to the <code>Plate</code> icon. */ private static final Icon PLATE_ICON; /** Reference to the <code>Plate</code> icon. */ private static final Icon PLATE_ANNOTATED_ICON; /** Reference to the <code>Plate</code> icon. */ private static final Icon PLATE_NOT_OWNED_ICON; /** Reference to the <code>Plate</code> icon. */ private static final Icon PLATE_ANNOTATED_NOT_OWNED_ICON; /** Reference to the <code>Plate Acquisition</code> icon. */ private static final Icon PLATE_ACQUISITION_ICON; /** Reference to the Annotated<code>Plate Acquisition</code> icon. */ private static final Icon PLATE_ACQUISITION_ANNOTATED_ICON; /** Reference to the <code>Tag</code> icon. */ private static final Icon TAG_ICON; /** Reference to the <code>Tag Set</code> icon. */ private static final Icon TAG_SET_ICON; /** Reference to the <code>Tag not owned but used</code> icon. */ private static final Icon TAG_NOT_OWNED_ICON; /** Reference to the <code>Tag set owned but used</code> icon. */ private static final Icon TAG_SET_NOT_OWNED_ICON; /** Reference to the <code>Tag</code> icon. */ private static final Icon PERSONAL_ICON; /** Reference to the <code>Image</code> icon. */ private static final Icon IMAGE_DIRECTORY_ICON; /** Reference to the <code>Image</code> icon. */ private static final Icon IMAGE_DIRECTORY_UNREGISTERED_ICON; /** Reference to the <code>Directory</code> icon. */ private static final Icon DIRECTORY_ICON; /** Reference to the <code>Directory</code> icon. */ private static final Icon DIRECTORY_REGISTERED_ICON; /** Reference to the <code>Owner</code> icon. */ private static final Icon OWNER_ICON; /** Reference to the <code>Owner</code> icon. */ private static final Icon OWNER_NOT_ACTIVE_ICON; /** Reference to the <code>Root</code> icon. */ private static final Icon ROOT_ICON; /** Reference to the <code>Owner</code> to refresh icon. */ private static final Icon OWNER_TO_REFRESH_ICON; /** Reference to the <code>Text File</code> icon. */ private static final Icon FILE_TEXT_ICON; /** Reference to the <code>PDF File</code> icon. */ private static final Icon FILE_PDF_ICON; /** Reference to the <code>HTML File</code> icon. */ private static final Icon FILE_HTML_ICON; /** Reference to the <code>Power Point File</code> icon. */ private static final Icon FILE_PPT_ICON; /** Reference to the <code>Word File</code> icon. */ private static final Icon FILE_WORD_ICON; /** Reference to the <code>Excel File</code> icon. */ private static final Icon FILE_EXCEL_ICON; /** Reference to the <code>XML File</code> icon. */ private static final Icon FILE_XML_ICON; /** Reference to the <code>Registered File</code> icon. */ private static final Icon FILE_REGISTERED_ICON; /** Reference to the <code>Movie</code> icon. */ private static final Icon MOVIE_ICON; /** Reference to the <code>Movie folder</code> icon. */ private static final Icon MOVIE_FOLDER_ICON; /** Reference to the <code>Date</code> icon. */ private static final Icon DATE_ICON; /** Reference to the <code>Group</code> icon. */ private static final Icon OWNER_GROUP_ICON; /** Reference to the <code>Group Private</code> icon. */ private static final Icon GROUP_PRIVATE_ICON; /** Reference to the <code>Group RWR---</code> icon. */ private static final Icon GROUP_READ_ONLY_ICON; /** Reference to the <code>Group RWRA--</code> icon. */ private static final Icon GROUP_READ_LINK_ICON; /** Reference to the <code>Group RWRW--</code> icon. */ private static final Icon GROUP_READ_WRITE_ICON; /** Reference to the <code>Group</code> icon. */ private static final Icon GROUP_PUBLIC_READ_ICON; /** Reference to the <code>Group</code> icon. */ private static final Icon GROUP_PUBLIC_READ_WRITE_ICON; static { IconManager icons = IconManager.getInstance(); GROUP_PRIVATE_ICON = icons.getIcon(IconManager.PRIVATE_GROUP); GROUP_READ_ONLY_ICON = icons.getIcon(IconManager.READ_GROUP); GROUP_READ_LINK_ICON = icons.getIcon(IconManager.READ_LINK_GROUP); GROUP_READ_WRITE_ICON = icons.getIcon(IconManager.READ_WRITE_GROUP); GROUP_PUBLIC_READ_ICON = icons.getIcon(IconManager.PUBLIC_GROUP); GROUP_PUBLIC_READ_WRITE_ICON = icons.getIcon( IconManager.PUBLIC_GROUP); OWNER_GROUP_ICON = icons.getIcon(IconManager.OWNER_GROUP); IMAGE_ICON = icons.getIcon(IconManager.IMAGE); IMAGE_ANNOTATED_ICON = icons.getIcon(IconManager.IMAGE_ANNOTATED); IMAGE_NOT_OWNED_ICON = icons.getIcon(IconManager.IMAGE_NOT_OWNED); IMAGE_ANNOTATED_NOT_OWNED_ICON = icons.getIcon( IconManager.IMAGE_ANNOTATED_NOT_OWNED); IMAGE_UNREGISTERED_ICON = icons.getIcon(IconManager.IMAGE_UNREGISTERED); DATASET_NOT_OWNED_ICON = icons.getIcon(IconManager.DATASET_NOT_OWNED); PROJECT_NOT_OWNED_ICON = icons.getIcon(IconManager.PROJECT_NOT_OWNED); SCREEN_NOT_OWNED_ICON = icons.getIcon(IconManager.SCREEN_NOT_OWNED); PLATE_NOT_OWNED_ICON = icons.getIcon(IconManager.PLATE_NOT_OWNED); DATASET_ICON = icons.getIcon(IconManager.DATASET); PROJECT_ICON = icons.getIcon(IconManager.PROJECT); SCREEN_ICON = icons.getIcon(IconManager.SCREEN); PLATE_ICON = icons.getIcon(IconManager.PLATE); PROJECT_ANNOTATED_ICON = icons.getIcon(IconManager.PROJECT_ANNOTATED); PROJECT_TO_REFRESH_ICON = icons.getIcon(IconManager.PROJECT_TO_REFRESH); PROJECT_ANNOTATED_NOT_OWNED_ICON = icons.getIcon( IconManager.PROJECT_ANNOTATED_NOT_OWNED); PROJECT_TO_REFRESH_NOT_OWNED_ICON = icons.getIcon( IconManager.PROJECT_TO_REFRESH_NOT_OWNED); DATASET_ANNOTATED_ICON = icons.getIcon(IconManager.DATASET_ANNOTATED); DATASET_TO_REFRESH_ICON = icons.getIcon(IconManager.DATASET_TO_REFRESH); DATASET_ANNOTATED_NOT_OWNED_ICON = icons.getIcon( IconManager.DATASET_ANNOTATED_NOT_OWNED); DATASET_TO_REFRESH_NOT_OWNED_ICON = icons.getIcon( IconManager.DATASET_TO_REFRESH_NOT_OWNED); DATASET_ANNOTATED_TO_REFRESH_ICON = icons.getIcon(IconManager.DATASET_ANNOTATED_TO_REFRESH); PROJECT_ANNOTATED_TO_REFRESH_ICON = icons.getIcon(IconManager.PROJECT_ANNOTATED_TO_REFRESH); DATASET_ANNOTATED_TO_REFRESH_NOT_OWNED_ICON = icons.getIcon(IconManager.DATASET_ANNOTATED_TO_REFRESH_NOT_OWNED); PROJECT_ANNOTATED_TO_REFRESH_NOT_OWNED_ICON = icons.getIcon(IconManager.PROJECT_ANNOTATED_TO_REFRESH_NOT_OWNED); TAG_ICON = icons.getIcon(IconManager.TAG); TAG_SET_ICON = icons.getIcon(IconManager.TAG_SET); TAG_NOT_OWNED_ICON = icons.getIcon(IconManager.TAG_NOT_OWNED); SCREEN_ANNOTATED_ICON = icons.getIcon(IconManager.SCREEN_ANNOTATED); SCREEN_TO_REFRESH_ICON = icons.getIcon(IconManager.SCREEN_TO_REFRESH); SCREEN_ANNOTATED_TO_REFRESH_ICON = icons.getIcon(IconManager.SCREEN_ANNOTATED_TO_REFRESH); SCREEN_ANNOTATED_NOT_OWNED_ICON = icons.getIcon( IconManager.SCREEN_ANNOTATED_NOT_OWNED); SCREEN_TO_REFRESH_NOT_OWNED_ICON = icons.getIcon( IconManager.SCREEN_TO_REFRESH_NOT_OWNED); SCREEN_ANNOTATED_TO_REFRESH_NOT_OWNED_ICON = icons.getIcon(IconManager.SCREEN_ANNOTATED_TO_REFRESH_NOT_OWNED); PLATE_ANNOTATED_ICON = icons.getIcon(IconManager.PLATE_ANNOTATED); PLATE_ACQUISITION_ICON = icons.getIcon(IconManager.PLATE_ACQUISITION); PLATE_ANNOTATED_NOT_OWNED_ICON = icons.getIcon( IconManager.PLATE_ANNOTATED_NOT_OWNED); PLATE_ACQUISITION_ANNOTATED_ICON = icons.getIcon( IconManager.PLATE_ACQUISITION_ANNOTATED); TAG_SET_NOT_OWNED_ICON = icons.getIcon(IconManager.TAG_SET_NOT_OWNED); PERSONAL_ICON = icons.getIcon(IconManager.PERSONAL); IMAGE_DIRECTORY_ICON = icons.getIcon(IconManager.IMAGE_DIRECTORY); IMAGE_DIRECTORY_UNREGISTERED_ICON = icons.getIcon(IconManager.IMAGE_DIRECTORY_UNREGISTERED); DIRECTORY_ICON = icons.getIcon(IconManager.DIRECTORY); DIRECTORY_REGISTERED_ICON = icons.getIcon(IconManager.DIRECTORY_REGISTERED); OWNER_ICON = icons.getIcon(IconManager.OWNER); OWNER_NOT_ACTIVE_ICON = icons.getIcon(IconManager.OWNER_NOT_ACTIVE); ROOT_ICON = icons.getIcon(IconManager.ROOT); OWNER_TO_REFRESH_ICON = icons.getIcon(IconManager.REFRESH); //icons.getIcon(IconManager.OWNER_TO_REFRESH); FILE_TEXT_ICON = icons.getIcon(IconManager.FILE_TEXT); FILE_PDF_ICON = icons.getIcon(IconManager.FILE_PDF); FILE_HTML_ICON = icons.getIcon(IconManager.FILE_HTML); FILE_PPT_ICON = icons.getIcon(IconManager.FILE_PPT); FILE_WORD_ICON = icons.getIcon(IconManager.FILE_WORD); FILE_EXCEL_ICON = icons.getIcon(IconManager.FILE_EXCEL); FILE_XML_ICON = icons.getIcon(IconManager.FILE_XML); FILE_REGISTERED_ICON = icons.getIcon(IconManager.FILE_REGISTERED); MOVIE_ICON = icons.getIcon(IconManager.MOVIE); MOVIE_FOLDER_ICON = icons.getIcon(IconManager.MOVIE_FOLDER); DATE_ICON = icons.getIcon(IconManager.DATE); } /** The dimension of the busy label. */ private static final Dimension SIZE = new Dimension(16, 16); /** Flag to indicate if the number of children is visible. */ private boolean numberChildrenVisible; /** Flag indicating if the node to render is the target node.*/ private boolean isTargetNode; /** Flag indicating if the node to render is the target node.*/ private boolean droppedAllowed; /** The color used when dragging.*/ private Color draggedColor; /** Indicates if the node is selected or not.*/ private boolean selected; /** The location of the text.*/ private int xText; /** The id of the user currently logged in.*/ private long userId; /** The component of reference.*/ private JScrollPane ref; /** The node to display.*/ private TreeImageDisplay node; /** * Sets the icon and the text corresponding to the user's object. * * @param node The node to handle. */ private void setIcon(TreeImageDisplay node) { Object usrObject = node.getUserObject(); boolean owner = false; if (usrObject instanceof DataObject) { DataObject data = (DataObject) usrObject; if (data.getId() < 0) owner = true; else owner = node.isOwner(userId); } owner = true; Icon icon = FILE_TEXT_ICON; if (usrObject instanceof ProjectData) { if (node.isToRefresh()) { if (owner) { if (node.isAnnotated()) icon = PROJECT_ANNOTATED_TO_REFRESH_ICON; else icon = PROJECT_TO_REFRESH_ICON; } else { if (node.isAnnotated()) icon = PROJECT_ANNOTATED_TO_REFRESH_NOT_OWNED_ICON; else icon = PROJECT_TO_REFRESH_NOT_OWNED_ICON; } } else { if (owner) { if (node.isAnnotated()) icon = PROJECT_ANNOTATED_ICON; else icon = PROJECT_ICON; } else { if (node.isAnnotated()) icon = PROJECT_ANNOTATED_NOT_OWNED_ICON; else icon = PROJECT_NOT_OWNED_ICON; } } } else if (usrObject instanceof DatasetData) { if (node.isToRefresh()) { if (owner) { if (node.isAnnotated()) icon = DATASET_ANNOTATED_TO_REFRESH_ICON; else icon = DATASET_TO_REFRESH_ICON; } else { if (node.isAnnotated()) icon = DATASET_ANNOTATED_TO_REFRESH_NOT_OWNED_ICON; else icon = DATASET_TO_REFRESH_NOT_OWNED_ICON; } } else { if (owner) { if (node.isAnnotated()) icon = DATASET_ANNOTATED_ICON; else icon = DATASET_ICON; } else { if (node.isAnnotated()) icon = DATASET_ANNOTATED_NOT_OWNED_ICON; else icon = DATASET_NOT_OWNED_ICON; } } } else if (usrObject instanceof ImageData) { if (owner) { if (node.isAnnotated()) icon = IMAGE_ANNOTATED_ICON; else { ImageData o = (ImageData) usrObject; if (o.getId() < 0) icon = IMAGE_UNREGISTERED_ICON; else icon = IMAGE_ICON; } } else { if (node.isAnnotated()) icon = IMAGE_ANNOTATED_NOT_OWNED_ICON; else { ImageData o = (ImageData) usrObject; if (o.getId() < 0) icon = IMAGE_UNREGISTERED_ICON; else icon = IMAGE_NOT_OWNED_ICON; } } } else if (usrObject instanceof TagAnnotationData) { TagAnnotationData tag = (TagAnnotationData) usrObject; String ns = tag.getNameSpace(); if (TagAnnotationData.INSIGHT_TAGSET_NS.equals(ns)) { if (owner) icon = TAG_SET_ICON; else icon = TAG_SET_NOT_OWNED_ICON; } else { icon = TAG_ICON; TreeImageDisplay n = BrowserFactory.getDataOwner(node); if (n != null) { ExperimenterData exp = (ExperimenterData) n.getUserObject(); if (!EditorUtil.isUserOwner(tag, exp.getId())) icon = TAG_NOT_OWNED_ICON; } } } else if (usrObject instanceof ScreenData) { if (node.isToRefresh()) { if (owner) { if (node.isAnnotated()) icon = SCREEN_ANNOTATED_TO_REFRESH_ICON; else icon = SCREEN_TO_REFRESH_ICON;; } else { if (node.isAnnotated()) icon = SCREEN_ANNOTATED_TO_REFRESH_NOT_OWNED_ICON; else icon = SCREEN_TO_REFRESH_NOT_OWNED_ICON;; } } else { if (owner) { if (node.isAnnotated()) icon = SCREEN_ANNOTATED_ICON; else icon = SCREEN_ICON; } else { if (node.isAnnotated()) icon = SCREEN_ANNOTATED_NOT_OWNED_ICON; else icon = SCREEN_NOT_OWNED_ICON; } } } else if (usrObject instanceof PlateData) { if (owner) { if (node.isAnnotated()) icon = PLATE_ANNOTATED_ICON; else icon = PLATE_ICON; } else { if (node.isAnnotated()) icon = PLATE_ANNOTATED_NOT_OWNED_ICON; else icon = PLATE_NOT_OWNED_ICON; } } else if (usrObject instanceof PlateAcquisitionData) { if (node.isAnnotated()) icon = PLATE_ACQUISITION_ANNOTATED_ICON; else icon = PLATE_ACQUISITION_ICON; } else if (usrObject instanceof GroupData) { GroupData g = (GroupData) usrObject; switch (g.getPermissions().getPermissionsLevel()) { case GroupData.PERMISSIONS_PRIVATE: icon = GROUP_PRIVATE_ICON; break; case GroupData.PERMISSIONS_GROUP_READ: icon = GROUP_READ_ONLY_ICON; break; case GroupData.PERMISSIONS_GROUP_READ_LINK: icon = GROUP_READ_LINK_ICON; break; case GroupData.PERMISSIONS_GROUP_READ_WRITE: icon = GROUP_READ_WRITE_ICON; break; case GroupData.PERMISSIONS_PUBLIC_READ: icon = GROUP_PUBLIC_READ_ICON; break; case GroupData.PERMISSIONS_PUBLIC_READ_WRITE: icon = GROUP_PUBLIC_READ_WRITE_ICON; break; default: icon = OWNER_GROUP_ICON; } } else if (usrObject instanceof FileAnnotationData) { FileAnnotationData data = (FileAnnotationData) usrObject; String format = data.getFileFormat(); if (FileAnnotationData.PDF.equals(format)) icon = FILE_PDF_ICON; else if (FileAnnotationData.TEXT.equals(format) || FileAnnotationData.CSV.equals(format)) icon = FILE_TEXT_ICON; else if (FileAnnotationData.HTML.equals(format) || FileAnnotationData.HTM.equals(format)) icon = FILE_HTML_ICON; else if (FileAnnotationData.MS_POWER_POINT.equals(format) || FileAnnotationData.MS_POWER_POINT_SHOW.equals(format) || FileAnnotationData.MS_POWER_POINT_X.equals(format)) icon = FILE_PPT_ICON; else if (FileAnnotationData.MS_WORD.equals(format) || FileAnnotationData.MS_WORD_X.equals(format)) icon = FILE_WORD_ICON; else if (FileAnnotationData.MS_EXCEL.equals(format)) icon =FILE_EXCEL_ICON; else if (FileAnnotationData.XML.equals(format) || FileAnnotationData.RTF.equals(format)) { icon = FILE_XML_ICON; } else if (data.isMovieFile()) { icon = MOVIE_ICON; } else { icon = FILE_TEXT_ICON; } } else if (usrObject instanceof FileData) { FileData f = (FileData) usrObject; if (f.isDirectory()) { if (f.getId() > 0) icon = DIRECTORY_REGISTERED_ICON; else icon = DIRECTORY_ICON; } else { if (f.getId() > 0) icon = FILE_REGISTERED_ICON; else icon = FILE_TEXT_ICON; } } else if (node instanceof SmartFolder) { if (GroupData.class.equals(((SmartFolder) node).getType())) { icon = PERSONAL_ICON; } } else if (node instanceof TreeImageTimeSet) icon = DATE_ICON; else if (node instanceof TreeFileSet) { TreeFileSet n = (TreeFileSet) node; switch (n.getType()) { case TreeFileSet.MOVIE: icon = MOVIE_FOLDER_ICON; break; default: icon = ROOT_ICON; } } else if (usrObject instanceof String) icon = ROOT_ICON; else if (usrObject instanceof ExperimenterData) { ExperimenterData exp = (ExperimenterData) usrObject; if (node.isToRefresh()) icon = OWNER_TO_REFRESH_ICON; else { if (exp.isActive()) icon = OWNER_ICON; else icon = OWNER_NOT_ACTIVE_ICON; } } setIcon(icon); } /** * Sets the color of the selected cell depending on the darkness * of the specified color. * * @param c The color of reference. */ private void setTextColor(Color c) { if (c == null) return; // check if the passed color is dark if yes, modify the text color. if (UIUtilities.isDarkColor(c)) setForeground(UIUtilities.DEFAULT_TEXT); } /** * Creates a new instance. * * @param userId The id of the user currently logged in. * @param b Passed <code>true</code> to show the number of children, * <code>false</code> otherwise. */ public TreeCellRenderer(long userId, boolean b) { this.userId = userId; numberChildrenVisible = b; selected = false; draggedColor = new Color(backgroundSelectionColor.getRed(), backgroundSelectionColor.getGreen(), backgroundSelectionColor.getBlue(), 100); } /** * Creates a new instance. * * @param userId The id of the user currently logged in. */ public TreeCellRenderer(long userId) { this(userId, true); } /** * Resets the id of the user currently logged in. * * @param userId The id of the user currently logged in. */ public void reset(long userId) { this.userId = userId; } /** * Overridden to set the icon and the text. * @see DefaultTreeCellRenderer#getTreeCellRendererComponent(JTree, Object, * boolean, boolean, boolean, int, boolean) */ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); isTargetNode = false; droppedAllowed = true; selected = sel; if (tree instanceof DnDTree) { DnDTree dndTree = (DnDTree) tree; isTargetNode = (value == dndTree.getDropTargetNode()); if (dndTree.getRowDropLocation() == row) { droppedAllowed = false; } } setIcon(FILE_TEXT_ICON); if (!(value instanceof TreeImageDisplay)) return this; node = (TreeImageDisplay) value; int w = 0; FontMetrics fm = getFontMetrics(getFont()); Object ho = node.getUserObject(); if (node.getLevel() == 0) { if (ho instanceof ExperimenterData) setIcon(OWNER_ICON); else setIcon(ROOT_ICON); if (getIcon() != null) w += getIcon().getIconWidth(); w += getIconTextGap(); w += fm.stringWidth(getText()); setPreferredSize(new Dimension(w, fm.getHeight())); Color c = node.getHighLight(); if (c == null) c = tree.getForeground(); setForeground(c); if (!sel) setBorderSelectionColor(getBackground()); else setTextColor(getBackgroundSelectionColor()); return this; } setIcon(node); setToolTipText(node.getToolTip()); Color c = node.getHighLight(); if (c == null) c = tree.getForeground(); setForeground(c); if (!sel) setBorderSelectionColor(getBackground()); else setTextColor(getBackgroundSelectionColor()); w = getPreferredWidth(); setPreferredSize(new Dimension(w, fm.getHeight()+4)); setEnabled(node.isSelectable()); return this; } /** * Determines the preferred width of the component. * * @return See above. */ private int getPreferredWidth() { String text = node.getNodeName(); if (numberChildrenVisible) text = node.getNodeText(); FontMetrics fm = getFontMetrics(getFont()); int w = getIconGap(); xText = w; if (node instanceof TreeFileSet) w += fm.stringWidth(text)+40; else w += fm.stringWidth(text); return w; } /** * Returns the gap between icon and text. * * @return See above */ private int getIconGap() { int w = 0; if (getIcon() != null) w += getIcon().getIconWidth(); else w += SIZE.width; w += getIconTextGap(); return w; } @Override public String getText() { if (ref != null && !super.getText().equals(Browser.LOADING_MSG) && !super.getText().equals(Browser.EMPTY_MSG)) { // trim the text so that it fits into the given space JViewport vp = ref.getViewport(); int w = vp.getSize().width; FontMetrics fm = getFontMetrics(getFont()); String text = node.getNodeName(); if (numberChildrenVisible) text = node.getNodeText(); int v = getPreferredSize().width; Rectangle r = getBounds(); w = w-r.x; if (v > w && node.isPartialName()) { //truncate the text int targetWidth = (w - getIconGap() - 5); String value = text; int l = text.length(); int valueWidth = fm.stringWidth(value); while (valueWidth > targetWidth) { if (l == 0) return ""; value = UIUtilities.formatPartialName(text, --l); valueWidth = fm.stringWidth(value); } return value; } return text; } return super.getText(); } /** * Overridden to highlight the destination of the target. * @see #paintComponent(Graphics) */ public void paintComponent(Graphics g) { if (ref == null) { ref = (JScrollPane) UIUtilities.findParent(this, JScrollPane.class); } if (isTargetNode) { if (!droppedAllowed) { if (selected) g.setColor(backgroundSelectionColor); else g.setColor(backgroundNonSelectionColor); } else g.setColor(draggedColor); g.fillRect(xText, 0, getSize().width, getSize().height); } selected = false; isTargetNode = false; droppedAllowed = false; super.paintComponent(g); } }