package de.FeatureModellingTool.Customize.ui;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import de.FeatureModellingTool.Customize.Customization;
import de.FeatureModellingTool.FeatureModel.CompositeConstraintPortType;
import de.FeatureModellingTool.FeatureModel.CompositeConstraintType;
import de.FeatureModellingTool.FeatureModel.FeatureRelation;
import de.FeatureModellingTool.FeatureModel.GroupConstraintType;
public class ImageManager {
private static ImageManager self = null;
public static ImageManager getInstance() {
if (ImageManager.self==null) {
ImageManager.self = new ImageManager();
}
return ImageManager.self;
}
private static String DISABLE_TAG = "_disabled";
private static String HI_CC_LREQUIRE = "hi_cc_lrequire";
private static String HI_CC_RREQUIRE = "hi_cc_rrequire";
private static String HI_CC_MREQUIRE = "hi_cc_mrequire";
private static String HI_CC_MUTEX = "hi_cc_mutex";
private static String HI_CC_ALL_LEFT = "hi_cc_all_left";
private static String HI_CC_SINGLE_LEFT = "hi_cc_single_left";
private static String HI_CC_MULTI_LEFT = "hi_cc_multi_left";
private static String HI_CC_ALL_RIGHT = "hi_cc_all_right";
private static String HI_CC_SINGLE_RIGHT = "hi_cc_single_right";
private static String HI_CC_MULTI_RIGHT = "hi_cc_multi_right";
private static String HI_GC_ALL = "hi_gc_all";
private static String HI_GC_SINGLE = "hi_gc_single";
private static String HI_GC_NONE = "hi_gc_none";
private static String HI_REQUIRE = "hi_require";
private static String HI_MUTEX = "hi_mutex";
private static String HI_TRUE = "hi_true";
private static String HI_FALSE = "hi_false";
private static String HI_QUESTION = "hi_question";
private static String CI_SELECTED = "ci_selected";
private static String CI_UNSELECTED = "ci_unselected";
private static String CI_UNDECIDED = "ci_undecided";
private static String CI_TAG = "_tag";
private static String CI_SELECTED_TAG = CI_SELECTED + CI_TAG;
private static String CI_UNSELECTED_TAG = CI_UNSELECTED + CI_TAG;
private static String CI_UNDECIDED_TAG = CI_UNDECIDED + CI_TAG;
private static String HI_ALERT = CI_UNSELECTED;
private static String HI_NOTIFY = "hi_transfer";
private Hashtable<String , BufferedImage> htImage = new Hashtable<String , BufferedImage>();
private Hashtable<String , ImageIcon> htImageIcon = new Hashtable<String , ImageIcon>();
private ImageManager() {
String host = "http://localhost:8080/FMTool_Web2/customizeui/";
try {
this.htImage.put(ImageManager.HI_CC_LREQUIRE , ImageIO.read(new URL(host + ImageManager.HI_CC_LREQUIRE + ".png") ));
this.htImage.put(ImageManager.HI_CC_RREQUIRE , ImageIO.read(new URL(host + ImageManager.HI_CC_RREQUIRE + ".png")));
this.htImage.put(ImageManager.HI_CC_MREQUIRE , ImageIO.read(new URL(host + ImageManager.HI_CC_MREQUIRE + ".png")));
this.htImage.put(ImageManager.HI_CC_MUTEX , ImageIO.read(new URL(host + ImageManager.HI_CC_MUTEX + ".png")));
this.htImage.put(ImageManager.HI_CC_ALL_LEFT , ImageIO.read(new URL(host + ImageManager.HI_CC_ALL_LEFT + ".png")));
this.htImage.put(ImageManager.HI_CC_SINGLE_LEFT , ImageIO.read(new URL(host + ImageManager.HI_CC_SINGLE_LEFT + ".png")));
this.htImage.put(ImageManager.HI_CC_MULTI_LEFT , ImageIO.read(new URL(host + ImageManager.HI_CC_MULTI_LEFT + ".png")));
this.htImage.put(ImageManager.HI_CC_ALL_RIGHT , ImageIO.read(new URL(host + ImageManager.HI_CC_ALL_RIGHT + ".png")));
this.htImage.put(ImageManager.HI_CC_SINGLE_RIGHT , ImageIO.read(new URL(host + ImageManager.HI_CC_SINGLE_RIGHT + ".png")));
this.htImage.put(ImageManager.HI_CC_MULTI_RIGHT , ImageIO.read(new URL(host + ImageManager.HI_CC_MULTI_RIGHT + ".png")));
this.htImage.put(ImageManager.HI_GC_ALL , ImageIO.read(new URL(host + ImageManager.HI_GC_ALL + ".png")));
this.htImage.put(ImageManager.HI_GC_SINGLE , ImageIO.read(new URL(host + ImageManager.HI_GC_SINGLE + ".png")));
this.htImage.put(ImageManager.HI_GC_NONE , ImageIO.read(new URL(host + ImageManager.HI_GC_NONE + ".png")));
this.htImage.put(ImageManager.HI_REQUIRE , ImageIO.read(new URL(host + ImageManager.HI_REQUIRE + ".png")));
this.htImage.put(ImageManager.HI_MUTEX , ImageIO.read(new URL(host + ImageManager.HI_MUTEX + ".png")));
this.htImage.put(ImageManager.HI_TRUE , ImageIO.read(new URL(host + ImageManager.HI_TRUE + ".png")));
this.htImage.put(ImageManager.HI_FALSE , ImageIO.read(new URL(host + ImageManager.HI_FALSE + ".png")));
this.htImage.put(ImageManager.HI_QUESTION , ImageIO.read(new URL(host + ImageManager.HI_QUESTION + ".png")));
// this.htImage.put(ImageManager.HI_ALERT , ImageIO.read(new URL(host + ImageManager.HI_ALERT + ".png")));
this.htImage.put(ImageManager.HI_NOTIFY , ImageIO.read(new URL(host + ImageManager.HI_NOTIFY + ".png")));
this.htImage.put(ImageManager.CI_SELECTED , ImageIO.read(new URL(host + ImageManager.CI_SELECTED + ".png")));
this.htImage.put(ImageManager.CI_UNSELECTED , ImageIO.read(new URL(host + ImageManager.CI_UNSELECTED + ".png")));
this.htImage.put(ImageManager.CI_UNDECIDED , ImageIO.read(new URL(host + ImageManager.CI_UNDECIDED + ".png")));
this.htImage.put(ImageManager.CI_SELECTED_TAG , ImageIO.read(new URL(host + ImageManager.CI_SELECTED_TAG + ".png")));
this.htImage.put(ImageManager.CI_UNSELECTED_TAG , ImageIO.read(new URL(host + ImageManager.CI_UNSELECTED_TAG + ".png")));
this.htImage.put(ImageManager.CI_UNDECIDED_TAG , ImageIO.read(new URL(host + ImageManager.CI_UNDECIDED_TAG + ".png")));
} catch (IOException ex) {
ex.printStackTrace();
}
}
private String getName(List<String> names) {
String result = "";
for (int i=0 ; i<names.size() ; i++) {
result += names.get(i);
if (i<names.size()-1) {
result += " ";
}
}
return result;
}
private String getName(String name , boolean enabled) {
return name + (enabled ? "" : ImageManager.DISABLE_TAG);
}
private String getName(List<String> upNames , List<String> downNames , boolean enabled) {
return getName(getName(upNames) , enabled) + " " + getName(getName(downNames) , enabled);
}
private BufferedImage getImage(List<String> names , boolean enabled) {
String name = getName(names);
if (!this.htImage.contains(name)) {
int imageWidth = 0;
int imageHeight = 0;
for (int i=0 ; i<names.size() ; i++) {
BufferedImage img = this.htImage.get(names.get(i));
imageWidth += img.getWidth();
if (img.getHeight()>imageHeight) {
imageHeight = img.getHeight();
}
}
BufferedImage result = new BufferedImage(Math.max(imageWidth,1) , Math.max(imageHeight,1) , BufferedImage.TYPE_INT_ARGB);
imageWidth = 0;
for (int i=0 ; i<names.size() ; i++) {
BufferedImage img = this.htImage.get(names.get(i));
for (int x=0 ; x<img.getWidth() ; x++)
for (int y=0 ; y<img.getHeight() ; y++) {
result.setRGB(imageWidth + x , y , img.getRGB(x , y));
}
imageWidth += img.getWidth();
}
this.htImage.put(name , result);
}
if (!enabled) {
if (!this.htImage.contains(this.getName(name, enabled))) {
BufferedImage img = this.htImage.get(name);
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
BufferedImage result = op.filter(img , null);
this.htImage.put(this.getName(name , enabled) , result);
}
name = this.getName(name , enabled);
}
return this.htImage.get(name);
}
private BufferedImage getImage(List<String> upNames , List<String> downNames , boolean enabled) {
BufferedImage upImage = this.getImage(upNames , enabled);
BufferedImage downImage = this.getImage(downNames , enabled);
if (upImage==null) {
return downImage;
} else if (downImage==null) {
return upImage;
}
String name = getName(upNames , downNames , enabled);
if (!this.htImage.contains(name)) {
BufferedImage result = new BufferedImage(Math.max(upImage.getWidth() , downImage.getWidth()) , upImage.getHeight() + downImage.getHeight() , BufferedImage.TYPE_INT_ARGB);
int upOff = upImage.getWidth()>downImage.getWidth() ? 0 : (downImage.getWidth()-upImage.getWidth())/2;
int downOff = downImage.getWidth()>upImage.getWidth() ? 0 : (upImage.getWidth()-downImage.getWidth())/2;
for (int x=0 ; x<upImage.getWidth() ; x++)
for (int y=0 ; y<upImage.getHeight() ; y++) {
result.setRGB(upOff + x , y , upImage.getRGB(x , y));
}
for (int x=0 ; x<downImage.getWidth() ; x++)
for (int y=0 ; y<downImage.getHeight() ; y++) {
result.setRGB(downOff + x , upImage.getHeight() + y , downImage.getRGB(x , y));
}
this.htImage.put(name , result);
}
return this.htImage.get(name);
}
private ImageIcon getIcon(List<String> names , boolean enabled) {
String name = getName(getName(names) , enabled);
if (!this.htImageIcon.contains(name)) {
ImageIcon ii = new ImageIcon(getImage(names , enabled));
this.htImageIcon.put(name , ii);
}
return this.htImageIcon.get(name);
}
private ImageIcon getIcon(List<String> upNames , List<String> downNames , boolean enabled) {
String name = getName(upNames , downNames , enabled);
if (!this.htImageIcon.contains(name)) {
ImageIcon ii = new ImageIcon(getImage(upNames , downNames , enabled));
this.htImageIcon.put(name , ii);
}
return this.htImageIcon.get(name);
}
protected String getValueImageName(Customization cus) {
if (cus.equals(Customization.Selected)) {
return ImageManager.HI_TRUE;
} else if (cus.equals(Customization.Unselected)) {
return ImageManager.HI_FALSE;
} else /*if (cus.getName().equals(Customization.Undecided)) */{
return ImageManager.HI_QUESTION;
}
}
protected String getCustomizationImageName(Customization cus) {
if (cus.equals(Customization.Selected)) {
return CI_SELECTED;
} else if (cus.equals(Customization.Unselected)) {
return CI_UNSELECTED;
} else {
return CI_UNDECIDED;
}
}
public ImageIcon getCustomizationIcon(Customization cFinal , Customization cSelf , boolean enabled) {
List<String> names = new ArrayList<String>();
names.add(this.getCustomizationImageName(cFinal));
if (!cFinal.equals(cSelf)) {
names.add(this.getCustomizationImageName(cSelf) + CI_TAG);
}
return this.getIcon(names , enabled);
}
public enum ConstraintStat {csNone , csConflict , csFlow};
public ImageIcon getCompositeConstraintHeader(CompositeConstraintPortType lType
, CompositeConstraintPortType rType , CompositeConstraintType ccType
, Customization leftValue , Customization rightValue , ConstraintStat cs) {
List<String> status = new ArrayList<String>();
List<String> names = new ArrayList<String>();
if (leftValue!=null) {
if (ccType.equals(CompositeConstraintType.Mutex)) {
if (leftValue.equals(Customization.Undecided) || rightValue.equals(Customization.Undecided)) {
status.add(ImageManager.CI_UNDECIDED);
} else if (leftValue.equals(Customization.Selected) && rightValue.equals(Customization.Selected)) {
status.add(ImageManager.CI_UNSELECTED);
} else {
status.add(ImageManager.CI_SELECTED);
}
} else if (ccType.equals(CompositeConstraintType.L2R_Implication)) {
if (rightValue.equals(Customization.Selected)) {
status.add(ImageManager.CI_SELECTED);
} else if (leftValue.equals(Customization.Undecided) || rightValue.equals(Customization.Undecided)) {
status.add(ImageManager.CI_UNDECIDED);
} else {
status.add(ImageManager.CI_UNSELECTED);
}
} else if (ccType.equals(CompositeConstraintType.R2L_Implication)) {
if (leftValue.equals(Customization.Selected)) {
status.add(ImageManager.CI_SELECTED);
} else if (leftValue.equals(Customization.Undecided) || rightValue.equals(Customization.Undecided)) {
status.add(ImageManager.CI_UNDECIDED);
} else {
status.add(ImageManager.CI_UNSELECTED);
}
} else if (ccType.equals(CompositeConstraintType.Equivalence)) {
if (leftValue.equals(Customization.Undecided) || rightValue.equals(Customization.Undecided)) {
status.add(ImageManager.CI_UNDECIDED);
} else if (leftValue.equals(Customization.Selected) && rightValue.equals(Customization.Selected)
|| leftValue.equals(Customization.Unselected) && rightValue.equals(Customization.Unselected)) {
status.add(ImageManager.CI_SELECTED);
} else {
status.add(ImageManager.CI_UNSELECTED);
}
}
}
if (leftValue!=null) {
names.add(this.getValueImageName(leftValue));
}
if (lType.equals(CompositeConstraintPortType.All)) {
names.add(ImageManager.HI_CC_ALL_LEFT);
} else if (lType.equals(CompositeConstraintPortType.Multi)) {
names.add(ImageManager.HI_CC_MULTI_LEFT);
} else if (lType.equals(CompositeConstraintPortType.Single)) {
names.add(ImageManager.HI_CC_SINGLE_LEFT);
}
if (ccType.equals(CompositeConstraintType.Mutex)) {
names.add(ImageManager.HI_CC_MUTEX);
} else if (ccType.equals(CompositeConstraintType.L2R_Implication)) {
names.add(ImageManager.HI_CC_LREQUIRE);
} else if (ccType.equals(CompositeConstraintType.R2L_Implication)) {
names.add(ImageManager.HI_CC_RREQUIRE);
} else if (ccType.equals(CompositeConstraintType.Equivalence)) {
names.add(ImageManager.HI_CC_MREQUIRE);
}
if (rType.equals(CompositeConstraintPortType.All)) {
names.add(ImageManager.HI_CC_ALL_RIGHT);
} else if (rType.equals(CompositeConstraintPortType.Multi)) {
names.add(ImageManager.HI_CC_MULTI_RIGHT);
} else if (rType.equals(CompositeConstraintPortType.Single)) {
names.add(ImageManager.HI_CC_SINGLE_RIGHT);
}
if (rightValue!=null) {
names.add(this.getValueImageName(rightValue));
}
return getIcon(names , status , true);
}
public ImageIcon getGroupConstraintHeader(GroupConstraintType gcType
, Customization rightValue , ConstraintStat cs) {
List<String> names = new ArrayList<String>();
List<String> status = new ArrayList<String>();
if (rightValue!=null) {
status.add(getCustomizationImageName(rightValue));
}
if (gcType.equals(GroupConstraintType.AllGroup)) {
names.add(ImageManager.HI_GC_ALL);
} else if (gcType.equals(GroupConstraintType.MultiGroup)) {
names.add(ImageManager.HI_GC_NONE);
} else if (gcType.equals(GroupConstraintType.SingleGroup)) {
names.add(ImageManager.HI_GC_SINGLE);
}
if (rightValue!=null) {
names.add(this.getValueImageName(rightValue));
}
return getIcon(names , status , true);
}
public ImageIcon getRelationHeader(String relationName
, Customization leftValue , Customization rightValue , ConstraintStat cs) {
List<String> names = new ArrayList<String>();
List<String> status = new ArrayList<String>();
if (leftValue!=null) {
if (relationName.equals(FeatureRelation.REQUIRE)) {
if (leftValue.equals(Customization.Selected) && rightValue.equals(Customization.Selected)
|| leftValue.equals(Customization.Unselected) && rightValue.equals(Customization.Unselected)) {
status.add(ImageManager.CI_SELECTED);
} else if (leftValue.equals(Customization.Selected) && rightValue.equals(Customization.Unselected)) {
status.add(ImageManager.CI_UNSELECTED);
} else if (leftValue.equals(Customization.Selected) && rightValue.equals(Customization.Undecided)
|| leftValue.equals(Customization.Undecided) && rightValue.equals(Customization.Unselected)) {
status.add(ImageManager.CI_UNDECIDED);
status.add(ImageManager.HI_NOTIFY);
} else {
status.add(ImageManager.CI_UNDECIDED);
}
} else if (relationName.equals(FeatureRelation.EXCLUDE)) {
if (leftValue.equals(Customization.Selected) && rightValue.equals(Customization.Selected)) {
status.add(ImageManager.CI_UNSELECTED);
} else if (leftValue.equals(Customization.Selected) && rightValue.equals(Customization.Unselected)
|| leftValue.equals(Customization.Unselected) && rightValue.equals(Customization.Selected)) {
status.add(ImageManager.CI_SELECTED);
} else if (leftValue.equals(Customization.Selected) && rightValue.equals(Customization.Undecided)
|| leftValue.equals(Customization.Undecided) && rightValue.equals(Customization.Selected)) {
status.add(ImageManager.CI_UNDECIDED);
status.add(ImageManager.HI_NOTIFY);
} else {
status.add(ImageManager.CI_UNDECIDED);
}
}
}
if (leftValue!=null) {
names.add(this.getValueImageName(leftValue));
}
if (relationName.equals(FeatureRelation.REQUIRE)) {
names.add(ImageManager.HI_REQUIRE);
} else if (relationName.equals(FeatureRelation.EXCLUDE)) {
names.add(ImageManager.HI_MUTEX);
}
if (rightValue!=null) {
names.add(this.getValueImageName(rightValue));
}
return getIcon(names , status , true);
}
}