/* * JAME 6.2.1 * http://jame.sourceforge.net * * Copyright 2001, 2016 Andrea Medeghini * * This file is part of JAME. * * JAME is an application for creating fractals and other graphics artifacts. * * JAME is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JAME is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with JAME. If not, see <http://www.gnu.org/licenses/>. * */ package net.sf.jame.mandelbrot.swing.palette; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.ComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.SingleSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import net.sf.jame.core.extension.ExtensionReference; import net.sf.jame.core.swing.palette.PaletteChangeEvent; import net.sf.jame.core.swing.palette.PaletteChangeListener; import net.sf.jame.core.swing.palette.PaletteField; import net.sf.jame.core.swing.util.GUIFactory; import net.sf.jame.core.util.Registry; import net.sf.jame.mandelbrot.swing.MandelbrotSwingResources; import net.sf.jame.mandelbrot.util.DefaultRenderedPalette; import net.sf.jame.mandelbrot.util.DefaultRenderedPaletteParam; import net.sf.jame.mandelbrot.util.RenderedPalette; import net.sf.jame.mandelbrot.util.RenderedPaletteParam; /** * @author Andrea Medeghini */ public class RenderedPalettePanel extends JPanel { private static final long serialVersionUID = 1L; protected static final String PARAM_SELECTION_MODEL = "param.selection.model"; protected static final String PALETTE_PARAM_MODEL = "palette.param.model"; protected static final String PALETTE_MODEL = "palette.model"; protected static final String COMBOBOX = "comboBox"; protected static final int[] size = new int[] { 8, 1 }; protected static final RenderedPalette[][] palettes = new RenderedPalette[RenderedPalettePanel.size[0]][RenderedPalettePanel.size[1]]; private final Registry<Object> registry = new Registry<Object>(); private final ComboboxListener actionListener = new ComboboxListener(); private final RenderedPaletteSelectionListener selectionListener = new RenderedPaletteSelectionListener(); private final RenderedPaletteParamListener paletteParamListener = new RenderedPaletteParamListener(); private final RenderedPaletteListener paletteListener = new RenderedPaletteListener(); private final RenderedPaletteModel model; /** * @param model */ public RenderedPalettePanel(final RenderedPaletteModel model) { if (model == null) { throw new NullPointerException("model == nul"); } this.model = model; setupPanel(this); } /** * @param panel */ protected void setupPanel(final JPanel panel) { registry.put(RenderedPalettePanel.PALETTE_MODEL, model); panel.setLayout(new BorderLayout()); final JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab(MandelbrotSwingResources.getInstance().getString("tab.params.label"), createParamsPanel(registry, model)); tabbedPane.addTab(MandelbrotSwingResources.getInstance().getString("tab.palettes.label"), createPalettesPanel(registry)); panel.add(createPalettePanel(registry, model), BorderLayout.CENTER); panel.add(tabbedPane, BorderLayout.SOUTH); addRenderedPaletteListener(); addRenderedPaletteParamListener(); addRenderedPaletteActionListener(); addSelectionListener(); getComboBox(RenderedPalettePanel.COMBOBOX).setSelectedIndex(0); // getSingleSelectionModel(PARAM_SELECTION_MODEL).setSelectedIndex(getComboBox(COMBOBOX).getSelectedIndex()); } /** * @param registry * @param model * @return */ protected JPanel createParamsPanel(final Registry<Object> registry, final RenderedPaletteModel model) { final JPanel panel = new JPanel(new BorderLayout()); final ComboBoxModel comboBoxModel = new RenderedPaletteComboBoxModel(model); final JComboBox comboBox = GUIFactory.createComboBox(comboBoxModel, MandelbrotSwingResources.getInstance().getString("params.select.tooltip")); registry.put(RenderedPalettePanel.COMBOBOX, comboBox); final JPanel comboBoxPanel = new JPanel(new BorderLayout()); comboBoxPanel.add(comboBox, BorderLayout.CENTER); final JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); final JButton buttonCreate = GUIFactory.createButton(new CreateAction(model), MandelbrotSwingResources.getInstance().getString("params.create.button.tooltip")); final JButton buttonDelete = GUIFactory.createButton(new DeleteAction(model), MandelbrotSwingResources.getInstance().getString("params.delete.button.tooltip")); final JButton buttonInsert = GUIFactory.createButton(new InsertAction(model), MandelbrotSwingResources.getInstance().getString("params.insert.button.tooltip")); final JButton buttonReverse = GUIFactory.createButton(new ReverseAction(model), MandelbrotSwingResources.getInstance().getString("params.reverse.button.tooltip")); buttonPanel.add(buttonCreate); buttonPanel.add(buttonDelete); buttonPanel.add(buttonInsert); buttonPanel.add(buttonReverse); comboBox.setRenderer(new RenderedPaletteParamListCellRenderer()); comboBoxPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); final RenderedPaletteParamModel paramModel = new DefaultRenderedPaletteParamModel(); final RenderedPaletteParamPanel paramPanel = new RenderedPaletteParamPanel(paramModel); registry.put(RenderedPalettePanel.PALETTE_PARAM_MODEL, paramModel); panel.add(comboBoxPanel, BorderLayout.NORTH); panel.add(paramPanel, BorderLayout.CENTER); panel.add(buttonPanel, BorderLayout.SOUTH); panel.setOpaque(false); // paramModel.setPaletteParam((RenderedPaletteParam) comboBox.getModel().getSelectedItem(), false); return panel; } /** * @param registry * @return */ protected JPanel createPalettesPanel(final Registry<Object> registry) { final JPanel panel = new JPanel(new GridLayout(RenderedPalettePanel.size[0], RenderedPalettePanel.size[1])); for (int i = 0; i < RenderedPalettePanel.size[0]; i++) { for (int j = 0; j < RenderedPalettePanel.size[1]; j++) { PaletteField paletteField = null; if (RenderedPalettePanel.palettes[i][j] != null) { paletteField = new PaletteField(new DefaultRenderedPaletteModel(RenderedPalettePanel.palettes[i][j])); } else { paletteField = new PaletteField(new DefaultRenderedPaletteModel(new DefaultRenderedPalette(Color.WHITE, Color.BLACK))); } final Dimension size = new Dimension(128, 32); paletteField.setPreferredSize(size); paletteField.setMinimumSize(size); paletteField.setMaximumSize(size); paletteField.getModel().addPaletteChangeListener(new PaletteListener(i, j)); paletteField.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2), BorderFactory.createLineBorder(Color.GRAY))); panel.add(paletteField); } } return panel; } /** * @param registry * @param model * @return */ protected JPanel createPalettePanel(final Registry<Object> registry, final RenderedPaletteModel model) { final JPanel panel = new JPanel(new BorderLayout()); final RenderedPaletteField paletteField = new RenderedPaletteField(model); // paletteField.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.GRAY), BorderFactory.createEmptyBorder(2, 2, 2, 2))); paletteField.setBorder(BorderFactory.createLineBorder(Color.GRAY)); registry.put(RenderedPalettePanel.PARAM_SELECTION_MODEL, paletteField.getSelectionModel()); panel.add(paletteField); panel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); return panel; } /** * @param comboBoxId * @return */ protected JComboBox getComboBox(final String comboBoxId) { return (JComboBox) registry.get(comboBoxId); } /** * @param modelId * @return */ protected RenderedPaletteModel getRenderedPaletteModel(final String modelId) { return (RenderedPaletteModel) registry.get(modelId); } /** * @param modelId * @return */ protected RenderedPaletteParamModel getRenderedPaletteParamModel(final String modelId) { return (RenderedPaletteParamModel) registry.get(modelId); } /** * @param modelId * @return */ protected SingleSelectionModel getSingleSelectionModel(final String modelId) { return (SingleSelectionModel) registry.get(modelId); } /** * */ protected void addRenderedPaletteActionListener() { final JComboBox comboBox = getComboBox(RenderedPalettePanel.COMBOBOX); if (comboBox != null) { comboBox.addActionListener(actionListener); } } /** * */ protected void addRenderedPaletteListener() { final RenderedPaletteModel model = getRenderedPaletteModel(RenderedPalettePanel.PALETTE_MODEL); if (model != null) { model.addPaletteChangeListener(paletteListener); } } /** * */ protected void addRenderedPaletteParamListener() { final RenderedPaletteParamModel model = getRenderedPaletteParamModel(RenderedPalettePanel.PALETTE_PARAM_MODEL); if (model != null) { model.addPaletteChangeListener(paletteParamListener); } } /** * */ protected void addSelectionListener() { final SingleSelectionModel model = getSingleSelectionModel(RenderedPalettePanel.PARAM_SELECTION_MODEL); if (model != null) { model.addChangeListener(selectionListener); } } /** * */ protected void removeRenderedPaletteActionListener() { final JComboBox comboBox = getComboBox(RenderedPalettePanel.COMBOBOX); if (comboBox != null) { comboBox.removeActionListener(actionListener); } } /** * */ protected void removeRenderedPaletteListener() { final RenderedPaletteModel model = getRenderedPaletteModel(RenderedPalettePanel.PALETTE_MODEL); if (model != null) { model.removePaletteChangeListener(paletteListener); } } /** * */ protected void removeRenderedPaletteParamListener() { final RenderedPaletteParamModel model = getRenderedPaletteParamModel(RenderedPalettePanel.PALETTE_PARAM_MODEL); if (model != null) { model.removePaletteChangeListener(paletteParamListener); } } /** * */ protected void removeSelectionListener() { final SingleSelectionModel model = getSingleSelectionModel(RenderedPalettePanel.PARAM_SELECTION_MODEL); if (model != null) { model.removeChangeListener(selectionListener); } } /** * @return */ protected RenderedPaletteModel getModel() { return model; } private class ComboboxListener implements ActionListener { /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(final ActionEvent e) { final RenderedPaletteParamModel paramModel = getRenderedPaletteParamModel(RenderedPalettePanel.PALETTE_PARAM_MODEL); final SingleSelectionModel selectionModel = getSingleSelectionModel(RenderedPalettePanel.PARAM_SELECTION_MODEL); final JComboBox comboBox = (JComboBox) e.getSource(); if (comboBox.getModel().getSelectedItem() != null) { removeRenderedPaletteParamListener(); removeSelectionListener(); selectionModel.setSelectedIndex(comboBox.getSelectedIndex()); paramModel.setPaletteParam((RenderedPaletteParam) comboBox.getModel().getSelectedItem(), false); addRenderedPaletteParamListener(); addSelectionListener(); } } } private class RenderedPaletteParamListener implements PaletteChangeListener { /** * @see net.sf.jame.platform.ui.swing.color.PaletteChangeListener#paletteChanged(net.sf.jame.platform.ui.swing.color.PaletteChangeEvent) */ public void paletteChanged(final PaletteChangeEvent e) { final JComboBox comboBox = getComboBox(RenderedPalettePanel.COMBOBOX); final RenderedPaletteParamModel paramModel = (RenderedPaletteParamModel) e.getSource(); final RenderedPaletteParam selectedParam = (RenderedPaletteParam) comboBox.getSelectedItem(); final RenderedPaletteParam[] newParams = new RenderedPaletteParam[model.getRenderedPalette().getParamCount()]; for (int i = 0; i < newParams.length; i++) { if (model.getRenderedPalette().getParam(i) != selectedParam) { newParams[i] = model.getRenderedPalette().getParam(i); } else { newParams[i] = paramModel.getPaletteParam(); } } final RenderedPalette palette = new RenderedPalette(newParams); removeRenderedPaletteActionListener(); model.setRenderedPalette(palette, false); addRenderedPaletteActionListener(); } } private class RenderedPaletteListener implements PaletteChangeListener { /** * @see net.sf.jame.platform.ui.swing.color.PaletteChangeListener#paletteChanged(net.sf.jame.platform.ui.swing.color.PaletteChangeEvent) */ public void paletteChanged(final PaletteChangeEvent e) { final JComboBox comboBox = getComboBox(RenderedPalettePanel.COMBOBOX); int index = comboBox.getSelectedIndex(); if (index >= model.getRenderedPalette().getParamCount()) { index = 0; } ((RenderedPaletteComboBoxModel) comboBox.getModel()).updateModel(index); } } private class RenderedPaletteSelectionListener implements ChangeListener { /** * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent) */ public void stateChanged(final ChangeEvent e) { final JComboBox comboBox = getComboBox(RenderedPalettePanel.COMBOBOX); final SingleSelectionModel selectionModel = (SingleSelectionModel) e.getSource(); if (selectionModel.getSelectedIndex() != -1) { comboBox.setSelectedIndex(selectionModel.getSelectedIndex()); } } } private class PaletteListener implements PaletteChangeListener { private final int x; private final int y; /** * @param x * @param y */ public PaletteListener(final int x, final int y) { this.x = x; this.y = y; } /** * @see net.sf.jame.platform.ui.swing.color.PaletteChangeListener#paletteChanged(net.sf.jame.platform.ui.swing.color.PaletteChangeEvent) */ public void paletteChanged(final PaletteChangeEvent e) { final RenderedPaletteModel model = (RenderedPaletteModel) e.getSource(); RenderedPalettePanel.palettes[x][y] = model.getRenderedPalette(); } } private class CreateAction extends AbstractAction { private static final long serialVersionUID = 1L; private final RenderedPaletteModel model; /** * @param model */ public CreateAction(final RenderedPaletteModel model) { super(MandelbrotSwingResources.getInstance().getString("params.create.button.label"), null); this.model = model; } /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(final ActionEvent e) { final JComboBox comboBox = getComboBox(RenderedPalettePanel.COMBOBOX); if (comboBox != null) { final RenderedPaletteParam[] newParams = new RenderedPaletteParam[model.getRenderedPalette().getParamCount() + 1]; for (int i = 0; i < (newParams.length - 1); i++) { final ExtensionReference[] formulas = new ExtensionReference[4]; formulas[0] = model.getRenderedPalette().getParam(i).getFormula(0); formulas[1] = model.getRenderedPalette().getParam(i).getFormula(1); formulas[2] = model.getRenderedPalette().getParam(i).getFormula(2); formulas[3] = model.getRenderedPalette().getParam(i).getFormula(3); final int[] colors = new int[2]; colors[0] = model.getRenderedPalette().getParam(i).getColor(0); colors[1] = model.getRenderedPalette().getParam(i).getColor(1); newParams[i] = new RenderedPaletteParam(formulas, colors, model.getRenderedPalette().getParam(i).getSize() * 0.75); } newParams[newParams.length - 1] = new DefaultRenderedPaletteParam(25); removeRenderedPaletteActionListener(); final RenderedPalette palette = new RenderedPalette(newParams); model.setRenderedPalette(palette, false); addRenderedPaletteActionListener(); comboBox.setSelectedIndex(newParams.length - 1); } } } private class DeleteAction extends AbstractAction { private static final long serialVersionUID = 1L; private final RenderedPaletteModel model; /** * @param model */ public DeleteAction(final RenderedPaletteModel model) { super(MandelbrotSwingResources.getInstance().getString("params.delete.button.label"), null); this.model = model; } /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(final ActionEvent e) { if (model.getRenderedPalette().getParamCount() == 1) { return; } final JComboBox comboBox = getComboBox(RenderedPalettePanel.COMBOBOX); if (comboBox != null) { final RenderedPaletteParam[] newParams = new RenderedPaletteParam[model.getRenderedPalette().getParamCount() - 1]; final double size = ((RenderedPaletteParam) comboBox.getSelectedItem()).getSize() / newParams.length; final int selectedIndex = comboBox.getSelectedIndex(); for (int i = 0; i < selectedIndex; i++) { final ExtensionReference[] formulas = new ExtensionReference[4]; formulas[0] = model.getRenderedPalette().getParam(i).getFormula(0); formulas[1] = model.getRenderedPalette().getParam(i).getFormula(1); formulas[2] = model.getRenderedPalette().getParam(i).getFormula(2); formulas[3] = model.getRenderedPalette().getParam(i).getFormula(3); final int[] colors = new int[2]; colors[0] = model.getRenderedPalette().getParam(i).getColor(0); colors[1] = model.getRenderedPalette().getParam(i).getColor(1); newParams[i] = new RenderedPaletteParam(formulas, colors, model.getRenderedPalette().getParam(i).getSize() + size); } for (int i = selectedIndex + 1; i < (newParams.length + 1); i++) { final ExtensionReference[] formulas = new ExtensionReference[4]; formulas[0] = model.getRenderedPalette().getParam(i).getFormula(0); formulas[1] = model.getRenderedPalette().getParam(i).getFormula(1); formulas[2] = model.getRenderedPalette().getParam(i).getFormula(2); formulas[3] = model.getRenderedPalette().getParam(i).getFormula(3); final int[] colors = new int[2]; colors[0] = model.getRenderedPalette().getParam(i).getColor(0); colors[1] = model.getRenderedPalette().getParam(i).getColor(1); newParams[i - 1] = new RenderedPaletteParam(formulas, colors, model.getRenderedPalette().getParam(i).getSize() + size); } if (comboBox.getSelectedIndex() > 0) { comboBox.setSelectedIndex(comboBox.getSelectedIndex() - 1); } else { comboBox.setSelectedIndex(0); } removeRenderedPaletteActionListener(); final RenderedPalette palette = new RenderedPalette(newParams); model.setRenderedPalette(palette, false); addRenderedPaletteActionListener(); } } } private class InsertAction extends AbstractAction { private static final long serialVersionUID = 1L; private final RenderedPaletteModel model; /** * @param model */ public InsertAction(final RenderedPaletteModel model) { super(MandelbrotSwingResources.getInstance().getString("params.insert.button.label"), null); this.model = model; } /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(final ActionEvent e) { final JComboBox comboBox = getComboBox(RenderedPalettePanel.COMBOBOX); if (comboBox != null) { final RenderedPaletteParam[] newParams = new RenderedPaletteParam[model.getRenderedPalette().getParamCount() + 1]; final int selectedIndex = comboBox.getSelectedIndex(); for (int i = 0; i < selectedIndex; i++) { final ExtensionReference[] formulas = new ExtensionReference[4]; formulas[0] = model.getRenderedPalette().getParam(i).getFormula(0); formulas[1] = model.getRenderedPalette().getParam(i).getFormula(1); formulas[2] = model.getRenderedPalette().getParam(i).getFormula(2); formulas[3] = model.getRenderedPalette().getParam(i).getFormula(3); final int[] colors = new int[2]; colors[0] = model.getRenderedPalette().getParam(i).getColor(0); colors[1] = model.getRenderedPalette().getParam(i).getColor(1); newParams[i] = new RenderedPaletteParam(formulas, colors, model.getRenderedPalette().getParam(i).getSize() * 0.75); } newParams[selectedIndex] = new DefaultRenderedPaletteParam(25); for (int i = selectedIndex; i < (newParams.length - 1); i++) { final ExtensionReference[] formulas = new ExtensionReference[4]; formulas[0] = model.getRenderedPalette().getParam(i).getFormula(0); formulas[1] = model.getRenderedPalette().getParam(i).getFormula(1); formulas[2] = model.getRenderedPalette().getParam(i).getFormula(2); formulas[3] = model.getRenderedPalette().getParam(i).getFormula(3); final int[] colors = new int[2]; colors[0] = model.getRenderedPalette().getParam(i).getColor(0); colors[1] = model.getRenderedPalette().getParam(i).getColor(1); newParams[i + 1] = new RenderedPaletteParam(formulas, colors, model.getRenderedPalette().getParam(i).getSize() * 0.75); } removeRenderedPaletteActionListener(); final RenderedPalette palette = new RenderedPalette(newParams); model.setRenderedPalette(palette, false); addRenderedPaletteActionListener(); comboBox.setSelectedIndex(selectedIndex); } } } private class ReverseAction extends AbstractAction { private static final long serialVersionUID = 1L; private final RenderedPaletteModel model; /** * @param model */ public ReverseAction(final RenderedPaletteModel model) { super(MandelbrotSwingResources.getInstance().getString("params.reverse.button.label"), null); this.model = model; } /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(final ActionEvent e) { final JComboBox comboBox = getComboBox(RenderedPalettePanel.COMBOBOX); if (comboBox != null) { final RenderedPaletteParam[] newParams = new RenderedPaletteParam[model.getRenderedPalette().getParamCount()]; final int selectedIndex = comboBox.getSelectedIndex(); for (int i = 0; i < newParams.length; i++) { if (i == selectedIndex) { final ExtensionReference[] formulas = new ExtensionReference[4]; formulas[0] = model.getRenderedPalette().getParam(i).getFormula(0); formulas[1] = model.getRenderedPalette().getParam(i).getFormula(1); formulas[2] = model.getRenderedPalette().getParam(i).getFormula(2); formulas[3] = model.getRenderedPalette().getParam(i).getFormula(3); final int[] colors = new int[2]; colors[0] = model.getRenderedPalette().getParam(i).getColor(1); colors[1] = model.getRenderedPalette().getParam(i).getColor(0); newParams[i] = new RenderedPaletteParam(formulas, colors, model.getRenderedPalette().getParam(i).getSize()); } else { newParams[i] = model.getRenderedPalette().getParam(i); } } removeRenderedPaletteActionListener(); final RenderedPalette palette = new RenderedPalette(newParams); model.setRenderedPalette(palette, false); addRenderedPaletteActionListener(); } } } }