/*
* Copyright (C) 2014 Shashank Tulsyan
*
* 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 neembuu.release1.ui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import neembuu.release1.api.ui.MainComponent;
import neembuu.swing.HiddenBorderButton;
import neembuu.swing.TextBubbleBorder;
import neembuu.util.Throwables;
/**
*
* @author Shashank Tulsyan
*/
public class ChooseVariantTimeOut extends javax.swing.JPanel {
private final JDialog jd;
private final long waitDuration;
private Entry selected;
public static interface Entry {
String type(); String speed(); boolean hidden();
}
ChooseVariantTimeOut(
JDialog jd, Entry defaultOption,
List<Entry> options, long waitDuration) {
this.jd = jd; this.waitDuration = waitDuration;
selected = defaultOption;
initComponents();
initHiddenPanel();
showHiddenButton.setForeground(Colors.CONTROL_ICONS);
addEntries(defaultOption, options);
t.start();
}
private void initHiddenPanel(){
TextBubbleBorder border = new TextBubbleBorder(Colors.BORDER , 4, 16, 0);
border.getBorderInsets(null).bottom = 8;
border.getBorderInsets(null).top = 8;
border.getBorderInsets(null).right = 1;
border.getBorderInsets(null).left = 1;
variantsPanel_hidden.setBorder(border);
variantsPanel_hidden.setVisible(false);
//border.setVisible(false);
}
private void addEntries(Entry defaultOption,List<Entry> options){
int i = 1;
addSpace(10, i,variantsPanel);
addSpace(10, i,variantsPanel_hidden); i++; //common
for (Entry entry : options) {
if(entry.hidden()){
addSpace(5, i,variantsPanel_hidden); i++;
addEntry(entry, defaultOption==entry,i,variantsPanel_hidden);
}else {
addSpace(5, i,variantsPanel); i++;
addEntry(entry, defaultOption==entry,i,variantsPanel);
}i++;
}
}
private final Timer t = new Timer(300, new ActionListener() {
double waited = 0;
@Override public void actionPerformed(ActionEvent e) {
if(waited>waitDuration){t.stop(); jd.setVisible(false); jd.dispose(); }
waited += 0.3d;
String p = "Automatically opening " + selected.type() + " in "
+ ((int)(waitDuration-waited))
+ " seconds ...";
automaticallyOpenWarningMessage.setText(p);
}
});
public static Entry newEntry(final String type,final long sizeInBytes, long durationInMillisec, final boolean hidden){
double s = sizeInBytes/(durationInMillisec/1000d);
final String speedToStr = toString(s);
return new Entry() {
@Override public String type() { return type; }
@Override public String speed() { return speedToStr; }
@Override public boolean hidden() { return hidden; }
};
}
private static String toString(double sz){
String suffix;
if (sz < 1000) {
suffix = " Bps";
} else if (sz < 1000 * 1000) {
suffix = " KiBps";
sz /= 1024;
} else if (sz < 1000 * 1000 * 1000) {
suffix = " MiBps";
sz /= 1024 * 1024;
} else if (sz < 1000 * 1000 * 1000 * 1000) {
suffix = " GiBps";
sz /= 1024 * 1024 * 1024;
} else {
suffix = " TiBps";
sz /= 1024 * 1024 * 1024 * 1024;
}
if (sz < 10) {
sz = Math.round(sz * 100.0) / 100.0;
} else if (sz < 100) {
sz = Math.round(sz * 10.0) / 10.0;
}
return " "+((int)sz) + " " + suffix;
}
public static Entry showMessage(
MainComponent m,
final long waitDurationSeconds,
final Entry defaultChoice,
final List<Entry>choices){
JFrame jf = null;
try{
jf = m.getJFrame();
}catch(NullPointerException npe){
}
final JDialog jd = new JDialog(jf, "Please select a type", true);
jd.setAlwaysOnTop(true);
//jd.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
final ChooseVariantTimeOut x = new ChooseVariantTimeOut(jd, defaultChoice, choices, waitDurationSeconds);
jd.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
jd.addWindowListener(new WindowAdapter() {
@Override public void windowClosing(WindowEvent e) {
System.out.println("closed");
x.selected = null; x.t.stop(); jd.setVisible(false);jd.dispose();
}});
jd.getContentPane().add(x);
adjustSize(jd, x);
//jd.setResizable(false);
jd.setVisible(true);
return x.selected;
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
automaticallyOpenWarningMessage = new javax.swing.JLabel();
variantsPanel = new javax.swing.JPanel();
typeLabel = new javax.swing.JLabel();
speedRequiredLabel = new javax.swing.JLabel();
showHiddenButton = HiddenBorderButton.make("Show other qualities");
variantsPanel_hidden = new javax.swing.JPanel();
typeLabel1 = new javax.swing.JLabel();
speedRequiredLabel1 = new javax.swing.JLabel();
setBackground(new java.awt.Color(255, 255, 255));
automaticallyOpenWarningMessage.setText(org.openide.util.NbBundle.getMessage(ChooseVariantTimeOut.class, "ChooseVariantTimeOut.automaticallyOpenWarningMessage.text")); // NOI18N
variantsPanel.setLayout(new java.awt.GridBagLayout());
typeLabel.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
typeLabel.setText(org.openide.util.NbBundle.getMessage(ChooseVariantTimeOut.class, "ChooseVariantTimeOut.typeLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
variantsPanel.add(typeLabel, gridBagConstraints);
speedRequiredLabel.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
speedRequiredLabel.setText(org.openide.util.NbBundle.getMessage(ChooseVariantTimeOut.class, "ChooseVariantTimeOut.speedRequiredLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
variantsPanel.add(speedRequiredLabel, gridBagConstraints);
showHiddenButton.setFont(new java.awt.Font("Tahoma", 1, 13)); // NOI18N
showHiddenButton.setText(org.openide.util.NbBundle.getMessage(ChooseVariantTimeOut.class, "ChooseVariantTimeOut.showHiddenButton.text")); // NOI18N
showHiddenButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
showHiddenButtonActionPerformed(evt);
}
});
variantsPanel_hidden.setLayout(new java.awt.GridBagLayout());
typeLabel1.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
typeLabel1.setText(org.openide.util.NbBundle.getMessage(ChooseVariantTimeOut.class, "ChooseVariantTimeOut.typeLabel1.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
variantsPanel_hidden.add(typeLabel1, gridBagConstraints);
speedRequiredLabel1.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
speedRequiredLabel1.setText(org.openide.util.NbBundle.getMessage(ChooseVariantTimeOut.class, "ChooseVariantTimeOut.speedRequiredLabel1.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
variantsPanel_hidden.add(speedRequiredLabel1, gridBagConstraints);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(automaticallyOpenWarningMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE)
.addComponent(variantsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(variantsPanel_hidden, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(showHiddenButton, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(77, 77, 77))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addComponent(variantsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 80, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(showHiddenButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(variantsPanel_hidden, javax.swing.GroupLayout.DEFAULT_SIZE, 87, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(automaticallyOpenWarningMessage)
.addGap(7, 7, 7))
);
}// </editor-fold>//GEN-END:initComponents
private void showHiddenButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showHiddenButtonActionPerformed
variantsPanel_hidden.setVisible(!variantsPanel_hidden.isVisible());
adjustSize(jd, this);
}//GEN-LAST:event_showHiddenButtonActionPerformed
private static void adjustSize(JDialog jd, ChooseVariantTimeOut cvto){
jd.setSize(cvto.getPreferredSize().width + 20,
cvto.getPreferredSize().height + 50);
}
private void addSpace(int s, int i, JPanel panel){
java.awt.GridBagConstraints gridBagConstraints;
javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, s), new java.awt.Dimension(0, s), new java.awt.Dimension(32767, s));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = i;
panel.add(filler1, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = i;
panel.add(filler1, gridBagConstraints);
}
private void addEntry(final Entry entry,boolean default_,int i, JPanel panel){
java.awt.GridBagConstraints gridBagConstraints;
JButton typeSelector = new JButton(entry.type());
JLabel speedInfo = new JLabel(entry.speed());
if(default_){
typeSelector.setBackground(Colors.PROGRESS_BAR_FILL_BUFFER);
}else {
typeSelector.setFocusable(false);
}
typeSelector.setText(entry.type()); // NOI18N
typeSelector.addActionListener(new java.awt.event.ActionListener() {
@Override public void actionPerformed(java.awt.event.ActionEvent evt) {
selected = entry; t.stop(); jd.setVisible(false);jd.dispose();
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = i;
panel.add(typeSelector, gridBagConstraints);
speedInfo.setText(entry.speed()); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = i;
panel.add(speedInfo, gridBagConstraints);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel automaticallyOpenWarningMessage;
private javax.swing.JButton showHiddenButton;
private javax.swing.JLabel speedRequiredLabel;
private javax.swing.JLabel speedRequiredLabel1;
private javax.swing.JLabel typeLabel;
private javax.swing.JLabel typeLabel1;
private javax.swing.JPanel variantsPanel;
private javax.swing.JPanel variantsPanel_hidden;
// End of variables declaration//GEN-END:variables
public static void main(String[] args) {
InitLookAndFeel.init();
List<Entry> es = new LinkedList<>();
Entry e = newEntry("480 P", 50*1024, 122,false);
es.add(newEntry("320 P", 25*1024, 122,true));
es.add(e);
es.add(newEntry("720 P", 100*1024, 122,false));
es.add(newEntry("1080 P", 300*1024, 122,false));
MainComponent mc = new neembuu.release1.ui.mc.MainComponentImpl(new JFrame());
mc.getJFrame().setSize(100,100);
mc.getJFrame().setVisible(true);
try{Thread.sleep(4000);}catch(Exception a){}
Entry x = showMessage(mc, 200, e, es);
System.out.println("x="+x.type());
}
}