/*
* File : Utils.java
* Created : 06-feb-2001 18:30
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* 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 (see the LICENSE file).
*/
package edu.xtec.jclic.misc;
import edu.xtec.jclic.Constants;
import edu.xtec.util.Options;
import edu.xtec.util.SimpleFileFilter;
import java.awt.*;
import java.awt.geom.Area;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.08.28
*/
public abstract class Utils implements Constants{
public static final int
JCLIC_FF=0, JCLIC_ZIP_FF=1, PAC_FF=2, PCC_FF=3,
ALL_JCLIC_FF=4, ALL_CLIC_FF=5, ALL_JCLIC_CLIC_FF=6,
INSTALL_FF=7, GIF_FF=8, JPG_FF=9, PNG_FF=10, ALL_IMAGES_FF=11,
ALL_FF=12,
ALL_SOUNDS_FF=13, MIDI_FF=14, ALL_VIDEO_FF=15, ALL_ANIM_FF=16,
SKINS_FF=17, FONTS_FF=18, ALL_MEDIA_FF=19, ALL_MULTIMEDIA_FF=20,
ALL_HTML_FF=21, TEXT_FF=22, NUM_FILE_FILTERS=23;
private static SimpleFileFilter[] fileFilters=new SimpleFileFilter[NUM_FILE_FILTERS];
public static final String EXT_JCLIC=".jclic", EXT_JCLIC_ZIP=".jclic.zip",
EXT_PAC=".pac", EXT_PCC=".pcc", EXT_INSTALL=".jclic.inst";
public static final String EXT_GIF=".gif", EXT_JPG=".jpg", EXT_PNG=".png", EXT_BMP=".bmp", EXT_ICO=".ico";
public static final String EXT_WAV=".wav", EXT_AU=".au", EXT_MP3=".mp3",
EXT_AIFF=".aiff", EXT_MID=".mid", EXT_OGG=".ogg";
public static final String EXT_AVI=".avi", EXT_MOV=".mov", EXT_MPEG=".mpeg";
public static final String EXT_SWF=".swf", EXT_XML=".xml", EXT_TTF=".ttf",
EXT_HTM=".htm", EXT_HTML=".html", EXT_TXT=".txt", EXT_ALL=".*";
public static final String[] EXT_ALL_JCLIC=new String[]{EXT_JCLIC, EXT_JCLIC_ZIP};
public static final String[] EXT_ALL_CLIC=new String[]{EXT_PAC, EXT_PCC};
public static final String[] EXT_ALL_JCLIC_CLIC=new String[]{EXT_JCLIC, EXT_JCLIC_ZIP, EXT_PAC, EXT_PCC};
public static final String[] EXT_ALL_IMAGES=new String[]{EXT_GIF, EXT_JPG, EXT_PNG, EXT_BMP, EXT_ICO};
public static final String[] EXT_ALL_SOUNDS=new String[]{EXT_WAV, EXT_AU, EXT_MP3, EXT_OGG, EXT_AIFF};
public static final String[] EXT_ALL_VIDEO=new String[]{EXT_AVI, EXT_MOV, EXT_MPEG, EXT_SWF};
public static final String[] EXT_ALL_ANIM=new String[]{EXT_SWF};
public static final String[] EXT_ALL_MEDIA=new String[]{EXT_GIF, EXT_JPG, EXT_PNG, EXT_BMP, EXT_ICO,
EXT_WAV, EXT_AU, EXT_MP3, EXT_OGG, EXT_AIFF, EXT_MID, EXT_AVI, EXT_MOV, EXT_MPEG, EXT_SWF, EXT_TTF, EXT_XML};
public static final String[] EXT_ALL_MULTIMEDIA=new String[]{EXT_WAV, EXT_AU, EXT_MP3, EXT_OGG, EXT_AIFF, EXT_MID,
EXT_AVI,EXT_MOV,EXT_MPEG, EXT_SWF};
public static final String[] EXT_ALL_HTML=new String[]{EXT_HTM, EXT_HTML};
public static final int TYPE_IMAGE=0, TYPE_AUDIO=1, TYPE_MIDI=2,
TYPE_VIDEO=3, TYPE_ANIM=4, TYPE_XML=5, TYPE_FONT=6, TYPE_JCLIC=7, TYPE_CLIC=8,
TYPE_INST=9, TYPE_TEXT=10, TYPE_UNKNOWN=11;
public static final String[] TYPE_CODES={"ftype_image", "ftype_audio", "ftype_midi",
"ftype_video", "ftype_anim", "ftype_xml", "ftype_font", "ftype_jclic", "ftype_clic",
"ftype_inst", "ftype_text", "ftype_unknown"};
public static final int[] T_CODES={
Constants.T_IMAGE, Constants.T_AUDIO, Constants.T_MIDI,
Constants.T_VIDEO, Constants.T_ANIM, Constants.T_XML, Constants.T_FONT, Constants.T_JCLIC, Constants.T_CLIC,
Constants.T_INST, Constants.T_TEXT, Constants.T_UNKNOWN_MEDIA
};
public static int getFileType(String fileName){
int result=TYPE_UNKNOWN;
if(fileName!=null){
int dot=fileName.lastIndexOf('.');
if(dot>0){
if(fileName.substring(0, dot).toLowerCase().endsWith(".jclic"))
dot-=6;
String fn=fileName.substring(dot).toLowerCase();
if(fn.equals(EXT_GIF) || fn.equals(EXT_JPG) || fn.equals(EXT_PNG) || fn.equals(EXT_BMP) || fn.equals(EXT_ICO))
result=TYPE_IMAGE;
else if(fn.equals(EXT_WAV) || fn.equals(EXT_AU) || fn.equals(EXT_MP3) || fn.equals(EXT_OGG) || fn.equals(EXT_AIFF))
result=TYPE_AUDIO;
else if(fn.equals(EXT_MID))
result=TYPE_MIDI;
else if(fn.equals(EXT_AVI) || fn.equals(EXT_MOV) || fn.equals(EXT_MPEG))
result=TYPE_VIDEO;
else if(fn.equals(EXT_SWF))
result=TYPE_ANIM;
else if(fn.equals(EXT_XML))
result=TYPE_XML;
else if(fn.equals(EXT_TTF))
result=TYPE_FONT;
else if(fn.equals(EXT_JCLIC) || fn.equals(EXT_JCLIC_ZIP))
result=TYPE_JCLIC;
else if(fn.equals(EXT_PAC) || fn.equals(EXT_PCC))
result=TYPE_CLIC;
else if(fn.equals(EXT_INSTALL))
result=TYPE_INST;
else if(fn.equals(EXT_TXT))
result=TYPE_TEXT;
}
}
return result;
}
public static javax.swing.ImageIcon getFileIcon(String forFileName){
String imgKey="icons/icounknown.png";
switch(getFileType(forFileName)){
case Utils.TYPE_AUDIO:
imgKey="icons/icowave.png";
break;
case Utils.TYPE_MIDI:
imgKey="icons/icomidi.png";
break;
case Utils.TYPE_ANIM:
case Utils.TYPE_VIDEO:
imgKey="icons/icomci.png";
break;
case Utils.TYPE_FONT:
imgKey="icons/icottf.png";
break;
case Utils.TYPE_XML:
imgKey="icons/icoxml.png";
break;
}
return edu.xtec.util.ResourceManager.getImageIcon(imgKey);
}
public static int getFileFilterCode(String forFileName){
int result=ALL_FF;
switch(getFileType(forFileName)){
case TYPE_IMAGE:
result=ALL_IMAGES_FF;
break;
case TYPE_AUDIO:
result=ALL_SOUNDS_FF;
break;
case TYPE_MIDI:
result=MIDI_FF;
break;
case TYPE_VIDEO:
result=ALL_VIDEO_FF;
break;
case TYPE_ANIM:
result=ALL_ANIM_FF;
break;
case TYPE_XML:
result=SKINS_FF;
break;
case TYPE_FONT:
result=FONTS_FF;
break;
case TYPE_JCLIC:
result=ALL_JCLIC_FF;
break;
case TYPE_CLIC:
result=ALL_CLIC_FF;
break;
case TYPE_INST:
result=INSTALL_FF;
break;
case TYPE_TEXT:
result=TEXT_FF;
break;
}
return result;
}
public static SimpleFileFilter getFileFilter(int fileFilterCode, edu.xtec.util.Messages msg){
if(fileFilterCode<0 || fileFilterCode>=NUM_FILE_FILTERS)
return null;
if(fileFilters[fileFilterCode]==null){
switch(fileFilterCode){
case JCLIC_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_JCLIC, msg.get("filefilter_jclic"));
break;
case JCLIC_ZIP_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_JCLIC_ZIP, msg.get("filefilter_jclic_zip"));
break;
case PAC_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_PAC, msg.get("filefilter_pac"));
break;
case PCC_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_PCC, msg.get("filefilter_pcc"));
break;
case ALL_JCLIC_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL_JCLIC, msg.get("filefilter_all_jclic"));
break;
case ALL_CLIC_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL_CLIC, msg.get("filefilter_all_clic"));
break;
case ALL_JCLIC_CLIC_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL_JCLIC_CLIC, msg.get("filefilter_all_jclic_clic"));
break;
case INSTALL_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_INSTALL, msg.get("filefilter_install"));
break;
case GIF_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_GIF, msg.get("filefilter_gif"));
break;
case JPG_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_JPG, msg.get("filefilter_jpg"));
break;
case PNG_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_PNG, msg.get("filefilter_png"));
break;
case ALL_IMAGES_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL_IMAGES, msg.get("filefilter_all_images"));
break;
case ALL_SOUNDS_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL_SOUNDS, msg.get("filefilter_all_sounds"));
break;
case MIDI_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_MID, msg.get("filefilter_midi"));
break;
case ALL_VIDEO_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL_VIDEO, msg.get("filefilter_all_video"));
break;
case ALL_ANIM_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL_ANIM, msg.get("filefilter_all_anim"));
break;
case SKINS_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_XML, msg.get("filefilter_skins"));
break;
case FONTS_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_TTF, msg.get("filefilter_fonts"));
break;
case ALL_MEDIA_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL_MEDIA, msg.get("filefilter_all_media"));
break;
case ALL_MULTIMEDIA_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL_MULTIMEDIA, msg.get("filefilter_all_media"));
break;
case ALL_HTML_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL_HTML, msg.get("filefilter_all_html"));
break;
case TEXT_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_TXT, msg.get("filefilter_text"));
break;
case ALL_FF:
fileFilters[fileFilterCode]=new SimpleFileFilter(EXT_ALL, msg.get("filefilter_all"));
break;
}
}
return fileFilters[fileFilterCode];
}
public static String[] getFileFilterExtensions(int fileFilterCode){
String[] result=null;
if(fileFilterCode>=0 && fileFilterCode<NUM_FILE_FILTERS){
switch(fileFilterCode){
case JCLIC_FF:
result=new String[]{EXT_JCLIC};
break;
case JCLIC_ZIP_FF:
result=new String[]{EXT_JCLIC_ZIP};
break;
case PAC_FF:
result=new String[]{EXT_PAC};
break;
case PCC_FF:
result=new String[]{EXT_PCC};
break;
case ALL_JCLIC_FF:
result=EXT_ALL_JCLIC;
break;
case ALL_CLIC_FF:
result=EXT_ALL_CLIC;
break;
case ALL_JCLIC_CLIC_FF:
result=EXT_ALL_JCLIC_CLIC;
break;
case INSTALL_FF:
result=new String[]{EXT_INSTALL};
break;
case GIF_FF:
result=new String[]{EXT_GIF};
break;
case JPG_FF:
result=new String[]{EXT_JPG};
break;
case PNG_FF:
result=new String[]{EXT_PNG};
break;
case ALL_IMAGES_FF:
result=EXT_ALL_IMAGES;
break;
case ALL_SOUNDS_FF:
result=EXT_ALL_SOUNDS;
break;
case MIDI_FF:
result=new String[]{EXT_MID};
break;
case ALL_VIDEO_FF:
result=EXT_ALL_VIDEO;
break;
case ALL_ANIM_FF:
result=EXT_ALL_ANIM;
break;
case SKINS_FF:
result=new String[]{EXT_XML};
break;
case FONTS_FF:
result=new String[]{EXT_TTF};
break;
case ALL_MEDIA_FF:
result=EXT_ALL_MEDIA;
break;
case ALL_MULTIMEDIA_FF:
result=EXT_ALL_MULTIMEDIA;
break;
case TEXT_FF:
result=new String[]{EXT_TXT};
break;
}
}
return result;
}
public static BufferedImage toBufferedImage(Image image, java.awt.Color bgColor, ImageObserver io) {
int w=image.getWidth(io);
int h=image.getHeight(io);
BufferedImage bufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics g = bufferedImage.createGraphics();
g.drawImage(image, 0, 0, bgColor, io);
g.dispose();
return bufferedImage;
}
public static void drawImage(Graphics g, Image img, Rectangle dest, Rectangle source, ImageObserver io){
if(g.getClip().intersects(dest)){
g.drawImage(img, dest.x, dest.y, dest.x+dest.width, dest.y+dest.height, source.x, source.y, source.x+source.width, source.y+source.height, io);
}
}
public static void tileImage(Graphics g, Image img, Rectangle dest, Rectangle source, ImageObserver io){
if(g.getClip().intersects(dest)){
int x, y;
Area saveClip=new Area(g.getClip());
Area newClip=new Area(saveClip);
newClip.intersect(new Area(dest));
g.setClip(newClip);
Rectangle floatDest=new Rectangle(dest.x, dest.y, source.width, source.height);
for(y=0; y<dest.height; y+=source.height){
for(x=0; x<dest.width; x+=source.width){
floatDest.setLocation(dest.x+x, dest.y+y);
drawImage(g, img, floatDest, source, io);
}
}
g.setClip(saveClip);
}
}
public static Point mapPointTo(Component srcCmp, Point offset, Component destCmp){
Point p=new Point();
try{
p=new Point(srcCmp.getLocationOnScreen());
} catch(IllegalComponentStateException ex){
// component is not visible!
}
p.x+=offset.x; p.y+=offset.y;
Point pd=new Point();
try{
pd=destCmp.getLocationOnScreen();
} catch(IllegalComponentStateException ex){
// component is not visible!
}
p.x-=pd.x; p.y-=pd.y;
return p;
}
public static void refreshAnimatedImage(Image img){
if(img!=null && (java.awt.Toolkit.getDefaultToolkit().checkImage(img, -1, -1, null) & ImageObserver.ALLBITS)!=0){
img.flush();
}
}
public static void checkRenderingHints(Options options){
if(DEFAULT_RENDERING_HINTS.isEmpty()){
if(options==null)
options=new Options();
boolean mac=options.getBoolean(Options.MAC);
boolean j14=options.getBoolean(Options.JAVA14);
boolean win=options.getBoolean(Options.WIN);
//DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);
if(win)
DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_DEFAULT);
//DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DEFAULT);
if(true)
DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
if(win)
DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
//DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT);
if(win)
DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
if(win)
DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}
}
public static long getTotalFreeMemory(){
Runtime r=Runtime.getRuntime();
return r.maxMemory()-r.totalMemory()+r.freeMemory();
}
// Low memory under 4Mb of free RAM
public static final long LOW_MEMORY_THRESHOLD=0x400000L;
public static boolean lowMemoryCondition(){
return getTotalFreeMemory()<LOW_MEMORY_THRESHOLD;
}
}