diff --git a/resources/languages/resources.properties b/resources/languages/resources.properties index 20fbea494..e33ae2763 100644 --- a/resources/languages/resources.properties +++ b/resources/languages/resources.properties @@ -466,6 +466,7 @@ service.gui.SEND_VIA=Send via service.gui.SENT=sent service.gui.SET_GLOBAL_STATUS=Set global status service.gui.SET_STATUS_MESSAGE=Set status message +service.gui.SET_SUBJECT=Set Subject service.gui.SETTINGS=&Options service.gui.SHARE_DESKTOP=&Share desktop service.gui.SHARE_DESKTOP_WITH_CONTACT=Share desktop with contact diff --git a/src/net/java/sip/communicator/impl/gui/customcontrols/MessageDialog.java b/src/net/java/sip/communicator/impl/gui/customcontrols/MessageDialog.java index d107c0470..ed512be6c 100644 --- a/src/net/java/sip/communicator/impl/gui/customcontrols/MessageDialog.java +++ b/src/net/java/sip/communicator/impl/gui/customcontrols/MessageDialog.java @@ -218,7 +218,7 @@ private void init() TransparentPanel iconPanel = new TransparentPanel(new BorderLayout()); iconPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 0)); - iconPanel.add(iconLabel, BorderLayout.CENTER); + iconPanel.add(iconLabel, BorderLayout.NORTH); this.getContentPane().add(iconPanel, BorderLayout.WEST); this.getContentPane().add(mainPanel, BorderLayout.CENTER); diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatOperationReasonDialog.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatOperationReasonDialog.java index 9905eb20e..6cb22db19 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatOperationReasonDialog.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatOperationReasonDialog.java @@ -25,6 +25,9 @@ public class ChatOperationReasonDialog extends MessageDialog private final JLabel reasonLabel = new JLabel( GuiActivator.getResources() .getI18NString("service.gui.REASON") + ":"); + + + private JPanel reasonFieldPanel = new JPanel(new BorderLayout()); private final JTextField reasonField = new JTextField(); @@ -152,9 +155,9 @@ public ChatOperationReasonDialog(Frame chatWindow, String title, reasonPanel.add(new JLabel(" "), BorderLayout.EAST); - JPanel reasonFieldPanel = new JPanel(new BorderLayout()); + reasonFieldPanel.add(reasonField, BorderLayout.NORTH); - + reasonFieldPanel.setOpaque(false); reasonPanel.add(reasonFieldPanel, BorderLayout.CENTER); reasonPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); reasonPanel.setOpaque(false); @@ -191,6 +194,15 @@ public void changedUpdate(DocumentEvent arg0) this.pack(); } + /** + * Adds component to panel which contains the reason text field. + * @param comp the component to be added. + */ + public void addToReasonFieldPannel(Component comp) + { + reasonFieldPanel.add(comp, BorderLayout.CENTER); + } + /** * Enables the OK button if reason field is not empty and disables it if the * reason field is empty. diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomWrapper.java b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomWrapper.java index f7db38ed0..d1d8e7b96 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomWrapper.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomWrapper.java @@ -6,10 +6,16 @@ */ 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.customcontrols.*; import net.java.sip.communicator.impl.gui.main.chat.*; 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.util.*; @@ -273,20 +279,34 @@ public void setAutoJoin(boolean value) chatRoomID, AUTOJOIN_PROPERTY_NAME, null); } } - + /** - * Opens a dialog with a field for the nickname and returns the nickname. + * Opens a dialog with a fields for the nickname and the subject of the room + * and returns them. * - * @return the nickname + * @return array with the nickname and subject values. */ - public String getNickname() + public String[] getJoinOptions() + { + return getJoinOptions(false); + } + + /** + * Opens a dialog with a fields for the nickname and the subject of the room + * and returns them. + * + * @param dontDisplaySubjectFields if true the subject fields will be hidden + * @return array with the nickname and subject values. + */ + public String[] getJoinOptions(boolean dontDisplaySubjectFields) { String nickName = null; - ChatOperationReasonDialog reasonDialog = - new ChatOperationReasonDialog(GuiActivator.getResources() + ChatRoomJoinOptionsDialog reasonDialog = + new ChatRoomJoinOptionsDialog(GuiActivator.getResources() .getI18NString("service.gui.CHANGE_NICKNAME"), GuiActivator .getResources().getI18NString( - "service.gui.CHANGE_NICKNAME_LABEL"), false, true); + "service.gui.CHANGE_NICKNAME_LABEL"), false, true, + dontDisplaySubjectFields); reasonDialog.setIcon(ImageLoader.getImage( ImageLoader.CHANGE_NICKNAME_ICON)); @@ -328,7 +348,99 @@ public String getNickname() getChatRoomID(), "userNickName", nickName); } + String[] joinOptions = {nickName, + (reasonDialog.isSubjectCheckboxChecked()? + reasonDialog.getSubject() : null)}; + return joinOptions; + } + + /** + * Dialog with fields for nickname and subject. + */ + private class ChatRoomJoinOptionsDialog extends ChatOperationReasonDialog + { + /** + * Checkbox that hides or displays the subject field. + */ + private JCheckBox setSubject = new SIPCommCheckBox(GuiActivator + .getResources().getI18NString("service.gui.SET_SUBJECT")); + + /** + * Text field for the subject. + */ + private JTextField subject = new JTextField(); + + /** + * Adds the subject fields to dialog. Sets action listeners. + * + * @param title the title of the dialog + * @param message the message shown in this dialog + * @param disableOKIfReasonIsEmpty if true the OK button will be + * disabled if the reason text is empty. + * @param showReasonLabel specify if we want the "Reason:" label + * @param dontDisplaySubjectFields if true the sibject fields will be + * hidden. + */ + public ChatRoomJoinOptionsDialog(String title, String message, + boolean showReasonLabel, + boolean disableOKIfReasonIsEmpty, + boolean dontDisplaySubjectFields) + { + super(title, + message, + showReasonLabel, + disableOKIfReasonIsEmpty); + subject.setVisible(false); + if(!dontDisplaySubjectFields) + { + JPanel subjectPannel = new JPanel(new BorderLayout()); + subjectPannel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + subjectPannel.setOpaque(false); + subjectPannel.add(setSubject, BorderLayout.NORTH); + subjectPannel.add(subject, BorderLayout.CENTER); + addToReasonFieldPannel(subjectPannel); + setSubject.addActionListener(this); + this.pack(); + } + } - return nickName; + /** + * Handles the ActionEvent. + * + * @param e the ActionEvent that notified us + */ + public void actionPerformed(ActionEvent e) + { + if(e.getSource() instanceof JCheckBox) + { + subject.setVisible(setSubject.isSelected()); + this.pack(); + } + else + { + super.actionPerformed(e); + } + } + + /** + * Returns the text entered in the subject field. + * + * @return the text from the subject field. + */ + public String getSubject() + { + return subject.getText(); + } + + /** + * Checks if the subject checkbox is checked or not. + * + * @return true if the checkbox is checked and false if the checkbox is + * not checked. + */ + public boolean isSubjectCheckboxChecked() + { + return setSubject.isSelected(); + } } } diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ConferenceChatManager.java b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ConferenceChatManager.java index 8625dbeaf..eb49c932f 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ConferenceChatManager.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ConferenceChatManager.java @@ -659,6 +659,45 @@ public void rejectInvitation( multiUserChatAdHocOpSet.rejectInvitation(invitation, reason); } + /** + * Joins the given chat room with the given password and manages all the + * exceptions that could occur during the join process. + * + * @param chatRoomWrapper the chat room to join. + * @param nickName the nickname we choose for the given chat room. + * @param password the password. + * @param rememberPassword if true the password should be saved. + * @param isFirstAttempt is this the first attempt to join room, used + * to check whether to show some error messages + * @param subject the subject which will be set to the room after the user + * join successful. + */ + public void joinChatRoom( ChatRoomWrapper chatRoomWrapper, + String nickName, + byte[] password, + boolean rememberPassword, + boolean isFirstAttempt, + String subject) + { + ChatRoom chatRoom = chatRoomWrapper.getChatRoom(); + + if(chatRoom == null) + { + new ErrorDialog( + GuiActivator.getUIService().getMainFrame(), + GuiActivator.getResources().getI18NString("service.gui.WARNING"), + GuiActivator.getResources().getI18NString( + "service.gui.CHAT_ROOM_NOT_CONNECTED", + new String[]{chatRoomWrapper.getChatRoomName()})) + .showDialog(); + + return; + } + + new JoinChatRoomTask(chatRoomWrapper, nickName, password, + rememberPassword, isFirstAttempt, subject).execute(); + } + /** * Joins the given chat room with the given password and manages all the * exceptions that could occur during the join process. @@ -693,6 +732,23 @@ public void joinChatRoom( ChatRoomWrapper chatRoomWrapper, byte[] password, boolean rememberPassword, boolean isFirstAttempt) + { + this.joinChatRoom( + chatRoomWrapper, nickName, password, rememberPassword, + isFirstAttempt, null); + } + + /** + * Joins the given chat room with the given password and manages all the + * exceptions that could occur during the join process. + * + * @param chatRoomWrapper the chat room to join. + * @param nickName the nickname we choose for the given chat room. + * @param password the password. + */ + public void joinChatRoom( ChatRoomWrapper chatRoomWrapper, + String nickName, + byte[] password) { ChatRoom chatRoom = chatRoomWrapper.getChatRoom(); @@ -709,8 +765,7 @@ public void joinChatRoom( ChatRoomWrapper chatRoomWrapper, return; } - new JoinChatRoomTask(chatRoomWrapper, nickName, password, - rememberPassword, isFirstAttempt).execute(); + new JoinChatRoomTask(chatRoomWrapper, nickName, password).execute(); } /** @@ -720,10 +775,13 @@ public void joinChatRoom( ChatRoomWrapper chatRoomWrapper, * @param chatRoomWrapper the chat room to join. * @param nickName the nickname we choose for the given chat room. * @param password the password. + * @param subject the subject which will be set to the room after the user + * join successful. */ public void joinChatRoom( ChatRoomWrapper chatRoomWrapper, String nickName, - byte[] password) + byte[] password, + String subject) { ChatRoom chatRoom = chatRoomWrapper.getChatRoom(); @@ -740,7 +798,8 @@ public void joinChatRoom( ChatRoomWrapper chatRoomWrapper, return; } - new JoinChatRoomTask(chatRoomWrapper, nickName, password).execute(); + new JoinChatRoomTask(chatRoomWrapper, nickName, password, subject) + .execute(); } /** @@ -1607,16 +1666,20 @@ private static class JoinChatRoomTask private final boolean rememberPassword; private final boolean isFirstAttempt; + + private final String subject; JoinChatRoomTask( ChatRoomWrapper chatRoomWrapper, String nickName, byte[] password, boolean rememberPassword, - boolean isFirstAttempt) + boolean isFirstAttempt, + String subject) { this.chatRoomWrapper = chatRoomWrapper; this.nickName = nickName; this.isFirstAttempt = isFirstAttempt; + this.subject = subject; if(password == null) { @@ -1641,7 +1704,15 @@ private static class JoinChatRoomTask String nickName, byte[] password) { - this(chatRoomWrapper, nickName, password, false, true); + this(chatRoomWrapper, nickName, password, false, true, null); + } + + JoinChatRoomTask( ChatRoomWrapper chatRoomWrapper, + String nickName, + byte[] password, + String subject) + { + this(chatRoomWrapper, nickName, password, false, true, subject); } /** @@ -1752,7 +1823,8 @@ protected void done() nickName, new String(authWindow.getPassword()).getBytes(), authWindow.isRememberPassword(), - false); + false, + subject); } } else if(REGISTRATION_REQUIRED.equals(returnCode)) @@ -1794,9 +1866,24 @@ else if(SUBSCRIPTION_ALREADY_EXISTS.equals(returnCode)) "service.gui.ERROR"), errorMessage).showDialog(); } - if (SUCCESS.equals(returnCode) && rememberPassword) + if (SUCCESS.equals(returnCode)) { - chatRoomWrapper.savePassword(new String(password)); + if(rememberPassword) + { + chatRoomWrapper.savePassword(new String(password)); + } + + if(subject != null) + { + try + { + chatRoomWrapper.getChatRoom().setSubject(subject); + } + catch(OperationFailedException ex) + { + logger.warn("Failed to set subject."); + } + } } } } diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomRightButtonMenu.java index 0df3adee5..ffeebc811 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomRightButtonMenu.java +++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomRightButtonMenu.java @@ -102,6 +102,8 @@ public void actionPerformed(ActionEvent e) ConferenceChatManager conferenceManager = GuiActivator.getUIService().getConferenceChatManager(); + String[] joinOptions; + String subject = null; if (itemName.equals("removeChatRoom")) { @@ -121,10 +123,15 @@ else if (itemName.equals("joinChatRoom")) .getProtocolProvider(), chatRoomWrapper .getChatRoomID(), "userNickName"); if(nickName == null) - nickName = chatRoomWrapper.getNickname(); + { + joinOptions = chatRoomWrapper.getJoinOptions(); + nickName = joinOptions[0]; + subject = joinOptions[1]; + } if (nickName != null) - conferenceManager.joinChatRoom(chatRoomWrapper, nickName, null); + conferenceManager.joinChatRoom(chatRoomWrapper, nickName, null, + subject); } else if (itemName.equals("openChatRoom")) { @@ -154,11 +161,15 @@ else if (itemName.equals("openChatRoom")) .getProtocolProvider(), chatRoomWrapper .getChatRoomID(), "userNickName"); if(nickName == null) - nickName = chatRoomWrapper.getNickname(); + { + joinOptions = chatRoomWrapper.getJoinOptions(); + nickName = joinOptions[0]; + subject = joinOptions[1]; + } if (nickName != null) conferenceManager.joinChatRoom(chatRoomWrapper, - nickName, null); + nickName, null, subject); else return; } @@ -172,15 +183,16 @@ else if (itemName.equals("openChatRoom")) } else if(itemName.equals("joinAsChatRoom")) { - String nickName = chatRoomWrapper.getNickname(); - if(nickName == null) + joinOptions = chatRoomWrapper.getJoinOptions(); + if(joinOptions[0] == null) return; GuiActivator.getUIService().getConferenceChatManager() - .joinChatRoom(chatRoomWrapper, nickName, null); + .joinChatRoom(chatRoomWrapper, joinOptions[0], null, + joinOptions[1]); } else if(itemName.equals("nickNameChatRoom")) { - chatRoomWrapper.getNickname(); + chatRoomWrapper.getJoinOptions(true); } } diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java index 8c601b08d..a496eb413 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java +++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java @@ -345,6 +345,8 @@ private JComboBox createProvidersCombobox() */ public void actionPerformed(ActionEvent e) { + String[] joinOptions; + String subject = null; JButton sourceButton = (JButton) e.getSource(); if(sourceButton.equals(addButton)) { @@ -361,7 +363,7 @@ public void actionPerformed(ActionEvent e) getSelectedProvider().getProtocolProvider(), new ArrayList(), "", false, true); - chatRoomWrapper.getNickname(); + chatRoomWrapper.getJoinOptions(true); } else if(sourceButton.equals(removeButton)) @@ -387,13 +389,14 @@ else if(sourceButton.equals(okButton)) false, false); - String nickName = chatRoomWrapper.getNickname(); - + joinOptions = chatRoomWrapper.getJoinOptions(); + String nickName = joinOptions[0]; + subject = joinOptions[1]; if(nickName == null) return; GuiActivator.getUIService().getConferenceChatManager() - .joinChatRoom(chatRoomWrapper, nickName, null); + .joinChatRoom(chatRoomWrapper, nickName, null, subject); ChatWindowManager chatWindowManager = GuiActivator.getUIService().getChatWindowManager(); @@ -418,13 +421,16 @@ else if(sourceButton.equals(okButton)) { - savedNick = selectedRoom.getNickname(); + joinOptions = selectedRoom.getJoinOptions(); + savedNick = joinOptions[0]; + subject = joinOptions[1]; if(savedNick == null) return; } GuiActivator.getUIService() .getConferenceChatManager() - .joinChatRoom(selectedRoom, savedNick, null); + .joinChatRoom(selectedRoom, savedNick, null, + subject); } else chatRoomsTableUI.openChatForSelection(); @@ -451,13 +457,15 @@ else if(sourceButton.equals(okButton)) if (savedNick == null) { - savedNick = chatRoomWrapper.getNickname(); + joinOptions = selectedRoom.getJoinOptions(); + savedNick = joinOptions[0]; + subject = joinOptions[1]; if(savedNick == null) return; } GuiActivator.getUIService().getConferenceChatManager() - .joinChatRoom(chatRoomWrapper,savedNick,null); + .joinChatRoom(chatRoomWrapper,savedNick,null, subject); } } diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableUI.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableUI.java index 117784221..dace0a053 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableUI.java +++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableUI.java @@ -177,14 +177,16 @@ void openChatForSelection() if (savedNick == null) { - String nickName = chatRoomWrapper.getNickname(); + String[] joinOptions = chatRoomWrapper.getJoinOptions(); + String nickName = joinOptions[0]; if(nickName == null) return; if (!chatRoomWrapper.getChatRoom().isJoined()) { GuiActivator.getUIService().getConferenceChatManager() - .joinChatRoom(chatRoomWrapper, nickName, null); + .joinChatRoom(chatRoomWrapper, nickName, null, + joinOptions[1]); } } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ChatRoomJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ChatRoomJabberImpl.java index 402c35181..dc9ebb209 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ChatRoomJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ChatRoomJabberImpl.java @@ -1860,7 +1860,7 @@ public void subjectUpdated(String subject, String from) logger.info("Subject updated to " + subject); // only fire event if subject has really changed, not for new one - if(oldSubject != null && !oldSubject.equals(subject)) + if(subject != null && !subject.equals(oldSubject)) { ChatRoomPropertyChangeEvent evt = new ChatRoomPropertyChangeEvent(