blob: b2462777589ac9b6f96c09689e13b408265c35b1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.modules.properties;
import java.awt.Component;
import javax.swing.DefaultCellEditor;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.DocumentListener;
import javax.swing.text.Caret;
import javax.swing.text.JTextComponent;
import org.openide.awt.Mnemonics;
import org.openide.util.NbBundle;
/**
* @author Petr Jiricka
*/
public class PropertiesTableCellEditor extends DefaultCellEditor {
/** Value holding info if the editing cell is a key or value. */
private boolean isKeyCell;
/** Generated serial version UID. */
static final long serialVersionUID =-5292598860635851664L;
/** Document listener. */
private DocumentListener listener;
/** Value component */
private JTextComponent valueComponent;
/** Comment component */
private JTextComponent commentComponent;
/** Class representing settings used in table view. */
private final TableViewSettings settings;
/** Constructs a PropertiesTableCellEditor that uses a text field.
* @param tf a JTextField object ...
* @param commentComponent
* @param valueComponent
* @param valueLabel
* @param listener
*/
public PropertiesTableCellEditor(JTextField tf, final JTextComponent commentComponent,
final JTextComponent valueComponent, final JLabel valueLabel, DocumentListener listener) {
super(tf);
// Number of clicks needed to edit an editable cell.
this.clickCountToStart = 1;
this.listener = listener;
this.valueComponent = valueComponent;
this.commentComponent = commentComponent;
valueComponent.setDocument(tf.getDocument());
this.delegate = new PropertiesEditorDelegate(commentComponent, valueComponent, valueLabel);
((JTextField)editorComponent).addActionListener(delegate);
settings = TableViewSettings.getDefault();
}
/**
* It sets the cursot at the beginnig of edited cell, in case of searching it highlights the found text.
* At the end it request for focus so the editor component (JTextField) has it, not the table.
* This is also a hack with reason to figure out which cell is going to be edited, if a key or a value.
*/
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
// Key or value? Only in the first column are keys.
isKeyCell = (column == 0) ? true : false;
valueComponent.getDocument().removeDocumentListener(listener);
commentComponent.getDocument().removeDocumentListener(listener);
final JTextField textField = (JTextField)super.getTableCellEditorComponent(table, value, isSelected, row, column);
valueComponent.getDocument().addDocumentListener(listener);
commentComponent.getDocument().addDocumentListener(listener);
Caret caret = textField.getCaret();
caret.setVisible(true);
caret.setDot(0);
textField.setFont(settings.getFont());
// Check for search results.
// If search was performed, highlight the found string.
int[] result = (int[])table.getClientProperty(FindPerformer.TABLE_SEARCH_RESULT);
if(result != null && row == result[0] && column == result[1]) {
table.putClientProperty(FindPerformer.TABLE_SEARCH_RESULT, null); // removes property
caret.setDot(result[2]);
caret.moveDot(result[3]);
}
return textField;
}
/** Inner class which is cell editor delegate. */
private class PropertiesEditorDelegate extends DefaultCellEditor.EditorDelegate {
/** Reference to text component showing comments on bundle edit table. */
JTextComponent commentComponent;
/** Reference to text component showing key or value respectively on bundle edit table. */
JTextComponent valueComponent;
/** Reference to the value label. */
JLabel valueLabel;
/** Generated serial version UID. */
static final long serialVersionUID =9082979978712223677L;
/** Constructor. */
public PropertiesEditorDelegate(JTextComponent commentComponent, JTextComponent valueComponent, JLabel valueLabel) {
this.commentComponent = commentComponent;
this.valueComponent = valueComponent;
this.valueLabel = valueLabel;
}
@Override
public void setValue(Object x) {
// PENDING - due to a compiler error explicitly do "super" code instead of calling super
this.value = x;
// super.setValue(x);
PropertiesTableModel.StringPair sp = (PropertiesTableModel.StringPair)x;
// set values as they deserve
if (sp != null) {
//!!! text area is required due to multiline values
// otherwise the textfield removes new lines
((JTextField)getComponent()).setText(sp.getValue());
commentComponent.setText(sp.getComment());
} else {
((JTextField)getComponent()).setText(""); // NOI18N
commentComponent.setText(""); // NOI18N
}
}
@Override
public Object getCellEditorValue() {
String value = ((JTextField)getComponent()).getText();
// Cell is a properties key.
if(isKeyCell) {
Mnemonics.setLocalizedText(valueLabel, NbBundle.getBundle(PropertyPanel.class).getString("LBL_KeyLabel"));
}
// Cell is a properties value.
else {
Mnemonics.setLocalizedText(valueLabel, NbBundle.getBundle(BundleEditPanel.class).getString("LBL_ValueLabel"));
}
// the cell is a properties key
return new PropertiesTableModel.StringPair(commentComponent.getText(),value,isKeyCell);
}
} // End of inner PropertiesEditorDelegate class.
}