Improves videobridge interface to show participants with no video as

thumbnails. Adds new security icons and improves conference color codes.
cusax-fix
yanas 13 years ago
parent b63af670fa
commit a5b2b851c5

@ -179,13 +179,13 @@ service.gui.ERROR_FOREGROUND=CC0000
service.gui.CHAT_LINK_COLOR=4A9BDB service.gui.CHAT_LINK_COLOR=4A9BDB
# Conference call peer title panel background color. # Conference call peer title panel background color.
service.gui.CALL_PEER_NAME_BACKGROUND=A6D6FF service.gui.CALL_PEER_NAME_BACKGROUND=2f2f2f
# Conference call member title panel background color. # Conference call member title panel background color.
service.gui.CALL_MEMBER_NAME_BACKGROUND=BDFFA3 service.gui.CALL_MEMBER_NAME_BACKGROUND=2f2f2f
# Conference call local user title panel background color. # Conference call local user title panel background color.
service.gui.CALL_LOCAL_USER_BACKGROUND=A6D6FF service.gui.CALL_LOCAL_USER_BACKGROUND=006891
# The background used in opaque Mac panels. # The background used in opaque Mac panels.
service.gui.MAC_PANEL_BACKGROUND=f0f0f0 service.gui.MAC_PANEL_BACKGROUND=f0f0f0

@ -107,6 +107,7 @@ service.gui.icons.SEARCH_SEPARATOR=resources/images/impl/gui/common/searchSepara
service.gui.icons.CERTIFICATE_WARNING=resources/images/impl/gui/common/certificateWarning.png service.gui.icons.CERTIFICATE_WARNING=resources/images/impl/gui/common/certificateWarning.png
service.gui.icons.CONFERENCE_CALL=resources/images/impl/gui/common/conferenceCall.png service.gui.icons.CONFERENCE_CALL=resources/images/impl/gui/common/conferenceCall.png
service.gui.icons.VIDEO_BRIDGE=resources/images/impl/gui/common/videoBridge.png service.gui.icons.VIDEO_BRIDGE=resources/images/impl/gui/common/videoBridge.png
service.gui.icons.CONFERENCE_VIDEO_INDICATOR=resources/images/impl/gui/common/conferenceVideoIndicator.png
# Status icons # Status icons
service.gui.statusicons.USER_ONLINE_ICON=resources/images/impl/gui/common/statusicons/online.png service.gui.statusicons.USER_ONLINE_ICON=resources/images/impl/gui/common/statusicons/online.png
@ -204,6 +205,7 @@ service.gui.buttons.SHOW_LOCAL_VIDEO_BUTTON_PRESSED=resources/images/impl/gui/bu
service.gui.buttons.TRANSFER_CALL_BUTTON=resources/images/impl/gui/buttons/transferCallButton.png service.gui.buttons.TRANSFER_CALL_BUTTON=resources/images/impl/gui/buttons/transferCallButton.png
service.gui.buttons.SECURE_BUTTON_ON=resources/images/impl/gui/buttons/secureOn.png service.gui.buttons.SECURE_BUTTON_ON=resources/images/impl/gui/buttons/secureOn.png
service.gui.buttons.SECURE_BUTTON_OFF=resources/images/impl/gui/buttons/secureOff.png service.gui.buttons.SECURE_BUTTON_OFF=resources/images/impl/gui/buttons/secureOff.png
service.gui.buttons.SECURE_BUTTON_PENDING=resources/images/impl/gui/buttons/securePending.png
service.gui.buttons.SECURE_VIDEO_ON=resources/images/impl/gui/buttons/secureVideoOn.png service.gui.buttons.SECURE_VIDEO_ON=resources/images/impl/gui/buttons/secureVideoOn.png
service.gui.buttons.SECURE_VIDEO_OFF=resources/images/impl/gui/buttons/secureVideoOff.png service.gui.buttons.SECURE_VIDEO_OFF=resources/images/impl/gui/buttons/secureVideoOff.png
service.gui.buttons.SECURE_AUDIO_ON=resources/images/impl/gui/buttons/secureAudioOn.png service.gui.buttons.SECURE_AUDIO_ON=resources/images/impl/gui/buttons/secureAudioOn.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 297 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 B

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 B

After

Width:  |  Height:  |  Size: 908 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

