/*
* 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.call;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
/**
* The button responsible to start(the <tt>Call</tt> of) an associated
* <tt>CallPariticant</tt>.
*
* @author Yana Stamcheva
*/
public class DesktopSharingButton
extends AbstractCallToggleButton
{
/**
* Whether desktop sharing is enabled. If false, calls to
* <tt>setEnabled(true)</tt> will NOT enable the button.
*/
private boolean desktopSharingAvailable;
/**
* Initializes a new <tt>DesktopSharingButton</tt> instance which is meant
* to be used to initiate a desktop sharing during a call.
*
* @param call the <tt>Call</tt> to be associated with the desktop sharing
* button instance
*/
public DesktopSharingButton(Call call)
{
this(call, false);
}
/**
* Initializes a new <tt>HoldButton</tt> instance which is to put a specific
* <tt>CallPeer</tt> on/off hold.
*
* @param call the <tt>Call</tt> to be associated with the new instance and
* to be put on/off hold upon performing its action
* @param selected <tt>true</tt> if the new toggle button is to be initially
* selected; otherwise, <tt>false</tt>
*/
public DesktopSharingButton(Call call, boolean selected)
{
super( call,
selected,
ImageLoader.CALL_DESKTOP_BUTTON,
"service.gui.SHARE_DESKTOP_WITH_CONTACT");
OperationSetDesktopStreaming desktopSharing
= call.getProtocolProvider().getOperationSet(
OperationSetDesktopStreaming.class);
if (desktopSharing == null)
{
setToolTipText(GuiActivator.getResources().getI18NString(
"service.gui.NO_DESKTOP_SHARING_FOR_PROTOCOL"));
desktopSharingAvailable = false;
}
else if(!ConfigurationUtils.hasEnabledVideoFormat(
call.getProtocolProvider()))
{
setToolTipText(GuiActivator.getResources()
.getI18NString("service.gui.NO_VIDEO_ENCODINGS"));
desktopSharingAvailable = false;
}
else
{
setToolTipText(GuiActivator.getResources()
.getI18NString("service.gui.SHARE_DESKTOP_WITH_CONTACT"));
desktopSharingAvailable = true;
}
super.setEnabled(desktopSharingAvailable);
}
/**
* Shares the desktop with the peers in the current call.
*/
@Override
public void buttonPressed()
{
if (call != null)
{
// If it's already enabled, we disable it.
if (CallManager.isDesktopSharingEnabled(call))
{
CallManager.enableDesktopSharing(call, false);
}
// Otherwise we enable the desktop sharing.
else
{
//We'll select the button once the desktop sharing has been
// established.
setSelected(false);
JPopupMenu sharingMenu = createDesktopSharingMenu();
Point location = new Point(getX(), getY() + getHeight());
SwingUtilities.convertPointToScreen(location, getParent());
sharingMenu.setLocation(location);
sharingMenu.setVisible(true);
}
}
}
/**
* Creates the menu responsible for desktop sharing when a single desktop
* sharing contact is available.
*
* @return the created popup menu
*/
private JPopupMenu createDesktopSharingMenu()
{
final JPopupMenu popupMenu = new JPopupMenu(
GuiActivator.getResources().getI18NString(
"service.gui.SHARE_DESKTOP"));
popupMenu.setInvoker(this);
popupMenu.setFocusable(true);
JMenuItem shareFullScreen = new JMenuItem(GuiActivator.getResources()
.getI18NString("service.gui.SHARE_FULL_SCREEN"),
new ImageIcon(
ImageLoader.getImage(ImageLoader.DESKTOP_SHARING)));
JMenuItem shareRegion = new JMenuItem(GuiActivator.getResources()
.getI18NString("service.gui.SHARE_REGION"),
new ImageIcon(
ImageLoader.getImage(ImageLoader.REGION_DESKTOP_SHARING)));
popupMenu.add(shareFullScreen);
popupMenu.add(shareRegion);
shareFullScreen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
popupMenu.setVisible(false);
CallManager.enableDesktopSharing(call, true);
}
});
shareRegion.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
popupMenu.setVisible(false);
CallManager.enableRegionDesktopSharing(call, true);
}
});
return popupMenu;
}
/**
* Enables/disables the button. If <tt>this.desktopSharingAvailable</tt> is
* false, keeps the button as it is (i.e. disabled).
*
* @param enable <tt>true</tt> to enable the button, <tt>false</tt> to
* disable it.
*/
@Override
public void setEnabled(final boolean enable)
{
if(!SwingUtilities.isEventDispatchThread())
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
setEnabled(enable);
}
});
return;
}
if(desktopSharingAvailable)
super.setEnabled(enable);
}
}