/*
* 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.mandelbrot.swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.sf.jame.core.common.ExtensionReferenceElement;
import net.sf.jame.core.config.ListConfigElement;
import net.sf.jame.core.config.ValueChangeEvent;
import net.sf.jame.core.config.ValueChangeListener;
import net.sf.jame.core.config.ValueConfigElement;
import net.sf.jame.core.extension.ConfigurableExtension;
import net.sf.jame.core.extension.Extension;
import net.sf.jame.core.extension.ExtensionException;
import net.sf.jame.core.extension.NullConfigurableExtension;
import net.sf.jame.core.swing.ViewContext;
import net.sf.jame.core.swing.extension.ConfigurableExtensionComboBoxModel;
import net.sf.jame.core.swing.extension.ExtensionComboBoxModel;
import net.sf.jame.core.swing.extension.ExtensionListCellRenderer;
import net.sf.jame.core.swing.util.GUIFactory;
import net.sf.jame.core.swing.util.StackLayout;
import net.sf.jame.core.tree.NodeSession;
import net.sf.jame.core.util.DoubleVector4D;
import net.sf.jame.core.util.RenderContext;
import net.sf.jame.mandelbrot.MandelbrotConfig;
import net.sf.jame.mandelbrot.MandelbrotRegistry;
import net.sf.jame.mandelbrot.extensions.image.MandelbrotImageConfig;
import net.sf.jame.mandelbrot.fractal.MandelbrotFractalConfigElement;
import net.sf.jame.mandelbrot.incolouringFormula.IncolouringFormulaConfigElement;
import net.sf.jame.mandelbrot.incolouringFormula.extension.IncolouringFormulaExtensionConfig;
import net.sf.jame.mandelbrot.incolouringFormula.extension.IncolouringFormulaExtensionRuntime;
import net.sf.jame.mandelbrot.orbitTrap.OrbitTrapConfigElement;
import net.sf.jame.mandelbrot.orbitTrap.extension.OrbitTrapExtensionConfig;
import net.sf.jame.mandelbrot.orbitTrap.extension.OrbitTrapExtensionRuntime;
import net.sf.jame.mandelbrot.outcolouringFormula.OutcolouringFormulaConfigElement;
import net.sf.jame.mandelbrot.outcolouringFormula.extension.OutcolouringFormulaExtensionConfig;
import net.sf.jame.mandelbrot.outcolouringFormula.extension.OutcolouringFormulaExtensionRuntime;
import net.sf.jame.mandelbrot.processingFormula.ProcessingFormulaConfigElement;
import net.sf.jame.mandelbrot.processingFormula.extension.ProcessingFormulaExtensionRuntime;
import net.sf.jame.mandelbrot.renderingFormula.RenderingFormulaConfigElement;
import net.sf.jame.mandelbrot.renderingFormula.extension.RenderingFormulaExtensionConfig;
import net.sf.jame.mandelbrot.renderingFormula.extension.RenderingFormulaExtensionRuntime;
import net.sf.jame.mandelbrot.transformingFormula.TransformingFormulaConfigElement;
import net.sf.jame.mandelbrot.transformingFormula.extension.TransformingFormulaExtensionConfig;
import net.sf.jame.mandelbrot.transformingFormula.extension.TransformingFormulaExtensionRuntime;
import net.sf.jame.twister.swing.TwisterConfigPanel;
import net.sf.jame.twister.swing.TwisterSwingRegistry;
import net.sf.jame.twister.swing.TwisterSwingResources;
import net.sf.jame.twister.swing.ViewPanel;
import net.sf.jame.twister.swing.view.NavigatorViewRuntime;
import net.sf.jame.twister.swing.view.extension.ViewExtensionRuntime;
import net.sf.jame.twister.util.Speed;
/**
* @author Andrea Medeghini
*/
public class MandelbrotConfigPanel extends ViewPanel {
private static final Logger logger = Logger.getLogger(MandelbrotConfigPanel.class.getName());
private static final long serialVersionUID = 1L;
private MandelbrotFractalPanel fractalPanel;
private final MandelbrotImagePanel imagePanel;
private final ViewContext viewContext;
private final RenderContext context;
private final NodeSession session;
private final ValueChangeListener configListener;
private final MandelbrotConfig config;
private final Color oddColor;
private final Color evenColor;
/**
* @param config
* @param viewContext
* @param context
* @param session
*/
public MandelbrotConfigPanel(final MandelbrotConfig config, final ViewContext viewContext, final RenderContext context, final NodeSession session) {
this.viewContext = viewContext;
this.context = context;
this.session = session;
this.config = config;
oddColor = getBackground().brighter();
evenColor = getBackground().brighter();
imagePanel = new MandelbrotImagePanel(config);
fractalPanel = new MandelbrotFractalPanel(config, config.getMandelbrotFractal());
setLayout(new StackLayout());
add(fractalPanel);
add(imagePanel);
setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.DARK_GRAY));
configListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ValueConfigElement.VALUE_CHANGED: {
remove(fractalPanel);
fractalPanel.dispose();
fractalPanel = new MandelbrotFractalPanel(config, config.getMandelbrotFractal());
add(fractalPanel, BorderLayout.CENTER);
viewContext.setComponent(MandelbrotConfigPanel.this);
break;
}
default: {
break;
}
}
}
};
config.getFractalSingleElement().addChangeListener(configListener);
}
@Override
public void dispose() {
config.getFractalSingleElement().removeChangeListener(configListener);
fractalPanel.dispose();
imagePanel.dispose();
}
private static JCheckBox createIconCheckBox(final String key, final String iconKey, final int width, final int height) {
final JCheckBox checkbox = GUIFactory.createCheckBox((String) null, MandelbrotSwingResources.getInstance().getString("tooltip." + key));
try {
checkbox.setIcon(new ImageIcon(ImageIO.read(MandelbrotConfigPanel.class.getResourceAsStream("/icons/" + iconKey + "-icon.png"))));
checkbox.setSelectedIcon(new ImageIcon(ImageIO.read(MandelbrotConfigPanel.class.getResourceAsStream("/icons/" + iconKey + "-selected-icon.png"))));
}
catch (final Exception e) {
logger.warning("key = " + key + ", iconKey = " + iconKey);
e.printStackTrace();
}
checkbox.setOpaque(false);
checkbox.setBorderPainted(false);
checkbox.setPreferredSize(new Dimension(width, height));
checkbox.setMinimumSize(new Dimension(width, height));
checkbox.setMaximumSize(new Dimension(width, height));
return checkbox;
}
private static JButton createIconButton(final String key, final String iconKey, final int width, final int height) {
final JButton button = GUIFactory.createButton((String) null, MandelbrotSwingResources.getInstance().getString("tooltip." + key));
try {
button.setIcon(new ImageIcon(ImageIO.read(MandelbrotConfigPanel.class.getResourceAsStream("/icons/" + iconKey + "-icon.png"))));
button.setPressedIcon(new ImageIcon(ImageIO.read(MandelbrotConfigPanel.class.getResourceAsStream("/icons/" + iconKey + "-pressed-icon.png"))));
}
catch (final Exception e) {
logger.warning("key = " + key + ", iconKey = " + iconKey);
e.printStackTrace();
}
button.setOpaque(false);
button.setPreferredSize(new Dimension(width, height));
button.setMinimumSize(new Dimension(width, height));
button.setMaximumSize(new Dimension(width, height));
return button;
}
// private static JCheckBox createSelectionCheckBox() {
// final JCheckBox checkbox = GUIFactory.createSmallCheckBox((String) null, (String) null);
// checkbox.setOpaque(false);
// checkbox.setPreferredSize(new Dimension(20, 20));
// checkbox.setMinimumSize(new Dimension(20, 20));
// checkbox.setMaximumSize(new Dimension(20, 20));
// return checkbox;
// }
private static JCheckBox createCheckBox() {
final JCheckBox checkbox = GUIFactory.createSmallCheckBox((String) null, (String) null);
checkbox.setOpaque(false);
return checkbox;
}
// private static JCheckBox createTextCheckBox(final String key, final int width, final int height) {
// final JCheckBox checkbox = GUIFactory.createCheckBox(MandelbrotSwingResources.getInstance().getString("label." + key), MandelbrotSwingResources.getInstance().getString("tooltip." + key));
// // final FontMetrics fm = checkbox.getFontMetrics(checkbox.getFont());
// // int width = fm.stringWidth(checkbox.getText()) + 20;
// checkbox.setPreferredSize(new Dimension(width, height));
// checkbox.setMinimumSize(new Dimension(width, height));
// checkbox.setMaximumSize(new Dimension(width, height));
// checkbox.setOpaque(false);
// return checkbox;
// }
private static JButton createTextButton(final int width, final int height) {
final JButton button = GUIFactory.createSmallButton((String) null, (String) null);
button.setPreferredSize(new Dimension(width, height));
button.setMinimumSize(new Dimension(width, height));
button.setMaximumSize(new Dimension(width, height));
button.setOpaque(false);
return button;
}
// private static JButton createTextButton(final String key, final int width, final int height) {
// final JButton button = GUIFactory.createSmallButton(MandelbrotSwingResources.getInstance().getString("label." + key), MandelbrotSwingResources.getInstance().getString("tooltip." + key));
// // final FontMetrics fm = button.getFontMetrics(button.getFont());
// // int width = fm.stringWidth(button.getText());
// button.setPreferredSize(new Dimension(width, height));
// button.setMinimumSize(new Dimension(width, height));
// button.setMaximumSize(new Dimension(width, height));
// button.setOpaque(false);
// return button;
// }
private static JButton createIconTextButton(final String key, final String iconKey, final int width, final int height) {
final JButton button = GUIFactory.createSmallButton(TwisterSwingResources.getInstance().getString("label." + key), TwisterSwingResources.getInstance().getString("tooltip." + key));
// final FontMetrics fm = button.getFontMetrics(button.getFont());
// int width = fm.stringWidth(button.getText());
try {
button.setIcon(new ImageIcon(ImageIO.read(TwisterConfigPanel.class.getResourceAsStream("/icons/" + iconKey + "-icon.png"))));
// button.setPressedIcon(new ImageIcon(ImageIO.read(TwisterConfigPanel.class.getResourceAsStream("/icons/" + iconKey + "-pressed-icon.png"))));
}
catch (final Exception e) {
logger.warning("key = " + key + ", iconKey = " + iconKey);
e.printStackTrace();
}
button.setPreferredSize(new Dimension(width, height));
button.setMinimumSize(new Dimension(width, height));
button.setMaximumSize(new Dimension(width, height));
button.setOpaque(false);
return button;
}
private static JSpinner createSpinner(final int min, final int max, final int step) {
final JSpinner spinner = GUIFactory.createSpinner(new SpinnerNumberModel(0, min, max, step), (String) null);
// spinner.setPreferredSize(new Dimension(60, GUIFactory.DEFAULT_HEIGHT));
spinner.setMaximumSize(new Dimension(60, GUIFactory.DEFAULT_HEIGHT));
spinner.setMinimumSize(new Dimension(60, GUIFactory.DEFAULT_HEIGHT));
// if (!"Mac OS X".equals(System.getProperty("os.name")) || !UIManager.getLookAndFeel().isNativeLookAndFeel()) {
// spinner.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED, Color.LIGHT_GRAY, Color.DARK_GRAY));
// }
return spinner;
}
private static JComboBox createExtensionComboBox(final ComboBoxModel model, final int width, final int height) {
final JComboBox extensionComboBox = GUIFactory.createSmallComboBox(model, (String) null);
extensionComboBox.setRenderer(new ExtensionListCellRenderer());
extensionComboBox.setPreferredSize(new Dimension(width, height));
extensionComboBox.setMaximumSize(new Dimension(width, height));
extensionComboBox.setMinimumSize(new Dimension(width, height));
extensionComboBox.setOpaque(false);
return extensionComboBox;
}
private static JLabel createTextLabel(final String key, final int alignment, final int width, final int height) {
final JLabel label = GUIFactory.createSmallLabel(MandelbrotSwingResources.getInstance().getString("label." + key), SwingConstants.LEFT);
label.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8));
label.setPreferredSize(new Dimension(width, height));
label.setMinimumSize(new Dimension(width, height));
label.setMaximumSize(new Dimension(width, height));
return label;
}
// private static JLabel createLabel(final String text) {
// final JLabel label = GUIFactory.createSmallLabel(text, SwingConstants.LEFT);
// label.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8));
// return label;
// }
private static JTextField createTextField(final String text, final int width, final int height) {
final JTextField textfield = GUIFactory.createTextField(text, null);
textfield.setPreferredSize(new Dimension(width, height));
textfield.setMinimumSize(new Dimension(width, height));
textfield.setMaximumSize(new Dimension(width, height));
// if (!"Mac OS X".equals(System.getProperty("os.name")) || !UIManager.getLookAndFeel().isNativeLookAndFeel()) {
// textfield.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED, Color.LIGHT_GRAY, Color.DARK_GRAY));
// }
return textfield;
}
private static JPanel createPanel(final LayoutManager layoutManager, final boolean opaque) {
final JPanel panel = new JPanel(layoutManager);
panel.setOpaque(opaque);
return panel;
}
private static Box createHorizontalBox(final boolean opaque) {
final Box box = Box.createHorizontalBox();
box.setOpaque(opaque);
return box;
}
private static Box createVerticalBox(final boolean opaque) {
final Box box = Box.createVerticalBox();
box.setOpaque(opaque);
return box;
}
private static Component createSpace() {
final Component box = Box.createHorizontalStrut(4);
return box;
}
private class MandelbrotImagePanel extends JPanel {
private static final long serialVersionUID = 1L;
private final ValueChangeListener showPreviewListener;
private final ValueChangeListener showOrbitListener;
private final ValueChangeListener showOrbitTrapListener;
private final ValueChangeListener imageModeListener;
private final ValueChangeListener inputModeListener;
private final ValueChangeListener speedListener;
private final MandelbrotConfig config;
public MandelbrotImagePanel(final MandelbrotConfig config) {
this.config = config;
final JCheckBox showPreviewCheckBox = createCheckBox();
final JCheckBox showOrbitCheckBox = createCheckBox();
final JCheckBox showOrbitTrapCheckBox = createCheckBox();
final JLabel showPreviewLabel = createTextLabel("showPreview", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel showOrbitLabel = createTextLabel("showOrbit", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel showOrbitTrapLabel = createTextLabel("showOrbitTrap", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel imageModeLabel = createTextLabel("imageMode", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel inputModeLabel = createTextLabel("inputMode", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel zoomSpeedLabel = createTextLabel("zoomSpeed", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel shiftSpeedLabel = createTextLabel("shiftSpeed", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel rotationSpeedLabel = createTextLabel("rotationSpeed", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final JTextField zoomSpeedTextfield = createTextField(String.valueOf(config.getSpeed().getPosition().getZ()), 200, GUIFactory.DEFAULT_HEIGHT);
final JTextField shiftSpeedTextfield = createTextField(String.valueOf(config.getSpeed().getPosition().getW()), 200, GUIFactory.DEFAULT_HEIGHT);
final JTextField rotationSpeedTextfield = createTextField(String.valueOf(config.getSpeed().getRotation().getZ()), 200, GUIFactory.DEFAULT_HEIGHT);
final JComboBox imageModeComboBox = GUIFactory.createSmallComboBox(null);
imageModeComboBox.setOpaque(false);
imageModeComboBox.setPreferredSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT));
imageModeComboBox.setMaximumSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT));
imageModeComboBox.setMinimumSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT));
imageModeComboBox.addItem(new Object[] { "Mandelbrot", MandelbrotImageConfig.IMAGE_MODE_MANDELBROT });
imageModeComboBox.addItem(new Object[] { "Julia", MandelbrotImageConfig.IMAGE_MODE_JULIA });
imageModeComboBox.setRenderer(new DefaultListCellRenderer() {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) {
return super.getListCellRendererComponent(list, ((Object[]) value)[0], index, isSelected, cellHasFocus);
}
});
final JComboBox inputModeComboBox = GUIFactory.createSmallComboBox(null);
inputModeComboBox.setOpaque(false);
inputModeComboBox.setPreferredSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT));
inputModeComboBox.setMaximumSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT));
inputModeComboBox.setMinimumSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT));
inputModeComboBox.addItem(new Object[] { TwisterSwingResources.getInstance().getString("label.zoom"), MandelbrotImageConfig.INPUT_MODE_ZOOM });
inputModeComboBox.addItem(new Object[] { TwisterSwingResources.getInstance().getString("label.select"), MandelbrotImageConfig.INPUT_MODE_SELECT });
inputModeComboBox.setRenderer(new DefaultListCellRenderer() {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) {
return super.getListCellRendererComponent(list, ((Object[]) value)[0], index, isSelected, cellHasFocus);
}
});
final Box tmpPanel0 = createHorizontalBox(false);
tmpPanel0.add(imageModeLabel);
tmpPanel0.add(createSpace());
tmpPanel0.add(imageModeComboBox);
tmpPanel0.add(Box.createHorizontalGlue());
final Box tmpPanel1 = createHorizontalBox(false);
tmpPanel1.add(showOrbitLabel);
tmpPanel1.add(createSpace());
tmpPanel1.add(showOrbitCheckBox);
tmpPanel1.add(Box.createHorizontalGlue());
final Box tmpPanel2 = createHorizontalBox(false);
tmpPanel2.add(showPreviewLabel);
tmpPanel2.add(createSpace());
tmpPanel2.add(showPreviewCheckBox);
tmpPanel2.add(Box.createHorizontalGlue());
final Box tmpPanel3 = createHorizontalBox(false);
tmpPanel3.add(inputModeLabel);
tmpPanel3.add(createSpace());
tmpPanel3.add(inputModeComboBox);
tmpPanel3.add(Box.createHorizontalGlue());
final Box tmpPanel4 = createHorizontalBox(false);
tmpPanel4.add(zoomSpeedLabel);
tmpPanel4.add(createSpace());
tmpPanel4.add(zoomSpeedTextfield);
tmpPanel4.add(Box.createHorizontalGlue());
final Box tmpPanel5 = createHorizontalBox(false);
tmpPanel5.add(rotationSpeedLabel);
tmpPanel5.add(createSpace());
tmpPanel5.add(rotationSpeedTextfield);
tmpPanel5.add(Box.createHorizontalGlue());
final Box tmpPanel6 = createHorizontalBox(false);
tmpPanel6.add(shiftSpeedLabel);
tmpPanel6.add(createSpace());
tmpPanel6.add(shiftSpeedTextfield);
tmpPanel6.add(Box.createHorizontalGlue());
final Box tmpPanel7 = createHorizontalBox(false);
tmpPanel7.add(showOrbitTrapLabel);
tmpPanel7.add(createSpace());
tmpPanel7.add(showOrbitTrapCheckBox);
tmpPanel7.add(Box.createHorizontalGlue());
final Box tmpPanel = createVerticalBox(false);
tmpPanel.add(tmpPanel0);
tmpPanel.add(Box.createVerticalStrut(8));
tmpPanel.add(tmpPanel3);
tmpPanel.add(Box.createVerticalStrut(8));
tmpPanel.add(tmpPanel2);
tmpPanel.add(Box.createVerticalStrut(8));
tmpPanel.add(tmpPanel1);
tmpPanel.add(Box.createVerticalStrut(8));
tmpPanel.add(tmpPanel7);
tmpPanel.add(Box.createVerticalStrut(8));
tmpPanel.add(tmpPanel4);
tmpPanel.add(Box.createVerticalStrut(8));
tmpPanel.add(tmpPanel6);
tmpPanel.add(Box.createVerticalStrut(8));
tmpPanel.add(tmpPanel5);
tmpPanel.add(Box.createVerticalStrut(8));
setLayout(new BorderLayout());
add(tmpPanel, BorderLayout.CENTER);
setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
setOpaque(false);
showPreviewCheckBox.setSelected(config.getShowPreview());
showOrbitCheckBox.setSelected(config.getShowOrbit());
showOrbitTrapCheckBox.setSelected(config.getShowOrbitTrap());
updateImageMode(config, imageModeComboBox);
updateInputMode(config, inputModeComboBox);
final ActionListener showPreviewActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
config.getContext().updateTimestamp();
config.setShowPreview(showPreviewCheckBox.isSelected());
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
showPreviewCheckBox.addActionListener(showPreviewActionListener);
final ActionListener showOrbitActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
config.getContext().updateTimestamp();
config.setShowOrbit(showOrbitCheckBox.isSelected());
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
showOrbitCheckBox.addActionListener(showOrbitActionListener);
final ActionListener showOrbitTrapActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
config.getContext().updateTimestamp();
config.setShowOrbitTrap(showOrbitTrapCheckBox.isSelected());
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
showOrbitTrapCheckBox.addActionListener(showOrbitTrapActionListener);
final ActionListener imageModeActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
config.getContext().updateTimestamp();
config.setImageMode((Integer) ((Object[]) imageModeComboBox.getSelectedItem())[1]);
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
imageModeComboBox.addActionListener(imageModeActionListener);
final ActionListener inputModeActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
config.getContext().updateTimestamp();
config.setInputMode((Integer) ((Object[]) inputModeComboBox.getSelectedItem())[1]);
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
inputModeComboBox.addActionListener(inputModeActionListener);
final ActionListener zoomSpeedActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
config.getContext().updateTimestamp();
Speed speed = config.getSpeed();
Speed newSpeed = new Speed(new DoubleVector4D(0, 0, Double.valueOf(zoomSpeedTextfield.getText()), speed.getPosition().getW()), speed.getRotation());
config.setSpeed(newSpeed);
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
zoomSpeedTextfield.addActionListener(zoomSpeedActionListener);
final ActionListener shiftSpeedActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
config.getContext().updateTimestamp();
Speed speed = config.getSpeed();
Speed newSpeed = new Speed(new DoubleVector4D(0, 0, speed.getPosition().getZ(), Double.valueOf(shiftSpeedTextfield.getText())), speed.getRotation());
config.setSpeed(newSpeed);
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
shiftSpeedTextfield.addActionListener(shiftSpeedActionListener);
final ActionListener rotationSpeedActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
config.getContext().updateTimestamp();
Speed speed = config.getSpeed();
Speed newSpeed = new Speed(speed.getPosition(), new DoubleVector4D(0, 0, Double.valueOf(rotationSpeedTextfield.getText()), 0));
config.setSpeed(newSpeed);
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
rotationSpeedTextfield.addActionListener(rotationSpeedActionListener);
showPreviewListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
showPreviewCheckBox.removeActionListener(showPreviewActionListener);
showPreviewCheckBox.setSelected(config.getShowPreview());
showPreviewCheckBox.addActionListener(showPreviewActionListener);
}
};
showOrbitListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
showOrbitCheckBox.removeActionListener(showOrbitActionListener);
showOrbitCheckBox.setSelected(config.getShowOrbit());
showOrbitCheckBox.addActionListener(showOrbitActionListener);
}
};
showOrbitTrapListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
showOrbitTrapCheckBox.removeActionListener(showOrbitTrapActionListener);
showOrbitTrapCheckBox.setSelected(config.getShowOrbitTrap());
showOrbitTrapCheckBox.addActionListener(showOrbitTrapActionListener);
}
};
imageModeListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
imageModeComboBox.removeActionListener(imageModeActionListener);
updateImageMode(config, imageModeComboBox);
imageModeComboBox.addActionListener(imageModeActionListener);
}
};
inputModeListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
inputModeComboBox.removeActionListener(inputModeActionListener);
updateInputMode(config, inputModeComboBox);
inputModeComboBox.addActionListener(inputModeActionListener);
}
};
speedListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
zoomSpeedTextfield.removeActionListener(zoomSpeedActionListener);
shiftSpeedTextfield.removeActionListener(shiftSpeedActionListener);
rotationSpeedTextfield.removeActionListener(rotationSpeedActionListener);
zoomSpeedTextfield.setText(String.valueOf(config.getSpeed().getPosition().getZ()));
shiftSpeedTextfield.setText(String.valueOf(config.getSpeed().getPosition().getW()));
rotationSpeedTextfield.setText(String.valueOf(config.getSpeed().getRotation().getZ()));
zoomSpeedTextfield.addActionListener(zoomSpeedActionListener);
shiftSpeedTextfield.addActionListener(shiftSpeedActionListener);
rotationSpeedTextfield.addActionListener(rotationSpeedActionListener);
}
};
config.getShowPreviewElement().addChangeListener(showPreviewListener);
config.getShowOrbitElement().addChangeListener(showOrbitListener);
config.getShowOrbitTrapElement().addChangeListener(showOrbitTrapListener);
config.getImageModeElement().addChangeListener(imageModeListener);
config.getInputModeElement().addChangeListener(inputModeListener);
config.getSpeedElement().addChangeListener(speedListener);
}
public void dispose() {
config.getShowPreviewElement().removeChangeListener(showPreviewListener);
config.getShowOrbitElement().removeChangeListener(showOrbitListener);
config.getShowOrbitTrapElement().removeChangeListener(showOrbitTrapListener);
config.getImageModeElement().removeChangeListener(imageModeListener);
config.getInputModeElement().removeChangeListener(inputModeListener);
config.getSpeedElement().removeChangeListener(speedListener);
}
private void updateImageMode(final MandelbrotConfig config, final JComboBox imageModeComboBox) {
switch (config.getImageMode()) {
case MandelbrotImageConfig.IMAGE_MODE_MANDELBROT: {
imageModeComboBox.setSelectedIndex(0);
break;
}
case MandelbrotImageConfig.IMAGE_MODE_JULIA: {
imageModeComboBox.setSelectedIndex(1);
break;
}
default: {
break;
}
}
}
private void updateInputMode(final MandelbrotConfig config, final JComboBox inputModeComboBox) {
switch (config.getInputMode()) {
case MandelbrotImageConfig.INPUT_MODE_ZOOM: {
inputModeComboBox.setSelectedIndex(0);
break;
}
case MandelbrotImageConfig.INPUT_MODE_SELECT: {
inputModeComboBox.setSelectedIndex(1);
break;
}
default: {
break;
}
}
}
}
private class MandelbrotFractalPanel extends JPanel {
private static final long serialVersionUID = 1L;
private final JPanel incolouringFormulasPanel;
private final JPanel outcolouringFormulasPanel;
private RenderingFormulaPanel renderingFormulaPanel;
private TransformingFormulaPanel transformingFormulaPanel;
private ProcessingFormulaPanel processingFormulaPanel;
private OrbitTrapPanel orbitTrapPanel;
private final ValueChangeListener incolouringFormulasListener;
private final ValueChangeListener outcolouringFormulasListener;
private final ValueChangeListener renderingFormulaListener;
private final ValueChangeListener transformingFormulaListener;
private final ValueChangeListener processingFormulaListener;
private final ValueChangeListener orbitTrapListener;
private final MandelbrotFractalConfigElement fractalElement;
// private ValueChangeListener centerListener;
// private CenterListener centerFieldListener;
// private JTextField[] textFields;
/**
* @param config
* @param fractalElement
*/
public MandelbrotFractalPanel(final MandelbrotConfig config, final MandelbrotFractalConfigElement fractalElement) {
this.fractalElement = fractalElement;
incolouringFormulasPanel = createPanel(new StackLayout(), false);
outcolouringFormulasPanel = createPanel(new StackLayout(), false);
final JButton editIncolouringFormulasButton = createTextButton(200, GUIFactory.DEFAULT_HEIGHT);
final JButton editOutcolouringFormulasButton = createTextButton(200, GUIFactory.DEFAULT_HEIGHT);
final JButton selectIncolouringFormulaButton = createIconButton("selectIncolouringFormulas", "select", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton appendIncolouringFormulaButton = createIconButton("appendIncolouringFormula", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton removeIncolouringFormulaButton = createIconButton("removeIncolouringFormulas", "remove", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton moveUpIncolouringFormulaButton = createIconButton("moveUpIncolouringFormula", "up", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton moveDownIncolouringFormulaButton = createIconButton("moveDownIncolouringFormula", "down", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton cloneIncolouringFormulaButton = createIconButton("cloneIncolouringFormula", "clone", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton selectOutcolouringFormulaButton = createIconButton("selectOutcolouringFormulas", "select", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton appendOutcolouringFormulaButton = createIconButton("appendOutcolouringFormula", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton removeOutcolouringFormulaButton = createIconButton("removeOutcolouringFormulas", "remove", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton moveUpOutcolouringFormulaButton = createIconButton("moveUpOutcolouringFormula", "up", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton moveDownOutcolouringFormulaButton = createIconButton("moveDownOutcolouringFormula", "down", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JButton cloneOutcolouringFormulaButton = createIconButton("cloneOutcolouringFormula", "clone", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JLabel incolouringFormulasLabel2 = createTextLabel("incolouringFormulas", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel outcolouringFormulasLabel2 = createTextLabel("outcolouringFormulas", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
// JLabel[] labels = new JLabel[1];
// labels[0] = createTextLabel("orbitTrapCenter", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
// textFields = new JTextField[2];
// textFields[0] = createTextField(String.valueOf(fractalElement.getOrbitTrapConfigElement().getCenter().getX()), 100, GUIFactory.DEFAULT_HEIGHT);
// centerFieldListener = new CenterListener(fractalElement.getOrbitTrapConfigElement().getCenterElement(), textFields);
// textFields[0].addActionListener(centerFieldListener);
// textFields[0].addFocusListener(centerFieldListener);
// // textFields[0].setColumns(8);
// textFields[0].setCaretPosition(0);
// textFields[1] = createTextField(String.valueOf(fractalElement.getOrbitTrapConfigElement().getCenter().getY()), 100, GUIFactory.DEFAULT_HEIGHT);
// textFields[1].addActionListener(centerFieldListener);
// textFields[1].addFocusListener(centerFieldListener);
// // textFields[1].setColumns(8);
// textFields[1].setCaretPosition(0);
// Box[] panels = new Box[1];
// panels[0] = createHorizontalBox(false);
// panels[0].add(labels[0]);
// panels[0].add(createSpace());
// panels[0].add(textFields[0]);
// panels[0].add(textFields[1]);
// panels[0].add(Box.createHorizontalGlue());
// Box orbitTrapElementPanel = createVerticalBox(false);
// orbitTrapElementPanel.add(Box.createVerticalStrut(8));
// orbitTrapElementPanel.add(panels[0]);
// orbitTrapElementPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8));
final Box outcolouringFormulasPanel4 = createHorizontalBox(false);
outcolouringFormulasPanel4.add(Box.createHorizontalGlue());
outcolouringFormulasPanel4.add(selectOutcolouringFormulaButton);
outcolouringFormulasPanel4.add(createSpace());
outcolouringFormulasPanel4.add(appendOutcolouringFormulaButton);
outcolouringFormulasPanel4.add(createSpace());
outcolouringFormulasPanel4.add(removeOutcolouringFormulaButton);
outcolouringFormulasPanel4.add(createSpace());
outcolouringFormulasPanel4.add(moveUpOutcolouringFormulaButton);
outcolouringFormulasPanel4.add(createSpace());
outcolouringFormulasPanel4.add(moveDownOutcolouringFormulaButton);
outcolouringFormulasPanel4.add(createSpace());
outcolouringFormulasPanel4.add(cloneOutcolouringFormulaButton);
outcolouringFormulasPanel4.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY), BorderFactory.createEmptyBorder(4, 4, 4, 4)));
final JLabel outcolouringFormulasLabel = createTextLabel("noOutcolouringFormula", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
outcolouringFormulasLabel.setPreferredSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT));
final Box outcolouringFormulasPanel3 = createHorizontalBox(false);
outcolouringFormulasPanel3.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
outcolouringFormulasPanel3.add(outcolouringFormulasLabel);
outcolouringFormulasPanel3.add(Box.createHorizontalGlue());
final JPanel outcolouringFormulasPanel2 = createPanel(new BorderLayout(), true);
outcolouringFormulasPanel2.setName(createOutcolouringFormulasPanelName());
outcolouringFormulasPanel2.add(outcolouringFormulasPanel4, BorderLayout.NORTH);
outcolouringFormulasPanel2.add(outcolouringFormulasPanel, BorderLayout.CENTER);
outcolouringFormulasPanel2.add(outcolouringFormulasPanel3, BorderLayout.SOUTH);
outcolouringFormulasPanel2.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY));
final Box incolouringFormulasPanel4 = createHorizontalBox(false);
incolouringFormulasPanel4.add(Box.createHorizontalGlue());
incolouringFormulasPanel4.add(selectIncolouringFormulaButton);
incolouringFormulasPanel4.add(createSpace());
incolouringFormulasPanel4.add(appendIncolouringFormulaButton);
incolouringFormulasPanel4.add(createSpace());
incolouringFormulasPanel4.add(removeIncolouringFormulaButton);
incolouringFormulasPanel4.add(createSpace());
incolouringFormulasPanel4.add(moveUpIncolouringFormulaButton);
incolouringFormulasPanel4.add(createSpace());
incolouringFormulasPanel4.add(moveDownIncolouringFormulaButton);
incolouringFormulasPanel4.add(createSpace());
incolouringFormulasPanel4.add(cloneIncolouringFormulaButton);
incolouringFormulasPanel4.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY), BorderFactory.createEmptyBorder(4, 4, 4, 4)));
final JLabel incolouringFormulasLabel = createTextLabel("noIncolouringFormula", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
incolouringFormulasLabel.setPreferredSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT));
final Box incolouringFormulasPanel3 = createHorizontalBox(false);
incolouringFormulasPanel3.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
incolouringFormulasPanel3.add(incolouringFormulasLabel);
incolouringFormulasPanel3.add(Box.createHorizontalGlue());
final JPanel incolouringFormulasPanel2 = createPanel(new BorderLayout(), true);
incolouringFormulasPanel2.setName(createIncolouringFormulasPanelName());
incolouringFormulasPanel2.add(incolouringFormulasPanel4, BorderLayout.NORTH);
incolouringFormulasPanel2.add(incolouringFormulasPanel, BorderLayout.CENTER);
incolouringFormulasPanel2.add(incolouringFormulasPanel3, BorderLayout.SOUTH);
incolouringFormulasPanel2.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY));
renderingFormulaPanel = new RenderingFormulaPanel(fractalElement, fractalElement.getRenderingFormulaConfigElement());
transformingFormulaPanel = new TransformingFormulaPanel(fractalElement, fractalElement.getTransformingFormulaConfigElement());
processingFormulaPanel = new ProcessingFormulaPanel(fractalElement, fractalElement.getProcessingFormulaConfigElement());
orbitTrapPanel = new OrbitTrapPanel(fractalElement, fractalElement.getOrbitTrapConfigElement());
final Box outcolouringFormulasPanel5 = createHorizontalBox(false);
outcolouringFormulasPanel5.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
outcolouringFormulasPanel5.add(outcolouringFormulasLabel2);
outcolouringFormulasPanel5.add(createSpace());
outcolouringFormulasPanel5.add(editOutcolouringFormulasButton);
outcolouringFormulasPanel5.add(Box.createHorizontalGlue());
final Box incolouringFormulasPanel5 = createHorizontalBox(false);
incolouringFormulasPanel5.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
incolouringFormulasPanel5.add(incolouringFormulasLabel2);
incolouringFormulasPanel5.add(createSpace());
incolouringFormulasPanel5.add(editIncolouringFormulasButton);
incolouringFormulasPanel5.add(Box.createHorizontalGlue());
final Box subpanelContainer = createVerticalBox(false);
subpanelContainer.add(Box.createVerticalStrut(8));
subpanelContainer.add(renderingFormulaPanel);
subpanelContainer.add(Box.createVerticalStrut(8));
subpanelContainer.add(transformingFormulaPanel);
subpanelContainer.add(Box.createVerticalStrut(8));
subpanelContainer.add(processingFormulaPanel);
subpanelContainer.add(Box.createVerticalStrut(8));
subpanelContainer.add(orbitTrapPanel);
// subpanelContainer.add(orbitTrapElementPanel);
subpanelContainer.add(Box.createVerticalStrut(8));
subpanelContainer.add(incolouringFormulasPanel5);
subpanelContainer.add(Box.createVerticalStrut(8));
subpanelContainer.add(outcolouringFormulasPanel5);
subpanelContainer.add(Box.createVerticalStrut(8));
// Box formulasPanel = createHorizontalBox(false);
// formulasPanel.add(Box.createHorizontalGlue());
// formulasPanel.add(appendIncolouringFormulaButton);
// formulasPanel.add(removeIncolouringFormulaButton);
// formulasPanel.add(appendOutcolouringFormulaButton);
// formulasPanel.add(removeOutcolouringFormulaButton);
// formulasPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.DARK_GRAY));
setLayout(new BorderLayout());
add(subpanelContainer, BorderLayout.CENTER);
// add(formulasPanel, BorderLayout.SOUTH);
editIncolouringFormulasButton.setText(createEditIncolouringFormulasText(fractalElement));
editOutcolouringFormulasButton.setText(createEditOutcolouringFormulasText(fractalElement));
incolouringFormulasPanel3.setVisible(fractalElement.getIncolouringFormulaConfigElementCount() == 0);
outcolouringFormulasPanel3.setVisible(fractalElement.getOutcolouringFormulaConfigElementCount() == 0);
for (int i = 0; i < fractalElement.getIncolouringFormulaConfigElementCount(); i++) {
final IncolouringFormulaConfigElement formulaElement = fractalElement.getIncolouringFormulaConfigElement(i);
final IncolouringFormulaPanel formulaPanel = new IncolouringFormulaPanel(fractalElement, formulaElement);
incolouringFormulasPanel.add(formulaPanel);
}
for (int i = 0; i < fractalElement.getOutcolouringFormulaConfigElementCount(); i++) {
final OutcolouringFormulaConfigElement formulaElement = fractalElement.getOutcolouringFormulaConfigElement(i);
final OutcolouringFormulaPanel formulaPanel = new OutcolouringFormulaPanel(fractalElement, formulaElement);
outcolouringFormulasPanel.add(formulaPanel);
}
for (int i = 0; i < incolouringFormulasPanel.getComponentCount(); i++) {
incolouringFormulasPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor);
// ((JComponent) incolouringFormulasPanel.getComponent(i)).setOpaque(i % 2 == 0);
}
for (int i = 0; i < outcolouringFormulasPanel.getComponentCount(); i++) {
outcolouringFormulasPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor);
// ((JComponent) outcolouringFormulasPanel.getComponent(i)).setOpaque(i % 2 == 0);
}
incolouringFormulasListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ListConfigElement.ELEMENT_ADDED: {
viewContext.resize(GUIFactory.DEFAULT_HEIGHT);
incolouringFormulasPanel.add(new IncolouringFormulaPanel(fractalElement, (IncolouringFormulaConfigElement) e.getParams()[0]));
incolouringFormulasPanel3.setVisible(fractalElement.getIncolouringFormulaConfigElementCount() == 0);
break;
}
case ListConfigElement.ELEMENT_INSERTED_AFTER: {
viewContext.resize(GUIFactory.DEFAULT_HEIGHT);
incolouringFormulasPanel.add(new IncolouringFormulaPanel(fractalElement, (IncolouringFormulaConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue() + 1);
incolouringFormulasPanel3.setVisible(fractalElement.getIncolouringFormulaConfigElementCount() == 0);
break;
}
case ListConfigElement.ELEMENT_INSERTED_BEFORE: {
viewContext.resize(GUIFactory.DEFAULT_HEIGHT);
incolouringFormulasPanel.add(new IncolouringFormulaPanel(fractalElement, (IncolouringFormulaConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue());
incolouringFormulasPanel3.setVisible(fractalElement.getIncolouringFormulaConfigElementCount() == 0);
break;
}
case ListConfigElement.ELEMENT_REMOVED: {
IncolouringFormulaPanel panel = (IncolouringFormulaPanel) incolouringFormulasPanel.getComponent(((Integer) e.getParams()[1]).intValue());
incolouringFormulasPanel.remove(panel);
panel.dispose();
incolouringFormulasPanel3.setVisible(fractalElement.getIncolouringFormulaConfigElementCount() == 0);
// viewContext.resize();
viewContext.restoreComponent(incolouringFormulasPanel2);
break;
}
case ListConfigElement.ELEMENT_MOVED_UP: {
IncolouringFormulaPanel panel = (IncolouringFormulaPanel) incolouringFormulasPanel.getComponent(((Integer) e.getParams()[1]).intValue());
incolouringFormulasPanel.remove(panel);
incolouringFormulasPanel.add(panel, ((Integer) e.getParams()[1]).intValue() - 1);
break;
}
case ListConfigElement.ELEMENT_MOVED_DOWN: {
IncolouringFormulaPanel panel = (IncolouringFormulaPanel) incolouringFormulasPanel.getComponent(((Integer) e.getParams()[1]).intValue());
incolouringFormulasPanel.remove(panel);
incolouringFormulasPanel.add(panel, ((Integer) e.getParams()[1]).intValue() + 1);
break;
}
case ListConfigElement.ELEMENT_CHANGED: {
IncolouringFormulaPanel panel = (IncolouringFormulaPanel) incolouringFormulasPanel.getComponent(((Integer) e.getParams()[1]).intValue());
incolouringFormulasPanel.remove(panel);
panel.dispose();
incolouringFormulasPanel.add(new IncolouringFormulaPanel(fractalElement, (IncolouringFormulaConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue());
break;
}
default: {
break;
}
}
for (int i = 0; i < incolouringFormulasPanel.getComponentCount(); i++) {
incolouringFormulasPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor);
// ((JComponent) incolouringFormulasPanel.getComponent(i)).setOpaque(i % 2 == 0);
}
editIncolouringFormulasButton.setText(createEditIncolouringFormulasText(fractalElement));
}
};
outcolouringFormulasListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ListConfigElement.ELEMENT_ADDED: {
viewContext.resize(GUIFactory.DEFAULT_HEIGHT);
outcolouringFormulasPanel.add(new OutcolouringFormulaPanel(fractalElement, (OutcolouringFormulaConfigElement) e.getParams()[0]));
outcolouringFormulasPanel3.setVisible(fractalElement.getOutcolouringFormulaConfigElementCount() == 0);
break;
}
case ListConfigElement.ELEMENT_INSERTED_AFTER: {
viewContext.resize(GUIFactory.DEFAULT_HEIGHT);
outcolouringFormulasPanel.add(new OutcolouringFormulaPanel(fractalElement, (OutcolouringFormulaConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue() + 1);
outcolouringFormulasPanel3.setVisible(fractalElement.getOutcolouringFormulaConfigElementCount() == 0);
break;
}
case ListConfigElement.ELEMENT_INSERTED_BEFORE: {
viewContext.resize(GUIFactory.DEFAULT_HEIGHT);
outcolouringFormulasPanel.add(new OutcolouringFormulaPanel(fractalElement, (OutcolouringFormulaConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue());
outcolouringFormulasPanel3.setVisible(fractalElement.getOutcolouringFormulaConfigElementCount() == 0);
break;
}
case ListConfigElement.ELEMENT_REMOVED: {
OutcolouringFormulaPanel panel = (OutcolouringFormulaPanel) outcolouringFormulasPanel.getComponent(((Integer) e.getParams()[1]).intValue());
outcolouringFormulasPanel.remove(panel);
panel.dispose();
outcolouringFormulasPanel3.setVisible(fractalElement.getOutcolouringFormulaConfigElementCount() == 0);
// viewContext.resize();
viewContext.restoreComponent(outcolouringFormulasPanel2);
break;
}
case ListConfigElement.ELEMENT_MOVED_UP: {
OutcolouringFormulaPanel panel = (OutcolouringFormulaPanel) outcolouringFormulasPanel.getComponent(((Integer) e.getParams()[1]).intValue());
outcolouringFormulasPanel.remove(panel);
outcolouringFormulasPanel.add(panel, ((Integer) e.getParams()[1]).intValue() - 1);
break;
}
case ListConfigElement.ELEMENT_MOVED_DOWN: {
OutcolouringFormulaPanel panel = (OutcolouringFormulaPanel) outcolouringFormulasPanel.getComponent(((Integer) e.getParams()[1]).intValue());
outcolouringFormulasPanel.remove(panel);
outcolouringFormulasPanel.add(panel, ((Integer) e.getParams()[1]).intValue() + 1);
break;
}
case ListConfigElement.ELEMENT_CHANGED: {
OutcolouringFormulaPanel panel = (OutcolouringFormulaPanel) outcolouringFormulasPanel.getComponent(((Integer) e.getParams()[1]).intValue());
outcolouringFormulasPanel.remove(panel);
panel.dispose();
outcolouringFormulasPanel.add(new OutcolouringFormulaPanel(fractalElement, (OutcolouringFormulaConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue());
break;
}
default: {
break;
}
}
for (int i = 0; i < outcolouringFormulasPanel.getComponentCount(); i++) {
outcolouringFormulasPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor);
// ((JComponent) outcolouringFormulasPanel.getComponent(i)).setOpaque(i % 2 == 0);
}
editOutcolouringFormulasButton.setText(createEditOutcolouringFormulasText(fractalElement));
}
};
renderingFormulaListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ValueConfigElement.VALUE_CHANGED: {
subpanelContainer.remove(renderingFormulaPanel);
renderingFormulaPanel = new RenderingFormulaPanel(fractalElement, fractalElement.getRenderingFormulaConfigElement());
subpanelContainer.add(renderingFormulaPanel);
break;
}
default: {
break;
}
}
}
};
transformingFormulaListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ValueConfigElement.VALUE_CHANGED: {
subpanelContainer.remove(transformingFormulaPanel);
transformingFormulaPanel = new TransformingFormulaPanel(fractalElement, fractalElement.getTransformingFormulaConfigElement());
subpanelContainer.add(transformingFormulaPanel);
break;
}
default: {
break;
}
}
}
};
processingFormulaListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ValueConfigElement.VALUE_CHANGED: {
subpanelContainer.remove(processingFormulaPanel);
processingFormulaPanel = new ProcessingFormulaPanel(fractalElement, fractalElement.getProcessingFormulaConfigElement());
subpanelContainer.add(processingFormulaPanel);
break;
}
default: {
break;
}
}
}
};
orbitTrapListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ValueConfigElement.VALUE_CHANGED: {
// textFields[0].removeActionListener(centerFieldListener);
// textFields[0].removeFocusListener(centerFieldListener);
// textFields[1].removeActionListener(centerFieldListener);
// textFields[1].removeFocusListener(centerFieldListener);
subpanelContainer.remove(orbitTrapPanel);
orbitTrapPanel = new OrbitTrapPanel(fractalElement, fractalElement.getOrbitTrapConfigElement());
subpanelContainer.add(orbitTrapPanel);
// textFields[0].setText(String.valueOf(fractalElement.getOrbitTrapConfigElement().getCenter().getX()));
// textFields[1].setText(String.valueOf(fractalElement.getOrbitTrapConfigElement().getCenter().getY()));
// textFields[0].setCaretPosition(0);
// textFields[1].setCaretPosition(0);
// centerFieldListener = new CenterListener(fractalElement.getOrbitTrapConfigElement().getCenterElement(), textFields);
// textFields[0].addActionListener(centerFieldListener);
// textFields[0].addFocusListener(centerFieldListener);
// textFields[1].addActionListener(centerFieldListener);
// textFields[1].addFocusListener(centerFieldListener);
break;
}
default: {
break;
}
}
}
};
// centerListener = new ValueChangeListener() {
// public void valueChanged(ValueChangeEvent e) {
// switch (e.getEventType()) {
// case ValueConfigElementEvents.VALUE_CHANGED: {
// textFields[0].removeActionListener(centerFieldListener);
// textFields[0].removeFocusListener(centerFieldListener);
// textFields[1].removeActionListener(centerFieldListener);
// textFields[1].removeFocusListener(centerFieldListener);
// textFields[0].setText(String.valueOf(((DoubleVector2D) e.getParams()[0]).getX()));
// textFields[1].setText(String.valueOf(((DoubleVector2D) e.getParams()[0]).getY()));
// textFields[0].setCaretPosition(0);
// textFields[1].setCaretPosition(0);
// textFields[0].addActionListener(centerFieldListener);
// textFields[0].addFocusListener(centerFieldListener);
// textFields[1].addActionListener(centerFieldListener);
// textFields[1].addFocusListener(centerFieldListener);
// break;
// }
// default: {
// break;
// }
// }
// }
// };
fractalElement.getIncolouringFormulaListElement().addChangeListener(incolouringFormulasListener);
fractalElement.getOutcolouringFormulaListElement().addChangeListener(outcolouringFormulasListener);
fractalElement.getRenderingFormulaSingleElement().addChangeListener(renderingFormulaListener);
fractalElement.getTransformingFormulaSingleElement().addChangeListener(transformingFormulaListener);
fractalElement.getProcessingFormulaConfigElement().addChangeListener(processingFormulaListener);
fractalElement.getOrbitTrapConfigElement().addChangeListener(orbitTrapListener);
// fractalElement.getOrbitTrapConfigElement().getCenterElement().addChangeListener(centerListener);
appendIncolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
fractalElement.getContext().updateTimestamp();
for (int i = fractalElement.getIncolouringFormulaConfigElementCount() - 1; i >= 0; i--) {
final IncolouringFormulaConfigElement formulaElement = fractalElement.getIncolouringFormulaConfigElement(i);
if (formulaElement.getUserData() != null) {
fractalElement.insertIncolouringFormulaConfigElementBefore(i, new IncolouringFormulaConfigElement());
return;
}
}
fractalElement.appendIncolouringFormulaConfigElement(new IncolouringFormulaConfigElement());
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
});
removeIncolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
fractalElement.getContext().updateTimestamp();
for (int i = fractalElement.getIncolouringFormulaConfigElementCount() - 1; i >= 0; i--) {
final IncolouringFormulaConfigElement formulaElement = fractalElement.getIncolouringFormulaConfigElement(i);
if (formulaElement.getUserData() != null) {
fractalElement.removeIncolouringFormulaConfigElement(i);
}
}
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
});
// insertIncolouringFormulaAfterButton.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// for (int i = 0; i < fractalElement.getIncolouringFormulaConfigElementCount(); i++) {
// IncolouringFormulaConfigElement formulaElement = fractalElement.getIncolouringFormulaConfigElement(i);
// if (formulaElement.getUserData() != null) {
// fractalElement.insertIncolouringFormulaConfigElementAfter(i, new IncolouringFormulaConfigElement());
// }
// }
// }
// });
// insertIncolouringFormulaBeforeButton.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// for (int i = fractalElement.getIncolouringFormulaConfigElementCount() - 1; i >= 0; i--) {
// IncolouringFormulaConfigElement formulaElement = fractalElement.getIncolouringFormulaConfigElement(i);
// if (formulaElement.getUserData() != null) {
// fractalElement.insertIncolouringFormulaConfigElementBefore(i, new IncolouringFormulaConfigElement());
// }
// }
// }
// });
appendOutcolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
fractalElement.getContext().updateTimestamp();
for (int i = fractalElement.getOutcolouringFormulaConfigElementCount() - 1; i >= 0; i--) {
final OutcolouringFormulaConfigElement formulaElement = fractalElement.getOutcolouringFormulaConfigElement(i);
if (formulaElement.getUserData() != null) {
fractalElement.insertOutcolouringFormulaConfigElementBefore(i, new OutcolouringFormulaConfigElement());
return;
}
}
fractalElement.appendOutcolouringFormulaConfigElement(new OutcolouringFormulaConfigElement());
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
});
removeOutcolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
fractalElement.getContext().updateTimestamp();
for (int i = fractalElement.getOutcolouringFormulaConfigElementCount() - 1; i >= 0; i--) {
final OutcolouringFormulaConfigElement formulaElement = fractalElement.getOutcolouringFormulaConfigElement(i);
if (formulaElement.getUserData() != null) {
fractalElement.removeOutcolouringFormulaConfigElement(i);
}
}
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
});
// insertOutcolouringFormulaAfterButton.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// for (int i = 0; i < fractalElement.getOutcolouringFormulaConfigElementCount(); i++) {
// OutcolouringFormulaConfigElement formulaElement = fractalElement.getOutcolouringFormulaConfigElement(i);
// if (formulaElement.getUserData() != null) {
// fractalElement.insertOutcolouringFormulaConfigElementAfter(i, new OutcolouringFormulaConfigElement());
// }
// }
// }
// });
// insertOutcolouringFormulaBeforeButton.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// for (int i = fractalElement.getOutcolouringFormulaConfigElementCount() - 1; i >= 0; i--) {
// OutcolouringFormulaConfigElement formulaElement = fractalElement.getOutcolouringFormulaConfigElement(i);
// if (formulaElement.getUserData() != null) {
// fractalElement.insertOutcolouringFormulaConfigElementBefore(i, new OutcolouringFormulaConfigElement());
// }
// }
// }
// });
selectIncolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
boolean allSelected = true;
for (int i = 0; i < incolouringFormulasPanel.getComponentCount(); i++) {
if (!((IncolouringFormulaPanel) incolouringFormulasPanel.getComponent(i)).isSelected()) {
allSelected = false;
}
}
if (allSelected) {
for (int i = 0; i < incolouringFormulasPanel.getComponentCount(); i++) {
((IncolouringFormulaPanel) incolouringFormulasPanel.getComponent(i)).setSelected(false);
}
}
else {
for (int i = 0; i < incolouringFormulasPanel.getComponentCount(); i++) {
((IncolouringFormulaPanel) incolouringFormulasPanel.getComponent(i)).setSelected(true);
}
}
}
});
selectOutcolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
boolean allSelected = true;
for (int i = 0; i < outcolouringFormulasPanel.getComponentCount(); i++) {
if (!((OutcolouringFormulaPanel) outcolouringFormulasPanel.getComponent(i)).isSelected()) {
allSelected = false;
}
}
if (allSelected) {
for (int i = 0; i < outcolouringFormulasPanel.getComponentCount(); i++) {
((OutcolouringFormulaPanel) outcolouringFormulasPanel.getComponent(i)).setSelected(false);
}
}
else {
for (int i = 0; i < outcolouringFormulasPanel.getComponentCount(); i++) {
((OutcolouringFormulaPanel) outcolouringFormulasPanel.getComponent(i)).setSelected(true);
}
}
}
});
moveUpIncolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
fractalElement.getContext().updateTimestamp();
for (int i = 0; i < fractalElement.getIncolouringFormulaConfigElementCount(); i++) {
final IncolouringFormulaConfigElement formulaElement = fractalElement.getIncolouringFormulaConfigElement(i);
if (formulaElement.getUserData() != null) {
fractalElement.moveUpIncolouringFormulaConfigElement(i);
}
}
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
});
moveDownIncolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
fractalElement.getContext().updateTimestamp();
for (int i = fractalElement.getIncolouringFormulaConfigElementCount() - 1; i >= 0; i--) {
final IncolouringFormulaConfigElement formulaElement = fractalElement.getIncolouringFormulaConfigElement(i);
if (formulaElement.getUserData() != null) {
fractalElement.moveDownIncolouringFormulaConfigElement(i);
}
}
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
});
cloneIncolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
fractalElement.getContext().updateTimestamp();
for (int i = fractalElement.getIncolouringFormulaConfigElementCount() - 1; i >= 0; i--) {
final IncolouringFormulaConfigElement formulaElement = fractalElement.getIncolouringFormulaConfigElement(i);
if (formulaElement.getUserData() != null) {
fractalElement.insertIncolouringFormulaConfigElementAfter(i, formulaElement.clone());
}
}
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
});
moveUpOutcolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
fractalElement.getContext().updateTimestamp();
for (int i = 0; i < fractalElement.getOutcolouringFormulaConfigElementCount(); i++) {
final OutcolouringFormulaConfigElement formulaElement = fractalElement.getOutcolouringFormulaConfigElement(i);
if (formulaElement.getUserData() != null) {
fractalElement.moveUpOutcolouringFormulaConfigElement(i);
}
}
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
});
moveDownOutcolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
fractalElement.getContext().updateTimestamp();
for (int i = fractalElement.getOutcolouringFormulaConfigElementCount() - 1; i >= 0; i--) {
final OutcolouringFormulaConfigElement formulaElement = fractalElement.getOutcolouringFormulaConfigElement(i);
if (formulaElement.getUserData() != null) {
fractalElement.moveDownOutcolouringFormulaConfigElement(i);
}
}
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
});
cloneOutcolouringFormulaButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
fractalElement.getContext().updateTimestamp();
for (int i = fractalElement.getOutcolouringFormulaConfigElementCount() - 1; i >= 0; i--) {
final OutcolouringFormulaConfigElement formulaElement = fractalElement.getOutcolouringFormulaConfigElement(i);
if (formulaElement.getUserData() != null) {
fractalElement.insertOutcolouringFormulaConfigElementAfter(i, formulaElement.clone());
}
}
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
});
editIncolouringFormulasButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
viewContext.setComponent(incolouringFormulasPanel2);
}
});
editOutcolouringFormulasButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
viewContext.setComponent(outcolouringFormulasPanel2);
}
});
}
public void dispose() {
fractalElement.getIncolouringFormulaListElement().removeChangeListener(incolouringFormulasListener);
fractalElement.getOutcolouringFormulaListElement().removeChangeListener(outcolouringFormulasListener);
fractalElement.getRenderingFormulaSingleElement().removeChangeListener(renderingFormulaListener);
fractalElement.getTransformingFormulaSingleElement().removeChangeListener(transformingFormulaListener);
fractalElement.getProcessingFormulaConfigElement().removeChangeListener(processingFormulaListener);
fractalElement.getOrbitTrapConfigElement().removeChangeListener(orbitTrapListener);
// fractalElement.getOrbitTrapConfigElement().getCenterElement().removeChangeListener(centerListener);
for (int i = 0; i < outcolouringFormulasPanel.getComponentCount(); i++) {
final OutcolouringFormulaPanel formulaPanel = (OutcolouringFormulaPanel) outcolouringFormulasPanel.getComponent(i);
formulaPanel.dispose();
}
for (int i = 0; i < incolouringFormulasPanel.getComponentCount(); i++) {
final IncolouringFormulaPanel formulaPanel = (IncolouringFormulaPanel) incolouringFormulasPanel.getComponent(i);
formulaPanel.dispose();
}
renderingFormulaPanel.dispose();
transformingFormulaPanel.dispose();
processingFormulaPanel.dispose();
orbitTrapPanel.dispose();
}
private String createEditIncolouringFormulasText(final MandelbrotFractalConfigElement fractalElement) {
if (fractalElement.getIncolouringFormulaConfigElementCount() == 1) {
return fractalElement.getIncolouringFormulaConfigElementCount() + " " + MandelbrotSwingResources.getInstance().getString("label.incolouringFormula");
}
else {
return fractalElement.getIncolouringFormulaConfigElementCount() + " " + MandelbrotSwingResources.getInstance().getString("label.incolouringFormulas");
}
}
private String createEditOutcolouringFormulasText(final MandelbrotFractalConfigElement fractalElement) {
if (fractalElement.getOutcolouringFormulaConfigElementCount() == 1) {
return fractalElement.getOutcolouringFormulaConfigElementCount() + " " + MandelbrotSwingResources.getInstance().getString("label.outcolouringFormula");
}
else {
return fractalElement.getOutcolouringFormulaConfigElementCount() + " " + MandelbrotSwingResources.getInstance().getString("label.outcolouringFormulas");
}
}
private String createIncolouringFormulasPanelName() {
return MandelbrotSwingResources.getInstance().getString("name.incolouringFormulas");
}
private String createOutcolouringFormulasPanelName() {
return MandelbrotSwingResources.getInstance().getString("name.outcolouringFormulas");
}
// private class CenterListener implements ActionListener, FocusListener {
// private final ComplexElement centerElement;
// private final JTextField[] textFields;
//
// public CenterListener(final ComplexElement centerElement, final JTextField[] textFields) {
// this.centerElement = centerElement;
// this.textFields = textFields;
// }
//
// /**
// * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
// */
// public void actionPerformed(final ActionEvent e) {
// final DoubleVector2D c = centerElement.getValue();
// double r = c.getX();
// double i = c.getY();
// try {
// final String text = textFields[0].getText();
// r = Double.parseDouble(text);
// }
// catch (final NumberFormatException nfe) {
// textFields[0].setText(String.valueOf(c.getX()));
// textFields[0].setCaretPosition(0);
// }
// try {
// final String text = textFields[1].getText();
// i = Double.parseDouble(text);
// }
// catch (final NumberFormatException nfe) {
// textFields[1].setText(String.valueOf(c.getY()));
// textFields[1].setCaretPosition(0);
// }
// final DoubleVector2D value = new DoubleVector2D(r, i);
// if (!centerElement.getValue().equals(value)) {
// centerElement.setValue(value);
// }
// context.refresh();
// }
//
// /**
// * @see java.awt.event.FocusListener#focusGained(java.awt.event.FocusEvent)
// */
// public void focusGained(final FocusEvent e) {
// }
//
// /**
// * @see java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent)
// */
// public void focusLost(final FocusEvent e) {
// final DoubleVector2D c = centerElement.getValue();
// double r = c.getX();
// double i = c.getY();
// try {
// final String text = textFields[0].getText();
// r = Double.parseDouble(text);
// }
// catch (final NumberFormatException nfe) {
// textFields[0].setText(String.valueOf(c.getX()));
// textFields[0].setCaretPosition(0);
// }
// try {
// final String text = textFields[1].getText();
// i = Double.parseDouble(text);
// }
// catch (final NumberFormatException nfe) {
// textFields[1].setText(String.valueOf(c.getY()));
// textFields[1].setCaretPosition(0);
// }
// final DoubleVector2D value = new DoubleVector2D(r, i);
// if (!centerElement.getValue().equals(value)) {
// centerElement.setValue(value);
// }
// context.refresh();
// }
// }
}
private class RenderingFormulaPanel extends JPanel {
private static final long serialVersionUID = 1L;
private ViewPanel configView;
private final ValueChangeListener formulaListener;
private final RenderingFormulaConfigElement formulaElement;
/**
* @param fractalElement
* @param formulaElement
*/
public RenderingFormulaPanel(final MandelbrotFractalConfigElement fractalElement, final RenderingFormulaConfigElement formulaElement) {
this.formulaElement = formulaElement;
final ConfigurableExtensionComboBoxModel model = new ConfigurableExtensionComboBoxModel(MandelbrotRegistry.getInstance().getRenderingFormulaRegistry(), true);
final JButton editOptionsButton = createIconTextButton("editConfig", "edit", 120, GUIFactory.DEFAULT_HEIGHT);
final JComboBox extensionComboBox = createExtensionComboBox(model, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel label = createTextLabel("renderingFormula", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final Box formulaPanel = createHorizontalBox(false);
formulaPanel.add(label);
formulaPanel.add(createSpace());
formulaPanel.add(extensionComboBox);
formulaPanel.add(createSpace());
formulaPanel.add(editOptionsButton);
formulaPanel.add(Box.createHorizontalGlue());
formulaPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8));
setLayout(new BorderLayout());
add(formulaPanel, BorderLayout.CENTER);
setOpaque(false);
setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0));
editOptionsButton.setEnabled((formulaElement != null) && (formulaElement.getReference() != null));
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
final ActionListener comboListener = new ActionListener() {
@SuppressWarnings("unchecked")
public void actionPerformed(final ActionEvent e) {
try {
ConfigurableExtension<RenderingFormulaExtensionRuntime<?>, RenderingFormulaExtensionConfig> extension = (ConfigurableExtension<RenderingFormulaExtensionRuntime<?>, RenderingFormulaExtensionConfig>) extensionComboBox.getSelectedItem();
context.acquire();
context.stopRenderers();
formulaElement.getContext().updateTimestamp();
if (extension instanceof NullConfigurableExtension) {
formulaElement.setReference(null);
}
else {
formulaElement.setReference(extension.createConfigurableExtensionReference());
}
context.startRenderers();
context.release();
context.refresh();
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
}
catch (ExtensionException x) {
x.printStackTrace();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
formulaListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: {
editOptionsButton.setEnabled(formulaElement.getReference() != null);
extensionComboBox.removeActionListener(comboListener);
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
else {
model.setSelectedItem(0);
}
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
extensionComboBox.addActionListener(comboListener);
break;
}
default: {
break;
}
}
}
};
formulaElement.getExtensionElement().addChangeListener(formulaListener);
extensionComboBox.addActionListener(comboListener);
editOptionsButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (formulaElement.getReference() != null) {
if (configView == null) {
try {
final Extension<ViewExtensionRuntime> extension = TwisterSwingRegistry.getInstance().getViewExtension(formulaElement.getReference().getExtensionId());
configView = extension.createExtensionRuntime().createView(formulaElement.getReference().getExtensionConfig(), viewContext, context, session);
}
catch (final ExtensionException x) {
configView = new NavigatorViewRuntime().createView(formulaElement.getReference().getExtensionConfig(), viewContext, context, session);
}
}
configView.setName(createRenderingFormulaPanelName());
viewContext.setComponent(configView);
}
}
});
}
public void dispose() {
formulaElement.getExtensionElement().removeChangeListener(formulaListener);
if (configView != null) {
viewContext.removeComponent(configView);
configView.dispose();
configView = null;
}
}
private String createRenderingFormulaPanelName() {
return MandelbrotSwingResources.getInstance().getString("name.renderingFormula");
}
}
private class TransformingFormulaPanel extends JPanel {
private static final long serialVersionUID = 1L;
private ViewPanel configView;
private final TransformingFormulaConfigElement formulaElement;
private final ValueChangeListener formulaListener;
/**
* @param fractalElement
* @param formulaElement
*/
public TransformingFormulaPanel(final MandelbrotFractalConfigElement fractalElement, final TransformingFormulaConfigElement formulaElement) {
this.formulaElement = formulaElement;
final ConfigurableExtensionComboBoxModel model = new ConfigurableExtensionComboBoxModel(MandelbrotRegistry.getInstance().getTransformingFormulaRegistry(), true);
final JButton editOptionsButton = createIconTextButton("editConfig", "edit", 120, GUIFactory.DEFAULT_HEIGHT);
final JComboBox extensionComboBox = createExtensionComboBox(model, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel label = createTextLabel("transformingFormula", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final Box formulaPanel = createHorizontalBox(false);
formulaPanel.add(label);
formulaPanel.add(createSpace());
formulaPanel.add(extensionComboBox);
formulaPanel.add(createSpace());
formulaPanel.add(editOptionsButton);
formulaPanel.add(Box.createHorizontalGlue());
formulaPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8));
setLayout(new BorderLayout());
add(formulaPanel, BorderLayout.CENTER);
setOpaque(false);
setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0));
editOptionsButton.setEnabled((formulaElement != null) && (formulaElement.getReference() != null));
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
final ActionListener comboListener = new ActionListener() {
@SuppressWarnings("unchecked")
public void actionPerformed(final ActionEvent e) {
try {
ConfigurableExtension<TransformingFormulaExtensionRuntime<?>, TransformingFormulaExtensionConfig> extension = (ConfigurableExtension<TransformingFormulaExtensionRuntime<?>, TransformingFormulaExtensionConfig>) extensionComboBox.getSelectedItem();
context.acquire();
context.stopRenderers();
formulaElement.getContext().updateTimestamp();
if (extension instanceof NullConfigurableExtension) {
formulaElement.setReference(null);
}
else {
formulaElement.setReference(extension.createConfigurableExtensionReference());
}
context.startRenderers();
context.release();
context.refresh();
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
}
catch (ExtensionException x) {
x.printStackTrace();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
formulaListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: {
editOptionsButton.setEnabled(formulaElement.getReference() != null);
extensionComboBox.removeActionListener(comboListener);
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
else {
model.setSelectedItem(0);
}
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
extensionComboBox.addActionListener(comboListener);
break;
}
default: {
break;
}
}
}
};
formulaElement.getExtensionElement().addChangeListener(formulaListener);
extensionComboBox.addActionListener(comboListener);
editOptionsButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (formulaElement.getReference() != null) {
if (configView == null) {
try {
final Extension<ViewExtensionRuntime> extension = TwisterSwingRegistry.getInstance().getViewExtension(formulaElement.getReference().getExtensionId());
configView = extension.createExtensionRuntime().createView(formulaElement.getReference().getExtensionConfig(), viewContext, context, session);
}
catch (final ExtensionException x) {
configView = new NavigatorViewRuntime().createView(formulaElement.getReference().getExtensionConfig(), viewContext, context, session);
}
}
configView.setName(createTransformingFormulaPanelName());
viewContext.setComponent(configView);
}
}
});
}
public void dispose() {
formulaElement.getExtensionElement().removeChangeListener(formulaListener);
if (configView != null) {
viewContext.removeComponent(configView);
configView.dispose();
configView = null;
}
}
private String createTransformingFormulaPanelName() {
return MandelbrotSwingResources.getInstance().getString("name.transformingFormula");
}
}
private class ProcessingFormulaPanel extends JPanel {
private static final long serialVersionUID = 1L;
private final ProcessingFormulaConfigElement formulaElement;
private final ValueChangeListener formulaListener;
/**
* @param fractalElement
* @param formulaElement
*/
public ProcessingFormulaPanel(final MandelbrotFractalConfigElement fractalElement, final ProcessingFormulaConfigElement formulaElement) {
this.formulaElement = formulaElement;
final ExtensionComboBoxModel model = new ExtensionComboBoxModel(MandelbrotRegistry.getInstance().getProcessingFormulaRegistry(), true);
final JComboBox extensionComboBox = createExtensionComboBox(model, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel label = createTextLabel("processingFormula", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final Box formulaPanel = createHorizontalBox(false);
formulaPanel.add(label);
formulaPanel.add(createSpace());
formulaPanel.add(extensionComboBox);
formulaPanel.add(createSpace());
formulaPanel.add(Box.createHorizontalGlue());
formulaPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8));
setLayout(new BorderLayout());
add(formulaPanel, BorderLayout.CENTER);
setOpaque(false);
setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0));
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
final ActionListener comboListener = new ActionListener() {
@SuppressWarnings("unchecked")
public void actionPerformed(final ActionEvent e) {
try {
Extension<ProcessingFormulaExtensionRuntime> extension = (Extension<ProcessingFormulaExtensionRuntime>) extensionComboBox.getSelectedItem();
context.acquire();
context.stopRenderers();
formulaElement.getContext().updateTimestamp();
if (extension instanceof NullConfigurableExtension) {
formulaElement.setReference(null);
}
else {
formulaElement.setReference(extension.getExtensionReference());
}
context.startRenderers();
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
formulaListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: {
extensionComboBox.removeActionListener(comboListener);
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
else {
model.setSelectedItem(0);
}
extensionComboBox.addActionListener(comboListener);
break;
}
default: {
break;
}
}
}
};
formulaElement.getExtensionElement().addChangeListener(formulaListener);
extensionComboBox.addActionListener(comboListener);
}
public void dispose() {
formulaElement.getExtensionElement().removeChangeListener(formulaListener);
}
}
private class OrbitTrapPanel extends JPanel {
private static final long serialVersionUID = 1L;
private ViewPanel configView;
private final OrbitTrapConfigElement orbitTrapElement;
private final ValueChangeListener orbitTrapListener;
/**
* @param fractalElement
* @param orbitTrapElement
*/
public OrbitTrapPanel(final MandelbrotFractalConfigElement fractalElement, final OrbitTrapConfigElement orbitTrapElement) {
this.orbitTrapElement = orbitTrapElement;
final ConfigurableExtensionComboBoxModel model = new ConfigurableExtensionComboBoxModel(MandelbrotRegistry.getInstance().getOrbitTrapRegistry(), true);
final JButton editOptionsButton = createIconTextButton("editConfig", "edit", 120, GUIFactory.DEFAULT_HEIGHT);
final JComboBox extensionComboBox = createExtensionComboBox(model, 200, GUIFactory.DEFAULT_HEIGHT);
final JLabel label = createTextLabel("orbitTrap", SwingConstants.LEFT, 200, GUIFactory.DEFAULT_HEIGHT);
final Box formulaPanel = createHorizontalBox(false);
formulaPanel.add(label);
formulaPanel.add(createSpace());
formulaPanel.add(extensionComboBox);
formulaPanel.add(createSpace());
formulaPanel.add(editOptionsButton);
formulaPanel.add(Box.createHorizontalGlue());
formulaPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8));
setLayout(new BorderLayout());
add(formulaPanel, BorderLayout.CENTER);
setOpaque(false);
setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0));
editOptionsButton.setEnabled((orbitTrapElement != null) && (orbitTrapElement.getReference() != null));
if (orbitTrapElement.getReference() != null) {
model.setSelectedItemByExtensionId(orbitTrapElement.getReference().getExtensionId());
}
final ActionListener comboListener = new ActionListener() {
@SuppressWarnings("unchecked")
public void actionPerformed(final ActionEvent e) {
try {
ConfigurableExtension<OrbitTrapExtensionRuntime<?>, OrbitTrapExtensionConfig> extension = (ConfigurableExtension<OrbitTrapExtensionRuntime<?>, OrbitTrapExtensionConfig>) extensionComboBox.getSelectedItem();
context.acquire();
context.stopRenderers();
orbitTrapElement.getContext().updateTimestamp();
if (extension instanceof NullConfigurableExtension) {
orbitTrapElement.setReference(null);
}
else {
orbitTrapElement.setReference(extension.createConfigurableExtensionReference());
}
context.startRenderers();
context.release();
context.refresh();
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
}
catch (ExtensionException x) {
x.printStackTrace();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
orbitTrapListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: {
editOptionsButton.setEnabled(orbitTrapElement.getReference() != null);
extensionComboBox.removeActionListener(comboListener);
if (orbitTrapElement.getReference() != null) {
model.setSelectedItemByExtensionId(orbitTrapElement.getReference().getExtensionId());
}
else {
model.setSelectedItem(0);
}
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
extensionComboBox.addActionListener(comboListener);
break;
}
default: {
break;
}
}
}
};
orbitTrapElement.getExtensionElement().addChangeListener(orbitTrapListener);
extensionComboBox.addActionListener(comboListener);
editOptionsButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (orbitTrapElement.getReference() != null) {
if (configView == null) {
try {
final Extension<ViewExtensionRuntime> extension = TwisterSwingRegistry.getInstance().getViewExtension(orbitTrapElement.getReference().getExtensionId());
configView = extension.createExtensionRuntime().createView(orbitTrapElement.getReference().getExtensionConfig(), viewContext, context, session);
}
catch (final ExtensionException x) {
configView = new NavigatorViewRuntime().createView(orbitTrapElement.getReference().getExtensionConfig(), viewContext, context, session);
}
}
configView.setName(createOrbitTrapPanelName());
viewContext.setComponent(configView);
}
}
});
}
public void dispose() {
orbitTrapElement.getExtensionElement().removeChangeListener(orbitTrapListener);
if (configView != null) {
viewContext.removeComponent(configView);
configView.dispose();
configView = null;
}
}
private String createOrbitTrapPanelName() {
return MandelbrotSwingResources.getInstance().getString("name.orbitTrap");
}
}
private class IncolouringFormulaPanel extends JPanel {
private static final long serialVersionUID = 1L;
private final JCheckBox selectedCheckBox = createCheckBox();
private ViewPanel configView;
private final IncolouringFormulaConfigElement formulaElement;
private final ValueChangeListener formulaListener;
private final ValueChangeListener lockedListener;
private final ValueChangeListener enabledListener;
private final ValueChangeListener labelListener;
private final ValueChangeListener autoIterationsListener;
private final ValueChangeListener iterationsListener;
private final ValueChangeListener opacityListener;
/**
* @param fractalElement
* @param formulaElement
*/
public IncolouringFormulaPanel(final MandelbrotFractalConfigElement fractalElement, final IncolouringFormulaConfigElement formulaElement) {
this.formulaElement = formulaElement;
final ConfigurableExtensionComboBoxModel model = new ConfigurableExtensionComboBoxModel(MandelbrotRegistry.getInstance().getIncolouringFormulaRegistry(), true);
final JButton editOptionsButton = createIconTextButton("editConfig", "edit", 120, GUIFactory.DEFAULT_HEIGHT);
final JCheckBox lockedCheckBox = createIconCheckBox("locked", "locked", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JCheckBox enabledCheckBox = createIconCheckBox("enabled", "visible", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JCheckBox autoIterationsCheckBox = createIconCheckBox("autoIterations", "locked", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JSpinner opacitySpinner = createSpinner(0, 100, 1);
final JSpinner iterationsSpinner = createSpinner(0, 5000, 1);
final JComboBox extensionComboBox = createExtensionComboBox(model, 140, GUIFactory.DEFAULT_HEIGHT);
final JTextField label = createTextField(formulaElement.getLabel(), 200, GUIFactory.DEFAULT_HEIGHT);
final Box formulaPanel = createHorizontalBox(false);
formulaPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8));
formulaPanel.add(createSpace());
formulaPanel.add(selectedCheckBox);
formulaPanel.add(label);
formulaPanel.add(createSpace());
formulaPanel.add(opacitySpinner);
formulaPanel.add(createSpace());
formulaPanel.add(lockedCheckBox);
formulaPanel.add(createSpace());
formulaPanel.add(enabledCheckBox);
formulaPanel.add(createSpace());
formulaPanel.add(iterationsSpinner);
formulaPanel.add(createSpace());
formulaPanel.add(autoIterationsCheckBox);
formulaPanel.add(Box.createHorizontalGlue());
formulaPanel.add(extensionComboBox);
formulaPanel.add(createSpace());
formulaPanel.add(editOptionsButton);
setLayout(new BorderLayout());
add(formulaPanel, BorderLayout.CENTER);
setOpaque(false);
setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0));
lockedCheckBox.setSelected(formulaElement.isLocked());
enabledCheckBox.setSelected(formulaElement.isEnabled());
editOptionsButton.setEnabled((formulaElement != null) && (formulaElement.getReference() != null));
opacitySpinner.setValue(formulaElement.getOpacity().intValue());
opacitySpinner.setToolTipText(createOpacityTooltip(opacitySpinner));
iterationsSpinner.setValue(formulaElement.getIterations());
iterationsSpinner.setToolTipText(createIterationsTooltip(iterationsSpinner));
autoIterationsCheckBox.setSelected(formulaElement.getAutoIterations());
iterationsSpinner.setEnabled(!autoIterationsCheckBox.isSelected());
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
final ActionListener comboListener = new ActionListener() {
@SuppressWarnings("unchecked")
public void actionPerformed(final ActionEvent e) {
try {
ConfigurableExtension<IncolouringFormulaExtensionRuntime<?>, IncolouringFormulaExtensionConfig> extension = (ConfigurableExtension<IncolouringFormulaExtensionRuntime<?>, IncolouringFormulaExtensionConfig>) extensionComboBox.getSelectedItem();
context.acquire();
context.stopRenderers();
formulaElement.getContext().updateTimestamp();
if (extension instanceof NullConfigurableExtension) {
formulaElement.setReference(null);
}
else {
formulaElement.setReference(extension.createConfigurableExtensionReference());
}
context.startRenderers();
context.release();
context.refresh();
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
}
catch (ExtensionException x) {
x.printStackTrace();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
extensionComboBox.addActionListener(comboListener);
editOptionsButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (formulaElement.getReference() != null) {
if (configView == null) {
try {
final Extension<ViewExtensionRuntime> extension = TwisterSwingRegistry.getInstance().getViewExtension(formulaElement.getReference().getExtensionId());
configView = extension.createExtensionRuntime().createView(formulaElement.getReference().getExtensionConfig(), viewContext, context, session);
}
catch (final ExtensionException x) {
configView = new NavigatorViewRuntime().createView(formulaElement.getReference().getExtensionConfig(), viewContext, context, session);
}
}
if (configView != null) {
configView.setName(createIncolouringFormulaPanelName(formulaElement));
}
viewContext.setComponent(configView);
}
}
});
label.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// formulaElement.getLabelElement().removeChangeListener(labelListener);
formulaElement.getContext().updateTimestamp();
formulaElement.setLabel(label.getText());
if (configView != null) {
configView.setName(createIncolouringFormulaPanelName(formulaElement));
}
// formulaElement.getLabelElement().addChangeListener(labelListener);
}
});
selectedCheckBox.addItemListener(new ItemListener() {
public void itemStateChanged(final ItemEvent e) {
if (selectedCheckBox.isSelected()) {
formulaElement.setUserData(Boolean.TRUE);
}
else {
formulaElement.setUserData(null);
}
}
});
final ActionListener autoIterationsActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
formulaElement.getContext().updateTimestamp();
formulaElement.setAutoIterations(autoIterationsCheckBox.isSelected());
iterationsSpinner.setEnabled(!autoIterationsCheckBox.isSelected());
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
autoIterationsCheckBox.addActionListener(autoIterationsActionListener);
final ChangeListener iterationsChangeListener = new ChangeListener() {
public void stateChanged(final ChangeEvent e) {
try {
context.acquire();
formulaElement.getContext().updateTimestamp();
formulaElement.setIterations(((Number) iterationsSpinner.getValue()).intValue());
iterationsSpinner.setToolTipText(createIterationsTooltip(iterationsSpinner));
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
iterationsSpinner.addChangeListener(iterationsChangeListener);
final ChangeListener opacityChangeListener = new ChangeListener() {
public void stateChanged(final ChangeEvent e) {
try {
context.acquire();
formulaElement.getContext().updateTimestamp();
formulaElement.setOpacity(((Number) opacitySpinner.getValue()).intValue());
opacitySpinner.setToolTipText(createOpacityTooltip(opacitySpinner));
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
opacitySpinner.addChangeListener(opacityChangeListener);
final ActionListener lockedActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
formulaElement.getContext().updateTimestamp();
formulaElement.setLocked(lockedCheckBox.isSelected());
context.release();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
lockedCheckBox.addActionListener(lockedActionListener);
final ActionListener enabledActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
formulaElement.getContext().updateTimestamp();
formulaElement.setEnabled(enabledCheckBox.isSelected());
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
enabledCheckBox.addActionListener(enabledActionListener);
formulaListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: {
editOptionsButton.setEnabled(formulaElement.getReference() != null);
extensionComboBox.removeActionListener(comboListener);
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
else {
model.setSelectedItem(0);
}
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
extensionComboBox.addActionListener(comboListener);
break;
}
default: {
break;
}
}
}
};
lockedListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
lockedCheckBox.removeActionListener(lockedActionListener);
lockedCheckBox.setSelected(formulaElement.isLocked());
lockedCheckBox.addActionListener(lockedActionListener);
}
};
enabledListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
enabledCheckBox.removeActionListener(enabledActionListener);
enabledCheckBox.setSelected(formulaElement.isEnabled());
enabledCheckBox.addActionListener(enabledActionListener);
}
};
labelListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
label.setText(formulaElement.getLabel());
if (configView != null) {
configView.setName(createIncolouringFormulaPanelName(formulaElement));
}
}
};
autoIterationsListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
autoIterationsCheckBox.removeActionListener(autoIterationsActionListener);
iterationsSpinner.removeChangeListener(iterationsChangeListener);
autoIterationsCheckBox.setSelected(formulaElement.getAutoIterations());
iterationsSpinner.setEnabled(!autoIterationsCheckBox.isSelected());
autoIterationsCheckBox.addActionListener(autoIterationsActionListener);
iterationsSpinner.addChangeListener(iterationsChangeListener);
}
};
iterationsListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
iterationsSpinner.removeChangeListener(iterationsChangeListener);
iterationsSpinner.setValue(formulaElement.getIterations());
iterationsSpinner.addChangeListener(iterationsChangeListener);
}
};
opacityListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
opacitySpinner.removeChangeListener(opacityChangeListener);
opacitySpinner.setValue(formulaElement.getOpacity().intValue());
opacitySpinner.addChangeListener(opacityChangeListener);
}
};
formulaElement.getLabelElement().addChangeListener(labelListener);
formulaElement.getLockedElement().addChangeListener(lockedListener);
formulaElement.getEnabledElement().addChangeListener(enabledListener);
formulaElement.getExtensionElement().addChangeListener(formulaListener);
formulaElement.getAutoIterationsElement().addChangeListener(autoIterationsListener);
formulaElement.getIterationsElement().addChangeListener(iterationsListener);
formulaElement.getOpacityElement().addChangeListener(opacityListener);
}
public void dispose() {
formulaElement.getLabelElement().removeChangeListener(labelListener);
formulaElement.getLockedElement().removeChangeListener(lockedListener);
formulaElement.getEnabledElement().removeChangeListener(enabledListener);
formulaElement.getExtensionElement().removeChangeListener(formulaListener);
formulaElement.getAutoIterationsElement().removeChangeListener(autoIterationsListener);
formulaElement.getIterationsElement().removeChangeListener(iterationsListener);
formulaElement.getOpacityElement().removeChangeListener(opacityListener);
if (configView != null) {
viewContext.removeComponent(configView);
configView.dispose();
configView = null;
}
}
private String createOpacityTooltip(final JSpinner opacitySpinner) {
return MandelbrotSwingResources.getInstance().getString("label.opacity") + " " + opacitySpinner.getValue() + "%";
}
private String createIterationsTooltip(final JSpinner iterationsSpinner) {
return MandelbrotSwingResources.getInstance().getString("label.iterations") + " " + iterationsSpinner.getValue();
}
private String createIncolouringFormulaPanelName(final IncolouringFormulaConfigElement formulaElement) {
return formulaElement.getLabel();
}
/**
* @param selected
*/
public void setSelected(final boolean selected) {
selectedCheckBox.setSelected(selected);
}
/**
* @return
*/
public boolean isSelected() {
return selectedCheckBox.isSelected();
}
}
private class OutcolouringFormulaPanel extends JPanel {
private static final long serialVersionUID = 1L;
private final JCheckBox selectedCheckBox = createCheckBox();
private ViewPanel configView;
private final OutcolouringFormulaConfigElement formulaElement;
private ValueChangeListener formulaListener;
private final ValueChangeListener lockedListener;
private final ValueChangeListener enabledListener;
private final ValueChangeListener labelListener;
private final ValueChangeListener autoIterationsListener;
private final ValueChangeListener iterationsListener;
private final ValueChangeListener opacityListener;
/**
* @param fractalElement
* @param formulaElement
*/
public OutcolouringFormulaPanel(final MandelbrotFractalConfigElement fractalElement, final OutcolouringFormulaConfigElement formulaElement) {
this.formulaElement = formulaElement;
final ConfigurableExtensionComboBoxModel model = new ConfigurableExtensionComboBoxModel(MandelbrotRegistry.getInstance().getOutcolouringFormulaRegistry(), true);
final JButton editOptionsButton = createIconTextButton("editConfig", "edit", 120, GUIFactory.DEFAULT_HEIGHT);
final JCheckBox lockedCheckBox = createIconCheckBox("locked", "locked", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JCheckBox enabledCheckBox = createIconCheckBox("enabled", "visible", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JCheckBox autoIterationsCheckBox = createIconCheckBox("autoIterations", "locked", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT);
final JSpinner opacitySpinner = createSpinner(0, 100, 1);
final JSpinner iterationsSpinner = createSpinner(0, 5000, 1);
final JComboBox extensionComboBox = createExtensionComboBox(model, 140, GUIFactory.DEFAULT_HEIGHT);
final JTextField label = createTextField(formulaElement.getLabel(), 200, GUIFactory.DEFAULT_HEIGHT);
final Box formulaPanel = createHorizontalBox(false);
formulaPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8));
formulaPanel.add(createSpace());
formulaPanel.add(selectedCheckBox);
formulaPanel.add(label);
formulaPanel.add(createSpace());
formulaPanel.add(opacitySpinner);
formulaPanel.add(createSpace());
formulaPanel.add(lockedCheckBox);
formulaPanel.add(createSpace());
formulaPanel.add(enabledCheckBox);
formulaPanel.add(createSpace());
formulaPanel.add(iterationsSpinner);
formulaPanel.add(createSpace());
formulaPanel.add(autoIterationsCheckBox);
formulaPanel.add(Box.createHorizontalGlue());
formulaPanel.add(extensionComboBox);
formulaPanel.add(createSpace());
formulaPanel.add(editOptionsButton);
setLayout(new BorderLayout());
add(formulaPanel, BorderLayout.CENTER);
setOpaque(false);
setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0));
lockedCheckBox.setSelected(formulaElement.isLocked());
enabledCheckBox.setSelected(formulaElement.isEnabled());
editOptionsButton.setEnabled((formulaElement != null) && (formulaElement.getReference() != null));
opacitySpinner.setValue(formulaElement.getOpacity().intValue());
opacitySpinner.setToolTipText(createOpacityTooltip(opacitySpinner));
iterationsSpinner.setValue(formulaElement.getIterations());
iterationsSpinner.setToolTipText(createIterationsTooltip(iterationsSpinner));
autoIterationsCheckBox.setSelected(formulaElement.getAutoIterations());
iterationsSpinner.setEnabled(!autoIterationsCheckBox.isSelected());
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
final ActionListener comboListener = new ActionListener() {
@SuppressWarnings("unchecked")
public void actionPerformed(final ActionEvent e) {
try {
ConfigurableExtension<OutcolouringFormulaExtensionRuntime<?>, OutcolouringFormulaExtensionConfig> extension = (ConfigurableExtension<OutcolouringFormulaExtensionRuntime<?>, OutcolouringFormulaExtensionConfig>) extensionComboBox.getSelectedItem();
context.acquire();
context.stopRenderers();
formulaElement.getContext().updateTimestamp();
if (extension instanceof NullConfigurableExtension) {
formulaElement.setReference(null);
}
else {
formulaElement.setReference(extension.createConfigurableExtensionReference());
}
context.startRenderers();
context.release();
context.refresh();
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
}
catch (ExtensionException x) {
x.printStackTrace();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
formulaListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: {
editOptionsButton.setEnabled(formulaElement.getReference() != null);
extensionComboBox.removeActionListener(comboListener);
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
else {
model.setSelectedItem(0);
}
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
extensionComboBox.addActionListener(comboListener);
break;
}
default: {
break;
}
}
}
};
extensionComboBox.addActionListener(comboListener);
editOptionsButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (formulaElement.getReference() != null) {
if (configView == null) {
try {
final Extension<ViewExtensionRuntime> extension = TwisterSwingRegistry.getInstance().getViewExtension(formulaElement.getReference().getExtensionId());
configView = extension.createExtensionRuntime().createView(formulaElement.getReference().getExtensionConfig(), viewContext, context, session);
}
catch (final ExtensionException x) {
configView = new NavigatorViewRuntime().createView(formulaElement.getReference().getExtensionConfig(), viewContext, context, session);
}
}
if (configView != null) {
configView.setName(createOutcolouringFormulaPanelName(formulaElement));
}
viewContext.setComponent(configView);
}
}
});
label.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// formulaElement.getLabelElement().removeChangeListener(labelListener);
formulaElement.getContext().updateTimestamp();
formulaElement.setLabel(label.getText());
if (configView != null) {
configView.setName(createOutcolouringFormulaPanelName(formulaElement));
}
// formulaElement.getLabelElement().addChangeListener(labelListener);
}
});
selectedCheckBox.addItemListener(new ItemListener() {
public void itemStateChanged(final ItemEvent e) {
if (selectedCheckBox.isSelected()) {
formulaElement.setUserData(Boolean.TRUE);
}
else {
formulaElement.setUserData(null);
}
}
});
final ActionListener autoIterationsActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
formulaElement.getContext().updateTimestamp();
formulaElement.setAutoIterations(autoIterationsCheckBox.isSelected());
iterationsSpinner.setEnabled(!autoIterationsCheckBox.isSelected());
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
autoIterationsCheckBox.addActionListener(autoIterationsActionListener);
final ChangeListener iterationsChangeListener = new ChangeListener() {
public void stateChanged(final ChangeEvent e) {
try {
context.acquire();
formulaElement.getContext().updateTimestamp();
formulaElement.setIterations(((Number) iterationsSpinner.getValue()).intValue());
iterationsSpinner.setToolTipText(createIterationsTooltip(iterationsSpinner));
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
iterationsSpinner.addChangeListener(iterationsChangeListener);
final ChangeListener opacityChangeListener = new ChangeListener() {
public void stateChanged(final ChangeEvent e) {
try {
context.acquire();
formulaElement.getContext().updateTimestamp();
formulaElement.setOpacity(((Number) opacitySpinner.getValue()).intValue());
opacitySpinner.setToolTipText(createOpacityTooltip(opacitySpinner));
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
opacitySpinner.addChangeListener(opacityChangeListener);
final ActionListener lockedActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
formulaElement.getContext().updateTimestamp();
formulaElement.setLocked(lockedCheckBox.isSelected());
context.release();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
lockedCheckBox.addActionListener(lockedActionListener);
final ActionListener enabledActionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
context.acquire();
formulaElement.getContext().updateTimestamp();
formulaElement.setEnabled(enabledCheckBox.isSelected());
context.release();
context.refresh();
}
catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
}
};
enabledCheckBox.addActionListener(enabledActionListener);
formulaListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: {
editOptionsButton.setEnabled(formulaElement.getReference() != null);
extensionComboBox.removeActionListener(comboListener);
if (formulaElement.getReference() != null) {
model.setSelectedItemByExtensionId(formulaElement.getReference().getExtensionId());
}
else {
model.setSelectedItem(0);
}
if (configView != null) {
viewContext.removeComponent(configView);
configView = null;
}
extensionComboBox.addActionListener(comboListener);
break;
}
default: {
break;
}
}
}
};
lockedListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
lockedCheckBox.removeActionListener(lockedActionListener);
lockedCheckBox.setSelected(formulaElement.isLocked());
lockedCheckBox.addActionListener(lockedActionListener);
}
};
enabledListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
enabledCheckBox.removeActionListener(enabledActionListener);
enabledCheckBox.setSelected(formulaElement.isEnabled());
enabledCheckBox.addActionListener(enabledActionListener);
}
};
labelListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
label.setText(formulaElement.getLabel());
if (configView != null) {
configView.setName(createOutcolouringFormulaPanelName(formulaElement));
}
}
};
autoIterationsListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
autoIterationsCheckBox.removeActionListener(autoIterationsActionListener);
iterationsSpinner.removeChangeListener(iterationsChangeListener);
autoIterationsCheckBox.setSelected(formulaElement.getAutoIterations());
iterationsSpinner.setEnabled(!autoIterationsCheckBox.isSelected());
autoIterationsCheckBox.addActionListener(autoIterationsActionListener);
iterationsSpinner.addChangeListener(iterationsChangeListener);
}
};
iterationsListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
iterationsSpinner.removeChangeListener(iterationsChangeListener);
iterationsSpinner.setValue(formulaElement.getIterations());
iterationsSpinner.addChangeListener(iterationsChangeListener);
}
};
opacityListener = new ValueChangeListener() {
public void valueChanged(final ValueChangeEvent e) {
opacitySpinner.removeChangeListener(opacityChangeListener);
opacitySpinner.setValue(formulaElement.getOpacity().intValue());
opacitySpinner.addChangeListener(opacityChangeListener);
}
};
formulaElement.getLabelElement().addChangeListener(labelListener);
formulaElement.getLockedElement().addChangeListener(lockedListener);
formulaElement.getEnabledElement().addChangeListener(enabledListener);
formulaElement.getExtensionElement().addChangeListener(formulaListener);
formulaElement.getAutoIterationsElement().addChangeListener(autoIterationsListener);
formulaElement.getIterationsElement().addChangeListener(iterationsListener);
formulaElement.getOpacityElement().addChangeListener(opacityListener);
}
public void dispose() {
formulaElement.getLabelElement().removeChangeListener(labelListener);
formulaElement.getLockedElement().removeChangeListener(lockedListener);
formulaElement.getEnabledElement().removeChangeListener(enabledListener);
formulaElement.getExtensionElement().removeChangeListener(formulaListener);
formulaElement.getAutoIterationsElement().removeChangeListener(autoIterationsListener);
formulaElement.getIterationsElement().removeChangeListener(iterationsListener);
formulaElement.getOpacityElement().removeChangeListener(opacityListener);
if (configView != null) {
viewContext.removeComponent(configView);
configView.dispose();
configView = null;
}
}
private String createOpacityTooltip(final JSpinner opacitySpinner) {
return MandelbrotSwingResources.getInstance().getString("label.opacity") + " " + opacitySpinner.getValue() + "%";
}
private String createIterationsTooltip(final JSpinner iterationsSpinner) {
return MandelbrotSwingResources.getInstance().getString("label.iterations") + " " + iterationsSpinner.getValue();
}
private String createOutcolouringFormulaPanelName(final OutcolouringFormulaConfigElement formulaElement) {
return formulaElement.getLabel();
}
/**
* @param selected
*/
public void setSelected(final boolean selected) {
selectedCheckBox.setSelected(selected);
}
/**
* @return
*/
public boolean isSelected() {
return selectedCheckBox.isSelected();
}
}
}