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();