package org.freeplane.view.swing.features.progress.mindmapmode;
import java.util.List;
import org.freeplane.features.icon.IconController;
import org.freeplane.features.icon.MindIcon;
import org.freeplane.features.icon.mindmapmode.MIconController;
import org.freeplane.features.map.NodeModel;
/**
* @author Stefan Ott
*
* This class holds the static method to update the progress icons
*/
public class ProgressIcons {
private static final long serialVersionUID = 1L;
public static final String EXTENDED_PROGRESS_ICON_IDENTIFIER = ".*[Pp]rogress_(tenth|quarter)_[0-9]{2}\\.[a-zA-Z0-9]*";
private final static String[] iconNames = new String[] { "0%", "25%", "50%", "75%", "100%" };
private final static MindIcon[] progressIcons = new MindIcon[] { new MindIcon(iconNames[0], iconNames[0] + ".png"),
new MindIcon(iconNames[1], iconNames[1] + ".png"), new MindIcon(iconNames[2], iconNames[2] + ".png"),
new MindIcon(iconNames[3], iconNames[3] + ".png"), new MindIcon(iconNames[4], iconNames[4] + ".png") };
private final static MindIcon OKIcon = new MindIcon("button_ok", "button_ok.png");
/**
* This method increases/ decreases the progress icons.
* If none is present then the 0% icon is set.
* At 100% the OK-icon is additionally added
*
* @param node : the node to update the icons
* @param up : true if the progress is increased (0% -> 25% -> 50%...)
* if false the progress is decreased
*/
public static void updateProgressIcons(final NodeModel node, final boolean up) {
final ProgressUtilities progUtil = new ProgressUtilities();
final MIconController iconController = (MIconController) IconController.getController();
String activeIcon = null;
final List<MindIcon> icons = node.getIcons();
//get active progress icon and remove it
if (progUtil.hasProgressIcons(node)) {
for (int i = 0; i < icons.size(); i++) {
for (int j = 0; j < iconNames.length; j++) {
if (icons.get(i).getName().equals(iconNames[j])) {
activeIcon = iconNames[j];
break;
}
}
}
ProgressIcons.removeProgressIcons(node);
}
// set initial progress icon always 0%
if (activeIcon == null) {
ProgressIcons.removeProgressIcons(node);
iconController.addIcon(node, progressIcons[0], 0);
}
else {
final int iActiveIcon = Integer.parseInt(activeIcon.substring(0, activeIcon.length() - 1));
//progress is increased
if (up) {
switch (iActiveIcon) {
case 0:
iconController.addIcon(node, progressIcons[1], 0);
break;
case 25:
iconController.addIcon(node, progressIcons[2], 0);
break;
case 50:
iconController.addIcon(node, progressIcons[3], 0);
break;
case 75:
iconController.addIcon(node, progressIcons[4], 0);
if (!progUtil.hasOKIcon(node)) {
iconController.addIcon(node, OKIcon, 0);
}
break;
//at 100% draw an extra OK-icon
case 100:
iconController.addIcon(node, progressIcons[4], 0);
iconController.addIcon(node, OKIcon, 0);
break;
default:
break;
}
}
//progress is decreased
else {
switch (iActiveIcon) {
case 25:
iconController.addIcon(node, progressIcons[0], 0);
break;
case 50:
iconController.addIcon(node, progressIcons[1], 0);
break;
case 75:
iconController.addIcon(node, progressIcons[2], 0);
break;
case 100:
iconController.addIcon(node, progressIcons[3], 0);
break;
case 0:
default:
break;
}
}
}
}
/**
* This method updates the progress icons dependent of the added external object (svg file)
* The file has a distinct naming scheme from which the progress and the icons to be painted
* are derived.
*
* @param node : the node to update the icons
* @param sFile : the name of the added file.
*/
public static void updateExtendedProgressIcons(final NodeModel node, final String sFile) {
if (sFile.matches(EXTENDED_PROGRESS_ICON_IDENTIFIER)) {
final MIconController iconController = (MIconController) IconController.getController();
ProgressIcons.removeProgressIcons(node);
//add the right progress icon
if (sFile.matches(".*_quarter_.*")) {
final int fileNum = Integer.parseInt(sFile.substring(sFile.lastIndexOf("_") + 1,
sFile.lastIndexOf("_") + 3));
switch (fileNum) {
case 0:
iconController.addIcon(node, progressIcons[0], 0);
break;
case 1:
iconController.addIcon(node, progressIcons[1], 0);
break;
case 2:
iconController.addIcon(node, progressIcons[2], 0);
break;
case 3:
iconController.addIcon(node, progressIcons[3], 0);
break;
case 4:
iconController.addIcon(node, progressIcons[4], 0);
iconController.addIcon(node, OKIcon, 0);
break;
default:
iconController.addIcon(node, progressIcons[0], 0);
break;
}
}
else if (sFile.matches(".*_tenth_.*")) {
final int fileNum = Integer.parseInt(sFile.substring(sFile.lastIndexOf("_") + 1,
sFile.lastIndexOf("_") + 3));
switch (fileNum) {
case 0:
case 1:
iconController.addIcon(node, progressIcons[0], 0);
break;
case 2:
case 3:
iconController.addIcon(node, progressIcons[1], 0);
break;
case 4:
case 5:
case 6:
iconController.addIcon(node, progressIcons[2], 0);
break;
case 7:
case 8:
case 9:
iconController.addIcon(node, progressIcons[3], 0);
break;
case 10:
iconController.addIcon(node, progressIcons[4], 0);
iconController.addIcon(node, OKIcon, 0);
break;
default:
iconController.addIcon(node, progressIcons[0], 0);
break;
}
}
}
}
/**
* Removes the progress icons (0%, 25%, 50%, 75%, 100%) from the node
*
* @param node : the node from which the progress icons are removed
*/
public static void removeProgressIcons(final NodeModel node) {
final ProgressUtilities progUtil = new ProgressUtilities();
if (progUtil.hasProgressIcons(node) || progUtil.hasOKIcon(node)) {
final MIconController iconController = (MIconController) IconController.getController();
final String[] progressIconNames = new String[] { "0%", "25%", "50%", "75%", "100%", "button_ok" };
final List<MindIcon> icons = node.getIcons();
// remove progress icons
for (int i = 0; i < icons.size(); i++) {
String iconName = icons.get(i).getName();
for (int j = 0; j < progressIconNames.length; j++) {
if (iconName.equals(progressIconNames[j])) {
iconController.removeIcon(node, i);
i--;
break;
}
}
}
}
}
}