/*
* 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.gui.main.presence;
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.account.*;
import net.java.sip.communicator.util.skin.*;
/**
* A parent class for all status selector boxes.
*
* @see SimpleStatusMenu
* @see GlobalStatusSelectorBox
*
* @author Yana Stamcheva
* @author Adam Netocny
*/
public abstract class StatusSelectorMenu
extends SIPCommMenu
implements ImageObserver,
StatusEntry,
Skinnable
{
/**
* The connecting icon.
*/
private Image connectingIcon;
/**
* Indicates if this menu is currently connecting.
*/
private boolean isConnecting;
/**
* The <tt>ProtocolProviderService</tt> associated with this status menu.
*/
protected ProtocolProviderService protocolProvider;
/**
* The offline status if presence is supported, <tt>null</tt> otherwise.
*/
private PresenceStatus offlineStatus;
/**
* The online status if presence is supported, <tt>null</tt> otherwise.
*/
private PresenceStatus onlineStatus;
/**
* The presence if supported, <tt>null</tt> otherwise.
*/
protected OperationSetPresence presence;
/**
* Creates a <tt>StatusSelectorMenu</tt>.
*/
public StatusSelectorMenu()
{
super();
}
/**
* Creates a <tt>StatusSelectorMenu</tt> by specifying the text and icon to
* show.
* @param text the text of the menu
* @param defaultIcon the icon of the menu
* @param protocolProvider the <tt>ProtocolProviderService</tt> associated
* with this status menu
*/
public StatusSelectorMenu( String text,
Icon defaultIcon,
ProtocolProviderService protocolProvider)
{
super(text, defaultIcon);
this.protocolProvider = protocolProvider;
this.presence
= protocolProvider.getOperationSet(OperationSetPresence.class);
this.onlineStatus
= AccountStatusUtils.getOnlineStatus(protocolProvider);
this.offlineStatus
= AccountStatusUtils.getOfflineStatus(protocolProvider);
loadSkin();
}
/**
* Returns the account index (In case of more than one account for one and
* the same protocol).
*
* @return the account index
*/
public int getAccountIndex(){return -1;}
/**
* Sets the account index.
*
* @param index
*/
public void setAccountIndex(int index){}
/**
* Paints this component. If the state of this menu is connecting, paints
* the connecting icon.
*
* @param g the <tt>Graphics</tt> object used for painting
*/
@Override
public void paintComponent(Graphics g)
{
AntialiasingManager.activateAntialiasing(g);
super.paintComponent(g);
if(isConnecting)
g.drawImage(getConnectingIcon(), 0, 3, this);
}
/**
* Returns the connecting icon, if missing create it.
* @return the connecting i con, if missing create it.
*/
private Image getConnectingIcon()
{
if(connectingIcon == null)
{
connectingIcon
= GuiActivator.getResources()
.getImage("service.gui.icons.CONNECTING").getImage();
}
return connectingIcon;
}
/**
* Clears the connecting icon.
*/
private void clearConnectingIcon()
{
if(connectingIcon != null)
{
connectingIcon.flush();
connectingIcon = null;
}
}
/**
* Starts the connecting.
*/
public void startConnecting()
{
setConnecting(true);
}
/**
* Stops the connecting.
*/
public void stopConnecting()
{
clearConnectingIcon();
setConnecting(false);
}
/**
* Sets the connecting state for this menu.
* @param isConnecting indicates if this menu is currently connecting
*/
private void setConnecting(boolean isConnecting)
{
this.isConnecting = isConnecting;
this.repaint();
}
/**
* Updates the menu icon.
* @param img the image to update
* @param infoflags the info flags
* @param x the x coordinate
* @param y the y coordinate
* @param w the width
* @param h the height
* @return <tt>true</tt> if the image has been updated, <tt>false</tt>
* otherwise
*/
@Override
public boolean imageUpdate(Image img, int infoflags,
int x, int y,
int w, int h)
{
repaint();
return true;
}
/**
* Returns the protocol provider associated with this status menu.
* @return the protocol provider associated with this status menu
*/
public ProtocolProviderService getProtocolProvider()
{
return protocolProvider;
}
/**
* Returns the Offline status in this selector box.
*
* @return the Offline status in this selector box
*/
public PresenceStatus getOfflineStatus()
{
return offlineStatus;
}
/**
* Returns the Online status in this selector box.
*
* @return the Online status in this selector box
*/
public PresenceStatus getOnlineStatus()
{
return onlineStatus;
}
/**
* Load connecting icon.
*/
public void loadSkin()
{
clearConnectingIcon();
}
/**
* Clears resources.
*/
public void dispose()
{
protocolProvider = null;
clearConnectingIcon();
offlineStatus = null;
onlineStatus = null;
}
/**
* The component of this entry.
* @return the component used to add to global status
*/
public JMenuItem getEntryComponent()
{
return this;
}
}