/* * 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.contactlist; import java.awt.*; import java.awt.event.*; import java.util.List; import javax.swing.*; import javax.swing.text.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.*; import net.java.sip.communicator.impl.gui.main.call.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.plugin.desktoputil.event.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.*; import net.java.sip.communicator.util.skin.*; import org.jitsi.util.*; /** * The UnknownContactPanel replaces the contact list, when a * SearchFilter founds no matches. It is meant to propose the user * some alternatives if she's looking for a contact, which is not contained in * the contact list. * * @author Yana Stamcheva * @author Adam Netocny */ public class UnknownContactPanel extends TransparentPanel implements TextFieldChangeListener, Skinnable { private final JButton addButton = new JButton( GuiActivator.getResources().getI18NString("service.gui.ADD_CONTACT")); private final JButton callButton = new JButton( GuiActivator.getResources().getI18NString("service.gui.CALL_CONTACT")); private JButton smsButton; private final JTextPane textArea = new JTextPane(); private final TransparentPanel buttonPanel = new TransparentPanel(new GridLayout(0, 1)); /** * The main application window. */ private MainFrame parentWindow; /** * An empty constructor allowing to extend this class. */ public UnknownContactPanel() {} /** * Creates the UnknownContactPanel by specifying the parent window. * @param window the parent window */ public UnknownContactPanel(MainFrame window) { super(new BorderLayout()); this.parentWindow = window; TransparentPanel mainPanel = new TransparentPanel(new BorderLayout()); this.add(mainPanel, BorderLayout.NORTH); if (!ConfigurationUtils.isAddContactDisabled()) { initAddContactButton(); } initCallButton(); initSMSButton(); initTextArea(); mainPanel.add(textArea, BorderLayout.CENTER); if (callButton.getParent() != null) { textArea.setText(GuiActivator.getResources() .getI18NString( "service.gui.NO_CONTACTS_FOUND", new String[]{'"' + parentWindow.getCurrentSearchText() + '"'})); } else { textArea.setText(GuiActivator.getResources() .getI18NString( "service.gui.NO_CONTACTS_FOUND_SHORT")); } if (buttonPanel.getComponentCount() > 0) { TransparentPanel southPanel = new TransparentPanel(new FlowLayout(FlowLayout.CENTER)); southPanel.add(buttonPanel); mainPanel.add(southPanel, BorderLayout.SOUTH); } loadSkin(); } private void initAddContactButton() { addButton.setAlignmentX(JButton.CENTER_ALIGNMENT); addButton.setMnemonic(GuiActivator.getResources() .getI18nMnemonic("service.gui.ADD_CONTACT")); buttonPanel.add(addButton); addButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { AddContactDialog dialog = new AddContactDialog(parentWindow); dialog.setContactAddress( parentWindow.getCurrentSearchText()); dialog.setVisible(true); } }); } /** * Initializes the call button. */ private void initCallButton() { List telephonyProviders = CallManager.getTelephonyProviders(); if (telephonyProviders!= null && telephonyProviders.size() > 0) { if (callButton.getParent() != null) return; callButton.setAlignmentX(JButton.CENTER_ALIGNMENT); callButton.setMnemonic(GuiActivator.getResources() .getI18nMnemonic("service.gui.CALL_CONTACT")); buttonPanel.add(callButton); callButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String searchText = parentWindow.getCurrentSearchText(); if (searchText == null) return; CallManager.createCall(searchText, callButton); } }); } else { buttonPanel.remove(callButton); } } /** * Initializes the call button. */ private void initSMSButton() { if(parentWindow.hasOperationSet(OperationSetSmsMessaging.class) && !StringUtils.containsLetters( parentWindow.getCurrentSearchText())) { if (smsButton != null && smsButton.getParent() != null) return; smsButton = new JButton(GuiActivator.getResources() .getI18NString("service.gui.SEND_SMS")); smsButton.setIcon(GuiActivator.getResources() .getImage("service.gui.icons.SMS_BUTTON_ICON")); buttonPanel.add(smsButton); smsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final String searchText = parentWindow.getCurrentSearchText(); if(searchText == null) return; SMSManager.sendSMS(smsButton, searchText); } }); } else { if(smsButton != null) buttonPanel.remove(smsButton); } } /** * Clicks the call contact button in order to call the unknown contact. */ public void startCall() { callButton.doClick(); } /** * Clicks the add contact button in order to add the unknown contact * to the contact list. */ public void addUnknownContact() { addButton.doClick(); } /** * Invoked when any text is inserted in the search field. */ public void textInserted() { updateTextArea(parentWindow.getCurrentSearchText()); } /** * Invoked when any text is removed from the search field. */ public void textRemoved() { updateTextArea(parentWindow.getCurrentSearchText()); } /** * Creates the text area. */ private void initTextArea() { textArea.setOpaque(false); textArea.setEditable(false); StyledDocument doc = textArea.getStyledDocument(); MutableAttributeSet standard = new SimpleAttributeSet(); StyleConstants.setAlignment(standard, StyleConstants.ALIGN_CENTER); StyleConstants.setFontFamily(standard, textArea.getFont().getFamily()); StyleConstants.setFontSize(standard, 12); doc.setParagraphAttributes(0, 0, standard, true); parentWindow.addSearchFieldListener(this); } /** * Updates the text area to take into account the new search text. * @param searchText the search text to update */ private void updateTextArea(String searchText) { if (callButton.getParent() != null) { textArea.setText(GuiActivator.getResources() .getI18NString("service.gui.NO_CONTACTS_FOUND", new String[]{'"' + searchText + '"'})); this.revalidate(); this.repaint(); } } /** * Reloads button resources. */ public void loadSkin() { addButton.setIcon(GuiActivator.getResources() .getImage("service.gui.icons.ADD_CONTACT_16x16_ICON")); callButton.setIcon(GuiActivator.getResources() .getImage("service.gui.icons.CALL_16x16_ICON")); if(smsButton != null) smsButton.setIcon(GuiActivator.getResources() .getImage("service.gui.icons.SMS_BUTTON_ICON")); } /** * Updates the call button appearance and shows/hides this panel. * * @param isVisible indicates if this panel should be shown or hidden */ @Override public void setVisible(boolean isVisible) { if (isVisible) { initCallButton(); initSMSButton(); } super.setVisible(isVisible); } }