/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ro.nextreports.designer.util;
import javax.swing.*;
import java.util.prefs.Preferences;
import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
/**
* Created by IntelliJ IDEA.
* User: mihai.panaitescu
* Date: May 11, 2006
* Time: 3:12:26 PM
*/
public class ReporterPreferencesManager {
private static final String NO_MAIN_CLASS_MSG = "main class cannot be null";
private static final String NO_USERNAME_MSG = "username cannot be null";
private static final String LAF_KEY = "L&F";
private static final String LAF_THEME_KEY = "L&F theme";
private static final String BOUNDS_KEY = "bounds";
public static final String JAR_PATH_KEY = "JAR_PATH";
public static final String TEMPLATE_PATH_KEY = "TEMPLATE_PATH";
public static final String IMAGE_PATH_KEY = "IMAGE_PATH";
public static final String SHOW_AT_STARTUP = "SHOW_STARTUP";
public static final String LAST_SERVER = "LAST_SERVER";
public static final String SERVER_AUTH = "SERVER_AUTH";
public static final String REMEMBER_AUTH = "REMEMBER_AUTH";
public static final String NEXT_REPORT_SPATH = "NEXT_REPORT_SPATH";
public static final String NEXT_REPORT_EXPORT_PATH = "NEXT_REPORT_EXPORT_PATH";
public static final String NEXT_REPORT_IMPORT_PATH = "NEXT_REPORT_IMPORT_PATH";
public static final String INIT_DATE = "INIT_DATE";
public static final String SURVEY_DAY = "SURVEY_DAY";
private Class mainClass;
private String userName;
private String defaultLaf;
private String defaultLafTheme;
private static ReporterPreferencesManager instance;
public static synchronized ReporterPreferencesManager getInstance() {
if (instance == null) {
instance = new ReporterPreferencesManager();
}
return instance;
}
private ReporterPreferencesManager() {
}
public Class getMainClass() {
return mainClass;
}
public void setMainClass(Class mainClass) {
this.mainClass = mainClass;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getDefaultLookAndFeel() {
return (defaultLaf != null) ? defaultLaf : UIManager.getSystemLookAndFeelClassName();
}
public void setDefaultLookAndFeel(String defaultLaf) {
this.defaultLaf = defaultLaf;
}
public String getDefaultLookAndFeelTheme() {
return defaultLafTheme;
}
public void setDefaultLookAndFeelTheme(String defaultLafTheme) {
this.defaultLafTheme = defaultLafTheme;
}
public String loadParameter(String key) {
if (mainClass == null) {
throw new IllegalStateException(NO_MAIN_CLASS_MSG);
}
if (userName == null) {
throw new IllegalStateException(NO_USERNAME_MSG);
}
Preferences prefs = Preferences.userNodeForPackage(mainClass).node(userName);
return prefs.get(key, null);
}
public void storeParameter(String key, String path) {
if (mainClass == null) {
throw new IllegalStateException(NO_MAIN_CLASS_MSG);
}
if (userName == null) {
throw new IllegalStateException(NO_USERNAME_MSG);
}
Preferences prefs = Preferences.userNodeForPackage(mainClass).node(userName);
prefs.put(key, path);
}
public String loadLookAndFeelClassName() {
if (mainClass == null) {
throw new IllegalStateException(NO_MAIN_CLASS_MSG);
}
if (userName == null) {
throw new IllegalStateException(NO_USERNAME_MSG);
}
Preferences prefs = Preferences.userNodeForPackage(mainClass).node(userName);
return prefs.get(LAF_KEY, getDefaultLookAndFeel());
}
public void storeLookAndFeelClassName(String laf) {
if (mainClass == null) {
throw new IllegalStateException(NO_MAIN_CLASS_MSG);
}
if (userName == null) {
throw new IllegalStateException(NO_USERNAME_MSG);
}
Preferences prefs = Preferences.userNodeForPackage(mainClass).node(userName);
prefs.put(LAF_KEY, laf);
}
public String loadLookAndFeelThemeClassName() {
if (mainClass == null) {
throw new IllegalStateException(NO_MAIN_CLASS_MSG);
}
if (userName == null) {
throw new IllegalStateException(NO_USERNAME_MSG);
}
Preferences prefs = Preferences.userNodeForPackage(mainClass).node(userName);
return prefs.get(LAF_THEME_KEY, getDefaultLookAndFeelTheme());
}
public void storeLookAndFeelThemeClassName(String theme) {
if (mainClass == null) {
throw new IllegalStateException(NO_MAIN_CLASS_MSG);
}
if (userName == null) {
throw new IllegalStateException(NO_USERNAME_MSG);
}
Preferences prefs = Preferences.userNodeForPackage(mainClass).node(userName);
prefs.put(LAF_THEME_KEY, theme);
}
public Rectangle loadBoundsForWindow(Class cls) {
if (userName == null) {
throw new IllegalStateException(NO_USERNAME_MSG);
}
Preferences prefs = Preferences.userNodeForPackage(cls).node(userName);
return (Rectangle) bytes2Object(prefs.getByteArray(getKey(cls, BOUNDS_KEY), null));
}
public void storeBoundsForWindow(Class cls, Rectangle rect) {
if (userName == null) {
throw new IllegalStateException(NO_USERNAME_MSG);
}
Preferences prefs = Preferences.userNodeForPackage(cls).node(userName);
prefs.putByteArray(getKey(cls, BOUNDS_KEY), object2Bytes(rect));
}
private String getKey(Class cls, String append) {
int dotIndex = cls.getName().lastIndexOf('.');
String shortClsName = cls.getName().substring(dotIndex + 1);
return shortClsName + " " + append;
}
private static byte[] object2Bytes(Object o) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(o);
return baos.toByteArray();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
private static Object bytes2Object(byte raw[]) {
if (raw == null) {
return null;
}
ByteArrayInputStream bais = new ByteArrayInputStream(raw);
try {
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
}