package utils;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.filechooser.FileSystemView;
public class Utilities{
private static final String LF = System.getProperty("line.separator");
private static Properties environmentVars;
/**
* Metoden anropar metoden setEnabled i en container och alla dess delkomponenter
*
* Metoden tar en container som inargument och loopar därefter igenom
* alla komponenter som den innehåller och om dessa underkomponenter också
* är containers så genomförs samma sak på dessa o.s.v.
*
*/
public static void enableComponents(Container cont, boolean enable){
Component comps[] = cont.getComponents();
for(int i = 0; i < comps.length; i ++){
comps[i].setEnabled(enable);
if(comps[i] instanceof Container){
enableComponents((Container)comps[i], enable);
}
}
}
/**
*
* Metoden set till att det finns suffix på filen
* om aktuellt suffix redan finns läggs inget till
*
*/
public static File assureFileSuffix(File file, String suffix){
if(file == null){
return file;
}
if(! file.getName().toUpperCase().endsWith(suffix.toUpperCase())){
file = new File(file.toString() + suffix);
}
return file;
}
/**
*
* Metoden tar bort suffix från filnamn
*
*/
public static File removeFileSuffix(File file){
if(file == null){
return file;
}
int endPos = file.toString().indexOf(".");
if(endPos > -1){
String newName = file.toString().substring(0, endPos);
file = new File(newName);
}
return file;
}
/**
* Metoden formaterar en Sträng till en byte-array som avslytas med siffran 0,
* (detta är ett lämpligt format att överföra textsträngar till c-program)
*
*/
public static byte[] stringToTerminatedByteArray(String inString){
if(inString == null){
return null;
}
byte[] temp = inString.getBytes();
byte[] chrStr = new byte[temp.length + 1];
System.arraycopy(temp, 0, chrStr, 0, temp.length);
return chrStr;
}
/**
*
* Metoden sparar en fil och låter användaren välja var med hjälp av en
* JFileChooser, metoden frågar vid eventuell ersättning och meddelar fel
*
* Metoden returnerar den fil som sparats, null om ingen sparats
*
*/
public static File saveFileViaChooser(File theFile, String suffix, InputStream fileStream, JFrame frame){
// Flagga som håller koll på om sparning lyckats
boolean fileSaved = false;
System.err.println("Inne i saveFileViaChooser");
// Skapa den panel som visas för användaren
JFileChooser fileChooser = new JFileChooser();
//fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
// Om inte suffix är specifierat använd eventuellt suffix som finns i filnamn
if(suffix == null){
suffix = Utilities.getFileSuffix(theFile);
}
System.err.println("Hit");
fileChooser.setFileSystemView(FileSystemView.getFileSystemView());
fileChooser.setSelectedFile(theFile);
while(fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION){
boolean shouldSaveFile = true;
theFile = fileChooser.getSelectedFile();
// Lägg eventuellt till suffix
theFile = Utilities.assureFileSuffix(theFile, suffix);
// Kolla om filen redan finns
if(theFile.exists()){
String question = theFile.toString() + "," + LF +
"finns redan, vill du ersätta den?";
int result = JOptionPane.showOptionDialog(frame,
question,
"Ersätt?",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
new Object[]{"Ja","Nej"},
"Nej"
);
// Användaren ville ej skriva över
if(result == JOptionPane.NO_OPTION){
shouldSaveFile = false;
}
else{
// Kolla om det går att skriva över filen
if(! theFile.canWrite()){
System.err.println("Kan inte skriva");
JOptionPane.showOptionDialog(frame,
"Det går inte att ersätta filen," + LF +
"den kanske används eller är skrivskyddad.",
"Går ej att ersätta",
JOptionPane.OK_OPTION,
JOptionPane.WARNING_MESSAGE,
null,
new Object[]{"Ok"},
"Ok"
);
shouldSaveFile = false;
}
}
}
// Spara filen
if(shouldSaveFile){
// This is where file is saved
// fileSaved = Utilities.saveStreamAsFile(fileStream, theFile);
if(fileSaved){
break;
}
else{
JOptionPane.showOptionDialog(frame,
"Det gick inte att spara filen," + LF +
"kanske det saknas rättigheter" + LF +
"eller den kanske används.",
"Går ej att spara",
JOptionPane.OK_OPTION,
JOptionPane.WARNING_MESSAGE,
null,
new Object[]{"Ok"},
"Ok"
);
}
}
}
if(fileSaved){
return theFile;
}
else{
return null;
}
}
/**
*
* Metoden returnerar den inloggade användarens hemkatalog
*
*/
public static String getUserDir(){
String userdir;
// Försök hitta en lämplig katalog att spara i
userdir = Utilities.getEnv("HOMEDRIVE") + Utilities.getEnv("HOMEPATH");
if(userdir == null){
userdir = System.getProperty("user.dir");
}
if(userdir == null){
userdir = System.getProperty("user.home");
}
if(userdir == null){
userdir = System.getProperty("java.io.tmpdir");
}
if(userdir == null){
userdir = "";
}
return userdir;
}
/**
*
* Metoden returnerar innehållet i en specifierad miljövariabel
*
*/
public static String getEnv(String env){
// Försök först att hämta med native-funktion
String envVarValue = null;
System.err.println("(env)" + env + "=" + envVarValue);
// Om den returnerade null så fungerade ej native-funktionen
if(envVarValue == null){
if(environmentVars == null){
environmentVars = new Properties();
try {
InputStream is = Runtime.getRuntime().exec("cmd /c set").getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
// read output from subprogram
while(true){
String inLine = br.readLine();
if(inLine == null){
break;
}
// dela upp vid =
String property = inLine.substring(0, inLine.indexOf('='));
String value = inLine.substring(inLine.indexOf('=') + 1);
environmentVars.setProperty(property, value);
}
br.close();
/*
environmentVars.load();
environmentVars.list(new PrintStream(System.out));
*/
}
catch(IOException e) {
e.printStackTrace();
}
}
envVarValue = environmentVars.getProperty(env);
}
return envVarValue;
}
/**
*
* Metoden kör ett program
*
*/
public static void runProgram(String programName, String parameters) throws Exception{
String command = "";
// Kommandot som skall utföras är olika beroende på OS
String os = System.getProperty("os.name");
if("Windows 95".equalsIgnoreCase(os) ||
"Windows ME".equalsIgnoreCase(os) ||
"Windows 98".equalsIgnoreCase(os)){
command = "start " + programName + " " + parameters;
}
else{
command = "cmd /c start " + programName + " " + parameters;
}
// Kör kommandot
Runtime.getRuntime().exec(command);
}
/**
*
* Metoden byter font för programmets alla komponenter
*
* Denna metod byter endast på komponenter som ej ännu skapats
*
*/
public static void adjustFonts(String fontName, int fontSize) {
UIDefaults defaults = UIManager.getDefaults();
Vector newDefaults = new Vector();
for ( Enumeration e = defaults.keys(); e.hasMoreElements(); ) {
Object key = e.nextElement();
Object value = defaults.getFont( key );
if ( value != null ) {
Font oldFont = (Font) value;
Font newFont = new Font( fontName,
Font.PLAIN , fontSize ); //oldFont.getStyle()
newDefaults.add( key );
newDefaults.add( newFont );
}
}
defaults.putDefaults( newDefaults.toArray() );
}
/**
*
* Metoden byter ut en färg för programmets alla komponenter
*
* Denna metod byter endast på komponenter som ej ännu skapats
*
*/
public static void adjustColors(Color oldColor, Color newColor) {
UIDefaults defaults = UIManager.getDefaults();
Vector newDefaults = new Vector();
for ( Enumeration e = defaults.keys(); e.hasMoreElements(); ) {
Object key = e.nextElement();
Object value = defaults.getColor( key );
if ( value != null ) {
Color defaultColor = (Color) value;
System.err.println(key + " R=" + defaultColor.getRed() + " G=" + defaultColor.getGreen() + " B=" + defaultColor.getBlue() + " A=" + defaultColor.getAlpha());
if(oldColor.equals(defaultColor)){
Color newDefaultColor = new Color(newColor.getRGB());
newDefaults.add( key );
newDefaults.add( newDefaultColor );
}
}
}
defaults.putDefaults( newDefaults.toArray() );
}
/**
*
* Metoden returnerar filsuffix (bokstäver efter sista "." i en fil
*
*
*/
public static String getFileSuffix(File file){
String suffix = "";
String fileName = file.toString();
int pos = fileName.lastIndexOf(".");
// Om det fanns ett suffix
if(pos > -1){
suffix = fileName.substring(pos);
}
return suffix;
}
/**
*
* Metoden returnerar huruvide det är möjligt att skriva en fil, denna behövs
* då filmetoden canWrite() endast fungerar för dos-filattribut.
* Metoden försöker skapa filen, om det går returneras sant och filen tas bort
*
*/
public static boolean isWritePossible(File testFile){
if(testFile == null){
return false;
}
try{
FileOutputStream fileOutStream = new FileOutputStream(testFile);
fileOutStream.close();
}catch(IOException ioe){
ioe.printStackTrace();
return false;
}
testFile.delete();
return true;
}
/**
*
* Metoden returnerar en nummerformaterare som är justerad så att det
* alltid används punkt . som decimalsymbol istället för ,
*
*/
public static NumberFormat getNumberInstance(){
NumberFormat nf = NumberFormat.getNumberInstance();
if(nf instanceof DecimalFormat){
DecimalFormat df = (DecimalFormat) nf;
DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
dfs.setDecimalSeparator('.');
df.setDecimalFormatSymbols(dfs);
}
return nf;
}
/**
*
* Metoden byter ut komman mot punkter
*
*/
public static String adjustDecimalSymbol(String input){
if(input == null){
return null;
}
// Byt ut , till .
String output = input.replace(',','.');
return output;
}
}