/* * 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.chat.conference; import java.awt.*; import java.awt.event.*; import javax.swing.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.call.*; import net.java.sip.communicator.impl.gui.main.chat.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.muc.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.skin.*; /** * The dialog that allows the user to create or join a conference in the chat * room. * * @author Hristo Terezov */ public class ChatConferenceCallDialog extends SIPCommDialog implements ActionListener, Skinnable { /** * Create conference radio button. */ private final JRadioButton createConferenceButton = new JRadioButton( GuiActivator.getResources() .getI18NString("service.gui.CREATE_VIDEO_CONFERENCE")); /** * Join conference radio button. */ private final JRadioButton joinConferenceButton = new JRadioButton( GuiActivator.getResources() .getI18NString("service.gui.JOIN_EXISTING_VIDEO_CONFERENCE")); /** * Main panel that holds all elements in the dialog. */ private final JPanel mainPanel = new TransparentPanel(new BorderLayout(10,10)); /** * A panel with the join conference elements */ private final JPanel joinPanel = new TransparentPanel(new BorderLayout(5,5)); /** * A panel with the create conference elements */ private final JPanel createPanel = new TransparentPanel(new BorderLayout()); /** * Field for the name of the conference. */ private final JTextField name = new JTextField(); /** * The list with the announced conferences. */ private ChatRoomConferenceCallsListPanel chatConferenceListPanel; /** * OK button. */ private JButton okButton = new JButton( GuiActivator.getResources().getI18NString("service.gui.OK")); /** * Cancel button. */ private JButton cancelButton = new JButton( GuiActivator.getResources().getI18NString("service.gui.CANCEL")); /** * A button that ends the created conference by the user. */ private JButton endConference = new JButton( GuiActivator.getResources().getI18NString( "service.gui.END_CONFERENCE")); /** * The chat panel that created the dialog. */ private ChatPanel chatPanel = null; /** * The chat room associated with the dialog. */ private ChatRoom chatRoom = null; /** * Constructs the <tt>ChatConferenceCallDialog</tt>. * * @param chatPanel the chat panel that created and showed the dialog. */ public ChatConferenceCallDialog(ChatPanel chatPanel) { super(GuiActivator.getUIService().getMainFrame()); setTitle(GuiActivator.getResources().getI18NString( "service.gui.CREATE_JOIN_VIDEO_CONFERENCE")); chatConferenceListPanel = new ChatRoomConferenceCallsListPanel(chatPanel); this.chatPanel = chatPanel; Object o = chatPanel.getChatSession().getDescriptor(); if (o instanceof ChatRoomWrapper) chatRoom = ((ChatRoomWrapper)o).getChatRoom(); initButtons(); initPanels(); add(mainPanel, BorderLayout.NORTH); } /** * Creates panels for create and join conference use cases. */ private void initPanels() { JPanel conferenceNamePanel = new TransparentPanel(new BorderLayout(10,10)); JLabel nameLabel = new JLabel( GuiActivator.getResources().getI18NString("service.gui.NAME")); conferenceNamePanel.add(nameLabel, BorderLayout.WEST); conferenceNamePanel.add(name, BorderLayout.CENTER); name.setEditable(true); name.setColumns(30); if(chatRoom != null) name.setText(GuiActivator.getResources() .getI18NString("service.gui.CHAT_CONFERENCE_ITEM_LABEL", new String[]{chatRoom.getUserNickname()})); createPanel.add(conferenceNamePanel,BorderLayout.CENTER); createPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); JLabel selectConferenceLabel = new JLabel( GuiActivator.getResources().getI18NString( "service.gui.SELECT_VIDEO_CONFERENCE")); joinPanel.add(selectConferenceLabel, BorderLayout.NORTH); joinPanel.add(chatConferenceListPanel,BorderLayout.CENTER); joinPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); } /** * Creates the radio buttons that user chooses to create or join a * conference. Creates OK and Cancel buttons. Creates "End Conference" * button. */ private void initButtons() { JPanel createOrJoinChoicePanel = new TransparentPanel( new BorderLayout(10,10)); createConferenceButton.addActionListener( this ); joinConferenceButton.addActionListener( this ); createConferenceButton.setOpaque(false); joinConferenceButton.setOpaque(false); ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(createConferenceButton); buttonGroup.add(joinConferenceButton); createOrJoinChoicePanel.add(createConferenceButton, BorderLayout.NORTH); createOrJoinChoicePanel.add(joinConferenceButton, BorderLayout.CENTER); createOrJoinChoicePanel.setBorder( BorderFactory.createEmptyBorder(10, 10, 0, 10)); mainPanel.add(createOrJoinChoicePanel, BorderLayout.NORTH); JPanel buttonPanel = new TransparentPanel(new FlowLayout(FlowLayout.RIGHT)); endConference.setEnabled(false); endConference.addActionListener(this); okButton.addActionListener(this); cancelButton.addActionListener(this); buttonPanel.add(endConference); buttonPanel.add(okButton); buttonPanel.add(cancelButton); mainPanel.add(buttonPanel, BorderLayout.SOUTH); } /** * {@inheritDoc} * Selects the create radio button if there are no announced conferences or * the join radio button if there are announced conferences. */ @Override public void setVisible(boolean isVisible) { if(isVisible) setSelectedRadioButton( ((chatConferenceListPanel.getListSize() == 0 && createConferenceButton.isEnabled())? true : false)); super.setVisible(isVisible); } /** * Selects a radio button and shows the correct panel related to the * selected radio button. * * @param isCreateSelected if <tt>true</tt> the create radio button will be * selected. If <tt>false</tt> the join radio button will be selected. */ public void setSelectedRadioButton(boolean isCreateSelected) { if(isCreateSelected) { createConferenceButton.setSelected(true); } else { joinConferenceButton.setSelected(true); } updateView(); } /** * Enables/Disables the create radio button. If the create radio button is * disabled selects the join radio button and shows the join panel. * * @param enabled whether the panel should be enabled or disabled. */ public void setCreatePanelEnabled(boolean enabled) { if(!enabled) { setSelectedRadioButton(false); createConferenceButton.setEnabled(false); } else { createConferenceButton.setEnabled(true); } } /** * Enables (or disables) the "End Conference" button. * * @param enabled whether the button should be enabled or disabled. */ public void setEndConferenceButtonEnabled(boolean enabled) { endConference.setEnabled(enabled); } /** * Initializes the list of the conferences that are already announced. The * list is displayed in the join panel. */ public void initConferences() { chatConferenceListPanel.initConferences(); } /** * Handles the <tt>ActionEvent</tt> triggered when one user clicks * on one of the buttons. * @param e the event. */ public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source instanceof JButton) { if(source.equals(okButton)) { if(createConferenceButton.isSelected()) { createConference(); } else { joinConference(); } } else if(source.equals(endConference)) { chatRoom.publishConference(null, null); } this.setVisible(false); } else if(source instanceof JRadioButton) { if (source.equals(createConferenceButton) || source.equals(joinConferenceButton)) { updateView(); } } } /** * Checks whether the create or join panel should be visible and shows it. */ private void updateView() { mainPanel.remove( (createConferenceButton.isSelected()? joinPanel : createPanel)); mainPanel.add( (createConferenceButton.isSelected()? createPanel : joinPanel), BorderLayout.CENTER); if(joinConferenceButton.isSelected()) this.chatConferenceListPanel.setSelectedIndex(0); pack(); } /** * Creates a chat room conference call. */ private void createConference() { if(chatRoom == null) return; String conferenceName = name.getText(); OperationSetTelephonyConferencing telephonyConferencing = chatRoom.getParentProvider().getOperationSet( OperationSetTelephonyConferencing.class); ConferenceDescription cd = null; if (telephonyConferencing != null) { cd = telephonyConferencing.setupConference(chatRoom); } if (cd != null) { chatRoom.publishConference(cd, conferenceName); } } /** * Joins an existing chat room conference call. */ private void joinConference() { ConferenceDescription chatConference = chatConferenceListPanel.getSelectedValue(); if (chatConference != null) CallManager.call(chatPanel.getChatSession() .getCurrentChatTransport() .getProtocolProvider(), chatConference, chatRoom); } /** * Reloads icon label. */ public void loadSkin() { chatConferenceListPanel.loadSkin(); } /** * Adds a <tt>ConferenceDescription</tt> to the list of conferences. * * @param conferenceDescription the <tt>ConferenceDescription</tt> to add */ public void addConference(ConferenceDescription conferenceDescription) { chatConferenceListPanel.addConference(conferenceDescription); } /** * Removes the given <tt>ConferenceDescription</tt> from the list of * conferences. * * @param conferenceDescription the <tt>ConferenceDescription</tt> to remove */ public void removeConference(ConferenceDescription conferenceDescription) { chatConferenceListPanel.removeConference(conferenceDescription); } }