package eu.jucy.countries;
import geoip.GEOIP;
import java.net.InetAddress;
import logger.LoggerFactory;
import org.apache.log4j.Logger;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import uc.IUser;
public class FlagStorage {
public static final class FlagStorageHolder {
private static final FlagStorage singleton = new FlagStorage();
}
private static final Logger logger = LoggerFactory.make();
private static final String PLUGIN_ID = "eu.jucy.countries";
public static FlagStorage get() {
return FlagStorageHolder.singleton;
}
private ImageRegistry ir = new ImageRegistry(),
irRect = new ImageRegistry();
private Image defaultFlag,defaultFlagRect;
private FlagStorage() {
defaultFlag = createDefaultFlag();
defaultFlagRect = getFlagRect(defaultFlag);
logger.debug("default flag loaded");
}
/**
*
* @return a white flag that can be used as default.
*/
private static Image createDefaultFlag() {
Image img = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, "png/de.png").createImage();
GC gc = new GC(img);
gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
gc.fillRectangle(img.getBounds());
gc.dispose();
return img;
}
/**
*
* @param user - user for which we want the flag..
* @param rect - if the flag should be in rectangular format (needed for tables)
* @param defaultflag - if true will return a white flag if no other can be determined..
* if flase.. null is returned...
* @return
*/
public Image getFlag(IUser user,boolean rect,boolean defaultFlag) {
if (user == null) {
return getDefault(rect,defaultFlag);
}
InetAddress ip = user.getIp();
if (ip != null) {
String cc = GEOIP.get().getCountryCode(ip);
if (cc != null) {
return getImageByCC(cc,rect);
}
}
return getDefault(rect,defaultFlag);
}
private Image getDefault(boolean rect,boolean defaultFlag) {
return defaultFlag? (rect ? defaultFlagRect:this.defaultFlag) : null;
}
private Image getImageByCC(String cc,boolean rect) {
ImageRegistry ir = rect ? irRect: this.ir;
Image img = ir.get(cc);
if (img == null) {
String s = "png/"+cc.toLowerCase()+".png";
ImageDescriptor id = AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, s);
if (id == null) {
img = rect ? defaultFlagRect:defaultFlag;
} else {
img = id.createImage();
if (rect) {
Image old = img;
img = getFlagRect(img);
old.dispose();
}
}
ir.put(cc, img);
}
return img;
}
private static Image getFlagRect(Image oFlag) {
//Color background = GUIPI.getColor(GUIPI.windowColor);
int size = Math.max(oFlag.getBounds().height, oFlag.getBounds().width);
// Rectangle rect = new Rectangle(0,0,size,size);
Image i = new Image(oFlag.getDevice(),size,size);
GC gc = new GC(i);
gc.setBackground(oFlag.getDevice().getSystemColor(SWT.COLOR_WHITE));
gc.fillRectangle(0, 0, size, size);
gc.drawImage(oFlag, (size-oFlag.getBounds().width)/2, (size-oFlag.getBounds().height)/2 );
gc.dispose();
ImageData id = i.getImageData();
id.transparentPixel = id.palette.getPixel(new RGB(255,255,255));
i.dispose();
return new Image(oFlag.getDevice(),id);
}
}