/* Copyright (C) 2006 Christian Schneider * * This file is part of Nomad. * * Nomad 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. * * Nomad 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 Nomad; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* * Created on Jan 21, 2007 */ package net.sf.nmedit.jtheme; import java.awt.Image; import javax.swing.JComponent; import javax.swing.UIDefaults; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import net.sf.nmedit.jtheme.cable.CableRenderer; import net.sf.nmedit.jtheme.cable.JTCableManagerImpl; import net.sf.nmedit.jtheme.cable.ShadowCableRenderer; import net.sf.nmedit.jtheme.component.JTComponent; import net.sf.nmedit.jtheme.component.JTKnob; import net.sf.nmedit.jtheme.component.JTLabel; import net.sf.nmedit.jtheme.component.JTLight; import net.sf.nmedit.jtheme.component.JTModuleContainer; import net.sf.nmedit.jtheme.component.JTSlider; import net.sf.nmedit.jtheme.component.plaf.mcui.JTModuleContainerUI; import net.sf.nmedit.jtheme.store.StorageContext; public abstract class JTContext { public static final String UIDefaultsClassLoaderKey = "ClassLoader"; private final Object lock = new Object(); public final Object getLock() { return lock; } private static transient Log _log; protected static Log getLogger() { if (_log == null) _log = LogFactory.getLog(JTContext.class); return _log; } public abstract UIDefaults getUIDefaults(); public abstract Image getImage(String key); public abstract boolean hasModuleContainerOverlay(); public abstract Class[] getComponentClasses(); public abstract StorageContext getStorageContext(); public static final String TYPE_KNOB = "knob"; public static final String TYPE_SLIDER = "slider"; public static final String TYPE_LABEL = "label"; public static final String TYPE_IMAGE = "image"; public static final String TYPE_MODULE = "module"; public static final String TYPE_CONNECTOR = "connector"; public static final String TYPE_BUTTONS = "buttons"; public static final String TYPE_TEXTDISPLAY = "textDisplay"; public static final String TYPE_LIGHT = "light"; // TODO does not belong here - nm1 specific public static final String TYPE_RESET_BUTTON = "resetButton"; public JTPopupHandler getPopupHandler(JTComponent component) { return null; } public JTKnob createKnob() throws JTException { return (JTKnob) createComponent(TYPE_KNOB); } public JTLight createLight() throws JTException { return (JTLight) createComponent(TYPE_LIGHT); } public JTLabel createLabel() throws JTException { return (JTLabel) createComponent(TYPE_LABEL); } public JTSlider createSlider() throws JTException { return (JTSlider) createComponent(TYPE_SLIDER); } public abstract Class<? extends JTComponent> getComponentType(String type); public abstract JTComponent createComponent(String type) throws JTException; public static boolean hasUIClass(JComponent component, UIDefaults defaults) { String uiClassID = component.getUIClassID(); if (uiClassID == null) return false; Object cl = defaults.get(UIDefaultsClassLoaderKey); ClassLoader uiClassLoader = (cl != null) ? (ClassLoader)cl : component.getClass().getClassLoader(); Class uiClass = defaults.getUIClass(uiClassID, uiClassLoader); return uiClass != null; } /* public static boolean hasUIClass(JComponent component, UIDefaults defaults) { return component.getUIClassID() != null; }*/ public void setUIDefaultsClassLoader(ClassLoader loader) { Log log = getLogger(); if (log.isInfoEnabled()) { Class<?> loaderClass = loader == null ? null : loader.getClass(); log.info("Setting UIDefaults ClassLoader in "+this+": "+loader+" ("+loaderClass+")"); } getUIDefaults().put(UIDefaultsClassLoaderKey, loader); } public ClassLoader getUIDefaultsClassLoader() { Object loader = getUIDefaults().get(UIDefaultsClassLoaderKey); if (loader == null || !(loader instanceof ClassLoader)) return null; else return (ClassLoader) loader; } public <T extends JTComponent> T createComponentInstance(Class<T> clazz) throws JTException { T component; try { component = clazz .getConstructor(new Class<?>[] {JTContext.class}) .newInstance(new Object[] {this}); UIDefaults defaults = getUIDefaults(); if (hasUIClass(component, defaults)) { component.setUI(defaults.getUI(component)); } } catch (Throwable t) { JTException e = new JTException("could not create instance of "+clazz); e.initCause(t); throw e; } return component; } protected CableRenderer createDefaultCableRenderer() { ShadowCableRenderer renderer = new ShadowCableRenderer(); renderer.setAntialiasingEnabled(true); renderer.setShadowsEnabled(true); return renderer; } private transient CableRenderer cachedCableRenderer; protected CableRenderer getCableRenderer() { if (cachedCableRenderer == null) cachedCableRenderer = createDefaultCableRenderer(); return cachedCableRenderer; } public JTModuleContainer createModuleContainer() throws JTException { JTModuleContainer moduleContainer = new JTModuleContainer(this, new JTCableManagerImpl(getCableRenderer())); installUI(moduleContainer); return moduleContainer; } private void installUI(JTModuleContainer moduleContainer) { UIDefaults defaults = getUIDefaults(); //if (hasUIClass(moduleContainer, defaults)) { moduleContainer.setUI((JTModuleContainerUI)defaults.getUI(moduleContainer)); } } public boolean isDnDAllowed() { return false; } }