/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.prefs;
import java.io.File;
import java.io.FileInputStream;
import java.util.Hashtable;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.foundation.DataModification;
import org.openflexo.foundation.FlexoObservable;
import org.openflexo.foundation.FlexoObserver;
import org.openflexo.inspector.AbstractController;
import org.openflexo.inspector.HelpDelegate;
import org.openflexo.inspector.InspectableObject;
import org.openflexo.inspector.InspectingWidget;
import org.openflexo.inspector.InspectorDelegate;
import org.openflexo.inspector.InspectorModelView;
import org.openflexo.inspector.InspectorWidgetConfiguration;
import org.openflexo.inspector.model.InspectorMapping;
import org.openflexo.inspector.model.InspectorModel;
import org.openflexo.inspector.model.TabModel;
import org.openflexo.inspector.selection.InspectorSelection;
import org.openflexo.module.UserType;
import org.openflexo.view.controller.FlexoInspectorController;
import org.openflexo.xmlcode.XMLCoder;
import org.openflexo.xmlcode.XMLDecoder;
/**
* Controller dedicated to preferences: there is only one instance of this controller
*
* @author sguerin
*/
public class PreferencesController implements FlexoObserver, AbstractController, InspectingWidget {
private static final Logger logger = Logger.getLogger(PreferencesController.class.getPackage().getName());
// ==========================================================================
// ============================= Instance Variables
// =========================
// ==========================================================================
private Vector<String> _multiValuesAttributes;
private Hashtable<String, String> _propertyListAttributes;
private static PreferencesController _current;
private InspectorModelView _inpectorPanel;
private InspectorModel _inspector;
private PreferencesWindow _preferencesWindow;
private FlexoPreferences _prefs;
private InspectorWidgetConfiguration inspectorConfiguration;
// ==========================================================================
// ============================= Constructor
// ================================
// ==========================================================================
protected PreferencesController(FlexoPreferences prefs) throws Exception {
super();
_multiValuesAttributes = new Vector<String>();
_propertyListAttributes = new Hashtable<String, String>();
_inspector = new InspectorModel();
_inspector.title = "Preferences";
_prefs = prefs;
prefs.addObserver(this);
}
private static PreferencesController createInstance(FlexoPreferences prefs) {
try {
_current = new PreferencesController(prefs);
for (ContextPreferences next : prefs.contextualPreferences.values()) {
_current.importInspectorFile(next.getName(), next.getInspectorFile());
}
} catch (Exception e) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning(e.getMessage());
}
e.printStackTrace();
return null;
}
return _current;
}
public static PreferencesController instance() {
if (_current == null) {
createInstance(FlexoPreferences.instance());
}
return _current;
}
public static boolean hasInstance() {
return _current != null;
}
public static void register(ContextPreferences cp) {
instance().importInspectorFile(cp.getName(), cp.getInspectorFile());
}
public boolean importInspectorFile(String name, File inspectorFile) {
try {
if (InspectorMapping.getInstance() != null) {
TabModel tabModel = (TabModel) XMLDecoder.decodeObjectWithMapping(new FileInputStream(inspectorFile),
InspectorMapping.getInstance(), instance());
tabModel.name = name;
tabModel.index = new Integer(index);
index++;
importInspector(name, tabModel);
if (logger.isLoggable(Level.FINER)) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Importing preferences inspector:\n"
+ XMLCoder.encodeObjectWithMapping(tabModel, InspectorMapping.getInstance()));
}
}
return true;
}
} catch (Exception e) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Exception raised during inspector import: " + e);
}
e.printStackTrace();
}
return false;
}
private int index = 1;
public boolean importInspector(String name, TabModel inspectorTab) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Importing preferences inspector at index " + inspectorTab.index);
}
_inspector.getTabs().put(inspectorTab.index, inspectorTab);
FlexoInspectorController.cleanInspectorModel(_inspector);
rebuildTabPanel();
return true;
}
public void showPreferences() {
getPreferencesWindow(true);
update();
getPreferencesWindow().setVisible(true);
}
public void resetWindow() {
if (_preferencesWindow != null) {
_preferencesWindow.reset();
}
}
public PreferencesWindow getPreferencesWindow() {
return getPreferencesWindow(true);
}
public PreferencesWindow getPreferencesWindow(boolean create) {
if (_preferencesWindow == null && create) {
_preferencesWindow = new PreferencesWindow();
}
return _preferencesWindow;
}
// ==========================================================================
// ============================= Observer
// ===================================
// ==========================================================================
@Override
public void update(FlexoObservable arg0, DataModification arg1) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("update in PreferencesController with " + arg0 + " and " + arg1);
}
if (arg1 instanceof PreferencesHaveChanged) {
// Nothing special for now
}
if (_preferencesWindow != null) {
_preferencesWindow.setTabPanel(getInspectorTabPanel());
_preferencesWindow.enableSaveAndRevertButtons();
}
}
public void update() {
update(_prefs, null);
}
// ==========================================================================
// ============================= Instance Methods
// ===========================
// ==========================================================================
public void addToPropertyListAttributes(String name, String pListName) {
_propertyListAttributes.put(name, pListName);
}
public void addToMultiValuesAttributes(String name) {
_multiValuesAttributes.add(name);
}
public boolean isPropertyListAttribute(String attName) {
return _propertyListAttributes.contains(attName);
}
public boolean isMultiValuesAttribute(String attName) {
return _multiValuesAttributes.contains(attName);
}
public String propListNameForAttName(String attName) {
return _propertyListAttributes.get(attName);
}
private InspectorModelView getInspectorTabPanel() {
if (_inpectorPanel == null) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Building new InspectorModelView");
}
_inpectorPanel = new InspectorModelView(getInspectorModel(), this);
_inpectorPanel.setInspectedObject(_prefs);
}
return _inpectorPanel;
}
private InspectorModelView rebuildTabPanel() {
if (logger.isLoggable(Level.FINE)) {
logger.fine("rebuildTabPanelForInspectable()");
}
FlexoInspectorController.cleanInspectorModel(getInspectorModel());
_inpectorPanel = new InspectorModelView(getInspectorModel(), this);
_inpectorPanel.setInspectedObject(_prefs);
update();
return _inpectorPanel;
}
public InspectorModel getInspectorModel() {
if (logger.isLoggable(Level.FINER)) {
if (logger.isLoggable(Level.FINE)) {
logger.finer(_inspector.toString());
}
}
return _inspector;
}
@Override
public InspectorDelegate getDelegate() {
// Handle object with key-value coding
return null;
}
@Override
public HelpDelegate getHelpDelegate() {
// No help for this kind of controller
return null;
}
@Override
public void notifiedActiveTabChange(String newActiveTabName) {
// Dont care
}
@Override
public void notifiedInspectedObjectChange(InspectableObject newInspectedObject) {
// Dont care
}
@Override
public PreferencesController getController() {
return this;
}
@Override
public void newSelection(InspectorSelection selection) {
// TODO Auto-generated method stub
}
@Override
public boolean isTabPanelVisible(TabModel tab, InspectableObject inspectable) {
return true;
}
@Override
public InspectorWidgetConfiguration getConfiguration() {
if (inspectorConfiguration == null) {
inspectorConfiguration = new InspectorWidgetConfiguration() {
@Override
public boolean showViewSourceButtonInWysiwyg() {
return UserType.isDevelopperRelease() || UserType.isMaintainerRelease();
}
};
}
return null;
}
@Override
public boolean handleException(InspectableObject inspectable, String propertyName, Object value, Throwable exception) {
// TODO Auto-generated method stub
return false;
}
}