package pandaAgent; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.util.LinkedList; import java.util.Queue; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.auth.AuthScope; import org.apache.http.auth.Credentials; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.impl.client.DefaultHttpClient; public class PandaAgent extends JFrame implements Runnable, ActionListener { // Fixed Parameter private final int windowSizeX = 640; private final int windowSizeY = 400; private final int clockPanelSizeX = 240; private final int clockPanelSizeY = 40; private final int pandaSizeX = 240; private final int pandaSizeY = 380; private final int speakSpeed = 50; private final int speakQueueSize = 10; private final int speakMouthSwitchSpeed = 3; private final int pandaSleep = 100; // Variable Parameter private boolean isProxyEnable = false; private String proxyHost = ""; private int proxyPort = 8080; private String proxyUsername = ""; private String proxyPassword = ""; // String private final String helloString = "Hello, how are you??"; // Component private final BorderLayout balloonInternalLayout = new BorderLayout(); private final FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 0, 0); private final Container contentPane = this.getContentPane(); private final ImagePanel balloonPanel = new ImagePanel("/pandaAgent/balloon.png"); private final JPanel rightPanel = new JPanel(); private final ClockPanel clockPanel = new ClockPanel(); private final ImagePanel pandaPanel = new ImagePanel("/pandaAgent/panda_agent_close.png"); private final JLabel pandaMessageLabel = new JLabel(); private final JPanel balloonLeftPadding = new JPanel(); // Menu private final JMenuBar menuBar = new JMenuBar(); private final JMenu menuPanda = new JMenu("Panda"); private final JMenuItem menuItemHello = new JMenuItem("Hello"); private final JMenu menuPreference = new JMenu("Preference"); private final JMenuItem menuItemNetwork = new JMenuItem("Network..."); private final JMenuItem menuItemForTest1 = new JMenuItem("Test1"); private final JMenuItem menuItemExit = new JMenuItem("Good bye"); // Popup private final JPopupMenu pandaPopup = new JPopupMenu(); // Other private static final long serialVersionUID = -6637964777080358948L; private final Queue<String> speakQueue = new LinkedList<String>(); private final Thread clockThread = new Thread(clockPanel); private final Mouse mouse; private final NetworkDialog networkDialog = new NetworkDialog(this); private boolean isPandaSpeakStop = false; /** * Show popup menu * * @param me mouse event for location information * @return none */ public void showPopup(MouseEvent me) { pandaPopup.show(me.getComponent(), me.getX(), me.getY()); } /** * Request panda to speak. * * @param requestPhrase Panda speaks this phrase, not null * @return when speak queue is full, returns false */ public boolean speakRequest(String requestPhrase) { if (null == requestPhrase) { throw new NullPointerException("Please give phrase. "); } if (speakQueue.size() < speakQueueSize) { speakQueue.add(requestPhrase); return true; } else { return false; } } /** * getHttpRequestReponse */ public HttpResponse getHttpResponse(String targetURL) throws IOException, ClientProtocolException { DefaultHttpClient httpClient = new DefaultHttpClient(); if (isProxyEnable) { HttpHost proxy = null; proxy = new HttpHost(proxyHost, proxyPort, "http"); httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); Credentials credentials = new UsernamePasswordCredentials(proxyUsername, proxyPassword); AuthScope scope = new AuthScope(proxyHost, proxyPort); httpClient.getCredentialsProvider().setCredentials(scope, credentials); } HttpGet request = new HttpGet(targetURL); HttpResponse httpResponse = null; try { httpResponse = httpClient.execute(request); } catch (ClientProtocolException e) { throw new ClientProtocolException("In getHttpResponse"); } catch (IOException e) { throw new IOException("In getHttpResponse"); } return httpResponse; } // Constructor public PandaAgent() { // Set title super("Panda Agent"); // To close window addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); // Initialize menu bar menuBar.add(menuPanda); menuBar.add(menuPreference); menuPanda.add(menuItemHello); menuItemHello.addActionListener(this); menuPreference.add(menuItemNetwork); menuItemNetwork.addActionListener(this); // For Test menuPanda.add(menuItemForTest1); menuItemForTest1.addActionListener(this); // Initialaize window this.setUndecorated(true); this.setVisible(true); this.setVisible(false); this.setAlwaysOnTop(true); this.setSize(windowSizeX + this.getInsets().left + this.getInsets().right, windowSizeY + this.getInsets().top); this.setResizable(false); // this.setJMenuBar(menuBar); this.setVisible(true); contentPane.setLayout(flowLayout); this.setLayout(flowLayout); // Create Panel balloonPanel.setPreferredSize(new Dimension(windowSizeX - pandaSizeX - 5, windowSizeY)); contentPane.add(balloonPanel); rightPanel.setPreferredSize(new Dimension(pandaSizeX, windowSizeY)); contentPane.add(rightPanel); clockPanel.setPreferredSize(new Dimension(clockPanelSizeX, clockPanelSizeY)); clockThread.start(); rightPanel.setLayout(flowLayout); rightPanel.add(clockPanel); pandaPanel.setPreferredSize(new Dimension(pandaSizeX, pandaSizeY)); rightPanel.add(pandaPanel); balloonPanel.setLayout(balloonInternalLayout); balloonLeftPadding.setPreferredSize(new Dimension(100, 100)); balloonLeftPadding.setOpaque(false); balloonPanel.add("West", balloonLeftPadding); balloonPanel.add("Center", pandaMessageLabel); // Initialze Popup pandaPopup.add(menuPanda); pandaPopup.add(menuPreference); pandaPopup.add(menuItemExit); menuItemExit.addActionListener(this); // Other mouse = new Mouse(this); this.addMouseListener(mouse); this.addMouseMotionListener(mouse); // refresh this.setVisible(false); this.setVisible(true); } private synchronized void speak(String givenPhrase) { StringBuilder speakPhrase = new StringBuilder(); boolean isMouthOpen = true; try { for (int i = 0; i < givenPhrase.length(); i++) { speakPhrase.append(givenPhrase.charAt(i)); pandaMessageLabel.setText(speakPhrase.toString()); Thread.sleep(speakSpeed); if ((i % speakMouthSwitchSpeed) == 0) { if (isMouthOpen) { pandaPanel.changeImage("/pandaAgent/panda_agent_close.png"); isMouthOpen = false; } else { pandaPanel.changeImage("/pandaAgent/panda_agent_open.png"); isMouthOpen = true; } } else { // do nothind } pandaPanel.repaint(); } isPandaSpeakStop = true; while(isPandaSpeakStop) { Thread.sleep(1000); } pandaMessageLabel.setText(""); pandaPanel.changeImage("/pandaAgent/panda_agent_close.png"); isMouthOpen = false; } catch (Exception e) { System.out.println(e); } } @Override public void run() { String speak = null; while(true) { try { Thread.sleep(pandaSleep); } catch(Exception e) { System.out.println(e); } speak = speakQueue.poll(); if (null != speak) { this.speak(speak); } else { ; // nothig } } } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == menuItemHello) { speakRequest(helloString); } if (e.getSource() == menuItemNetwork) { networkDialog.setVisible(true); } if (e.getSource() == menuItemForTest1) { try { System.out.println(getHttpResponse("http://panda.holy.jp")); } catch(Exception ex) { System.out.println("Exception in Test1: " + ex); } } if (e.getSource() == menuItemExit) { System.exit(0); } } public final boolean isProxyEnable() { return isProxyEnable; } public final void setProxyEnable(boolean isProxyEnable) { this.isProxyEnable = isProxyEnable; } public final String getProxyHost() { return proxyHost; } public final void setProxyHost(String proxyHost) { this.proxyHost = proxyHost; } public final int getProxyPort() { return proxyPort; } public final void setProxyPort(int proxyPort) { this.proxyPort = proxyPort; } public final String getProxyUsername() { return proxyUsername; } public final void setProxyUsername(String proxyUsername) { this.proxyUsername = proxyUsername; } public final String getProxyPassword() { return proxyPassword; } public final void setProxyPassword(String proxyPassword) { this.proxyPassword = proxyPassword; } public final boolean isPandaSpeakStop() { return isPandaSpeakStop; } public final void setPandaSpeakStop(boolean isPandaSpeakStop) { this.isPandaSpeakStop = isPandaSpeakStop; } public static void main(String[] args) { PandaAgent panda = new PandaAgent(); Thread mainThread = new Thread(panda); mainThread.start(); } }