001/*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2024
005 * Space Science and Engineering Center (SSEC)
006 * University of Wisconsin - Madison
007 * 1225 W. Dayton Street, Madison, WI 53706, USA
008 * https://www.ssec.wisc.edu/mcidas/
009 * 
010 * All Rights Reserved
011 * 
012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013 * some McIDAS-V source code is based on IDV and VisAD source code.  
014 * 
015 * McIDAS-V is free software; you can redistribute it and/or modify
016 * it under the terms of the GNU Lesser Public License as published by
017 * the Free Software Foundation; either version 3 of the License, or
018 * (at your option) any later version.
019 * 
020 * McIDAS-V is distributed in the hope that it will be useful,
021 * but WITHOUT ANY WARRANTY; without even the implied warranty of
022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
023 * GNU Lesser Public License for more details.
024 * 
025 * You should have received a copy of the GNU Lesser Public License
026 * along with this program.  If not, see https://www.gnu.org/licenses/.
027 */
028package edu.wisc.ssec.mcidasv.ui;
029
030import java.awt.EventQueue;
031import java.awt.Font;
032import java.awt.event.ActionEvent;
033import java.awt.event.ActionListener;
034import java.awt.event.ItemEvent;
035import java.awt.event.ItemListener;
036import java.util.List;
037
038import javax.swing.JFrame;
039import javax.swing.JPanel;
040import javax.swing.JButton;
041import javax.swing.JToggleButton;
042
043import edu.wisc.ssec.mcidasv.util.McVGuiUtils;
044import net.miginfocom.swing.MigLayout;
045import javax.swing.JTextField;
046import javax.swing.JLabel;
047
048import org.slf4j.Logger;
049import org.slf4j.LoggerFactory;
050
051import ucar.unidata.idv.ViewManager;
052
053public class LayerAnimationWindow extends JFrame {
054
055    private static final Logger logger = LoggerFactory.getLogger(LayerAnimationWindow.class);
056    
057    private JPanel contentPane;
058    private JTextField fieldCurrentDwell;
059    private JToggleButton tglbtnEnableAnimation;
060    private JButton btnSlower;
061    private JButton btnFaster;
062    private JLabel lblDwell; 
063    private JLabel statusLabel;
064
065    /**
066     * Create the frame.
067     */
068    public LayerAnimationWindow() {
069        setTitle("Animate Visibility");
070        setResizable(true);
071        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
072        setBounds(100, 100, 208, 162);
073        contentPane = new JPanel();
074        setContentPane(contentPane);
075        tglbtnEnableAnimation = new JToggleButton("Enable Animation");
076
077        tglbtnEnableAnimation.addItemListener(new ItemListener() {
078            public void itemStateChanged(ItemEvent event) {
079                tglbtnEnableAnimationChanged(event);
080            }
081        });
082        btnSlower = new JButton("Slower");
083        btnSlower.setEnabled(false);
084        btnSlower.addActionListener(new ActionListener() {
085            public void actionPerformed(ActionEvent event) {
086                btnSlowerActionPerformed(event);
087            }
088        });
089
090        btnFaster = new JButton("Faster");
091        btnFaster.setEnabled(false);
092        btnFaster.addActionListener(new ActionListener() {
093            public void actionPerformed(ActionEvent event) {
094                btnFasterActionPerformed(event);
095            }
096        });
097
098        lblDwell = new JLabel("Dwell (s):");
099        lblDwell.setFont(new Font("Lucida Grande", Font.PLAIN, 11));
100        lblDwell.setEnabled(false);
101
102        fieldCurrentDwell = new JTextField();
103        fieldCurrentDwell.setEnabled(false);
104        fieldCurrentDwell.setEditable(false);
105        fieldCurrentDwell.setText("0.0");
106        fieldCurrentDwell.setColumns(6);
107
108        statusLabel = new JLabel("");
109        statusLabel.setEnabled(false);
110
111        contentPane.setLayout(new MigLayout("", "[grow][grow][][]", "[][][][]"));
112        contentPane.add(tglbtnEnableAnimation, "flowy,cell 0 0 3 1,growx,aligny top");
113        contentPane.add(btnSlower, "cell 0 1,alignx right,growy");
114        contentPane.add(btnFaster, "cell 2 1,alignx left,growy");
115        contentPane.add(lblDwell, "cell 0 2,alignx right,aligny baseline");
116        contentPane.add(fieldCurrentDwell, "cell 2 2,alignx left,aligny baseline");
117        contentPane.add(statusLabel, "cell 0 3 3 1");
118    }
119
120    // dear god! change thes
121    private void tglbtnEnableAnimationChanged(final ItemEvent event) {
122        logger.trace("toggle: {}", event);
123        boolean animationEnabled = (event.getStateChange() == ItemEvent.SELECTED);
124        btnSlower.setEnabled(animationEnabled);
125        btnFaster.setEnabled(animationEnabled);
126        ViewManager viewManager = getActiveViewManager();
127        viewManager.setAnimatedVisibilityCheckBox(animationEnabled);
128        double currentSpeed = viewManager.getVisibilityAnimationSpeed();
129        String dwell = Double.toString(currentSpeed / 1000.0);
130        fieldCurrentDwell.setText(dwell);
131    }
132
133    private void btnFasterActionPerformed(final ActionEvent event) {
134        ViewManager viewManager = getActiveViewManager();
135        viewManager.fasterVisibilityAnimation();
136        double currentSpeed = viewManager.getVisibilityAnimationSpeed();
137        String dwell = Double.toString(currentSpeed / 1000.0);
138        fieldCurrentDwell.setText(dwell);
139        logger.trace("faster: animationSpeed={}", dwell);
140    }
141
142    private void btnSlowerActionPerformed(final ActionEvent event) {
143        ViewManager viewManager = getActiveViewManager();
144        viewManager.slowerVisibilityAnimation();
145        double currentSpeed = viewManager.getVisibilityAnimationSpeed();
146        String dwell = Double.toString(currentSpeed / 1000.0);
147        fieldCurrentDwell.setText(dwell);
148        logger.trace("slower: animationSpeed={}", dwell);
149    }
150
151    private ViewManager getActiveViewManager() {
152        List<ViewManager> viewManagers = McVGuiUtils.getActiveViewManagers();
153        if (viewManagers.size() != 1) {
154            statusLabel.setText("no multipanel support yet :(");
155            logger.trace("woe betide the person venturing into shared groups");
156        }
157        ViewManager viewManager = viewManagers.get(0);
158        logger.trace("found a ViewManager: name={} isActive={}", viewManager.getName(), viewManager.getIsActive());
159        return viewManager;
160    }
161
162    /**
163     * Launch the application.
164     */
165    public static void main(String[] args) {
166        EventQueue.invokeLater(new Runnable() {
167            public void run() {
168                try {
169                    LayerAnimationWindow frame = new LayerAnimationWindow();
170                    frame.setVisible(true);
171                } catch (Exception e) {
172                    logger.error("init window", e);
173                }
174            }
175        });
176    }
177}