/* * Copyright (C) 2013 United States Government as represented by the Administrator of the * National Aeronautics and Space Administration. * All Rights Reserved. */ package org.jgrasstools.nww.gui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JPanel; import gov.nasa.worldwind.WorldWindow; import gov.nasa.worldwind.globes.ElevationModel; import gov.nasa.worldwind.terrain.CompoundElevationModel; /** * Displays the name and controls for one elevation model in the elevation model manager. * * @author tag * @version $Id: ElevationModelPanel.java 1179 2013-02-15 17:47:37Z tgaskins $ */ public class ElevationModelPanel extends JPanel { protected ElevationModel elevationModel; protected JCheckBox checkBox; protected JButton upButton; protected JButton downButton; public ElevationModelPanel(final WorldWindow wwd, final ElevationModelManagerPanel emPanel, final ElevationModel elevationModel) { super(new BorderLayout(10, 10)); this.elevationModel = elevationModel; SelectModelAction action = new SelectModelAction(wwd, elevationModel, elevationModel.isEnabled()); this.checkBox = new JCheckBox(action); this.checkBox.setSelected(action.selected); this.add(this.checkBox, BorderLayout.CENTER); this.upButton = new JButton(GeneralLayerPanel.UP_ARROW); this.upButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { moveElevationModel(wwd, elevationModel, -1); emPanel.update(wwd); } }); this.downButton = new JButton(GeneralLayerPanel.DOWN_ARROW); this.downButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { moveElevationModel(wwd, elevationModel, +1); emPanel.update(wwd); } }); // The buttons shouldn't look like actual JButtons. this.upButton.setBorderPainted(false); this.upButton.setContentAreaFilled(false); this.upButton.setPreferredSize(new Dimension(24, 24)); this.downButton.setBorderPainted(false); this.downButton.setContentAreaFilled(false); this.downButton.setPreferredSize(new Dimension(24, 24)); JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0)); buttonPanel.add(this.upButton); buttonPanel.add(this.downButton); this.add(buttonPanel, BorderLayout.EAST); int index = this.findElevationModelPosition(wwd, elevationModel); this.upButton.setEnabled(index != 0); this.downButton.setEnabled(index != this.getNumElevationModels(wwd) - 1); } public ElevationModel getElevationModel() { return this.elevationModel; } protected void moveElevationModel(WorldWindow wwd, ElevationModel elevationModel, int direction) { // Moves the model associated with this instance in the direction indicated relative to the other models. int index = this.findElevationModelPosition(wwd, elevationModel); if (index < 0) return; // model not found or not a globe isn't using a CompoundElevationModel CompoundElevationModel cem = (CompoundElevationModel) wwd.getModel().getGlobe().getElevationModel(); if (direction < 0 && index == 0) // can't move lowest layer any lower return; if (direction > 0 && index == cem.getElevationModels().size() - 1) // can't move highest model any higher return; // Remove the model from the model list and then re-insert it. cem.getElevationModels().remove(elevationModel); if (direction > 0) cem.getElevationModels().add(index + 1, elevationModel); else if (direction < 0) cem.getElevationModels().add(index - 1, elevationModel); // Update WorldWind so the change is visible. wwd.redraw(); } protected int findElevationModelPosition(WorldWindow wwd, ElevationModel elevationModel) { // Determines the ordinal location of an elevation model in the globe's elevation models. if (!(wwd.getModel().getGlobe().getElevationModel() instanceof CompoundElevationModel)) return -1; CompoundElevationModel cem = (CompoundElevationModel) wwd.getModel().getGlobe().getElevationModel(); for (int i = 0; i < cem.getElevationModels().size(); i++) { if (elevationModel == cem.getElevationModels().get(i)) return i; } return -1; } protected int getNumElevationModels(WorldWindow wwd) { // Determines the ordinal location of an elevation model in the globe's elevation models. if (!(wwd.getModel().getGlobe().getElevationModel() instanceof CompoundElevationModel)) return 1; CompoundElevationModel cem = (CompoundElevationModel) wwd.getModel().getGlobe().getElevationModel(); return cem.getElevationModels().size(); } protected static class SelectModelAction extends AbstractAction { // This action handles elevation model selection and de-selection. protected WorldWindow wwd; protected ElevationModel elevationModel; protected boolean selected; public SelectModelAction(WorldWindow wwd, ElevationModel elevationModel, boolean selected) { super(elevationModel.getName()); this.wwd = wwd; this.elevationModel = elevationModel; this.selected = selected; this.elevationModel.setEnabled(this.selected); } public void actionPerformed(ActionEvent actionEvent) { // Simply enable or disable the model based on its toggle button. if (((JCheckBox) actionEvent.getSource()).isSelected()) this.elevationModel.setEnabled(true); else this.elevationModel.setEnabled(false); wwd.redraw(); } } }