package org.openstreetmap.josm.plugins.rasterfilters.gui;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.util.HashSet;
import java.util.Set;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import org.openstreetmap.josm.gui.layer.ImageryLayer;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.plugins.rasterfilters.model.FiltersManager;
import org.openstreetmap.josm.plugins.rasterfilters.preferences.FiltersDownloader;
/**
* This filters is responsible for creating filter's dialog where user can
* choose and add new filter at this dialog.
*
* @author Nipel-Crumple
*/
public class FiltersDialog {
public JFrame frame;
private JComboBox<String> filterChooser;
private JPanel pane;
private JButton addButton;
private DefaultComboBoxModel<String> listModel = new DefaultComboBoxModel<>();
private Set<String> showedFiltersTitles = new HashSet<>();
private JPanel filterContainer;
private Layer layer;
private FiltersManager filtersManager;
private JScrollPane filterContainerScroll;
public FiltersDialog(ImageryLayer layer) {
this.layer = layer;
this.filtersManager = new FiltersManager(this);
layer.addImageProcessor(filtersManager);
}
public JPanel createFilterContainer() {
if (filterContainer == null) {
filterContainer = new JPanel();
filterContainer.setLayout(new BoxLayout(getFilterContainer(),
BoxLayout.Y_AXIS));
filterContainer.setBackground(Color.white);
filterContainerScroll = new JScrollPane(getFilterContainer(),
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
pane.add(filterContainerScroll);
}
return filterContainer;
}
public void deleteFilterContainer() {
Component parent = filterContainerScroll.getParent();
filterContainerScroll.removeAll();
((JPanel) parent).remove(filterContainerScroll);
filterContainer = null;
parent.revalidate();
parent.repaint();
}
public JFrame createAndShowGui() throws MalformedURLException {
listModel.removeAllElements();
Set<String> filterTitles = FiltersDownloader.filterTitles;
for (String temp : filterTitles) {
if (!showedFiltersTitles.contains(temp)) {
listModel.addElement(temp);
}
}
if (frame != null) {
filterChooser.setModel(listModel);
filterChooser.revalidate();
frame.setVisible(true);
} else {
frame = new JFrame();
String title = "Filters | " + layer.getName();
frame.setTitle(title);
frame.setMinimumSize(new Dimension(350, 420));
frame.setPreferredSize(new Dimension(350, 420));
pane = new JPanel();
pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
pane.setBorder(new EmptyBorder(10, 5, 10, 5));
pane.setPreferredSize(new Dimension(300, 400));
pane.setBackground(Color.white);
JPanel topPanel = new JPanel();
topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
topPanel.setMaximumSize(new Dimension(300, 50));
topPanel.setMinimumSize(new Dimension(300, 50));
topPanel.setBackground(Color.white);
JPanel labelPanel = new JPanel();
labelPanel.setLayout(new BoxLayout(labelPanel, BoxLayout.X_AXIS));
labelPanel.setMaximumSize(new Dimension(300, 20));
labelPanel.setBackground(Color.white);
JLabel label = new JLabel("Add filter");
labelPanel.add(label);
// pane.add(labelPanel);
// TODO why after add clicked the top panel is resized???
// panel that contains the checkBox and add button
JPanel chooseFilterPanel = new JPanel();
chooseFilterPanel.setMinimumSize(new Dimension(300, 30));
chooseFilterPanel.setLayout(new BoxLayout(chooseFilterPanel,
BoxLayout.X_AXIS));
chooseFilterPanel.setBackground(Color.white);
filterChooser = new JComboBox<>(getListModel());
filterChooser.setMaximumSize(new Dimension(200, 30));
chooseFilterPanel.add(filterChooser);
// empty space area between select and add button
chooseFilterPanel.add(Box.createRigidArea(new Dimension(10, 0)));
addButton = new JButton();
addButton.setText("add");
addButton.setAlignmentX(Component.CENTER_ALIGNMENT);
addButton.setMaximumSize(new Dimension(90, 30));
addButton.addActionListener(new AddFilterToPanelListener());
//
// // check if there is no meta information
// Main.debug("Empty " +
// String.valueOf(FiltersDownloader.filterTitles.isEmpty()));
// if (FiltersDownloader.filterTitles.isEmpty() ||
// listModel.getSize() == 0) {
// addButton.setEnabled(false);
// filterChooser.setEnabled(false);
// } else {
// addButton.setEnabled(true);
// filterChooser.setEnabled(true);
// }
chooseFilterPanel.add(getAddButton());
topPanel.add(labelPanel);
topPanel.add(chooseFilterPanel);
pane.add(topPanel);
// pane.add(chooseFilterPanel);
// pane.add(Box.createRigidArea(new Dimension(0, 20)));
frame.setContentPane(pane);
frame.pack();
frame.setVisible(true);
}
if (FiltersDownloader.filterTitles.isEmpty() || listModel.getSize() == 0) {
addButton.setEnabled(false);
filterChooser.setEnabled(false);
} else {
addButton.setEnabled(true);
filterChooser.setEnabled(true);
}
return frame;
}
public FiltersManager createFilterManager() {
return new FiltersManager(this);
}
public void closeFrame() {
if (frame != null) {
if (frame.isShowing()) {
frame.dispose();
}
}
}
public FiltersManager getFiltersManager() {
return filtersManager;
}
class AddFilterToPanelListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String title = (String) listModel.getSelectedItem();
JPanel panel = null;
panel = filtersManager.createPanelByTitle(title);
if (panel != null) {
filterContainer = createFilterContainer();
filterContainer.add(panel);
}
listModel.removeElement(title);
showedFiltersTitles.add(title);
if (listModel.getSize() == 0) {
filterChooser.setEnabled(false);
addButton.setEnabled(false);
}
}
}
public Set<String> getShowedFiltersTitles() {
return showedFiltersTitles;
}
public Layer getLayer() {
return layer;
}
public JPanel getFilterContainer() {
return filterContainer;
}
public DefaultComboBoxModel<String> getListModel() {
return listModel;
}
public JComboBox<String> getFilterChooser() {
return filterChooser;
}
public JButton getAddButton() {
return addButton;
}
}