diff --git a/lib/installer-exclude/libjitsi.jar b/lib/installer-exclude/libjitsi.jar
old mode 100755
new mode 100644
index 65601299d..c49cccda9
Binary files a/lib/installer-exclude/libjitsi.jar and b/lib/installer-exclude/libjitsi.jar differ
diff --git a/resources/colors/colors.properties b/resources/colors/colors.properties
index 52101fc6f..58f4e070e 100644
--- a/resources/colors/colors.properties
+++ b/resources/colors/colors.properties
@@ -179,13 +179,13 @@ service.gui.ERROR_FOREGROUND=CC0000
service.gui.CHAT_LINK_COLOR=4A9BDB
# 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.
-service.gui.CALL_MEMBER_NAME_BACKGROUND=BDFFA3
+service.gui.CALL_MEMBER_NAME_BACKGROUND=2f2f2f
# 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.
service.gui.MAC_PANEL_BACKGROUND=f0f0f0
diff --git a/resources/images/images.properties b/resources/images/images.properties
index 5fccb1d0d..37133a52d 100644
--- a/resources/images/images.properties
+++ b/resources/images/images.properties
@@ -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.CONFERENCE_CALL=resources/images/impl/gui/common/conferenceCall.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
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.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_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_OFF=resources/images/impl/gui/buttons/secureVideoOff.png
service.gui.buttons.SECURE_AUDIO_ON=resources/images/impl/gui/buttons/secureAudioOn.png
diff --git a/resources/images/impl/gui/buttons/secureOff.png b/resources/images/impl/gui/buttons/secureOff.png
index 5ddc3bdc6..341af5227 100644
Binary files a/resources/images/impl/gui/buttons/secureOff.png and b/resources/images/impl/gui/buttons/secureOff.png differ
diff --git a/resources/images/impl/gui/buttons/secureOffConfCall.png b/resources/images/impl/gui/buttons/secureOffConfCall.png
index 8478e4724..341af5227 100644
Binary files a/resources/images/impl/gui/buttons/secureOffConfCall.png and b/resources/images/impl/gui/buttons/secureOffConfCall.png differ
diff --git a/resources/images/impl/gui/buttons/secureOn.png b/resources/images/impl/gui/buttons/secureOn.png
index 8cae6a663..9d28e86c3 100644
Binary files a/resources/images/impl/gui/buttons/secureOn.png and b/resources/images/impl/gui/buttons/secureOn.png differ
diff --git a/resources/images/impl/gui/buttons/securePending.png b/resources/images/impl/gui/buttons/securePending.png
new file mode 100644
index 000000000..994595fd7
Binary files /dev/null and b/resources/images/impl/gui/buttons/securePending.png differ
diff --git a/resources/images/impl/gui/buttons/tools.png b/resources/images/impl/gui/buttons/tools.png
index d6c1b80af..a5f5d8f29 100644
Binary files a/resources/images/impl/gui/buttons/tools.png and b/resources/images/impl/gui/buttons/tools.png differ
diff --git a/resources/images/impl/gui/common/conferenceVideoIndicator.png b/resources/images/impl/gui/common/conferenceVideoIndicator.png
new file mode 100644
index 000000000..b184d65aa
Binary files /dev/null and b/resources/images/impl/gui/common/conferenceVideoIndicator.png differ
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallStatusPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/CallStatusPanel.java
index ac2ae6dac..798b14399 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/CallStatusPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/CallStatusPanel.java
@@ -46,7 +46,7 @@ public void paintComponent(Graphics g)
AntialiasingManager.activateAntialiasing(g);
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
{
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallTitlePanel.java b/src/net/java/sip/communicator/impl/gui/main/call/CallTitlePanel.java
index d33c28fac..21687dad4 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/CallTitlePanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/CallTitlePanel.java
@@ -59,7 +59,7 @@ public void paintComponent(Graphics g)
AntialiasingManager.activateAntialiasing(g);
g.setColor(backgroundColor);
- g.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), 20, 20);
+ g.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), 10, 10);
}
finally
{
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/OneToOneCallPeerPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/OneToOneCallPeerPanel.java
index 35b1eec19..a753b17db 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/OneToOneCallPeerPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/OneToOneCallPeerPanel.java
@@ -1509,7 +1509,7 @@ public void paintComponent(Graphics g)
AntialiasingManager.activateAntialiasing(g);
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
{
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/SecurityStatusLabel.java b/src/net/java/sip/communicator/impl/gui/main/call/SecurityStatusLabel.java
index d0df7a306..b9e7e5a5c 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/SecurityStatusLabel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/SecurityStatusLabel.java
@@ -12,7 +12,6 @@
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.util.skin.*;
/**
@@ -42,30 +41,9 @@ public class SecurityStatusLabel
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
- = 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;
+ private static Icon securityPendingIcon;
/**
* Creates an instance of SecurityStatusLabel by specifying the
@@ -82,48 +60,12 @@ public SecurityStatusLabel()
setHorizontalTextPosition(JLabel.LEFT);
}
- /**
- * Paints a custom background to better indicate security state.
- *
- * @param g the Graphics 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.
*/
public void setSecurityOn()
{
- isSecure = true;
setIcon(securityOnIcon);
- setBackground(securityOnBackground);
setToolTipText(GuiActivator.getResources().getI18NString(
"service.gui.security.CALL_SECURED_TOOLTIP"));
}
@@ -133,9 +75,7 @@ public void setSecurityOn()
*/
public void setSecurityOff()
{
- isSecure = false;
setIcon(securityOffIcon);
- setBackground(securityOffBackground);
this.setToolTipText(GuiActivator.getResources().getI18NString(
"service.gui.security.CALL_NOT_SECURED_TOOLTIP"));
}
@@ -145,9 +85,7 @@ public void setSecurityOff()
*/
public void setSecurityPending()
{
- isSecure = false;
- setIcon(securityOnIcon);
- setBackground(goingSecureBackground);
+ setIcon(securityPendingIcon);
this.setToolTipText(GuiActivator.getResources().getI18NString(
"service.gui.security.CALL_SECURED_COMPARE_TOOLTIP"));
}
@@ -173,5 +111,8 @@ public void loadSkin()
securityOnIcon = new ImageIcon(ImageLoader
.getImage(ImageLoader.SECURE_BUTTON_ON));
+
+ securityPendingIcon = new ImageIcon(ImageLoader
+ .getImage(ImageLoader.SECURE_BUTTON_PENDING));
}
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/conference/AudioConferenceCallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/conference/AudioConferenceCallPanel.java
index 04e9c9cde..8148ada7e 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/conference/AudioConferenceCallPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/conference/AudioConferenceCallPanel.java
@@ -115,15 +115,7 @@ public AudioConferenceCallPanel(
* because the video may already be flowing between the CallPeers.
* Otherwise, the videos of the remote CallPeers will not be shown.
*/
- GridBagConstraints scrollPaneGridBagConstraints
- = new GridBagConstraints();
-
- scrollPaneGridBagConstraints.fill = GridBagConstraints.BOTH;
- scrollPaneGridBagConstraints.gridx = 1;
- scrollPaneGridBagConstraints.gridy = 0;
- scrollPaneGridBagConstraints.weightx = 1;
- scrollPaneGridBagConstraints.weighty = 1;
- add(scrollPane, scrollPaneGridBagConstraints);
+ add(scrollPane, BorderLayout.CENTER);
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceCallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceCallPanel.java
index e729d7310..24ce74720 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceCallPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceCallPanel.java
@@ -13,7 +13,6 @@
import javax.swing.*;
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.event.*;
@@ -24,7 +23,7 @@
* @author Lyubomir Marinov
*/
public abstract class BasicConferenceCallPanel
- extends TransparentPanel
+ extends JPanel
implements SwingCallRenderer
{
/**
@@ -101,7 +100,7 @@ protected BasicConferenceCallPanel(
CallPanel callPanel,
CallConference callConference)
{
- super(new GridBagLayout());
+ super(new BorderLayout());
this.callPanel = callPanel;
this.callConference = callConference;
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceParticipantPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceParticipantPanel.java
index 9b5de87a5..65f4ff0ab 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceParticipantPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceParticipantPanel.java
@@ -46,7 +46,7 @@ public abstract class BasicConferenceParticipantPanel
/**
* 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.
@@ -139,6 +139,7 @@ public abstract class BasicConferenceParticipantPanel
*/
private SoundLevelIndicator soundIndicator;
+
/**
* The status bar of the participant panel.
*/
@@ -156,6 +157,16 @@ public abstract class BasicConferenceParticipantPanel
*/
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 BasicConferenceParticipantPanel instance which
* is to depict a specific conference participant.
@@ -198,6 +209,8 @@ public void addToNameBar(Component component)
{
nameBarConstraints.gridx = nameBarConstraints.gridx + 1;
nameBarConstraints.weightx = 0f;
+ nameBarConstraints.insets = new Insets(0, 5, 0, 0);
+
this.nameBar.add(component, nameBarConstraints);
}
@@ -266,11 +279,13 @@ private void initAudioConferencePanel()
SoundLevelChangeEvent.MIN_LEVEL,
SoundLevelChangeEvent.MAX_LEVEL);
+ soundIndicator.setPreferredSize(new Dimension(80, 30));
+
securityStatusLabel = new SecurityStatusLabel();
securityStatusLabel.setSecurityOff();
this.setLayout(new GridBagLayout());
- this.setBorder(BorderFactory.createEmptyBorder(7, 7, 7, 7));
+ this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
this.initTitleBar();
@@ -298,26 +313,17 @@ private void initAudioConferencePanel()
*/
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.setBackground(new Color(255, 255, 255));
- imageLabel.setIcon(avatarIcon);
+ setParticipantIcon(null, false);
constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 0;
constraints.gridy = 0;
constraints.weightx = 0;
constraints.weighty = 0;
- constraints.insets = new Insets(5, 10, 5, 0);
+ constraints.insets = new Insets(5, 8, 5, 0);
peerDetailsPanel.add(imageLabel, constraints);
@@ -326,7 +332,7 @@ private void initPeerDetailsPanel()
constraints.gridy = 0;
constraints.weightx = 1f;
constraints.weighty = 0;
- constraints.insets = new Insets(5, 20, 5, 20);
+ constraints.insets = new Insets(5, 10, 5, 10);
rightDetailsPanel.add(soundIndicator);
peerDetailsPanel.add(rightDetailsPanel, constraints);
@@ -339,6 +345,7 @@ private void initTitleBar()
{
titleBar.setBorder(BorderFactory.createEmptyBorder(2, 8, 2, 8));
+ nameLabel.setForeground(Color.WHITE);
nameBar.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
nameBarConstraints.gridx = 0;
nameBarConstraints.gridy = 0;
@@ -346,6 +353,7 @@ private void initTitleBar()
nameBar.add(nameLabel, nameBarConstraints);
statusBar.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
+ callStatusLabel.setForeground(Color.WHITE);
statusBarConstraints.gridx = 0;
statusBarConstraints.gridy = 0;
statusBarConstraints.weightx = 1f;
@@ -398,15 +406,7 @@ public void loadSkin()
{
if(!iconChanged)
{
- ImageIcon avatarIcon
- = new ImageIcon(
- ImageLoader.getImage(ImageLoader.DEFAULT_USER_PHOTO)
- .getScaledInstance(
- AVATAR_WIDTH,
- AVATAR_HEIGHT,
- Image.SCALE_SMOOTH));
-
- imageLabel.setIcon(avatarIcon);
+ setParticipantIcon(null, false);
}
securityStatusLabel.setIcon(
@@ -435,7 +435,7 @@ public void paintComponent(Graphics g)
g.setColor(bgColor);
g.fillRoundRect(
- 5, 5, this.getWidth() - 10, this.getHeight() - 10, 20, 20);
+ 5, 5, this.getWidth() - 10, this.getHeight() - 10, 10, 10);
}
finally
{
@@ -555,15 +555,7 @@ public void run()
*/
public void setParticipantImage(byte[] image)
{
- ImageIcon icon = ImageUtils.getScaledRoundedIcon(image,
- AVATAR_WIDTH,
- AVATAR_HEIGHT);
-
- if (icon != null)
- {
- iconChanged = true;
- imageLabel.setIcon(icon);
- }
+ setParticipantIcon(image, true);
}
/**
@@ -614,4 +606,67 @@ public void updateSoundBar(int soundLevel)
if (soundIndicator != null)
soundIndicator.updateSoundLevel(soundLevel);
}
+
+ /**
+ * Enables or disabled video indicator in this conference participant
+ * panel.
+ *
+ * @param enable true to enable video indicator, false -
+ * 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;
+ }
+ }
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/conference/ConferenceFocusPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/conference/ConferenceFocusPanel.java
index 6925b4bdd..d4c568c4d 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/conference/ConferenceFocusPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/conference/ConferenceFocusPanel.java
@@ -556,6 +556,27 @@ public void setSecurityPanelVisible(boolean visible)
{
}
+ /**
+ * Enables or disabled video indicator in this conference participant
+ * panel.
+ *
+ * @param confMember the ConferenceMember, which video indicator
+ * we'd like to update
+ * @param enable true to enable video indicator, false -
+ * 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
* CallPeer depicted by this ConferenceFocusPanel and
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/conference/ThumbnailConferenceCallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/conference/ThumbnailConferenceCallPanel.java
new file mode 100644
index 000000000..43a8f4963
--- /dev/null
+++ b/src/net/java/sip/communicator/impl/gui/main/call/conference/ThumbnailConferenceCallPanel.java
@@ -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 ThumbnailConferenceCallPanel is the panel containing all video
+ * conference participants as thumbnails.
+ *
+ * @author Yana Stamcheva
+ */
+public class ThumbnailConferenceCallPanel
+ extends AudioConferenceCallPanel
+{
+ /**
+ * Initializes a new ThumbnailConferenceCallPanel instance which is
+ * to be used by a specific CallPanel to depict a specific
+ * CallConference. The new instance will depict both the
+ * audio-related and the video-related information.
+ *
+ * @param callPanel the CallPanel which will use the new instance
+ * to depict the specified CallConference.
+ * @param callConference the CallConference 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 callPeer.
+ *
+ * @param callPeer the CallPeer, which thumbnail
+ * to update
+ * @param isVideo indicates if the video is enabled for the
+ * callPeer
+ */
+ 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 conferenceMember.
+ *
+ * @param conferenceMember the ConferenceMember, 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);
+ }
+ }
+}
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/conference/VideoConferenceCallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/conference/VideoConferenceCallPanel.java
index 82c1751af..4ad3fb2c8 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/conference/VideoConferenceCallPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/conference/VideoConferenceCallPanel.java
@@ -80,6 +80,11 @@ public void update(Observable o, Object arg)
*/
private final Set videos = new HashSet();
+ /**
+ * The thumbnail container.
+ */
+ private final ThumbnailConferenceCallPanel thumbnailContainer;
+
/**
* Initializes a new VideoConferenceCallPanel instance which is to
* be used by a specific CallPanel to depict a specific
@@ -102,6 +107,11 @@ public VideoConferenceCallPanel(
this.uiVideoHandler = uiVideoHandler;
+ thumbnailContainer
+ = new ThumbnailConferenceCallPanel( callPanel,
+ callConference,
+ uiVideoHandler);
+
videoContainer = createVideoContainer();
/*
@@ -249,15 +259,13 @@ public void paintComponent(Graphics g)
private VideoContainer createVideoContainer()
{
VideoContainer videoContainer = new VideoContainer(null, true);
- GridBagConstraints videoContainerGridBagConstraints
- = new GridBagConstraints();
- videoContainerGridBagConstraints.fill = GridBagConstraints.BOTH;
- videoContainerGridBagConstraints.gridx = 0;
- videoContainerGridBagConstraints.gridy = 0;
- videoContainerGridBagConstraints.weightx = 1;
- videoContainerGridBagConstraints.weighty = 1;
- add(videoContainer, videoContainerGridBagConstraints);
+ JPanel thumbnailPanel = new JPanel(new BorderLayout());
+ thumbnailPanel.setBackground(Color.DARK_GRAY);
+ thumbnailPanel.add(thumbnailContainer, BorderLayout.NORTH);
+
+ add(thumbnailPanel, BorderLayout.EAST);
+ add(videoContainer, BorderLayout.CENTER);
return videoContainer;
}
@@ -929,6 +937,24 @@ private class ConferenceParticipantContainer
*/
private final VideoContainer videoContainer;
+ /**
+ * The CallPeer associated with this container, if it has been
+ * created to represent a CallPeer.
+ */
+ private CallPeer callPeer;
+
+ /**
+ * The conferenceMember associated with this container, if it
+ * has been created to represent a conferenceMember.
+ */
+ private ConferenceMember conferenceMember;
+
+ /**
+ * Indicates that this container contains information for the local
+ * user.
+ */
+ private boolean isLocalUser;
+
/**
* Initializes a new ConferenceParticipantContainer instance
* which is to depict the local peer/user.
@@ -946,29 +972,37 @@ public ConferenceParticipantContainer(Call call, Component video)
new ConferencePeerPanel(
VideoConferenceCallPanel.this,
call,
- true));
+ true),
+ null, null, true);
}
public ConferenceParticipantContainer(
CallPeer callPeer,
Component video)
{
- this(
- createDefaultPhotoPanel(callPeer),
+ this( createDefaultPhotoPanel(callPeer),
video,
new ConferencePeerPanel(
VideoConferenceCallPanel.this,
callPeer,
- true));
+ true),
+ callPeer, null, false);
}
private ConferenceParticipantContainer(
Component noVideo,
Component video,
- BasicConferenceParticipantPanel> toolBar)
+ BasicConferenceParticipantPanel> toolBar,
+ CallPeer callPeer,
+ ConferenceMember conferenceMember,
+ boolean isLocalUser)
{
super(new BorderLayout());
+ this.callPeer = callPeer;
+ this.conferenceMember = conferenceMember;
+ this.isLocalUser = isLocalUser;
+
videoContainer = new VideoContainer(noVideo, false);
add(videoContainer, BorderLayout.CENTER);
@@ -977,7 +1011,11 @@ private ConferenceParticipantContainer(
add(this.toolBar, BorderLayout.SOUTH);
if (video != null)
+ {
setVideo(video);
+ }
+ else
+ setVisible(false);
}
public ConferenceParticipantContainer(
@@ -990,7 +1028,8 @@ public ConferenceParticipantContainer(
new ConferenceMemberPanel(
VideoConferenceCallPanel.this,
conferenceMember,
- true));
+ true),
+ null, conferenceMember, false);
}
public void dispose()
@@ -1319,7 +1358,26 @@ void setVideo(Component video)
this.video = video;
if (this.video != null)
+ {
+ setVisible(true);
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));
+ }
}
}
}
diff --git a/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java b/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java
index 87959525e..968da6027 100644
--- a/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java
+++ b/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java
@@ -757,32 +757,38 @@ public class ImageLoader
/**
* A call-transfer button icon. The icon shown in the CallPeer panel.
*/
- public static final ImageID TRANSFER_CALL_BUTTON =
- new ImageID("service.gui.buttons.TRANSFER_CALL_BUTTON");
+ public static final ImageID TRANSFER_CALL_BUTTON
+ = new ImageID("service.gui.buttons.TRANSFER_CALL_BUTTON");
/**
* The secure button on icon. The icon shown in the CallPeer panel.
*/
- public static final ImageID SECURE_BUTTON_ON =
- new ImageID("service.gui.buttons.SECURE_BUTTON_ON");
+ public static final ImageID SECURE_BUTTON_ON
+ = new ImageID("service.gui.buttons.SECURE_BUTTON_ON");
/**
* The secure button off icon. The icon shown in the CallPeer panel.
*/
- public static final ImageID SECURE_BUTTON_OFF =
- new ImageID("service.gui.buttons.SECURE_BUTTON_OFF");
+ public static final ImageID 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.
*/
- public static final ImageID SECURE_OFF_CONF_CALL =
- new ImageID("service.gui.buttons.SECURE_OFF_CONF_CALL");
+ public static final ImageID 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.
*/
- public static final ImageID SECURE_AUDIO_ON =
- new ImageID("service.gui.buttons.SECURE_AUDIO_ON");
+ public static final ImageID SECURE_AUDIO_ON
+ = new ImageID("service.gui.buttons.SECURE_AUDIO_ON");
/**
* 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
= 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 ---------------------------
@@ -1512,9 +1524,17 @@ public static Image getIndexedProtocolImage(
*/
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
- = new BufferedImage(bgImage.getWidth(null),
- bgImage.getHeight(null),
+ = new BufferedImage(width,
+ height,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) buffImage.getGraphics();