diff --git a/resources/languages/resources.properties b/resources/languages/resources.properties index 72562eb61..0e697e17f 100644 --- a/resources/languages/resources.properties +++ b/resources/languages/resources.properties @@ -1700,8 +1700,11 @@ plugin.reconnectplugin.NETWORK_DOWN=Network connectivity lost! plugin.chatconfig.TITLE=Chat plugin.chatconfig.replacement.TITLE=Image/Video: plugin.chatconfig.replacement.ENABLE_SMILEY_STATUS=Enable smiley replacement -plugin.chatconfig.replacement.ENABLE_REPLACEMENT_STATUS=Enable Image/Video replacement -plugin.chatconfig.replacement.ENABLE_REPLACEMENT_PROPOSAL=Show proposals for Image/Video replacement +plugin.chatconfig.replacement.REPLACEMENT_TITLE=Image/Video replacement +plugin.chatconfig.replacement.ENABLE_REPLACEMENT_STATUS=Enable +plugin.chatconfig.replacement.ENABLE_REPLACEMENT_PROPOSAL=Disable (show preview link) +plugin.chatconfig.replacement.DISABLE_REPLACEMENT=Disable +plugin.chatconfig.replacement.CONFIGURE_REPLACEMENT=Change Image/Video replacement settings plugin.chatconfig.replacement.REPLACEMENT_SOURCES=Sources: plugin.chatconfig.spellcheck.TITLE=SpellCheck diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java index 716616408..016a576b2 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java @@ -28,6 +28,7 @@ import net.java.sip.communicator.impl.gui.main.chat.history.*; import net.java.sip.communicator.impl.gui.main.chat.menus.*; import net.java.sip.communicator.impl.gui.utils.*; +import net.java.sip.communicator.impl.gui.utils.Constants; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.plugin.desktoputil.SwingWorker; import net.java.sip.communicator.service.gui.*; @@ -41,6 +42,8 @@ import net.java.sip.communicator.util.skin.*; import org.jitsi.util.*; +import org.osgi.framework.*; + /** * The ChatConversationPanel is the panel, where all sent and received * messages appear. All data is stored in an HTML document. An external CSS file @@ -136,11 +139,26 @@ public class ChatConversationPanel */ private String currentHref; + /** + * The currently shown href, is it an img element. + */ + private boolean isCurrentHrefImg = false; + /** * The copy link item, contained in the right mouse click menu. */ private final JMenuItem copyLinkItem; + /** + * The copy link item, contained in the right mouse click menu. + */ + private final JMenuItem configureReplacementItem; + + /** + * The configure replacement item separator. + */ + private final JSeparator configureReplacementSeparator = new JSeparator(); + /** * The open link item, contained in the right mouse click menu. */ @@ -310,6 +328,30 @@ public void actionPerformed(ActionEvent e) GuiActivator.getResources().getI18nMnemonic( "service.gui.COPY_LINK")); + configureReplacementItem = new JMenuItem( + GuiActivator.getResources().getI18NString( + "plugin.chatconfig.replacement.CONFIGURE_REPLACEMENT"), + GuiActivator.getResources().getImage( + "service.gui.icons.CONFIGURE_ICON")); + + configureReplacementItem.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + final ConfigurationContainer configContainer + = GuiActivator.getUIService().getConfigurationContainer(); + + ConfigurationForm chatConfigForm = getChatConfigForm(); + + if (chatConfigForm != null) + { + configContainer.setSelected(chatConfigForm); + + configContainer.setVisible(true); + } + } + }); + this.isSimpleTheme = ConfigurationUtils.isChatSimpleThemeEnabled(); /* @@ -1171,11 +1213,14 @@ public void hyperlinkUpdate(HyperlinkEvent e) { String href = e.getDescription(); + this.isCurrentHrefImg + = e.getSourceElement().getName().equals("img"); this.currentHref = href; } else if (e.getEventType() == HyperlinkEvent.EventType.EXITED) { this.currentHref = ""; + this.isCurrentHrefImg = false; } } @@ -1228,7 +1273,7 @@ else if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0 catch (URISyntaxException e1) { logger.error("Failed to open hyperlink in chat window. " + - "Error was: Invalid URL - " + currentHref); + "Error was: Invalid URL - " + currentHref); return; } if("jitsi".equals(uri.getScheme())) @@ -1261,12 +1306,19 @@ private void openContextMenu(Point p) rightButtonMenu.insert(openLinkItem, 0); rightButtonMenu.insert(copyLinkItem, 1); rightButtonMenu.insert(copyLinkSeparator, 2); + if(isCurrentHrefImg) + { + rightButtonMenu.insert(configureReplacementItem, 3); + rightButtonMenu.insert(configureReplacementSeparator, 4); + } } else { rightButtonMenu.remove(openLinkItem); rightButtonMenu.remove(copyLinkItem); rightButtonMenu.remove(copyLinkSeparator); + rightButtonMenu.remove(configureReplacementItem); + rightButtonMenu.remove(configureReplacementSeparator); } if (chatTextPane.getSelectedText() != null) @@ -1956,6 +2008,60 @@ private String getElementContent(String elementId, String message) return null; } + /** + * Returns the first available advanced configuration form. + * + * @return the first available advanced configuration form + */ + public static ConfigurationForm getChatConfigForm() + { + // General configuration forms only. + String osgiFilter = "(" + + ConfigurationForm.FORM_TYPE + + "="+ConfigurationForm.GENERAL_TYPE+")"; + + ServiceReference[] confFormsRefs = null; + try + { + confFormsRefs = GuiActivator.bundleContext + .getServiceReferences( + ConfigurationForm.class.getName(), + osgiFilter); + } + catch (InvalidSyntaxException ex) + {} + + String chatConfigFormClassName = + "net.java.sip.communicator.plugin.chatconfig.ChatConfigPanel"; + + if(confFormsRefs != null) + { + for (int i = 0; i < confFormsRefs.length; i++) + { + ConfigurationForm form + = (ConfigurationForm) GuiActivator.bundleContext + .getService(confFormsRefs[i]); + + if (form instanceof LazyConfigurationForm) + { + LazyConfigurationForm lazyConfigForm + = (LazyConfigurationForm) form; + + if (lazyConfigForm.getFormClassName() + .equals(chatConfigFormClassName)) + return form; + } + else if (form.getClass().getName() + .equals(chatConfigFormClassName)) + { + return form; + } + } + } + + return null; + } + /** * Extends SIPCommHTMLEditorKit to keeps track of created ImageView for * the gif images in order to flush them whenever they are no longer visible @@ -2322,6 +2428,24 @@ private void processText(String plainText, msgBuff.append(group); } } + else if (isProposalEnabled) + { + msgBuff.append(group); + msgBuff.append( + " " + + GuiActivator.getResources(). + getI18NString("service.gui.SHOW_PREVIEW")); + + showPreview.getMsgIDandPositionToLink() + .put( + messageID + "#" + linkCounter++, group); + showPreview.getLinkToReplacement() + .put( + group, temp); + } else if (isEnabled && isEnabledForSource) { if (isDirectImage) @@ -2355,24 +2479,6 @@ else if (isEnabled && isEnabledForSource) msgBuff.append("\">"); } } - else if (isProposalEnabled) - { - msgBuff.append(group); - msgBuff.append( - " " - + GuiActivator.getResources(). - getI18NString("service.gui.SHOW_PREVIEW")); - - showPreview.getMsgIDandPositionToLink() - .put( - messageID + "#" + linkCounter++, group); - showPreview.getLinkToReplacement() - .put( - group, temp); - } else { msgBuff.append(group); diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ShowPreviewDialog.java b/src/net/java/sip/communicator/impl/gui/main/chat/ShowPreviewDialog.java index 199d61686..0249c05d4 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ShowPreviewDialog.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ShowPreviewDialog.java @@ -38,9 +38,6 @@ public class ShowPreviewDialog private static final Logger logger = Logger.getLogger(ShowPreviewDialog.class); - ConfigurationService cfg - = GuiActivator.getConfigurationService(); - /** * The Ok button. */ @@ -54,12 +51,7 @@ public class ShowPreviewDialog /** * Checkbox that indicates whether or not to show this dialog next time. */ - private final JCheckBox enableReplacementProposal; - - /** - * Checkbox that indicates whether or not to show previews automatically - */ - private final JCheckBox enableReplacement; + private final JCheckBox configureReplacement; /** * The ChatConversationPanel that this dialog is associated with. @@ -147,23 +139,14 @@ public class ShowPreviewDialog warningPanel.add(Box.createHorizontalStrut(10)); warningPanel.add(descriptionMsg); - enableReplacement - = new JCheckBox( - GuiActivator.getResources().getI18NString( - "plugin.chatconfig.replacement.ENABLE_REPLACEMENT_STATUS")); - enableReplacement.setOpaque(false); - enableReplacement.setSelected( - cfg.getBoolean(ReplacementProperty.REPLACEMENT_ENABLE, true)); - enableReplacementProposal - = new JCheckBox( + configureReplacement + = new SIPCommCheckBox( GuiActivator.getResources().getI18NString( - "plugin.chatconfig.replacement.ENABLE_REPLACEMENT_PROPOSAL")); - enableReplacementProposal.setOpaque(false); + "plugin.chatconfig.replacement.CONFIGURE_REPLACEMENT")); - JPanel checkBoxPanel = new TransparentPanel(); - checkBoxPanel.setLayout(new BoxLayout(checkBoxPanel, BoxLayout.Y_AXIS)); - checkBoxPanel.add(enableReplacement); - checkBoxPanel.add(enableReplacementProposal); + JPanel checkBoxPanel = new TransparentPanel( + new FlowLayout(FlowLayout.CENTER)); + checkBoxPanel.add(configureReplacement); JPanel buttonsPanel = new TransparentPanel(new FlowLayout(FlowLayout.CENTER)); @@ -186,10 +169,6 @@ public void actionPerformed(ActionEvent arg0) { if (arg0.getSource().equals(okButton)) { - cfg.setProperty(ReplacementProperty.REPLACEMENT_ENABLE, - enableReplacement.isSelected()); - cfg.setProperty(ReplacementProperty.REPLACEMENT_PROPOSAL - , enableReplacementProposal.isSelected()); SwingWorker worker = new SwingWorker() { /** @@ -275,6 +254,26 @@ else if (arg0.getSource().equals(cancelButton)) { this.setVisible(false); } + + // Shows chat config panel + if(configureReplacement.isSelected()) + { + ConfigurationContainer configContainer + = GuiActivator.getUIService().getConfigurationContainer(); + + ConfigurationForm chatConfigForm = + ChatConversationPanel.getChatConfigForm(); + + if(chatConfigForm != null) + { + configContainer.setSelected(chatConfigForm); + + configContainer.setVisible(true); + } + + // reset for next dialog appearance + configureReplacement.setSelected(false); + } } @Override @@ -283,11 +282,6 @@ public void chatLinkClicked(URI url) String action = url.getPath(); if (action.equals("/SHOWPREVIEW")) { - enableReplacement.setSelected( - cfg.getBoolean(ReplacementProperty.REPLACEMENT_ENABLE, true)); - enableReplacementProposal.setSelected( - cfg.getBoolean(ReplacementProperty.REPLACEMENT_PROPOSAL, true)); - currentMessageID = url.getQuery(); currentLinkPosition = url.getFragment(); @@ -325,4 +319,16 @@ Map getLinkToReplacement() { return linkToReplacement; } + + /** + * All functions implemented in this method will be invoked when user + * presses the Escape key. + * + * @param escaped true if this frame has been closed by pressing + * the Esc key; otherwise, false + */ + protected void close(boolean escaped) + { + cancelButton.doClick(); + } } diff --git a/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigurationFrame.java b/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigurationFrame.java index be0877602..104382eac 100644 --- a/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigurationFrame.java +++ b/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigurationFrame.java @@ -253,6 +253,7 @@ public void run() this.configList.setSelectedIndex(0); } super.setVisible(isVisible); + super.toFront(); } /** diff --git a/src/net/java/sip/communicator/plugin/chatconfig/replacement/ReplacementConfigPanel.java b/src/net/java/sip/communicator/plugin/chatconfig/replacement/ReplacementConfigPanel.java index b3a7c3ed7..af0fce553 100644 --- a/src/net/java/sip/communicator/plugin/chatconfig/replacement/ReplacementConfigPanel.java +++ b/src/net/java/sip/communicator/plugin/chatconfig/replacement/ReplacementConfigPanel.java @@ -19,6 +19,7 @@ import net.java.sip.communicator.service.replacement.*; import org.jitsi.service.configuration.*; +import org.jitsi.service.resources.*; /** * The ConfigurationForm that would be added in the chat configuration @@ -42,12 +43,17 @@ public class ReplacementConfigPanel /** * Checkbox to enable/disable replacements other than smileys. */ - private JCheckBox enableReplacement; + private JRadioButton enableReplacement; /** * Checkbox to enable/disable proposal messages for image/video replacement. */ - private JCheckBox enableReplacementProposal; + private JRadioButton enableReplacementProposal; + + /** + * Checkbox to disable image/video replacement. + */ + private JRadioButton disableReplacement; /** * Jtable to list all the available replacement sources. @@ -77,16 +83,17 @@ public ReplacementConfigPanel() */ private Component createMainPanel() { - JPanel mainPanel = new TransparentPanel(new BorderLayout()); + JPanel mainPanel = new TransparentPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); + ResourceManagementService R = ChatConfigActivator.getResources(); + enableSmiley = - new SIPCommCheckBox(ChatConfigActivator.getResources() - .getI18NString( + new SIPCommCheckBox(R.getI18NString( "plugin.chatconfig.replacement.ENABLE_SMILEY_STATUS")); - mainPanel.add(enableSmiley, BorderLayout.WEST); + mainPanel.add(enableSmiley); enableSmiley.addActionListener(new ActionListener() { @@ -99,32 +106,34 @@ public void actionPerformed(ActionEvent e) mainPanel.add(Box.createVerticalStrut(10)); + JPanel replacementPanel = new TransparentPanel(); + replacementPanel.setLayout(new BoxLayout(replacementPanel, BoxLayout.Y_AXIS)); + replacementPanel.setBorder( + BorderFactory.createCompoundBorder( + BorderFactory.createTitledBorder(R.getI18NString( + "plugin.chatconfig.replacement.REPLACEMENT_TITLE")), + BorderFactory.createEmptyBorder(3, 3, 3, 3))); + enableReplacement = - new SIPCommCheckBox(ChatConfigActivator.getResources() - .getI18NString( + new SIPCommRadioButton(R.getI18NString( "plugin.chatconfig.replacement.ENABLE_REPLACEMENT_STATUS")); - mainPanel.add(enableReplacement, BorderLayout.WEST); + replacementPanel.add(enableReplacement); enableReplacement.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { saveData(); - table.revalidate(); - table.repaint(); } }); - mainPanel.add(Box.createVerticalStrut(10)); - enableReplacementProposal = - new SIPCommCheckBox(ChatConfigActivator.getResources() - .getI18NString( - "plugin.chatconfig.replacement.ENABLE_REPLACEMENT_PROPOSAL")); + new SIPCommRadioButton(R.getI18NString( + "plugin.chatconfig.replacement.ENABLE_REPLACEMENT_PROPOSAL" + )); - mainPanel.add(enableReplacementProposal, BorderLayout.WEST); + replacementPanel.add(enableReplacementProposal); enableReplacementProposal.addActionListener(new ActionListener(){ @@ -133,8 +142,25 @@ public void actionPerformed(ActionEvent arg0) saveData(); } }); + disableReplacement = new SIPCommRadioButton(R.getI18NString( + "plugin.chatconfig.replacement.DISABLE_REPLACEMENT")); + + replacementPanel.add(disableReplacement); - // the Jtable to list all the available sources + disableReplacement.addActionListener(new ActionListener(){ + + public void actionPerformed(ActionEvent arg0) + { + saveData(); + } + }); + + ButtonGroup replacementGroup = new ButtonGroup(); + replacementGroup.add(enableReplacement); + replacementGroup.add(enableReplacementProposal); + replacementGroup.add(disableReplacement); + + // the JTable to list all the available sources table = new JTable(); table.setShowGrid(false); table.setTableHeader(null); @@ -144,18 +170,19 @@ public void actionPerformed(ActionEvent arg0) JScrollPane tablePane = new JScrollPane(table); tablePane.setOpaque(false); - tablePane.setPreferredSize(new Dimension(mainPanel.getWidth(), 150)); + tablePane.setPreferredSize( + new Dimension(replacementPanel.getWidth(), 150)); tablePane.setAlignmentX(LEFT_ALIGNMENT); JPanel container = new TransparentPanel(new BorderLayout()); - container.setPreferredSize(new Dimension(mainPanel.getWidth(), 200)); + container.setPreferredSize( + new Dimension(replacementPanel.getWidth(), 200)); container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS)); JLabel label = - new JLabel(ChatConfigActivator.getResources().getI18NString( + new JLabel(R.getI18NString( "plugin.chatconfig.replacement.REPLACEMENT_SOURCES")); - label.setDisplayedMnemonic(ChatConfigActivator.getResources() - .getI18nMnemonic( + label.setDisplayedMnemonic(R.getI18nMnemonic( "plugin.chatconfig.replacement.REPLACEMENT_SOURCES")); label.setLabelFor(table); @@ -202,8 +229,10 @@ public void valueChanged(ListSelectionEvent e) table.setDefaultRenderer(table.getColumnClass(1), new FixedTableCellRenderer()); - mainPanel.add(Box.createVerticalStrut(10)); - mainPanel.add(container, BorderLayout.WEST); + replacementPanel.add(Box.createVerticalStrut(10)); + replacementPanel.add(container); + + mainPanel.add(replacementPanel); return mainPanel; } @@ -216,24 +245,25 @@ private void initValues() ConfigurationService configService = ChatConfigActivator.getConfigurationService(); - boolean e = - configService.getBoolean(ReplacementProperty - .getPropertyName(ReplacementServiceSmileyImpl.SMILEY_SOURCE), - true); - this.enableSmiley.setSelected(e); + this.enableSmiley.setSelected( + configService.getBoolean( + ReplacementProperty.getPropertyName( + ReplacementServiceSmileyImpl.SMILEY_SOURCE), + true)); - e = - configService.getBoolean(ReplacementProperty.REPLACEMENT_ENABLE, - true); - this.enableReplacement.setSelected(e); + this.enableReplacement.setSelected( + configService.getBoolean( + ReplacementProperty.REPLACEMENT_ENABLE, true)); - this.enableReplacementProposal.setEnabled(!e); - e = - configService.getBoolean(ReplacementProperty.REPLACEMENT_PROPOSAL, - true); - this.enableReplacementProposal.setSelected(e); + this.enableReplacementProposal.setSelected( + configService.getBoolean( + ReplacementProperty.REPLACEMENT_PROPOSAL, true)); - this.table.setEnabled(e); + this.disableReplacement.setSelected( + !this.enableReplacement.isSelected() + && !this.enableReplacementProposal.isSelected()); + + this.table.setEnabled(enableReplacement.isSelected()); } /** @@ -251,15 +281,13 @@ private void saveData() configService.setProperty(ReplacementProperty.REPLACEMENT_ENABLE, Boolean.toString(enableReplacement.isSelected())); - boolean e = enableReplacement.isSelected(); - - enableReplacementProposal.setEnabled(!e); configService.setProperty( - "plugin.chatconfig.replacement.proposal.enable" - , Boolean.toString(!e && enableReplacementProposal.isSelected())); + "plugin.chatconfig.replacement.proposal.enable", + Boolean.toString(enableReplacementProposal.isSelected())); table.getSelectionModel().clearSelection(); - table.setEnabled(e); + table.setEnabled(enableReplacement.isSelected() + || enableReplacementProposal.isSelected()); } /**