/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* StreamPanel.java
*
* Created on 4-Apr-2012, 4:07:51 PM
*/
package webcamstudio.components;
import java.awt.Color;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import webcamstudio.WebcamStudio;
import webcamstudio.mixers.MasterMixer;
import webcamstudio.streams.SourceText;
import webcamstudio.streams.Stream;
import webcamstudio.util.Tools;
/**
*
* @author patrick (modified by karl)
*/
public class StreamPanelText extends javax.swing.JPanel implements Stream.Listener, StreamDesktop.Listener{
Stream stream = null;
SourceText sTx = null;
boolean stopClock = false;
boolean stopCDown = false;
private Timer time = new Timer();
private Timer countDown = new Timer();
private TimerTask clockIn = new clock();
private TimerTask cDownIn = new cDown();
boolean lockRatio = false;
int oldW = 1;
int oldH = 1;
/** Creates new form StreamPanel
* @param stream */
@SuppressWarnings("unchecked")
public StreamPanelText(Stream stream) {
initComponents();
if (WebcamStudio.theme.toLowerCase().equals("classic")){
lblTxtMode.setForeground(new java.awt.Color(0, 0, 0));
}
oldW = stream.getWidth();
oldH = stream.getHeight();
DefaultComboBoxModel model = new DefaultComboBoxModel();
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
Font[] fonts = e.getAllFonts(); // Get the fonts
for (Font f : fonts){
model.addElement(f.getName());
}
cboFonts.setModel(model);
this.stream = stream;
sTx = (SourceText) stream;
spinX.setValue(stream.getX());
spinY.setValue(stream.getY());
spinW.setValue(stream.getWidth());
spinH.setValue(stream.getHeight());
cboFonts.setSelectedItem(stream.getFont());
txtHexColor.setText(Integer.toHexString(stream.getColor()));
spinZOrder.setValue(stream.getZOrder());
spinDuration.setEnabled(!stream.getPlayList());
spinDuration.setValue(stream.getDuration());
if (stream.getIsATimer()){
if (stream.getIsQRCode()) {
lblTxtMode.setText("QR Clock Mode.");
} else {
lblTxtMode.setText("Text Clock Mode.");
tglQRCode.setEnabled(false);
tglCDown.setEnabled(false);
}
} else if (stream.getIsACDown()) {
if (stream.getIsQRCode()) {
lblTxtMode.setText("QR Timer Mode.");
} else {
lblTxtMode.setText("Timer Mode.");
tglQRCode.setEnabled(false);
tglClock.setEnabled(false);
}
} else {
txtArea.setText(stream.getContent());
lblTxtMode.setText("Text Mode.");
}
jcbPlayList.setSelected(stream.getPlayList());
setToolTipText(lblTxtMode.getText());
cboFonts.setEnabled(!(stream.getIsQRCode()));
txtHexColor.setEnabled(!(stream.getIsQRCode()));
btnSelectColor.setEnabled(!(stream.getIsQRCode()));
tglClock.setSelected(stream.getIsATimer());
tglQRCode.setSelected(stream.getIsQRCode());
tglCDown.setSelected(stream.getIsACDown());
stream.setListener(this);
}
@Override
public void closeSource() {
// nothing here.
}
class clock extends TimerTask{
@Override
public void run() {
while (!stopClock){
long milliSeconds = System.currentTimeMillis();
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy HH:mm:ss");
Date resultdate = new Date(milliSeconds);
String time = sdf.format(resultdate);
stream.updateLineContent(time);
Tools.sleep(1000);
}
StreamPanelText.clock.this.stop();
}
public void stop() {
time.cancel();
time.purge();
clockIn.cancel();
stopClock = true;
stream.stop();
// System.out.println("Stopping Clock ...");
}
}
public String getHHMMSS (long seconds) {
long hr = seconds/3600;
long rem = seconds%3600;
long mn = rem/60;
long sec = rem%60;
String hrStr = (hr<10 ? "0" : "")+hr;
String mnStr = (mn<10 ? "0" : "")+mn;
String secStr = (sec<10 ? "0" : "")+sec;
return hrStr+":"+mnStr+":"+secStr;
}
class cDown extends TimerTask{
@Override
public void run() {
if (stream.getPlayList()) {
while (!stopCDown){
int chTimeTo = ChannelPanel.totalToTimer;
final String chTotalTime = getHHMMSS(chTimeTo);
int dur = chTimeTo - ChannelPanel.timeToTimer;
String duration = getHHMMSS(dur);
stream.updateLineContent(duration + " / " + chTotalTime);
Tools.sleep(1000);
}
} else {
int timeTo = stream.getDuration();
final String totalTime = getHHMMSS(timeTo);
int count = 0;
String duration = "";
while (!stopCDown && count < timeTo){
duration = getHHMMSS(count);
stream.updateLineContent(duration + " / " + totalTime);
Tools.sleep(1000);
count ++;
}
}
StreamPanelText.cDown.this.stop();
}
public void stop() {
countDown.cancel();
countDown.purge();
cDownIn.cancel();
stopCDown = true;
stream.stop();
stream.updateStatus();
// System.out.println("Stopping Timer ...");
}
}
public ImageIcon getIcon(){
ImageIcon icon = null;
if (stream.getPreview()!=null){
icon = new ImageIcon(stream.getPreview().getScaledInstance(32, 32, BufferedImage.SCALE_FAST));
}
return icon;
}
public void remove() {
stream.stop();
stream = null;
}
/** 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() {
spinX = new javax.swing.JSpinner();
spinY = new javax.swing.JSpinner();
spinW = new javax.swing.JSpinner();
spinH = new javax.swing.JSpinner();
labelFont = new javax.swing.JLabel();
lblColor = new javax.swing.JLabel();
cboFonts = new javax.swing.JComboBox();
txtHexColor = new javax.swing.JFormattedTextField();
btnSelectColor = new javax.swing.JButton();
tglActiveStream = new javax.swing.JToggleButton();
jSeparator4 = new javax.swing.JSeparator();
jSeparator7 = new javax.swing.JSeparator();
labelText = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
labelX1 = new javax.swing.JLabel();
labelY1 = new javax.swing.JLabel();
labelW1 = new javax.swing.JLabel();
labelH1 = new javax.swing.JLabel();
jSlSpinX = new javax.swing.JSlider();
jSlSpinY = new javax.swing.JSlider();
jSlSpinW = new javax.swing.JSlider();
jSlSpinH = new javax.swing.JSlider();
jSeparator5 = new javax.swing.JSeparator();
spinZOrder = new javax.swing.JSpinner();
labelZ1 = new javax.swing.JLabel();
jSlSpinZOrder = new javax.swing.JSlider();
jSeparator3 = new javax.swing.JSeparator();
tglClock = new javax.swing.JToggleButton();
tglQRCode = new javax.swing.JToggleButton();
jcbLockAR = new javax.swing.JCheckBox();
jSeparator8 = new javax.swing.JSeparator();
tglPreview = new javax.swing.JToggleButton();
scrAreaTxt = new javax.swing.JScrollPane();
txtArea = new javax.swing.JTextArea();
lblTxtMode = new javax.swing.JLabel();
tglCDown = new javax.swing.JToggleButton();
spinDuration = new javax.swing.JSpinner();
jcbPlayList = new javax.swing.JCheckBox();
setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));
setFocusTraversalPolicyProvider(true);
setMaximumSize(new java.awt.Dimension(286, 370));
setPreferredSize(new java.awt.Dimension(286, 370));
setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
spinX.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
spinX.setName("spinX"); // NOI18N
spinX.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinXStateChanged(evt);
}
});
add(spinX, new org.netbeans.lib.awtextra.AbsoluteConstraints(68, 160, 50, -1));
spinY.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
spinY.setName("spinY"); // NOI18N
spinY.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinYStateChanged(evt);
}
});
add(spinY, new org.netbeans.lib.awtextra.AbsoluteConstraints(68, 180, 50, -1));
spinW.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
spinW.setModel(new javax.swing.SpinnerNumberModel(1, 1, null, 1));
spinW.setName("spinW"); // NOI18N
spinW.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinWStateChanged(evt);
}
});
add(spinW, new org.netbeans.lib.awtextra.AbsoluteConstraints(68, 200, 50, -1));
spinH.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
spinH.setModel(new javax.swing.SpinnerNumberModel(1, 1, null, 1));
spinH.setName("spinH"); // NOI18N
spinH.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinHStateChanged(evt);
}
});
add(spinH, new org.netbeans.lib.awtextra.AbsoluteConstraints(68, 220, 50, -1));
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("webcamstudio/Languages"); // NOI18N
labelFont.setText(bundle.getString("FONT")); // NOI18N
labelFont.setName("labelFont"); // NOI18N
add(labelFont, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 308, 72, -1));
lblColor.setText(bundle.getString("COLOR")); // NOI18N
lblColor.setName("lblColor"); // NOI18N
add(lblColor, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 338, 72, -1));
cboFonts.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
cboFonts.setName("cboFonts"); // NOI18N
cboFonts.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cboFontsActionPerformed(evt);
}
});
add(cboFonts, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 300, 210, -1));
try {
txtHexColor.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("HHHHHH")));
} catch (java.text.ParseException ex) {
ex.printStackTrace();
}
txtHexColor.setName("txtHexColor"); // NOI18N
txtHexColor.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtHexColorActionPerformed(evt);
}
});
txtHexColor.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusLost(java.awt.event.FocusEvent evt) {
txtHexColorFocusLost(evt);
}
});
add(txtHexColor, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 330, 178, -1));
btnSelectColor.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/applications-graphics.png"))); // NOI18N
btnSelectColor.setToolTipText(bundle.getString("COLOR")); // NOI18N
btnSelectColor.setName("btnSelectColor"); // NOI18N
btnSelectColor.setPreferredSize(new java.awt.Dimension(32, 20));
btnSelectColor.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSelectColorActionPerformed(evt);
}
});
add(btnSelectColor, new org.netbeans.lib.awtextra.AbsoluteConstraints(248, 333, -1, -1));
tglActiveStream.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/media-playback-start.png"))); // NOI18N
tglActiveStream.setName("tglActiveStream"); // NOI18N
tglActiveStream.setPreferredSize(new java.awt.Dimension(32, 20));
tglActiveStream.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/media-playback-stop.png"))); // NOI18N
tglActiveStream.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tglActiveStreamActionPerformed(evt);
}
});
add(tglActiveStream, new org.netbeans.lib.awtextra.AbsoluteConstraints(7, 84, 110, 20));
jSeparator4.setOrientation(javax.swing.SwingConstants.VERTICAL);
jSeparator4.setName("jSeparator4"); // NOI18N
add(jSeparator4, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 7, 10, 142));
jSeparator7.setName("jSeparator7"); // NOI18N
jSeparator7.setPreferredSize(new java.awt.Dimension(48, 10));
add(jSeparator7, new org.netbeans.lib.awtextra.AbsoluteConstraints(126, 152, 150, 10));
labelText.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
labelText.setText(bundle.getString("ENTER_TEXT")); // NOI18N
labelText.setToolTipText("");
labelText.setName("labelText"); // NOI18N
add(labelText, new org.netbeans.lib.awtextra.AbsoluteConstraints(177, 137, 70, -1));
jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/FontCC.png"))); // NOI18N
jLabel2.setName("jLabel2"); // NOI18N
add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(11, 7, -1, 50));
labelX1.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
labelX1.setText(bundle.getString("X")); // NOI18N
labelX1.setName("labelX1"); // NOI18N
add(labelX1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 170, 10, 10));
labelY1.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
labelY1.setText(bundle.getString("Y")); // NOI18N
labelY1.setName("labelY1"); // NOI18N
add(labelY1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 190, 10, -1));
labelW1.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
labelW1.setText(bundle.getString("WIDTH")); // NOI18N
labelW1.setName("labelW1"); // NOI18N
add(labelW1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 210, 52, -1));
labelH1.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
labelH1.setText(bundle.getString("HEIGHT")); // NOI18N
labelH1.setName("labelH1"); // NOI18N
add(labelH1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 230, 40, -1));
jSlSpinX.setMajorTickSpacing(10);
jSlSpinX.setMaximum(MasterMixer.getInstance().getWidth());
jSlSpinX.setMinimum(- MasterMixer.getInstance().getWidth());
jSlSpinX.setMinorTickSpacing(1);
jSlSpinX.setValue(0);
jSlSpinX.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jSlSpinX.setName("jSlSpinX"); // NOI18N
jSlSpinX.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
jSlSpinXStateChanged(evt);
}
});
add(jSlSpinX, new org.netbeans.lib.awtextra.AbsoluteConstraints(127, 160, 150, 20));
jSlSpinY.setMajorTickSpacing(10);
jSlSpinY.setMaximum(MasterMixer.getInstance().getHeight());
jSlSpinY.setMinimum(- MasterMixer.getInstance().getHeight());
jSlSpinY.setMinorTickSpacing(1);
jSlSpinY.setValue(0);
jSlSpinY.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jSlSpinY.setInverted(true);
jSlSpinY.setName("jSlSpinY"); // NOI18N
jSlSpinY.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
jSlSpinYStateChanged(evt);
}
});
add(jSlSpinY, new org.netbeans.lib.awtextra.AbsoluteConstraints(127, 180, 150, 20));
jSlSpinW.setMajorTickSpacing(10);
jSlSpinW.setMaximum(MasterMixer.getInstance().getWidth());
jSlSpinW.setMinimum(1);
jSlSpinW.setMinorTickSpacing(1);
jSlSpinW.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jSlSpinW.setName("jSlSpinW"); // NOI18N
jSlSpinW.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
jSlSpinWStateChanged(evt);
}
});
add(jSlSpinW, new org.netbeans.lib.awtextra.AbsoluteConstraints(127, 200, 150, 20));
jSlSpinH.setMajorTickSpacing(10);
jSlSpinH.setMaximum(MasterMixer.getInstance().getHeight());
jSlSpinH.setMinimum(1);
jSlSpinH.setMinorTickSpacing(1);
jSlSpinH.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jSlSpinH.setName("jSlSpinH"); // NOI18N
jSlSpinH.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
jSlSpinHStateChanged(evt);
}
});
add(jSlSpinH, new org.netbeans.lib.awtextra.AbsoluteConstraints(127, 220, 150, 20));
jSeparator5.setOrientation(javax.swing.SwingConstants.VERTICAL);
jSeparator5.setName("jSeparator5"); // NOI18N
add(jSeparator5, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 160, 10, 129));
spinZOrder.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
spinZOrder.setName("spinZOrder"); // NOI18N
spinZOrder.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinZOrderStateChanged(evt);
}
});
add(spinZOrder, new org.netbeans.lib.awtextra.AbsoluteConstraints(68, 261, 50, -1));
labelZ1.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
labelZ1.setText(bundle.getString("LAYER")); // NOI18N
labelZ1.setMaximumSize(new java.awt.Dimension(30, 10));
labelZ1.setMinimumSize(new java.awt.Dimension(30, 10));
labelZ1.setName("labelZ1"); // NOI18N
labelZ1.setPreferredSize(new java.awt.Dimension(30, 10));
add(labelZ1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 271, 40, 9));
jSlSpinZOrder.setMajorTickSpacing(10);
jSlSpinZOrder.setMaximum(20);
jSlSpinZOrder.setMinimum(-20);
jSlSpinZOrder.setMinorTickSpacing(1);
jSlSpinZOrder.setPaintTicks(true);
jSlSpinZOrder.setSnapToTicks(true);
jSlSpinZOrder.setValue(0);
jSlSpinZOrder.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jSlSpinZOrder.setName("jSlSpinZOrder"); // NOI18N
jSlSpinZOrder.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
jSlSpinZOrderStateChanged(evt);
}
});
add(jSlSpinZOrder, new org.netbeans.lib.awtextra.AbsoluteConstraints(127, 259, 150, 30));
jSeparator3.setName("jSeparator3"); // NOI18N
jSeparator3.setPreferredSize(new java.awt.Dimension(48, 10));
add(jSeparator3, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 290, 268, 10));
tglClock.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/clock-add.png"))); // NOI18N
tglClock.setToolTipText("Switch to Date/Clock Mode.");
tglClock.setName("tglClock"); // NOI18N
tglClock.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/clock-add.png"))); // NOI18N
tglClock.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/clock-add-selected.png"))); // NOI18N
tglClock.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tglClockActionPerformed(evt);
}
});
add(tglClock, new org.netbeans.lib.awtextra.AbsoluteConstraints(62, 107, 55, 20));
tglQRCode.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/qrcode.png"))); // NOI18N
tglQRCode.setToolTipText("Switch to QRCode mode.");
tglQRCode.setName("tglQRCode"); // NOI18N
tglQRCode.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/qrcode.png"))); // NOI18N
tglQRCode.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/qrcode-selected.png"))); // NOI18N
tglQRCode.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tglQRCodeActionPerformed(evt);
}
});
add(tglQRCode, new org.netbeans.lib.awtextra.AbsoluteConstraints(7, 107, 55, 20));
jcbLockAR.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
jcbLockAR.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
jcbLockAR.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/LockButton-open_small.png"))); // NOI18N
jcbLockAR.setName("jcbLockAR"); // NOI18N
jcbLockAR.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/LockButton-open_small.png"))); // NOI18N
jcbLockAR.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/LockButton-close_small.png"))); // NOI18N
jcbLockAR.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jcbLockARActionPerformed(evt);
}
});
add(jcbLockAR, new org.netbeans.lib.awtextra.AbsoluteConstraints(53, 210, -1, -1));
jSeparator8.setName("jSeparator8"); // NOI18N
jSeparator8.setPreferredSize(new java.awt.Dimension(48, 10));
add(jSeparator8, new org.netbeans.lib.awtextra.AbsoluteConstraints(126, 249, 150, 10));
tglPreview.setFont(new java.awt.Font("Ubuntu", 0, 5)); // NOI18N
tglPreview.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/PreviewButton2.png"))); // NOI18N
tglPreview.setToolTipText("Preview Mode");
tglPreview.setName("tglPreview"); // NOI18N
tglPreview.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/PreviewButton2.png"))); // NOI18N
tglPreview.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/PreviewButtonSelected4.png"))); // NOI18N
tglPreview.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tglPreviewActionPerformed(evt);
}
});
add(tglPreview, new org.netbeans.lib.awtextra.AbsoluteConstraints(6, 242, 112, 20));
scrAreaTxt.setAutoscrolls(true);
scrAreaTxt.setName("scrAreaTxt"); // NOI18N
txtArea.setName("txtArea"); // NOI18N
txtArea.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
txtAreaKeyReleased(evt);
}
});
scrAreaTxt.setViewportView(txtArea);
add(scrAreaTxt, new org.netbeans.lib.awtextra.AbsoluteConstraints(129, 5, 149, 127));
lblTxtMode.setForeground(new java.awt.Color(255, 220, 0));
lblTxtMode.setName("lblTxtMode"); // NOI18N
add(lblTxtMode, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 133, 105, 20));
tglCDown.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/Chrono.png"))); // NOI18N
tglCDown.setToolTipText("Switch to Timer Mode.");
tglCDown.setName("tglCDown"); // NOI18N
tglCDown.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/Chrono.png"))); // NOI18N
tglCDown.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/Chrono_selected.png"))); // NOI18N
tglCDown.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tglCDownActionPerformed(evt);
}
});
add(tglCDown, new org.netbeans.lib.awtextra.AbsoluteConstraints(7, 61, 34, 20));
spinDuration.setFont(new java.awt.Font("Tahoma", 0, 8)); // NOI18N
spinDuration.setToolTipText("Set duration in seconds.");
spinDuration.setName("spinDuration"); // NOI18N
spinDuration.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinDurationStateChanged(evt);
}
});
add(spinDuration, new org.netbeans.lib.awtextra.AbsoluteConstraints(57, 60, 61, -1));
jcbPlayList.setToolTipText("PlayList Mode Switch.");
jcbPlayList.setName("jcbPlayList"); // NOI18N
jcbPlayList.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jcbPlayListActionPerformed(evt);
}
});
add(jcbPlayList, new org.netbeans.lib.awtextra.AbsoluteConstraints(40, 62, 20, -1));
getAccessibleContext().setAccessibleParent(this);
}// </editor-fold>//GEN-END:initComponents
private void cboFontsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cboFontsActionPerformed
stream.setFont(cboFonts.getSelectedItem().toString());
}//GEN-LAST:event_cboFontsActionPerformed
private void txtHexColorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtHexColorActionPerformed
stream.setColor(Integer.parseInt(txtHexColor.getText().trim(),16));
}//GEN-LAST:event_txtHexColorActionPerformed
private void txtHexColorFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtHexColorFocusLost
stream.setColor(Integer.parseInt(txtHexColor.getText().trim(),16));
}//GEN-LAST:event_txtHexColorFocusLost
private void btnSelectColorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSelectColorActionPerformed
ColorChooser c = new ColorChooser(null,true);
c.setLocationRelativeTo(this);
c.setVisible(true);
Color color = c.getColor();
if (color!=null){
txtHexColor.setText(Integer.toHexString(color.getRGB()).substring(2));
stream.setColor(color.getRGB());
}
}//GEN-LAST:event_btnSelectColorActionPerformed
private void tglActiveStreamActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tglActiveStreamActionPerformed
if (tglClock.isSelected()){
time = new Timer();
clockIn = new clock();
if (tglActiveStream.isSelected()) {
this.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));
tglClock.setEnabled(false);
tglQRCode.setEnabled(false);
tglCDown.setEnabled(false);
tglPreview.setEnabled(false);
if (stream.getIsQRCode()) {
lblTxtMode.setText("QR Clock Mode.");
} else {
lblTxtMode.setText("Text Clock Mode.");
}
stopClock=false;
time.schedule(clockIn, 0);
stream.read();
// System.out.println("Starting Clock ...");
} else {
this.setBorder(BorderFactory.createEmptyBorder());
tglPreview.setEnabled(true);
tglClock.setEnabled(true);
tglQRCode.setEnabled(!tglClock.isSelected());
tglCDown.setEnabled(!tglClock.isSelected());
time.cancel();
time.purge();
clockIn.cancel();
stopClock=true;
stream.stop();
// System.out.println("Stopping Clock ...");
}
} else if (tglCDown.isSelected()) {
if (stream.getDuration() == 0 && !stream.getPlayList()) {
tglActiveStream.setSelected(false);
} else {
countDown = new Timer();
cDownIn = new cDown();
if (tglActiveStream.isSelected()) {
stopCDown = false;
countDown.schedule(cDownIn, 0);
stream.read();
this.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));
tglClock.setEnabled(false);
tglQRCode.setEnabled(false);
tglCDown.setEnabled(false);
tglPreview.setEnabled(false);
if (stream.getIsQRCode()) {
lblTxtMode.setText("QR Timer Mode.");
} else {
lblTxtMode.setText("Timer Mode.");
}
} else {
countDown.cancel();
countDown.purge();
cDownIn.cancel();
stopCDown = true;
stream.stop();
this.setBorder(BorderFactory.createEmptyBorder());
tglPreview.setEnabled(true);
tglClock.setEnabled(!tglCDown.isSelected());
tglQRCode.setEnabled(!tglCDown.isSelected());
tglCDown.setEnabled(true);
}
}
} else {
if (tglActiveStream.isSelected()) {
tglPreview.setEnabled(false);
tglClock.setEnabled(false);
tglQRCode.setEnabled(false);
tglCDown.setEnabled(false);
this.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));
stream.read();
} else {
tglPreview.setEnabled(true);
tglClock.setEnabled(true);
tglQRCode.setEnabled(true);
tglCDown.setEnabled(true);
this.setBorder(BorderFactory.createEmptyBorder());
stream.stop();
}
}
}//GEN-LAST:event_tglActiveStreamActionPerformed
private void spinXStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinXStateChanged
stream.setX((Integer)spinX.getValue());
jSlSpinX.setValue((Integer)spinX.getValue());
}//GEN-LAST:event_spinXStateChanged
private void spinYStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinYStateChanged
stream.setY((Integer)spinY.getValue());
jSlSpinY.setValue((Integer)spinY.getValue());
}//GEN-LAST:event_spinYStateChanged
private void spinWStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinWStateChanged
int w = (Integer) spinW.getValue();
jSlSpinW.setValue(w);
int h = oldH;
if (lockRatio){
h = (oldH * w) / oldW;
if (h >= 1) {
spinH.setValue(h);
} else {
h = 1;
}
}
stream.setWidth(w);
}//GEN-LAST:event_spinWStateChanged
private void spinHStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinHStateChanged
int h = (Integer) spinH.getValue();
jSlSpinH.setValue(h);
if (!lockRatio){
oldH = stream.getHeight();
}
stream.setHeight(h);
}//GEN-LAST:event_spinHStateChanged
private void jSlSpinXStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSlSpinXStateChanged
spinX.setValue(jSlSpinX.getValue());
}//GEN-LAST:event_jSlSpinXStateChanged
private void jSlSpinYStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSlSpinYStateChanged
spinY.setValue(jSlSpinY.getValue());
}//GEN-LAST:event_jSlSpinYStateChanged
private void jSlSpinWStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSlSpinWStateChanged
int w = (Integer) jSlSpinW.getValue();
spinW.setValue(w);
}//GEN-LAST:event_jSlSpinWStateChanged
private void jSlSpinHStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSlSpinHStateChanged
spinH.setValue(jSlSpinH.getValue());
}//GEN-LAST:event_jSlSpinHStateChanged
private void spinZOrderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinZOrderStateChanged
stream.setZOrder((Integer) spinZOrder.getValue());
jSlSpinZOrder.setValue((Integer) spinZOrder.getValue());
}//GEN-LAST:event_spinZOrderStateChanged
private void jSlSpinZOrderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSlSpinZOrderStateChanged
spinZOrder.setValue(jSlSpinZOrder.getValue());
}//GEN-LAST:event_jSlSpinZOrderStateChanged
private void tglClockActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tglClockActionPerformed
if (tglClock.isSelected()){
tglQRCode.setEnabled(false);
tglCDown.setEnabled(false);
stream.setIsATimer(true);
if (stream.getIsQRCode()) {
lblTxtMode.setText("QR Clock Mode.");
} else {
lblTxtMode.setText("Text Clock Mode.");
}
stopClock=false;
} else {
tglQRCode.setEnabled(true);
tglCDown.setEnabled(true);
stream.setIsATimer(false);
if (stream.getIsQRCode()) {
lblTxtMode.setText("QR Code Mode.");
} else {
lblTxtMode.setText("Text Mode.");
stream.updateContent(txtArea.getText());
}
stopClock=true;
}
}//GEN-LAST:event_tglClockActionPerformed
private void tglQRCodeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tglQRCodeActionPerformed
if (tglQRCode.isSelected()){
stream.setIsQRCode(true);
lblTxtMode.setText("QR Code Mode.");
cboFonts.setEnabled(!(stream.getIsQRCode()));
txtHexColor.setEnabled(!(stream.getIsQRCode()));
btnSelectColor.setEnabled(!(stream.getIsQRCode()));
} else {
stream.setIsQRCode(false);
lblTxtMode.setText("Text Mode.");
stream.updateContent(txtArea.getText());
cboFonts.setEnabled(!(stream.getIsQRCode()));
txtHexColor.setEnabled(!(stream.getIsQRCode()));
btnSelectColor.setEnabled(!(stream.getIsQRCode()));
}
}//GEN-LAST:event_tglQRCodeActionPerformed
private void jcbLockARActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbLockARActionPerformed
if (jcbLockAR.isSelected()){
spinH.setEnabled(false);
jSlSpinH.setEnabled(false);
lockRatio = true;
oldW = stream.getWidth();
oldH = stream.getHeight();
} else {
spinH.setEnabled(true);
jSlSpinH.setEnabled(true);
lockRatio = false;
oldW = stream.getWidth();
oldH = stream.getHeight();
}
}//GEN-LAST:event_jcbLockARActionPerformed
private void tglPreviewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tglPreviewActionPerformed
if (tglPreview.isSelected()) {
stream.setPreView(true);
} else {
stream.setPreView(false);
}
}//GEN-LAST:event_tglPreviewActionPerformed
private void txtAreaKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtAreaKeyReleased
if (!stream.getIsATimer() && !stream.getIsACDown()) {
stream.updateContent(txtArea.getText());
}
}//GEN-LAST:event_txtAreaKeyReleased
private void tglCDownActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tglCDownActionPerformed
if (tglCDown.isSelected()){
tglQRCode.setEnabled(false);
tglClock.setEnabled(false);
stream.setIsACDown(true);
if (stream.getIsQRCode()) {
lblTxtMode.setText("QR Timer Mode.");
} else {
lblTxtMode.setText("Timer Mode.");
}
stopCDown = false;
} else {
tglQRCode.setEnabled(true);
tglClock.setEnabled(true);
stream.setIsACDown(false);
if (stream.getIsQRCode()) {
lblTxtMode.setText("QR Code Mode.");
} else {
lblTxtMode.setText("Text Mode.");
}
stopCDown = true;
stream.updateContent(txtArea.getText());
}
}//GEN-LAST:event_tglCDownActionPerformed
private void spinDurationStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinDurationStateChanged
stream.setDuration((Integer) spinDuration.getValue());
}//GEN-LAST:event_spinDurationStateChanged
private void jcbPlayListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbPlayListActionPerformed
if (jcbPlayList.isSelected()){
stream.setPlayList(true);
spinDuration.setEnabled(false);
} else {
stream.setPlayList(false);
spinDuration.setEnabled(true);
}
}//GEN-LAST:event_jcbPlayListActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnSelectColor;
private javax.swing.JComboBox cboFonts;
private javax.swing.JLabel jLabel2;
private javax.swing.JSeparator jSeparator3;
private javax.swing.JSeparator jSeparator4;
private javax.swing.JSeparator jSeparator5;
private javax.swing.JSeparator jSeparator7;
private javax.swing.JSeparator jSeparator8;
private javax.swing.JSlider jSlSpinH;
private javax.swing.JSlider jSlSpinW;
private javax.swing.JSlider jSlSpinX;
private javax.swing.JSlider jSlSpinY;
private javax.swing.JSlider jSlSpinZOrder;
private javax.swing.JCheckBox jcbLockAR;
private javax.swing.JCheckBox jcbPlayList;
private javax.swing.JLabel labelFont;
private javax.swing.JLabel labelH1;
private javax.swing.JLabel labelText;
private javax.swing.JLabel labelW1;
private javax.swing.JLabel labelX1;
private javax.swing.JLabel labelY1;
private javax.swing.JLabel labelZ1;
private javax.swing.JLabel lblColor;
private javax.swing.JLabel lblTxtMode;
private javax.swing.JScrollPane scrAreaTxt;
private javax.swing.JSpinner spinDuration;
private javax.swing.JSpinner spinH;
private javax.swing.JSpinner spinW;
private javax.swing.JSpinner spinX;
private javax.swing.JSpinner spinY;
private javax.swing.JSpinner spinZOrder;
private javax.swing.JToggleButton tglActiveStream;
private javax.swing.JToggleButton tglCDown;
private javax.swing.JToggleButton tglClock;
private javax.swing.JToggleButton tglPreview;
private javax.swing.JToggleButton tglQRCode;
private javax.swing.JTextArea txtArea;
private javax.swing.JFormattedTextField txtHexColor;
// End of variables declaration//GEN-END:variables
@Override
public void sourceUpdated(Stream stream) {
if (stream.isPlaying()){
this.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));
tglPreview.setEnabled(false);
if (stream.getIsATimer()){
stopClock=false;
time = new Timer();
clockIn = new clock();
time.schedule(clockIn, 0);
tglClock.setSelected(true);
tglCDown.setSelected(false);
// System.out.println("Source Updated Starting Clock ...");
} else if (stream.getIsACDown()) {
stopCDown = false;
countDown = new Timer();
cDownIn = new cDown();
countDown.schedule(cDownIn, 0);
tglCDown.setSelected(true);
tglClock.setSelected(false);
// System.out.println("Source Updated Starting Timer ...");
} else {
stopCDown = true;
countDown.cancel();
countDown.purge();
cDownIn.cancel();
stopClock=true;
time.cancel();
time.purge();
clockIn.cancel();
tglClock.setSelected(false);
tglCDown.setSelected(false);
}
} else {
this.setBorder(BorderFactory.createEmptyBorder());
tglPreview.setEnabled(true);
if (stream.getIsATimer()){
stopClock = true;
time.cancel();
time.purge();
clockIn.cancel();
tglClock.setSelected(true);
// System.out.println("Source Updated Stopping Clock ...");
} else if (stream.getIsACDown()) {
stopCDown = true;
countDown.cancel();
countDown.purge();
cDownIn.cancel();
tglCDown.setSelected(true);
// System.out.println("Source Updated Stopping Timer ...");
} else {
tglClock.setSelected(false);
tglCDown.setSelected(false);
}
}
if (stream.getIsQRCode()){
tglQRCode.setSelected(true);
cboFonts.setEnabled(!(stream.getIsQRCode()));
txtHexColor.setEnabled(!(stream.getIsQRCode()));
btnSelectColor.setEnabled(!(stream.getIsQRCode()));
} else {
tglQRCode.setSelected(false);
cboFonts.setEnabled(!(stream.getIsQRCode()));
txtHexColor.setEnabled(!(stream.getIsQRCode()));
btnSelectColor.setEnabled(!(stream.getIsQRCode()));
}
int mixerW = MasterMixer.getInstance().getWidth();
int mixerH = MasterMixer.getInstance().getHeight();
if (jSlSpinX.getValue() > mixerW) {
spinX.setValue(stream.getX());
}
jSlSpinX.setMaximum(mixerW);
if (jSlSpinX.getValue() < - mixerW) {
spinX.setValue(stream.getX());
}
jSlSpinX.setMinimum(- mixerW);
if (jSlSpinY.getValue() > mixerH) {
spinY.setValue(stream.getY());
}
jSlSpinY.setMaximum(mixerH);
if (jSlSpinY.getValue() < - mixerH) {
spinY.setValue(stream.getY());
}
jSlSpinY.setMinimum(- mixerH);
if (jSlSpinW.getValue() > mixerW) {
spinW.setValue(stream.getWidth());
}
jSlSpinW.setMaximum(mixerW);
if (jSlSpinH.getValue() > mixerH) {
spinH.setValue(stream.getHeight());
}
jSlSpinH.setMaximum(mixerH);
spinX.setValue(stream.getX());
spinY.setValue(stream.getY());
spinH.setValue(stream.getHeight());
spinW.setValue(stream.getWidth());
spinDuration.setValue(stream.getDuration());
cboFonts.setSelectedItem(this.stream.getFont());
txtHexColor.setText(Integer.toHexString(this.stream.getColor()));
spinZOrder.setValue(stream.getZOrder());
if (!stream.getIsATimer() && !stream.getIsACDown()) {
txtArea.setText(this.stream.getContent());
}
tglActiveStream.setSelected(stream.isPlaying());
if (stream.getIsATimer() || stream.getIsACDown() || stream.isPlaying()) {
tglQRCode.setEnabled(false);
} else {
tglQRCode.setEnabled(true);
}
if (stream.getIsATimer() || stream.isPlaying()) {
tglCDown.setEnabled(false);
} else {
tglCDown.setEnabled(true);
}
if (stream.getIsACDown() || stream.isPlaying()) {
tglClock.setEnabled(false);
} else {
tglClock.setEnabled(true);
}
jcbPlayList.setSelected(stream.getPlayList());
}
@Override
public void updatePreview(BufferedImage image) {
// nothing here.
}
@Override
public void selectedSource(Stream source) {
// nothing here.
}
}