/** * $RCSfile: ,v $ * $Revision: $ * $Date: $ * * Copyright (C) 2004-2011 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.sparkplugin; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smackx.jingle.JingleSession; import org.jivesoftware.smackx.jingle.media.JingleMediaManager; import org.jivesoftware.spark.ChatManager; import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.component.RolloverButton; import org.jivesoftware.spark.component.tabbedPane.SparkTab; import org.jivesoftware.spark.ui.ChatRoom; import org.jivesoftware.spark.util.log.Log; /** * The UI for calls with Roster members. * * @author Derek DeMoro */ public class JingleRoom extends JPanel { private static final long serialVersionUID = 2910998210426650565L; private JLabel connectedLabel; private String phoneNumber; private JLabel phoneLabel; private PreviousConversationPanel historyPanel; private boolean transmitting; private CallPanelButton muteButton; private RolloverButton hangUpButton; private static String CONNECTED = "Connected"; protected final Color greenColor = new Color(91, 175, 41); protected final Color orangeColor = new Color(229, 139, 11); protected final Color blueColor = new Color(64, 103, 162); protected final Color redColor = new Color(211, 0, 0); private boolean callWasTransferred; private ChatRoom chatRoom; private JingleSession session; private JavaMixer mixer = new JavaMixer(); public JingleRoom(JingleSession session, ChatRoom chatRoom) { this.session = session; this.chatRoom = chatRoom; setLayout(new GridBagLayout()); setBorder(BorderFactory.createLineBorder(Color.lightGray)); // Build Top Layer final JPanel topPanel = buildTopPanel(); add(topPanel, new GridBagConstraints(1, 5, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(2, 2, 2, 2), 0, 0)); // Build Control Panel final JPanel controlPanel = buildControlPanel(); add(controlPanel, new GridBagConstraints(1, 6, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(2, 2, 2, 2), 0, 0)); // Add Previous Conversation historyPanel = new PreviousConversationPanel(); historyPanel.addPreviousConversations(""); // add(historyPanel, new GridBagConstraints(1, 8, 1, 1, 0.0, 1.0, GridBagConstraints.SOUTH, GridBagConstraints.BOTH, new Insets(2, 2, 2, 2), 0, 100)); // Setup default settings setupDefaults(); } /** * Builds the information block. * * @return the UI representing the Information Block. */ private JPanel buildTopPanel() { final JPanel panel = new JPanel(new GridBagLayout()); panel.setOpaque(false); // Add phone label phoneLabel = new JLabel(); phoneLabel.setFont(new Font("Arial", Font.BOLD, 13)); phoneLabel.setForeground(new Color(64, 103, 162)); panel.add(phoneLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 2, 2, 2), 0, 0)); // Add Connected Label connectedLabel = new JLabel(CONNECTED); connectedLabel.setFont(new Font("Arial", Font.BOLD, 13)); connectedLabel.setHorizontalTextPosition(JLabel.CENTER); connectedLabel.setHorizontalAlignment(JLabel.CENTER); panel.add(connectedLabel, new GridBagConstraints(0, 1, 2, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 2, 2, 2), 0, 0)); return panel; } /** * Builds the Control Panel. * * @return the control panel. */ private JPanel buildControlPanel() { // Add Control Panel final JPanel mainPanel = new JPanel(new GridBagLayout()); mainPanel.setOpaque(false); // Add Volume Control try { final ControlPanel inputPanel = new ControlPanel(new GridBagLayout()); Component inputComp = mixer.getPrefferedInputVolume(); if (inputComp != null) { final JLabel inputIcon = new JLabel(JinglePhoneRes.getImageIcon("MICROPHONE_IMAGE")); inputPanel.add(inputComp, new GridBagConstraints(0, 0, 1, 1, 0.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.VERTICAL, new Insets(2, 2, 2, 2), 0, 0)); inputPanel.add(inputIcon, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); mainPanel.add(inputPanel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.2, GridBagConstraints.NORTHWEST, GridBagConstraints.VERTICAL, new Insets(2, 1, 2, 1), 0, 50)); } } catch (Exception e) { Log.error(e); } // Add master volume control. try { final ControlPanel outputPanel = new ControlPanel(new GridBagLayout()); Component outputControl = mixer.getPrefferedMasterVolume(); if (outputControl!=null) { final JLabel outputIcon = new JLabel(JinglePhoneRes.getImageIcon("SPEAKER_IMAGE")); outputPanel.add(outputControl, new GridBagConstraints(0, 0, 1, 1, 0.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.VERTICAL, new Insets(2, 2, 2, 2), 0, 0)); outputPanel.add(outputIcon, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); mainPanel.add(outputPanel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.2, GridBagConstraints.NORTHWEST, GridBagConstraints.VERTICAL, new Insets(2, 1, 2, 1), 0, 50)); } } catch (Exception e) { Log.error(e); } // Build ControlPanel List muteButton = new CallPanelButton(JinglePhoneRes.getImageIcon("MUTE_IMAGE").getImage(), "Mute"); muteButton.setToolTipText(JingleResources.getString("label.mute.call")); // Add Components to Main Panel mainPanel.add(muteButton, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 1, 2, 1), 0, 0)); // Add End Call button hangUpButton = new RolloverButton(" End Call", JinglePhoneRes.getImageIcon("HANG_UP_PHONE_77x24_IMAGE")); hangUpButton.setHorizontalTextPosition(JLabel.CENTER); hangUpButton.setFont(new Font("Dialog", Font.BOLD, 11)); hangUpButton.setForeground(new Color(153, 32, 10)); hangUpButton.setMargin(new Insets(0, 0, 0, 0)); mainPanel.add(hangUpButton, new GridBagConstraints(0, 1, 3, 1, 0.0, 0.8, GridBagConstraints.SOUTH, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); return mainPanel; } public void setupDefaults() { muteButton.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent mouseEvent) { toggleMute(); } }); hangUpButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { hangUpButton.setEnabled(false); try { session.terminate(); } catch (XMPPException e) { e.printStackTrace(); } } }); } /** * Called when a new call is established. */ //TODO REMOVE @SuppressWarnings("unused") private void callStarted() { // Show History historyPanel.removeAll(); historyPanel.addPreviousConversations(phoneNumber); hangUpButton.setEnabled(true); muteButton.setEnabled(true); setStatus(CONNECTED, false); // Add notification to ChatRoom if one exists. if (chatRoom != null) { final SimpleDateFormat formatter = new SimpleDateFormat("h:mm a"); String time = formatter.format(new Date()); chatRoom.getTranscriptWindow().insertNotificationMessage("Call started at " + time, ChatManager.NOTIFICATION_COLOR); } } /** * Called when the call is ended. This does basic container cleanup. */ public void callEnded() { if (!callWasTransferred) { historyPanel.callEnded(); setStatus("Call Ended", redColor); } hangUpButton.setEnabled(false); hangUpButton.setOpaque(false); muteButton.setEnabled(false); muteButton.setOpaque(false); setStatus("Call Ended", redColor); // Add notification to ChatRoom if one exists. if (chatRoom != null) { final SimpleDateFormat formatter = new SimpleDateFormat("h:mm a"); String time = formatter.format(new Date()); chatRoom.getTranscriptWindow().insertNotificationMessage("Call ended at " + time, ChatManager.NOTIFICATION_COLOR); } } private void setStatus(String status, boolean alert) { if (alert) { connectedLabel.setForeground(orangeColor); } else { connectedLabel.setForeground(greenColor); } connectedLabel.setText(status); } private void setStatus(String status, Color color) { connectedLabel.setForeground(color); connectedLabel.setText(status); } private void toggleMute() { if (transmitting) { transmitting = false; muteButton.setToolTipText(JingleResources.getString("label.mute")); muteButton.setButtonSelected(false); setStatus(CONNECTED, false); // Change state JingleStateManager.getInstance().addJingleSession(chatRoom, JingleStateManager.JingleRoomState.inJingleCall); } else { transmitting = true; muteButton.setToolTipText(JingleResources.getString("label.unmute")); muteButton.setButtonSelected(true); setStatus("Muted", true); // Change state JingleStateManager.getInstance().addJingleSession(chatRoom, JingleStateManager.JingleRoomState.muted); } for (JingleMediaManager mediaManager : session.getMediaManagers()) { session.getMediaSession(mediaManager.getName()).setTrasmit(!transmitting); } muteButton.invalidate(); muteButton.validate(); muteButton.repaint(); // Notify state change SparkManager.getChatManager().notifySparkTabHandlers(chatRoom); } public void actionPerformed(ActionEvent e) { } public void paintComponent(Graphics g) { BufferedImage cache = new BufferedImage(2, getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g2d = cache.createGraphics(); GradientPaint paint = new GradientPaint(0, 0, new Color(241, 245, 250), 0, getHeight(), new Color(244, 250, 255), true); g2d.setPaint(paint); g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.dispose(); g.drawImage(cache, 0, 0, getWidth(), getHeight(), null); } public Dimension getPreferredSize() { Dimension dim = super.getPreferredSize(); dim.width = 200; return dim; } public SparkTab getSparkTab() { int index = SparkManager.getChatManager().getChatContainer().indexOfComponent(chatRoom); return SparkManager.getChatManager().getChatContainer().getTabAt(index); } }