/* * Indoorhelper is a JOSM plug-in to support users when creating their own indoor maps. * Copyright (C) 2016 Erik Gruschka * * This program 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. * * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ package views; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.TextField; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ItemListener; import java.util.List; import java.util.ListIterator; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.JToggleButton; import javax.swing.border.EmptyBorder; import org.openstreetmap.josm.gui.dialogs.ToggleDialog; import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField; import org.openstreetmap.josm.gui.widgets.JosmComboBox; import model.IndoorLevel; import model.TagCatalog; import model.TagCatalog.IndoorObject; /** * * This is the main toolbox of the indoorhelper plug-in. * * @author egru * */ @SuppressWarnings("serial") public class ToolBoxView extends ToggleDialog { private JPanel dialogPane; private JPanel contentPanel; private JToggleButton powerButton; private JLabel levelLabel; private JosmComboBox<String> levelBox; private JLabel levelTagLabel; private DisableShortcutsOnFocusGainedTextField levelTagField; private JLabel objectLabel; private JosmComboBox<TagCatalog.IndoorObject> objectBox; private JLabel nameLabel; private DisableShortcutsOnFocusGainedTextField nameField; private JLabel refLabel; private DisableShortcutsOnFocusGainedTextField refField; private JPanel buttonBar; private JButton applyButton; private JSeparator separator1; private JSeparator separator2; private PresetButton preset1; private PresetButton preset2; private PresetButton preset3; private PresetButton preset4; public ToolBoxView() { super(tr("Indoor Mapping Helper"), "indoorhelper", tr("Toolbox for indoor mapping assistance"), null, 300, true); initComponents(); } /** * Creates the layout of the plug-in. */ private void initComponents() { dialogPane = new JPanel(); contentPanel = new JPanel(); powerButton = new JToggleButton(); levelLabel = new JLabel(); levelBox = new JosmComboBox<String>(); levelTagLabel = new JLabel(); levelTagField = new DisableShortcutsOnFocusGainedTextField(); objectLabel = new JLabel(); objectBox = new JosmComboBox<>(TagCatalog.IndoorObject.values()); nameLabel = new JLabel(); nameField = new DisableShortcutsOnFocusGainedTextField(); refLabel = new JLabel(); refField = new DisableShortcutsOnFocusGainedTextField(); buttonBar = new JPanel(); applyButton = new JButton(); separator1 = new JSeparator(); separator2 = new JSeparator(); preset1 = new PresetButton(IndoorObject.ROOM); preset2 = new PresetButton(IndoorObject.SHELL); preset3 = new PresetButton(IndoorObject.CONCRETE_WALL); preset4 = new PresetButton(IndoorObject.GLASS_WALL); //======== this ======== //Container contentPane = this.get; //contentPane.setLayout(new BorderLayout()); //======== dialogPane ======== { dialogPane.setBorder(new EmptyBorder(12, 12, 12, 12)); dialogPane.setLayout(new BorderLayout()); //======== contentPanel ======== { contentPanel.setLayout(new GridBagLayout()); ((GridBagLayout) contentPanel.getLayout()).columnWidths = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; ((GridBagLayout) contentPanel.getLayout()).rowHeights = new int[] {0, 0, 0, 0, 0, 0, 0, 0}; ((GridBagLayout) contentPanel.getLayout()).columnWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0E-4}; ((GridBagLayout) contentPanel.getLayout()).rowWeights = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0E-4}; //---- powerButton ---- powerButton.setText(tr("POWER")); powerButton.setToolTipText(tr("Activates the plug-in")); contentPanel.add(powerButton, new GridBagConstraints(8, 0, 4, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); contentPanel.add(separator1, new GridBagConstraints(1, 1, 12, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- levelLabel ---- levelLabel.setText(tr("Working Level")); contentPanel.add(levelLabel, new GridBagConstraints(1, 2, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- levelBox ---- levelBox.setEnabled(false); levelBox.setEditable(false); levelBox.setToolTipText(tr("Selects the working level.")); contentPanel.add(levelBox, new GridBagConstraints(3, 2, 3, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- levelTagLabel ---- levelTagLabel.setText(tr("Level Name")); contentPanel.add(levelTagLabel, new GridBagConstraints(7, 2, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- levelTagField ---- levelTagField.setEnabled(false); levelTagField.setColumns(6); levelTagField.setToolTipText(tr("Optional name-tag for a level.")); contentPanel.add(levelTagField, new GridBagConstraints(8, 2, 5, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); contentPanel.add(separator2, new GridBagConstraints(1, 3, 12, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- objectLabel ---- objectLabel.setText(tr("Object")); contentPanel.add(objectLabel, new GridBagConstraints(0, 4, 3, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- objectBox ---- objectBox.setEnabled(false); objectBox.setPrototypeDisplayValue(IndoorObject.CONCRETE_WALL); objectBox.setToolTipText(tr("The object preset you want to tag.")); contentPanel.add(objectBox, new GridBagConstraints(3, 4, 3, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- nameLabel ---- nameLabel.setText(tr("Name")); contentPanel.add(nameLabel, new GridBagConstraints(0, 5, 3, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- nameField ---- nameField.setEnabled(false); nameField.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) {} @Override public void focusGained(FocusEvent e) { nameField.selectAll(); } }); nameField.setToolTipText(tr("Sets the name tag when the room-object is selected.")); contentPanel.add(nameField, new GridBagConstraints(3, 5, 3, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- refLabel ---- refLabel.setText(tr("Reference")); contentPanel.add(refLabel, new GridBagConstraints(0, 6, 3, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 5), 0, 0)); //---- refField ---- refField.setEnabled(false); refField.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) {} @Override public void focusGained(FocusEvent e) { refField.selectAll(); } }); refField.setToolTipText(tr("Sets the ref tag when the room-object is selected.")); contentPanel.add(refField, new GridBagConstraints(3, 6, 3, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 5), 0, 0)); //---- preset1 ---- preset1.setEnabled(false); contentPanel.add(preset1, new GridBagConstraints(16, 2, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); contentPanel.add(separator2, new GridBagConstraints(1, 3, 13, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- preset2 ---- preset2.setEnabled(false); contentPanel.add(preset2, new GridBagConstraints(16, 3, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- preset3 ---- preset3.setEnabled(false); contentPanel.add(preset3, new GridBagConstraints(16, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); //---- preset4 ---- preset4.setEnabled(false); contentPanel.add(preset4, new GridBagConstraints(16, 5, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0)); } dialogPane.add(contentPanel, BorderLayout.CENTER); //======== buttonBar ======== { buttonBar.setBorder(new EmptyBorder(12, 0, 0, 0)); buttonBar.setLayout(new GridBagLayout()); ((GridBagLayout) buttonBar.getLayout()).columnWidths = new int[] {0, 80}; ((GridBagLayout) buttonBar.getLayout()).columnWeights = new double[] {1.0, 0.0}; //---- applyButton ---- applyButton.setText(tr("Apply Tags")); applyButton.setEnabled(false); buttonBar.add(applyButton, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); } dialogPane.add(buttonBar, BorderLayout.SOUTH); } //contentPane.add(dialogPane, BorderLayout.CENTER); this.createLayout(dialogPane, false, null); } /** * Returns the state of the power button. * * @return boolean which is true when the button is selected */ public boolean getPowerButtonState() { return this.powerButton.isSelected(); } /** * Enables or disables the interactive UI elements of the toolbox. * * @param enabled set this true for enabled elements */ public void setAllUiElementsEnabled(boolean enabled) { this.applyButton.setEnabled(enabled); this.levelBox.setEnabled(enabled); this.objectBox.setEnabled(enabled); this.nameField.setEnabled(enabled); this.refField.setEnabled(enabled); this.levelTagField.setEnabled(enabled); this.preset1.setEnabled(enabled); this.preset2.setEnabled(enabled); this.preset3.setEnabled(enabled); this.preset4.setEnabled(enabled); if (enabled == false) { resetUiElements(); this.levelTagField.setText(""); } } /** * Enables or disables the interactive text box elements name and ref. * * @param enabled set this true for enabled elements */ public void setTagUiElementsEnabled(boolean enabled) { this.nameField.setEnabled(enabled); this.refField.setEnabled(enabled); if (enabled == false) resetUiElements(); } /** * Disables the power-button of the plug-in. */ public void setPowerButtonDisabled() { this.powerButton.setSelected(false); } /** * Getter for the selected {@link IndoorObject} in the objectBox. * * @return the selected indoor object in the object ComboBox. */ public IndoorObject getSelectedObject() { return (IndoorObject) this.objectBox.getSelectedItem(); } /** * Sets the level list for the level selection comboBox. * * @param levelList the list of levels which you want to set */ public void setLevelList(List<IndoorLevel> levelList) { this.levelBox.removeAllItems(); ListIterator<IndoorLevel> listIterator = levelList.listIterator(); while (listIterator.hasNext()) { IndoorLevel level = listIterator.next(); if (level.hasEmptyName()) { this.levelBox.addItem(Integer.toString(level.getLevelNumber())); } else { this.levelBox.addItem(level.getName()); } } } /** * Getter for the selected working level. * * @return the index of the selected item in the level-box */ public int getSelectedLevelIndex() { return this.levelBox.getSelectedIndex(); } /** * Checks if the level list is empty. * * @return boolean which is true if the level-list is empty */ public boolean levelListIsEmpty() { if (this.levelBox.getItemCount() == 0) { return true; } else { return false; } } /** * Getter for the level-name-field. * * @return the {@link String} of the levelTagField */ public String getLevelName() { return this.levelTagField.getText(); } /** * Setter for the level name field. * * @param name the String for the levelTagField */ public void setLevelName(String name) { this.levelTagField.setText(name); } /** * Getter for the name {@link TextField}. * * @return {@link String} of the name text field */ public String getNameText() { return this.nameField.getText(); } /** * Getter for the ref {@link TextField}. * * @return {@link String} of the ref text field */ public String getRefText() { return this.refField.getText(); } /** * Resets the view by making the UI elements disabled and deleting the level list. */ public void reset() { this.setAllUiElementsEnabled(false); this.levelBox.removeAllItems(); } /** * Clears the text boxes and sets an empty {@link String}. */ public void resetUiElements() { this.nameField.setText(""); this.refField.setText(""); } /* * ******************************** * SETTERS FOR THE BUTTON LISTENERS * ******************************** */ /** * Set the listener for the power button. * * @param l the listener to set */ public void setPowerButtonListener(ActionListener l) { this.powerButton.addActionListener(l); } /** * Set the listener for the apply button. * * @param l the listener to set */ public void setApplyButtonListener(ActionListener l) { this.applyButton.addActionListener(l); } /** * Set the listener which is called when a new item in the level list is selected. * * @param l the listener to set */ public void setLevelItemListener(ItemListener l) { this.levelBox.addItemListener(l); } /** * Set the listener which is called when a new item in the object list is selected. * * @param l the listener to set */ public void setObjectItemListener(ItemListener l) { this.objectBox.addItemListener(l); } // Preset Button Functions public void setPresetButtons(List<IndoorObject> objects) { this.preset1.setIndoorObject(objects.get(0)); this.preset2.setIndoorObject(objects.get(1)); this.preset3.setIndoorObject(objects.get(2)); this.preset4.setIndoorObject(objects.get(3)); } public void setPreset1Listener(ActionListener l) { this.preset1.addActionListener(l); } public void setPreset2Listener(ActionListener l) { this.preset2.addActionListener(l); } public void setPreset3Listener(ActionListener l) { this.preset3.addActionListener(l); } public void setPreset4Listener(ActionListener l) { this.preset4.addActionListener(l); } public IndoorObject getPreset1() { return preset1.getIndoorObject(); } public IndoorObject getPreset2() { return preset2.getIndoorObject(); } public IndoorObject getPreset3() { return preset3.getIndoorObject(); } public IndoorObject getPreset4() { return preset4.getIndoorObject(); } }