/*
* 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.plugin.ldap.configform;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.plugin.ldap.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.ldap.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.plugin.desktoputil.*;
/**
* This ConfigurationForm shows the list of LDAP directories
* and allow users to manage them.
*
* @author Sebastien Mazy
* @author Sebastien Vincent
*/
public class LdapConfigForm
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(LdapConfigForm.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.ldap.EDIT"));
/**
* pops a directory deletion confirmation dialog
*/
private JButton removeButton = new JButton("-");
/**
* displays the registered directories
*/
private JTable directoryTable = 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 LdapTableModel tableModel = new LdapTableModel();
/**
* Settings form.
*/
private final DirectorySettingsForm settingsForm =
new DirectorySettingsForm();
/**
* Constructor
*/
public LdapConfigForm()
{
super(new BorderLayout());
logger.trace("New LDAP configuration form.");
this.initComponents();
}
/**
* Inits the swing components
*/
private void initComponents()
{
this.modifyButton.setEnabled(false);
this.removeButton.setEnabled(false);
this.newButton.setSize(newButton.getMinimumSize());
this.modifyButton.setSize(modifyButton.getMinimumSize());
this.removeButton.setSize(removeButton.getMinimumSize());
this.directoryTable.setRowHeight(22);
this.directoryTable.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);
this.directoryTable.setShowHorizontalLines(false);
this.directoryTable.setShowVerticalLines(false);
this.directoryTable.setModel(tableModel);
this.directoryTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
this.directoryTable.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount() > 1)
{
int row =
LdapConfigForm.this.directoryTable.getSelectedRow();
if(row >= 0)
{
LdapFactory factory =
LdapActivator.getLdapService().getFactory();
LdapDirectorySet serverSet =
LdapActivator.getLdapService().getServerSet();
LdapDirectory oldServer =
LdapConfigForm.this.tableModel.getServerAt(row);
LdapDirectorySettings settings =
oldServer.getSettings();
settingsForm.loadData(settings);
settingsForm.setNameFieldEnabled(false);
int ret = settingsForm.showDialog();
if(ret == 1)
{
LdapDirectory newServer = factory.createServer(
settingsForm.getSettings());
serverSet.removeServerWithName(
oldServer.getSettings().
getName());
new RefreshContactSourceThread(oldServer,
newServer).start();
serverSet.addServer(newServer);
refresh();
}
}
}
}
});
settingsForm.setModal(true);
/*
* TODO fix: table width change when refreshing table
this.directoryTable.getColumnModel().getColumn(0).setPreferredWidth(10);
this.directoryTable.getColumnModel().getColumn(1).setPreferredWidth(100);
this.directoryTable.getColumnModel().getColumn(2).setPreferredWidth(100);
*/
/* consistency with the accounts config form */
this.rightPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
this.rightPanel.add(this.buttonsPanel, BorderLayout.NORTH);
this.scrollPane.getViewport().add(this.directoryTable);
this.mainPanel.add(this.scrollPane, BorderLayout.CENTER);
this.mainPanel.add(this.rightPanel, BorderLayout.SOUTH);
this.mainPanel.setPreferredSize(new Dimension(500, 400));
this.buttonsPanel.add(this.newButton);
this.buttonsPanel.add(this.removeButton);
this.buttonsPanel.add(this.modifyButton);
this.directoryTable.getSelectionModel().addListSelectionListener(this);
this.newButton.setActionCommand("new");
this.newButton.addActionListener(this);
this.modifyButton.addActionListener(this);
this.modifyButton.setActionCommand("modify");
this.removeButton.addActionListener(this);
this.removeButton.setActionCommand("remove");
}
/**
* @see net.java.sip.communicator.service.gui.ConfigurationForm#getTitle
*/
public String getTitle()
{
return Resources.getString("impl.ldap.CONFIG_FORM_TITLE");
}
/**
* @see net.java.sip.communicator.service.gui.ConfigurationForm#getIcon
*/
public byte[] getIcon()
{
return Resources.getImageInBytes("LDAP_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 = this.directoryTable.getSelectedRow();
LdapFactory factory = LdapActivator.getLdapService().getFactory();
LdapDirectorySet serverSet =
LdapActivator.getLdapService().getServerSet();
if (e.getActionCommand().equals("new"))
{
LdapDirectorySettings settings = factory.createServerSettings();
settingsForm.loadData(settings);
settingsForm.setNameFieldEnabled(true);
int ret = settingsForm.showDialog();
if(ret == 1)
{
LdapDirectory server = factory.createServer(
settingsForm.getSettings());
new RefreshContactSourceThread(null, server).start();
serverSet.addServer(server);
refresh();
}
}
if (e.getActionCommand().equals("modify") && row != -1)
{
LdapDirectory oldServer = this.tableModel.getServerAt(row);
LdapDirectorySettings settings = oldServer.getSettings();
settingsForm.loadData(settings);
settingsForm.setNameFieldEnabled(false);
int ret = settingsForm.showDialog();
if(ret == 1)
{
LdapDirectory newServer = factory.createServer(
settingsForm.getSettings());
new RefreshContactSourceThread(oldServer, newServer).start();
serverSet.removeServerWithName(oldServer.getSettings().
getName());
serverSet.addServer(newServer);
refresh();
}
}
if (e.getActionCommand().equals("remove") && row != -1)
{
new RefreshContactSourceThread(this.tableModel.getServerAt(row),
null).start();
serverSet.removeServerWithName(this.tableModel.getServerAt(row).
getSettings().getName());
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(this.directoryTable.getSelectedRow() == -1)
{
this.modifyButton.setEnabled(false);
this.removeButton.setEnabled(false);
}
else if(!e.getValueIsAdjusting())
{
this.modifyButton.setEnabled(true);
this.removeButton.setEnabled(true);
}
}
/**
* refreshes the table display
*/
private void refresh()
{
this.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
{
/**
* LDAP directory to remove.
*/
private LdapDirectory oldLdap = null;
/**
* LDAP directory to add.
*/
private LdapDirectory newLdap = null;
/**
* Constructor.
*
* @param oldLdap LDAP directory to remove
* @param newLdap LDAP directory to add.
*/
RefreshContactSourceThread(LdapDirectory oldLdap, LdapDirectory newLdap)
{
this.oldLdap = oldLdap;
this.newLdap = newLdap;
}
/**
* Thread entry point.
*/
@Override
public void run()
{
LdapService service = LdapActivator.getLdapService();
if(oldLdap != null)
{
service.removeContactSource(oldLdap);
}
if(newLdap != null)
{
service.createContactSource(newLdap);
}
}
}
}