/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * 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 net.java.sip.communicator.impl.osdependent.jdic; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import net.java.sip.communicator.impl.osdependent.*; import net.java.sip.communicator.plugin.desktoputil.presence.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.*; /** * The <tt>StatusSelector</tt> is a submenu which allows to select a status for * a protocol provider which supports the OperationSetPresence. * * @author Nicolas Chamouard * @author Lubomir Marinov */ public class StatusSelector implements ActionListener, ItemListener { /** * The protocol provider */ private final ProtocolProviderService provider; /** * The presence status */ private final OperationSetPresence presence; /** * The logger for this class. */ private final Logger logger = Logger.getLogger(StatusSelector.class); private final Object menu; /** * Initializes a new <tt>StatusSelector</tt> instance. * * @param provider the protocol provider * @param presence the presence status * @param swing */ public StatusSelector( ProtocolProviderService provider, OperationSetPresence presence, boolean swing) { this.provider = provider; this.presence = presence; /* the parent item */ { String text = provider.getAccountID().getDisplayName(); if (swing) { JMenu menu = new JMenu(text); byte[] icBytes = presence.getPresenceStatus().getStatusIcon(); if(icBytes != null) menu.setIcon(new ImageIcon(icBytes)); this.menu = menu; } else { this.menu = new Menu(text); } } /* the submenu itself */ PresenceStatus offlineStatus = null; Iterator<PresenceStatus> statusIterator = this.presence.getSupportedStatusSet(); while (statusIterator.hasNext()) { PresenceStatus status = statusIterator.next(); // if connectivity less then 1, this is offline one if(status.getStatus() < 1) offlineStatus = status; String text = status.getStatusName(); if (menu instanceof Container) { JCheckBoxMenuItem item = new JCheckBoxMenuItem(text); byte[] icBytes = status.getStatusIcon(); if(icBytes != null) item.setIcon(new ImageIcon(icBytes)); item.addActionListener(this); ((Container) menu).add(item); } else { CheckboxMenuItem item = new CheckboxMenuItem(text); item.addItemListener(this); ((Menu) menu).add(item); } } addSeparator(); StatusSubMenu.addMenuItem(menu, new StatusMessageMenu(provider, swing) .getMenu()); if(offlineStatus != null) updateStatus(offlineStatus); } private void addSeparator() { if (menu instanceof JMenu) ((JMenu) menu).addSeparator(); else ((Menu) menu).addSeparator(); } public Object getMenu() { return menu; } /** * Change the status of the protocol according to the menu item selected * * @param evt the event containing the menu item name */ public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); String menuItemText; if (source instanceof AbstractButton) menuItemText = ((AbstractButton) source).getText(); else menuItemText = ((MenuItem) source).getLabel(); changeStatus(menuItemText); } /** * Searches for presence status with the supplied name and publish this * status to the provider. * @param statusName */ private void changeStatus(String statusName) { Iterator<PresenceStatus> statusSet = presence.getSupportedStatusSet(); while (statusSet.hasNext()) { PresenceStatus status = statusSet.next(); if (status.getStatusName().equals(statusName)) { OsDependentActivator.getGlobalStatusService() .publishStatus(provider, status); break; } } } public void updateStatus(PresenceStatus presenceStatus) { String presenceStatusName = presenceStatus.getStatusName(); if (logger.isTraceEnabled()) { logger.trace( "Systray update status for provider: " + provider.getAccountID().getAccountAddress() + ". The new status will be: " + presenceStatusName); } if (menu instanceof AbstractButton) { byte[] bytes = presenceStatus.getStatusIcon(); if (bytes != null) ((AbstractButton) menu).setIcon(new ImageIcon()); } if(menu instanceof Menu) { Menu theMenu = (Menu) menu; for(int i = 0, count = theMenu.getItemCount(); i < count; i++) { MenuItem item = theMenu.getItem(i); if(item instanceof CheckboxMenuItem) { ((CheckboxMenuItem) item).setState( item.getLabel().equals(presenceStatusName)); } } } else if(menu instanceof JMenu) { JMenu theMenu = (JMenu) menu; for(int i = 0, count = theMenu.getItemCount(); i < count; i++) { JMenuItem item = theMenu.getItem(i); if(item instanceof JCheckBoxMenuItem) item.setSelected(item.getText().equals(presenceStatusName)); } } } /** * Listens for changes in item state (CheckboxMenuItem)s. * @param e the event. */ public void itemStateChanged(ItemEvent e) { Object sourceItem = e.getSource(); if(e.getStateChange() == ItemEvent.SELECTED) { if(sourceItem instanceof CheckboxMenuItem) { changeStatus(((CheckboxMenuItem)sourceItem).getLabel()); } } else if(e.getStateChange() == ItemEvent.DESELECTED) { if(sourceItem instanceof CheckboxMenuItem) { ((CheckboxMenuItem)sourceItem).setState(true); } } } }