/*
* 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 javax.swing.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.account.*;
import net.java.sip.communicator.util.skin.*;
/**
* @author Damian Minkov
*/
public class ReadonlyStatusItem
extends JMenuItem
implements StatusEntry,
Skinnable
{
/**
* Our logger.
*/
private final Logger logger = Logger.getLogger(ReadonlyStatusItem.class);
/**
* The connecting icon.
*/
private Image connectingIcon;
/**
* Indicates if this menu is currently connecting.
*/
private boolean isConnecting;
/**
* The offline status.
*/
private PresenceStatus offlineStatus;
/**
* The online status.
*/
private PresenceStatus onlineStatus;
/**
* The <tt>ProtocolProviderService</tt> associated with this status menu.
*/
protected ProtocolProviderService protocolProvider;
/**
* Constructs the item with default values.
*
* @param protocolProvider the provider to represent.
*/
public ReadonlyStatusItem(ProtocolProviderService protocolProvider)
{
super(protocolProvider.getAccountID().getDisplayName(),
ImageLoader.getAccountStatusImage(protocolProvider));
this.protocolProvider = protocolProvider;
loadSkin();
String tooltip =
"<html><b>" + protocolProvider.getAccountID().getDisplayName()
+ "</b><br>Connecting</html>";
this.setToolTipText(tooltip);
this.offlineStatus
= AccountStatusUtils.getOfflineStatus(protocolProvider);
this.onlineStatus
= AccountStatusUtils.getOnlineStatus(protocolProvider);
this.setSelectedStatus(offlineStatus);
updateStatus(offlineStatus);
}
/**
* Selects the given status in the status menu.
*
* @param status the status to select
*/
public void setSelectedStatus(PresenceStatus status)
{
Icon statusImage = ImageLoader.getAccountStatusImage(protocolProvider);
this.setIcon(statusImage);
String tooltip = this.getToolTipText();
tooltip = tooltip.substring(0, tooltip.lastIndexOf("<br>"));
if(status != null)
this.setToolTipText(
tooltip.concat("<br>" + status.getStatusName()));
}
/**
* 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 icon, 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;
}
}
/**
* 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.
*/
@Override
public void loadSkin()
{
clearConnectingIcon();
this.setIcon(ImageLoader.getAccountStatusImage(protocolProvider));
}
/**
* Clears resources.
*/
public void dispose()
{
protocolProvider = null;
clearConnectingIcon();
onlineStatus = null;
offlineStatus = null;
}
/**
* The component of this entry.
* @return the component used to add to global status
*/
public JMenuItem getEntryComponent()
{
return this;
}
/**
* 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();
}
/**
* Selects a specific <tt>PresenceStatus</tt> in this instance and the
* <tt>ProtocolProviderService</tt> it depicts.
*
* @param presenceStatus the <tt>PresenceStatus</tt> to be selected in this
* instance and the <tt>ProtocolProviderService</tt> it depicts
*/
public void updateStatus(PresenceStatus presenceStatus)
{
if (logger.isTraceEnabled())
logger.trace("Update status for provider: "
+ protocolProvider.getAccountID().getAccountAddress()
+ ". The new status will be: " + presenceStatus.getStatusName());
this.setSelectedStatus(presenceStatus);
}
}