/* * 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.plugin.desktoputil.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.media.*; import net.java.sip.communicator.service.resources.*; import org.jitsi.service.neomedia.*; import org.jitsi.service.resources.*; /** * The <tt>VolumeControlButton</tt> is the button shown in the call window, * which allows to adjust the playback volume of your call. * * @author Yana Stamcheva * @author Damian Minkov * @author Lyubomir Marinov */ public class OutputVolumeControlButton { /** * The <tt>CallConference</tt> (i.e. telephony conference-related state) * depicted by this instance. */ private final CallConference callConference; /** * The indicator which determines whether the user interface * (representation) of this instance is (to be) displayed in full-screen * mode. */ private final boolean fullScreen; /** * The icon image. */ private ImageID iconImageID; private final boolean inButtonToolBar; /** * Creates volume control button. * * @param callConference * @param iconImageID the image. * @param fullScreen is full screen. * @param inButtonToolBar indicates if this button is shown in the button * tool bar */ public OutputVolumeControlButton( CallConference callConference, ImageID iconImageID, boolean fullScreen, boolean inButtonToolBar) { this.callConference = callConference; this.iconImageID = iconImageID; this.fullScreen = fullScreen; this.inButtonToolBar = inButtonToolBar; } /** * Creates the slider component for the full screen interface. * * @return the created component */ public Component createSliderComponent() { ResourceManagementService r = GuiActivator.getResources(); final Color bgColor = new Color(r.getColor("service.gui.CALL_TOOL_BAR_SOUND_BG")); @SuppressWarnings("serial") TransparentPanel soundPanel = new TransparentPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)) { @Override public void paintComponent(Graphics g) { super.paintComponent(g); g = g.create(); try { AntialiasingManager.activateAntialiasing(g); g.setColor(bgColor); g.fillRoundRect( 0, 0, getWidth() - 1, getHeight() - 1, 8, 8); } finally { g.dispose(); } } }; soundPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); VolumeControl volumeControl = getOutputVolumeControl(); // Creates the menu that would contain the volume control component. VolumeControlSlider slider = new VolumeControlSlider(volumeControl, JSlider.HORIZONTAL); soundPanel.add( new JLabel(r.getImage("service.gui.icons.NO_SOUND_ICON"))); soundPanel.add(slider); soundPanel.add( new JLabel(r.getImage("service.gui.icons.SOUND_MENU_ICON"))); return soundPanel; } /** * Initializes the volume control button. * * @param isButtonBar indicates if this button is shown in the button * tool bar * @param iconImageID the identifier of the button icon * @param toolTipTextKey the key of the tool tip text */ public Component createVolumeControlButton( boolean isButtonBar, ImageID iconImageID, String toolTipTextKey) { this.iconImageID = iconImageID; final SIPCommButton volumeControlButton = new VolumeControlButton(isButtonBar); if (toolTipTextKey != null) { volumeControlButton.setToolTipText( GuiActivator.getResources().getI18NString(toolTipTextKey)); } VolumeControl volumeControl = getOutputVolumeControl(); // Creates the menu that would contain the volume control component. final JPopupMenu sliderMenu = new VolumeControlSlider(volumeControl, JSlider.VERTICAL) .getPopupMenu(); sliderMenu.setInvoker(volumeControlButton); volumeControlButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ev) { Point location = new Point( volumeControlButton.getX(), volumeControlButton.getY() + volumeControlButton.getHeight()); SwingUtilities.convertPointToScreen( location, volumeControlButton.getParent()); sliderMenu.setLocation(location); sliderMenu.setVisible(!sliderMenu.isVisible()); } }); return volumeControlButton; } /** * Returns the component associated with this output volume control button. * * @return the component associated with this output volume control button */ public Component getComponent() { if (fullScreen) return createSliderComponent(); else { return createVolumeControlButton( inButtonToolBar, iconImageID, "service.gui.VOLUME_CONTROL_TOOL_TIP"); } } /** * Gets the <tt>VolumeControl</tt> instance (to be) depicted by this * instance. * * @return the <tt>VolumeControl</tt> instance (to be) depicted by this * instance */ private VolumeControl getOutputVolumeControl() { VolumeControl volumeControl = null; if (callConference instanceof MediaAwareCallConference) { volumeControl = ((MediaAwareCallConference) callConference) .getOutputVolumeControl(); } if (volumeControl == null) { volumeControl = GuiActivator.getMediaService().getOutputVolumeControl(); } return volumeControl; } /** * The <tt>VolumeControlButton</tt> */ @SuppressWarnings("serial") private class VolumeControlButton extends SIPCommButton { /** * The background image. */ private ImageID bgImage; /** * The pressed image. */ private ImageID pressedImage; public VolumeControlButton(boolean inSettingsPanel) { super( ImageLoader.getImage(ImageLoader.SOUND_SETTING_BUTTON_PRESSED), ImageLoader.getImage(iconImageID)); if(inSettingsPanel) { bgImage = ImageLoader.CALL_SETTING_BUTTON_BG; pressedImage = ImageLoader.CALL_SETTING_BUTTON_PRESSED_BG; } else { bgImage = ImageLoader.SOUND_SETTING_BUTTON_BG; pressedImage = ImageLoader.SOUND_SETTING_BUTTON_PRESSED; } // Loads the skin of this button. loadSkin(); } /** * Loads images. */ public void loadSkin() { setBackgroundImage(ImageLoader.getImage(bgImage)); setPressedImage(ImageLoader.getImage(pressedImage)); if (iconImageID != null) { if (!fullScreen && !inButtonToolBar) setIconImage(ImageUtils.scaleImageWithinBounds( ImageLoader.getImage(iconImageID), 18, 18)); else setIconImage(ImageLoader.getImage(iconImageID)); } } } }