/*
* 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.utils.*;
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.service.protocol.event.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.skin.*;
import org.jitsi.service.resources.*;
/**
* The panel containing the subject of the chat room and the configuration
* button.
*
* @author Yana Stamcheva
* @author Lubomir Marinov
* @author Adam Netocny
*/
public class ChatRoomSubjectPanel
extends TransparentPanel
implements Skinnable,
ChatRoomLocalUserRoleListener
{
/**
* The <tt>Logger</tt> used by the <tt>ChatRoomSubjectPanel</tt> class and
* its instances for logging output.
*/
private static final Logger logger
= Logger.getLogger(ChatRoomSubjectPanel.class);
/**
* The corresponding chat session.
*/
private final ConferenceChatSession chatSession;
/**
* The field containing the subject of the chat room.
*/
private final JTextField subjectField = new JTextField();
/**
* Config button.
*/
private JButton configButton;
/**
* Members list button.
*/
private JButton membersListButton;
/**
* Configuration buttons.
*/
private final JPanel configButtonsPanel =
new TransparentPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
/**
* Creates the panel containing the chat room subject.
*
* @param chatSession the chat session
* chat room subject and the configuration information.
*/
public ChatRoomSubjectPanel(ConferenceChatSession chatSession)
{
super(new BorderLayout(0, 5));
this.chatSession = chatSession;
JLabel subjectLabel
= new JLabel(
GuiActivator.getResources().getI18NString(
"service.gui.SUBJECT") + ": ");
subjectField.setText(chatSession.getChatSubject());
// TODO Implement the editing of the chat room subject.
subjectField.setEditable(false);
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 0));
add(subjectLabel, BorderLayout.WEST);
add(subjectField, BorderLayout.CENTER);
add(configButtonsPanel, BorderLayout.EAST);
chatSession.addLocalUserRoleListener(this);
updateConfigButtons();
}
/**
* Updates the config button state add or remove depending on the
* user role.
*/
private synchronized void updateConfigButtons()
{
ChatRoom room = ((ChatRoomWrapper)chatSession.getDescriptor())
.getChatRoom();
ChatRoomMemberRole role = room.getUserRole();
if(!ConfigurationUtils.isChatRoomConfigDisabled()
&& (role.equals(ChatRoomMemberRole.ADMINISTRATOR)
|| role.equals(ChatRoomMemberRole.OWNER)))
{
if(membersListButton == null)
{
membersListButton
= new JButton(new ImageIcon(ImageLoader.getImage(
ImageLoader.CHAT_ROOM_MEMBERS_LIST_CONFIG)));
membersListButton.setToolTipText(
GuiActivator.getResources().getI18NString(
"service.gui.CHAT_ROOM_CONFIGURATION_MEMBERS_EDIT_TITLE"));
membersListButton.setPreferredSize(new Dimension(26, 26));
membersListButton.addActionListener(
new MembersListButtonActionListener());
configButtonsPanel.add(membersListButton);
revalidate();
repaint();
}
}
else if(membersListButton != null)
{
remove(membersListButton);
membersListButton = null;
revalidate();
repaint();
}
if(!ConfigurationUtils.isChatRoomConfigDisabled()
&& role.equals(ChatRoomMemberRole.OWNER))
{
if(configButton == null)
{
configButton
= new JButton(new ImageIcon(ImageLoader.getImage(
ImageLoader.CHAT_ROOM_CONFIG)));
configButton.setToolTipText(
GuiActivator.getResources().getI18NString(
"service.gui.CHAT_ROOM_OPTIONS"));
configButton.setPreferredSize(new Dimension(26, 26));
configButton.addActionListener(
new ConfigButtonActionListener());
configButtonsPanel.add(configButton);
revalidate();
repaint();
}
}
else if(configButton != null)
{
remove(configButton);
configButton = null;
revalidate();
repaint();
}
}
/**
* Gets the (chat room) subject displayed in this
* <tt>ChatRoomSubjectPanel</tt>.
*
* @return the (chat room) subject displayed in this
* <tt>ChatRoomSubjectPanel</tt>
*/
public String getSubject()
{
return subjectField.getText();
}
/**
* Sets the (chat room) subject to be displayed in this
* <tt>ChatRoomSubjectPanel</tt>.
*
* @param subject the (chat room) subject to be displayed in this
* <tt>ChatRoomSubjectPanel</tt>
*/
public void setSubject(String subject)
{
subjectField.setText(subject);
}
/**
* Fired when local user role has changed.
* @param evt the <tt>ChatRoomLocalUserRoleChangeEvent</tt> instance
*/
@Override
public void localUserRoleChanged(final ChatRoomLocalUserRoleChangeEvent evt)
{
if(!SwingUtilities.isEventDispatchThread())
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
localUserRoleChanged(evt);
}
});
return;
}
updateConfigButtons();
}
/**
* Reload config button if exists.
*/
public void loadSkin()
{
if(configButton != null)
configButton.setIcon(new ImageIcon(
ImageLoader.getImage(ImageLoader.CHAT_ROOM_CONFIG)));
if(membersListButton != null)
membersListButton.setIcon(new ImageIcon(
ImageLoader.getImage(
ImageLoader.CHAT_ROOM_MEMBERS_LIST_CONFIG)));
}
/**
* Runs clean-up.
*/
public void dispose()
{
chatSession.removeLocalUserRoleListener(this);
}
/**
* Opens the configuration dialog when the configure buttons is pressed.
*/
private class ConfigButtonActionListener
implements ActionListener
{
/**
* Obtains and opens the configuration form of the corresponding chat
* room when user clicks on the configuration button.
* @param evt the <tt>ActionEvent</tt> that notified us
*/
public void actionPerformed(ActionEvent evt)
{
try
{
ChatRoomConfigurationForm configForm
= chatSession.getChatConfigurationForm();
ChatRoomConfigurationWindow configWindow
= new ChatRoomConfigurationWindow(
chatSession.getChatName(), configForm);
configWindow.pack();
configWindow.setVisible(true);
}
catch (OperationFailedException e)
{
logger.error(
"Failed to obtain the chat room configuration form.", e);
ResourceManagementService resources
= GuiActivator.getResources();
if(e.getErrorCode()
== OperationFailedException.NOT_ENOUGH_PRIVILEGES)
{
new ErrorDialog(
null,
resources.getI18NString("service.gui.WARNING"),
resources.getI18NString(
"service.gui.CHAT_ROOM_CONFIGURATION_FORBIDDEN",
new String[]{chatSession.getChatName()}),
ErrorDialog.WARNING)
.showDialog();
}
else
{
new ErrorDialog(
null,
resources.getI18NString("service.gui.ERROR"),
resources.getI18NString(
"service.gui.CHAT_ROOM_CONFIGURATION_FAILED",
new String[]{chatSession.getChatName()}),
e)
.showDialog();
}
}
}
}
/**
* Opens the configuration dialog for members list when
* the button is pressed.
*/
private class MembersListButtonActionListener
implements ActionListener
{
/**
* Just opens the MembersListDialog.
* @param evt the <tt>ActionEvent</tt> that notified us
*/
public void actionPerformed(ActionEvent evt)
{
MembersListDialog dialog = new MembersListDialog(
(ChatRoomWrapper)chatSession.getDescriptor(),
GuiActivator.getResources().getI18NString(
"service.gui.CHAT_ROOM_CONFIGURATION_MEMBERS_EDIT_TITLE"),
false);
dialog.setVisible(true);
}
}
}