/* * 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.utils; import java.awt.*; import java.awt.event.*; import javax.swing.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.lookandfeel.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.gui.event.*; /** * The invite dialog is a widget that shows a list of contacts, from which the * user could pick in order to create a conference chat or call. * * @author Yana Stamcheva * @author Hristo Terezov */ public class OneChoiceInviteDialog extends SIPCommDialog implements ContactListContainer { /** * The information text area. */ private final JTextArea infoTextArea; /** * The label containing the icon of this dialog. */ private final JLabel infoIconLabel = new JLabel(); /** * The OK button. */ private final JButton okButton = new JButton( GuiActivator.getResources().getI18NString("service.gui.OK")); /** * The cancel button. */ private final JButton cancelButton = new JButton( GuiActivator.getResources().getI18NString("service.gui.CANCEL")); /** * The contact list. */ protected ContactList contactList; /** * The search field. */ private final SearchField searchField; /** * Constructs an <tt>OneChoiceInviteDialog</tt>. * @param title the title to show on the top of this dialog */ public OneChoiceInviteDialog (String title) { this.setModal(false); this.setTitle(title); TransparentPanel mainPanel = new TransparentPanel(new BorderLayout(5, 5)); TransparentPanel northPanel = new TransparentPanel(new BorderLayout(10, 10)); mainPanel.setPreferredSize(new Dimension(450, 350)); mainPanel.setBorder( BorderFactory.createEmptyBorder(15, 15, 15, 15)); infoTextArea = createInfoArea(); northPanel.add(infoIconLabel, BorderLayout.WEST); northPanel.add(infoTextArea, BorderLayout.CENTER); TransparentPanel buttonsPanel = new TransparentPanel(new FlowLayout(FlowLayout.RIGHT)); buttonsPanel.add(okButton); buttonsPanel.add(cancelButton); this.getRootPane().setDefaultButton(okButton); okButton.setMnemonic( GuiActivator.getResources().getI18nMnemonic("service.gui.OK")); cancelButton.setMnemonic( GuiActivator.getResources().getI18nMnemonic("service.gui.CANCEL")); Component contactListComponent = createContactListComponent(); ContactListSearchFilter inviteFilter = new InviteContactListFilter(contactList); contactList.setDefaultFilter(inviteFilter); searchField = new SearchField(null, inviteFilter, false, false); searchField.setPreferredSize(new Dimension(200, 25)); searchField.setContactList(contactList); searchField.addFocusListener(new FocusAdapter() { /** * Removes all other selections. * @param e the <tt>FocusEvent</tt> that notified us */ @Override public void focusGained(FocusEvent e) { contactList.removeSelection(); } }); TransparentPanel listPanel = new TransparentPanel(new BorderLayout()); listPanel.setBorder(SIPCommBorders.getRoundBorder()); listPanel.add(contactListComponent); northPanel.add(searchField, BorderLayout.SOUTH); mainPanel.add(northPanel, BorderLayout.NORTH); mainPanel.add(listPanel, BorderLayout.CENTER); mainPanel.add(buttonsPanel, BorderLayout.SOUTH); this.getContentPane().add(mainPanel); KeyboardFocusManager keyManager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); ContactListSearchKeyDispatcher clKeyDispatcher = new ContactListSearchKeyDispatcher( keyManager, searchField, this); clKeyDispatcher.setContactList(contactList); keyManager.addKeyEventDispatcher(clKeyDispatcher); } /** * Returns an enumeration of the list of selected <tt>MetaContact</tt>s. * @return an enumeration of the list of selected <tt>MetaContact</tt>s */ public UIContact getSelectedContact() { return contactList.getSelectedContact(); } /** * Returns an enumeration of the list of selected Strings. * @return an enumeration of the list of selected Strings */ public String getSelectedString() { return searchField.getText(); } /** * Sets the information text explaining how to use the containing form. * @param text the text */ public void setInfoText(String text) { infoTextArea.setText(text); } /** * Sets the icon shown in the left top corner of this dialog. * @param icon the icon */ public void setIcon(Icon icon) { infoIconLabel.setIcon(icon); } /** * Sets the text of the ok button. * @param text the text of the ok button */ public void setOkButtonText(String text) { okButton.setText(text); } /** * Adds an <tt>ActionListener</tt> to the contained "Invite" button. * @param l the <tt>ActionListener</tt> to add */ public void addOkButtonListener(ActionListener l) { this.okButton.addActionListener(l); } /** * Adds an <tt>ActionListener</tt> to the contained "Cancel" button. * @param l the <tt>ActionListener</tt> to add */ public void addCancelButtonListener(ActionListener l) { this.cancelButton.addActionListener(l); } /** * Closes this dialog by clicking on the "Cancel" button. * @param isEscaped indicates if this <tt>close</tt> is provoked by an * escape */ @Override protected void close(boolean isEscaped) { this.cancelButton.doClick(); } /** * Creates the an info text area. * @return the created <tt>JTextArea</tt> */ private JTextArea createInfoArea() { JTextArea infoTextArea = new JTextArea(); infoTextArea.setFont(infoTextArea.getFont().deriveFont(Font.BOLD)); infoTextArea.setLineWrap(true); infoTextArea.setOpaque(false); infoTextArea.setWrapStyleWord(true); infoTextArea.setEditable(false); return infoTextArea; } /** * Creates the contact list component. * @return the created contact list component */ private Component createContactListComponent() { contactList = GuiActivator.getUIService().createContactListComponent(this); contactList.setContactButtonsVisible(false); contactList.setRightButtonMenuEnabled(false); contactList.addContactListListener(new ContactListListener() { public void groupSelected(ContactListEvent evt) {} public void groupClicked(ContactListEvent evt) {} public void contactSelected(ContactListEvent evt) {} public void contactClicked(ContactListEvent evt) { int clickCount = evt.getClickCount(); if (clickCount > 1) { okButton.doClick(); } } }); // By default we set the current filter to be the presence filter. JScrollPane contactListScrollPane = new JScrollPane(); contactListScrollPane.setOpaque(false); contactListScrollPane.getViewport().setOpaque(false); contactListScrollPane.getViewport().add(contactList.getComponent()); contactListScrollPane.getViewport().setBorder(null); contactListScrollPane.setViewportBorder(null); contactListScrollPane.setBorder(null); return contactListScrollPane; } /** * Adds the given contact to this contact list. * * @param contact */ protected void addContact(UIContact contact) { contactList.addContact(contact, null, true, false); } /** * Called when the ENTER key was typed when this container was the focused * container. Performs the appropriate actions depending on the current * state of the contained contact list. */ public void enterKeyTyped() { UIContact selectedContact = contactList.getSelectedContact(); if (selectedContact != null) { okButton.doClick(); } } /** * Returns the text currently shown in the search field. * @return the text currently shown in the search field */ public String getCurrentSearchText() { return searchField.getText(); } /** * Clears the current text in the search field. */ public void clearCurrentSearchText() { searchField.setText(""); } /** * Called when the CTRL-ENTER or CMD-ENTER keys were typed when this * container was the focused container. Performs the appropriate actions * depending on the current state of the contained contact list. */ public void ctrlEnterKeyTyped() {} /** * Returns <tt>true</tt> if there's any currently selected menu related to * this <tt>ContactListContainer</tt>, <tt>false</tt> - otherwise. * * @return <tt>true</tt> if there's any currently selected menu related to * this <tt>ContactListContainer</tt>, <tt>false</tt> - otherwise */ public boolean isMenuSelected() { // This dialog has no menu bar so it will never be selected return false; } @Override public void dispose() { searchField.dispose(); super.dispose(); } }