/*
GanttProject is an opensource project management tool.
Copyright (C) 2011 GanttProject Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package net.sourceforge.ganttproject;
import biz.ganttproject.core.option.ValidationException;
import net.sourceforge.ganttproject.gui.UIUtil;
import javax.swing.*;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
import javax.swing.text.JTextComponent;
import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.util.EventObject;
class TreeTableCellEditorImpl implements TableCellEditor {
private final DefaultCellEditor myProxiedEditor;
private final JTable myTable;
TreeTableCellEditorImpl(DefaultCellEditor proxiedEditor, JTable table) {
assert proxiedEditor != null;
myProxiedEditor = proxiedEditor;
myTable = table;
}
@Override
public Component getTableCellEditorComponent(JTable arg0, Object arg1, boolean arg2, int arg3, int arg4) {
final Component result = myProxiedEditor.getTableCellEditorComponent(arg0, arg1, arg2, arg3, arg4);
if (result instanceof JTextComponent) {
((JTextComponent) result).selectAll();
//myFocusCommand = createSelectAllCommand((JTextComponent)result);
}
return result;
}
@Override
public Object getCellEditorValue() {
return myProxiedEditor.getCellEditorValue();
}
@Override
public boolean isCellEditable(EventObject event) {
if (event instanceof MouseEvent) {
MouseEvent mouseEvent = (MouseEvent) event;
if (mouseEvent.getClickCount() == 2) {
return false;
}
if (mouseEvent.getClickCount() == 1
&& myTable.rowAtPoint(mouseEvent.getPoint()) == myTable.getSelectedRow()
&& myTable.columnAtPoint(mouseEvent.getPoint()) == myTable.getSelectedColumn()) {
return myProxiedEditor.isCellEditable(null);
}
}
return myProxiedEditor.isCellEditable(event);
}
@Override
public boolean shouldSelectCell(EventObject arg0) {
return myProxiedEditor.shouldSelectCell(arg0);
}
@Override
public boolean stopCellEditing() {
try {
return myProxiedEditor.stopCellEditing();
} catch (ValidationException e) {
GPLogger.log(e.getMessage());
myProxiedEditor.getComponent().setBackground(UIUtil.INVALID_VALUE_BACKGROUND);
return false;
}
}
@Override
public void cancelCellEditing() {
myProxiedEditor.cancelCellEditing();
}
@Override
public void addCellEditorListener(CellEditorListener arg0) {
myProxiedEditor.addCellEditorListener(arg0);
}
@Override
public void removeCellEditorListener(CellEditorListener arg0) {
myProxiedEditor.removeCellEditorListener(arg0);
}
static Runnable createSelectAllCommand(final JTextComponent textComponent) {
return createOnFocusGained(textComponent, new Runnable() {
@Override
public void run() {
textComponent.selectAll();
}
});
}
public static Runnable createUnselectAllCommand(final JTextComponent textComponent) {
return createOnFocusGained(textComponent, new Runnable() {
@Override
public void run() {
textComponent.select(Integer.MAX_VALUE, Integer.MAX_VALUE);
}
});
}
private static Runnable createOnFocusGained(final JTextComponent textComponent, final Runnable onFocusGained) {
final FocusListener focusListener = new FocusAdapter() {
@Override
public void focusGained(FocusEvent arg0) {
super.focusGained(arg0);
SwingUtilities.invokeLater(onFocusGained);
textComponent.removeFocusListener(this);
}
};
textComponent.addFocusListener(focusListener);
return new Runnable() {
@Override
public void run() {
textComponent.requestFocus();
}
};
}
}