/**
* VideoWindow : For Linux and Windows video
*
* Created : Nov 26, 2012
*
* @author pquiring
*/
import java.awt.*;
import java.util.*;
import javaforce.*;
import javaforce.voip.*;
public class VideoWindow extends javax.swing.JFrame {
/**
* Creates new form VideoWindow
*/
public VideoWindow(VideoController vc, int line) {
initComponents();
setLayout(new VideoLayout());
setVisible(true);
this.vc = vc;
this.line = line;
localCamera = new User();
add(localCamera.canvas);
doLayout();
}
/**
* 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() {
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setTitle("TeleVideo");
setName("JPLCamera"); // NOI18N
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 609, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 375, Short.MAX_VALUE)
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
vc.toggleVideoPanel(line);
}//GEN-LAST:event_formWindowClosing
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
private VideoController vc;
private static class User {
public RTPChannel channel;
public JFImage img;
public Canvas canvas = new Canvas() {
public void paint(Graphics g) {
if (img == null) return;
g.drawImage(img.getImage(), 0, 0, null);
}
public void update(Graphics g) {
paint(g);
}
};
}
private ArrayList<User> users = new ArrayList<User>();
private final Object lock = new Object();
private int line;
private User localCamera;
public void setRemoteImage(RTPChannel channel, JFImage img) {
//find canvas for channel
User user = findUser(channel);
if (user == null) return;
user.img = img;
user.canvas.repaint();
}
public void setLocalImage(JFImage img) {
localCamera.img = img;
localCamera.canvas.repaint();
}
public void resize() {
EventQueue.invokeLater(new Runnable(){
public void run() {
VideoWindow.this.revalidate();
doLayout();
}
});
}
private User findUser(RTPChannel channel) {
synchronized(lock) {
for(int a=0;a<users.size();a++) {
User user = users.get(a);
if (user.channel == channel) return user;
}
}
return null;
}
public void addCamera(RTPChannel channel) {
User user = new User();
user.channel = channel;
synchronized(lock) {
users.add(user);
}
add(user.canvas);
resize();
}
public void delCamera(RTPChannel channel) {
synchronized(lock) {
for(int a=0;a<users.size();a++) {
User user = users.get(a);
if (user.channel == channel) {
users.remove(user);
remove(user.canvas);
resize();
return;
}
}
}
}
private static int X = 352;
private static int Y = 288;
private int wx = 0, wy = 0;
public class VideoLayout implements LayoutManager {
public void addLayoutComponent(String string, Component cmpnt) {
}
public void removeLayoutComponent(Component cmpnt) {
}
public Dimension preferredLayoutSize(Container cntnr) {
return null;
}
public Dimension minimumLayoutSize(Container cntnr) {
return null;
}
public void layoutContainer(Container cont) {
Insets insets = VideoWindow.this.getInsets();
Component cs[] = cont.getComponents();
int x = 0;
int y = 0;
int mx = 0;
int my = 0;
Rectangle s = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
int w = s.width;
int h = s.height;
for(int a=0;a<cs.length;a++) {
Component c = cs[a];
c.setBounds(x,y,X,Y);
x += X;
if (x > mx) mx = x;
if (x + Y > w) {
x = 0;
y += Y;
}
}
if (x == 0 && cs.length > 0) y -= Y;
my = y + Y;
if (wx != mx || wy != my) {
wx = mx;
wy = my;
setSize(insets.left + insets.right + mx, insets.top + insets.bottom + my);
}
}
}
}