diff --git a/src/net/java/sip/communicator/impl/gui/customcontrols/SIPCommSmartComboBox.java b/src/net/java/sip/communicator/impl/gui/customcontrols/SIPCommSmartComboBox.java
index ddc6a8d32..53780969f 100644
--- a/src/net/java/sip/communicator/impl/gui/customcontrols/SIPCommSmartComboBox.java
+++ b/src/net/java/sip/communicator/impl/gui/customcontrols/SIPCommSmartComboBox.java
@@ -173,8 +173,8 @@ public boolean accept(Object o)
}
public class CallComboEditor
- implements ComboBoxEditor,
- DocumentListener
+ implements ComboBoxEditor,
+ DocumentListener
{
private JTextField text;
private volatile boolean filtering = false;
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallComboBox.java b/src/net/java/sip/communicator/impl/gui/main/call/CallComboBox.java
index 5ca1251c6..c86699386 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/CallComboBox.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/CallComboBox.java
@@ -1,25 +1,28 @@
/*
* SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
- *
+ *
* Distributable under LGPL license. See terms of license at gnu.org.
*/
package net.java.sip.communicator.impl.gui.main.call;
import java.awt.event.*;
+import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
+import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.customcontrols.*;
import net.java.sip.communicator.impl.gui.lookandfeel.*;
import net.java.sip.communicator.impl.gui.main.contactlist.*;
+import net.java.sip.communicator.service.callhistory.*;
import net.java.sip.communicator.service.contactlist.*;
/**
* The CallComboBox is a history editable combo box that is
* positioned above call and hangup buttons and is used when writing a number or
* a contact name in order to be called.
- *
+ *
* @author Yana Stamcheva
*/
public class CallComboBox
@@ -28,14 +31,16 @@ public class CallComboBox
DocumentListener,
FocusListener
{
- public final static int MAX_COMBO_SIZE = 10;
+ public final static int MAX_HISTORY_SIZE = 30;
private final MainCallPanel parentCallPanel;
+ private LoadLastCallsFromHistory callHistoryLoadThread = null;
+
/**
* Creates a CallComboBox by specifying the parent panel, where
* this combo box will be placed.
- *
+ *
* @param parentCallPanel The parent panel.
*/
public CallComboBox(MainCallPanel parentCallPanel)
@@ -55,13 +60,16 @@ public CallComboBox(MainCallPanel parentCallPanel)
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "createCall");
textField.addFocusListener(this);
+
+ callHistoryLoadThread = new LoadLastCallsFromHistory();
+ SwingUtilities.invokeLater(callHistoryLoadThread);
}
/**
* Checks if this combobox editor field is empty. This will be the case if
* the user hasn't selected an item from the combobox and hasn't written
* anything the field.
- *
+ *
* @return TRUE if the combobox editor field is empty, otherwise FALSE
*/
public boolean isComboFieldEmpty()
@@ -96,7 +104,7 @@ public void changedUpdate(DocumentEvent e)
}
/**
- * Enables or disabled the call button according to the content in the combo
+ * Enables or disables the call button according to the content in the combo
* box editor field.
*/
protected void handleChange()
@@ -132,6 +140,7 @@ protected void handleChange()
public void focusGained(FocusEvent e)
{
+ SwingUtilities.invokeLater(callHistoryLoadThread);
this.handleChange();
}
@@ -159,4 +168,51 @@ public void actionPerformed(ActionEvent e)
}
}
}
+
+ /**
+ * We use this thread to load the last MAX_HISTORY_SIZE calls from the
+ * call history and insert all unique entries in our data model. The point
+ * is to propose auto completion when users start dialing numbers.
+ */
+ private class LoadLastCallsFromHistory extends Thread
+ {
+ /**
+ * Executes a query for the last MAX_HISTORY_SIZE calls against the
+ * call history service and then adds all unique entries to our data
+ * model.
+ */
+ public void run()
+ {
+ CallHistoryService callHistory
+ = GuiActivator.getCallHistoryService();
+
+ if (callHistory == null)
+ return;
+
+ Collection historyCalls
+ = callHistory.findLast(MAX_HISTORY_SIZE);
+
+ FilterableComboBoxModel callComboModel
+ = (FilterableComboBoxModel)getModel();
+
+ for (CallRecord call : historyCalls)
+ {
+ List callParticipantRecords
+ = call.getParticipantRecords();
+
+ //extract all call participants for that call.
+ for (CallParticipantRecord cpRecord
+ : callParticipantRecords)
+ {
+ String participant = cpRecord.getParticipantAddress();
+
+ if(!callComboModel.contains(participant))
+ {
+ callComboModel
+ .addElement(participant);
+ }
+ }
+ }
+ }
+ }
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/MainCallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/MainCallPanel.java
index e90f7c590..e66232fe1 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/MainCallPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/MainCallPanel.java
@@ -30,7 +30,7 @@
/**
* The panel containing the call field and button, serving to make calls.
- *
+ *
* @author Yana Stamcheva
*/
public class MainCallPanel
@@ -188,8 +188,7 @@ public void actionPerformed(ActionEvent evt)
else if (!phoneNumberCombo.isComboFieldEmpty())
{
// if no contact is selected checks if the user has chosen
- // or has
- // writen something in the phone combo box
+ // or has writen something in the phone combo box
String stringContact = phoneNumberCombo.getEditor()
.getItem().toString();
@@ -221,7 +220,7 @@ else if (buttonName.equals(DIAL_BUTTON))
/**
* Returns the main application window, which is the parent of this panel.
- *
+ *
* @return the main application window, which is the parent of this panel.
*/
public MainFrame getMainFrame()
@@ -231,7 +230,7 @@ public MainFrame getMainFrame()
/**
* Sets the protocol provider to be used for making calls.
- *
+ *
* @param protocolProvider the protocol provider to be used for making calls.
*/
public ProtocolProviderService getCallProvider()
@@ -241,7 +240,7 @@ public ProtocolProviderService getCallProvider()
/**
* Sets the protocol provider to be used for making calls.
- *
+ *
* @param protocolProvider the protocol provider to be used for making calls.
*/
public void setCallProvider(ProtocolProviderService protocolProvider)
@@ -253,7 +252,7 @@ public void setCallProvider(ProtocolProviderService protocolProvider)
* Sets the isCallMetaContact variable to TRUE or FALSE. This defines if
* this call is a call to a given meta contact selected from the contact
* list or a call to an external contact or phone number.
- *
+ *
* @param isCallMetaContact TRUE to define this call as a call to an
* internal meta contact and FALSE to define it as a call to an
* external contact or phone number.
@@ -265,7 +264,7 @@ public void setCallMetaContact(boolean isCallMetaContact)
/**
* Enables or disabled the call button.
- *
+ *
* @param isEnabled true to enable the call button and
* false otherwise.
*/
@@ -276,7 +275,7 @@ public void setCallButtonEnabled(boolean isEnabled)
/**
* Sets the given phoneNumber to the phone number combo box.
- *
+ *
* @param phoneNumber the phone number to set.
*/
public void setPhoneNumberComboText(String phoneNumber)
@@ -286,14 +285,14 @@ public void setPhoneNumberComboText(String phoneNumber)
/**
* Returns the content of the phone number combo box.
- *
+ *
* @return the content of the phone number combo box.
*/
public String getPhoneNumberComboText()
{
return (String) this.phoneNumberCombo.getEditor().getItem();
}
-
+
/**
* Requests the focus in the phone number combo box.
*/
@@ -304,7 +303,7 @@ public void requestFocusInPhoneCombo()
/**
* Adds the given call account to the list of call via accounts.
- *
+ *
* @param pps the protocol provider service corresponding to the account
*/
public void addCallAccount(ProtocolProviderService pps)
@@ -322,7 +321,7 @@ public void addCallAccount(ProtocolProviderService pps)
/**
* Removes the account corresponding to the given protocol provider from the
* call via selector box.
- *
+ *
* @param pps the protocol provider service to remove
*/
public void removeCallAccount(ProtocolProviderService pps)
@@ -341,7 +340,7 @@ public void removeCallAccount(ProtocolProviderService pps)
* Returns TRUE if the account corresponding to the given protocol provider
* is already contained in the call via selector box, otherwise returns
* FALSE.
- *
+ *
* @param pps the protocol provider service for the account
* @return TRUE if the account corresponding to the given protocol provider
* is already contained in the call via selector box, otherwise
@@ -354,7 +353,7 @@ public boolean containsCallAccount(ProtocolProviderService pps)
/**
* Updates the call via account status.
- *
+ *
* @param pps the protocol provider service for the account
*/
public void updateCallAccountStatus(ProtocolProviderService pps)
@@ -364,7 +363,7 @@ public void updateCallAccountStatus(ProtocolProviderService pps)
/**
* Returns the account selector box.
- *
+ *
* @return the account selector box.
*/
public AccountSelectorBox getAccountSelectorBox()