/**
* Copyright (C) 2001-2017 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.com
*
* This program is free software: you can redistribute it and/or modify it under the terms of the
* GNU Affero General Public License as published by the Free Software Foundation, either version 3
* 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
* Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License along with this program.
* If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.repository.gui;
import java.awt.Component;
import java.text.DateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.border.Border;
import javax.swing.tree.DefaultTreeCellRenderer;
import com.rapidminer.gui.renderer.RendererService;
import com.rapidminer.gui.tools.SwingTools;
import com.rapidminer.repository.BlobEntry;
import com.rapidminer.repository.DataEntry;
import com.rapidminer.repository.Entry;
import com.rapidminer.repository.Folder;
import com.rapidminer.repository.IOObjectEntry;
import com.rapidminer.repository.ProcessEntry;
import com.rapidminer.repository.Repository;
import com.rapidminer.tools.Tools;
/**
* @author Simon Fischer
*/
public class RepositoryTreeCellRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 1L;
private static final Icon ICON_FOLDER_OPEN = SwingTools.createIcon("16/folder_open.png");
private static final Icon ICON_FOLDER_CLOSED = SwingTools.createIcon("16/folder.png");
private static final Icon ICON_FOLDER_OPEN_LOCKED = SwingTools.createIcon("16/folder_open_lock.png");
private static final Icon ICON_FOLDER_CLOSED_LOCKED = SwingTools.createIcon("16/folder_lock.png");
private static final Icon ICON_PROCESS = SwingTools.createIcon("16/gearwheels.png");
private static final Icon ICON_DATA = SwingTools.createIcon("16/data.png");
private static final Icon ICON_BLOB = SwingTools.createIcon("16/document_empty.png");
private static final Icon ICON_TEXT = SwingTools.createIcon("16/text.png");
private static final Icon ICON_TABLE = SwingTools.createIcon("16/spreadsheet.png");
private static final Icon ICON_IMAGE = SwingTools.createIcon("16/photo_landscape.png");
/** stores the icons for all repository implementations */
private static Map<String, Icon> ICON_REPOSITORY_MAP = new HashMap<>();
// clone because getDateInstance uses an internal pool which can return the same
// instance for multiple threads
private final DateFormat DATE_FORMAT = (DateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT)
.clone();
private static final Border ENTRY_BORDER = BorderFactory.createEmptyBorder(1, 0, 1, 0);
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf,
int row, boolean hasFocus) {
JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
if (value instanceof Entry) {
Entry entry = (Entry) value;
StringBuilder labelText = new StringBuilder();
labelText.append("<html>").append(entry.getName());
StringBuilder stateStringBuilder = new StringBuilder();
boolean hasState = false;
if (entry instanceof Repository) {
String reposState = ((Repository) entry).getState();
if (reposState != null) {
stateStringBuilder.append(reposState);
hasState = true;
}
}
boolean hasOwner = false;
if (entry.getOwner() != null) {
if (hasState) {
appendDash(stateStringBuilder);
}
stateStringBuilder.append(entry.getOwner());
hasOwner = true;
}
if (entry instanceof DataEntry) {
int revision = ((DataEntry) entry).getRevision();
if (hasOwner || hasState) {
appendDash(stateStringBuilder);
}
stateStringBuilder.append("v").append(revision);
long date = ((DataEntry) entry).getDate();
if (date >= 0) {
stateStringBuilder.append(", ").append(DATE_FORMAT.format(new Date(date)));
}
long size = ((DataEntry) entry).getSize();
if (size > 0) {
appendDash(stateStringBuilder);
stateStringBuilder.append(Tools.formatBytes(size));
}
}
if (stateStringBuilder.length() > 0) {
labelText.append(" <small style=\"color:gray\">(").append(stateStringBuilder).append(")</small>");
}
labelText.append("</html>");
label.setText(labelText.toString());
if (entry instanceof Repository) {
Repository repo = (Repository) entry;
if (ICON_REPOSITORY_MAP.get(repo.getIconName()) == null) {
ICON_REPOSITORY_MAP.put(repo.getIconName(), SwingTools.createIcon("16/" + repo.getIconName()));
}
label.setIcon(ICON_REPOSITORY_MAP.get(repo.getIconName()));
} else if (entry.getType().equals(Folder.TYPE_NAME)) {
if (entry.isReadOnly() && !expanded) {
label.setIcon(ICON_FOLDER_CLOSED_LOCKED);
} else if (entry.isReadOnly() && expanded) {
label.setIcon(ICON_FOLDER_OPEN_LOCKED);
} else if (!entry.isReadOnly() && expanded) {
label.setIcon(ICON_FOLDER_OPEN);
} else {
label.setIcon(ICON_FOLDER_CLOSED);
}
} else if (entry.getType().equals(IOObjectEntry.TYPE_NAME)) {
if (entry instanceof IOObjectEntry) {
IOObjectEntry dataEntry = (IOObjectEntry) entry;
label.setIcon(RendererService.getIcon(dataEntry.getObjectClass()));
} else {
label.setIcon(ICON_DATA);
}
} else if (entry.getType().equals(ProcessEntry.TYPE_NAME)) {
label.setIcon(ICON_PROCESS);
} else if (entry.getType().equals(BlobEntry.TYPE_NAME)) {
String mimeType = ((BlobEntry) entry).getMimeType();
if (mimeType != null) {
if (mimeType.startsWith("text/") || "application/pdf".equals(mimeType)
|| "application/rtf".equals(mimeType)) {
label.setIcon(ICON_TEXT);
} else if (mimeType.equals("application/msexcel")) {
label.setIcon(ICON_TABLE);
} else if (mimeType.startsWith("image/")) {
label.setIcon(ICON_IMAGE);
} else {
label.setIcon(ICON_BLOB);
}
} else {
label.setIcon(ICON_BLOB);
}
} else {
label.setIcon(null);
}
}
label.setBorder(ENTRY_BORDER);
return label;
}
/**
* Appends a - to the provided StringBuilder
*
* @param state
* the StringBuilder to add the - to
*/
private void appendDash(StringBuilder state) {
state.append(" – ");
}
}