@ -46,7 +46,7 @@ public void paintComponent(Graphics g)
AntialiasingManager.activateAntialiasing(g); AntialiasingManager.activateAntialiasing(g);
g.setColor(Color.DARK_GRAY); g.setColor(Color.DARK_GRAY);
g.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), 20, 20); g.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), 10, 10);
} }
finally finally
{ {

@ -59,7 +59,7 @@ public void paintComponent(Graphics g)
AntialiasingManager.activateAntialiasing(g); AntialiasingManager.activateAntialiasing(g);
g.setColor(backgroundColor); g.setColor(backgroundColor);
g.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), 20, 20); g.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), 10, 10);
} }
finally finally
{ {

@ -1509,7 +1509,7 @@ public void paintComponent(Graphics g)
AntialiasingManager.activateAntialiasing(g); AntialiasingManager.activateAntialiasing(g);
g.setColor(Color.DARK_GRAY); g.setColor(Color.DARK_GRAY);
g.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), 20, 20); g.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), 10, 10);
} }
finally finally
{ {

@ -12,7 +12,6 @@
import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.util.skin.*; import net.java.sip.communicator.util.skin.*;
/** /**
@ -42,30 +41,9 @@ public class SecurityStatusLabel
private static Icon securityOnIcon; private static Icon securityOnIcon;
/** /**
* The background used to indicate that the call is secured. * The icon used for the security pending state.
*/ */
private final static Color securityOnBackground private static Icon securityPendingIcon;
= new Color(GuiActivator.getResources()
.getColor("service.gui.SECURITY_ON"));
/**
* The background used to indicate that the call is not secured.
*/
private final static Color securityOffBackground
= new Color(GuiActivator.getResources()
.getColor("service.gui.SECURITY_OFF"));
/**
* The background used to indicate that the call is not secured.
*/
private final static Color goingSecureBackground
= new Color(GuiActivator.getResources()
.getColor("service.gui.GOING_SECURE"));
/**
* Indicates security status.
*/
private boolean isSecure = false;
/** /**
* Creates an instance of <tt>SecurityStatusLabel</tt> by specifying the * Creates an instance of <tt>SecurityStatusLabel</tt> by specifying the
@ -82,48 +60,12 @@ public SecurityStatusLabel()
setHorizontalTextPosition(JLabel.LEFT); setHorizontalTextPosition(JLabel.LEFT);
} }
/**
* Paints a custom background to better indicate security state.
*
* @param g the <tt>Graphics</tt> object
*/
public void paintComponent(Graphics g)
{
g = g.create();
try
{
AntialiasingManager.activateAntialiasing(g);
g.setColor(getBackground());
if (getIcon() != null)
{
if (isSecure)
g.fillRoundRect(
0, 0, this.getWidth(), this.getHeight(), 20, 20);
else
g.fillRoundRect(
0, 0, this.getWidth(), this.getHeight(), 20, 20);
}
g.setColor(getForeground());
super.paintComponent(g);
}
finally
{
g.dispose();
}
}
/** /**
* Sets the audio security on or off. * Sets the audio security on or off.
*/ */
public void setSecurityOn() public void setSecurityOn()
{ {
isSecure = true;
setIcon(securityOnIcon); setIcon(securityOnIcon);
setBackground(securityOnBackground);
setToolTipText(GuiActivator.getResources().getI18NString( setToolTipText(GuiActivator.getResources().getI18NString(
"service.gui.security.CALL_SECURED_TOOLTIP")); "service.gui.security.CALL_SECURED_TOOLTIP"));
} }
@ -133,9 +75,7 @@ public void setSecurityOn()
*/ */
public void setSecurityOff() public void setSecurityOff()
{ {
isSecure = false;
setIcon(securityOffIcon); setIcon(securityOffIcon);
setBackground(securityOffBackground);
this.setToolTipText(GuiActivator.getResources().getI18NString( this.setToolTipText(GuiActivator.getResources().getI18NString(
"service.gui.security.CALL_NOT_SECURED_TOOLTIP")); "service.gui.security.CALL_NOT_SECURED_TOOLTIP"));
} }
@ -145,9 +85,7 @@ public void setSecurityOff()
*/ */
public void setSecurityPending() public void setSecurityPending()
{ {
isSecure = false; setIcon(securityPendingIcon);
setIcon(securityOnIcon);
setBackground(goingSecureBackground);
this.setToolTipText(GuiActivator.getResources().getI18NString( this.setToolTipText(GuiActivator.getResources().getI18NString(
"service.gui.security.CALL_SECURED_COMPARE_TOOLTIP")); "service.gui.security.CALL_SECURED_COMPARE_TOOLTIP"));
} }
@ -173,5 +111,8 @@ public void loadSkin()
securityOnIcon = new ImageIcon(ImageLoader securityOnIcon = new ImageIcon(ImageLoader
.getImage(ImageLoader.SECURE_BUTTON_ON)); .getImage(ImageLoader.SECURE_BUTTON_ON));
securityPendingIcon = new ImageIcon(ImageLoader
.getImage(ImageLoader.SECURE_BUTTON_PENDING));
} }
} }

