content: /**
   * Copyright 2020 Alexander Herzog
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package ui.modeleditor;
  
  import java.awt.Color;
  import java.awt.Component;
  import java.awt.Font;
  import java.awt.FontMetrics;
  import java.awt.Graphics;
  import java.awt.GraphicsEnvironment;
  import java.awt.Image;
  import java.awt.Toolkit;
  import java.awt.image.BufferedImage;
  import java.io.IOException;
  import java.io.Serializable;
  import java.net.URL;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  import java.util.function.Consumer;
  
  import javax.imageio.ImageIO;
  import javax.swing.DefaultComboBoxModel;
  import javax.swing.DefaultListCellRenderer;
  import javax.swing.ImageIcon;
  import javax.swing.JLabel;
  import javax.swing.JList;
  import javax.swing.JMenu;
  import javax.swing.JMenuItem;
  import javax.swing.JPopupMenu;
  
  import org.apache.commons.math3.util.FastMath;
  
  /**
   * Diese Klasse hlt Bilder fr die Animation von Modellen vor.
   * Die Bilder knnen dabei direkt in einer passend skalierten Gre ausgeliefert werden.
   * @author Alexander Herzog
   */
  public class AnimationImageSource {
  	/* Famfamfam Icons */
  
  	/** Name fr Animationssymbol "Broklammer" */
  	public static String iconNameAttach="Broklammer";
  	/** Name fr Animationssymbol "Buch" */
  	public static String iconNameBook="Buch";
  	/** Name fr Animationssymbol "Kfer" */
  	public static String iconNameBug="Kfer";
  	/** Name fr Animationssymbol "CD" */
  	public static String iconNameCD="CD";
  	/** Name fr Animationssymbol "Kuchen" */
  	public static String iconNameCake="Kuchen";
  	/** Name fr Animationssymbol "Auto" */
  	public static String iconNameCar="Auto";
  	/** Name fr Animationssymbol "Einkaufswagen" */
  	public static String iconNameCart="Einkaufswagen";
  	/** Name fr Animationssymbol "Uhr" */
  	public static String iconNameClock="Uhr";
  	/** Name fr Animationssymbol "Computer" */
  	public static String iconNameComputer="Computer";
  	/** Name fr Animationssymbol "Datenbank" */
  	public static String iconNameDatabase="Datenbank";
  	/** Name fr Animationssymbol "Diskette" */
  	public static String iconNameDisk="Diskette";
  	/** Name fr Animationssymbol "Brief" */
  	public static String iconNameLetter="Brief";
  	/** Name fr Animationssymbol "Smiley" */
  	public static String iconNameSmiley="Smiley";
  	/** Name fr Animationssymbol "Symbol - Frau" */
  	public static String iconNameSymbolFemale="Symbol - Frau";
  	/** Name fr Animationssymbol "Symbol - Mann" */
  	public static String iconNameSymbolMale="Symbol - Mann";
  	/** Name fr Animationssymbol "Fahne - Blue" */
  	public static String iconNameFlagBlue="Fahne - Blue";
  	/** Name fr Animationssymbol "Fahne - Grn" */
  	public static String iconNameFlagGreen="Fahne - Grn";
  	/** Name fr Animationssymbol "Fahne - Orange" */
  	public static String iconNameFlagOrange="Fahne - Orange";
  	/** Name fr Animationssymbol "Fahne - Pink" */
  	public static String iconNameFlagPink="Fahne - Pink";
  	/** Name fr Animationssymbol "Fahne - Lila" */
  	public static String iconNameFlagPurple="Fahne - Lila";
  	/** Name fr Animationssymbol "Fahne - Rot" */
  	public static String iconNameFlagRed="Fahne - Rot";
  	/** Name fr Animationssymbol "Fahne - Gelb" */
  	public static String iconNameFlagYellow="Fahne - Gelb";
  	/** Name fr Animationssymbol "Herz" */
  	public static String iconNameHeart="Herz";
  	/** Name fr Animationssymbol "Schlssel" */
  	public static String iconNameKey="Schlssel";
  	/** Name fr Animationssymbol "LKW" */
  	public static String iconNameLorry="LKW";
  	/** Name fr Animationssymbol "LKW-links" */
  	public static String iconNameLorryLeft="LKW-links";
  	/** Name fr Animationssymbol "LKW (leer)" */
  	public static String iconNameLorryEmpty="LKW (leer)";
  	/** Name fr Animationssymbol "LKW-links (leer)" */
  	public static String iconNameLorryLeftEmpty="LKW-links (leer)";
  	/** Name fr Animationssymbol "Geld - Dollar" */
  	public static String iconNameMoneyDollar="Geld - Dollar";
  	/** Name fr Animationssymbol "Geld - Euro" */
  	public static String iconNameMoneyEuro="Geld - Euro";
  	/** Name fr Animationssymbol "Geld - Pfund" */
  	public static String iconNameMoneyPound="Geld - Pfund";
  	/** Name fr Animationssymbol "Geld - Yen" */
  	public static String iconNameMoneyYen="Geld - Yen";
  	/** Name fr Animationssymbol "Musik" */
  	public static String iconNameMusic="Musik";
  	/** Name fr Animationssymbol "Dokument" */
  	public static String iconNameDocument="Dokument";
  	/** Name fr Animationssymbol "Stern" */
  	public static String iconNameStar="Stern";
  	/** Name fr Animationssymbol "Person - Grau" */
  	public static String iconNamePersonGray="Person - Grau";
  	/** Name fr Animationssymbol "Person - Grn" */
  	public static String iconNamePersonGreen="Person - Grn";
  	/** Name fr Animationssymbol "Person - Orange" */
  	public static String iconNamePersonOrange="Person - Orange";
  	/** Name fr Animationssymbol "Person - Rot" */
  	public static String iconNamePersonRed="Person - Rot";
  	/** Name fr Animationssymbol "Person - Anzug" */
  	public static String iconNamePersonSuit="Person - Anzug";
  	/** Name fr Animationssymbol "Person - Blau" */
  	public static String iconNamePersonBlue="Person - Blau";
  	/** Name fr Animationssymbol "Notiz" */
  	public static String iconNameNote="Notiz";
  	/** Name fr Animationssymbol "Paket" */
  	public static String iconNamePackage="Paket";
  	/** Name fr Animationssymbol "Wolken" */
  	public static String iconNameClouds="Wolken";
  	/** Name fr Animationssymbol "Gewitter" */
  	public static String iconNameLightning="Gewitter";
  	/** Name fr Animationssymbol "Sonne" */
  	public static String iconNameSun="Sonne";
  	/** Name fr Animationssymbol "Welt" */
  	public static String iconNameWorld="Welt";
  	/** Name fr Animationssymbol "Kreis - Rot" */
  	public static String iconNameBallRed="Kreis - Rot";
  	/** Name fr Animationssymbol "Kreis - Blau" */
  	public static String iconNameBallBlue="Kreis - Blau";
  	/** Name fr Animationssymbol "Kreis - Gelb" */
  	public static String iconNameBallYellow="Kreis - Gelb";
  	/** Name fr Animationssymbol "Kreis - Grn" */
  	public static String iconNameBallGreen="Kreis - Grn";
  	/** Name fr Animationssymbol "Kreis - Schwarz" */
  	public static String iconNameBallBlack="Kreis - Schwarz";
  	/** Name fr Animationssymbol "Kreis - Wei" */
  	public static String iconNameBallWhite="Kreis - Wei";
  	/** Name fr Animationssymbol "Kreis - Orange" */
  	public static String iconNameBallOrange="Kreis - Orange";
  	/** Name fr Animationssymbol "Kreis - Grau" */
  	public static String iconNameBallGray="Kreis - Grau";
  	/** Name fr Animationssymbol "Zahnrad" */
  	public static String iconNameCog="Zahnrad";
  	/** Name fr Animationssymbol "Auge" */
  	public static String iconNameEye="Auge";
  	/** Name fr Animationssymbol "Haus" */
  	public static String iconNameHouse="Haus";
  	/** Name fr Animationssymbol "Bausteine" */
  	public static String iconNameBricks="Bausteine";
  	/** Name fr Animationssymbol "Bediener" */
  	public static String iconNameOperator="Bediener";
  	/** Name fr Animationssymbol "Farbe - Rot" */
  	public static String iconNameColorRed="Farbe - Rot";
  	/** Name fr Animationssymbol "Farbe - Blau" */
  	public static String iconNameColorBlue="Farbe - Blau";
  	/** Name fr Animationssymbol "Farbe - Gelb" */
  	public static String iconNameColorYellow="Farbe - Gelb";
  	/** Name fr Animationssymbol "Farbe - Grn" */
  	public static String iconNameColorGreen="Farbe - Grn";
  	/** Name fr Animationssymbol "Farbe - Schwarz" */
  	public static String iconNameColorBlack="Farbe - Schwarz";
  	/** Name fr Animationssymbol "Farbe - Wei" */
  	public static String iconNameColorWhite="Farbe - Wei";
  	/** Name fr Animationssymbol "Farbe - Orange" */
  	public static String iconNameColorOrange="Farbe - Orange";
  	/** Name fr Animationssymbol "Farbe - Grau" */
  	public static String iconNameColorGray="Farbe - Grau";
  	/** Name fr Animationssymbol "Pfeil - nach unten" */
  	public static String iconNameArrowDown="Pfeil - nach unten";
  	/** Name fr Animationssymbol "Pfeil - nach links" */
  	public static String iconNameArrowLeft="Pfeil - nach links";
  	/** Name fr Animationssymbol "Pfeil - nach rechts" */
  	public static String iconNameArrowRight="Pfeil - nach rechts";
  	/** Name fr Animationssymbol "Pfeil - nach oben" */
  	public static String iconNameArrowUp="Pfeil - nach oben";
  	/** Name fr Animationssymbol "Fragezeichen" */
  	public static String iconNameQuestionmark="Fragezeichen";
  	/** Name fr Animationssymbol "Ausrufezeichen" */
  	public static String iconNameExclamationmark="Ausrufezeichen";
  	/** Name fr Animationssymbol "Ordner" */
  	public static String iconNameFolder="Ordner";
  	/** Name fr Animationssymbol "Ordner - Blau" */
  	public static String iconNameFolderBlue="Ordner - Blau";
  	/** Name fr Animationssymbol "Ordner - Grn" */
  	public static String iconNameFolderGreen="Ordner - Grn";
  	/** Name fr Animationssymbol "Ordner - Orange" */
  	public static String iconNameFolderOrange="Ordner - Orange";
  	/** Name fr Animationssymbol "Ordner - Pink" */
  	public static String iconNameFolderPink="Ordner - Pink";
  	/** Name fr Animationssymbol "Ordner - Lila" */
  	public static String iconNameFolderPurple="Ordner - Lila";
  	/** Name fr Animationssymbol "Ordner - Rot" */
  	public static String iconNameFolderRed="Ordner - Rot";
  	/** Name fr Animationssymbol "Buchstabe" */
  	public static String iconNameCharacter="Buchstabe";
  	/** Name fr Animationssymbol "Ziffer" */
  	public static String iconNameDigit="Ziffer";
  
  	/* p.yusukekamiyamane Icons */
  
  	/** Name fr Animationssymbol "Hund" */
  	public static String iconNameAnimalDog="Hund";
  	/** Name fr Animationssymbol "Affe" */
  	public static String iconNameAnimalMonkey="Affe";
  	/** Name fr Animationssymbol "Pinguin" */
  	public static String iconNameAnimalPenguin="Pinguin";
  	/** Name fr Animationssymbol "Katze" */
  	public static String iconNameAnimalCat="Katze";
  	/** Name fr Animationssymbol "Batterie" */
  	public static String iconNameBattery="Batterie";
  	/** Name fr Animationssymbol "Glocke" */
  	public static String iconNameBell="Glocke";
  	/** Name fr Animationssymbol "Aktentasche" */
  	public static String iconNameBriefcase="Aktentasche";
  	/** Name fr Animationssymbol "Kerze" */
  	public static String iconNameCandle="Kerze";
  	/** Name fr Animationssymbol "Taxi" */
  	public static String iconNameTaxi="Taxi";
  	/** Name fr Animationssymbol "Glaskolben" */
  	public static String iconNameFlask="Glaskolben";
  	/** Name fr Animationssymbol "Blume" */
  	public static String iconNameFlower="Blume";
  	/** Name fr Animationssymbol "Hamburger" */
  	public static String iconNameHamburger="Hamburger";
  	/** Name fr Animationssymbol "Hand" */
  	public static String iconNameHand="Hand";
  	/** Name fr Animationssymbol "Einmachglas" */
  	public static String iconNameJar="Einmachglas";
  	/** Name fr Animationssymbol "Laubblatt" */
  	public static String iconNameLeaf="Laubblatt";
  	/** Name fr Animationssymbol "Rettungsring" */
  	public static String iconNameLifebuoy="Rettungsring";
  	/** Name fr Animationssymbol "Glhbirne-aus" */
  	public static String iconNameLightbulbOff="Glhbirne-aus";
  	/** Name fr Animationssymbol "Glhbirne-an" */
  	public static String iconNameLightbuldOn="Glhbirne-an";
  	/** Name fr Animationssymbol "Lutscher" */
  	public static String iconNameLollipop="Lutscher";
  	/** Name fr Animationssymbol "Farbpalette" */
  	public static String iconNamePalette="Farbpalette";
  	/** Name fr Animationssymbol "Stecknadel" */
  	public static String iconNamePin="Stecknadel";
  	/** Name fr Animationssymbol "Fuball" */
  	public static String iconNameSoccer="Fuball";
  	/** Name fr Animationssymbol "Werkzeugkasten" */
  	public static String iconNameToolbox="Werkzeugkasten";
  	/** Name fr Animationssymbol "Pylon" */
  	public static String iconNameTrafficCone="Pylon";
  	/** Name fr Animationssymbol "Regenschirm" */
  	public static String iconNameUmbrella="Regenschirm";
  	/** Name fr Animationssymbol "Wassertropfen" */
  	public static String iconNameWaterDrop="Wassertropfen";
  
  	/* https://www.svgrepo.com/ Icons (CC0 license) */
  
  	/** Name fr Animationssymbol "Avatar Weiblich 1" */
  	public static String iconAvatarFemaleGirl1="Avatar Weiblich 1";
  	/** Name fr Animationssymbol "Avatar Weiblich 2" */
  	public static String iconAvatarFemaleGirl2="Avatar Weiblich 2";
  	/** Name fr Animationssymbol "Avatar Weiblich 3" */
  	public static String iconAvatarFemaleGirl3="Avatar Weiblich 3";
  	/** Name fr Animationssymbol "Avatar Weiblich 4" */
  	public static String iconAvatarFemaleGirl4="Avatar Weiblich 4";
  	/** Name fr Animationssymbol "Avatar Weiblich 5" */
  	public static String iconAvatarFemaleGirl5="Avatar Weiblich 5";
  	/** Name fr Animationssymbol "Avatar Mnnlich 1" */
  	public static String iconAvatarBoyMale1="Avatar Mnnlich 1";
  	/** Name fr Animationssymbol "Avatar Mnnlich 2" */
  	public static String iconAvatarBoyMale2="Avatar Mnnlich 2";
  	/** Name fr Animationssymbol "Avatar Mnnlich 3" */
  	public static String iconAvatarBoyMale3="Avatar Mnnlich 3";
  	/** Name fr Animationssymbol "Avatar Mnnlich 4" */
  	public static String iconAvatarBoyMale4="Avatar Mnnlich 4";
  	/** Name fr Animationssymbol "Avatar Mnnlich 5" */
  	public static String iconAvatarBoyMale5="Avatar Mnnlich 5";
  	/** Name fr Animationssymbol "Vergtung" */
  	public static String iconReward="Vergtung";
  	/** Name fr Animationssymbol "Zielscheibe" */
  	public static String iconTarget="Zielscheibe";
  	/** Name fr Animationssymbol "Sparschwein" */
  	public static String iconSavings="Sparschwein";
  	/** Name fr Animationssymbol "Papierflieger" */
  	public static String iconDirection="Papierflieger";
  	/** Name fr Animationssymbol "Reagenzglas" */
  	public static String iconTestTube="Reagenzglas";
  	/** Name fr Animationssymbol "Tortendiagramm" */
  	public static String iconPieChart="Tortendiagramm";
  	/** Name fr Animationssymbol "Vertrag" */
  	public static String iconContract="Vertrag";
  	/** Name fr Animationssymbol "Sanduhr" */
  	public static String iconHourGlass="Sanduhr";
  	/** Name fr Animationssymbol "Tresor" */
  	public static String iconSafe="Tresor";
  	/** Name fr Animationssymbol "Leistungssteigerung" */
  	public static String iconPerformanceIncrease="Leistungssteigerung";
  	/** Name fr Animationssymbol "Verkufer" */
  	public static String iconSalesman="Verkufer";
  	/** Name fr Animationssymbol "Magnet" */
  	public static String iconMagnet="Magnet";
  	/** Name fr Animationssymbol "Leistungsrckgang" */
  	public static String iconPerformanceDecline="Leistungsrckgang";
  	/** Name fr Animationssymbol "Handschlag" */
  	public static String iconHandshake="Handschlag";
  	/** Name fr Animationssymbol "Datentrends" */
  	public static String iconDataTrends="Datentrends";
  	/** Name fr Animationssymbol "Unternehmen" */
  	public static String iconCompany="Unternehmen";
  	/** Name fr Animationssymbol "Rechner" */
  	public static String iconCalculator="Rechner";
  	/** Name fr Animationssymbol "Heiluftballon" */
  	public static String iconHotAirBalloon="Heiluftballon";
  	/** Name fr Animationssymbol "Flugzeug" */
  	public static String iconAirplane="Flugzeug";
  	/** Name fr Animationssymbol "Segelboot" */
  	public static String iconSailboat="Segelboot";
  	/** Name fr Animationssymbol "" */
  	public static String iconBus="Bus";
  	/** Name fr Animationssymbol "Kreuzfahrtschiff" */
  	public static String iconShipCruise="Kreuzfahrtschiff";
  	/** Name fr Animationssymbol "Hubschrauber" */
  	public static String iconHelicopter="Hubschrauber";
  	/** Name fr Animationssymbol "Containerschiff" */
  	public static String iconShipFreight="Containerschiff";
  	/** Name fr Animationssymbol "Gabelstapler" */
  	public static String iconForkliftTruck="Gabelstapler";
  	/** Name fr Animationssymbol "Fahrrad" */
  	public static String iconBike="Fahrrad";
  	/** Name fr Animationssymbol "Motorroller" */
  	public static String iconScooter="Motorroller";
  	/** Name fr Animationssymbol "Zug" */
  	public static String iconTrain="Zug";
  	/** Name fr Animationssymbol "Zapfsule" */
  	public static String iconFuelPump="Zapfsule";
  	/** Name fr Animationssymbol "Prellbock" */
  	public static String iconBufferStop="Prellbock";
  	/** Name fr Animationssymbol "Rakete" */
  	public static String iconRocket="Rakete";
  	/** Name fr Animationssymbol "Ampel" */
  	public static String iconTrafficLights="Ampel";
  	/** Name fr Animationssymbol "Straenbahn" */
  	public static String iconTram="Straenbahn";
  
  	/**
  	 * Prefix fr dynamisch generierte Icons, die einfach nur Farben darstellen
  	 * @see #loadImageFromResource(String, ModelAnimationImages, int)
  	 * @see #getInternalImageColor(int, int)
  	 */
  	private static final String INTERN_COLOR="Intern-";
  
  	/**
  	 * Prefix fr dynamisch generierte Icons, die einfache Zeichen darstellen
  	 * @see #loadImageFromResource(String, ModelAnimationImages, int)
  	 * @see #getInternalImageCharacter(String, int)
  	 */
  	private static final String INTERN_CHARACTER="Intern-Character-";
  
  	/**
  	 * Zuordnung von Animationssymbol-Namen zu Dateinamen fr die Symbole
  	 */
  	public static Map<String,String> ICONS;
  
  	/**
  	 * Initialisiert {@link #ICONS}. Dies erfolgt beim Laden
  	 * der Klasse automatisch und muss nur nach einem Wechsel
  	 * der Sprache manuell angestoen werden.
  	 */
  	public static void initIconsMap() {
  		ICONS=new HashMap<>();
  
  		/* Famfamfam Icons */
  
  		ICONS.put(iconNameAttach,"attach");
  		ICONS.put(iconNameBook,"book");
  		ICONS.put(iconNameBug,"bug");
  		ICONS.put(iconNameCD,"cd");
  		ICONS.put(iconNameCake,"cake");
  		ICONS.put(iconNameCar,"car");
  		ICONS.put(iconNameCart,"cart");
  		ICONS.put(iconNameClock,"clock");
  		ICONS.put(iconNameComputer,"computer");
  		ICONS.put(iconNameDatabase,"database");
  		ICONS.put(iconNameDisk,"disk");
  		ICONS.put(iconNameLetter,"email");
  		ICONS.put(iconNameSmiley,"emoticon_smile");
  		ICONS.put(iconNameSymbolFemale,"female");
  		ICONS.put(iconNameFlagBlue,"flag_blue");
  		ICONS.put(iconNameFlagGreen,"flag_green");
  		ICONS.put(iconNameFlagOrange,"flag_orange");
  		ICONS.put(iconNameFlagPink,"flag_pink");
  		ICONS.put(iconNameFlagPurple,"flag_purple");
  		ICONS.put(iconNameFlagRed,"flag_red");
  		ICONS.put(iconNameFlagYellow,"flag_yellow");
  		ICONS.put(iconNameHeart,"heart");
  		ICONS.put(iconNameKey,"key");
  		ICONS.put(iconNameLorry,"lorry");
  		ICONS.put(iconNameLorryLeft,"lorry-left");
  		ICONS.put(iconNameLorryEmpty,"lorry-empty");
  		ICONS.put(iconNameLorryLeftEmpty,"lorry-left-empty");
  		ICONS.put(iconNameSymbolMale,"male");
  		ICONS.put(iconNameMoneyDollar,"money_dollar");
  		ICONS.put(iconNameMoneyEuro,"money_euro");
  		ICONS.put(iconNameMoneyPound,"money_pound");
  		ICONS.put(iconNameMoneyYen,"money_yen");
  		ICONS.put(iconNameMusic,"music");
  		ICONS.put(iconNameDocument,"page_white");
  		ICONS.put(iconNameStar,"star");
  		ICONS.put(iconNamePersonGray,"user_gray");
  		ICONS.put(iconNamePersonGreen,"user_green");
  		ICONS.put(iconNamePersonOrange,"user_orange");
  		ICONS.put(iconNamePersonRed,"user_red");
  		ICONS.put(iconNamePersonSuit,"user_suit");
  		ICONS.put(iconNamePersonBlue,"user");
  		ICONS.put(iconNameNote,"note");
  		ICONS.put(iconNamePackage,"icon_package");
  		ICONS.put(iconNameClouds,"weather_cloudy");
  		ICONS.put(iconNameLightning,"weather_lightning");
  		ICONS.put(iconNameSun,"weather_sun");
  		ICONS.put(iconNameWorld,"world");
  		ICONS.put(iconNameBallRed,"Ball_red");
  		ICONS.put(iconNameBallBlue,"Ball_blue");
  		ICONS.put(iconNameBallYellow,"Ball_yellow");
  		ICONS.put(iconNameBallGreen,"Ball_green");
  		ICONS.put(iconNameBallBlack,"Ball_black");
  		ICONS.put(iconNameBallWhite,"Ball_white");
  		ICONS.put(iconNameBallOrange,"Ball_orange");
  		ICONS.put(iconNameBallGray,"Ball_gray");
  		ICONS.put(iconNameCog,"cog");
  		ICONS.put(iconNameEye,"eye");
  		ICONS.put(iconNameHouse,"house");
  		ICONS.put(iconNameBricks,"bricks");
  		ICONS.put(iconNameOperator,"status_online");
  		ICONS.put(iconNameArrowDown,"arrow_down");
  		ICONS.put(iconNameArrowLeft,"arrow_left");
  		ICONS.put(iconNameArrowRight,"arrow_right");
  		ICONS.put(iconNameArrowUp,"arrow_up");
  		ICONS.put(iconNameQuestionmark,"questionmark");
  		ICONS.put(iconNameExclamationmark,"exclamationmark");
  		ICONS.put(iconNameFolder,"folder");
  		ICONS.put(iconNameFolderBlue,"folder-blue");
  		ICONS.put(iconNameFolderGreen,"folder-green");
  		ICONS.put(iconNameFolderOrange,"folder-orange");
  		ICONS.put(iconNameFolderPink,"folder-pink");
  		ICONS.put(iconNameFolderPurple,"folder-purple");
  		ICONS.put(iconNameFolderRed,"folder-red");
  
  		/* p.yusukekamiyamane Icons */
  
  		ICONS.put(iconNameAnimalDog,"animal-dog");
  		ICONS.put(iconNameAnimalMonkey,"animal-monkey");
  		ICONS.put(iconNameAnimalPenguin,"animal-penguin");
  		ICONS.put(iconNameAnimalCat,"animal");
  		ICONS.put(iconNameBattery,"battery");
  		ICONS.put(iconNameBell,"bell");
  		ICONS.put(iconNameBriefcase,"briefcase");
  		ICONS.put(iconNameCandle,"candle");
  		ICONS.put(iconNameTaxi,"car-taxi");
  		ICONS.put(iconNameFlask,"flask");
  		ICONS.put(iconNameFlower,"flower");
  		ICONS.put(iconNameHamburger,"hamburger");
  		ICONS.put(iconNameHand,"hand");
  		ICONS.put(iconNameJar,"jar");
  		ICONS.put(iconNameLeaf,"leaf");
  		ICONS.put(iconNameLifebuoy,"lifebuoy");
  		ICONS.put(iconNameLightbulbOff,"light-bulb-off");
  		ICONS.put(iconNameLightbuldOn,"light-bulb");
  		ICONS.put(iconNameLollipop,"lollipop");
  		ICONS.put(iconNamePalette,"palette");
  		ICONS.put(iconNamePin,"pin");
  		ICONS.put(iconNameSoccer,"sport-soccer");
  		ICONS.put(iconNameToolbox,"toolbox");
  		ICONS.put(iconNameTrafficCone,"traffic-cone");
  		ICONS.put(iconNameUmbrella,"umbrella");
  		ICONS.put(iconNameWaterDrop,"water");
  
  		/* https://www.svgrepo.com/ Icons (CC0 license) */
  
  		/* https://www.svgrepo.com/collection/simple-smiling-avatar-vectors/ */
  		ICONS.put(iconAvatarFemaleGirl1,"avatar-female-girl-1");
  		ICONS.put(iconAvatarFemaleGirl2,"avatar-female-girl-2");
  		ICONS.put(iconAvatarFemaleGirl3,"avatar-female-girl-3");
  		ICONS.put(iconAvatarFemaleGirl4,"avatar-female-girl-4");
  		ICONS.put(iconAvatarFemaleGirl5,"avatar-female-girl-5");
  		ICONS.put(iconAvatarBoyMale1,"avatar-boy-male-1");
  		ICONS.put(iconAvatarBoyMale2,"avatar-boy-male-2");
  		ICONS.put(iconAvatarBoyMale3,"avatar-boy-male-3");
  		ICONS.put(iconAvatarBoyMale4,"avatar-boy-male-4");
  		ICONS.put(iconAvatarBoyMale5,"avatar-boy-male-5");
  
  		/* https://www.svgrepo.com/collection/outlined-business-vectors/ */
  		ICONS.put(iconReward,"reward");
  		ICONS.put(iconTarget,"target");
  		ICONS.put(iconSavings,"savings");
  		ICONS.put(iconDirection,"direction");
  		ICONS.put(iconTestTube,"qualitative-change");
  		ICONS.put(iconPieChart,"data-report");
  		ICONS.put(iconContract,"record");
  		ICONS.put(iconHourGlass,"point-in-time");
  		ICONS.put(iconSafe,"safe");
  		ICONS.put(iconPerformanceIncrease,"performance-increase");
  		ICONS.put(iconSalesman,"salesman");
  		ICONS.put(iconMagnet,"magnet");
  		ICONS.put(iconPerformanceDecline,"decline-in-performance");
  		ICONS.put(iconHandshake,"cooperate");
  		ICONS.put(iconDataTrends,"data-trends");
  		ICONS.put(iconCompany,"company");
  		ICONS.put(iconCalculator,"calculator");
  
  		/* https://www.svgrepo.com/collection/transport-line-filled-vectors/ */
  		ICONS.put(iconHotAirBalloon,"hot-air-balloon");
  		ICONS.put(iconAirplane,"airplane");
  		ICONS.put(iconSailboat,"sailboat");
  		ICONS.put(iconBus,"bus");
  		ICONS.put(iconShipCruise,"ship-cruise");
  		ICONS.put(iconHelicopter,"helicopter");
  		ICONS.put(iconShipFreight,"freighter");
  		ICONS.put(iconForkliftTruck,"scraper");
  		ICONS.put(iconBike,"bike");
  		ICONS.put(iconScooter,"scooter");
  		ICONS.put(iconTrain,"train");
  
  		/* https://www.svgrepo.com/collection/transportation-flat-icons/ */
  		ICONS.put(iconFuelPump,"fuel-tank");
  		ICONS.put(iconBufferStop,"train-fence");
  		ICONS.put(iconRocket,"rocket");
  		ICONS.put(iconTrafficLights,"traffic-lights");
  		ICONS.put(iconTram,"tram");
  
  		/* Dynamisch generierte Icons */
  
  		ICONS.put(iconNameColorRed,INTERN_COLOR+"1");
  		ICONS.put(iconNameColorBlue,INTERN_COLOR+"2");
  		ICONS.put(iconNameColorYellow,INTERN_COLOR+"3");
  		ICONS.put(iconNameColorGreen,INTERN_COLOR+"4");
  		ICONS.put(iconNameColorBlack,INTERN_COLOR+"5");
  		ICONS.put(iconNameColorWhite,INTERN_COLOR+"6");
  		ICONS.put(iconNameColorOrange,INTERN_COLOR+"7");
  		ICONS.put(iconNameColorGray,INTERN_COLOR+"8");
  		for (char c='A';c<='Z';c++) ICONS.put(iconNameCharacter+" "+c,INTERN_CHARACTER+c);
  		for (int i=0;i<=9;i++) ICONS.put(iconNameDigit+" "+i,INTERN_CHARACTER+i);
  	}
  
  	static {
  		initIconsMap();
  	}
  
  	/**
  	 * Relativer Pfad fr die Animations-Icon-Ressourcen
  	 */
  	private static final String IMAGE_PATH="animation";
  
  	/**
  	 * Speichert bereits einmal generierte Bilder
  	 * @see #get(String, ModelAnimationImages, int)
  	 */
  	private Map<Long,BufferedImage> cache;
  
  	/**
  	 * Bildschirm-DPI-Zahl<br>
  	 * Wird zur Umrechnung von Box-Gren (in Pixeln) auf Schriftgren (in Punkten) verwendet.
  	 * @see #getInternalImageCharacter(String, int)
  	 */
  	private final int screenDPI;
  
  	/**
  	 * Konstruktor der Klasse
  	 */
  	public AnimationImageSource() {
  		cache=new HashMap<>();
  
  		if (GraphicsEnvironment.isHeadless()) {
  			screenDPI=150;
  		} else {
  			screenDPI=Toolkit.getDefaultToolkit().getScreenResolution();
  		}
  	}
  
  	/**
  	 * Lscht alle Bilder aus dem Cache.<br>
  	 * (Ist ntig, wenn die Liste der benutzerdefinierten Bilder whrend der Verwendung dieses Objekts verndert wurde.)
  	 */
  	public void clearCache() {
  		cache.clear();
  	}
  
  	/**
  	 * Erzeugt eine Grafik die ein Symbol fr ein leeres Bild enthlt
  	 * @param size	Gre der Grafik
  	 * @return	Grafik die ein Symbol fr ein leeres Bild enthlt
  	 * @see #loadImageFromResource(String, ModelAnimationImages, int)
  	 */
  	private BufferedImage getEmptyImage(int size) {
  		if (size<=0) size=32;
  		if (size>=2048) size=2048;
  
  		final BufferedImage image=new BufferedImage(size,size,BufferedImage.TYPE_4BYTE_ABGR);
  		final Graphics g=image.getGraphics();
  		g.setColor(Color.RED);
  		g.drawRect(0,0,size-1,size-1);
  		g.drawLine(0,0,size-1,size-1);
  		g.drawLine(size-1,0,0,size-1);
  		return image;
  	}
  
  	/**
  	 * Skaliert ein Bild auf eine vorgegebene Breite
  	 * @param original	Ausgangsbild
  	 * @param width	Zielbreite
  	 * @return	Neues Bild; wenn das Ausgangsbild bereits die korrekte Breit hat, wird das Ausgangsbild zurckgeliefert.
  	 */
  	public static BufferedImage scaleImage(final BufferedImage original, final int width) {
  		if (original.getWidth()==width && original.getHeight()==width) return original;
  		final Image image=original.getScaledInstance(width,(int)Math.round(((double)original.getHeight())/original.getWidth()*width),Image.SCALE_SMOOTH);
  		final BufferedImage bufferedImage=new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_4BYTE_ABGR);
  		bufferedImage.getGraphics().drawImage(image,0,0,null);
  		return bufferedImage;
  	}
  
  	/**
  	 * Liefert ein mit einer bestimmten Farbe geflltes Bild.
  	 * @param index	Auswahl der Farbe
  	 * @param preferredSize	Gre des Bildes
  	 * @return	Neues Bild
  	 */
  	private BufferedImage getInternalImageColor(final int index, int preferredSize) {
  		if (preferredSize<=0) preferredSize=128;
  		if (preferredSize>=2048) preferredSize=2048;
  		final BufferedImage image=new BufferedImage(preferredSize,preferredSize,BufferedImage.TYPE_4BYTE_ABGR);
  		final Graphics g=image.getGraphics();
  		switch (index) {
  		case 1: g.setColor(Color.RED); break;
  		case 2: g.setColor(Color.BLUE); break;
  		case 3: g.setColor(Color.YELLOW); break;
  		case 4: g.setColor(Color.GREEN); break;
  		case 5: g.setColor(Color.BLACK); break;
  		case 6: g.setColor(Color.WHITE); break;
  		case 7: g.setColor(Color.ORANGE); break;
  		case 8: g.setColor(Color.GRAY); break;
  		}
  		g.fillRect(0,0,preferredSize,preferredSize);
  
  		return image;
  	}
  
  	/**
  	 * Cache fr Schriftart-Objekte in Abhngigkeit von der Darstellungsgre
  	 * @see #getInternalImageCharacter(String, int)
  	 */
  	private final Map<Integer,Font> characterFontCache=new HashMap<>();
  
  	/**
  	 * Liefert ein Bild in dem ein bestimmtes Zeichen steht.
  	 * @param character	Darzustellendes Zeichen
  	 * @param preferredSize	Gre des Bildes
  	 * @return	Neues Bild
  	 */
  	private BufferedImage getInternalImageCharacter(final String character, int preferredSize) {
  		if (preferredSize<=0) preferredSize=128;
  		if (preferredSize>=2048) preferredSize=2048;
  		final BufferedImage image=new BufferedImage(preferredSize,preferredSize,BufferedImage.TYPE_4BYTE_ABGR);
  		final Graphics g=image.getGraphics();
  
  		Font font=characterFontCache.get(preferredSize);
  		if (font==null) {
  			final float fontSize=72.0f*preferredSize/screenDPI;
  			font=g.getFont().deriveFont(fontSize);
  			characterFontCache.put(preferredSize,font);
  		}
  		g.setFont(font);
  
  		final FontMetrics metrics=g.getFontMetrics();
  		final int x=Math.max(0,(preferredSize-metrics.stringWidth(character))/2);
  		final int y=g.getFontMetrics().getAscent();
  
  		g.setColor(Color.BLACK);
  		g.drawString(character,x,y);
  
  		return image;
  	}
  
  	/**
  	 * Bereits geladenen Bilder zwischenspeichern
  	 * @see #loadImageFromResource(String, ModelAnimationImages, int)
  	 */
  	private static Map<String,Map<Integer,BufferedImage>> resourceCache=new HashMap<>();
  
  	/**
  	 * Versucht ein Bild in einer bestimmten Gre aus dem Cache zu laden.
  	 * @param name	Name des Bildes (ohne Pfad und ohne Dateiendung)
  	 * @param preferredSize	Breite des Bildes
  	 * @return	Liefert im Erfolgsfall das Bild, sonst <code>null</code>
  	 * @see #storeToResourceCache(String, int, BufferedImage)
  	 */
  	private BufferedImage getFromResourceCache(final String name, final int preferredSize) {
  		final Map<Integer,BufferedImage> map=resourceCache.get(name);
  		if (map==null) return null;
  		return map.get(preferredSize);
  	}
  
  	/**
  	 * Speichert ein Bild im Cache.
  	 * @param name	Name des Bildes (ohne Pfad und ohne Dateiendung)
  	 * @param preferredSize	Breite des Bildes
  	 * @param image	Zu speicherndes Bild
  	 * @see #getFromResourceCache(String, int)
  	 */
  	private void storeToResourceCache(final String name, final int preferredSize, final BufferedImage image) {
  		Map<Integer,BufferedImage> map=resourceCache.get(name);
  		if (map==null) resourceCache.put(name,map=new HashMap<>());
  
  		map.put(preferredSize,image);
  	}
  
  	/**
  	 * Ldt ein Bild in einer bestimmten (festen) Gre aus einer Ressource (ohne Caching)
  	 * @param name	Name des Bildes (ohne Pfad und ohne Dateiendung)
  	 * @param size	Breite des Bildes
  	 * @return	Bild in der angegebenen Gre (oder <code>null</code>, wenn das Bild in der Gre nicht existiert)
  	 */
  	private BufferedImage getFromResourceFixedSize(final String name, final int size) {
  		final String folder=(size==16)?IMAGE_PATH:(IMAGE_PATH+size);
  
  
  		URL url=getClass().getResource(folder+"/"+name+".png");
  		if (url==null) url=getClass().getResource(folder+"/"+name.replace('_','-')+".png");
  		if (url==null) return null;
  		try {
  			return ImageIO.read(url);
  		} catch (IOException e) {
  			return null;
  		}
  	}
  
  	/**
  	 * Ldt ein Bild in einer bestimmten Gre aus einer Ressource (ohne Caching)
  	 * @param name	Name des Bildes (ohne Pfad und ohne Dateiendung)
  	 * @param preferredSize	Gewnschte Breite des Bildes
  	 * @return	Bild in der der angegebenen Gre am nchsten kommenden Gre (oder <code>null</code>, wenn berhaupt kein Bild mit dem angegebenen Namen existiert)
  	 */
  	private BufferedImage getFromResource(final String name, final int preferredSize) {
  		int pSize=(int)Math.round(preferredSize/8.0)*8;
  		if (pSize<16) pSize=16;
  		if (pSize>48) pSize=48;
  		if (pSize==40) pSize=48;
  
  		while (pSize>=16) {
  			BufferedImage result=getFromResourceFixedSize(name,pSize);
  			if (result!=null) return result;
  			pSize-=8;
  		}
  
  		return null;
  	}
  
  	/**
  	 * Ldt ein Bild in einer bestimmten Gre aus einer Ressource
  	 * @param name	Name des Bildes (ohne Pfad und ohne Dateiendung)
  	 * @param modelImages	Benutzerdefinierte Animationsicons
  	 * @param preferredSize	Gewnschte Breite des Bildes
  	 * @return	Bild in der angegebenen Gre (existiert das Bild nicht, wird ein Fehler-Bild geliefert, d.h. es wird immer ein Bild geliefert)
  	 */
  	private synchronized BufferedImage loadImageFromResource(final String name, final ModelAnimationImages modelImages, final int preferredSize) {
  		/* Bilder aus Modell laden */
  		if (modelImages!=null) {
  			final BufferedImage image=modelImages.getLocal(name);
  			if (image!=null) return image;
  		}
  
  		/* Per Zeichenbefehle generierte Bilder */
  		if (name.startsWith(INTERN_CHARACTER)) {
  			final String id=name.substring(INTERN_CHARACTER.length());
  			return getInternalImageCharacter(id,preferredSize);
  		}
  		if (name.startsWith(INTERN_COLOR)) {
  			final String id=name.substring(INTERN_COLOR.length());
  			try {
  				final int index=Integer.parseInt(id);
  				return getInternalImageColor(index,preferredSize);
  			} catch (NumberFormatException e) {} /* weiter unten weiter */
  		}
  
  		/* Bild wenn mglich aus Cache holen */
  		final BufferedImage cacheImage=getFromResourceCache(name,preferredSize);
  		if (cacheImage!=null) return cacheImage;
  
  		/* Bilder aus Ressourcen laden */
  		BufferedImage resourceImage=getFromResource(name,preferredSize);
  		if (resourceImage==null) resourceImage=getEmptyImage(preferredSize);
  
  		/* Bild in Cache speichern */
  		storeToResourceCache(name,preferredSize,resourceImage);
  
  		return resourceImage;
  	}
  
  	/**
  	 * Liefert ein Bild in einer bestimmten Gre aus
  	 * @param name	Name des Bildes (ohne Pfad und ohne Dateiendung)
  	 * @param modelImages	Benutzerdefinierte Animationsicons
  	 * @param size	Gewnschte Breite des Bildes
  	 * @return	Bild in der angegebenen Gre (existiert das Bild nicht, wird ein Fehler-Bild geliefert, d.h. es wird immer ein Bild geliefert)
  	 */
  	public BufferedImage get(final String name, final ModelAnimationImages modelImages, final int size) {
  		final long key=name.hashCode()*1000L+size;
  		/* verbraucht mehr Speicher: final String key=name+"-"+size; */
  		BufferedImage image=cache.get(key);
  		if (image!=null) return image;
  
  		image=loadImageFromResource(name,modelImages,size);
  		image=scaleImage(image,size);
  		cache.put(key,image);
  		return image;
  	}
  
  	/**
  	 * Liefert das Bild in einer gegenber der nativen Gre skalierten Fassung
  	 * @param name	Name des Bildes (ohne Pfad und ohne Dateiendung)
  	 * @param modelImages	Benutzerdefinierte Animationsicons
  	 * @param zoom	Zoomfaktor
  	 * @return	Bild in der angegebenen Gre (existiert das Bild nicht, wird ein Fehler-Bild geliefert, d.h. es wird immer ein Bild geliefert)
  	 */
  	public BufferedImage getZoomed(final String name, final ModelAnimationImages modelImages, final double zoom) {
  		final int preferredSize=FastMath.max(4,(int)Math.round(16*zoom));
  		final BufferedImage image=loadImageFromResource(name,modelImages,preferredSize);
  		return scaleImage(image,preferredSize);
  	}
  
  	/**
  	 * Liefert die Breite des Bildes im Normalfall
  	 * @param name	Name des Bildes (ohne Pfad und ohne Dateiendung)
  	 * @param modelImages	Benutzerdefinierte Animationsicons
  	 * @return	Breite und Hhe des Bildes
  	 */
  	public int[] getNativeSize(final String name, final ModelAnimationImages modelImages) {
  		final BufferedImage image=loadImageFromResource(name,modelImages,-1);
  		return new int[] {image.getWidth(),image.getHeight()};
  	}
  
  	/**
  	 * Liefert ein Bild in der maximal zur Verfgung stehenden Gre aus
  	 * @param name	Name des Bildes (ohne Pfad und ohne Dateiendung)
  	 * @param modelImages	Benutzerdefinierte Animationsicons
  	 * @return	Bild in der maximal mglichen Gre (existiert das Bild nicht, wird ein Fehler-Bild geliefert, d.h. es wird immer ein Bild geliefert)
  	 */
  	public BufferedImage getMaxSize(final String name, final ModelAnimationImages modelImages) {
  		return loadImageFromResource(name,modelImages,-1);
  	}
  
  	/**
  	 * Liefert ein Bild in einer bestimmten Gre aus
  	 * @param name	Name des Bildes (ohne Pfad und ohne Dateiendung)
  	 * @param modelImages	Benutzerdefinierte Animationsicons
  	 * @param baseSize	Gewnschte Breite des Bildes bezogen auf einen Zoomfaktor von 100%
  	 * @param zoom	Zoomfaktor
  	 * @return	Bild in der angegebenen Gre (existiert das Bild nicht, wird ein Fehler-Bild geliefert, d.h. es wird immer ein Bild geliefert)
  	 */
  	public BufferedImage get(final String name, final ModelAnimationImages modelImages, final int baseSize, final double zoom) {
  		return get(name,modelImages,(int)FastMath.round(baseSize*zoom));
  	}
  
  	/**
  	 * Liefert eine sortierte Liste der Namen der verfgbaren Bilder
  	 * @param modelImages	Benutzerdefinierte Animationsicons
  	 * @return	Sortierte Liste der Namen der verfgbaren Bilder
  	 */
  	private List<String> getSortedIconsList(final ModelAnimationImages modelImages) {
  		final List<String> names=new ArrayList<>(ICONS.keySet());
  		if (modelImages!=null) names.addAll(Arrays.asList(modelImages.getLocalNames()));
  		names.sort(null);
  		return names;
  	}
  
  	/**
  	 * Liefert eine Liste mit allen verfgbaren Icons fr eine Combobox
  	 * @param modelImages	Benutzerdefinierte Animationsicons
  	 * @return	ComboBox-Modell mit allen verfgbaren Icons
  	 */
  	public DefaultComboBoxModel<JLabel> getIconsComboBox(final ModelAnimationImages modelImages) {
  		final DefaultComboBoxModel<JLabel> iconsListModel=new DefaultComboBoxModel<>();
  
  		for (String name: getSortedIconsList(modelImages)) {
  			final JLabel label=new JLabel(name);
  			String imageName=ICONS.get(name);
  			if (imageName==null) imageName=name;
  			final BufferedImage image=get(imageName,modelImages,16);
  			label.setIcon(new ImageIcon(image));
  			iconsListModel.addElement(label);
  		}
  		return iconsListModel;
  	}
  
  	/**
  	 * Fgt alle verfgbaren Icons als Menpunkte zu einem Men hinzu
  	 * @param menu	Men, zu dem die Punkte hinzugefgt werden sollen
  	 * @param clickCallback	Callback-Funktion, die bei einem Klick auf einen der Menpunkte aufgerufen werden soll. Es wird der Dateiname (ohne Endung) des Bildes bergeben (der direkt fr <code>get</code> verwendet werden kann) und nicht der Anzeigename.
  	 * @param modelImages	Benutzerdefinierte Animationsicons
  	 */
  	public void addIconsToMenu(final JMenu menu, final Consumer<String> clickCallback, final ModelAnimationImages modelImages) {
  		for (String name: getSortedIconsList(modelImages)) {
  			String imageName=ICONS.get(name);
  			if (imageName==null) imageName=name;
  			final JMenuItem item=new JMenuItem(name,new ImageIcon(get(imageName,modelImages,16)));
  			final String fixName=imageName;
  			item.addActionListener(e->clickCallback.accept(fixName));
  			menu.add(item);
  		}
  	}
  
  	/**
  	 * Fgt alle verfgbaren Icons als Menpunkte zu einem Men hinzu
  	 * @param menu	Men, zu dem die Punkte hinzugefgt werden sollen
  	 * @param clickCallback	Callback-Funktion, die bei einem Klick auf einen der Menpunkte aufgerufen werden soll. Es wird der Dateiname (ohne Endung) des Bildes bergeben (der direkt fr <code>get</code> verwendet werden kann) und nicht der Anzeigename.
  	 * @param modelImages	Benutzerdefinierte Animationsicons
  	 */
  	public void addIconsToMenu(final JPopupMenu menu, final Consumer<String> clickCallback, final ModelAnimationImages modelImages) {
  		for (String name: getSortedIconsList(modelImages)) {
  			final String imageName=ICONS.get(name);
  			final JMenuItem item=new JMenuItem(name,new ImageIcon(get(imageName,modelImages,16)));
  			item.addActionListener(e->clickCallback.accept(imageName));
  			menu.add(item);
  		}
  	}
  
  	/**
  	 * ComboBox ListCellRenderer, der es ermglicht, Icons inkl. Beschriftungen in der Liste anzuzeigen
  	 * @author Alexander Herzog
  	 */
  	public static class IconComboBoxCellRenderer extends DefaultListCellRenderer {
  		/**
  		 * Serialisierungs-ID der Klasse
  		 * @see Serializable
  		 */
  		private static final long serialVersionUID = 6913560392242517601L;
  
  		/**
  		 * Konstruktor der Klasse
  		 */
  		public IconComboBoxCellRenderer() {
  			/*
  			 * Wird nur bentigt, um einen JavaDoc-Kommentar fr diesen (impliziten) Konstruktor
  			 * setzen zu knnen, damit der JavaDoc-Compiler keine Warnung mehr ausgibt.
  			 */
  		}
  
  		@Override
  		public Component getListCellRendererComponent(JList<?> list, Object value, int index,boolean isSelected, boolean cellHasFocus) {
  			Component renderer=super.getListCellRendererComponent(list,value, index, isSelected, cellHasFocus);
  			if (value instanceof JLabel) {
  				((IconComboBoxCellRenderer)renderer).setText(((JLabel)value).getText());
  				((IconComboBoxCellRenderer)renderer).setIcon(((JLabel)value).getIcon());
  			}
  			return renderer;
  		}
  	}
  }
  