/**
* $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.ui;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import net.java.sipmack.common.Log;
import net.java.sipmack.sip.InterlocutorUI;
import net.java.sipmack.softphone.SoftPhoneManager;
import net.java.sipmack.softphone.listeners.InterlocutorListener;
import org.jivesoftware.resource.Default;
import org.jivesoftware.smackx.packet.VCard;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.component.RolloverButton;
import org.jivesoftware.spark.phone.Phone;
import org.jivesoftware.spark.phone.PhoneManager;
import org.jivesoftware.spark.plugin.phone.resource.PhoneRes;
import org.jivesoftware.spark.ui.ContactInfoWindow;
import org.jivesoftware.spark.util.ModelUtil;
import org.jivesoftware.sparkplugin.callhistory.HistoryCall;
import org.jivesoftware.sparkplugin.phonebook.ui.PhonebookUI;
import org.jivesoftware.sparkplugin.ui.call.CallHistoryUI;
import org.jivesoftware.sparkplugin.ui.call.CallManager;
/**
*
*/
public class ContactDialControl extends JPanel implements InterlocutorListener, Phone {
private static final long serialVersionUID = 8848248512306073866L;
private TelephoneTextField callField;
private RolloverButton callButton;
private RolloverButton callHistoryButton;
private RolloverButton voiceMailButton;
private boolean incomingCall;
private static final JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
public ContactDialControl() {
setLayout(new GridBagLayout());
// Add to PhoneManager.
PhoneManager.getInstance().addPhone(this);
callField = new TelephoneTextField();
voiceMailButton = new RolloverButton(PhoneRes.getImageIcon("VOICEMAIL_IMAGE"));
// make a button for the phonebook
RolloverButton phonebookButton = new RolloverButton(PhoneRes.getImageIcon("BOOKICON"));
phonebookButton.setToolTipText(PhoneRes.getIString("frame.title"));
callButton = new RolloverButton(PhoneRes.getImageIcon("DIAL_BUTTON_IMAGE"));
callButton.setMargin(new Insets(0, 0, 0, 0));
callButton.setDisabledIcon(PhoneRes.getImageIcon("DIAL_BUTTON_DISABLED_IMAGE"));
callHistoryButton = new RolloverButton(PhoneRes.getImageIcon("HISTORY_IMAGE"));
// Create Dial Section
final JLabel callLabel = new JLabel(PhoneRes.getIString("phone.call")+":");
callLabel.setForeground(new Color(64, 103, 162));
callLabel.setFont(new Font("Dialog", Font.BOLD, 11));
add(callLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 2, 2, 2), 0, 0));
add(callField, new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 2, 2, 2), 0, 0));
add(callButton, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 2, 2, 2), 0, 0));
buttonPanel.add(phonebookButton);
buttonPanel.add(new JLabel(PhoneRes.getImageIcon("DIVIDER_IMAGE")));
buttonPanel.add(callHistoryButton);
buttonPanel.add(voiceMailButton);
buttonPanel.setOpaque(false);
add(buttonPanel, new GridBagConstraints(4, 2, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 2, 0, 2), 0, 0));
voiceMailButton.setToolTipText(PhoneRes.getIString("phone.call"));
callHistoryButton.setToolTipText(PhoneRes.getIString("phone.viewcallhistory"));
voiceMailButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
final SoftPhoneManager phoneManager = SoftPhoneManager.getInstance();
String voiceMailNumber = phoneManager.getSipAccount().getVoiceMailNumber();
if (ModelUtil.hasLength(voiceMailNumber)) {
phoneManager.getDefaultGuiManager().dial(voiceMailNumber);
}
}
});
callButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
placeCall();
}
});
phonebookButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
EventQueue.invokeLater(new Runnable(){
public void run() {
// open the UI
PhonebookUI book = PhonebookUI.getInstance();
book.invoke();
}
});
}
catch(Exception ex) {
Log.error(ex);
}
}
});
callHistoryButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showCallList();
}
});
setOpaque(false);
// Set Line Border
setBorder(BorderFactory.createLineBorder(new Color(197, 213, 230), 1));
Font font = new Font("Dialog", Font.BOLD, 11);
voiceMailButton.setFont(font);
voiceMailButton.setHorizontalTextPosition(JButton.RIGHT);
// Listen for creation of new Interlocutor
SoftPhoneManager.getInstance().addInterlocutorListener(this);
callField.getTextComponent().addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent caretEvent) {
callButton.setEnabled(ModelUtil.hasLength(callField.getText()) && callField.isEdited());
callField.validateTextField();
}
});
callField.getTextComponent().addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
if (!callField.getTextComponent().isEnabled() || !callField.isEdited() || !ModelUtil.hasLength(callField.getText())) {
return;
}
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
placeCall();
}
}
});
callButton.setEnabled(false);
// Initialize CallManager.
CallManager.getInstance();
}
private void placeCall() {
if (incomingCall) {
SoftPhoneManager.getInstance().getDefaultGuiManager().answer();
enableIt(false);
}
else {
final SoftPhoneManager phoneManager = SoftPhoneManager.getInstance();
if (phoneManager.getInterlocutors().size() > 0) {
phoneManager.getDefaultGuiManager().hangupAll();
}
else {
phoneManager.getDefaultGuiManager().dial(callField.getText());
}
}
}
public void setVoiceMailLabel(String text) {
voiceMailButton.setText(text);
}
public void setVoiceMailDescription(String description) {
voiceMailButton.setToolTipText(description);
}
public void paintComponent(Graphics g) {
final Image backgroundImage = Default.getImageIcon(Default.TOP_BOTTOM_BACKGROUND_IMAGE).getImage();
double scaleX = getWidth() / (double)backgroundImage.getWidth(null);
double scaleY = getHeight() / (double)backgroundImage.getHeight(null);
AffineTransform xform = AffineTransform.getScaleInstance(scaleX, scaleY);
((Graphics2D)g).drawImage(backgroundImage, xform, this);
}
public void interlocutorAdded(InterlocutorUI ic) {
String callState = ic.getCallState();
if (!ModelUtil.hasLength(callState)) {
incomingCall = true;
callField.getTextComponent().setEnabled(false);
callButton.setEnabled(true);
callButton.setToolTipText("Place phone call.");
}
else {
incomingCall = false;
showOnCall();
}
if (!callField.isEdited()) {
callField.setText(ic.getCall().getNumber());
}
}
public void interlocutorRemoved(InterlocutorUI interlocutorUI) {
enableIt(true);
incomingCall = false;
//callField.reset();
}
private void enableIt(boolean enable) {
callField.getTextComponent().setEnabled(enable);
callButton.setEnabled(enable);
callButton.setIcon(PhoneRes.getImageIcon("DIAL_BUTTON_IMAGE"));
if (enable) {
callButton.setToolTipText(PhoneRes.getIString("phone.placecall"));
}
}
private void showOnCall() {
callField.getTextComponent().setEnabled(false);
callButton.setIcon(PhoneRes.getImageIcon("HANG_UP_PHONE_IMAGE"));
callButton.setToolTipText(PhoneRes.getIString("phone.tips.hangup"));
}
private void showCallList() {
CallHistoryUI callHistory = new CallHistoryUI();
callHistory.invoke();
}
final Comparator<HistoryCall> itemComparator = new Comparator<HistoryCall>() {
public int compare(HistoryCall contactItemOne, HistoryCall contactItemTwo) {
final HistoryCall time1 = contactItemOne;
final HistoryCall time2 = contactItemTwo;
if (time1.getTime() < time2.getTime()) {
return 1;
}
else if (time1.getTime() > time2.getTime()) {
return -1;
}
return 0;
}
};
/**
* Used as the action to place Calls.
*/
private class CallAction extends AbstractAction {
private static final long serialVersionUID = -6558494299123278779L;
private String number;
public CallAction(String label, String number, Icon icon) {
this.number = number;
putValue(Action.NAME, "<html><b>" + label + "</b> " + number + "</html>");
putValue(Action.SMALL_ICON, icon);
}
public void actionPerformed(ActionEvent e) {
callField.setText(number);
placeCall();
}
}
public void handleContactInfo(final ContactInfoWindow contactInfo) {
}
public Collection<Action> getPhoneActions(String jid) {
if(!isVisible()){
return Collections.emptyList();
}
final VCard vcard = SparkManager.getVCardManager().getVCardFromMemory(jid);
final List<Action> actions = new ArrayList<Action>();
final String workNumber = vcard.getPhoneWork("VOICE");
final String homeNumber = vcard.getPhoneHome("VOICE");
final String cellNumber = vcard.getPhoneWork("CELL");
if (ModelUtil.hasLength(homeNumber)) {
Action dialHomeAction = new CallAction(PhoneRes.getIString("phone.home")+":", homeNumber, PhoneRes.getImageIcon("HOME_IMAGE"));
actions.add(dialHomeAction);
}
if (ModelUtil.hasLength(workNumber)) {
final Action dialWorkAction = new CallAction(PhoneRes.getIString("phone.work")+":", workNumber, PhoneRes.getImageIcon("WORK_IMAGE"));
actions.add(dialWorkAction);
}
if (ModelUtil.hasLength(cellNumber)) {
final Action dialCellAction = new CallAction(PhoneRes.getIString("phone.cell")+":", cellNumber, PhoneRes.getImageIcon("MOBILE_IMAGE"));
actions.add(dialCellAction);
}
return actions;
}
public TelephoneTextField getCallField() {
return callField;
}
public static void addButton(JButton btn) {
buttonPanel.add(btn);
}
}