/*
* JAME 6.2.1
* http://jame.sourceforge.net
*
* Copyright 2001, 2016 Andrea Medeghini
*
* This file is part of JAME.
*
* JAME is an application for creating fractals and other graphics artifacts.
*
* JAME 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.
*
* JAME 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 JAME. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.sf.jame.twister.swing;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import net.sf.jame.core.extension.Extension;
import net.sf.jame.core.extension.ExtensionConfig;
import net.sf.jame.core.extension.ExtensionException;
import net.sf.jame.core.util.RenderContext;
import net.sf.jame.twister.TwisterConfig;
import net.sf.jame.twister.effect.EffectConfigElement;
import net.sf.jame.twister.effect.extension.EffectExtensionConfig;
import net.sf.jame.twister.frame.FrameConfigElement;
import net.sf.jame.twister.frameFilter.FrameFilterConfigElement;
import net.sf.jame.twister.frameFilter.extension.FrameFilterExtensionConfig;
import net.sf.jame.twister.image.ImageConfigElement;
import net.sf.jame.twister.image.extension.ImageExtensionConfig;
import net.sf.jame.twister.layer.GroupLayerConfigElement;
import net.sf.jame.twister.layer.ImageLayerConfigElement;
import net.sf.jame.twister.layerFilter.LayerFilterConfigElement;
import net.sf.jame.twister.layerFilter.extension.LayerFilterExtensionConfig;
import net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime;
import net.sf.jame.twister.swing.inputAdapter.extension.InputAdapterExtensionRuntime;
import net.sf.jame.twister.util.AdapterContext;
/**
* @author Andrea Medeghini
*/
public class DefaultInputAdapter extends InputAdapter {
private final RenderContext renderContext;
private final TwisterConfig config;
/**
* @param renderContext
* @param config
*/
public DefaultInputAdapter(final RenderContext renderContext, final TwisterConfig config) {
this.renderContext = renderContext;
this.config = config;
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#keyPressed(java.awt.event.KeyEvent)
*/
@Override
public void keyPressed(final KeyEvent e) {
processEvent(e, new EventProcessor<KeyEvent>() {
public void process(final InputAdapterExtensionRuntime adapterRuntime, final KeyEvent e) {
adapterRuntime.processKeyPressed(e);
}
});
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#keyReleased(java.awt.event.KeyEvent)
*/
@Override
public void keyReleased(final KeyEvent e) {
processEvent(e, new EventProcessor<KeyEvent>() {
public void process(final InputAdapterExtensionRuntime adapterRuntime, final KeyEvent e) {
adapterRuntime.processKeyReleased(e);
}
});
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#keyTyped(java.awt.event.KeyEvent)
*/
@Override
public void keyTyped(final KeyEvent e) {
processEvent(e, new EventProcessor<KeyEvent>() {
public void process(final InputAdapterExtensionRuntime adapterRuntime, final KeyEvent e) {
adapterRuntime.processKeyTyped(e);
}
});
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#mouseClicked(java.awt.event.MouseEvent)
*/
@Override
public void mouseClicked(final MouseEvent e) {
processEvent(e, new EventProcessor<MouseEvent>() {
public void process(final InputAdapterExtensionRuntime adapterRuntime, final MouseEvent e) {
adapterRuntime.processMouseClicked(e);
}
});
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#mouseDragged(java.awt.event.MouseEvent)
*/
@Override
public void mouseDragged(final MouseEvent e) {
processEvent(e, new EventProcessor<MouseEvent>() {
public void process(final InputAdapterExtensionRuntime adapterRuntime, final MouseEvent e) {
adapterRuntime.processMouseDragged(e);
}
});
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#mouseEntered(java.awt.event.MouseEvent)
*/
@Override
public void mouseEntered(final MouseEvent e) {
processEvent(e, new EventProcessor<MouseEvent>() {
public void process(final InputAdapterExtensionRuntime adapterRuntime, final MouseEvent e) {
adapterRuntime.processMouseExited(e);
}
});
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#mouseExited(java.awt.event.MouseEvent)
*/
@Override
public void mouseExited(final MouseEvent e) {
processEvent(e, new EventProcessor<MouseEvent>() {
public void process(final InputAdapterExtensionRuntime adapterRuntime, final MouseEvent e) {
adapterRuntime.processMouseEntered(e);
}
});
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#mouseMoved(java.awt.event.MouseEvent)
*/
@Override
public void mouseMoved(final MouseEvent e) {
processEvent(e, new EventProcessor<MouseEvent>() {
public void process(final InputAdapterExtensionRuntime adapterRuntime, final MouseEvent e) {
adapterRuntime.processMouseMoved(e);
}
});
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#mousePressed(java.awt.event.MouseEvent)
*/
@Override
public void mousePressed(final MouseEvent e) {
processEvent(e, new EventProcessor<MouseEvent>() {
public void process(final InputAdapterExtensionRuntime adapterRuntime, final MouseEvent e) {
adapterRuntime.processMousePressed(e);
}
});
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#mouseReleased(java.awt.event.MouseEvent)
*/
@Override
public void mouseReleased(final MouseEvent e) {
processEvent(e, new EventProcessor<MouseEvent>() {
public void process(final InputAdapterExtensionRuntime adapterRuntime, final MouseEvent e) {
adapterRuntime.processMouseReleased(e);
}
});
}
/**
* @see net.sf.jame.twister.swing.InputAdapter#refresh()
*/
@Override
public void refresh() {
final FrameConfigElement frameElement = config.getFrameConfigElement();
if (frameElement != null) {
final int groupLayerCount = frameElement.getLayerConfigElementCount();
for (int i = 0; i < groupLayerCount; i++) {
final GroupLayerConfigElement groupLayerElement = frameElement.getLayerConfigElement(i);
if (!groupLayerElement.isLocked() && groupLayerElement.isVisible()) {
final int imageLayerCount = groupLayerElement.getLayerConfigElementCount();
for (int j = 0; j < imageLayerCount; j++) {
final ImageLayerConfigElement imageLayerElement = groupLayerElement.getLayerConfigElement(j);
if (!imageLayerElement.isLocked() && imageLayerElement.isVisible()) {
final ImageConfigElement imageElement = imageLayerElement.getImageConfigElement();
final ImageExtensionConfig imageConfig = getExtensionConfig(imageElement);
if (imageConfig != null) {
final AdapterContext context = imageConfig.getInputAdapterContext();
if (context != null) {
getInputAdapterRuntime(context, imageConfig).refresh();
}
}
final int filterCount = imageLayerElement.getFilterConfigElementCount();
for (int k = 0; k < filterCount; k++) {
final LayerFilterConfigElement filterElement = imageLayerElement.getFilterConfigElement(k);
if (!filterElement.isLocked() && filterElement.isEnabled()) {
final LayerFilterExtensionConfig filterConfig = getExtensionConfig(filterElement);
if (filterConfig != null) {
final AdapterContext context = filterConfig.getInputAdapterContext();
if (context != null) {
getInputAdapterRuntime(context, filterConfig).refresh();
}
}
}
}
}
}
final int filterCount = groupLayerElement.getFilterConfigElementCount();
for (int k = 0; k < filterCount; k++) {
final LayerFilterConfigElement filterElement = groupLayerElement.getFilterConfigElement(k);
if (!filterElement.isLocked() && filterElement.isEnabled()) {
final LayerFilterExtensionConfig filterConfig = getExtensionConfig(filterElement);
if (filterConfig != null) {
final AdapterContext context = filterConfig.getInputAdapterContext();
if (context != null) {
getInputAdapterRuntime(context, filterConfig).refresh();
}
}
}
}
}
}
final int filterCount = frameElement.getFilterConfigElementCount();
for (int k = 0; k < filterCount; k++) {
final FrameFilterConfigElement filterElement = frameElement.getFilterConfigElement(k);
if (!filterElement.isLocked() && filterElement.isEnabled()) {
final FrameFilterExtensionConfig filterConfig = getExtensionConfig(filterElement);
if (filterConfig != null) {
final AdapterContext context = filterConfig.getInputAdapterContext();
if (context != null) {
getInputAdapterRuntime(context, filterConfig).refresh();
}
}
}
}
}
final EffectConfigElement effectElement = config.getEffectConfigElement();
if (effectElement != null) {
if (!effectElement.isLocked() && effectElement.isEnabled()) {
final EffectExtensionConfig effectConfig = getExtensionConfig(effectElement);
if (effectConfig != null) {
final AdapterContext context = effectConfig.getInputAdapterContext();
if (context != null) {
getInputAdapterRuntime(context, effectConfig).refresh();
}
}
}
}
}
private ImageExtensionConfig getExtensionConfig(final ImageConfigElement element) {
if ((element.getReference() != null) && (element.getReference().getExtensionConfig() != null)) {
return element.getReference().getExtensionConfig();
}
return null;
}
private LayerFilterExtensionConfig getExtensionConfig(final LayerFilterConfigElement element) {
if ((element.getReference() != null) && (element.getReference().getExtensionConfig() != null)) {
return element.getReference().getExtensionConfig();
}
return null;
}
private FrameFilterExtensionConfig getExtensionConfig(final FrameFilterConfigElement element) {
if ((element.getReference() != null) && (element.getReference().getExtensionConfig() != null)) {
return element.getReference().getExtensionConfig();
}
return null;
}
private EffectExtensionConfig getExtensionConfig(final EffectConfigElement element) {
if ((element.getReference() != null) && (element.getReference().getExtensionConfig() != null)) {
return element.getReference().getExtensionConfig();
}
return null;
}
private InputAdapterExtensionRuntime getInputAdapterRuntime(final AdapterContext context, final ExtensionConfig config) {
InputAdapterExtensionRuntime runtime = (InputAdapterExtensionRuntime) context.getAttribute("inputAdapterRuntime");
try {
if (runtime == null) {
final Extension<InputAdapterExtensionRuntime> extension = TwisterSwingRegistry.getInstance().getInputAdapterExtension(config.getExtensionId());
runtime = extension.createExtensionRuntime();
runtime.init(renderContext, config);
context.setAttribute("inputAdapterRuntime", runtime);
}
}
catch (final ExtensionException x) {
runtime = new DefaultInputAdapterRuntime();
context.setAttribute("inputAdapterRuntime", runtime);
}
return runtime;
}
private <E> void processEvent(final E e, final EventProcessor<E> p) {
final FrameConfigElement frameElement = config.getFrameConfigElement();
if (frameElement != null) {
final int groupLayerCount = frameElement.getLayerConfigElementCount();
for (int i = 0; i < groupLayerCount; i++) {
final GroupLayerConfigElement groupLayerElement = frameElement.getLayerConfigElement(i);
if (!groupLayerElement.isLocked() && groupLayerElement.isVisible()) {
final int imageLayerCount = groupLayerElement.getLayerConfigElementCount();
for (int j = 0; j < imageLayerCount; j++) {
final ImageLayerConfigElement imageLayerElement = groupLayerElement.getLayerConfigElement(j);
if (!imageLayerElement.isLocked() && imageLayerElement.isVisible()) {
final ImageConfigElement imageElement = imageLayerElement.getImageConfigElement();
final ImageExtensionConfig imageConfig = getExtensionConfig(imageElement);
if (imageConfig != null) {
final AdapterContext context = imageConfig.getInputAdapterContext();
if (context != null) {
p.process(getInputAdapterRuntime(context, imageConfig), e);
}
}
final int filterCount = imageLayerElement.getFilterConfigElementCount();
for (int k = 0; k < filterCount; k++) {
final LayerFilterConfigElement filterElement = imageLayerElement.getFilterConfigElement(k);
if (!filterElement.isLocked() && filterElement.isEnabled()) {
final LayerFilterExtensionConfig filterConfig = getExtensionConfig(filterElement);
if (filterConfig != null) {
final AdapterContext context = filterConfig.getInputAdapterContext();
if (context != null) {
p.process(getInputAdapterRuntime(context, filterConfig), e);
}
}
}
}
}
}
final int filterCount = groupLayerElement.getFilterConfigElementCount();
for (int k = 0; k < filterCount; k++) {
final LayerFilterConfigElement filterElement = groupLayerElement.getFilterConfigElement(k);
if (!filterElement.isLocked() && filterElement.isEnabled()) {
final LayerFilterExtensionConfig filterConfig = getExtensionConfig(filterElement);
if (filterConfig != null) {
final AdapterContext context = filterConfig.getInputAdapterContext();
if (context != null) {
p.process(getInputAdapterRuntime(context, filterConfig), e);
}
}
}
}
}
}
final int filterCount = frameElement.getFilterConfigElementCount();
for (int k = 0; k < filterCount; k++) {
final FrameFilterConfigElement filterElement = frameElement.getFilterConfigElement(k);
if (!filterElement.isLocked() && filterElement.isEnabled()) {
final FrameFilterExtensionConfig filterConfig = getExtensionConfig(filterElement);
if (filterConfig != null) {
final AdapterContext context = filterConfig.getInputAdapterContext();
if (context != null) {
p.process(getInputAdapterRuntime(context, filterConfig), e);
}
}
}
}
}
final EffectConfigElement effectElement = config.getEffectConfigElement();
if (effectElement != null) {
if (!effectElement.isLocked() && effectElement.isEnabled()) {
final EffectExtensionConfig effectConfig = getExtensionConfig(effectElement);
if (effectConfig != null) {
final AdapterContext context = effectConfig.getInputAdapterContext();
if (context != null) {
p.process(getInputAdapterRuntime(context, effectConfig), e);
}
}
}
}
}
private interface EventProcessor<E> {
public void process(InputAdapterExtensionRuntime adapterRuntime, E e);
}
}