/* * 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); } }