/* * Copyright (c) 2010, skobbler GmbH * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Created on Feb 10, 2011 by Bea * Modified on $DateTime$ by $Author$ */ package org.openstreetmap.josm.plugins.mapdust.gui.component.dialog; import java.awt.Color; import java.awt.Font; import java.awt.Image; import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JToggleButton; import javax.swing.WindowConstants; import org.openstreetmap.josm.plugins.mapdust.MapdustPlugin; import org.openstreetmap.josm.plugins.mapdust.gui.action.adapter.WindowClose; import org.openstreetmap.josm.plugins.mapdust.gui.action.execute.ExecuteCancel; import org.openstreetmap.josm.plugins.mapdust.gui.action.execute.ExecuteFilterBug; import org.openstreetmap.josm.plugins.mapdust.gui.component.panel.MapdustButtonPanel; import org.openstreetmap.josm.plugins.mapdust.gui.component.slider.RelevanceSlider; import org.openstreetmap.josm.plugins.mapdust.gui.component.util.ComponentUtil; import org.openstreetmap.josm.plugins.mapdust.gui.component.util.FilterCheckBox; import org.openstreetmap.josm.plugins.mapdust.gui.value.MapdustRelevanceValue; import org.openstreetmap.josm.plugins.mapdust.service.value.MapdustBugFilter; import org.openstreetmap.josm.plugins.mapdust.service.value.MapdustRelevance; import org.openstreetmap.josm.plugins.mapdust.service.value.Status; import org.openstreetmap.josm.plugins.mapdust.service.value.BugType; import org.openstreetmap.josm.tools.ImageProvider; /** * This class it is used for creating a dialog window for the MapDust bug * filtering feature. * * @author Bea */ public class FilterBugDialog extends AbstractDialog { org.openstreetmap.josm.plugins.mapdust.service.value.BugType ttt = org.openstreetmap.josm.plugins.mapdust.service.value.BugType.WRONG_TURN; /** The serial version UID */ private static final long serialVersionUID = -3333642616656969760L; /** The <code>JLabel</code> for the status filter */ private JLabel lblStatus; /** The array of <code>FilterCheckBox</cod> containing the status filters */ private FilterCheckBox[] filterStatuses; /** The <ode>JLabel</code> for the type filter */ private JLabel lblType; /** The array of <code>FilterCheckBox</cod> containing the type filters */ private FilterCheckBox[] filterTypes; /** The <code>JLabel</code> for the description filter */ private JLabel lblDescription; /** The <code>FilterCheckBox</code> containing the description filter */ private FilterCheckBox filterDescr; /** The <code>JLabel</code> for the relevance filter */ private JLabel lblRelevance; /** The <code>RelevanceSlider</code> representing the relevance values */ private RelevanceSlider sliderRelevance; /** The apply button */ private JButton btnApply; /** The cancel button */ private JButton btnCancel; /** Builds a <code>FilterBugDialog</code> object */ public FilterBugDialog() {} /** * Builds a <code>FilterBugDialog</code> object with the given parameters. * * @param title The title of the dialog * @param iconName The name of the icon * @param firedButton The button which fired this action * @param mapdustPlugin The <code>MapdustPlugin</code> object */ public FilterBugDialog(String title, String iconName, JToggleButton firedButton, MapdustPlugin mapdustPlugin) { if (firedButton != null) { setFiredButton(firedButton); } setTitle(title); setModal(true); Image image = ImageProvider.get(iconName).getImage(); setIconImage(image); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); getContentPane().setFont(new Font("Times New Roman", Font.BOLD, 14)); setBackground(Color.white); setResizable(false); setForeground(Color.black); setLayout(null); addComponents(mapdustPlugin); MapdustButtonPanel btnPanel = mapdustPlugin.getMapdustGUI().getPanel().getBtnPanel(); addWindowListener(new WindowClose(this, btnPanel)); } @Override public void addComponents(MapdustPlugin mapdustPlugin) { Font font = new Font("Times New Roman", Font.BOLD, 14); MapdustBugFilter prevFilter = mapdustPlugin.getFilter(); /* status filter */ if (lblStatus == null) { Rectangle bounds = new Rectangle(10, 10, 95, 25); lblStatus = ComponentUtil.createJLabel("Status", font, bounds, null); } if (filterStatuses == null) { createStatusFilters(prevFilter); } /* type filters */ if (filterTypes == null) { createTypeFilters(prevFilter); } if (lblType == null) { Rectangle bounds = new Rectangle(10, 90, 95, 25); lblType = ComponentUtil.createJLabel("Type", font, bounds, null); } /* description filter */ if (lblDescription == null) { Rectangle bounds = new Rectangle(10, 230, 95, 25); lblDescription = ComponentUtil.createJLabel("Description", font, bounds, null); } if (filterDescr == null) { Rectangle chbBounds = new Rectangle(110, 230, 20, 25); Rectangle lblBounds = new Rectangle(130, 230, 300, 25); String text = "Hide bugs with default description"; String iconName = "dialogs/default_description.png"; filterDescr = new FilterCheckBox("descr", chbBounds, iconName, text, lblBounds); if (prevFilter != null && prevFilter.getDescr() != null && prevFilter.getDescr()) { filterDescr.getChbFilter().setSelected(true); } } /* relevance filter */ if (lblRelevance == null) { Rectangle bounds = new Rectangle(10, 265, 95, 25); lblRelevance = ComponentUtil.createJLabel("Relevance", font, bounds, null); } if (sliderRelevance == null) { Rectangle bounds = new Rectangle(110, 265, 300, 50); sliderRelevance = new RelevanceSlider(); sliderRelevance.setBounds(bounds); if (prevFilter != null) { MapdustRelevance min = prevFilter.getMinRelevance(); MapdustRelevance max = prevFilter.getMaxRelevance(); if (min != null) { Integer value = MapdustRelevanceValue.getSliderValue(min); if (value == null) { value = MapdustRelevanceValue.LOW.getSliderValue(); } sliderRelevance.setLowerValue(value); } if (max != null) { Integer value = MapdustRelevanceValue.getSliderValue(max); if (value == null) { value = MapdustRelevanceValue.HIGH.getSliderValue(); } sliderRelevance.setUpperValue(value); } if (max != null && max.equals(min) && max.equals(MapdustRelevance.LOW)) { sliderRelevance.getUI().setIsUpperSelected(true); } } } /* creates the cancel button */ if (btnCancel == null) { Rectangle bounds = new Rectangle(360, 330, 90, 25); ExecuteCancel cancelAction = new ExecuteCancel(this, mapdustPlugin.getMapdustGUI()); btnCancel = ComponentUtil.createJButton("Cancel", bounds, cancelAction); } /* creates the OK button */ if (btnApply == null) { Rectangle bounds = new Rectangle(260, 330, 90, 25); ExecuteFilterBug applyAction = new ExecuteFilterBug(this, mapdustPlugin.getMapdustGUI()); applyAction.addObserver(mapdustPlugin); btnApply = ComponentUtil.createJButton("Apply", bounds, applyAction); } /* add components */ add(lblStatus); add(filterStatuses); add(lblType); add(filterTypes); add(lblDescription); add(filterDescr); add(lblRelevance); add(sliderRelevance); add(btnCancel); add(btnApply); setSize(460, 360); } /** * Creates the MapDust bug status filters. If there was any previous status * filter selected then this status filter will be selected by default. * * @param prevFilter The <code>MapdustBugFilter</code> object */ private void createStatusFilters(MapdustBugFilter prevFilter) { filterStatuses = new FilterCheckBox[3]; /* open status */ filterStatuses[0] = new FilterCheckBox(Status.OPEN.getKey(), new Rectangle(110, 10, 20, 25), "dialogs/open_bug.png", Status.OPEN.getValue(), new Rectangle(130, 10, 150, 25)); /* closed status */ filterStatuses[1] = new FilterCheckBox(Status.INVALID.getKey(), new Rectangle(270, 10, 20, 25), "dialogs/invalid_bug.png", Status.INVALID.getValue(), new Rectangle(290, 10, 180, 25)); /* invalid status */ filterStatuses[2] = new FilterCheckBox(Status.FIXED.getKey(), new Rectangle(110, 45, 20, 25), "dialogs/fixed_bug.png", Status.FIXED.getValue(), new Rectangle(130, 45, 150, 25)); if (prevFilter != null && prevFilter.getStatuses() != null) { for (FilterCheckBox filter : filterStatuses) { if (prevFilter.getStatuses().contains(filter.getId())) { filter.getChbFilter().setSelected(true); } } } } /** * Creates the MapDust bug type filters. If there was any previous type * filter selected, then this type filter will be selected by default. * * @param prevFilter The <code>MapdustBugFilter</code> object */ private void createTypeFilters(MapdustBugFilter prevFilter) { filterTypes = new FilterCheckBox[8]; /* wrong_turn type */ filterTypes[0] = new FilterCheckBox(BugType.WRONG_TURN.getKey(), new Rectangle(110, 90, 20, 25), "dialogs/wrong_turn.png", BugType.WRONG_TURN.getValue(), new Rectangle(130, 90, 120, 25)); /* bad_routing type */ filterTypes[1] = new FilterCheckBox(BugType.WRONG_ROUNDABOUT.getKey(), new Rectangle(270, 90, 20, 25), "dialogs/wrong_roundabout.png", BugType.WRONG_ROUNDABOUT.getValue(), new Rectangle(290, 90, 180, 25)); /* oneway_road type */ filterTypes[2] = new FilterCheckBox(BugType.MISSING_STREET.getKey(), new Rectangle(110, 125, 20, 25), "dialogs/missing_street.png", BugType.MISSING_STREET.getValue(), new Rectangle(130, 125, 150, 25)); /* blocked_street type */ filterTypes[3] = new FilterCheckBox(BugType.BLOCKED_STREET.getKey(), new Rectangle(270, 125, 20, 25), "dialogs/blocked_street.png", BugType.BLOCKED_STREET.getValue(), new Rectangle(290, 125, 180, 25)); /* missing_street type */ filterTypes[4] = new FilterCheckBox(BugType.BAD_ROUTING.getKey(), new Rectangle(110, 160, 20, 25), "dialogs/bad_routing.png", BugType.BAD_ROUTING.getValue(), new Rectangle(130, 160, 150, 25)); /* wrong_roundabout type */ filterTypes[5] = new FilterCheckBox(BugType.MISSING_SPEEDLIMIT.getKey(), new Rectangle(270, 160, 20, 25), "dialogs/missing_speedlimit.png", BugType.MISSING_SPEEDLIMIT.getValue(), new Rectangle(290, 160, 180, 25)); /* missing_speedlimit type */ filterTypes[6] = new FilterCheckBox(BugType.OTHER.getKey(), new Rectangle(110, 195, 20, 25), "dialogs/other.png", BugType.OTHER.getValue(), new Rectangle(130, 195, 150, 25)); /* other type */ filterTypes[7] = new FilterCheckBox(BugType.ONEWAY_ROAD.getKey(), new Rectangle(270, 195, 20, 25), "dialogs/oneway_road.png", BugType.ONEWAY_ROAD.getValue(), new Rectangle(290, 195, 180, 25)); if (prevFilter != null && prevFilter.getTypes() != null) { for (FilterCheckBox filter : filterTypes) { if (prevFilter.getTypes().contains(filter.getId())) { filter.getChbFilter().setSelected(true); } } } } /** * Returns the list of selected status filter values. * * @return a list of <code>Integer</code> values, representing the selected * status filter IDs */ public List<Integer> getCheckedStatuses() { List<Integer> statusList = new ArrayList<>(); for (FilterCheckBox filter : filterStatuses) { if (filter.getChbFilter().isSelected()) { statusList.add((Integer) filter.getId()); } } return statusList; } /** * Returns the list of selected type filter values. * * @return a list of <code>String</code> values, representing the selected * type filter values */ public List<String> getCheckedTypes() { List<String> typeList = new ArrayList<>(); for (FilterCheckBox filter : filterTypes) { if (filter.getChbFilter().isSelected()) { typeList.add((String) filter.getId()); } } return typeList; } /** * Verifies if the description filter is selected or not. * * @return true if the description filter is selected false if the * description filter is not selected */ public boolean isDescrFilterChecked() { if (filterDescr.getChbFilter().isSelected()) { return true; } return false; } /** * Returns the selected minimum relevance value from the relevance slider. * * @return A <code>MapdustRelevance</code> object */ public MapdustRelevance getSelectedMinRelevance() { int value = sliderRelevance.getLowerValue(); MapdustRelevance minRelevance = MapdustRelevance.getMapdustRelevance(value); return minRelevance; } /** * Returns the selected maximum relevance value from the relevance slider. * * @return A <code>MapdustRelevance</code> object */ public MapdustRelevance getSelectedMaxRelevance() { int value = sliderRelevance.getUpperValue(); MapdustRelevance maxRelevance = MapdustRelevance.getMapdustRelevance(value); return maxRelevance; } /** * Add the given filter to the current dialog window. * * @param filter The <code>FilterCheckBox</code> object */ private void add(FilterCheckBox filter) { add(filter.getChbFilter()); add(filter.getLblFilter()); } /** * Add the given array of filters to the current dialog window. * * @param filters The array of <code>FilterCheckBox</code> objects */ private void add(FilterCheckBox[] filters) { for (FilterCheckBox filter : filters) { add(filter.getChbFilter()); add(filter.getLblFilter()); } } }