package com.idega.idegaweb;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
import com.idega.repository.data.Instantiator;
import com.idega.repository.data.Singleton;
import com.idega.repository.data.SingletonRepository;
import com.idega.util.FileUtil;
import com.idega.util.text.TextSoap;
/**
* <p>Title: IdegaWeb Style Manager</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: idega</p>
* @author <a href="mailto:laddi@idega.is">Þórhallur "Laddi" Helgason</a>
* @version 1.1
*/
public class IWStyleManager implements Singleton {
private static Instantiator instantiator = new Instantiator() { public Object getInstance() { return new IWStyleManager();}};
private static String PROPERTY_WRITE_FILE = "IW_STYLEMANAGER_WRITEFILE";
public IWStyleManager() {
// empty
}
private Map map;
private File file;
public static final String[] defaultStyles = { "A", "A:hover", "body", "table", "form", "img" };
/**
* A method to get an instance of this class.
*
* @return An instance of the IWStyleManager class.
*/
public static IWStyleManager getInstance() {
return (IWStyleManager) SingletonRepository.getRepository().getInstance(IWStyleManager.class, instantiator);
}
public void getStyleSheet(IWMainApplication application) {
if ( application != null ) {
String URL = application.getApplicationRealPath() + FileUtil.getFileSeparator() + "idegaweb" + FileUtil.getFileSeparator() + "style" + FileUtil.getFileSeparator() + "style.css";
String lines = null;
try {
this.file = FileUtil.getFileAndCreateRecursiveIfNotExists(URL);
}
catch (IOException e) {
this.file = null;
}
try {
lines = FileUtil.getStringFromFile(URL);
}
catch (IOException e) {
lines = null;
}
if (lines != null) {
getStylesFromFile(lines);
addDefaultValues();
}
}
}
private void addDefaultValues() {
if (!isStyleSet(defaultStyles[0])) {
setStyle(defaultStyles[0], IWConstants.LINK_STYLE);
}
if (!isStyleSet(defaultStyles[1])) {
setStyle(defaultStyles[1], IWConstants.LINK_HOVER_STYLE);
}
if (!isStyleSet(defaultStyles[2])) {
setStyle(defaultStyles[2], IWConstants.BODY_STYLE);
}
if (!isStyleSet(defaultStyles[3])) {
setStyle(defaultStyles[3], IWConstants.BODY_STYLE);
}
if (!isStyleSet(defaultStyles[4])) {
setStyle(defaultStyles[4], IWConstants.FORM_STYLE);
}
if (!isStyleSet(defaultStyles[5])) {
setStyle(defaultStyles[5], IWConstants.IMAGE_STYLE);
}
writeStyleSheet();
}
public void setStyle(String name, String style) {
if ( name.length() > 0 ) {
getStyleMap().put(name, style != null ? style : "");
writeStyleSheet();
}
}
public String getStyle(String name) {
return (String) getStyleMap().get(name);
}
public void removeStyle(String name) {
getStyleMap().remove(name);
writeStyleSheet();
}
public boolean isStyleSet(String name) {
return getStyleMap().containsKey(name);
}
private void getStylesFromFile(String lines) {
StringTokenizer tokenizer = new StringTokenizer(lines, "}");
while (tokenizer.hasMoreTokens()) {
String style = tokenizer.nextToken();
int index = style.indexOf("{");
if (index != -1) {
String styleName = style.substring(0, index).trim();
styleName = TextSoap.findAndCut(styleName, ".");
String styleParameter = "";
if (style.indexOf(";") != -1) {
StringTokenizer tokens = new StringTokenizer(style.substring(index + 1), ";");
while (tokens.hasMoreTokens()) {
String parameter = tokens.nextToken();
index = parameter.indexOf(":");
if (index != -1) {
String parameterName = parameter.substring(0, index).trim();
parameterName = TextSoap.findAndReplace(parameterName, "\n", "");
parameterName = TextSoap.findAndReplace(parameterName, "\t", "");
String parameterValue = parameter.substring(index + 1);
parameterValue = TextSoap.findAndReplace(parameterValue, "\n", "");
parameterValue = TextSoap.findAndReplace(parameterValue, "\t", "");
String paramValue = "";
StringTokenizer params = new StringTokenizer(parameterValue, " ");
while (params.hasMoreTokens()) {
String value = params.nextToken().trim();
paramValue += value;
if (params.hasMoreTokens()) {
paramValue += " ";
}
}
styleParameter += parameterName + ":" + paramValue + ";";
}
}
}
setStyle(styleName, styleParameter);
}
}
}
/**
* Gets if the stylesheet file should be written down -
* this is now default disabled on ePlatform 3.0
* @return
*/
public boolean shouldWriteDownFile(){
IWMainApplication iwma = IWMainApplication.getDefaultIWMainApplication();
return iwma.getSettings().getBoolean(PROPERTY_WRITE_FILE);
}
public void writeStyleSheet() {
if(shouldWriteDownFile()){
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(this.file));
Iterator iter = getStyleMap().keySet().iterator();
while (iter.hasNext()) {
String name = (String) iter.next();
String style = getStyle(name);
if ( !isDefaultStyle(name) && name.indexOf(".") == -1 ) {
name = "." + name;
}
String writeString = name + " {";
writer.write(writeString, 0, writeString.length());
writer.newLine();
if (style != null && style.length() > 0 ) {
StringTokenizer tokens = new StringTokenizer(style, ";");
while (tokens.hasMoreTokens()) {
writeString = "\t" + tokens.nextToken() + ";";
writer.write(writeString, 0, writeString.length());
writer.newLine();
}
}
writeString = "}";
writer.write(writeString, 0, writeString.length());
writer.newLine();
if (iter.hasNext()) {
writer.newLine();
}
}
writer.flush();
writer.close();
}
catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
private Map getStyleMap() {
if ( this.map == null ) {
this.map = new LinkedHashMap();
}
return this.map;
}
public List getStyleList() {
List list = new Vector();
if (this.map != null) {
Iterator iter = getStyleMap().keySet().iterator();
while (iter.hasNext()) {
String name = (String) iter.next();
if (name.length() > 0) {
if (name.indexOf(".") != -1) {
name = name.substring(name.indexOf(".") + 1);
}
list.add(name);
}
}
}
return list;
}
private boolean isDefaultStyle(String styleName) {
for (int a = 0; a < defaultStyles.length; a++) {
if (defaultStyles[a].equalsIgnoreCase(styleName)) {
return true;
}
}
return false;
}
}