/**
* $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 org.jivesoftware.sparkplugin.components.DialButton;
import net.java.sipmack.common.DialSoundManager;
import net.java.sipmack.softphone.SoftPhoneManager;
import org.jivesoftware.spark.component.BackgroundPanel;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JPopupMenu;
/**
*
*/
public class PhonePad extends BackgroundPanel {
private static final long serialVersionUID = 1059979750263197335L;
private TelephoneTextField callField;
final List<DialButton> list = new ArrayList<DialButton>();
private JPopupMenu menu;
private DialSoundManager dialSoundManager;
public PhonePad() {
setLayout(new GridBagLayout());
setOpaque(false);
// Create First Row
DialButton oneButton = new DialButton("", new DigitAction("1"));
DialButton twoButton = new DialButton("ABC", new DigitAction("2"));
DialButton threeButton = new DialButton("DEF", new DigitAction("3"));
add(oneButton, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
add(twoButton, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
add(threeButton, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
// Create Second Row
DialButton fourButton = new DialButton("GHI", new DigitAction("4"));
DialButton fiveButton = new DialButton("JKL", new DigitAction("5"));
DialButton sixButton = new DialButton("MNO", new DigitAction("6"));
add(fourButton, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
add(fiveButton, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
add(sixButton, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
// Create Third Row
DialButton sevenButton = new DialButton("PQRS", new DigitAction("7"));
DialButton eightButton = new DialButton("TUV", new DigitAction("8"));
DialButton nineButton = new DialButton("WXYZ", new DigitAction("9"));
add(sevenButton, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
add(eightButton, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
add(nineButton, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
// Create fourth Row
DialButton asterisksButton = new DialButton("", new DigitAction("*"));
DialButton zeroButton = new DialButton("", new DigitAction("0"));
DialButton poundButton = new DialButton("", new DigitAction("#"));
add(asterisksButton, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
add(zeroButton, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
add(poundButton, new GridBagConstraints(2, 4, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
list.add(zeroButton);
list.add(oneButton);
list.add(twoButton);
list.add(threeButton);
list.add(fourButton);
list.add(fiveButton);
list.add(sixButton);
list.add(sevenButton);
list.add(eightButton);
list.add(nineButton);
list.add(asterisksButton);
list.add(poundButton);
setBorder(BorderFactory.createLineBorder(new Color(197, 213, 230)));
addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent keyEvent) {
if (keyEvent.getKeyChar() == KeyEvent.VK_ESCAPE) {
menu.setVisible(false);
}
else {
numberEntered(keyEvent.getKeyChar());
}
}
});
this.dialSoundManager = SoftPhoneManager.getInstance().getDTMFSounds();
}
public String getNumber() {
return callField.getText();
}
public void setNumber(String number) {
callField.setText(number);
}
public void numberEntered(char ch) {
String number = String.valueOf(ch);
for (DialButton button : list) {
String name = button.getNumber();
if (name.equals(number)) {
// TH: trying to improve responsiveness of the DTMF playback.
button.setBlock(true);
dialSoundManager.enqueue(name);
button.doClick();
button.setBlock(false);
}
}
}
/**
* Private Class that handles the Digit Button actions
*/
private class DigitAction extends AbstractAction {
private static final long serialVersionUID = -6295794038544034901L;
public DigitAction(String name) {
super(name);
}
public void actionPerformed(ActionEvent e) {
final String number = getValue(Action.NAME).toString();
// TH: trying to improve responsiveness of DTMF playback.
dialSoundManager.enqueue(number);
if (callField != null) {
callField.appendNumber(number);
}
SoftPhoneManager.getInstance().getDefaultGuiManager().sendDTMF(number);
}
}
public void showDialpad(TelephoneTextField callField) {
menu = new JPopupMenu();
menu.setFocusable(false);
menu.add(this);
menu.pack();
this.callField = callField;
menu.show(callField, 0, callField.getHeight());
}
public void showDialpad(Component comp, boolean rightAligned) {
menu = new JPopupMenu();
menu.setFocusable(false);
menu.add(this);
menu.pack();
if (rightAligned) {
int width = (int)menu.getPreferredSize().getWidth();
menu.show(comp, -width + comp.getWidth(), comp.getHeight());
}
else {
menu.show(comp, 0, comp.getHeight());
}
this.requestFocus();
}
public void hide(){
if(menu != null){
menu.setVisible(false);
}
}
}