/* * 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.googlecontacts.configform; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import net.java.sip.communicator.impl.googlecontacts.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.googlecontacts.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.util.*; /** * This ConfigurationForm shows the list of Google Contacts account and allow * users to manage them. * * @author Sebastien Mazy * @author Sebastien Vincent */ public class GoogleContactsConfigForm extends TransparentPanel implements ConfigurationForm, ActionListener, ListSelectionListener { /** * Serial version UID. */ private static final long serialVersionUID = 0L; /** * The logger for this class. */ private static Logger logger = Logger.getLogger( GoogleContactsConfigForm.class); /** * Opens the new directory registration wizard */ private JButton newButton = new JButton("+"); /** * Opens a directory modification dialog */ private JButton modifyButton = new JButton( Resources.getString("impl.googlecontacts.EDIT")); /** * Pops a directory deletion confirmation dialog */ private JButton removeButton = new JButton("-"); /** * Displays the registered Google Contacts account. */ private JTable accountTable = new JTable(); /** * Contains the new/modify/remove buttons */ private TransparentPanel buttonsPanel = new TransparentPanel(new FlowLayout(FlowLayout.LEFT)); /** * Contains the directoryTable */ private JScrollPane scrollPane = new JScrollPane(); /** * Contains the buttonsPanel, */ private JPanel rightPanel = new TransparentPanel(new BorderLayout()); /** * Contains listPanel and rightPanel */ private JPanel mainPanel = this; /** * Model for the directoryTable */ private GoogleContactsTableModel tableModel = new GoogleContactsTableModel(); /** * Settings form. */ private final AccountSettingsForm settingsForm = new AccountSettingsForm(); /** * Constructor */ public GoogleContactsConfigForm() { super(new BorderLayout()); logger.trace("GoogleContacts configuration form."); initComponents(); } /** * Inits the swing components */ private void initComponents() { modifyButton.setEnabled(false); removeButton.setEnabled(false); newButton.setSize(newButton.getMinimumSize()); modifyButton.setSize(modifyButton.getMinimumSize()); removeButton.setSize(removeButton.getMinimumSize()); accountTable.setRowHeight(22); accountTable.setSelectionMode( ListSelectionModel.SINGLE_SELECTION); accountTable.setShowHorizontalLines(false); accountTable.setShowVerticalLines(false); accountTable.setModel(tableModel); accountTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); accountTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if(e.getClickCount() > 1) { } } }); settingsForm.setModal(true); /* consistency with the accounts config form */ rightPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); rightPanel.add(buttonsPanel, BorderLayout.NORTH); scrollPane.getViewport().add(accountTable); mainPanel.add(scrollPane, BorderLayout.CENTER); mainPanel.add(rightPanel, BorderLayout.SOUTH); mainPanel.setPreferredSize(new Dimension(500, 400)); buttonsPanel.add(newButton); buttonsPanel.add(removeButton); buttonsPanel.add(modifyButton); accountTable.getSelectionModel().addListSelectionListener(this); newButton.setActionCommand("new"); newButton.addActionListener(this); modifyButton.addActionListener(this); modifyButton.setActionCommand("modify"); removeButton.addActionListener(this); removeButton.setActionCommand("remove"); } /** * @see net.java.sip.communicator.service.gui.ConfigurationForm#getTitle */ public String getTitle() { return Resources.getString("impl.googlecontacts.CONFIG_FORM_TITLE"); } /** * @see net.java.sip.communicator.service.gui.ConfigurationForm#getIcon */ public byte[] getIcon() { return Resources.getImageInBytes( "GOOGLECONTACTS_CONFIG_FORM_ICON"); } /** * @see net.java.sip.communicator.service.gui.ConfigurationForm#getForm */ public Object getForm() { return this; } /** * Required by ConfirgurationForm interface * * Returns the index of this configuration form in the configuration window. * This index is used to put configuration forms in the desired order. * <p> * 0 is the first position * -1 means that the form will be put at the end * </p> * @return the index of this configuration form in the configuration window. * * @see net.java.sip.communicator.service.gui.ConfigurationForm#getIndex */ public int getIndex() { return -1; } /** * Processes buttons events (new, modify, remove) * * @see java.awt.event.ActionListener#actionPerformed */ public void actionPerformed(ActionEvent e) { int row = accountTable.getSelectedRow(); if (e.getActionCommand().equals("new")) { settingsForm.setNameFieldEnabled(true); settingsForm.loadData(null); int ret = settingsForm.showDialog(); if(ret == 1) { GoogleContactsConnectionImpl cnx = (GoogleContactsConnectionImpl) settingsForm.getConnection(); tableModel.addAccount(cnx, true, cnx.getPrefix()); new RefreshContactSourceThread(null, cnx).start(); GoogleContactsActivator.getGoogleContactsService().saveConfig( cnx); refresh(); } } if (e.getActionCommand().equals("modify") && row != -1) { settingsForm.setNameFieldEnabled(false); GoogleContactsConnectionImpl cnx = tableModel.getAccountAt(row); settingsForm.loadData(cnx); int ret = settingsForm.showDialog(); if(ret == 1) { GoogleContactsActivator.getGoogleContactsService().saveConfig( cnx); if(cnx.isEnabled()) { new RefreshContactSourceThread(cnx, cnx).start(); } refresh(); } } if (e.getActionCommand().equals("remove") && row != -1) { GoogleContactsConnection cnx = tableModel.getAccountAt(row); tableModel.removeAccount(cnx.getLogin()); GoogleContactsActivator.getGoogleContactsService().removeConfig( cnx); new RefreshContactSourceThread(cnx, null).start(); refresh(); } } /** * Required by ListSelectionListener. Enables the "modify" * button when a server is selected in the table * * @param e event triggered */ public void valueChanged(ListSelectionEvent e) { if(accountTable.getSelectedRow() == -1) { modifyButton.setEnabled(false); removeButton.setEnabled(false); return; } else if(!e.getValueIsAdjusting()) { modifyButton.setEnabled(true); removeButton.setEnabled(true); GoogleContactsActivator.getGoogleContactsService(). saveConfig(tableModel.getAccountAt( accountTable.getSelectedRow())); } } /** * refreshes the table display */ private void refresh() { tableModel.fireTableStructureChanged(); } /** * Indicates if this is an advanced configuration form. * @return <tt>true</tt> if this is an advanced configuration form, * otherwise it returns <tt>false</tt> */ public boolean isAdvanced() { return true; } /** * Thread that will perform refresh of contact sources. */ public static class RefreshContactSourceThread extends Thread { /** * Old connection. */ private GoogleContactsConnection oldCnx = null; /** * New connection. */ private GoogleContactsConnection newCnx = null; /** * Constructor. * * @param oldCnx old connection. * @param newCnx new connection. */ RefreshContactSourceThread(GoogleContactsConnection oldCnx, GoogleContactsConnection newCnx) { this.oldCnx = oldCnx; this.newCnx = newCnx; } /** * Thread entry point. */ @Override public void run() { if(oldCnx != null) { GoogleContactsActivator.getGoogleContactsService(). removeContactSource(oldCnx); } if(newCnx != null) { GoogleContactsActivator.getGoogleContactsService(). addContactSource(newCnx, true); } } } }