package com.iailab.netsdk.demo.frame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Panel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.Vector;

import javax.imageio.ImageIO;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

import com.iailab.netsdk.common.*;
import com.iailab.netsdk.demo.module.*;
import com.iailab.netsdk.lib.*;
import com.iailab.netsdk.lib.NetSDKLib.LLong;

import com.sun.jna.CallbackThreadInitializer;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

/**
 * 实时预览Demo
 */
class PTZControlFrame extends JFrame{
	private static final long serialVersionUID = 1L;
	
	private Vector<String> chnlist = new Vector<String>(); 

	private boolean b_realplay = false;

	// 设备断线通知回调
	private static DisConnect disConnect       = new DisConnect(); 
	
	// 网络连接恢复
	private static HaveReConnect haveReConnect = new HaveReConnect(); 
	
	// 预览句柄
	public static LLong m_hPlayHandle = new LLong(0);
	
	// 获取界面窗口
	private static JFrame frame = new JFrame();   
	
	public PTZControlFrame() {
	    setTitle(Res.string().getPTZ());
	    setLayout(new BorderLayout());
	    pack();
	    setSize(800, 560);
	    setResizable(false);
	    setLocationRelativeTo(null);
		LoginModule.init(disConnect, haveReConnect);   // 打开工程,初始化
		
    	try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
        	e.printStackTrace();
        } 
	 
	    loginPanel = new LoginPanel();
	    realPanel = new RealPanel();
	    ptz_picPanel = new PTZ_PICPanel();
	    
	    add(loginPanel, BorderLayout.NORTH);
	    add(realPanel, BorderLayout.CENTER);
	    add(ptz_picPanel, BorderLayout.EAST);
	    
