Adds visualisation of the currently selected status message, and saves custom status messages for later reuse.

cusax-fix
Damian Minkov 13 years ago
parent 8672123c4f
commit 23009ed6e7

@ -106,6 +106,7 @@ service.gui.CHAT_ROOM_USER_LEFT=has left {0}
service.gui.CHAT_ROOM_USER_KICKED=has been kicked from {0}
service.gui.CHAT_ROOM_USER_QUIT=has quit {0}
service.gui.CHAT_ROOM_NAME=Chat room name
service.gui.CLEAR_CUSTOM_MESSAGES=Clear custom messages
service.gui.ROOM_NAME=Chat Room
service.gui.AUTOJOIN=Autojoin
service.gui.CHANGE_PASSWORD=Change password
@ -327,6 +328,7 @@ service.gui.NEW_ACCOUNT=Add &new account...
service.gui.NEW_MESSAGE=New message
service.gui.NEW_NAME=New name
service.gui.NEW_STATUS_MESSAGE=New status message
service.gui.NEW_STATUS_MESSAGE_SAVE=Save as custom message
service.gui.NO=No
service.gui.NONE=None
service.gui.NO_CAMERA_AVAILABLE=No camera available

@ -12,14 +12,13 @@
import javax.swing.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.customcontrols.*;
import net.java.sip.communicator.impl.gui.main.*;
import net.java.sip.communicator.impl.gui.main.login.*;
import net.java.sip.communicator.impl.gui.main.presence.message.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.Logger;
import net.java.sip.communicator.util.swing.*;
import org.jitsi.util.*;
/**
* The <tt>StatusSelectorBox</tt> is a <tt>SIPCommMenu</tt> that contains
@ -51,7 +50,16 @@ public class PresenceStatusMenu
private OperationSetPresence presence;
private JLabel titleLabel;
/**
* The area will display the account display name and its status message
* if any.
*/
private JEditorPane titleArea;
/**
* The status message menu.
*/
private StatusMessageMenu statusMessageMenu;
/**
* Take care for global status items, that only one is selected.
@ -83,12 +91,17 @@ public PresenceStatusMenu(ProtocolProviderService protocolProvider)
this.setToolTipText(tooltip);
titleLabel = new JLabel(protocolProvider.getAccountID().getDisplayName());
titleArea = new JEditorPane();
titleArea.setContentType("text/html");
titleArea.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
titleArea.setOpaque(false);
titleArea.setEditable(false);
titleArea.setAlignmentX(Component.RIGHT_ALIGNMENT);
titleLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD));
statusMessageMenu = new StatusMessageMenu(protocolProvider, this);
updateTitleArea();
this.add(titleLabel);
this.add(titleArea);
this.addSeparator();
while (statusIterator.hasNext())
@ -116,7 +129,7 @@ else if ((onlineStatus != null
this.addSeparator();
this.add(new StatusMessageMenu(protocolProvider));
this.add(statusMessageMenu);
this.setSelectedStatus(offlineStatus);
updateStatus(offlineStatus);
@ -205,12 +218,39 @@ public void updateStatus(PresenceStatus presenceStatus)
if(item instanceof JCheckBoxMenuItem)
{
if(item.getText().equals(presenceStatus.getStatusName()))
if(item.getName().equals(presenceStatus.getStatusName()))
{
item.setSelected(true);
//item.setText("<html><b>" + item.getName() + "</b></html>");
}
else
{
item.setText(item.getName());
}
}
}
}
/**
* Updates the current title area with the account display name
* and its status.
*/
public void updateTitleArea()
{
StringBuilder txt = new StringBuilder();
txt.append("<html>").append("<b>");
txt.append(protocolProvider.getAccountID().getDisplayName())
.append("</b>");
String statusMessage = statusMessageMenu.getCurrentMessage();
if(!StringUtils.isNullOrEmpty(statusMessage))
{
txt.append("<br/>").append(statusMessage);
}
txt.append("</html>");
titleArea.setText(txt.toString());
}
/**
* Selects the given status in the status menu.
*
@ -225,6 +265,7 @@ public void setSelectedStatus(PresenceStatus status)
status.getStatusName());
this.setSelected(selectedObject);
lastSelectedStatus = status;
String tooltip = this.getToolTipText();

@ -56,16 +56,29 @@ public class NewStatusMessageDialog
*/
private JPanel messagePanel;
/**
* The parent menu.
*/
private StatusMessageMenu parentMenu;
/**
* A checkbox when checked, the new message will be saved.
*/
private JCheckBox saveNewMessage;
/**
* Creates an instance of <tt>NewStatusMessageDialog</tt>.
*
* @param protocolProvider the <tt>ProtocolProviderService</tt>.
*/
public NewStatusMessageDialog (ProtocolProviderService protocolProvider)
public NewStatusMessageDialog (ProtocolProviderService protocolProvider,
StatusMessageMenu parentMenu)
{
super(false);
presenceOpSet
= (OperationSetPersistentPresence) protocolProvider
.getOperationSet(OperationSetPresence.class);
= protocolProvider.getOperationSet(OperationSetPresence.class);
this.parentMenu = parentMenu;
this.init();
pack();
@ -100,6 +113,9 @@ private void init()
JPanel buttonsPanel
= new TransparentPanel(new FlowLayout(FlowLayout.RIGHT));
saveNewMessage = new JCheckBox(GuiActivator.getResources()
.getI18NString("service.gui.NEW_STATUS_MESSAGE_SAVE"));
this.setTitle(GuiActivator.getResources()
.getI18NString("service.gui.NEW_STATUS_MESSAGE"));
@ -121,6 +137,12 @@ private void init()
infoTitleLabel.setFont(
infoTitleLabel.getFont().deriveFont(Font.BOLD, 18.0f));
saveNewMessage.setSelected(true);
/*JPanel saveToCustomPanel = new TransparentPanel(
new FlowLayout(FlowLayout.RIGHT));
saveToCustomPanel.add(saveNewMessage);
dataPanel.add(saveToCustomPanel, BorderLayout.SOUTH);*/
labelsPanel.add(infoTitleLabel);
labelsPanel.add(infoArea);
labelsPanel.add(dataPanel);
@ -194,7 +216,9 @@ public void actionPerformed(ActionEvent e)
if (name.equals("ok"))
{
new PublishStatusMessageThread(messageTextField.getText()).start();
parentMenu.publishStatusMessage(messageTextField.getText(),
parentMenu.getNewMessageItem(),
saveNewMessage.isSelected());
}
this.dispose();
@ -209,71 +233,6 @@ public void requestFocusInField()
this.messageTextField.requestFocus();
}
/**
* This class allow to use a thread to change the presence status message.
*/
private class PublishStatusMessageThread extends Thread
{
private String message;
private PresenceStatus currentStatus;
public PublishStatusMessageThread(String message)
{
this.message = message;
this.currentStatus = presenceOpSet.getPresenceStatus();
}
public void run()
{
try
{
presenceOpSet.publishPresenceStatus(currentStatus, message);
}
catch (IllegalArgumentException e1)
{
logger.error("Error - changing status", e1);
}
catch (IllegalStateException e1)
{
logger.error("Error - changing status", e1);
}
catch (OperationFailedException e1)
{
if (e1.getErrorCode()
== OperationFailedException.GENERAL_ERROR)
{
logger.error(
"General error occured while "
+ "publishing presence status.",
e1);
}
else if (e1.getErrorCode()
== OperationFailedException
.NETWORK_FAILURE)
{
logger.error(
"Network failure occured while "
+ "publishing presence status.",
e1);
}
else if (e1.getErrorCode()
== OperationFailedException
.PROVIDER_NOT_REGISTERED)
{
logger.error(
"Protocol provider must be"
+ "registered in order to change status.",
e1);
}
}
}
}
/**
* Artificially clicks the cancel button when this panel is escaped.
* @param isEscaped indicates if this dialog is closed by the Esc shortcut

@ -12,8 +12,11 @@
import javax.swing.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.main.presence.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.Logger;
import org.jitsi.util.*;
/**
* The <tt>StatusMessageMenu<tt> is added to every status selector box in order
@ -25,7 +28,23 @@ public class StatusMessageMenu
extends JMenu
implements ActionListener
{
private Logger logger = Logger.getLogger(StatusMessageMenu.class);
/**
* Our logger.
*/
private final static Logger logger
= Logger.getLogger(StatusMessageMenu.class);
/**
* The prefix used to store custom status messages.
*/
private final static String CUSTOM_MESSAGES_PREFIX =
"service.gui.CUSTOM_STATUS_MESSAGE";
/**
* The prefix to search for provisioned messages.
*/
private final static String PROVISIONED_MESSAGES_PREFIX =
"service.gui.CUSTOM_STATUS_MESSAGE.";
private static final String BRB_MESSAGE
= GuiActivator.getResources().getI18NString("service.gui.BRB_MESSAGE");
@ -39,12 +58,32 @@ public class StatusMessageMenu
private JMenuItem newMessageItem = new JMenuItem(
GuiActivator.getResources().getI18NString("service.gui.NEW_MESSAGE"));
private JMenuItem busyMessageItem = new JMenuItem(BUSY_MESSAGE);
/**
* To clear and delete currently saved custom messages.
*/
private JMenuItem clearCustomMessageItem = new JMenuItem(
GuiActivator.getResources()
.getI18NString("service.gui.CLEAR_CUSTOM_MESSAGES"));
/**
* The pre-set busy message.
*/
private JCheckBoxMenuItem busyMessageItem
= new JCheckBoxMenuItem(BUSY_MESSAGE);
private JMenuItem brbMessageItem = new JMenuItem(BRB_MESSAGE);
/**
* The pre-set BRB message.
*/
private JCheckBoxMenuItem brbMessageItem
= new JCheckBoxMenuItem(BRB_MESSAGE);
private ProtocolProviderService protocolProvider;
/**
* The parent menu of this menu.
*/
private PresenceStatusMenu parentMenu;
/**
* Creates an instance of <tt>StatusMessageMenu</tt>, by specifying the
* <tt>ProtocolProviderService</tt> to which this menu belongs.
@ -52,25 +91,41 @@ public class StatusMessageMenu
* @param protocolProvider the protocol provider service to which this
* menu belongs
*/
public StatusMessageMenu(ProtocolProviderService protocolProvider)
public StatusMessageMenu(ProtocolProviderService protocolProvider,
PresenceStatusMenu parentMenu)
{
super(GuiActivator.getResources()
.getI18NString("service.gui.SET_STATUS_MESSAGE"));
.getI18NString("service.gui.SET_STATUS_MESSAGE"));
this.protocolProvider = protocolProvider;
this.parentMenu = parentMenu;
this.noMessageItem.addActionListener(this);
this.newMessageItem.addActionListener(this);
this.busyMessageItem.addActionListener(this);
this.brbMessageItem.addActionListener(this);
this.clearCustomMessageItem.addActionListener(this);
this.add(noMessageItem);
this.add(newMessageItem);
this.add(clearCustomMessageItem);
// check should we show the preset messages
if(ConfigurationUtils.isPresetStatusMessagesEnabled())
{
busyMessageItem.setName(busyMessageItem.getText());
brbMessageItem.setName(brbMessageItem.getText());
this.addSeparator();
this.addSeparator();
this.add(busyMessageItem);
this.add(brbMessageItem);
}
// load custom message
loadCustomStatusMessageIndex();
// load provisioned messages if any
this.add(busyMessageItem);
this.add(brbMessageItem);
}
public void actionPerformed(ActionEvent e)
@ -82,7 +137,7 @@ public void actionPerformed(ActionEvent e)
if (menuItem.equals(newMessageItem))
{
NewStatusMessageDialog dialog
= new NewStatusMessageDialog(protocolProvider);
= new NewStatusMessageDialog(protocolProvider, this);
dialog.setLocation(
Toolkit.getDefaultToolkit().getScreenSize().width/2
@ -98,6 +153,34 @@ public void actionPerformed(ActionEvent e)
// we will set status from the Status Message Dialog
return;
}
else if (menuItem.equals(clearCustomMessageItem))
{
// lets remove, we need the latest index removed so we can
// remove and the separator that is before it
int lastIx = -1;
for(Component c : getMenuComponents())
{
if(c instanceof CustomMessageItems)
{
lastIx = getPopupMenu().getComponentIndex(c);
remove((CustomMessageItems)c);
}
}
// remove the separator
if(lastIx - 1 >= 0 )
getPopupMenu().remove(lastIx - 1);
// and now let's delete the saved values
java.util.List<String> customMessagesProps =
GuiActivator.getConfigurationService()
.getPropertyNamesByPrefix(CUSTOM_MESSAGES_PREFIX, false);
for(String p : customMessagesProps)
{
GuiActivator.getConfigurationService().removeProperty(p);
}
}
else if (menuItem.equals(busyMessageItem))
{
statusMessage = BUSY_MESSAGE;
@ -106,8 +189,255 @@ else if (menuItem.equals(brbMessageItem))
{
statusMessage = BRB_MESSAGE;
}
else if (menuItem instanceof CustomMessageItems)
{
statusMessage = menuItem.getName();
}
else if (menuItem instanceof ProvisionedMessageItems)
{
statusMessage = menuItem.getName();
}
new PublishStatusMessageThread(statusMessage).start();
// we cannot get here after clicking 'new message'
publishStatusMessage(statusMessage, menuItem, false);
}
/**
* Publishes the new message in separate thread. If successfully ended
* the message item is created and added to te list of current status
* messages and if needed the message is saved.
* @param message the message to save
* @param menuItem the item which was clicked to set this status
* @param saveIfNewMessage whether to save the status on the custom
* statuses list.
*/
void publishStatusMessage(String message,
JMenuItem menuItem,
boolean saveIfNewMessage)
{
new PublishStatusMessageThread(message, menuItem, saveIfNewMessage)
.start();
}
/**
* Returns the button for new messages.
* @return the button for new messages.
*/
JMenuItem getNewMessageItem()
{
return newMessageItem;
}
/**
* Changes current message text in its item.
* @param message
* @param menuItem the menu item that was clicked
* @param saveNewMessage whether to save the newly created message
*/
private void setCurrentMessage(final String message,
final JMenuItem menuItem,
final boolean saveNewMessage)
{
if(menuItem == null)
return;
/// we will be working with swing components, make sure it is in EDT
if(!SwingUtilities.isEventDispatchThread())
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
setCurrentMessage(message, menuItem, saveNewMessage);
}
});
return;
}
// if message is null we cleared the status message
if(StringUtils.isNullOrEmpty(message))
{
clearSelectedItems();
parentMenu.updateTitleArea();
return;
}
// a ne message was created
if(menuItem.equals(newMessageItem))
{
clearSelectedItems();
CustomMessageItems newMenuItem = new CustomMessageItems(message);
newMenuItem.setName(message);
newMenuItem.setSelected(true);
newMenuItem.addActionListener(this);
int ix = getLastCustomMessageIndex();
if(ix == -1)
{
this.addSeparator();
this.add(newMenuItem);
}
else
{
insert(newMenuItem, ix + 1);
}
parentMenu.updateTitleArea();
if(saveNewMessage)
{
// lets save it
int saveIx = getLastCustomStatusMessageIndex();
GuiActivator.getConfigurationService().setProperty(
CUSTOM_MESSAGES_PREFIX + "." + String.valueOf(saveIx + 1),
message
);
}
}
else if(menuItem instanceof JCheckBoxMenuItem)
{
clearSelectedItems();
menuItem.setSelected(true);
menuItem.setText("<html><b>" + menuItem.getName() +"</b></html>");
parentMenu.updateTitleArea();
}
}
/**
* Searches for custom messages in configuration service and
* gets the highest index.
* @return the highest index of custom status messages.
*/
private int getLastCustomStatusMessageIndex()
{
int ix = -1;
java.util.List<String> customMessagesProps =
GuiActivator.getConfigurationService()
.getPropertyNamesByPrefix(CUSTOM_MESSAGES_PREFIX, false);
for(String p : customMessagesProps)
{
String s = p.substring(CUSTOM_MESSAGES_PREFIX.length() + 1);
try
{
int i = Integer.parseInt(s);
if(i > ix)
ix = i;
}
catch(Throwable t)
{}
}
return ix;
}
/**
* Loads the previously saved custom status messages.
*/
private void loadCustomStatusMessageIndex()
{
java.util.List<String> customMessagesProps =
GuiActivator.getConfigurationService()
.getPropertyNamesByPrefix(CUSTOM_MESSAGES_PREFIX, false);
if(customMessagesProps.size() > 0)
{
this.addSeparator();
}
for(String p : customMessagesProps)
{
String message =
GuiActivator.getConfigurationService().getString(p);
CustomMessageItems newMenuItem = new CustomMessageItems(message);
newMenuItem.setName(message);
newMenuItem.addActionListener(this);
this.add(newMenuItem);
}
}
/**
* Clears all items that they are not selected and its name is not bold.
*/
private void clearSelectedItems()
{
for(Component c : getMenuComponents())
{
if(c instanceof JCheckBoxMenuItem)
{
JCheckBoxMenuItem checkItem =
(JCheckBoxMenuItem)c;
checkItem.setSelected(false);
checkItem.setText(checkItem.getName());
}
}
}
/**
* Checks for the index of the last component of CustomMessageItems class.
* @return the last component index of CustomMessageItems.
*/
private int getLastCustomMessageIndex()
{
int ix = -1;
JPopupMenu popupMenu = getPopupMenu();
for(Component c : getMenuComponents())
{
if(c instanceof CustomMessageItems)
{
int cIx = popupMenu.getComponentIndex(c);
if(cIx > ix)
ix = cIx;
}
}
return ix;
}
public String getCurrentMessage()
{
for(Component c : getMenuComponents())
{
if(c instanceof JCheckBoxMenuItem
&& ((JCheckBoxMenuItem) c).isSelected())
{
return c.getName();
}
}
return null;
}
/**
* The custom message items.
*/
private class CustomMessageItems
extends JCheckBoxMenuItem
{
public CustomMessageItems(String text)
{
super(text);
}
}
/**
* The provisioned message items.
*/
private class ProvisionedMessageItems
extends JCheckBoxMenuItem
{
public ProvisionedMessageItems(String text)
{
super(text);
}
}
/**
@ -121,15 +451,25 @@ private class PublishStatusMessageThread extends Thread
private OperationSetPresence presenceOpSet;
public PublishStatusMessageThread(String message)
private JMenuItem menuItem;
private boolean saveIfNewMessage;
public PublishStatusMessageThread(
String message,
JMenuItem menuItem,
boolean saveIfNewMessage)
{
this.message = message;
presenceOpSet
= (OperationSetPersistentPresence) protocolProvider
.getOperationSet(OperationSetPresence.class);
= protocolProvider.getOperationSet(OperationSetPresence.class);
this.currentStatus = presenceOpSet.getPresenceStatus();
this.menuItem = menuItem;
this.saveIfNewMessage = saveIfNewMessage;
}
public void run()
@ -137,6 +477,8 @@ public void run()
try
{
presenceOpSet.publishPresenceStatus(currentStatus, message);
setCurrentMessage(message, menuItem, saveIfNewMessage);
}
catch (IllegalArgumentException e1)
{

@ -175,6 +175,11 @@ public class ConfigurationUtils
*/
private static boolean isRemoveContactDisabled;
/**
* Indicates if the pre set status messages are enabled.
*/
private static boolean isPresetStatusMessagesEnabled;
/**
* The last directory used in file transfer.
*/
@ -627,6 +632,13 @@ public static void loadGuiConfigurations()
"CONTACT_REMOVE_DISABLED",
false);
// Load the "PRESET_STATUS_MESSAGES" property.
isPresetStatusMessagesEnabled
= configService.getBoolean(
"net.java.sip.communicator.impl.gui.main.presence." +
"PRESET_STATUS_MESSAGES",
true);
// Load the "net.java.sip.communicator.impl.gui.main.account
// .ADVANCED_CONFIG_DISABLED" property.
String advancedConfigDisabledDefaultProp
@ -1135,6 +1147,17 @@ public static boolean isRemoveContactDisabled()
return isRemoveContactDisabled;
}
/**
* Returns <code>true</code> if the "PRESET_STATUS_MESSAGES" property is
* true, otherwise - returns <code>false</code>.
* @return <code>true</code> if the "PRESET_STATUS_MESSAGES" property is
* true, otherwise - returns <code>false</code>.
*/
public static boolean isPresetStatusMessagesEnabled()
{
return isPresetStatusMessagesEnabled;
}
/**
* Returns <code>true</code> if the "ADVANCED_CONFIG_DISABLED" property is
* true, otherwise - returns <code>false</code>..

Loading…
Cancel
Save