/* * JAME 6.2.1 * http://jame.sourceforge.net * * Copyright 2001, 2016 Andrea Medeghini * * This file is part of JAME. * * JAME is an application for creating fractals and other graphics artifacts. * * JAME is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JAME is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with JAME. If not, see <http://www.gnu.org/licenses/>. * */ package net.sf.jame.twister.swing; import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.LayoutManager; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.ComboBoxModel; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; 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.color.ColorChangeEvent; import net.sf.jame.core.swing.color.ColorChangeListener; import net.sf.jame.core.swing.color.ColorChooser; import net.sf.jame.core.swing.color.ColorField; import net.sf.jame.core.swing.extension.ConfigurableExtensionComboBoxModel; import net.sf.jame.core.swing.extension.ExtensionListCellRenderer; import net.sf.jame.core.swing.util.GUIFactory; import net.sf.jame.core.swing.util.GUIUtil; import net.sf.jame.core.swing.util.StackLayout; import net.sf.jame.core.tree.NodeSession; import net.sf.jame.core.util.Color32bit; import net.sf.jame.core.util.IntegerVector2D; import net.sf.jame.core.util.RenderContext; import net.sf.jame.core.util.RenderContextListener; import net.sf.jame.core.util.Tile; import net.sf.jame.twister.TwisterConfig; import net.sf.jame.twister.TwisterRegistry; import net.sf.jame.twister.TwisterRuntime; import net.sf.jame.twister.effect.EffectConfigElement; import net.sf.jame.twister.effect.extension.EffectExtensionConfig; import net.sf.jame.twister.effect.extension.EffectExtensionRuntime; import net.sf.jame.twister.frame.FrameConfigElement; import net.sf.jame.twister.frameFilter.FrameFilterConfigElement; import net.sf.jame.twister.frameFilter.extension.FrameFilterExtensionConfig; import net.sf.jame.twister.frameFilter.extension.FrameFilterExtensionRuntime; import net.sf.jame.twister.image.ImageConfigElement; import net.sf.jame.twister.image.extension.ImageExtensionConfig; import net.sf.jame.twister.image.extension.ImageExtensionRuntime; import net.sf.jame.twister.layer.GroupLayerConfigElement; import net.sf.jame.twister.layer.ImageLayerConfigElement; import net.sf.jame.twister.layer.LayerConfigElement; import net.sf.jame.twister.layerFilter.LayerFilterConfigElement; import net.sf.jame.twister.layerFilter.extension.LayerFilterExtensionConfig; import net.sf.jame.twister.layerFilter.extension.LayerFilterExtensionRuntime; import net.sf.jame.twister.renderer.DefaultTwisterRenderer; import net.sf.jame.twister.renderer.TwisterRenderer; import net.sf.jame.twister.renderer.TwisterRenderingHints; import net.sf.jame.twister.swing.view.NavigatorViewRuntime; import net.sf.jame.twister.swing.view.extension.ViewExtensionRuntime; /** * @author Andrea Medeghini */ public class TwisterConfigPanel extends ViewPanel { private static final Logger logger = Logger.getLogger(TwisterConfigPanel.class.getName()); private static final long serialVersionUID = 1L; private final ViewContext viewContext; private final RenderContext context; private final NodeSession session; private final TwisterConfig config; private final ConfigPanel configPanel; private final Color oddColor; private final Color evenColor; private RepaintTask refreshPreview; /** * @param config * @param viewContext * @param context * @param session */ public TwisterConfigPanel(final TwisterConfig config, final ViewContext viewContext, final RenderContext context, final NodeSession session) { this.viewContext = viewContext; this.context = context; this.session = session; this.config = config; refreshPreview = new RepaintTask(); setLayout(new BorderLayout()); oddColor = getBackground().brighter(); evenColor = getBackground().brighter(); configPanel = new ConfigPanel(config); add(configPanel, BorderLayout.CENTER); refreshPreview.start(); } public void dispose() { config.getContext().setParentConfigContext(null); if (refreshPreview != null) { refreshPreview.stop(); } configPanel.dispose(); } private static JCheckBox createIconCheckBox(final String key, final String iconKey, final int width, final int height) { final JCheckBox checkbox = GUIFactory.createCheckBox((String) null, TwisterSwingResources.getInstance().getString("tooltip." + key)); try { checkbox.setIcon(new ImageIcon(ImageIO.read(TwisterConfigPanel.class.getResourceAsStream("/icons/" + iconKey + "-icon.png")))); checkbox.setSelectedIcon(new ImageIcon(ImageIO.read(TwisterConfigPanel.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, TwisterSwingResources.getInstance().getString("tooltip." + key)); 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.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(TwisterSwingResources.getInstance().getString("label." + key), TwisterSwingResources.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(TwisterSwingResources.getInstance().getString("label." + key), TwisterSwingResources.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(TwisterSwingResources.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 static JSlider createSlider(final String key, final int min, final int max, final int value, final int spacing, final String suffix) { // final JSlider slider = new JSlider(min, max); // final int mid = (min + max) / 2; // final Dictionary<Integer, JLabel> labels = new Hashtable<Integer, JLabel>(); // labels.put(new Integer(min), GUIFactory.createLabel(String.valueOf(min) + suffix)); // labels.put(new Integer(mid), GUIFactory.createLabel(String.valueOf(mid) + suffix)); // labels.put(new Integer(max), GUIFactory.createLabel(String.valueOf(max) + suffix)); // slider.setLabelTable(labels); // slider.setMajorTickSpacing(spacing); // slider.setPaintTicks(true); // slider.setPaintTrack(true); // slider.setPaintLabels(true); // slider.setValue(value); // slider.setToolTipText(MandelbrotSwingResources.getInstance().getString("tooltip." + key) + " " + slider.getValue() + suffix); // slider.addChangeListener(new SliderChangeListener(slider, key)); // slider.setOpaque(false); // slider.setFont(SMALL_FONT); // return slider; // } private class ConfigPanel extends JPanel { private static final long serialVersionUID = 1L; private final TwisterConfig config; private EffectPanel effectPanel; private final ValueChangeListener filtersListener; private final ValueChangeListener layersListener; private final ValueChangeListener frameListener; private final ValueChangeListener effectListener; private final ValueChangeListener backgroundListener; private final JPanel filtersPanel; private final JPanel layersPanel; private final JPanel layersPanel2; private final JPanel filtersPanel2; /** * @param config */ public ConfigPanel(final TwisterConfig config) { this.config = config; final JButton selectGroupButton = createIconButton("selectGroups", "select", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton appendGroupButton = createIconButton("appendGroup", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton removeGroupButton = createIconButton("removeGroups", "remove", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton moveUpGroupButton = createIconButton("moveUpGroup", "up", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton moveDownGroupButton = createIconButton("moveDownGroup", "down", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton cloneGroupButton = createIconButton("cloneGroup", "clone", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); // final JButton insertGroupAfterButton = createIconButton("insertGroupAfter", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); // final JButton insertGroupBeforeButton = createIconButton("insertGroupBefore", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton selectFilterButton = createIconButton("selectFilters", "select", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton appendFilterButton = createIconButton("appendFilter", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton removeFilterButton = createIconButton("removeFilters", "remove", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton moveUpFilterButton = createIconButton("moveUpFilter", "up", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton moveDownFilterButton = createIconButton("moveDownFilter", "down", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton cloneFilterButton = createIconButton("cloneFilter", "clone", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); // final JButton insertFilterAfterButton = createIconButton("insertFilterAfter", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); // final JButton insertFilterBeforeButton = createIconButton("insertFilterBefore", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton editLayersButton = createTextButton("editLayers", 120, GUIFactory.DEFAULT_HEIGHT); final JButton editFiltersButton = createTextButton("editFilters", 120, GUIFactory.DEFAULT_HEIGHT); final JButton editEffectsButton = createTextButton("editEffects", 120, GUIFactory.DEFAULT_HEIGHT); final JButton editBackgroundButton = createTextButton("editBackground", 120, GUIFactory.DEFAULT_HEIGHT); final JButton colorChooseButton = createIconTextButton("editColor", "edit", 110, GUIFactory.DEFAULT_HEIGHT); layersPanel = createPanel(new StackLayout(), false); filtersPanel = createPanel(new StackLayout(), false); effectPanel = new EffectPanel(config, config.getEffectConfigElement()); effectPanel.setName(createEffectPanelName(config.getEffectConfigElement())); effectPanel.setOpaque(true); final JLabel colorLabel = createTextLabel("background", SwingConstants.LEFT, 150, GUIFactory.DEFAULT_HEIGHT); colorLabel.setFont(GUIFactory.NORMAL_FONT); colorLabel.setHorizontalAlignment(SwingConstants.CENTER); final ColorField colorField = new ColorField(); colorField.setPreferredSize(new Dimension(GUIFactory.DEFAULT_HEIGHT * 3, GUIFactory.DEFAULT_HEIGHT * 3)); colorField.setMinimumSize(new Dimension(GUIFactory.DEFAULT_HEIGHT * 3, GUIFactory.DEFAULT_HEIGHT * 3)); colorField.setMaximumSize(new Dimension(GUIFactory.DEFAULT_HEIGHT * 3, GUIFactory.DEFAULT_HEIGHT * 3)); colorField.setBorder(BorderFactory.createLineBorder(Color.BLACK)); colorField.setOpaque(false); final Box colorPanel = createHorizontalBox(true); colorPanel.setName(TwisterSwingResources.getInstance().getString("name.background")); colorPanel.add(Box.createHorizontalGlue()); colorPanel.add(colorLabel); colorPanel.add(colorField); colorPanel.add(Box.createHorizontalStrut(16)); colorPanel.add(colorChooseButton); colorPanel.add(Box.createHorizontalGlue()); colorPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.DARK_GRAY)); colorField.setColor(new Color(config.getBackground().getARGB(), true)); final Box layersPanel4 = createHorizontalBox(false); layersPanel4.add(Box.createHorizontalGlue()); layersPanel4.add(selectGroupButton); layersPanel4.add(createSpace()); layersPanel4.add(appendGroupButton); layersPanel4.add(createSpace()); layersPanel4.add(removeGroupButton); layersPanel4.add(createSpace()); layersPanel4.add(moveUpGroupButton); layersPanel4.add(createSpace()); layersPanel4.add(moveDownGroupButton); layersPanel4.add(createSpace()); layersPanel4.add(cloneGroupButton); // layersPanel4.add(insertGroupAfterButton); // layersPanel4.add(insertGroupBeforeButton); layersPanel4.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY), BorderFactory.createEmptyBorder(4, 4, 4, 4))); final JLabel layersLabel = createTextLabel("noGroupLayer", SwingConstants.LEFT, 120, GUIFactory.DEFAULT_HEIGHT); layersLabel.setPreferredSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT)); final Box layersPanel3 = createHorizontalBox(false); layersPanel3.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); layersPanel3.add(layersLabel); layersPanel3.add(Box.createHorizontalGlue()); layersPanel2 = createPanel(new BorderLayout(), true); layersPanel2.setName(createLayersPanelName()); layersPanel2.add(layersPanel4, BorderLayout.NORTH); layersPanel2.add(layersPanel, BorderLayout.CENTER); layersPanel2.add(layersPanel3, BorderLayout.SOUTH); layersPanel2.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY)); final Box filtersPanel4 = createHorizontalBox(false); filtersPanel4.add(Box.createHorizontalGlue()); filtersPanel4.add(selectFilterButton); filtersPanel4.add(createSpace()); filtersPanel4.add(appendFilterButton); filtersPanel4.add(createSpace()); filtersPanel4.add(removeFilterButton); filtersPanel4.add(createSpace()); filtersPanel4.add(moveUpFilterButton); filtersPanel4.add(createSpace()); filtersPanel4.add(moveDownFilterButton); filtersPanel4.add(createSpace()); filtersPanel4.add(cloneFilterButton); // filtersPanel4.add(insertFilterAfterButton); // filtersPanel4.add(insertFilterBeforeButton); filtersPanel4.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY), BorderFactory.createEmptyBorder(4, 4, 4, 4))); final JLabel filtersLabel = createTextLabel("noFrameFilter", SwingConstants.LEFT, 120, GUIFactory.DEFAULT_HEIGHT); filtersLabel.setPreferredSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT)); final Box filtersPanel3 = createHorizontalBox(false); filtersPanel3.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); filtersPanel3.add(filtersLabel); filtersPanel3.add(Box.createHorizontalGlue()); filtersPanel2 = createPanel(new BorderLayout(), true); filtersPanel2.setName(createFiltersPanelName()); filtersPanel2.add(filtersPanel4, BorderLayout.NORTH); filtersPanel2.add(filtersPanel, BorderLayout.CENTER); filtersPanel2.add(filtersPanel3, BorderLayout.SOUTH); filtersPanel2.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY)); // JPanel b1 = createPanel(new FlowLayout(FlowLayout.RIGHT), false); // b1.setPreferredSize(new Dimension(200, 40)); // b1.add(editLayersButton); // JPanel p1 = createPanel(new FlowLayout(FlowLayout.LEFT), false); // p1.add(b1); // JTextArea a1 = new JTextArea(TwisterSwingResources.getInstance().getString("text.editLayers")); // a1.setOpaque(false); // a1.setEditable(false); // a1.setFont(SMALL_FONT); // p1.add(a1); // JPanel b2 = createPanel(new FlowLayout(FlowLayout.RIGHT), false); // b2.setPreferredSize(new Dimension(200, 40)); // b2.add(editFiltersButton); // JPanel p2 = createPanel(new FlowLayout(FlowLayout.LEFT), false); // p2.add(b2); // JTextArea a2 = new JTextArea(TwisterSwingResources.getInstance().getString("text.editFilters")); // a2.setOpaque(false); // a2.setEditable(false); // a2.setFont(SMALL_FONT); // p2.add(a2); // JPanel b3 = createPanel(new FlowLayout(FlowLayout.RIGHT), false); // b3.setPreferredSize(new Dimension(200, 40)); // b3.add(editEffectsButton); // JPanel p3 = createPanel(new FlowLayout(FlowLayout.LEFT), false); // p3.add(b3); // JTextArea a3 = new JTextArea(TwisterSwingResources.getInstance().getString("text.editEffects")); // a3.setOpaque(false); // a3.setEditable(false); // a3.setFont(SMALL_FONT); // p3.add(a3); // JPanel b4 = createPanel(new FlowLayout(FlowLayout.RIGHT), false); // b4.setPreferredSize(new Dimension(200, 40)); // b4.add(editBackgroundButton); // JPanel p4 = createPanel(new FlowLayout(FlowLayout.LEFT), false); // p4.add(b4); // JTextArea a4 = new JTextArea(TwisterSwingResources.getInstance().getString("text.editBackground")); // a4.setOpaque(false); // a4.setEditable(false); // a4.setFont(SMALL_FONT); // p4.add(a4); // final JPanel subpanelContainer = createPanel(new GridLayout(4, 1), false); // subpanelContainer.add(p1); // subpanelContainer.add(p2); // subpanelContainer.add(p3); // subpanelContainer.add(p4); // setLayout(new BorderLayout()); // add(subpanelContainer, BorderLayout.CENTER); // subpanelContainer.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.DARK_GRAY)); final Box subpanelContainer = createHorizontalBox(false); subpanelContainer.add(Box.createHorizontalGlue()); subpanelContainer.add(editLayersButton); subpanelContainer.add(Box.createHorizontalStrut(8)); subpanelContainer.add(editFiltersButton); subpanelContainer.add(Box.createHorizontalStrut(8)); subpanelContainer.add(editEffectsButton); subpanelContainer.add(Box.createHorizontalStrut(8)); subpanelContainer.add(editBackgroundButton); subpanelContainer.add(Box.createHorizontalGlue()); setLayout(new BorderLayout()); add(subpanelContainer, BorderLayout.CENTER); setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.DARK_GRAY)); layersPanel3.setVisible(config.getFrameConfigElement().getLayerConfigElementCount() == 0); filtersPanel3.setVisible(config.getFrameConfigElement().getFilterConfigElementCount() == 0); for (int i = 0; i < config.getFrameConfigElement().getLayerConfigElementCount(); i++) { final GroupLayerConfigElement groupLayerElement = config.getFrameConfigElement().getLayerConfigElement(i); final GroupLayerPanel groupLayerPanel = new GroupLayerPanel(config.getFrameConfigElement(), groupLayerElement); layersPanel.add(groupLayerPanel); } for (int i = 0; i < config.getFrameConfigElement().getFilterConfigElementCount(); i++) { final FrameFilterConfigElement frameFilterElement = config.getFrameConfigElement().getFilterConfigElement(i); final FrameFilterPanel frameFilterPanel = new FrameFilterPanel(config.getFrameConfigElement(), frameFilterElement); filtersPanel.add(frameFilterPanel); } for (int i = 0; i < filtersPanel.getComponentCount(); i++) { filtersPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor); } appendGroupButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = config.getFrameConfigElement().getLayerConfigElementCount() - 1; i >= 0; i--) { final GroupLayerConfigElement groupLayerElement = config.getFrameConfigElement().getLayerConfigElement(i); if (groupLayerElement.getUserData() != null) { config.getFrameConfigElement().insertLayerConfigElementBefore(i, new GroupLayerConfigElement()); return; } } config.getFrameConfigElement().appendLayerConfigElement(new GroupLayerConfigElement()); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); removeGroupButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = config.getFrameConfigElement().getLayerConfigElementCount() - 1; i >= 0; i--) { final GroupLayerConfigElement groupLayerElement = config.getFrameConfigElement().getLayerConfigElement(i); if (groupLayerElement.getUserData() != null) { config.getFrameConfigElement().removeLayerConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); // insertGroupAfterButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // for (int i = 0; i < config.getFrameConfigElement().getLayerConfigElementCount(); i++) { // GroupLayerConfigElement groupLayerElement = config.getFrameConfigElement().getLayerConfigElement(i); // if (groupLayerElement.getUserData() != null) { // config.getFrameConfigElement().insertLayerConfigElementAfter(i, new GroupLayerConfigElement()); // } // } // } // }); // insertGroupBeforeButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // for (int i = config.getFrameConfigElement().getLayerConfigElementCount() - 1; i >= 0; i--) { // GroupLayerConfigElement groupLayerElement = config.getFrameConfigElement().getLayerConfigElement(i); // if (groupLayerElement.getUserData() != null) { // config.getFrameConfigElement().insertLayerConfigElementBefore(i, new GroupLayerConfigElement()); // } // } // } // }); appendFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = config.getFrameConfigElement().getFilterConfigElementCount() - 1; i >= 0; i--) { final FrameFilterConfigElement frameFilterElement = config.getFrameConfigElement().getFilterConfigElement(i); if (frameFilterElement.getUserData() != null) { config.getFrameConfigElement().insertFilterConfigElementBefore(i, new FrameFilterConfigElement()); return; } } config.getFrameConfigElement().appendFilterConfigElement(new FrameFilterConfigElement()); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); removeFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = config.getFrameConfigElement().getFilterConfigElementCount() - 1; i >= 0; i--) { final FrameFilterConfigElement frameFilterElement = config.getFrameConfigElement().getFilterConfigElement(i); if (frameFilterElement.getUserData() != null) { config.getFrameConfigElement().removeFilterConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); // insertFilterAfterButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // for (int i = 0; i < config.getFrameConfigElement().getFilterConfigElementCount(); i++) { // FrameFilterConfigElement frameFilterElement = config.getFrameConfigElement().getFilterConfigElement(i); // if (frameFilterElement.getUserData() != null) { // config.getFrameConfigElement().insertFilterConfigElementAfter(i, new FrameFilterConfigElement()); // } // } // } // }); // insertFilterBeforeButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // for (int i = config.getFrameConfigElement().getFilterConfigElementCount() - 1; i >= 0; i--) { // FrameFilterConfigElement frameFilterElement = config.getFrameConfigElement().getFilterConfigElement(i); // if (frameFilterElement.getUserData() != null) { // config.getFrameConfigElement().insertFilterConfigElementBefore(i, new FrameFilterConfigElement()); // } // } // } // }); selectFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { boolean allSelected = true; for (int i = 0; i < filtersPanel.getComponentCount(); i++) { if (!((FrameFilterPanel) filtersPanel.getComponent(i)).isSelected()) { allSelected = false; } } if (allSelected) { for (int i = 0; i < filtersPanel.getComponentCount(); i++) { ((FrameFilterPanel) filtersPanel.getComponent(i)).setSelected(false); } } else { for (int i = 0; i < filtersPanel.getComponentCount(); i++) { ((FrameFilterPanel) filtersPanel.getComponent(i)).setSelected(true); } } } }); selectGroupButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { boolean allSelected = true; for (int i = 0; i < layersPanel.getComponentCount(); i++) { if (!((GroupLayerPanel) layersPanel.getComponent(i)).isSelected()) { allSelected = false; } } if (allSelected) { for (int i = 0; i < layersPanel.getComponentCount(); i++) { ((GroupLayerPanel) layersPanel.getComponent(i)).setSelected(false); } } else { for (int i = 0; i < layersPanel.getComponentCount(); i++) { ((GroupLayerPanel) layersPanel.getComponent(i)).setSelected(true); } } } }); moveUpGroupButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = 0; i < config.getFrameConfigElement().getLayerConfigElementCount(); i++) { final GroupLayerConfigElement groupLayerElement = config.getFrameConfigElement().getLayerConfigElement(i); if (groupLayerElement.getUserData() != null) { config.getFrameConfigElement().moveUpLayerConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); moveDownGroupButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = config.getFrameConfigElement().getLayerConfigElementCount() - 1; i >= 0; i--) { final GroupLayerConfigElement groupLayerElement = config.getFrameConfigElement().getLayerConfigElement(i); if (groupLayerElement.getUserData() != null) { config.getFrameConfigElement().moveDownLayerConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); cloneGroupButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = config.getFrameConfigElement().getLayerConfigElementCount() - 1; i >= 0; i--) { final GroupLayerConfigElement groupLayerElement = config.getFrameConfigElement().getLayerConfigElement(i); if (groupLayerElement.getUserData() != null) { config.getFrameConfigElement().insertLayerConfigElementAfter(i, groupLayerElement.clone()); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); moveUpFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = 0; i < config.getFrameConfigElement().getFilterConfigElementCount(); i++) { final FrameFilterConfigElement frameFilterElement = config.getFrameConfigElement().getFilterConfigElement(i); if (frameFilterElement.getUserData() != null) { config.getFrameConfigElement().moveUpFilterConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); moveDownFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = config.getFrameConfigElement().getFilterConfigElementCount() - 1; i >= 0; i--) { final FrameFilterConfigElement frameFilterElement = config.getFrameConfigElement().getFilterConfigElement(i); if (frameFilterElement.getUserData() != null) { config.getFrameConfigElement().moveDownFilterConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); cloneFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = config.getFrameConfigElement().getFilterConfigElementCount() - 1; i >= 0; i--) { final FrameFilterConfigElement frameFilterElement = config.getFrameConfigElement().getFilterConfigElement(i); if (frameFilterElement.getUserData() != null) { config.getFrameConfigElement().insertFilterConfigElementAfter(i, frameFilterElement.clone()); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); editEffectsButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { viewContext.setComponent(effectPanel); } }); editBackgroundButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { viewContext.setComponent(colorPanel); } }); colorChooseButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { final Color color = ColorChooser.showColorChooser(colorField, TwisterSwingResources.getInstance().getString("label.background"), colorField.getColor()); if (color != null) { colorField.setColor(color); } } }); colorField.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(final MouseEvent e) { final Color color = ColorChooser.showColorChooser(colorField, TwisterSwingResources.getInstance().getString("label.background"), colorField.getColor()); if (color != null) { colorField.setColor(color); } } }); final ColorChangeListener colorChangeListener = new ColorChangeListener() { public void colorChanged(final ColorChangeEvent e) { try { context.acquire(); config.getContext().updateTimestamp(); config.setBackground(new Color32bit(colorField.getColor().getRGB())); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }; colorField.addColorChangeListener(colorChangeListener); editLayersButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { viewContext.setComponent(layersPanel2); } }); editFiltersButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { viewContext.setComponent(filtersPanel2); } }); backgroundListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { colorField.removeColorChangeListener(colorChangeListener); colorField.setColor(new Color(config.getBackground().getARGB(), true)); colorField.addColorChangeListener(colorChangeListener); } }; filtersListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ListConfigElement.ELEMENT_ADDED: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); filtersPanel.add(new FrameFilterPanel(config.getFrameConfigElement(), (FrameFilterConfigElement) e.getParams()[0])); filtersPanel3.setVisible(config.getFrameConfigElement().getFilterConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_INSERTED_AFTER: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); filtersPanel.add(new FrameFilterPanel(config.getFrameConfigElement(), (FrameFilterConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue() + 1); filtersPanel3.setVisible(config.getFrameConfigElement().getFilterConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_INSERTED_BEFORE: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); filtersPanel.add(new FrameFilterPanel(config.getFrameConfigElement(), (FrameFilterConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue()); filtersPanel3.setVisible(config.getFrameConfigElement().getFilterConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_REMOVED: { FrameFilterPanel panel = (FrameFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(((Integer) e.getParams()[1]).intValue()); panel.dispose(); filtersPanel3.setVisible(config.getFrameConfigElement().getFilterConfigElementCount() == 0); // viewContext.resize(); viewContext.restoreComponent(filtersPanel2); break; } case ListConfigElement.ELEMENT_MOVED_UP: { FrameFilterPanel panel = (FrameFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(panel); filtersPanel.add(panel, ((Integer) e.getParams()[1]).intValue() - 1); break; } case ListConfigElement.ELEMENT_MOVED_DOWN: { FrameFilterPanel panel = (FrameFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(panel); filtersPanel.add(panel, ((Integer) e.getParams()[1]).intValue() + 1); break; } case ListConfigElement.ELEMENT_CHANGED: { FrameFilterPanel panel = (FrameFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(panel); panel.dispose(); filtersPanel.add(new FrameFilterPanel(config.getFrameConfigElement(), (FrameFilterConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue()); break; } default: { break; } } for (int i = 0; i < filtersPanel.getComponentCount(); i++) { filtersPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor); } } }; layersListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ListConfigElement.ELEMENT_ADDED: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT * 2 + 8); layersPanel.add(new GroupLayerPanel(config.getFrameConfigElement(), (GroupLayerConfigElement) e.getParams()[0])); layersPanel3.setVisible(config.getFrameConfigElement().getLayerConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_INSERTED_AFTER: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT * 2 + 8); layersPanel.add(new GroupLayerPanel(config.getFrameConfigElement(), (GroupLayerConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue() + 1); layersPanel3.setVisible(config.getFrameConfigElement().getLayerConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_INSERTED_BEFORE: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT * 2 + 8); layersPanel.add(new GroupLayerPanel(config.getFrameConfigElement(), (GroupLayerConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue()); layersPanel3.setVisible(config.getFrameConfigElement().getLayerConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_REMOVED: { GroupLayerPanel panel = (GroupLayerPanel) layersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); layersPanel.remove(((Integer) e.getParams()[1]).intValue()); panel.dispose(); layersPanel3.setVisible(config.getFrameConfigElement().getLayerConfigElementCount() == 0); // viewContext.resize(); viewContext.restoreComponent(layersPanel2); break; } case ListConfigElement.ELEMENT_MOVED_UP: { GroupLayerPanel panel = (GroupLayerPanel) layersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); layersPanel.remove(panel); layersPanel.add(panel, ((Integer) e.getParams()[1]).intValue() - 1); viewContext.restoreComponent(layersPanel2); break; } case ListConfigElement.ELEMENT_MOVED_DOWN: { GroupLayerPanel panel = (GroupLayerPanel) layersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); layersPanel.remove(panel); layersPanel.add(panel, ((Integer) e.getParams()[1]).intValue() + 1); viewContext.restoreComponent(layersPanel2); break; } case ListConfigElement.ELEMENT_CHANGED: { FrameFilterPanel panel = (FrameFilterPanel) layersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); layersPanel.remove(panel); panel.dispose(); layersPanel.add(new GroupLayerPanel(config.getFrameConfigElement(), (GroupLayerConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue()); break; } default: { break; } } } }; frameListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ValueConfigElement.VALUE_CHANGED: { viewContext.setComponent(TwisterConfigPanel.this); FrameConfigElement frameElement = (FrameConfigElement) e.getParams()[1]; frameElement.getFilterListElement().removeChangeListener(filtersListener); frameElement.getLayerListElement().removeChangeListener(layersListener); for (int i = 0; i < layersPanel.getComponentCount(); i++) { GroupLayerPanel panel = (GroupLayerPanel) layersPanel.getComponent(i); panel.dispose(); } for (int i = 0; i < filtersPanel.getComponentCount(); i++) { FrameFilterPanel panel = (FrameFilterPanel) layersPanel.getComponent(i); panel.dispose(); } layersPanel.removeAll(); filtersPanel.removeAll(); layersPanel3.setVisible(config.getFrameConfigElement().getLayerConfigElementCount() == 0); filtersPanel3.setVisible(config.getFrameConfigElement().getFilterConfigElementCount() == 0); for (int i = 0; i < config.getFrameConfigElement().getLayerConfigElementCount(); i++) { final GroupLayerConfigElement groupLayerElement = config.getFrameConfigElement().getLayerConfigElement(i); final GroupLayerPanel groupLayerPanel = new GroupLayerPanel(config.getFrameConfigElement(), groupLayerElement); layersPanel.add(groupLayerPanel); } for (int i = 0; i < config.getFrameConfigElement().getFilterConfigElementCount(); i++) { final FrameFilterConfigElement frameFilterElement = config.getFrameConfigElement().getFilterConfigElement(i); final FrameFilterPanel frameFilterPanel = new FrameFilterPanel(config.getFrameConfigElement(), frameFilterElement); filtersPanel.add(frameFilterPanel); } config.getFrameConfigElement().getFilterListElement().addChangeListener(filtersListener); config.getFrameConfigElement().getLayerListElement().addChangeListener(layersListener); break; } default: { break; } } } }; effectListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ValueConfigElement.VALUE_CHANGED: { viewContext.setComponent(TwisterConfigPanel.this); effectPanel.dispose(); effectPanel = new EffectPanel(config, config.getEffectConfigElement()); effectPanel.setName(createEffectPanelName(config.getEffectConfigElement())); effectPanel.setOpaque(true); break; } default: { break; } } } }; config.getBackgroundElement().addChangeListener(backgroundListener); config.getFrameSingleElement().addChangeListener(frameListener); config.getEffectSingleElement().addChangeListener(effectListener); config.getFrameConfigElement().getFilterListElement().addChangeListener(filtersListener); config.getFrameConfigElement().getLayerListElement().addChangeListener(layersListener); } public void dispose() { config.getBackgroundElement().removeChangeListener(backgroundListener); config.getFrameSingleElement().removeChangeListener(frameListener); config.getEffectSingleElement().removeChangeListener(effectListener); config.getFrameConfigElement().getFilterListElement().removeChangeListener(filtersListener); config.getFrameConfigElement().getLayerListElement().removeChangeListener(layersListener); for (int i = 0; i < layersPanel.getComponentCount(); i++) { final GroupLayerPanel layerPanel = (GroupLayerPanel) layersPanel.getComponent(i); layerPanel.dispose(); } for (int i = 0; i < filtersPanel.getComponentCount(); i++) { final FrameFilterPanel filterPanel = (FrameFilterPanel) filtersPanel.getComponent(i); filterPanel.dispose(); } effectPanel.dispose(); } private String createFiltersPanelName() { return TwisterSwingResources.getInstance().getString("name.frameFilters"); } private String createLayersPanelName() { return TwisterSwingResources.getInstance().getString("name.groupLayers"); } private String createEffectPanelName(final EffectConfigElement effectElement) { return TwisterSwingResources.getInstance().getString("name.effect"); } // private class RenderTask implements Runnable { // private final Object lock = new Object(); // private Thread thread; // private boolean dirty; // private boolean running; // private final JPanel layersPanel; // private final DefaultThreadFactory factory = new DefaultThreadFactory("ConfigPanel", true, Thread.MIN_PRIORITY); // // /** // * @param layersPanel // */ // public RenderTask(final JPanel layersPanel) { // this.layersPanel = layersPanel; // } // // /** // * @see java.lang.Runnable#run() // */ // public void run() { // try { // for (;;) { // synchronized (lock) { // if (!running) { // break; // } // while (!dirty) { // lock.wait(); // } // dirty = false; // } // Thread.sleep(500); // GUIUtil.executeTask(new Runnable() { // public void run() { // for (int i = 0; i < layersPanel.getComponentCount(); i++) { // final GroupLayerPanel layerPanel = (GroupLayerPanel) layersPanel.getComponent(i); // layerPanel.abortPreviewRenderer(); // } // for (int i = 0; i < layersPanel.getComponentCount(); i++) { // final GroupLayerPanel layerPanel = (GroupLayerPanel) layersPanel.getComponent(i); // layerPanel.joinPreviewRenderer(); // } // for (int i = 0; i < layersPanel.getComponentCount(); i++) { // final GroupLayerPanel layerPanel = (GroupLayerPanel) layersPanel.getComponent(i); // layerPanel.prepareLayerPreview(); // } // for (int i = 0; i < layersPanel.getComponentCount(); i++) { // final GroupLayerPanel layerPanel = (GroupLayerPanel) layersPanel.getComponent(i); // layerPanel.startPreviewRenderer(); // } // for (int i = 0; i < layersPanel.getComponentCount(); i++) { // final GroupLayerPanel layerPanel = (GroupLayerPanel) layersPanel.getComponent(i); // layerPanel.joinPreviewRenderer(); // } // for (int i = 0; i < layersPanel.getComponentCount(); i++) { // final GroupLayerPanel layerPanel = (GroupLayerPanel) layersPanel.getComponent(i); // layerPanel.drawLayerPreview(); // } // } // }, true); // } // } // catch (final InterruptedException e) { // Thread.currentThread().interrupt(); // } // } // // /** // * // */ // public void stop() { // if (thread != null) { // running = false; // thread.interrupt(); // try { // thread.join(); // } // catch (InterruptedException e) { // } // thread = null; // } // } // // /** // * // */ // public void start() { // if (thread == null) { // thread = factory.newThread(this); // thread.setName(thread.getName() + " RenderTask"); // running = true; // thread.start(); // } // } // // /** // * // */ // public void executeTask() { // synchronized (lock) { // dirty = true; // lock.notify(); // } // } // } private class GroupLayerPanel extends JPanel { private static final long serialVersionUID = 1L; private final JCheckBox selectedCheckBox = createCheckBox(); private final LayerPreviewCanvas preview; private final JPanel layersPanel; private final GroupLayerConfigElement groupLayerElement; private final ValueChangeListener lockedListener; private final ValueChangeListener visibleListener; private final ValueChangeListener opacityListener; private final ValueChangeListener labelListener; private final ValueChangeListener filtersListener; private final ValueChangeListener layersListener; private final JPanel filtersPanel; private final JPanel layersPanel2; private final JPanel filtersPanel2; private RenderTask renderTask; /** * @param frameElement * @param groupLayerElement */ public GroupLayerPanel(final FrameConfigElement frameElement, final GroupLayerConfigElement groupLayerElement) { this.groupLayerElement = groupLayerElement; final JTextField label = createTextField(groupLayerElement.getLabel(), 120, GUIFactory.DEFAULT_HEIGHT); final JCheckBox lockedCheckBox = createIconCheckBox("locked", "locked", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JCheckBox visibleCheckBox = createIconCheckBox("visible", "visible", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JCheckBox showLayersButton = createIconCheckBox("showLayers", "group", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton editFiltersButton = createIconTextButton("filters", "edit", 100, GUIFactory.DEFAULT_HEIGHT); final JButton selectFilterButton = createIconButton("selectFilters", "select", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton appendFilterButton = createIconButton("appendFilter", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton removeFilterButton = createIconButton("removeFilters", "remove", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton moveUpFilterButton = createIconButton("moveUpFilter", "up", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton moveDownFilterButton = createIconButton("moveDownFilter", "down", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton cloneFilterButton = createIconButton("cloneFilter", "clone", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); // final JButton insertFilterAfterButton = createIconButton("insertFilterAfter", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); // final JButton insertFilterBeforeButton = createIconButton("insertFilterBefore", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton selectLayerButton = createIconButton("selectLayers", "select", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton appendLayerButton = createIconButton("appendLayer", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton removeLayerButton = createIconButton("removeLayers", "remove", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton moveUpLayerButton = createIconButton("moveUpLayer", "up", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton moveDownLayerButton = createIconButton("moveDownLayer", "down", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton cloneLayerButton = createIconButton("cloneLayer", "clone", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); // final JButton insertLayerAfterButton = createIconButton("insertLayerAfter", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); // final JButton insertLayerBeforeButton = createIconButton("insertLayerBefore", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JSpinner opacitySpinner = createSpinner(0, 100, 1); final JLabel layersLabel = createTextLabel("noImageLayer", SwingConstants.LEFT, 120, GUIFactory.DEFAULT_HEIGHT); final JLabel filtersLabel = createTextLabel("noLayerFilter", SwingConstants.LEFT, 120, GUIFactory.DEFAULT_HEIGHT); filtersPanel = createPanel(new StackLayout(), false); layersPanel = createPanel(new StackLayout(), false); layersLabel.setPreferredSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT)); filtersLabel.setPreferredSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT)); final Box layersPanel3 = createHorizontalBox(false); layersPanel3.add(selectLayerButton); layersPanel3.add(createSpace()); layersPanel3.add(appendLayerButton); layersPanel3.add(createSpace()); layersPanel3.add(removeLayerButton); layersPanel3.add(createSpace()); layersPanel3.add(moveUpLayerButton); layersPanel3.add(createSpace()); layersPanel3.add(moveDownLayerButton); layersPanel3.add(createSpace()); layersPanel3.add(cloneLayerButton); // layersPanel3.add(insertLayerAfterButton); // layersPanel3.add(insertLayerBeforeButton); final Box layersPanel4 = createHorizontalBox(false); layersPanel4.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); layersPanel4.add(layersLabel); layersPanel4.add(Box.createHorizontalGlue()); layersPanel2 = createPanel(new BorderLayout(), false); layersPanel2.setName(createLayersPanelName(groupLayerElement)); layersPanel2.add(layersPanel4, BorderLayout.NORTH); layersPanel2.add(layersPanel, BorderLayout.CENTER); layersPanel2.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.DARK_GRAY)); final Box filtersPanel3 = createHorizontalBox(false); filtersPanel3.add(Box.createHorizontalGlue()); filtersPanel3.add(selectFilterButton); filtersPanel3.add(createSpace()); filtersPanel3.add(appendFilterButton); filtersPanel3.add(createSpace()); filtersPanel3.add(removeFilterButton); filtersPanel3.add(createSpace()); filtersPanel3.add(moveUpFilterButton); filtersPanel3.add(createSpace()); filtersPanel3.add(moveDownFilterButton); filtersPanel3.add(createSpace()); filtersPanel3.add(cloneFilterButton); // filtersPanel3.add(insertFilterAfterButton); // filtersPanel3.add(insertFilterBeforeButton); filtersPanel3.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY), BorderFactory.createEmptyBorder(4, 4, 4, 4))); final Box filtersPanel4 = createHorizontalBox(false); filtersPanel4.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); filtersPanel4.add(filtersLabel); filtersPanel4.add(Box.createHorizontalGlue()); filtersPanel2 = createPanel(new BorderLayout(), true); filtersPanel2.setName(createFiltersPanelName(groupLayerElement)); filtersPanel2.add(filtersPanel3, BorderLayout.NORTH); filtersPanel2.add(filtersPanel, BorderLayout.CENTER); filtersPanel2.add(filtersPanel4, BorderLayout.SOUTH); filtersPanel2.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY)); layersPanel2.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(4, 24, 4, 0), BorderFactory.createMatteBorder(0, 0, 0, 0, Color.DARK_GRAY))); preview = new LayerPreviewCanvas(); // preview.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2), BorderFactory.createLineBorder(Color.DARK_GRAY))); preview.setPreferredSize(new Dimension(GUIFactory.DEFAULT_HEIGHT, GUIFactory.DEFAULT_HEIGHT)); preview.setMinimumSize(new Dimension(GUIFactory.DEFAULT_HEIGHT, GUIFactory.DEFAULT_HEIGHT)); preview.setMaximumSize(new Dimension(GUIFactory.DEFAULT_HEIGHT, GUIFactory.DEFAULT_HEIGHT)); preview.setSize(new Dimension(GUIFactory.DEFAULT_HEIGHT, GUIFactory.DEFAULT_HEIGHT)); final TwisterConfig previewConfig = new TwisterConfig(); buildPreviewConfig(groupLayerElement, previewConfig); final TwisterRuntime runtime = new TwisterRuntime(previewConfig); final Map<Object, Object> hints = new HashMap<Object, Object>(); hints.put(TwisterRenderingHints.KEY_TYPE, TwisterRenderingHints.TYPE_PREVIEW); DefaultTwisterRenderer renderer = new DefaultTwisterRenderer(runtime); renderer.setRenderingHints(hints); renderer.setTile(new Tile(new IntegerVector2D(GUIFactory.DEFAULT_HEIGHT - 4, GUIFactory.DEFAULT_HEIGHT - 4), new IntegerVector2D(GUIFactory.DEFAULT_HEIGHT - 4, GUIFactory.DEFAULT_HEIGHT - 4), new IntegerVector2D(0, 0), new IntegerVector2D(0, 0))); renderTask = new RenderTask(renderer, preview); context.addRenderContextListener(renderTask); refreshPreview.addRenderTask(renderTask); final Box layerPanel = createHorizontalBox(false); layerPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0)); layerPanel.add(createSpace()); layerPanel.add(showLayersButton); layerPanel.add(selectedCheckBox); layerPanel.add(preview); layerPanel.add(createSpace()); layerPanel.add(label); layerPanel.add(createSpace()); layerPanel.add(opacitySpinner); layerPanel.add(createSpace()); layerPanel.add(lockedCheckBox); layerPanel.add(createSpace()); layerPanel.add(visibleCheckBox); layerPanel.add(createSpace()); layerPanel.add(editFiltersButton); layerPanel.add(createSpace()); layerPanel.add(Box.createHorizontalGlue()); layerPanel.add(layersPanel3); layersPanel3.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); final JPanel subpanelContainer = createPanel(new StackLayout(), false); subpanelContainer.add(layersPanel2); setLayout(new BorderLayout()); add(layerPanel, BorderLayout.NORTH); add(subpanelContainer, BorderLayout.CENTER); showLayersButton.setSelected(true); showLayersButton.setPreferredSize(new Dimension(24, 24)); editFiltersButton.setText(createEditFiltersText(groupLayerElement)); opacitySpinner.setValue(groupLayerElement.getOpacity().intValue()); opacitySpinner.setToolTipText(createOpacityTooltip(opacitySpinner)); lockedCheckBox.setSelected(groupLayerElement.isLocked()); visibleCheckBox.setSelected(groupLayerElement.isVisible()); layersPanel4.setVisible(groupLayerElement.getLayerConfigElementCount() == 0); filtersPanel4.setVisible(groupLayerElement.getFilterConfigElementCount() == 0); for (int i = 0; i < groupLayerElement.getLayerConfigElementCount(); i++) { final ImageLayerConfigElement imageLayerElement = groupLayerElement.getLayerConfigElement(i); layersPanel.add(new ImageLayerPanel(groupLayerElement, imageLayerElement)); } for (int i = 0; i < groupLayerElement.getFilterConfigElementCount(); i++) { final LayerFilterConfigElement imageFilterElement = groupLayerElement.getFilterConfigElement(i); filtersPanel.add(new LayerFilterPanel(groupLayerElement, imageFilterElement)); } for (int i = 0; i < layersPanel.getComponentCount(); i++) { layersPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor); } for (int i = 0; i < filtersPanel.getComponentCount(); i++) { filtersPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor); } appendLayerButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); groupLayerElement.getContext().updateTimestamp(); for (int i = groupLayerElement.getLayerConfigElementCount() - 1; i >= 0; i--) { final ImageLayerConfigElement imageLayerElement = groupLayerElement.getLayerConfigElement(i); if (imageLayerElement.getUserData() != null) { final ImageLayerConfigElement element = new ImageLayerConfigElement(); element.setImageConfigElement(new ImageConfigElement()); groupLayerElement.insertLayerConfigElementBefore(i, element); return; } } final ImageLayerConfigElement element = new ImageLayerConfigElement(); element.setImageConfigElement(new ImageConfigElement()); groupLayerElement.appendLayerConfigElement(element); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); removeLayerButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); groupLayerElement.getContext().updateTimestamp(); for (int i = groupLayerElement.getLayerConfigElementCount() - 1; i >= 0; i--) { final ImageLayerConfigElement imageLayerElement = groupLayerElement.getLayerConfigElement(i); if (imageLayerElement.getUserData() != null) { groupLayerElement.removeLayerConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); // insertLayerAfterButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // for (int i = 0; i < groupLayerElement.getLayerConfigElementCount(); i++) { // ImageLayerConfigElement imageLayerElement = groupLayerElement.getLayerConfigElement(i); // if (imageLayerElement.getUserData() != null) { // groupLayerElement.insertLayerConfigElementAfter(i, new ImageLayerConfigElement()); // } // } // } // }); // insertLayerBeforeButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // for (int i = groupLayerElement.getLayerConfigElementCount() - 1; i >= 0; i--) { // ImageLayerConfigElement imageLayerElement = groupLayerElement.getLayerConfigElement(i); // if (imageLayerElement.getUserData() != null) { // groupLayerElement.insertLayerConfigElementBefore(i, new ImageLayerConfigElement()); // } // } // } // }); appendFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); groupLayerElement.getContext().updateTimestamp(); for (int i = groupLayerElement.getFilterConfigElementCount() - 1; i >= 0; i--) { final LayerFilterConfigElement layerFilterElement = groupLayerElement.getFilterConfigElement(i); if (layerFilterElement.getUserData() != null) { groupLayerElement.insertFilterConfigElementBefore(i, new LayerFilterConfigElement()); return; } } groupLayerElement.appendFilterConfigElement(new LayerFilterConfigElement()); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); removeFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); groupLayerElement.getContext().updateTimestamp(); for (int i = groupLayerElement.getFilterConfigElementCount() - 1; i >= 0; i--) { final LayerFilterConfigElement layerFilterElement = groupLayerElement.getFilterConfigElement(i); if (layerFilterElement.getUserData() != null) { groupLayerElement.removeFilterConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); // insertFilterAfterButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // for (int i = 0; i < groupLayerElement.getFilterConfigElementCount(); i++) { // LayerFilterConfigElement layerFilterElement = groupLayerElement.getFilterConfigElement(i); // if (layerFilterElement.getUserData() != null) { // groupLayerElement.insertFilterConfigElementAfter(i, new LayerFilterConfigElement()); // } // } // } // }); // insertFilterBeforeButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // for (int i = groupLayerElement.getFilterConfigElementCount() - 1; i >= 0; i--) { // LayerFilterConfigElement layerFilterElement = groupLayerElement.getFilterConfigElement(i); // if (layerFilterElement.getUserData() != null) { // groupLayerElement.insertFilterConfigElementBefore(i, new LayerFilterConfigElement()); // } // } // } // }); selectLayerButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { boolean allSelected = true; for (int i = 0; i < layersPanel.getComponentCount(); i++) { if (!((ImageLayerPanel) layersPanel.getComponent(i)).isSelected()) { allSelected = false; } } if (allSelected) { for (int i = 0; i < layersPanel.getComponentCount(); i++) { ((ImageLayerPanel) layersPanel.getComponent(i)).setSelected(false); } } else { for (int i = 0; i < layersPanel.getComponentCount(); i++) { ((ImageLayerPanel) layersPanel.getComponent(i)).setSelected(true); } } } }); selectFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { boolean allSelected = true; for (int i = 0; i < filtersPanel.getComponentCount(); i++) { if (!((LayerFilterPanel) filtersPanel.getComponent(i)).isSelected()) { allSelected = false; } } if (allSelected) { for (int i = 0; i < filtersPanel.getComponentCount(); i++) { ((LayerFilterPanel) filtersPanel.getComponent(i)).setSelected(false); } } else { for (int i = 0; i < filtersPanel.getComponentCount(); i++) { ((LayerFilterPanel) filtersPanel.getComponent(i)).setSelected(true); } } } }); moveUpLayerButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = 0; i < groupLayerElement.getLayerConfigElementCount(); i++) { final ImageLayerConfigElement imageLayerElement = groupLayerElement.getLayerConfigElement(i); if (imageLayerElement.getUserData() != null) { groupLayerElement.moveUpLayerConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); moveDownLayerButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = groupLayerElement.getLayerConfigElementCount() - 1; i >= 0; i--) { final ImageLayerConfigElement imageLayerElement = groupLayerElement.getLayerConfigElement(i); if (imageLayerElement.getUserData() != null) { groupLayerElement.moveDownLayerConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); cloneLayerButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = groupLayerElement.getLayerConfigElementCount() - 1; i >= 0; i--) { final ImageLayerConfigElement imageLayerElement = groupLayerElement.getLayerConfigElement(i); if (imageLayerElement.getUserData() != null) { groupLayerElement.insertLayerConfigElementAfter(i, imageLayerElement.clone()); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); moveUpFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = 0; i < groupLayerElement.getFilterConfigElementCount(); i++) { final LayerFilterConfigElement layerFilterElement = groupLayerElement.getFilterConfigElement(i); if (layerFilterElement.getUserData() != null) { groupLayerElement.moveUpFilterConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); moveDownFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = groupLayerElement.getFilterConfigElementCount() - 1; i >= 0; i--) { final LayerFilterConfigElement layerFilterElement = groupLayerElement.getFilterConfigElement(i); if (layerFilterElement.getUserData() != null) { groupLayerElement.moveDownFilterConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); cloneFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = groupLayerElement.getFilterConfigElementCount() - 1; i >= 0; i--) { final LayerFilterConfigElement layerFilterElement = groupLayerElement.getFilterConfigElement(i); if (layerFilterElement.getUserData() != null) { groupLayerElement.insertFilterConfigElementAfter(i, layerFilterElement.clone()); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); selectedCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(final ItemEvent e) { if (selectedCheckBox.isSelected()) { groupLayerElement.setUserData(Boolean.TRUE); } else { groupLayerElement.setUserData(null); } } }); final ActionListener lockedActionListener = new ActionListener() { public void actionPerformed(final ActionEvent e) { groupLayerElement.getContext().updateTimestamp(); groupLayerElement.setLocked(lockedCheckBox.isSelected()); } }; lockedCheckBox.addActionListener(lockedActionListener); final ActionListener visibleActionListener = new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); groupLayerElement.getContext().updateTimestamp(); groupLayerElement.setVisible(visibleCheckBox.isSelected()); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }; visibleCheckBox.addActionListener(visibleActionListener); final ChangeListener opacityChangeListener = new ChangeListener() { public void stateChanged(final ChangeEvent e) { try { context.acquire(); groupLayerElement.getContext().updateTimestamp(); groupLayerElement.setOpacity(((Number) opacitySpinner.getValue()).intValue()); opacitySpinner.setToolTipText(createOpacityTooltip(opacitySpinner)); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }; opacitySpinner.addChangeListener(opacityChangeListener); label.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { // groupLayerElement.getLabelElement().removeChangeListener(labelListener); groupLayerElement.getContext().updateTimestamp(); groupLayerElement.setLabel(label.getText()); layersPanel2.setName(createLayersPanelName(groupLayerElement)); filtersPanel2.setName(createFiltersPanelName(groupLayerElement)); // groupLayerElement.getLabelElement().addChangeListener(labelListener); } }); showLayersButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { layersPanel2.setVisible(showLayersButton.isSelected()); viewContext.resize(); } }); editFiltersButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { viewContext.setComponent(filtersPanel2); } }); lockedListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { lockedCheckBox.removeActionListener(lockedActionListener); lockedCheckBox.setSelected(groupLayerElement.isLocked()); lockedCheckBox.addActionListener(lockedActionListener); } }; visibleListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { visibleCheckBox.removeActionListener(visibleActionListener); visibleCheckBox.setSelected(groupLayerElement.isVisible()); visibleCheckBox.addActionListener(visibleActionListener); } }; opacityListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { opacitySpinner.removeChangeListener(opacityChangeListener); opacitySpinner.setValue(groupLayerElement.getOpacity().intValue()); opacitySpinner.setToolTipText(createOpacityTooltip(opacitySpinner)); opacitySpinner.addChangeListener(opacityChangeListener); } }; labelListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { label.setText(groupLayerElement.getLabel()); layersPanel2.setName(createLayersPanelName(groupLayerElement)); filtersPanel2.setName(createFiltersPanelName(groupLayerElement)); } }; filtersListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ListConfigElement.ELEMENT_ADDED: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); filtersPanel.add(new LayerFilterPanel(groupLayerElement, (LayerFilterConfigElement) e.getParams()[0])); filtersPanel4.setVisible(groupLayerElement.getFilterConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_INSERTED_AFTER: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); filtersPanel.add(new LayerFilterPanel(groupLayerElement, (LayerFilterConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue() + 1); filtersPanel4.setVisible(groupLayerElement.getFilterConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_INSERTED_BEFORE: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); filtersPanel.add(new LayerFilterPanel(groupLayerElement, (LayerFilterConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue()); filtersPanel4.setVisible(groupLayerElement.getFilterConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_REMOVED: { LayerFilterPanel panel = (LayerFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(((Integer) e.getParams()[1]).intValue()); panel.dispose(); filtersPanel4.setVisible(groupLayerElement.getFilterConfigElementCount() == 0); // viewContext.resize(); viewContext.restoreComponent(filtersPanel2); break; } case ListConfigElement.ELEMENT_MOVED_UP: { LayerFilterPanel panel = (LayerFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(panel); filtersPanel.add(panel, ((Integer) e.getParams()[1]).intValue() - 1); viewContext.restoreComponent(filtersPanel2); break; } case ListConfigElement.ELEMENT_MOVED_DOWN: { LayerFilterPanel panel = (LayerFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(panel); filtersPanel.add(panel, ((Integer) e.getParams()[1]).intValue() + 1); viewContext.restoreComponent(filtersPanel2); break; } case ListConfigElement.ELEMENT_CHANGED: { LayerFilterPanel panel = (LayerFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(panel); panel.dispose(); filtersPanel.add(new LayerFilterPanel(groupLayerElement, (LayerFilterConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue()); break; } default: { break; } } for (int i = 0; i < filtersPanel.getComponentCount(); i++) { filtersPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor); } editFiltersButton.setText(createEditFiltersText(groupLayerElement)); } }; layersListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ListConfigElement.ELEMENT_ADDED: { if (groupLayerElement.getLayerConfigElementCount() > 1) { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); } layersPanel.add(new ImageLayerPanel(groupLayerElement, (ImageLayerConfigElement) e.getParams()[0])); layersPanel4.setVisible(groupLayerElement.getLayerConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_INSERTED_AFTER: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); layersPanel.add(new ImageLayerPanel(groupLayerElement, (ImageLayerConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue() + 1); layersPanel4.setVisible(groupLayerElement.getLayerConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_INSERTED_BEFORE: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); layersPanel.add(new ImageLayerPanel(groupLayerElement, (ImageLayerConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue()); layersPanel4.setVisible(groupLayerElement.getLayerConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_REMOVED: { ImageLayerPanel panel = (ImageLayerPanel) layersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); layersPanel.remove(((Integer) e.getParams()[1]).intValue()); panel.dispose(); layersPanel4.setVisible(groupLayerElement.getLayerConfigElementCount() == 0); // viewContext.resize(); viewContext.restoreComponent(ConfigPanel.this.layersPanel2); break; } case ListConfigElement.ELEMENT_MOVED_UP: { ImageLayerPanel panel = (ImageLayerPanel) layersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); layersPanel.remove(panel); layersPanel.add(panel, ((Integer) e.getParams()[1]).intValue() - 1); viewContext.restoreComponent(ConfigPanel.this.layersPanel2); break; } case ListConfigElement.ELEMENT_MOVED_DOWN: { ImageLayerPanel panel = (ImageLayerPanel) layersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); layersPanel.remove(panel); layersPanel.add(panel, ((Integer) e.getParams()[1]).intValue() + 1); viewContext.restoreComponent(ConfigPanel.this.layersPanel2); break; } case ListConfigElement.ELEMENT_CHANGED: { ImageLayerPanel panel = (ImageLayerPanel) layersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); layersPanel.remove(panel); panel.dispose(); layersPanel.add(new ImageLayerPanel(groupLayerElement, (ImageLayerConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue()); break; } default: { break; } } for (int i = 0; i < layersPanel.getComponentCount(); i++) { layersPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor); } } }; groupLayerElement.getLabelElement().addChangeListener(labelListener); groupLayerElement.getLockedElement().addChangeListener(lockedListener); groupLayerElement.getVisibleElement().addChangeListener(visibleListener); groupLayerElement.getOpacityElement().addChangeListener(opacityListener); groupLayerElement.getLayerListElement().addChangeListener(layersListener); groupLayerElement.getFilterListElement().addChangeListener(filtersListener); } public void dispose() { refreshPreview.removeRenderTask(renderTask); context.removeRenderContextListener(renderTask); groupLayerElement.getLabelElement().removeChangeListener(labelListener); groupLayerElement.getLockedElement().removeChangeListener(lockedListener); groupLayerElement.getVisibleElement().removeChangeListener(visibleListener); groupLayerElement.getOpacityElement().removeChangeListener(opacityListener); groupLayerElement.getLayerListElement().removeChangeListener(layersListener); groupLayerElement.getFilterListElement().removeChangeListener(filtersListener); for (int i = 0; i < layersPanel.getComponentCount(); i++) { final ImageLayerPanel layerPanel = (ImageLayerPanel) layersPanel.getComponent(i); layerPanel.dispose(); } for (int i = 0; i < filtersPanel.getComponentCount(); i++) { final LayerFilterPanel filterPanel = (LayerFilterPanel) filtersPanel.getComponent(i); filterPanel.dispose(); } renderTask.dispose(); } private void buildPreviewConfig(final GroupLayerConfigElement groupLayerElement, final TwisterConfig previewConfig) { final FrameConfigElement frameElement = new FrameConfigElement(); previewConfig.setFrameConfigElement(frameElement); final EffectConfigElement effectElement = new EffectConfigElement(); previewConfig.setEffectConfigElement(effectElement); frameElement.appendLayerConfigElement(groupLayerElement); } private String createEditFiltersText(final GroupLayerConfigElement groupLayerElement) { if (groupLayerElement.getFilterConfigElementCount() == 1) { return groupLayerElement.getFilterConfigElementCount() + " " + TwisterSwingResources.getInstance().getString("label.filter"); } else { return groupLayerElement.getFilterConfigElementCount() + " " + TwisterSwingResources.getInstance().getString("label.filters"); } } private String createFiltersPanelName(final GroupLayerConfigElement groupLayerElement) { return groupLayerElement.getLabel(); } private String createLayersPanelName(final GroupLayerConfigElement groupLayerElement) { return groupLayerElement.getLabel(); } private String createOpacityTooltip(final JSpinner opacitySpinner) { return TwisterSwingResources.getInstance().getString("label.opacity") + " " + opacitySpinner.getValue() + "%"; } /** * @param selected */ public void setSelected(final boolean selected) { selectedCheckBox.setSelected(selected); } /** * @return */ public boolean isSelected() { return selectedCheckBox.isSelected(); } } private class ImageLayerPanel extends JPanel { private static final long serialVersionUID = 1L; private final JCheckBox selectedCheckBox = createCheckBox(); private final LayerPreviewCanvas preview; private final ImageLayerConfigElement imageLayerElement; private final ValueChangeListener lockedListener; private final ValueChangeListener visibleListener; private final ValueChangeListener opacityListener; private final ValueChangeListener filtersListener; private final ValueChangeListener labelListener; private final JPanel filtersPanel; private final ImagePanel imagePanel; private RenderTask renderTask; /** * @param groupLayerElement * @param imageLayerElement */ public ImageLayerPanel(final GroupLayerConfigElement groupLayerElement, final ImageLayerConfigElement imageLayerElement) { this.imageLayerElement = imageLayerElement; final JTextField label = createTextField(imageLayerElement.getLabel(), 120, GUIFactory.DEFAULT_HEIGHT); final JCheckBox lockedCheckBox = createIconCheckBox("locked", "locked", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JCheckBox visibleCheckBox = createIconCheckBox("visible", "visible", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton showFiltersButton = createIconTextButton("filters", "edit", 100, GUIFactory.DEFAULT_HEIGHT); final JButton selectFilterButton = createIconButton("selectFilters", "select", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton appendFilterButton = createIconButton("appendFilter", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton removeFilterButton = createIconButton("removeFilters", "remove", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton moveUpFilterButton = createIconButton("moveUpFilter", "up", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton moveDownFilterButton = createIconButton("moveDownFilter", "down", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JButton cloneFilterButton = createIconButton("cloneFilter", "clone", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); // final JButton insertFilterAfterButton = createIconButton("insertFilterAfter", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); // final JButton insertFilterBeforeButton = createIconButton("insertFilterBefore", "add", GUIFactory.ICON_WIDTH, GUIFactory.ICON_HEIGHT); final JSpinner opacitySpinner = createSpinner(0, 100, 1); final JLabel filtersLabel = createTextLabel("noLayerFilter", SwingConstants.LEFT, 120, GUIFactory.DEFAULT_HEIGHT); filtersPanel = createPanel(new StackLayout(), false); imagePanel = new ImagePanel(imageLayerElement, imageLayerElement.getImageConfigElement()); imagePanel.setOpaque(false); filtersLabel.setPreferredSize(new Dimension(200, GUIFactory.DEFAULT_HEIGHT)); final Box filtersPanel3 = createHorizontalBox(false); filtersPanel3.add(Box.createHorizontalGlue()); filtersPanel3.add(selectFilterButton); filtersPanel3.add(createSpace()); filtersPanel3.add(appendFilterButton); filtersPanel3.add(createSpace()); filtersPanel3.add(removeFilterButton); filtersPanel3.add(createSpace()); filtersPanel3.add(moveUpFilterButton); filtersPanel3.add(createSpace()); filtersPanel3.add(moveDownFilterButton); filtersPanel3.add(createSpace()); filtersPanel3.add(cloneFilterButton); // filtersPanel3.add(insertFilterAfterButton); // filtersPanel3.add(insertFilterBeforeButton); filtersPanel3.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY), BorderFactory.createEmptyBorder(4, 4, 4, 4))); final Box filtersPanel4 = createHorizontalBox(false); filtersPanel4.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8)); filtersPanel4.add(filtersLabel); filtersPanel4.add(Box.createHorizontalGlue()); final JPanel filtersPanel2 = createPanel(new BorderLayout(), true); filtersPanel2.setName(createFiltersPanelName(imageLayerElement)); filtersPanel2.add(filtersPanel3, BorderLayout.NORTH); filtersPanel2.add(filtersPanel, BorderLayout.CENTER); filtersPanel2.add(filtersPanel4, BorderLayout.SOUTH); filtersPanel2.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY)); preview = new LayerPreviewCanvas(); // preview.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2), BorderFactory.createLineBorder(Color.DARK_GRAY))); preview.setPreferredSize(new Dimension(GUIFactory.DEFAULT_HEIGHT, GUIFactory.DEFAULT_HEIGHT)); preview.setMinimumSize(new Dimension(GUIFactory.DEFAULT_HEIGHT, GUIFactory.DEFAULT_HEIGHT)); preview.setMaximumSize(new Dimension(GUIFactory.DEFAULT_HEIGHT, GUIFactory.DEFAULT_HEIGHT)); preview.setSize(new Dimension(GUIFactory.DEFAULT_HEIGHT, GUIFactory.DEFAULT_HEIGHT)); final TwisterConfig previewConfig = new TwisterConfig(); buildPreviewConfig(imageLayerElement, previewConfig); final TwisterRuntime runtime = new TwisterRuntime(previewConfig); final Map<Object, Object> hints = new HashMap<Object, Object>(); hints.put(TwisterRenderingHints.KEY_MEMORY, TwisterRenderingHints.MEMORY_LOW); hints.put(TwisterRenderingHints.KEY_TYPE, TwisterRenderingHints.TYPE_PREVIEW); DefaultTwisterRenderer renderer = new DefaultTwisterRenderer(runtime); renderer.setRenderingHints(hints); renderer.setTile(new Tile(new IntegerVector2D(GUIFactory.DEFAULT_HEIGHT - 4, GUIFactory.DEFAULT_HEIGHT - 4), new IntegerVector2D(GUIFactory.DEFAULT_HEIGHT - 4, GUIFactory.DEFAULT_HEIGHT - 4), new IntegerVector2D(0, 0), new IntegerVector2D(0, 0))); renderTask = new RenderTask(renderer, preview); context.addRenderContextListener(renderTask); refreshPreview.addRenderTask(renderTask); final Box layerPanel = createHorizontalBox(false); layerPanel.add(createSpace()); layerPanel.add(selectedCheckBox); layerPanel.add(preview); layerPanel.add(createSpace()); layerPanel.add(label); layerPanel.add(createSpace()); layerPanel.add(opacitySpinner); layerPanel.add(createSpace()); layerPanel.add(lockedCheckBox); layerPanel.add(createSpace()); layerPanel.add(visibleCheckBox); layerPanel.add(createSpace()); layerPanel.add(showFiltersButton); layerPanel.add(Box.createHorizontalGlue()); layerPanel.add(imagePanel); setLayout(new BorderLayout()); add(layerPanel, BorderLayout.CENTER); setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); layerPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); showFiltersButton.setText(createEditFiltersText(imageLayerElement)); opacitySpinner.setValue(imageLayerElement.getOpacity().intValue()); opacitySpinner.setToolTipText(createOpacityTooltip(opacitySpinner)); lockedCheckBox.setSelected(imageLayerElement.isLocked()); visibleCheckBox.setSelected(imageLayerElement.isVisible()); filtersPanel4.setVisible(imageLayerElement.getFilterConfigElementCount() == 0); for (int i = 0; i < imageLayerElement.getFilterConfigElementCount(); i++) { final LayerFilterConfigElement imageFilterElement = imageLayerElement.getFilterConfigElement(i); filtersPanel.add(new LayerFilterPanel(imageLayerElement, imageFilterElement)); } for (int i = 0; i < filtersPanel.getComponentCount(); i++) { filtersPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor); } appendFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); imageLayerElement.getContext().updateTimestamp(); for (int i = imageLayerElement.getFilterConfigElementCount() - 1; i >= 0; i--) { final LayerFilterConfigElement layerFilterElement = imageLayerElement.getFilterConfigElement(i); if (layerFilterElement.getUserData() != null) { imageLayerElement.insertFilterConfigElementBefore(i, new LayerFilterConfigElement()); return; } } imageLayerElement.appendFilterConfigElement(new LayerFilterConfigElement()); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); removeFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); imageLayerElement.getContext().updateTimestamp(); for (int i = imageLayerElement.getFilterConfigElementCount() - 1; i >= 0; i--) { final LayerFilterConfigElement layerFilterElement = imageLayerElement.getFilterConfigElement(i); if (layerFilterElement.getUserData() != null) { imageLayerElement.removeFilterConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); // insertFilterAfterButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // for (int i = 0; i < imageLayerElement.getFilterConfigElementCount(); i++) { // LayerFilterConfigElement layerFilterElement = imageLayerElement.getFilterConfigElement(i); // if (layerFilterElement.getUserData() != null) { // imageLayerElement.insertFilterConfigElementAfter(i, new LayerFilterConfigElement()); // } // } // } // }); // insertFilterBeforeButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // for (int i = imageLayerElement.getFilterConfigElementCount() - 1; i >= 0; i--) { // LayerFilterConfigElement layerFilterElement = imageLayerElement.getFilterConfigElement(i); // if (layerFilterElement.getUserData() != null) { // imageLayerElement.insertFilterConfigElementBefore(i, new LayerFilterConfigElement()); // } // } // } // }); selectFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { boolean allSelected = true; for (int i = 0; i < filtersPanel.getComponentCount(); i++) { if (!((LayerFilterPanel) filtersPanel.getComponent(i)).isSelected()) { allSelected = false; } } if (allSelected) { for (int i = 0; i < filtersPanel.getComponentCount(); i++) { ((LayerFilterPanel) filtersPanel.getComponent(i)).setSelected(false); } } else { for (int i = 0; i < filtersPanel.getComponentCount(); i++) { ((LayerFilterPanel) filtersPanel.getComponent(i)).setSelected(true); } } } }); moveUpFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = 0; i < imageLayerElement.getFilterConfigElementCount(); i++) { final LayerFilterConfigElement layerFilterElement = imageLayerElement.getFilterConfigElement(i); if (layerFilterElement.getUserData() != null) { imageLayerElement.moveUpFilterConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); moveDownFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = imageLayerElement.getFilterConfigElementCount() - 1; i >= 0; i--) { final LayerFilterConfigElement layerFilterElement = imageLayerElement.getFilterConfigElement(i); if (layerFilterElement.getUserData() != null) { imageLayerElement.moveDownFilterConfigElement(i); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); cloneFilterButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); config.getFrameConfigElement().getContext().updateTimestamp(); for (int i = imageLayerElement.getFilterConfigElementCount() - 1; i >= 0; i--) { final LayerFilterConfigElement layerFilterElement = imageLayerElement.getFilterConfigElement(i); if (layerFilterElement.getUserData() != null) { imageLayerElement.insertFilterConfigElementAfter(i, layerFilterElement.clone()); } } context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }); selectedCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(final ItemEvent e) { if (selectedCheckBox.isSelected()) { imageLayerElement.setUserData(Boolean.TRUE); } else { imageLayerElement.setUserData(null); } } }); final ActionListener lockedActionListener = new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); imageLayerElement.getContext().updateTimestamp(); imageLayerElement.setLocked(lockedCheckBox.isSelected()); context.release(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }; lockedCheckBox.addActionListener(lockedActionListener); final ActionListener visibleActionListener = new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); imageLayerElement.getContext().updateTimestamp(); imageLayerElement.setVisible(visibleCheckBox.isSelected()); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }; visibleCheckBox.addActionListener(visibleActionListener); final ChangeListener opacityChangeListener = new ChangeListener() { public void stateChanged(final ChangeEvent e) { try { context.acquire(); imageLayerElement.getContext().updateTimestamp(); imageLayerElement.setOpacity(((Number) opacitySpinner.getValue()).intValue()); opacitySpinner.setToolTipText(createOpacityTooltip(opacitySpinner)); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }; opacitySpinner.addChangeListener(opacityChangeListener); label.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { // imageLayerElement.getLabelElement().removeChangeListener(labelListener); imageLayerElement.getContext().updateTimestamp(); imageLayerElement.setLabel(label.getText()); filtersPanel2.setName(createFiltersPanelName(imageLayerElement)); // imageLayerElement.getLabelElement().addChangeListener(labelListener); } }); showFiltersButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { viewContext.setComponent(filtersPanel2); } }); lockedListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { lockedCheckBox.removeActionListener(lockedActionListener); lockedCheckBox.setSelected(imageLayerElement.isLocked()); lockedCheckBox.addActionListener(lockedActionListener); } }; visibleListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { visibleCheckBox.removeActionListener(visibleActionListener); visibleCheckBox.setSelected(imageLayerElement.isVisible()); visibleCheckBox.addActionListener(visibleActionListener); } }; opacityListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { opacitySpinner.removeChangeListener(opacityChangeListener); opacitySpinner.setValue(imageLayerElement.getOpacity().intValue()); opacitySpinner.setToolTipText(createOpacityTooltip(opacitySpinner)); opacitySpinner.addChangeListener(opacityChangeListener); } }; filtersListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ListConfigElement.ELEMENT_ADDED: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); filtersPanel.add(new LayerFilterPanel(imageLayerElement, (LayerFilterConfigElement) e.getParams()[0])); filtersPanel4.setVisible(imageLayerElement.getFilterConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_INSERTED_AFTER: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); filtersPanel.add(new LayerFilterPanel(imageLayerElement, (LayerFilterConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue() + 1); filtersPanel4.setVisible(imageLayerElement.getFilterConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_INSERTED_BEFORE: { viewContext.resize(GUIFactory.DEFAULT_HEIGHT); filtersPanel.add(new LayerFilterPanel(imageLayerElement, (LayerFilterConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue()); filtersPanel4.setVisible(imageLayerElement.getFilterConfigElementCount() == 0); break; } case ListConfigElement.ELEMENT_REMOVED: { LayerFilterPanel panel = (LayerFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(((Integer) e.getParams()[1]).intValue()); panel.dispose(); filtersPanel4.setVisible(imageLayerElement.getFilterConfigElementCount() == 0); // viewContext.resize(); viewContext.restoreComponent(filtersPanel2); break; } case ListConfigElement.ELEMENT_MOVED_UP: { LayerFilterPanel panel = (LayerFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(panel); filtersPanel.add(panel, ((Integer) e.getParams()[1]).intValue() - 1); viewContext.restoreComponent(filtersPanel2); break; } case ListConfigElement.ELEMENT_MOVED_DOWN: { LayerFilterPanel panel = (LayerFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(panel); filtersPanel.add(panel, ((Integer) e.getParams()[1]).intValue() + 1); viewContext.restoreComponent(filtersPanel2); break; } case ListConfigElement.ELEMENT_CHANGED: { LayerFilterPanel panel = (LayerFilterPanel) filtersPanel.getComponent(((Integer) e.getParams()[1]).intValue()); filtersPanel.remove(panel); panel.dispose(); filtersPanel.add(new LayerFilterPanel(imageLayerElement, (LayerFilterConfigElement) e.getParams()[0]), ((Integer) e.getParams()[1]).intValue()); break; } default: { break; } } for (int i = 0; i < filtersPanel.getComponentCount(); i++) { filtersPanel.getComponent(i).setBackground((i % 2 == 0) ? evenColor : oddColor); } showFiltersButton.setText(createEditFiltersText(imageLayerElement)); } }; labelListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { label.setText(imageLayerElement.getLabel()); filtersPanel2.setName(createFiltersPanelName(imageLayerElement)); } }; imageLayerElement.getLabelElement().addChangeListener(labelListener); imageLayerElement.getLockedElement().addChangeListener(lockedListener); imageLayerElement.getVisibleElement().addChangeListener(visibleListener); imageLayerElement.getOpacityElement().addChangeListener(opacityListener); imageLayerElement.getFilterListElement().addChangeListener(filtersListener); } public void dispose() { refreshPreview.removeRenderTask(renderTask); context.removeRenderContextListener(renderTask); imageLayerElement.getLabelElement().removeChangeListener(labelListener); imageLayerElement.getLockedElement().removeChangeListener(lockedListener); imageLayerElement.getVisibleElement().removeChangeListener(visibleListener); imageLayerElement.getOpacityElement().removeChangeListener(opacityListener); imageLayerElement.getFilterListElement().removeChangeListener(filtersListener); for (int i = 0; i < filtersPanel.getComponentCount(); i++) { final LayerFilterPanel filterPanel = (LayerFilterPanel) filtersPanel.getComponent(i); filterPanel.dispose(); } imagePanel.dispose(); renderTask.dispose(); } private void buildPreviewConfig(final ImageLayerConfigElement imageLayerElement, final TwisterConfig previewConfig) { final FrameConfigElement frameElement = new FrameConfigElement(); previewConfig.setFrameConfigElement(frameElement); final EffectConfigElement effectElement = new EffectConfigElement(); previewConfig.setEffectConfigElement(effectElement); final GroupLayerConfigElement groupLayerElement = new GroupLayerConfigElement(); frameElement.appendLayerConfigElement(groupLayerElement); groupLayerElement.appendLayerConfigElement(imageLayerElement); } private String createEditFiltersText(final ImageLayerConfigElement imageLayerElement) { if (imageLayerElement.getFilterConfigElementCount() == 1) { return imageLayerElement.getFilterConfigElementCount() + " " + TwisterSwingResources.getInstance().getString("label.filter"); } else { return imageLayerElement.getFilterConfigElementCount() + " " + TwisterSwingResources.getInstance().getString("label.filters"); } } private String createFiltersPanelName(final ImageLayerConfigElement imageLayerElement) { return imageLayerElement.getLabel(); } private String createOpacityTooltip(final JSpinner opacitySpinner) { return TwisterSwingResources.getInstance().getString("label.opacity") + " " + opacitySpinner.getValue() + "%"; } /** * @param selected */ public void setSelected(final boolean selected) { selectedCheckBox.setSelected(selected); } /** * @return */ public boolean isSelected() { return selectedCheckBox.isSelected(); } } private class LayerFilterPanel extends JPanel { private static final long serialVersionUID = 1L; private final JCheckBox selectedCheckBox = createCheckBox(); private ViewPanel configView; private final LayerFilterConfigElement imageFilterElement; private final ValueChangeListener lockedListener; private final ValueChangeListener enabledListener; private final ValueChangeListener labelListener; private final ValueChangeListener filterListener; /** * @param layerElement * @param imageFilterElement */ public LayerFilterPanel(final LayerConfigElement layerElement, final LayerFilterConfigElement imageFilterElement) { this.imageFilterElement = imageFilterElement; final ConfigurableExtensionComboBoxModel model = new ConfigurableExtensionComboBoxModel(TwisterRegistry.getInstance().getLayerFilterRegistry(), true); final JTextField label = createTextField(imageFilterElement.getLabel(), 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 JButton editOptionsButton = createIconTextButton("editConfig", "edit", 120, GUIFactory.DEFAULT_HEIGHT); final JComboBox extensionComboBox = createExtensionComboBox(model, 140, GUIFactory.DEFAULT_HEIGHT); final Box filterPanel = createHorizontalBox(false); filterPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8)); filterPanel.add(createSpace()); filterPanel.add(selectedCheckBox); filterPanel.add(label); filterPanel.add(createSpace()); filterPanel.add(lockedCheckBox); filterPanel.add(createSpace()); filterPanel.add(enabledCheckBox); filterPanel.add(createSpace()); filterPanel.add(Box.createHorizontalGlue()); filterPanel.add(extensionComboBox); filterPanel.add(createSpace()); filterPanel.add(editOptionsButton); setLayout(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); add(filterPanel, BorderLayout.CENTER); lockedCheckBox.setSelected(imageFilterElement.isLocked()); enabledCheckBox.setSelected(imageFilterElement.isEnabled()); editOptionsButton.setEnabled((imageFilterElement != null) && (imageFilterElement.getReference() != null)); if (imageFilterElement.getReference() != null) { model.setSelectedItemByExtensionId(imageFilterElement.getReference().getExtensionId()); } final ActionListener comboListener = new ActionListener() { @SuppressWarnings("unchecked") public void actionPerformed(final ActionEvent e) { try { ConfigurableExtension<LayerFilterExtensionRuntime<?>, LayerFilterExtensionConfig> extension = (ConfigurableExtension<LayerFilterExtensionRuntime<?>, LayerFilterExtensionConfig>) extensionComboBox.getSelectedItem(); context.acquire(); context.stopRenderers(); imageFilterElement.getContext().updateTimestamp(); if (extension instanceof NullConfigurableExtension) { imageFilterElement.setReference(null); } else { imageFilterElement.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 (imageFilterElement.getReference() != null) { if (configView == null) { try { final Extension<ViewExtensionRuntime> extension = TwisterSwingRegistry.getInstance().getViewExtension(imageFilterElement.getReference().getExtensionId()); configView = extension.createExtensionRuntime().createView(imageFilterElement.getReference().getExtensionConfig(), viewContext, context, session); } catch (final ExtensionException x) { configView = new NavigatorViewRuntime().createView(imageFilterElement.getReference().getExtensionConfig(), viewContext, context, session); } } if (configView != null) { configView.setName(createFiltersPanelName(imageFilterElement)); } viewContext.setComponent(configView); } } }); selectedCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(final ItemEvent e) { if (selectedCheckBox.isSelected()) { imageFilterElement.setUserData(Boolean.TRUE); } else { imageFilterElement.setUserData(null); } } }); label.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { // imageFilterElement.getLabelElement().removeChangeListener(labelListener); imageFilterElement.getContext().updateTimestamp(); imageFilterElement.setLabel(label.getText()); if (configView != null) { configView.setName(createFiltersPanelName(imageFilterElement)); } // imageFilterElement.getLabelElement().addChangeListener(labelListener); } }); final ActionListener lockedActionListener = new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); imageFilterElement.getContext().updateTimestamp(); imageFilterElement.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(); imageFilterElement.getContext().updateTimestamp(); imageFilterElement.setEnabled(enabledCheckBox.isSelected()); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }; enabledCheckBox.addActionListener(enabledActionListener); filterListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: { editOptionsButton.setEnabled(imageFilterElement.getReference() != null); extensionComboBox.removeActionListener(comboListener); if (imageFilterElement.getReference() != null) { model.setSelectedItemByExtensionId(imageFilterElement.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(imageFilterElement.isLocked()); lockedCheckBox.addActionListener(lockedActionListener); } }; enabledListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { enabledCheckBox.removeActionListener(enabledActionListener); enabledCheckBox.setSelected(imageFilterElement.isEnabled()); enabledCheckBox.addActionListener(enabledActionListener); } }; labelListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { label.setText(imageFilterElement.getLabel()); if (configView != null) { configView.setName(createFiltersPanelName(imageFilterElement)); } } }; imageFilterElement.getLabelElement().addChangeListener(labelListener); imageFilterElement.getLockedElement().addChangeListener(lockedListener); imageFilterElement.getEnabledElement().addChangeListener(enabledListener); imageFilterElement.getExtensionElement().addChangeListener(filterListener); } public void dispose() { imageFilterElement.getLabelElement().removeChangeListener(labelListener); imageFilterElement.getLockedElement().removeChangeListener(lockedListener); imageFilterElement.getEnabledElement().removeChangeListener(enabledListener); imageFilterElement.getExtensionElement().removeChangeListener(filterListener); if (configView != null) { viewContext.removeComponent(configView); configView.dispose(); configView = null; } } private String createFiltersPanelName(final LayerFilterConfigElement imageFilterElement) { return imageFilterElement.getLabel(); } /** * @param selected */ public void setSelected(final boolean selected) { selectedCheckBox.setSelected(selected); } /** * @return */ public boolean isSelected() { return selectedCheckBox.isSelected(); } } private class FrameFilterPanel extends JPanel { private static final long serialVersionUID = 1L; private final JCheckBox selectedCheckBox = createCheckBox(); private ViewPanel configView; private final FrameFilterConfigElement frameFilterElement; private final ValueChangeListener lockedListener; private final ValueChangeListener enabledListener; private final ValueChangeListener labelListener; private final ValueChangeListener filterListener; /** * @param frameElement * @param frameFilterElement */ public FrameFilterPanel(final FrameConfigElement frameElement, final FrameFilterConfigElement frameFilterElement) { this.frameFilterElement = frameFilterElement; final ConfigurableExtensionComboBoxModel model = new ConfigurableExtensionComboBoxModel(TwisterRegistry.getInstance().getFrameFilterRegistry(), true); final JTextField label = createTextField(frameFilterElement.getLabel(), 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 JButton editOptionsButton = createIconTextButton("editConfig", "edit", 120, GUIFactory.DEFAULT_HEIGHT); final JComboBox extensionComboBox = createExtensionComboBox(model, 140, GUIFactory.DEFAULT_HEIGHT); final Box filterPanel = createHorizontalBox(false); filterPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8)); filterPanel.add(createSpace()); filterPanel.add(selectedCheckBox); filterPanel.add(label); filterPanel.add(createSpace()); filterPanel.add(lockedCheckBox); filterPanel.add(createSpace()); filterPanel.add(enabledCheckBox); filterPanel.add(createSpace()); filterPanel.add(Box.createHorizontalGlue()); filterPanel.add(extensionComboBox); filterPanel.add(createSpace()); filterPanel.add(editOptionsButton); setLayout(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); add(filterPanel, BorderLayout.CENTER); lockedCheckBox.setSelected(frameFilterElement.isLocked()); enabledCheckBox.setSelected(frameFilterElement.isEnabled()); editOptionsButton.setEnabled((frameFilterElement != null) && (frameFilterElement.getReference() != null)); if (frameFilterElement.getReference() != null) { model.setSelectedItemByExtensionId(frameFilterElement.getReference().getExtensionId()); } final ActionListener comboListener = new ActionListener() { @SuppressWarnings("unchecked") public void actionPerformed(final ActionEvent e) { try { ConfigurableExtension<FrameFilterExtensionRuntime<?>, FrameFilterExtensionConfig> extension = (ConfigurableExtension<FrameFilterExtensionRuntime<?>, FrameFilterExtensionConfig>) extensionComboBox.getSelectedItem(); context.acquire(); context.stopRenderers(); frameFilterElement.getContext().updateTimestamp(); if (extension instanceof NullConfigurableExtension) { frameFilterElement.setReference(null); } else { frameFilterElement.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 (frameFilterElement.getReference() != null) { if (configView == null) { try { final Extension<ViewExtensionRuntime> extension = TwisterSwingRegistry.getInstance().getViewExtension(frameFilterElement.getReference().getExtensionId()); configView = extension.createExtensionRuntime().createView(frameFilterElement.getReference().getExtensionConfig(), viewContext, context, session); } catch (final ExtensionException x) { configView = new NavigatorViewRuntime().createView(frameFilterElement.getReference().getExtensionConfig(), viewContext, context, session); } } if (configView != null) { configView.setName(createFiltersPanelName(frameFilterElement)); } viewContext.setComponent(configView); } } }); label.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { // frameFilterElement.getLabelElement().removeChangeListener(labelListener); frameFilterElement.getContext().updateTimestamp(); frameFilterElement.setLabel(label.getText()); if (configView != null) { configView.setName(createFiltersPanelName(frameFilterElement)); } // frameFilterElement.getLabelElement().addChangeListener(labelListener); } }); selectedCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(final ItemEvent e) { if (selectedCheckBox.isSelected()) { frameFilterElement.setUserData(Boolean.TRUE); } else { frameFilterElement.setUserData(null); } } }); final ActionListener lockedActionListener = new ActionListener() { public void actionPerformed(final ActionEvent e) { frameFilterElement.getContext().updateTimestamp(); frameFilterElement.setLocked(lockedCheckBox.isSelected()); } }; lockedCheckBox.addActionListener(lockedActionListener); final ActionListener enabledActionListener = new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); frameFilterElement.getContext().updateTimestamp(); frameFilterElement.setEnabled(enabledCheckBox.isSelected()); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }; enabledCheckBox.addActionListener(enabledActionListener); filterListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: { editOptionsButton.setEnabled(frameFilterElement.getReference() != null); extensionComboBox.removeActionListener(comboListener); if (frameFilterElement.getReference() != null) { model.setSelectedItemByExtensionId(frameFilterElement.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(frameFilterElement.isLocked()); lockedCheckBox.addActionListener(lockedActionListener); } }; enabledListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { enabledCheckBox.removeActionListener(enabledActionListener); enabledCheckBox.setSelected(frameFilterElement.isEnabled()); enabledCheckBox.addActionListener(enabledActionListener); } }; labelListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { label.setText(frameFilterElement.getLabel()); if (configView != null) { configView.setName(createFiltersPanelName(frameFilterElement)); } } }; frameFilterElement.getLabelElement().addChangeListener(labelListener); frameFilterElement.getLockedElement().addChangeListener(lockedListener); frameFilterElement.getEnabledElement().addChangeListener(enabledListener); frameFilterElement.getExtensionElement().addChangeListener(filterListener); } public void dispose() { frameFilterElement.getLabelElement().removeChangeListener(labelListener); frameFilterElement.getLockedElement().removeChangeListener(lockedListener); frameFilterElement.getEnabledElement().removeChangeListener(enabledListener); frameFilterElement.getExtensionElement().removeChangeListener(filterListener); if (configView != null) { viewContext.removeComponent(configView); configView.dispose(); configView = null; } } private String createFiltersPanelName(final FrameFilterConfigElement frameFilterElement) { return frameFilterElement.getLabel(); } /** * @param selected */ public void setSelected(final boolean selected) { selectedCheckBox.setSelected(selected); } /** * @return */ public boolean isSelected() { return selectedCheckBox.isSelected(); } } private class ImagePanel extends JPanel { private static final long serialVersionUID = 1L; // private ViewPanel configView; private final ImageConfigElement imageElement; private final ValueChangeListener imageListener; private NavigationFrame navigationFrame; /** * @param layerElement * @param imageElement */ public ImagePanel(final ImageLayerConfigElement layerElement, final ImageConfigElement imageElement) { this.imageElement = imageElement; final ConfigurableExtensionComboBoxModel model = new ConfigurableExtensionComboBoxModel(TwisterRegistry.getInstance().getImageRegistry(), true); final JButton editOptionsButton = createIconTextButton("editConfig", "edit", 120, GUIFactory.DEFAULT_HEIGHT); final JComboBox extensionComboBox = createExtensionComboBox(model, 140, GUIFactory.DEFAULT_HEIGHT); final Box imagePanel = createHorizontalBox(false); imagePanel.add(Box.createHorizontalGlue()); imagePanel.add(extensionComboBox); imagePanel.add(createSpace()); imagePanel.add(editOptionsButton); setLayout(new BorderLayout()); add(imagePanel, BorderLayout.CENTER); editOptionsButton.setEnabled((imageElement != null) && (imageElement.getReference() != null)); if (imageElement.getReference() != null) { model.setSelectedItemByExtensionId(imageElement.getReference().getExtensionId()); } final ActionListener comboListener = new ActionListener() { @SuppressWarnings("unchecked") public void actionPerformed(final ActionEvent e) { try { ConfigurableExtension<ImageExtensionRuntime<?>, ImageExtensionConfig> extension = (ConfigurableExtension<ImageExtensionRuntime<?>, ImageExtensionConfig>) extensionComboBox.getSelectedItem(); context.acquire(); context.stopRenderers(); imageElement.getContext().updateTimestamp(); if (extension instanceof NullConfigurableExtension) { imageElement.setReference(null); } else { imageElement.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 (imageElement.getReference() != null) { if (navigationFrame == null) { navigationFrame = new NavigationFrame(imageElement.getExtensionElement(), context, session, createImagePanelName(layerElement)); navigationFrame.addWindowListener(new WindowAdapter() { /** * @see java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent) */ @Override public void windowClosing(final WindowEvent e) { if (navigationFrame != null) { navigationFrame.dispose(); navigationFrame = null; } } }); } // if (configView == null) { // try { // final Extension<ViewExtensionRuntime> extension = TwisterSwingRegistry.getInstance().getViewExtension(imageElement.getReference().getExtensionId()); // configView = extension.createExtensionRuntime().createView(imageElement.getReference().getExtensionConfig(), viewContext, context, session); // } // catch (final ExtensionException x) { // configView = new NavigatorViewRuntime().createView(imageElement.getReference().getExtensionConfig(), viewContext, context, session); // } // } // if (configView != null) { // configView.setName(createImagePanelName(layerElement)); // } navigationFrame.setVisible(true); navigationFrame.toFront(); GUIUtil.executeTask(new Runnable() { public void run() { navigationFrame.setup(); } }, true); // viewContext.setComponent(configView); } } }); imageListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: { editOptionsButton.setEnabled(imageElement.getReference() != null); extensionComboBox.removeActionListener(comboListener); if (imageElement.getReference() != null) { model.setSelectedItemByExtensionId(imageElement.getReference().getExtensionId()); } else { model.setSelectedItem(0); } // if (configView != null) { // viewContext.removeComponent(configView); // configView = null; // } extensionComboBox.addActionListener(comboListener); break; } default: { break; } } } }; imageElement.getExtensionElement().addChangeListener(imageListener); } public void dispose() { imageElement.getExtensionElement().removeChangeListener(imageListener); if (navigationFrame != null) { navigationFrame.dispose(); navigationFrame = null; } // if (configView != null) { // viewContext.removeComponent(configView); // configView.dispose(); // configView = null; // } } private String createImagePanelName(final ImageLayerConfigElement layerElement) { return layerElement.getLabel(); } } private class EffectPanel extends JPanel { private static final long serialVersionUID = 1L; private ViewPanel configView; private final EffectConfigElement effectElement; private final ValueChangeListener lockedListener; private final ValueChangeListener enabledListener; private final ValueChangeListener effectListener; /** * @param config * @param effectElement */ public EffectPanel(final TwisterConfig config, final EffectConfigElement effectElement) { this.effectElement = effectElement; final ConfigurableExtensionComboBoxModel model = new ConfigurableExtensionComboBoxModel(TwisterRegistry.getInstance().getEffectRegistry(), true); final JLabel label = createTextLabel("effect", SwingConstants.LEFT, 80, 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 JButton editOptionsButton = createIconTextButton("editConfig", "edit", 120, GUIFactory.DEFAULT_HEIGHT); final JComboBox extensionComboBox = createExtensionComboBox(model, 140, GUIFactory.DEFAULT_HEIGHT); label.setPreferredSize(new Dimension(55, GUIFactory.DEFAULT_HEIGHT)); final Box effectPanel = createHorizontalBox(false); effectPanel.add(Box.createHorizontalGlue()); effectPanel.add(label); effectPanel.add(createSpace()); effectPanel.add(lockedCheckBox); effectPanel.add(createSpace()); effectPanel.add(enabledCheckBox); effectPanel.add(createSpace()); effectPanel.add(extensionComboBox); effectPanel.add(createSpace()); effectPanel.add(editOptionsButton); effectPanel.add(Box.createHorizontalGlue()); setLayout(new BorderLayout()); add(effectPanel, BorderLayout.CENTER); setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.DARK_GRAY)); editOptionsButton.setEnabled((effectElement != null) && (effectElement.getReference() != null)); if (effectElement.getReference() != null) { model.setSelectedItemByExtensionId(effectElement.getReference().getExtensionId()); } lockedCheckBox.setSelected(effectElement.isLocked()); enabledCheckBox.setSelected(effectElement.isEnabled()); final ActionListener comboListener = new ActionListener() { @SuppressWarnings("unchecked") public void actionPerformed(final ActionEvent e) { try { ConfigurableExtension<EffectExtensionRuntime<?>, EffectExtensionConfig> extension = (ConfigurableExtension<EffectExtensionRuntime<?>, EffectExtensionConfig>) extensionComboBox.getSelectedItem(); context.acquire(); context.stopRenderers(); effectElement.getContext().updateTimestamp(); if (extension == NullConfigurableExtension.getInstance()) { effectElement.setReference(null); } else { effectElement.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 (effectElement.getReference() != null) { if (configView == null) { try { final Extension<ViewExtensionRuntime> extension = TwisterSwingRegistry.getInstance().getViewExtension(effectElement.getReference().getExtensionId()); configView = extension.createExtensionRuntime().createView(effectElement.getReference().getExtensionConfig(), viewContext, context, session); } catch (final ExtensionException x) { configView = new NavigatorViewRuntime().createView(effectElement.getReference().getExtensionConfig(), viewContext, context, session); } } if (configView != null) { configView.setName(createEffectPanelName()); } viewContext.setComponent(configView); } } }); final ActionListener lockedActionListener = new ActionListener() { public void actionPerformed(final ActionEvent e) { effectElement.getContext().updateTimestamp(); effectElement.setLocked(lockedCheckBox.isSelected()); } }; lockedCheckBox.addActionListener(lockedActionListener); final ActionListener enabledActionListener = new ActionListener() { public void actionPerformed(final ActionEvent e) { try { context.acquire(); effectElement.getContext().updateTimestamp(); effectElement.setEnabled(enabledCheckBox.isSelected()); context.release(); context.refresh(); } catch (InterruptedException x) { Thread.currentThread().interrupt(); } } }; enabledCheckBox.addActionListener(enabledActionListener); effectListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { switch (e.getEventType()) { case ExtensionReferenceElement.EXTENSION_REFERENCE_CHANGED: { editOptionsButton.setEnabled(effectElement.getReference() != null); extensionComboBox.removeActionListener(comboListener); if (effectElement.getReference() != null) { model.setSelectedItemByExtensionId(effectElement.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(effectElement.isLocked()); lockedCheckBox.addActionListener(lockedActionListener); } }; enabledListener = new ValueChangeListener() { public void valueChanged(final ValueChangeEvent e) { enabledCheckBox.removeActionListener(enabledActionListener); enabledCheckBox.setSelected(effectElement.isEnabled()); enabledCheckBox.addActionListener(enabledActionListener); } }; effectElement.getLockedElement().addChangeListener(lockedListener); effectElement.getEnabledElement().addChangeListener(enabledListener); effectElement.getExtensionElement().addChangeListener(effectListener); } public void dispose() { effectElement.getLockedElement().removeChangeListener(lockedListener); effectElement.getEnabledElement().removeChangeListener(enabledListener); effectElement.getExtensionElement().removeChangeListener(effectListener); if (configView != null) { viewContext.removeComponent(configView); configView.dispose(); configView = null; } } private String createEffectPanelName() { return TwisterSwingResources.getInstance().getString("name.effect"); } } } private class LayerPreviewCanvas extends Canvas { private static final long serialVersionUID = 1L; private BufferedImage bufferedImage; /** * @see java.awt.Canvas#update(java.awt.Graphics) */ @Override public void update(final Graphics g) { paint(g); } /** * @see java.awt.Canvas#paint(java.awt.Graphics) */ @Override public void paint(Graphics g) { if (bufferedImage == null) { bufferedImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); context.refresh(); } g.drawImage(bufferedImage, 0, 0, this); } /** * @param renderer */ public void draw(TwisterRenderer renderer) { if (bufferedImage != null) { Graphics2D g = bufferedImage.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED); g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); renderer.drawImage(g, 1, 1, GUIFactory.DEFAULT_HEIGHT, GUIFactory.DEFAULT_HEIGHT); g.setColor(Color.BLACK); g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); g.dispose(); } } } private class RepaintTask implements Runnable { private final List<RenderTask> tasks = new LinkedList<RenderTask>(); private LinkedList<RenderTask> tasksList = new LinkedList<RenderTask>(); private final Object lock = new Object(); private Thread repaintThread; private boolean running; private boolean refresh; /** * @param o * @return * @see java.util.List#add(java.lang.Object) */ public void addRenderTask(RenderTask o) { synchronized (tasks) { tasks.add(o); } } /** * @param o * @return * @see java.util.List#remove(java.lang.Object) */ public void removeRenderTask(RenderTask o) { synchronized (tasks) { tasks.remove(o); } } /** * */ public void refresh() { synchronized (lock) { refresh = true; lock.notify(); } } /** * */ public void start() { if (repaintThread == null) { running = true; repaintThread = new Thread(this); repaintThread.setName("ConfigPanel RepaintTask"); repaintThread.setPriority(Thread.MIN_PRIORITY); repaintThread.setDaemon(true); repaintThread.start(); } } /** * */ public void stop() { if (repaintThread != null) { running = false; repaintThread.interrupt(); try { repaintThread.join(); } catch (final InterruptedException e) { } repaintThread = null; } } /** * @return */ public boolean isStarted() { return repaintThread != null; } /** * @see java.lang.Runnable#run() */ public void run() { try { long idleTime = 0; while (running) { synchronized (tasks) { tasksList.clear(); tasksList.addAll(tasks); } for (RenderTask task : tasksList) { task.repaint(); } synchronized (lock) { if (refresh) { idleTime = System.currentTimeMillis(); } if (System.currentTimeMillis() - idleTime > 750) { if (!refresh) { lock.wait(); } idleTime = System.currentTimeMillis(); } refresh = false; } if (!running) { break; } Thread.sleep(250); } } catch (final InterruptedException e) { Thread.currentThread().interrupt(); } catch (final Exception e) { e.printStackTrace(); } } } private class RenderTask implements RenderContextListener { private TwisterRenderer renderer; private LayerPreviewCanvas preview; public RenderTask(TwisterRenderer renderer, LayerPreviewCanvas preview) { this.renderer = renderer; this.preview = preview; } /** * */ public void dispose() { renderer.dispose(); renderer = null; preview = null; } /** * */ public void repaint() { preview.repaint(); } /** * */ public void drawImage() { preview.draw(renderer); } /** * @param isDynamic */ public void prepareImage(boolean isDynamic) { renderer.prepareImage(isDynamic); } /** * @see net.sf.jame.core.util.RenderContextListener#startRenderer() */ public void startRenderer() { renderer.startRenderer(); } /** * @see net.sf.jame.core.util.RenderContextListener#stopRenderer() */ public void stopRenderer() { renderer.stopRenderer(); } /** * @see net.sf.jame.core.util.RenderContextListener#joinRenderer() */ public void joinRenderer() { renderer.joinRenderer(); } /** * @see net.sf.jame.core.util.RenderContextListener#abortRenderer() */ public void abortRenderer() { renderer.abortRenderer(); } /** * @see net.sf.jame.core.util.RenderContextListener#refresh() */ public void refresh() { refreshPreview.refresh(); } } }