content: /*
   * Copyright (C) 2019 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.google.androidstudio.motionlayoutcycles;
  
  import static javax.swing.SwingConstants.TRAILING;
  
  import java.awt.BorderLayout;
  import java.awt.Container;
  import java.awt.GridBagConstraints;
  import java.awt.GridBagLayout;
  import java.awt.Insets;
  import java.awt.event.ActionListener;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import javax.swing.JButton;
  import javax.swing.JComboBox;
  import javax.swing.JLabel;
  import javax.swing.JPanel;
  import javax.swing.JSlider;
  import javax.swing.JTabbedPane;
  import javax.swing.JTextField;
  import javax.swing.UIManager;
  import javax.swing.border.EmptyBorder;
  import javax.swing.plaf.basic.BasicArrowButton;
  
  /**
   * The gui to edit a single cycle
   */
  public class CycleEdit extends JPanel {
  
    private static final boolean DEBUG = false;
    JComboBox<String> baseMovement = new JComboBox<>(AnimationPanel.MOVE_NAMES);
    JComboBox<String> duration = new JComboBox<>(AnimationPanel.DURATION);
    CycleModel myCycleModel;
    JComboBox<String> attrName;
  
    class TabUI extends JPanel {
  
      JButton tabButton = new JButton();
      JButton tabTitle = new JButton();
  
      TabUI(String name) {
        super(new BorderLayout());
        setBackground(null);
        tabButton.setBorder(null);
  
        add(tabTitle, BorderLayout.CENTER);
        add(tabButton, BorderLayout.EAST);
        tabTitle.setBorder(null);
        tabTitle.setFocusPainted(false);
        tabTitle.setContentAreaFilled(false);
        tabTitle.setBorderPainted(true);
        tabTitle.setBackground(null);
        tabTitle.setMargin(new Insets(0, 0, 0, 0));
        tabTitle.setText(name);
  
        tabButton.setBorder(null);
        tabButton.setIcon(UIManager.getIcon("InternalFrame.paletteCloseIcon"));
        tabButton.setFocusPainted(false);
        tabButton.setContentAreaFilled(false);
        tabButton.setBorderPainted(true);
        tabButton.setBackground(null);
        tabButton.setMargin(new Insets(0, 0, 0, 0));
      }
  
      public void addRaiseAction(ActionListener al) {
        tabTitle.addActionListener(al);
      }
  
      public void addKillAction(ActionListener al) {
        tabButton.addActionListener(al);
      }
    }
  
    void updateTabName(String name) {
      if (DEBUG) {
        System.out.println(">>>>>" + name + "  " + MainPanel.getTabbIndex(this));
        StackTraceElement[] s = new Throwable().getStackTrace();
        System.out.println("  .(" + s[1].getFileName() + ":" + s[1].getLineNumber() + ") ");
        System.out.println("  .(" + s[2].getFileName() + ":" + s[2].getLineNumber() + ") ");
      }
      Container tabb = getParent();
      while (!(tabb instanceof JTabbedPane)) {
        tabb = tabb.getParent();
      }
  
      JTabbedPane tabbedPane = (JTabbedPane) tabb;
      int index = MainPanel.getTabbIndex(this);
      tabbedPane.setTitleAt(index, name);
      // tabUI = new TabUI(name);
      // tabbedPane.setTabComponentAt(index, tabUI);
    }
  
    public void removeCycle() {
      myCycleModel.myCycle.myModelSet.removeCycle(myCycleModel.myCycle);
      listener.actionPerformed(null);
    }
  
    ActionListener listener;
  
    public void setRemoveCallback(ActionListener l) {
      listener = l;
    }
  
    public CycleEdit(CycleView cycleView, CycleModel cycleModel, AnimationPanel animationPanel) {
      super(new GridBagLayout());
      JPanel control = this;
  
      setBorder(new EmptyBorder(5, 10, 10, 20));
      myCycleModel = cycleModel;
  
      cycleView.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
          myCycleModel.selectClosest(cycleView.last_click);
        }
      });
      BasicArrowButton next = new BasicArrowButton(BasicArrowButton.EAST);
      BasicArrowButton prev = new BasicArrowButton(BasicArrowButton.WEST);
      myCycleModel.delete = next;
      cycleView.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
          myCycleModel.selectClosest(cycleView.last_click);
        }
      });
      JTextField number = new JTextField("XX");
      number.setPreferredSize(number.getPreferredSize());
      GridBagConstraints gbc = new GridBagConstraints();
      number.setText("" + myCycleModel.selected);
      number.setEditable(false);
      gbc.insets = new Insets(10, 5, 0, 0);
      next.addActionListener((e) -> {
        myCycleModel.changeSelection(+1);
      });
      prev.addActionListener((e) -> {
        myCycleModel.changeSelection(-1);
      });
      myCycleModel.mKeyCycleNo = number;
  
      gbc.gridy = 0;
      gbc.gridx = 2;
      gbc.gridwidth = 1;
  
      control.add(new JLabel("KeyCycle:", TRAILING), gbc);
      gbc.gridx = 3;
      gbc.anchor = GridBagConstraints.EAST;
      control.add(prev, gbc);
      gbc.gridx++;
      control.add(number, gbc);
      gbc.gridx++;
      gbc.anchor = GridBagConstraints.WEST;
      control.add(next, gbc);
      gbc.gridy++;
  
      JButton del = new JButton("Delete");
      JButton add = new JButton("Add");
      myCycleModel.add = add;
      myCycleModel.delete = del;
      del.addActionListener((e) -> {
        myCycleModel.delete();
      });
      add.addActionListener((e) -> {
        myCycleModel.add();
      });
      gbc.gridwidth = 1;
      gbc.gridx = 3;
      control.add(add, gbc);
      gbc.gridx += 2;
      control.add(del, gbc);
      gbc.gridy++;
      gbc.gridwidth = 3;
      JSlider pos = new JSlider();
      gbc.gridx = 0;
      gbc.anchor = GridBagConstraints.NORTHEAST;
      control.add(new JLabel("Pos:", TRAILING), gbc);
      gbc.gridx += 3;
      gbc.anchor = GridBagConstraints.WEST;
      control.add(pos, gbc);
      gbc.gridy++;
  
      JSlider period = new JSlider();
      gbc.gridx = 0;
      gbc.anchor = GridBagConstraints.NORTHEAST;
      control.add(new JLabel("Period:", TRAILING), gbc);
      gbc.gridx += 3;
      gbc.anchor = GridBagConstraints.WEST;
  
      control.add(period, gbc);
      gbc.gridy++;
  
      JSlider amp = new JSlider();
      gbc.gridx = 0;
      gbc.anchor = GridBagConstraints.NORTHEAST;
      attrName = new JComboBox<>(CycleView.MainAttribute.ShortNames);
      attrName.setSelectedIndex(myCycleModel.mAttrIndex);
      attrName.addActionListener(e -> {
        myCycleModel.setAttr(attrName.getSelectedIndex());
        updateTabName(myCycleModel.getAttName());
        animationPanel.setMode();
      });
  
      control.add(attrName, gbc);
  
      gbc.gridx += 3;
      gbc.anchor = GridBagConstraints.WEST;
      control.add(amp, gbc);
  
      gbc.gridy++;
      JSlider off = new JSlider();
      gbc.gridx = 0;
      gbc.anchor = GridBagConstraints.NORTHEAST;
      control.add(new JLabel("Offset:", TRAILING), gbc);
  
      gbc.gridx += 3;
      gbc.anchor = GridBagConstraints.WEST;
      control.add(off, gbc);
  
      gbc.gridy++;
      gbc.gridx = 0;
      gbc.anchor = GridBagConstraints.EAST;
      control.add(new JLabel("WaveType:", TRAILING), gbc);
  
      JComboBox<String> mode = new JComboBox<>(myCycleModel.waveShapeName);
      gbc.gridx += 3;
      gbc.anchor = GridBagConstraints.WEST;
      control.add(mode, gbc);
  
      gbc.gridy++;
      gbc.gridx = 0;
      gbc.anchor = GridBagConstraints.NORTHEAST;
      control.add(new JLabel("Target:", TRAILING), gbc);
  
      gbc.gridx += 3;
      gbc.anchor = GridBagConstraints.WEST;
      JTextField target = new JTextField("XXXXXXXXXXXXXXXXXXXXX");
      target.setPreferredSize(target.getPreferredSize());
      target.setText("button");
      control.add(target, gbc);
  
      myCycleModel.setTarget(target);
      myCycleModel.setUIElements(pos, period, amp, off, mode);
      myCycleModel.setCycle(cycleView);
    }
  }
  