/* * 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 * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * 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 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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 Sun Microsystems, Inc. */ package org.opends.guitools.controlpanel.ui.renderer; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractCellEditor; import javax.swing.DefaultCellEditor; import javax.swing.JPasswordField; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.table.TableCellEditor; import org.opends.guitools.controlpanel.datamodel.BinaryValue; import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo; import org.opends.guitools.controlpanel.datamodel.ObjectClassValue; import org.opends.guitools.controlpanel.ui.BinaryAttributeEditorPanel; import org.opends.guitools.controlpanel.ui.ObjectClassEditorPanel; import org.opends.guitools.controlpanel.ui.GenericDialog; import org.opends.guitools.controlpanel.ui.components.BinaryCellPanel; import org.opends.guitools.controlpanel.ui.components.ObjectClassCellPanel; import org.opends.guitools.controlpanel.util.Utilities; /** * The cell editor used in the 'Attribute' View of the entries in the LDAP * entry browser. * */ public class AttributeCellEditor extends AbstractCellEditor implements TableCellEditor { private static final long serialVersionUID = 1979354208925355746L; private BinaryCellPanel binaryPanel; private ObjectClassCellPanel ocPanel; private ObjectClassValue ocValue; private byte[] value; private BinaryValue binaryValue; private TableCellEditor defaultEditor; private TableCellEditor passwordEditor; private GenericDialog editBinaryDlg; private BinaryAttributeEditorPanel editBinaryPanel; private GenericDialog editOcDlg; private ObjectClassEditorPanel editOcPanel; private JTable table; private JTextField textField; private JPasswordField passwordField; private ControlPanelInfo info; private String attrName; /** * Default constructor. * */ public AttributeCellEditor() { textField = Utilities.createTextField(); textField.getDocument().addDocumentListener(new DocumentListener() { /** * {@inheritDoc} */ public void changedUpdate(DocumentEvent ev) { if (!textField.hasFocus()) { textField.requestFocusInWindow(); } } /** * {@inheritDoc} */ public void insertUpdate(DocumentEvent ev) { changedUpdate(ev); } /** * {@inheritDoc} */ public void removeUpdate(DocumentEvent ev) { changedUpdate(ev); } }); passwordField = Utilities.createPasswordField(); passwordField.getDocument().addDocumentListener(new DocumentListener() { /** * {@inheritDoc} */ public void changedUpdate(DocumentEvent ev) { if (!passwordField.hasFocus()) { passwordField.requestFocusInWindow(); } } /** * {@inheritDoc} */ public void insertUpdate(DocumentEvent ev) { changedUpdate(ev); } /** * {@inheritDoc} */ public void removeUpdate(DocumentEvent ev) { changedUpdate(ev); } }); this.defaultEditor = new DefaultCellEditor(textField); this.passwordEditor = new DefaultCellEditor(passwordField); binaryPanel = new BinaryCellPanel(); binaryPanel.addEditActionListener(new ActionListener() { /** * {@inheritDoc} */ public void actionPerformed(ActionEvent e) { if (editBinaryDlg == null) { editBinaryPanel = new BinaryAttributeEditorPanel(); editBinaryPanel.setInfo(getInfo()); editBinaryDlg = new GenericDialog(Utilities.getFrame(table), editBinaryPanel); editBinaryDlg.setModal(true); Utilities.centerGoldenMean(editBinaryDlg, Utilities.getParentDialog(table)); } if (binaryValue != null) { editBinaryPanel.setValue(attrName, binaryValue); } else if (value != null) { if (value.length > 0) { editBinaryPanel.setValue(attrName, BinaryValue.createBase64(value)); } else { editBinaryPanel.setValue(attrName, null); } } else { editBinaryPanel.setValue(attrName, null); } editBinaryDlg.setVisible(true); if (editBinaryPanel.valueChanged()) { BinaryValue changedValue = editBinaryPanel.getBinaryValue(); binaryValue = changedValue; value = null; ocValue = null; } fireEditingStopped(); } }); ocPanel = new ObjectClassCellPanel(); ocPanel.addEditActionListener(new ActionListener() { /** * {@inheritDoc} */ public void actionPerformed(ActionEvent ev) { if (editOcDlg == null) { editOcPanel = new ObjectClassEditorPanel(); editOcPanel.setInfo(getInfo()); editOcDlg = new GenericDialog( null, editOcPanel); editOcDlg.setModal(true); Utilities.centerGoldenMean(editOcDlg, Utilities.getParentDialog(table)); } if (ocValue != null) { editOcPanel.setValue(ocValue); } editOcDlg.setVisible(true); if (editOcPanel.valueChanged()) { binaryValue = null; value = null; ocValue = editOcPanel.getObjectClassValue(); fireEditingStopped(); } } }); } /** * {@inheritDoc} */ public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { this.table = table; if (isPassword(table, row)) { this.value = null; this.binaryValue = null; this.ocValue = null; return passwordEditor.getTableCellEditorComponent(table, value, isSelected, row, column); } else if (value instanceof ObjectClassValue) { this.value = null; this.binaryValue = null; this.ocValue = (ObjectClassValue)value; ocPanel.setValue(ocValue); ocPanel.setBorder(CustomCellRenderer.getDefaultFocusBorder(table, value, isSelected, row, column)); return ocPanel; } else if ((value instanceof byte[]) || (value instanceof BinaryValue)) { attrName = getAttributeName(table, row); boolean isImage = Utilities.hasImageSyntax(attrName, getInfo().getServerDescriptor().getSchema()); if (value instanceof byte[]) { this.value = (byte[])value; this.binaryValue = null; this.ocValue = null; if (this.value.length > 0) { binaryPanel.setValue(BinaryValue.createBase64(this.value), isImage); } else { binaryPanel.setValue((byte[])null, isImage); } } else { this.value = null; this.ocValue = null; binaryValue = (BinaryValue)value; binaryPanel.setValue(binaryValue, isImage); } binaryPanel.setBorder(CustomCellRenderer.getDefaultFocusBorder(table, value, isSelected, row, column)); return binaryPanel; } else { this.value = null; this.binaryValue = null; this.ocValue = null; return defaultEditor.getTableCellEditorComponent(table, value, isSelected, row, column); } } /** * {@inheritDoc} */ public Object getCellEditorValue() { if (binaryValue != null) { return binaryValue; } else if (value != null) { return value; } else if (ocValue != null) { return ocValue; } else { return defaultEditor.getCellEditorValue(); } } private boolean isPassword(JTable table, int row) { boolean isPassword = false; Object o = table.getValueAt(row, 0); if (Utilities.hasPasswordSyntax(String.valueOf(o), getInfo().getServerDescriptor().getSchema())) { isPassword = true; } return isPassword; } private String getAttributeName(JTable table, int row) { Object o = table.getValueAt(row, 0); String attrName = String.valueOf(o); return attrName; } /** * Returns the control panel information. * @return the control panel information. */ public ControlPanelInfo getInfo() { return info; } /** * Sets the control panel information. * @param info the control panel information. */ public void setInfo(ControlPanelInfo info) { this.info = info; } }