/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* or http://forgerock.org/license/CDDLv1.0.html.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at legal-notices/CDDLv1_0.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
* Portions Copyright 2013-2015 ForgeRock AS.
*/
package org.opends.guitools.controlpanel.ui;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import org.forgerock.i18n.LocalizableMessage;
import org.opends.guitools.controlpanel.ui.nodes.BasicNode;
import org.opends.guitools.controlpanel.util.Utilities;
/**
* A basic panel that contains a browser. It is used in general in panels that
* require to provide some DNs of existing entries: we allow the user to launch
* a browser to select entries.
*/
public class LDAPEntrySelectionPanel extends AbstractBrowseEntriesPanel
{
private LocalizableMessage title;
private Filter f;
private String[] dns;
/**
* The values of the filters that will be used when opening the dialog where
* this panel is contained. For instance if the filter is set to Filter.USERS
* the panel will display only users when the dialog appears.
*/
public enum Filter
{
/** Display users. */
USERS,
/** Display groups. */
GROUPS,
/** Display Dynamic Groups. */
DYNAMIC_GROUPS,
/** Display Static Groups. */
STATIC_GROUPS,
/** Default filter (all entries). */
DEFAULT
}
private static final long serialVersionUID = -8140540064410029902L;
/** Default constructor. */
public LDAPEntrySelectionPanel()
{
super();
}
/**
* Updates the tree selection model to allow multiple selection or not.
* @param multiple whether the tree should allow multiple selection or not.
*/
public void setMultipleSelection(boolean multiple)
{
treePane.getTree().getSelectionModel().setSelectionMode(multiple ?
TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION :
TreeSelectionModel.SINGLE_TREE_SELECTION);
}
/** {@inheritDoc} */
@Override
public void toBeDisplayed(boolean visible)
{
super.toBeDisplayed(visible);
if (visible)
{
dns = new String[0];
}
}
/** {@inheritDoc} */
@Override
public LocalizableMessage getTitle()
{
return title;
}
/** {@inheritDoc} */
@Override
public void okClicked()
{
dns = retrieveDNs();
super.closeClicked();
}
/**
* Returns the selected DN's in an array of Strings. The array is never
* <CODE>null</CODE> but might be empty.
* @return the selected DN's.
*/
public String[] getDNs()
{
return dns;
}
private String[] retrieveDNs()
{
String[] dns;
TreePath[] paths = treePane.getTree().getSelectionPaths();
if (paths != null)
{
dns = new String[paths.length];
for (int i=0; i<paths.length; i++)
{
dns[i] = ((BasicNode)paths[i].getLastPathComponent()).getDN();
}
}
else
{
dns = new String[0];
}
return dns;
}
/** {@inheritDoc} */
@Override
public GenericDialog.ButtonType getBrowseButtonType()
{
return GenericDialog.ButtonType.OK_CANCEL;
}
/** {@inheritDoc} */
@Override
protected Component createMainPanel()
{
JComponent p = createTreePane();
final JTree tree = treePane.getTree();
tree.getSelectionModel().addTreeSelectionListener(
new TreeSelectionListener()
{
/** {@inheritDoc} */
@Override
public void valueChanged(TreeSelectionEvent ev)
{
TreePath[] paths = tree.getSelectionPaths();
setEnabledOK(paths != null && paths.length > 0);
}
});
MouseListener mouseListener = new MouseAdapter() {
/** {@inheritDoc} */
@Override
public void mousePressed(MouseEvent e) {
int selRow = tree.getRowForLocation(e.getX(), e.getY());
if (selRow != -1 && e.getClickCount() == 2)
{
okClicked();
}
}
};
tree.addMouseListener(mouseListener);
JScrollPane treeScroll = Utilities.createScrollPane(p);
treeScroll.setPreferredSize(
new Dimension(treeScroll.getPreferredSize().width + 30,
4 * treeScroll.getPreferredSize().height));
return treeScroll;
}
/**
* Returns the last filter set with the setFilter method.
* @return the last filter set with the setFilter method.
*/
public Filter getFilter()
{
return f;
}
/**
* Sets the filter to be used when the panel is displayed.
* @param filter the filter.
*/
public void setFilter(Filter filter)
{
f = filter;
switch (f)
{
case USERS:
filterAttribute.setSelectedItem(USER_FILTER);
super.filter.setText("*");
break;
case GROUPS:
filterAttribute.setSelectedItem(GROUP_FILTER);
super.filter.setText("*");
break;
case DYNAMIC_GROUPS:
filterAttribute.setSelectedItem(LDAP_FILTER);
super.filter.setText("objectClass=groupOfURLs");
break;
case STATIC_GROUPS:
filterAttribute.setSelectedItem(LDAP_FILTER);
super.filter.setText("(|(objectClass=groupOfNames)" +
"(objectClass=groupOfEntries)(objectClass=groupOfUniqueNames))");
break;
case DEFAULT:
Object o = filterAttribute.getItemAt(0);
filterAttribute.setSelectedItem(o);
super.filter.setText("");
break;
}
if (controller != null)
{
applyButtonClicked();
}
}
/**
* Sets the title that will be displayed in the dialog containing this panel.
* @param title the title.
*/
public void setTitle(LocalizableMessage title)
{
this.title = title;
Window w = Utilities.getParentDialog(this);
if (w instanceof GenericDialog)
{
((GenericDialog)w).updateTitle();
}
else if (w instanceof GenericFrame)
{
((GenericFrame)w).updateTitle();
}
}
}