/* * Freeplane - mind map editor * Copyright (C) 2009 Tamas Eppel * * This file author is Tamas Eppel * * 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, see <http://www.gnu.org/licenses/>. */ package org.freeplane.features.icon.factory; import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.freeplane.core.resources.ResourceController; import org.freeplane.core.util.LogUtils; import org.freeplane.core.util.TextUtils; import org.freeplane.features.icon.IconGroup; import org.freeplane.features.icon.IconNotFound; import org.freeplane.features.icon.IconStore; import org.freeplane.features.icon.MindIcon; import org.freeplane.features.icon.UIIcon; import org.freeplane.features.icon.UserIcon; /** * * Factory for IconStore objects. * * @author Tamas Eppel * */ public class IconStoreFactory { private static final String SEPARATOR = ";"; private static final ResourceController RESOURCE_CONTROLLER = ResourceController.getResourceController(); private static final String GROUP_NAMES_KEY = "icons.groups"; private static final String GROUP_KEY = "icons.group.%s"; private static final String GROUP_ICON_KEY = "IconGroupPopupAction.%s.icon"; private static final String GROUP_DESC_KEY = "IconGroupPopupAction.%s.text"; private static IconStore groups; /** * * Creates an IconStore from the property file. If one was already * constructed it will be returned without creating a new one. * * @return */ public static IconStore create() { if (groups != null) { return groups; } groups = new IconStore(); IconStoreFactory.setIconGroups(groups); return groups; } private static void setIconGroups(final IconStore iconStore) { final String[] groupNames = RESOURCE_CONTROLLER.getProperty(GROUP_NAMES_KEY).split(SEPARATOR); for (final String groupName : groupNames) { final String description = TextUtils.getText(String.format(GROUP_DESC_KEY, groupName)); List<MindIcon> icons; UIIcon groupIcon = null; if ("user".equals(groupName)) { icons = IconStoreFactory.getUserIcons(); groupIcon = MindIconFactory.create("user_icon"); } else { final String groupIconName = RESOURCE_CONTROLLER.getProperty(String.format(GROUP_ICON_KEY, groupName)); final Map<String, MindIcon> iconMap = IconStoreFactory.getIcons(groupName); groupIcon = iconMap.get(groupIconName); icons = new ArrayList<MindIcon>(iconMap.values()); } if (groupIcon == null) { groupIcon = icons.size() > 0 ? icons.get(0) : IconNotFound.instance(); } iconStore.addGroup(new IconGroup(groupName, groupIcon, description, icons)); } } private static Map<String, MindIcon> getIcons(final String groupName) { final String[] iconNames = RESOURCE_CONTROLLER.getProperty(String.format(GROUP_KEY, groupName)) .split(SEPARATOR); final Map<String, MindIcon> icons = new LinkedHashMap<String, MindIcon>(iconNames.length); for (final String iconName : iconNames) { final MindIcon icon = MindIconFactory.create(iconName); icons.put(iconName, icon); } return icons; } private static List<MindIcon> getUserIcons() { final ResourceController resourceController = ResourceController.getResourceController(); if (resourceController.isApplet()) { return Collections.emptyList(); } final File iconDir = new File(resourceController.getFreeplaneUserDirectory(), "icons"); if (!iconDir.exists()) { LogUtils.info("creating user icons directory " + iconDir); iconDir.mkdirs(); return Collections.emptyList(); } return IconStoreFactory.getUserIcons(iconDir, ""); } private static List<MindIcon> getUserIcons(final File iconDir, final String dir) { final String[] userIconArray = iconDir.list(new FilenameFilter() { public boolean accept(final File dir, final String name) { final int nameLength = name.length(); return nameLength > 4 && name.substring(nameLength - 4).equalsIgnoreCase(".png") || new File(dir, name).isDirectory(); } }); if (userIconArray == null) { return Collections.emptyList(); } final List<MindIcon> icons = new ArrayList<MindIcon>(userIconArray.length); for (final String fileName : userIconArray) { final File childDir = new File(iconDir, fileName); final String fullName = dir + fileName; if (childDir.isDirectory()) { final List<MindIcon> childUserIcons = IconStoreFactory.getUserIcons(childDir, fullName + '/'); icons.addAll(childUserIcons); } } for (final String fileName : userIconArray) { final File childDir = new File(iconDir, fileName); final String fullName = dir + fileName; if (childDir.isDirectory()) { continue; } final String iconName = fullName.substring(0, fullName.length() - 4); final String iconDescription = fileName.substring(0, fileName.length() - 4); if (iconName.equals("")) { continue; } final UserIcon icon = new UserIcon(iconName, fullName, iconDescription); icons.add(icon); } return icons; } }