	    loginPanel.addLoginBtnActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {	   	    
				if(loginPanel.checkLoginText()) {
					if(login()) {
						frame = ToolKits.getFrame(e);
						frame.setTitle(Res.string().getPTZ() + " : " + Res.string().getOnline());
					}
				}
			}
		});
	    
	    loginPanel.addLogoutBtnActionListener(new ActionListener() {		
			@Override
			public void actionPerformed(ActionEvent e) {
				frame.setTitle(Res.string().getPTZ());
				logout();	
			}
		});
        
	    addWindowListener(new WindowAdapter() {
	    	public void windowClosing(WindowEvent e) {
	    		RealPlayModule.stopRealPlay(m_hPlayHandle);
	    		LoginModule.logout();
	    		LoginModule.cleanup();   // 关闭工程,释放资源
	    		dispose();	
	    		
	    		SwingUtilities.invokeLater(new Runnable() {
	    			public void run() {
	    				FunctionList demo = new FunctionList();
	    				demo.setVisible(true);
	    			}
	    		});
	    	}
	    });
	}
	
	/////////////////面板///////////////////
	// 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数
	private static class DisConnect implements NetSDKLib.fDisConnect {
		public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
			System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
			// 断线提示
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					frame.setTitle(Res.string().getPTZ() + " : " + Res.string().getDisConnectReconnecting());
				}
			});
		}
	}
	
	// 网络连接恢复,设备重连成功回调
	// 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数
	private static class HaveReConnect implements NetSDKLib.fHaveReConnect {
		public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
			System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
			
			// 重连提示
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					frame.setTitle(Res.string().getPTZ() + " : " + Res.string().getOnline());
				}
			});
		}
	}
	
	// 登录
	public boolean login() {
		Native.setCallbackThreadInitializer(m_SnapReceiveCB, 
										    new CallbackThreadInitializer(false, false, "snapPicture callback thread")); 
		if(LoginModule.login(loginPanel.ipTextArea.getText(), 
						Integer.parseInt(loginPanel.portTextArea.getText()), 
						loginPanel.nameTextArea.getText(), 
						new String(loginPanel.passwordTextArea.getPassword()))) {
	
			loginPanel.setButtonEnable(true);
			setButtonEnable(true);
			
			for(int i = 1; i < LoginModule.m_stDeviceInfo.byChanNum + 1; i++) {
				chnlist.add(Res.string().getChannel() + " " + String.valueOf(i));
			}
			
			// 登陆成功,将通道添加到控件
			chnComboBox.setModel(new DefaultComboBoxModel(chnlist));
		
			CapturePictureModule.setSnapRevCallBack(m_SnapReceiveCB);		
		} else {
			JOptionPane.showMessageDialog(null, Res.string().getLoginFailed() + ", " + ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(), JOptionPane.ERROR_MESSAGE);
			return false;
		}
		return true;
	}
	
	// 登出
	public void logout() {
		RealPlayModule.stopRealPlay(m_hPlayHandle);
		LoginModule.logout();
		
		loginPanel.setButtonEnable(false);
		setButtonEnable(false);
		realPlayWindow.repaint();    
		pictureShowWindow.setOpaque(true);
		pictureShowWindow.repaint();
		
		b_realplay = false;
		realplayBtn.setText(Res.string().getStartRealPlay());
		
		for(int i = 0; i < LoginModule.m_stDeviceInfo.byChanNum; i++) {
			chnlist.clear();
		}
		
		chnComboBox.setModel(new DefaultComboBoxModel());
	}
	
	/*
	 * 预览界面通道、码流设置  以及抓图面板
	 */
	private class RealPanel extends JPanel {
		private static final long serialVersionUID = 1L;
		
		public RealPanel() {
			BorderEx.set(this, Res.string().getRealplay(), 2);
			setLayout(new BorderLayout());
			
			channelPanel = new Panel();
			realplayPanel = new JPanel();
			
			add(channelPanel, BorderLayout.SOUTH);
			add(realplayPanel, BorderLayout.CENTER);
			
			/************ 预览面板 **************/
			realplayPanel.setLayout(new BorderLayout());
			realplayPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
			realPlayWindow = new Panel();
			realPlayWindow.setBackground(Color.GRAY);
			realplayPanel.add(realPlayWindow, BorderLayout.CENTER);
			
			/************ 通道、码流面板 **************/
			chnlabel = new JLabel(Res.string().getChannel());
			chnComboBox = new JComboBox();	 			

			streamLabel = new JLabel(Res.string().getStreamType());
			String[] stream = {Res.string().getMasterStream(), Res.string().getSubStream()};
			streamComboBox = new JComboBox(stream);	 
			
			realplayBtn = new JButton(Res.string().getStartRealPlay());
			
			channelPanel.setLayout(new FlowLayout());			
			channelPanel.add(chnlabel);
			channelPanel.add(chnComboBox);
			channelPanel.add(streamLabel);
			channelPanel.add(streamComboBox);
			channelPanel.add(realplayBtn);
			
			chnComboBox.setPreferredSize(new Dimension(90, 20)); 
			streamComboBox.setPreferredSize(new Dimension(90, 20)); 
			realplayBtn.setPreferredSize(new Dimension(120, 20)); 
		    
			realPlayWindow.setEnabled(false);
 			chnComboBox.setEnabled(false);
			streamComboBox.setEnabled(false);
			realplayBtn.setEnabled(false);
		    
			realplayBtn.addActionListener(new ActionListener() {			
				@Override
				public void actionPerformed(ActionEvent e) {
					realplay();
				}
			});
		}
	}
	
	// 预览
	public void realplay() {
		if(!b_realplay) {
			m_hPlayHandle = RealPlayModule.startRealPlay(chnComboBox.getSelectedIndex(), 
				    streamComboBox.getSelectedIndex()==0? 0:3,
					realPlayWindow);
			if(m_hPlayHandle.longValue() != 0) {
				realPlayWindow.repaint();
				b_realplay = true;
				chnComboBox.setEnabled(false);
				streamComboBox.setEnabled(false);
				realplayBtn.setText(Res.string().getStopRealPlay());
			} 
		} else {
			RealPlayModule.stopRealPlay(m_hPlayHandle);
			realPlayWindow.repaint();
			b_realplay = false;
			chnComboBox.setEnabled(true);
			streamComboBox.setEnabled(true);
			realplayBtn.setText(Res.string().getStartRealPlay());
		}	
	}
	
	/*
	 * 抓图显示与云台控制面板
	 */
	private class PTZ_PICPanel extends JPanel {
		private static final long serialVersionUID = 1L;
		
		public PTZ_PICPanel() {
			setLayout(new BorderLayout());
			Dimension dim = getPreferredSize();
			dim.width = 320;
			setPreferredSize(dim);
			
			picPanel = new PICPanel(); // 图片显示面板
			ptzPanel = new PTZPanel(); // 云台面板
			
			add(picPanel, BorderLayout.CENTER);
			add(ptzPanel, BorderLayout.SOUTH);
		}
	}
	
	/*
	 * 抓图显示面板
	 */
	private class PICPanel extends JPanel {
		private static final long serialVersionUID = 1L;
		
		public PICPanel() {
			BorderEx.set(this, Res.string().getCapturePicture(), 2);
			setLayout(new BorderLayout());
			
			pictureShowPanel = new JPanel();  
			snapPanel = new JPanel();
			
			add(pictureShowPanel, BorderLayout.CENTER);
			add(snapPanel, BorderLayout.SOUTH);
			
			/************** 抓图按钮 ************/
			snapPanel.setLayout(new BorderLayout());
			snapPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
			snapBtn = new JButton(Res.string().getRemoteCapture());
			snapBtn.setPreferredSize(new Dimension(40, 23));
			snapPanel.add(snapBtn, BorderLayout.CENTER);
			snapBtn.setEnabled(false);
			
			/************** 图片显示 ************/
			pictureShowPanel.setLayout(new BorderLayout());
			pictureShowPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
			pictureShowWindow = new PaintPanel();
			pictureShowPanel.add(pictureShowWindow, BorderLayout.CENTER);
		    
			snapBtn.addActionListener(new ActionListener() {	
				@Override
				public void actionPerformed(ActionEvent arg0) {
					if(!CapturePictureModule.remoteCapturePicture(chnComboBox.getSelectedIndex())) {
						JOptionPane.showMessageDialog(null, ToolKits.getErrorCodeShow(), Res.string().getErrorMessage(), JOptionPane.ERROR_MESSAGE);
					}
				}
			});
		}
	}
	
	/*
	 * 云台控制面板
	 */
	private class PTZPanel extends JPanel {
		private static final long serialVersionUID = 1L;
		
		public PTZPanel() {
			BorderEx.set(this, Res.string().getPTZControl(), 2);
			setPreferredSize(new Dimension(40, 205));
			setLayout(new GridLayout(2, 1));
			
			directionPanel = new JPanel();
			JPanel panel1 = new JPanel();
			JPanel panel2 = new JPanel();
			ptzCtrlPanel = new JPanel();
			
			add(directionPanel);
			add(ptzCtrlPanel);
			
			directionPanel.setLayout(new BorderLayout());
			
			directionPanel.add(panel1, BorderLayout.NORTH);
			directionPanel.add(panel2, BorderLayout.CENTER);
			
			/*************** 云台方向 **************/
			panel1.setLayout(new BorderLayout());
			panel1.setBorder(new EmptyBorder(0, 5, 0, 5));
			
			panel2.setLayout(new GridLayout(3, 3));
			panel2.setBorder(new EmptyBorder(0, 5, 0, 5));
			
			leftUpBtn = new JButton(Res.string().getLeftUp());
			upBtn = new JButton(Res.string().getUp());
			rightUpBtn = new JButton(Res.string().getRightUp());
			leftBtn = new JButton(Res.string().getLeft());
			rightBtn = new JButton(Res.string().getRight());
			leftDownBtn = new JButton(Res.string().getLeftDown());
			downBtn = new JButton(Res.string().getDown());
			rightDownBtn = new JButton(Res.string().getRightDown());
			operateJLabel = new JLabel("", JLabel.CENTER);
			
			String[] speed = {Res.string().getSpeed() + " 1",
							  Res.string().getSpeed() + " 2",
							  Res.string().getSpeed() + " 3",
							  Res.string().getSpeed() + " 4",
							  Res.string().getSpeed() + " 5",
							  Res.string().getSpeed() + " 6",
							  Res.string().getSpeed() + " 7",
							  Res.string().getSpeed() + " 8"};
			
			speedComboBox = new JComboBox(speed);
			speedComboBox.setSelectedIndex(4);
			speedComboBox.setPreferredSize(new Dimension(40, 21));
			
			panel1.add(speedComboBox, BorderLayout.CENTER);
			
			panel2.add(leftUpBtn);
			panel2.add(upBtn);
			panel2.add(rightUpBtn);
			panel2.add(leftBtn);
			panel2.add(operateJLabel);
			panel2.add(rightBtn);
			panel2.add(leftDownBtn);
			panel2.add(downBtn);
			panel2.add(rightDownBtn);
			
			leftUpBtn.setEnabled(false);
			upBtn.setEnabled(false);
			rightUpBtn.setEnabled(false);
			leftBtn.setEnabled(false);
			rightBtn.setEnabled(false);
			leftDownBtn.setEnabled(false);
			downBtn.setEnabled(false);
			rightDownBtn.setEnabled(false);
			speedComboBox.setEnabled(false);
			
			/*************** 变焦、变倍、光圈 **************/
			ptzCtrlPanel.setLayout(new GridLayout(3, 2));
			ptzCtrlPanel.setBorder(new EmptyBorder(15, 5, 5, 5));
			zoomAddBtn = new JButton(Res.string().getZoomAdd());
			zoomDecBtn = new JButton(Res.string().getZoomDec());
			focusAddBtn = new JButton(Res.string().getFocusAdd());
			focusDecBtn = new JButton(Res.string().getFocusDec());
			irisAddBtn = new JButton(Res.string().getIrisAdd());
			irisDecBtn = new JButton(Res.string().getIrisDec());
			
			ptzCtrlPanel.add(zoomAddBtn);
			ptzCtrlPanel.add(zoomDecBtn);
			ptzCtrlPanel.add(focusAddBtn);
			ptzCtrlPanel.add(focusDecBtn);
			ptzCtrlPanel.add(irisAddBtn);
			ptzCtrlPanel.add(irisDecBtn);
			
			zoomAddBtn.setEnabled(false);
			zoomDecBtn.setEnabled(false);
			focusAddBtn.setEnabled(false);
			focusDecBtn.setEnabled(false);
			irisAddBtn.setEnabled(false);
			irisDecBtn.setEnabled(false);
			
			// 向上
			upBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlUpStart(chnComboBox.getSelectedIndex(), 
											0, 
											speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlUpEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});

			
			// 向下
			downBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlDownStart(chnComboBox.getSelectedIndex(), 
											0, 
											speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}	
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlDownEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});

			
			// 向左
			leftBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlLeftStart(chnComboBox.getSelectedIndex(), 
											0, 
											speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}		
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlLeftEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			
			// 向右
			rightBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlRightStart(chnComboBox.getSelectedIndex(), 
											0, 
											speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}		
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlRightEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			
			// 向左上
			leftUpBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlLeftUpStart(chnComboBox.getSelectedIndex(), 
												speedComboBox.getSelectedIndex(), 
												speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}		
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlLeftUpEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			
			// 向右上
			rightUpBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlRightUpStart(chnComboBox.getSelectedIndex(), 
												speedComboBox.getSelectedIndex(), 
												speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}			
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlRightUpEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			
			// 向左下
			leftDownBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlLeftDownStart(chnComboBox.getSelectedIndex(), 
												speedComboBox.getSelectedIndex(), 
												speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}		
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlLeftDownEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			  
			// 向右下
			rightDownBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlRightDownStart(chnComboBox.getSelectedIndex(), 
												speedComboBox.getSelectedIndex(), 
												speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}		
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlRightDownEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			
			// 变倍+
			zoomAddBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlZoomAddStart(chnComboBox.getSelectedIndex(), 
												 speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}		
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlZoomAddEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			
			// 变倍-
			zoomDecBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlZoomDecStart(chnComboBox.getSelectedIndex(), 
												 speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}			
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlZoomDecEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			
			// 变焦+
			focusAddBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlFocusAddStart(chnComboBox.getSelectedIndex(), 
												 speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}		
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlFocusAddEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			
			// 变焦-
			focusDecBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlFocusDecStart(chnComboBox.getSelectedIndex(), 
												 speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}			
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlFocusDecEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			
			// 光圈+
			irisAddBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlIrisAddStart(chnComboBox.getSelectedIndex(), 
												 speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}		
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlIrisAddEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
			
			// 光圈-
			irisDecBtn.addMouseListener(new MouseListener() {			
				@Override
				public void mouseExited(MouseEvent e) {		
				}	
				@Override
				public void mouseEntered(MouseEvent e) {
				}			
				@Override
				public void mouseClicked(MouseEvent e) {
				}
				@Override
				public void mousePressed(MouseEvent e) {
					if(PtzControlModule.ptzControlIrisDecStart(chnComboBox.getSelectedIndex(), 
												 speedComboBox.getSelectedIndex())) {
						operateJLabel.setText(Res.string().getSucceed());
					} else {
						operateJLabel.setText(Res.string().getFailed());
					}			
				}
				@Override
				public void mouseReleased(MouseEvent e) {	
					PtzControlModule.ptzControlIrisDecEnd(chnComboBox.getSelectedIndex());
					operateJLabel.setText("");
				}
			});
		}
	}

	public fSnapReceiveCB  m_SnapReceiveCB = new fSnapReceiveCB();
	public class fSnapReceiveCB implements NetSDKLib.fSnapRev{
		BufferedImage bufferedImage = null;
		public void invoke( LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) {	
			if(pBuf != null && RevLen > 0) {			        
				String strFileName = SavePath.getSavePath().getSaveCapturePath(); 

				System.out.println("strFileName = " + strFileName);

				byte[] buf = pBuf.getByteArray(0, RevLen);
				ByteArrayInputStream byteArrInput = new ByteArrayInputStream(buf);
				try {
					bufferedImage = ImageIO.read(byteArrInput);
					if(bufferedImage == null) {
						return;
					}
					ImageIO.write(bufferedImage, "jpg", new File(strFileName));	
				} catch (IOException e) {
					e.printStackTrace();
				}	
				
				// 界面显示抓图	 
				SwingUtilities.invokeLater(new Runnable() {	
					@Override
					public void run() {			
						pictureShowWindow.setOpaque(false);
						pictureShowWindow.setImage(bufferedImage);
						pictureShowWindow.repaint();				
					}
				});
			}
		}
	}
	
	private void setButtonEnable(boolean bln) {
	    snapBtn.setEnabled(bln);
		leftUpBtn.setEnabled(bln);
		upBtn.setEnabled(bln);
		rightUpBtn.setEnabled(bln);
		leftBtn.setEnabled(bln);
		rightBtn.setEnabled(bln);
		leftDownBtn.setEnabled(bln);
		downBtn.setEnabled(bln);
		rightDownBtn.setEnabled(bln);
		zoomAddBtn.setEnabled(bln);
		zoomDecBtn.setEnabled(bln);
		focusAddBtn.setEnabled(bln);
		focusDecBtn.setEnabled(bln);
		irisAddBtn.setEnabled(bln);
		irisDecBtn.setEnabled(bln);		  
		speedComboBox.setEnabled(bln);
		realPlayWindow.setEnabled(bln);
		chnComboBox.setEnabled(bln);
		streamComboBox.setEnabled(bln);
		realplayBtn.setEnabled(bln);
	}
	
	/*
	 * 登录
	 */
	private LoginPanel loginPanel;	
	
	/*
	 * 预览
	 */
    private RealPanel realPanel;
    private JPanel realplayPanel;
    private Panel realPlayWindow;
    private Panel channelPanel;
    
    private JLabel chnlabel;
    private JComboBox chnComboBox;	
    private JLabel streamLabel;
    private JComboBox streamComboBox;
    private JButton realplayBtn;
    private JButton snapBtn;
    
    /*
     * 抓图与云台
     */
    private PTZ_PICPanel ptz_picPanel;
	private PICPanel picPanel;
	private JPanel pictureShowPanel;
	private JPanel snapPanel;
	private PaintPanel pictureShowWindow;
	
    /*
     * 云台
     */
    private PTZPanel ptzPanel;
	private JPanel directionPanel;
	private JPanel ptzCtrlPanel;
	private JButton leftUpBtn;
	private JButton upBtn;
	private JButton rightUpBtn;
	private JButton leftBtn;
	private JButton rightBtn;
	private JButton leftDownBtn;
	private JButton downBtn;
	private JButton rightDownBtn;
	private JComboBox speedComboBox;
	private JLabel operateJLabel;
	
	private JButton zoomAddBtn;
	private JButton zoomDecBtn;
	private JButton focusAddBtn;
	private JButton focusDecBtn;
	private JButton irisAddBtn;
	private JButton irisDecBtn;
}

public class PTZControl {  
	public static void main(String[] args) {	
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				PTZControlFrame demo = new PTZControlFrame();	
				demo.setVisible(true);
			}
		});		
	}
}