blob: 78306d175fcd4c03ee1e1f8f70520f9a0ef81c45 [file] [log] [blame]
/*******************************************************************************
* (c) Copyright 2015 l33t labs LLC and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* l33t labs LLC and others - initial contribution
*******************************************************************************/
package org.eclipse.images.renderer;
import java.io.File;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
/**
* <p>
* Utility to find and organize icons for rendering.
* </p>
*
* @author tmccrary@l33tlabs.com
*
*/
public class IconGatherer {
private IconGatherer() { }
/**
* <p>
* Searches the root resources directory for svg icons and adds them to a
* collection for later rasterization.
* </p>
*
* @param icons
* @param extension
* @param rootDir
* @param iconDir
* @param outputBase
* @param generateDisabledDirs
*/
public static void gatherIcons(List<IconEntry> icons, String extension, File rootDir, File iconDir, File outputBase,
boolean generateDisabledDirs, FolderState wizardBannerState) {
List<File> listFiles = Arrays.asList(iconDir.listFiles());
String filter = System.getProperty("eclipse.svg.filter");
String targetIcon = System.getProperty("eclipse.svg.targetIcon");
for (File child : listFiles) {
if(filter != null && !child.getAbsolutePath().contains(filter)) {
continue;
}
if (child.isDirectory()) {
if (child.getName().startsWith("d") && !("dgm".equals(child.getName()))) {
continue;
}
if (wizardBannerState == FolderState.exclude && "wizban".equals(child.getName())) {
continue;
}
gatherIcons(icons, extension, rootDir, child, outputBase, generateDisabledDirs, wizardBannerState);
continue;
}
if (targetIcon != null && !child.getName().contains(targetIcon)) {
continue;
}
if (!child.getName().endsWith(extension)) {
continue;
}
if (!child.getName().endsWith(extension) || child.getName().contains("@1.5x")
|| child.getName().contains("@2x")) {
continue;
}
// Compute a relative path for the output dir
URI rootUri = rootDir.toURI();
URI iconUri = iconDir.toURI();
String relativePath = rootUri.relativize(iconUri).getPath();
File outputDir = new File(outputBase, relativePath);
File disabledOutputDir = null;
File parentFile = child.getParentFile();
if (wizardBannerState == FolderState.only && !"wizban".equals(parentFile.getName())) {
continue;
}
/*
* Determine if/where to put a disabled version of the icon Eclipse
* traditionally uses a prefix of d for disabled, e for enabled in
* the folder name
*/
if (generateDisabledDirs && parentFile != null) {
String parentDirName = parentFile.getName();
if (parentDirName.startsWith("e")) {
StringBuilder builder = new StringBuilder();
builder.append("d");
builder.append(parentDirName.substring(1, parentDirName.length()));
// Disabled variant folder name
String disabledVariant = builder.toString();
// The parent's parent, to create the disabled directory in
File setParent = parentFile.getParentFile();
// The source directory's disabled folder
File disabledSource = new File(setParent, disabledVariant);
// Compute a relative path, so we can create the output
// folder
String path = rootUri.relativize(disabledSource.toURI()).getPath();
// Create the output folder, so a disabled icon is generated
disabledOutputDir = new File(outputBase, path);
}
}
IconEntry icon = createIcon(rootDir, child, outputDir, disabledOutputDir);
icons.add(icon);
}
}
/**
* <p>
* Creates an IconEntry, which contains information about rendering an icon
* such as the source file, where to render, what alternative types of
* output to generate, etc.
* </p>
*
* @param the
* root directory of the icon (org.eclipse.ui, etc)
* @param input
* the source of the icon file (SVG document)
* @param outputPath
* the path of the rasterized version to generate
* @param disabledPath
* the path of the disabled (desaturated) icon, if one is
* required
*
* @return an IconEntry describing the rendering operation
*/
public static IconEntry createIcon(File iconRoot, File input, File outputPath, File disabledPath) {
String name = input.getName();
String[] split = name.split("\\.(?=[^\\.]+$)");
return new IconEntry(split[0], iconRoot, input, outputPath, disabledPath, new int[0]);
}
}