@ -115,15 +115,7 @@ public AudioConferenceCallPanel(
* because the video may already be flowing between the CallPeers. * because the video may already be flowing between the CallPeers.
* Otherwise, the videos of the remote CallPeers will not be shown. * Otherwise, the videos of the remote CallPeers will not be shown.
*/ */
GridBagConstraints scrollPaneGridBagConstraints add(scrollPane, BorderLayout.CENTER);
= new GridBagConstraints();
scrollPaneGridBagConstraints.fill = GridBagConstraints.BOTH;
scrollPaneGridBagConstraints.gridx = 1;
scrollPaneGridBagConstraints.gridy = 0;
scrollPaneGridBagConstraints.weightx = 1;
scrollPaneGridBagConstraints.weighty = 1;
add(scrollPane, scrollPaneGridBagConstraints);
constraints = new GridBagConstraints(); constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH; constraints.fill = GridBagConstraints.BOTH;

@ -13,7 +13,6 @@
import javax.swing.*; import javax.swing.*;
import net.java.sip.communicator.impl.gui.main.call.*; import net.java.sip.communicator.impl.gui.main.call.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.event.*; import net.java.sip.communicator.service.protocol.event.*;
@ -24,7 +23,7 @@
* @author Lyubomir Marinov * @author Lyubomir Marinov
*/ */
public abstract class BasicConferenceCallPanel public abstract class BasicConferenceCallPanel
extends TransparentPanel extends JPanel
implements SwingCallRenderer implements SwingCallRenderer
{ {
/** /**
@ -101,7 +100,7 @@ protected BasicConferenceCallPanel(
CallPanel callPanel, CallPanel callPanel,
CallConference callConference) CallConference callConference)
{ {
super(new GridBagLayout()); super(new BorderLayout());
this.callPanel = callPanel; this.callPanel = callPanel;
this.callConference = callConference; this.callConference = callConference;

@ -46,7 +46,7 @@ public abstract class BasicConferenceParticipantPanel<T>
/** /**
* Background color. * Background color.
*/ */
private static final Color bgColor = new Color(255, 255, 255); private static final Color bgColor = new Color(110, 110, 110);
/** /**
* Serial version UID. * Serial version UID.
@ -139,6 +139,7 @@ public abstract class BasicConferenceParticipantPanel<T>
*/ */
private SoundLevelIndicator soundIndicator; private SoundLevelIndicator soundIndicator;
/** /**
* The status bar of the participant panel. * The status bar of the participant panel.
*/ */
@ -156,6 +157,16 @@ public abstract class BasicConferenceParticipantPanel<T>
*/ */
private final JPanel titleBar = new CallTitlePanel(new GridBagLayout()); private final JPanel titleBar = new CallTitlePanel(new GridBagLayout());
/**
* Indicates if video indicator is enabled for this participant.
*/
private boolean isVideoIndicatorEnabled = false;
/**
* The image of the participant
*/
private Image participantImage;
/** /**
* Initializes a new <tt>BasicConferenceParticipantPanel</tt> instance which * Initializes a new <tt>BasicConferenceParticipantPanel</tt> instance which
* is to depict a specific conference participant. * is to depict a specific conference participant.
@ -198,6 +209,8 @@ public void addToNameBar(Component component)
{ {
nameBarConstraints.gridx = nameBarConstraints.gridx + 1; nameBarConstraints.gridx = nameBarConstraints.gridx + 1;
nameBarConstraints.weightx = 0f; nameBarConstraints.weightx = 0f;
nameBarConstraints.insets = new Insets(0, 5, 0, 0);
this.nameBar.add(component, nameBarConstraints); this.nameBar.add(component, nameBarConstraints);
} }
@ -266,11 +279,13 @@ private void initAudioConferencePanel()
SoundLevelChangeEvent.MIN_LEVEL, SoundLevelChangeEvent.MIN_LEVEL,
SoundLevelChangeEvent.MAX_LEVEL); SoundLevelChangeEvent.MAX_LEVEL);
soundIndicator.setPreferredSize(new Dimension(80, 30));
securityStatusLabel = new SecurityStatusLabel(); securityStatusLabel = new SecurityStatusLabel();
securityStatusLabel.setSecurityOff(); securityStatusLabel.setSecurityOff();
this.setLayout(new GridBagLayout()); this.setLayout(new GridBagLayout());
this.setBorder(BorderFactory.createEmptyBorder(7, 7, 7, 7)); this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
this.initTitleBar(); this.initTitleBar();
@ -298,26 +313,17 @@ private void initAudioConferencePanel()
*/ */
private void initPeerDetailsPanel() private void initPeerDetailsPanel()
{ {
ImageIcon avatarIcon
= new ImageIcon(
ImageLoader
.getImage(ImageLoader.DEFAULT_USER_PHOTO)
.getScaledInstance(
AVATAR_WIDTH,
AVATAR_HEIGHT,
Image.SCALE_SMOOTH));
peerDetailsPanel.setLayout(new GridBagLayout()); peerDetailsPanel.setLayout(new GridBagLayout());
peerDetailsPanel.setBackground(new Color(255, 255, 255)); peerDetailsPanel.setBackground(new Color(255, 255, 255));
imageLabel.setIcon(avatarIcon); setParticipantIcon(null, false);
constraints.fill = GridBagConstraints.NONE; constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 0; constraints.gridx = 0;
constraints.gridy = 0; constraints.gridy = 0;
constraints.weightx = 0; constraints.weightx = 0;
constraints.weighty = 0; constraints.weighty = 0;
constraints.insets = new Insets(5, 10, 5, 0); constraints.insets = new Insets(5, 8, 5, 0);
peerDetailsPanel.add(imageLabel, constraints); peerDetailsPanel.add(imageLabel, constraints);
@ -326,7 +332,7 @@ private void initPeerDetailsPanel()
constraints.gridy = 0; constraints.gridy = 0;
constraints.weightx = 1f; constraints.weightx = 1f;
constraints.weighty = 0; constraints.weighty = 0;
constraints.insets = new Insets(5, 20, 5, 20); constraints.insets = new Insets(5, 10, 5, 10);
rightDetailsPanel.add(soundIndicator); rightDetailsPanel.add(soundIndicator);
peerDetailsPanel.add(rightDetailsPanel, constraints); peerDetailsPanel.add(rightDetailsPanel, constraints);
@ -339,6 +345,7 @@ private void initTitleBar()
{ {
titleBar.setBorder(BorderFactory.createEmptyBorder(2, 8, 2, 8)); titleBar.setBorder(BorderFactory.createEmptyBorder(2, 8, 2, 8));
nameLabel.setForeground(Color.WHITE);
nameBar.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); nameBar.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
nameBarConstraints.gridx = 0; nameBarConstraints.gridx = 0;
nameBarConstraints.gridy = 0; nameBarConstraints.gridy = 0;
@ -346,6 +353,7 @@ private void initTitleBar()
nameBar.add(nameLabel, nameBarConstraints); nameBar.add(nameLabel, nameBarConstraints);
statusBar.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); statusBar.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
callStatusLabel.setForeground(Color.WHITE);
statusBarConstraints.gridx = 0; statusBarConstraints.gridx = 0;
statusBarConstraints.gridy = 0; statusBarConstraints.gridy = 0;
statusBarConstraints.weightx = 1f; statusBarConstraints.weightx = 1f;
@ -398,15 +406,7 @@ public void loadSkin()
{ {
if(!iconChanged) if(!iconChanged)
{ {
ImageIcon avatarIcon setParticipantIcon(null, false);
= new ImageIcon(
ImageLoader.getImage(ImageLoader.DEFAULT_USER_PHOTO)
.getScaledInstance(
AVATAR_WIDTH,
AVATAR_HEIGHT,
Image.SCALE_SMOOTH));
imageLabel.setIcon(avatarIcon);
} }
securityStatusLabel.setIcon( securityStatusLabel.setIcon(
@ -435,7 +435,7 @@ public void paintComponent(Graphics g)
g.setColor(bgColor); g.setColor(bgColor);
g.fillRoundRect( g.fillRoundRect(
5, 5, this.getWidth() - 10, this.getHeight() - 10, 20, 20); 5, 5, this.getWidth() - 10, this.getHeight() - 10, 10, 10);
} }
finally finally
{ {
@ -555,15 +555,7 @@ public void run()
*/ */
public void setParticipantImage(byte[] image) public void setParticipantImage(byte[] image)
{ {
ImageIcon icon = ImageUtils.getScaledRoundedIcon(image, setParticipantIcon(image, true);
AVATAR_WIDTH,
AVATAR_HEIGHT);
if (icon != null)
{
iconChanged = true;
imageLabel.setIcon(icon);
}
} }
/** /**
@ -614,4 +606,67 @@ public void updateSoundBar(int soundLevel)
if (soundIndicator != null) if (soundIndicator != null)
soundIndicator.updateSoundLevel(soundLevel); soundIndicator.updateSoundLevel(soundLevel);
} }
/**
* Enables or disabled video indicator in this conference participant
* panel.
*
* @param enable <tt>true</tt> to enable video indicator, <tt>false</tt> -
* otherwise
*/
public void enableVideoIndicator(boolean enable)
{
isVideoIndicatorEnabled = enable;
setParticipantIcon(null, true);
}
/**
* Sets the participant icon.
*
* @param image the image to set as an icon. If null will use the last set
* image or the default one
* @param changed indicates if this is a change of the icon
*/
private void setParticipantIcon(byte[] image, boolean changed)
{
if (image != null && image.length > 0)
participantImage
= ImageUtils.getScaledRoundedIcon( image,
AVATAR_WIDTH,
AVATAR_HEIGHT).getImage();
else if (participantImage == null)
participantImage
= ImageLoader.getImage(ImageLoader.DEFAULT_USER_PHOTO)
.getScaledInstance(
AVATAR_WIDTH,
AVATAR_HEIGHT,
Image.SCALE_SMOOTH);
Image videoIndicatorImage = null;
if (isVideoIndicatorEnabled)
videoIndicatorImage
= ImageLoader.getImage(ImageLoader.CONFERENCE_VIDEO_INDICATOR);
Icon avatarIcon = null;
if (videoIndicatorImage != null && participantImage != null)
avatarIcon = new ImageIcon(ImageLoader.getImage(
participantImage,
videoIndicatorImage,
participantImage.getWidth(null)
- videoIndicatorImage.getWidth(null) + 5,
participantImage.getHeight(null)
- videoIndicatorImage.getHeight(null) + 5));
else if (participantImage != null)
avatarIcon = new ImageIcon(participantImage);
if (avatarIcon != null)
{
imageLabel.setIcon(avatarIcon);
if (changed)
iconChanged = true;
}
}
} }

@ -556,6 +556,27 @@ public void setSecurityPanelVisible(boolean visible)
{ {
} }
/**
* Enables or disabled video indicator in this conference participant
* panel.
*
* @param confMember the <tt>ConferenceMember</tt>, which video indicator
* we'd like to update
* @param enable <tt>true</tt> to enable video indicator, <tt>false</tt> -
* otherwise
*/
public void enableVideoIndicator( ConferenceMember confMember,
boolean enable)
{
if (!conferenceMemberPanels.containsKey(confMember))
return;
ConferenceMemberPanel confMemberPanel
= conferenceMemberPanels.get(confMember);
confMemberPanel.enableVideoIndicator(enable);
}
/** /**
* Implements the listeners which get notified about events related to the * Implements the listeners which get notified about events related to the
* <tt>CallPeer</tt> depicted by this <tt>ConferenceFocusPanel</tt> and * <tt>CallPeer</tt> depicted by this <tt>ConferenceFocusPanel</tt> and

@ -0,0 +1,101 @@
/*
* Jitsi, 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.conference;
import java.awt.*;
import net.java.sip.communicator.impl.gui.main.call.*;
import net.java.sip.communicator.service.gui.call.*;
import net.java.sip.communicator.service.protocol.*;
/**
* The <tt>ThumbnailConferenceCallPanel</tt> is the panel containing all video
* conference participants as thumbnails.
*
* @author Yana Stamcheva
*/
public class ThumbnailConferenceCallPanel
extends AudioConferenceCallPanel
{
/**
* Initializes a new <tt>ThumbnailConferenceCallPanel</tt> instance which is
* to be used by a specific <tt>CallPanel</tt> to depict a specific
* <tt>CallConference</tt>. The new instance will depict both the
* audio-related and the video-related information.
*
* @param callPanel the <tt>CallPanel</tt> which will use the new instance
* to depict the specified <tt>CallConference</tt>.
* @param callConference the <tt>CallConference</tt> to be depicted by the
* new instance
* @param uiVideoHandler the utility which is to aid the new instance in
* dealing with the video-related information
*/
public ThumbnailConferenceCallPanel(CallPanel callPanel,
CallConference callConference,
UIVideoHandler2 uiVideoHandler)
{
super(callPanel, callConference);
setBackground(Color.DARK_GRAY);
}
/**
* Updates the thumbnail of the given <tt>callPeer</tt>.
*
* @param callPeer the <tt>CallPeer</tt>, which thumbnail
* to update
* @param isVideo indicates if the video is enabled for the
* <tt>callPeer</tt>
*/
public void updateThumbnail(CallPeer callPeer, boolean isVideo)
{
CallPeerRenderer peerRenderer = getCallPeerRenderer(callPeer);
if (peerRenderer instanceof ConferencePeerPanel)
{
((ConferencePeerPanel) peerRenderer)
.enableVideoIndicator(isVideo);
}
}
/**
* Updates the thumbnail of the given <tt>conferenceMember</tt>.
*
* @param conferenceMember the <tt>ConferenceMember</tt>, which thumbnail
* to update
* @param isVideo indicates if the video is enabled for the conference
* member
*/
public void updateThumbnail(ConferenceMember conferenceMember,
boolean isVideo)
{
CallPeerRenderer focusRenderer
= getCallPeerRenderer(conferenceMember.getConferenceFocusCallPeer());
if (focusRenderer instanceof ConferenceFocusPanel)
{
((ConferenceFocusPanel) focusRenderer)
.enableVideoIndicator(conferenceMember, isVideo);
}
}
/**
* Updates the local user thumbnail.
*
* @param isVideo indicates if the video is enabled for the local user
*/
public void updateThumbnail(boolean isVideo)
{
CallPeerRenderer peerRenderer = getCallPeerRenderer(null);
if (peerRenderer instanceof ConferencePeerPanel)
{
((ConferencePeerPanel) peerRenderer)
.enableVideoIndicator(isVideo);
}
}
}

@ -80,6 +80,11 @@ public void update(Observable o, Object arg)
*/ */
private final Set<Component> videos = new HashSet<Component>(); private final Set<Component> videos = new HashSet<Component>();
/**
* The thumbnail container.
*/
private final ThumbnailConferenceCallPanel thumbnailContainer;
/** /**
* Initializes a new <tt>VideoConferenceCallPanel</tt> instance which is to * Initializes a new <tt>VideoConferenceCallPanel</tt> instance which is to
* be used by a specific <tt>CallPanel</tt> to depict a specific * be used by a specific <tt>CallPanel</tt> to depict a specific
@ -102,6 +107,11 @@ public VideoConferenceCallPanel(
this.uiVideoHandler = uiVideoHandler; this.uiVideoHandler = uiVideoHandler;
thumbnailContainer
= new ThumbnailConferenceCallPanel( callPanel,
callConference,
uiVideoHandler);
videoContainer = createVideoContainer(); videoContainer = createVideoContainer();
/* /*
@ -249,15 +259,13 @@ public void paintComponent(Graphics g)
private VideoContainer createVideoContainer() private VideoContainer createVideoContainer()
{ {
VideoContainer videoContainer = new VideoContainer(null, true); VideoContainer videoContainer = new VideoContainer(null, true);
GridBagConstraints videoContainerGridBagConstraints
= new GridBagConstraints();
videoContainerGridBagConstraints.fill = GridBagConstraints.BOTH; JPanel thumbnailPanel = new JPanel(new BorderLayout());
videoContainerGridBagConstraints.gridx = 0; thumbnailPanel.setBackground(Color.DARK_GRAY);
videoContainerGridBagConstraints.gridy = 0; thumbnailPanel.add(thumbnailContainer, BorderLayout.NORTH);
videoContainerGridBagConstraints.weightx = 1;
videoContainerGridBagConstraints.weighty = 1; add(thumbnailPanel, BorderLayout.EAST);
add(videoContainer, videoContainerGridBagConstraints); add(videoContainer, BorderLayout.CENTER);
return videoContainer; return videoContainer;
} }
@ -929,6 +937,24 @@ private class ConferenceParticipantContainer
*/ */
private final VideoContainer videoContainer; private final VideoContainer videoContainer;
/**
* The <tt>CallPeer</tt> associated with this container, if it has been
* created to represent a <tt>CallPeer</tt>.
*/
private CallPeer callPeer;
/**
* The <tt>conferenceMember</tt> associated with this container, if it
* has been created to represent a <tt>conferenceMember</tt>.
*/
private ConferenceMember conferenceMember;
/**
* Indicates that this container contains information for the local
* user.
*/
private boolean isLocalUser;
/** /**
* Initializes a new <tt>ConferenceParticipantContainer</tt> instance * Initializes a new <tt>ConferenceParticipantContainer</tt> instance
* which is to depict the local peer/user. * which is to depict the local peer/user.
@ -946,29 +972,37 @@ public ConferenceParticipantContainer(Call call, Component video)
new ConferencePeerPanel( new ConferencePeerPanel(
VideoConferenceCallPanel.this, VideoConferenceCallPanel.this,
call, call,
true)); true),
null, null, true);
} }
public ConferenceParticipantContainer( public ConferenceParticipantContainer(
CallPeer callPeer, CallPeer callPeer,
Component video) Component video)
{ {
this( this( createDefaultPhotoPanel(callPeer),
createDefaultPhotoPanel(callPeer),
video, video,
new ConferencePeerPanel( new ConferencePeerPanel(
VideoConferenceCallPanel.this, VideoConferenceCallPanel.this,
callPeer, callPeer,
true)); true),
callPeer, null, false);
} }
private ConferenceParticipantContainer( private ConferenceParticipantContainer(
Component noVideo, Component noVideo,
Component video, Component video,
BasicConferenceParticipantPanel<?> toolBar) BasicConferenceParticipantPanel<?> toolBar,
CallPeer callPeer,
ConferenceMember conferenceMember,
boolean isLocalUser)
{ {
super(new BorderLayout()); super(new BorderLayout());
this.callPeer = callPeer;
this.conferenceMember = conferenceMember;
this.isLocalUser = isLocalUser;
videoContainer = new VideoContainer(noVideo, false); videoContainer = new VideoContainer(noVideo, false);
add(videoContainer, BorderLayout.CENTER); add(videoContainer, BorderLayout.CENTER);
@ -977,7 +1011,11 @@ private ConferenceParticipantContainer(
add(this.toolBar, BorderLayout.SOUTH); add(this.toolBar, BorderLayout.SOUTH);
if (video != null) if (video != null)
{
setVideo(video); setVideo(video);
}
else
setVisible(false);
} }
public ConferenceParticipantContainer( public ConferenceParticipantContainer(
@ -990,7 +1028,8 @@ public ConferenceParticipantContainer(
new ConferenceMemberPanel( new ConferenceMemberPanel(
VideoConferenceCallPanel.this, VideoConferenceCallPanel.this,
conferenceMember, conferenceMember,
true)); true),
null, conferenceMember, false);
} }
public void dispose() public void dispose()
@ -1319,7 +1358,26 @@ void setVideo(Component video)
this.video = video; this.video = video;
if (this.video != null) if (this.video != null)
{
setVisible(true);
videoContainer.add(this.video, VideoLayout.CENTER_REMOTE); videoContainer.add(this.video, VideoLayout.CENTER_REMOTE);
}
else
setVisible(false);
// Update thumbnails container according to video status.
if (thumbnailContainer != null)
{
if (conferenceMember != null)
thumbnailContainer
.updateThumbnail(conferenceMember, (video != null));
else if (callPeer != null)
thumbnailContainer
.updateThumbnail(callPeer, (video != null));
else if (isLocalUser)
thumbnailContainer
.updateThumbnail((video != null));
}
} }
} }
} }

@ -757,32 +757,38 @@ public class ImageLoader
/** /**
* A call-transfer button icon. The icon shown in the CallPeer panel. * A call-transfer button icon. The icon shown in the CallPeer panel.
*/ */
public static final ImageID TRANSFER_CALL_BUTTON = public static final ImageID TRANSFER_CALL_BUTTON
new ImageID("service.gui.buttons.TRANSFER_CALL_BUTTON"); = new ImageID("service.gui.buttons.TRANSFER_CALL_BUTTON");
/** /**
* The secure button on icon. The icon shown in the CallPeer panel. * The secure button on icon. The icon shown in the CallPeer panel.
*/ */
public static final ImageID SECURE_BUTTON_ON = public static final ImageID SECURE_BUTTON_ON
new ImageID("service.gui.buttons.SECURE_BUTTON_ON"); = new ImageID("service.gui.buttons.SECURE_BUTTON_ON");
/** /**
* The secure button off icon. The icon shown in the CallPeer panel. * The secure button off icon. The icon shown in the CallPeer panel.
*/ */
public static final ImageID SECURE_BUTTON_OFF = public static final ImageID SECURE_BUTTON_OFF
new ImageID("service.gui.buttons.SECURE_BUTTON_OFF"); = new ImageID("service.gui.buttons.SECURE_BUTTON_OFF");
/**
* The secure button pending icon.
*/
public static final ImageID SECURE_BUTTON_PENDING
= new ImageID("service.gui.buttons.SECURE_BUTTON_PENDING");
/** /**
* The conference secure button off icon. * The conference secure button off icon.
*/ */
public static final ImageID SECURE_OFF_CONF_CALL = public static final ImageID SECURE_OFF_CONF_CALL
new ImageID("service.gui.buttons.SECURE_OFF_CONF_CALL"); = new ImageID("service.gui.buttons.SECURE_OFF_CONF_CALL");
/** /**
* The secure button on icon. The icon shown in the CallPeer panel. * The secure button on icon. The icon shown in the CallPeer panel.
*/ */
public static final ImageID SECURE_AUDIO_ON = public static final ImageID SECURE_AUDIO_ON
new ImageID("service.gui.buttons.SECURE_AUDIO_ON"); = new ImageID("service.gui.buttons.SECURE_AUDIO_ON");
/** /**
* The secure button off icon. The icon shown in the CallPeer panel. * The secure button off icon. The icon shown in the CallPeer panel.
@ -1031,6 +1037,12 @@ public class ImageLoader
public static final ImageID DIAL_PAD_CALL_BUTTON_BG public static final ImageID DIAL_PAD_CALL_BUTTON_BG
= new ImageID("service.gui.buttons.DIAL_PAD_CALL_BUTTON_BG"); = new ImageID("service.gui.buttons.DIAL_PAD_CALL_BUTTON_BG");
/**
* The conference video indicator.
*/
public static final ImageID CONFERENCE_VIDEO_INDICATOR
= new ImageID("service.gui.icons.CONFERENCE_VIDEO_INDICATOR");
/* /*
* ======================================================================= * =======================================================================
* ------------------------ EDIT TOOLBAR ICONS --------------------------- * ------------------------ EDIT TOOLBAR ICONS ---------------------------
@ -1512,9 +1524,17 @@ public static Image getIndexedProtocolImage(
*/ */
public static Image getImage(Image bgImage, Image topImage, int x, int y) public static Image getImage(Image bgImage, Image topImage, int x, int y)
{ {
int width = (x + topImage.getWidth(null) > bgImage.getWidth(null))
? x + topImage.getWidth(null)
: bgImage.getWidth(null);
int height = (y + topImage.getHeight(null) > bgImage.getHeight(null))
? y + topImage.getHeight(null)
: bgImage.getHeight(null);
BufferedImage buffImage BufferedImage buffImage
= new BufferedImage(bgImage.getWidth(null), = new BufferedImage(width,
bgImage.getHeight(null), height,
BufferedImage.TYPE_INT_ARGB); BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) buffImage.getGraphics(); Graphics2D g = (Graphics2D) buffImage.getGraphics();

Loading…
Cancel
Save