/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.fib.utils;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.lang.reflect.Type;
import java.util.Hashtable;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractListModel;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.openflexo.antar.binding.AbstractBinding;
import org.openflexo.antar.binding.Bindable;
import org.openflexo.antar.binding.BindingDefinition;
import org.openflexo.antar.binding.BindingExpression;
import org.openflexo.antar.binding.BindingModel;
import org.openflexo.antar.binding.BindingPathElement;
import org.openflexo.antar.binding.BindingValue;
import org.openflexo.antar.binding.BindingVariableImpl;
import org.openflexo.antar.binding.FinalBindingPathElement;
import org.openflexo.antar.binding.MethodCall;
import org.openflexo.antar.binding.MethodCall.MethodCallArgument;
import org.openflexo.antar.binding.MethodDefinition;
import org.openflexo.antar.binding.StaticBinding;
import org.openflexo.antar.binding.TypeUtils;
import org.openflexo.antar.binding.Typed;
import org.openflexo.fib.model.FIBModelObject;
import org.openflexo.fib.utils.BindingSelector.EditionMode;
import org.openflexo.fib.utils.table.AbstractModel;
import org.openflexo.fib.utils.table.BindingValueColumn;
import org.openflexo.fib.utils.table.IconColumn;
import org.openflexo.fib.utils.table.StringColumn;
import org.openflexo.fib.utils.table.TabularPanel;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.swing.ButtonsControlPanel;
import org.openflexo.swing.MouseOverButton;
import org.openflexo.swing.VerticalLayout;
import org.openflexo.toolbox.StringUtils;
import org.openflexo.toolbox.ToolBox;
class BindingSelectorPanel extends BindingSelector.AbstractBindingSelectorPanel implements ListSelectionListener {
static final Logger logger = Logger.getLogger(BindingSelectorPanel.class.getPackage().getName());
/**
*
*/
final BindingSelector _bindingSelector;
protected JPanel _browserPanel;
ButtonsControlPanel _controlPanel;
JButton _connectButton;
JButton _cancelButton;
JButton _resetButton;
JButton _expressionButton;
JButton _createsButton;
private Map<BindingPathElement, Hashtable<Type, BindingColumnListModel>> _listModels;
Vector<FilteredJList> _lists;
protected int defaultVisibleColCount = 3;
protected final EmptyColumnListModel EMPTY_MODEL = new EmptyColumnListModel();
private BindingColumnListModel _rootBindingColumnListModel = null;
JLabel currentTypeLabel;
private JLabel searchedTypeLabel;
private JTextArea bindingValueRepresentation;
protected BindingColumnElement currentFocused = null;
protected BindingSelectorPanel(BindingSelector bindingSelector) {
bindingSelector.super();
_bindingSelector = bindingSelector;
_listModels = new Hashtable<BindingPathElement, Hashtable<Type, BindingColumnListModel>>();
_rootBindingColumnListModel = null;
_lists = new Vector<FilteredJList>();
}
@Override
public void delete() {
for (JList list : _lists) {
list.removeListSelectionListener(this);
list.setModel(null);
}
_lists.clear();
_listModels.clear();
_rootBindingColumnListModel = null;
currentFocused = null;
}
public int getIndexOfList(BindingColumnListModel model) {
for (int i = 0; i < _lists.size(); i++) {
FilteredJList l = _lists.get(i);
if (l.getModel() == model) {
return i;
}
}
return -1;
}
public Class getAccessedEntity() {
Class reply = null;
int i = 1;
BindingColumnElement last = null;
while (listAtIndex(i) != null && listAtIndex(i).getSelectedValue() != null) {
last = (BindingColumnElement) listAtIndex(i).getSelectedValue();
i++;
}
if (last != null) {
return TypeUtils.getBaseClass(last.getElement().getType());
}
return reply;
}
public BindingVariableImpl getSelectedBindingVariable() {
if (listAtIndex(0) != null && listAtIndex(0).getSelectedValue() != null) {
return (BindingVariableImpl) ((BindingColumnElement) listAtIndex(0).getSelectedValue()).getElement();
} else if (listAtIndex(0) != null && listAtIndex(0).getModel().getSize() == 1) {
return (BindingVariableImpl) listAtIndex(0).getModel().getElementAt(0).getElement();
} else {
return null;
}
}
@Deprecated
private BindingColumnElement findElementMatching(ListModel listModel, String subPartialPath, Vector<Integer> pathElementIndex) {
for (int i = 0; i < listModel.getSize(); i++) {
if (listModel.getElementAt(i) instanceof BindingColumnElement
&& ((BindingColumnElement) listModel.getElementAt(i)).getLabel().startsWith(subPartialPath)) {
if (pathElementIndex.size() == 0) {
pathElementIndex.add(i);
} else {
pathElementIndex.set(0, i);
}
return (BindingColumnElement) listModel.getElementAt(i);
}
}
return null;
}
Vector<BindingColumnElement> findElementsMatching(BindingColumnListModel listModel, String subPartialPath) {
Vector<BindingColumnElement> returned = new Vector<BindingColumnElement>();
for (int i = 0; i < listModel.getUnfilteredSize(); i++) {
if (listModel.getUnfilteredElementAt(i).getLabel().startsWith(subPartialPath)) {
returned.add(listModel.getUnfilteredElementAt(i));
}
}
return returned;
}
BindingColumnElement findElementEquals(ListModel listModel, String subPartialPath) {
for (int i = 0; i < listModel.getSize(); i++) {
if (listModel.getElementAt(i) instanceof BindingColumnElement) {
if (((BindingColumnElement) listModel.getElementAt(i)).getLabel().equals(subPartialPath)) {
return (BindingColumnElement) listModel.getElementAt(i);
}
}
}
return null;
}
public Type getEndingTypeForSubPath(String pathIgnoringLastPart) {
StringTokenizer token = new StringTokenizer(pathIgnoringLastPart, ".", false);
Object obj = null;
int i = 0;
while (token.hasMoreTokens()) {
obj = findElementEquals(listAtIndex(i).getModel(), token.nextToken());
i++;
}
if (obj instanceof BindingColumnElement) {
Typed element = ((BindingColumnElement) obj).getElement();
return element.getType();
}
return null;
}
protected class MethodCallBindingsModel extends AbstractModel<MethodCall, MethodCallArgument> {
public MethodCallBindingsModel() {
super(null);
addToColumns(new IconColumn<MethodCallArgument>("icon", 25) {
@Override
public Icon getIcon(MethodCallArgument entity) {
return FIBIconLibrary.METHOD_ICON;
}
});
addToColumns(new StringColumn<MethodCallArgument>("name", 100) {
@Override
public String getValue(MethodCallArgument arg) {
if (arg != null) {
return arg.getName();
}
/*
* if (paramForValue(bindingValue) != null) return
* paramForValue(bindingValue).getName();
*/
return "null";
}
});
addToColumns(new StringColumn<MethodCallArgument>("type", 100) {
@Override
public String getValue(MethodCallArgument arg) {
if (arg != null) {
return TypeUtils.simpleRepresentation(arg.getType());
}
return "null";
}
});
addToColumns(new BindingValueColumn<MethodCallArgument>("value", 250, true) {
@Override
public AbstractBinding getValue(MethodCallArgument arg) {
return arg.getBinding();
}
@Override
public void setValue(MethodCallArgument arg, AbstractBinding aValue) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Sets value " + arg + " to be " + aValue);
}
if (arg != null) {
arg.setBinding(aValue);
}
BindingSelectorPanel.this._bindingSelector.fireEditedObjectChanged();
}
@Override
public Bindable getBindableFor(AbstractBinding value, MethodCallArgument rowObject) {
return BindingSelectorPanel.this._bindingSelector.getBindable();
}
@Override
public BindingDefinition getBindingDefinitionFor(AbstractBinding value, MethodCallArgument rowObject) {
if (rowObject != null) {
return rowObject.getBindingDefinition();
}
return null;
}
@Override
public boolean allowsCompoundBinding(AbstractBinding value) {
return true;
}
@Override
public boolean allowsNewEntryCreation(AbstractBinding value) {
return false;
}
});
}
/*
* DMMethodParameter paramForValue(AbstractBinding bindingValue) { if
* ((bindingValue.getBindingDefinition() != null) &&
* (bindingValue.getBindingDefinition() instanceof
* MethodCall.MethodCallParamBindingDefinition)) { return
* ((MethodCall.MethodCallParamBindingDefinition
* )bindingValue.getBindingDefinition()).getParam(); } return null; }
*/
public MethodCall getMethodCall() {
return getModel();
}
@Override
public MethodCallArgument elementAt(int row) {
if (row >= 0 && row < getRowCount()) {
return getMethodCall().getArgs().elementAt(row);
} else {
return null;
}
}
@Override
public int getRowCount() {
if (getMethodCall() != null) {
return getMethodCall().getArgs().size();
}
return 0;
}
}
protected class MethodCallBindingsPanel extends TabularPanel {
public MethodCallBindingsPanel() {
super(getMethodCallBindingsModel(), 3);
}
}
private MethodCallBindingsModel _methodCallBindingsModel;
private MethodCallBindingsPanel _methodCallBindingsPanel;
public MethodCallBindingsPanel getMethodCallBindingsPanel() {
if (_methodCallBindingsPanel == null) {
_methodCallBindingsPanel = new MethodCallBindingsPanel();
}
return _methodCallBindingsPanel;
}
public MethodCallBindingsModel getMethodCallBindingsModel() {
if (_methodCallBindingsModel == null) {
_methodCallBindingsModel = new MethodCallBindingsModel();
}
return _methodCallBindingsModel;
}
@Override
public Dimension getDefaultSize() {
int baseHeight;
if (_bindingSelector.editionMode == EditionMode.COMPOUND_BINDING) {
baseHeight = 300;
} else {
baseHeight = 180;
}
if (_bindingSelector.areStaticValuesAllowed() || _bindingSelector.areCompoundBindingAllowed()) {
baseHeight += 30;
}
return new Dimension(500, baseHeight);
}
@Override
protected void willApply() {
if (editStaticValue && staticBindingPanel != null) {
staticBindingPanel.willApply();
}
}
private MouseOverButton showHideCompoundBindingsButton;
private StaticBindingPanel staticBindingPanel;
@Override
protected void init() {
if (logger.isLoggable(Level.FINE)) {
logger.fine("init() with " + _bindingSelector.editionMode + " for " + _bindingSelector.getEditedObject());
}
setLayout(new BorderLayout());
_browserPanel = new JPanel();
_browserPanel.setLayout(new BoxLayout(_browserPanel, BoxLayout.X_AXIS));
for (int i = 0; i < defaultVisibleColCount; i++) {
makeNewJList();
}
_controlPanel = new ButtonsControlPanel() {
@Override
public String localizedForKeyAndButton(String key, JButton component) {
return FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, key, component);
}
};
_connectButton = _controlPanel.addButton("connect", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BindingSelectorPanel.this._bindingSelector.apply();
}
});
_cancelButton = _controlPanel.addButton("cancel", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BindingSelectorPanel.this._bindingSelector.cancel();
}
});
_resetButton = _controlPanel.addButton("reset", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BindingSelectorPanel.this._bindingSelector.setEditedObject(null);
BindingSelectorPanel.this._bindingSelector.apply();
}
});
if (_bindingSelector.areBindingExpressionsAllowed()) {
_expressionButton = _controlPanel.addButton("expression", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (BindingSelectorPanel.this._bindingSelector.getEditedObject() != null) {
BindingSelectorPanel.this._bindingSelector.activateBindingExpressionMode(new BindingExpression(
BindingSelectorPanel.this._bindingSelector.getBindingDefinition(),
BindingSelectorPanel.this._bindingSelector.getBindable(), BindingSelectorPanel.this._bindingSelector
.getEditedObject()));
} else {
BindingSelectorPanel.this._bindingSelector.activateBindingExpressionMode(null);
}
}
});
}
_controlPanel.applyFocusTraversablePolicyTo(_controlPanel, false);
JPanel optionsPanel = new JPanel();
optionsPanel.setLayout(new BorderLayout());
if (_bindingSelector.areCompoundBindingAllowed()) {
showHideCompoundBindingsButton = new MouseOverButton();
showHideCompoundBindingsButton.setBorder(BorderFactory.createEmptyBorder());
showHideCompoundBindingsButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (BindingSelectorPanel.this._bindingSelector.editionMode == EditionMode.COMPOUND_BINDING) {
BindingSelectorPanel.this._bindingSelector.activateNormalBindingMode();
} else {
BindingSelectorPanel.this._bindingSelector.activateCompoundBindingMode();
}
}
});
JLabel showHideCompoundBindingsButtonLabel = new JLabel("", SwingConstants.RIGHT);
showHideCompoundBindingsButtonLabel.setFont(new Font("SansSerif", Font.PLAIN, 10));
if (_bindingSelector.editionMode == EditionMode.COMPOUND_BINDING) {
showHideCompoundBindingsButton.setNormalIcon(FIBIconLibrary.TOGGLE_ARROW_TOP_ICON);
showHideCompoundBindingsButton.setMouseOverIcon(FIBIconLibrary.TOGGLE_ARROW_TOP_SELECTED_ICON);
showHideCompoundBindingsButton.setToolTipText(FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION,
"specify_basic_binding"));
showHideCompoundBindingsButtonLabel.setText(FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION,
"specify_basic_binding") + " ");
} else {
showHideCompoundBindingsButton.setNormalIcon(FIBIconLibrary.TOGGLE_ARROW_BOTTOM_ICON);
showHideCompoundBindingsButton.setMouseOverIcon(FIBIconLibrary.TOGGLE_ARROW_BOTTOM_SELECTED_ICON);
showHideCompoundBindingsButton.setToolTipText(FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION,
"specify_compound_binding"));
showHideCompoundBindingsButtonLabel.setText(FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION,
"specify_compound_binding") + " ");
}
JPanel showHideCompoundBindingsButtonPanel = new JPanel();
showHideCompoundBindingsButtonPanel.setLayout(new BorderLayout());
showHideCompoundBindingsButtonPanel.add(showHideCompoundBindingsButtonLabel, BorderLayout.CENTER);
showHideCompoundBindingsButtonPanel.add(showHideCompoundBindingsButton, BorderLayout.EAST);
optionsPanel.add(showHideCompoundBindingsButtonPanel, BorderLayout.EAST);
}
if (_bindingSelector.areStaticValuesAllowed()) {
JPanel optionsWestPanel = new JPanel();
optionsWestPanel.setLayout(new VerticalLayout());
staticBindingPanel = new StaticBindingPanel(this);
optionsWestPanel.add(staticBindingPanel);
optionsPanel.add(optionsWestPanel, BorderLayout.WEST);
}
currentTypeLabel = new JLabel(FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "no_type"), SwingConstants.LEFT);
currentTypeLabel.setFont(new Font("SansSerif", Font.ITALIC, 10));
currentTypeLabel.setForeground(Color.GRAY);
searchedTypeLabel = new JLabel("[" + FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "no_type") + "]",
SwingConstants.LEFT);
searchedTypeLabel.setFont(new Font("SansSerif", Font.PLAIN, 10));
searchedTypeLabel.setForeground(Color.RED);
JPanel labelPanel = new JPanel();
labelPanel.setLayout(new BorderLayout());
labelPanel.add(currentTypeLabel, BorderLayout.CENTER);
labelPanel.add(searchedTypeLabel, BorderLayout.EAST);
JComponent topPane;
if (_bindingSelector.editionMode == EditionMode.COMPOUND_BINDING) {
topPane = new JPanel();
topPane.setLayout(new BorderLayout());
bindingValueRepresentation = new JTextArea(3, 80);
bindingValueRepresentation.setFont(new Font("SansSerif", Font.PLAIN, 10));
bindingValueRepresentation.setEditable(false);
bindingValueRepresentation.setLineWrap(true);
topPane.add(bindingValueRepresentation, BorderLayout.CENTER);
topPane.add(labelPanel, BorderLayout.SOUTH);
} else {
topPane = labelPanel;
}
add(topPane, BorderLayout.NORTH);
JComponent middlePane;
// logger.info("Rebuild middle pane, with mode="+editionMode);
if (_bindingSelector.editionMode == EditionMode.COMPOUND_BINDING) {
middlePane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JScrollPane(_browserPanel,
ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED),
getMethodCallBindingsPanel()); // ICI
((JSplitPane) middlePane).setDividerLocation(0.5);
((JSplitPane) middlePane).setResizeWeight(0.5);
} else { // For NORMAL_BINDING and STATIC_BINDING
middlePane = new JScrollPane(_browserPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); // ICI
}
JPanel middlePaneWithOptions = new JPanel();
middlePaneWithOptions.setLayout(new BorderLayout());
middlePaneWithOptions.add(middlePane, BorderLayout.CENTER);
if (_bindingSelector.areStaticValuesAllowed() || _bindingSelector.areCompoundBindingAllowed()) {
middlePaneWithOptions.add(optionsPanel, BorderLayout.SOUTH);
}
add(middlePaneWithOptions, BorderLayout.CENTER);
add(_controlPanel, BorderLayout.SOUTH);
resetMethodCallPanel();
// Init static panel
editStaticValue = true;
setEditStaticValue(false);
update();
FilteredJList firstList = listAtIndex(0);
if (firstList != null && firstList.getModel().getSize() == 1) {
firstList.setSelectedIndex(0);
}
}
protected void updateSearchedTypeLabel() {
if (_bindingSelector.getBindingDefinition() != null) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("updateSearchedTypeLabel() with " + _bindingSelector.getBindingDefinition().getTypeStringRepresentation());
}
searchedTypeLabel.setText("[" + _bindingSelector.getBindingDefinition().getTypeStringRepresentation() + "]");
}
}
protected int getVisibleColsCount() {
return _lists.size();
}
public boolean ensureBindingValueExists() {
AbstractBinding bindingValue = _bindingSelector.getEditedObject();
if (bindingValue == null) {
if (_bindingSelector.getBindingDefinition() != null && _bindingSelector.getBindable() != null) {
bindingValue = _bindingSelector.makeBinding();
_bindingSelector.setEditedObject(bindingValue);
} else {
return false;
}
}
return _bindingSelector.getEditedObject() != null;
}
protected class FilteredJList extends JList {
public FilteredJList() {
super(new EmptyColumnListModel());
}
public String getFilter() {
return getModel().getFilter();
}
public void setFilter(String aFilter) {
getModel().setFilter(aFilter);
}
public boolean isFiltered() {
return StringUtils.isNotEmpty(getFilter());
}
@Override
public void setModel(ListModel model) {
if (model != null && !(model instanceof BindingColumnListModel)) {
new Exception("Oops, this model is " + model).printStackTrace();
}
setFilter(null);
if (model != null) {
super.setModel(model);
}
}
@Override
public BindingColumnListModel getModel() {
if (super.getModel() instanceof BindingColumnListModel) {
return (BindingColumnListModel) super.getModel();
} else {
new Exception("Oops, got a " + super.getModel()).printStackTrace();
return null;
}
}
}
protected JList makeNewJList() {
FilteredJList newList = new FilteredJList();
TypeResolver typeResolver = new TypeResolver(newList);
newList.addMouseMotionListener(typeResolver);
newList.addMouseListener(typeResolver);
_lists.add(newList);
if (logger.isLoggable(Level.FINE)) {
logger.fine("makeNewJList() size = " + _lists.size());
}
newList.setPrototypeCellValue("123456789012345"); // ICI
newList.setSize(new Dimension(100, 150));
// newList.setPreferredSize(new Dimension(200,150)); // ICI
// newList.setMinimumSize(new Dimension(200,150)); // ICI
newList.setCellRenderer(new BindingSelectorCellRenderer());
newList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
newList.addListSelectionListener(this);
newList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
if (BindingSelectorPanel.this._bindingSelector.getEditedObject() != null
&& BindingSelectorPanel.this._bindingSelector.getEditedObject().isBindingValid()) {
BindingSelectorPanel.this._bindingSelector.apply();
}
} else if (e.getClickCount() == 1) {
// Trying to update MethodCall Panel
JList list = (JList) e.getSource();
int index = _lists.indexOf(list);
if (logger.isLoggable(Level.FINE)) {
logger.fine("Click on index " + index);
}
if (index < 0) {
return;
}
_selectedPathElementIndex = index;
updateMethodCallPanel();
}
}
});
newList.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
// processAnyKeyTyped(e);
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyChar() == '\n') {
BindingSelectorPanel.this._bindingSelector._selectorPanel.processEnterPressed();
e.consume();
} else if (e.getKeyChar() == KeyEvent.VK_BACK_SPACE) {
BindingSelectorPanel.this._bindingSelector._selectorPanel.processBackspace();
e.consume();
} else if (e.getKeyChar() == KeyEvent.VK_DELETE) {
BindingSelectorPanel.this._bindingSelector._selectorPanel.processDelete();
e.consume();
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
if (!ensureBindingValueExists()) {
return;
}
AbstractBinding bindingValue = BindingSelectorPanel.this._bindingSelector.getEditedObject();
if (bindingValue instanceof BindingValue) {
int i = _lists.indexOf(e.getSource());
if (i > -1 && i < _lists.size() && listAtIndex(i + 1) != null
&& listAtIndex(i + 1).getModel().getElementAt(0) != null
&& listAtIndex(i + 1).getModel().getElementAt(0).getElement() instanceof BindingPathElement) {
((BindingValue) bindingValue).setBindingPathElementAtIndex(listAtIndex(i + 1).getModel().getElementAt(0)
.getElement(), i);
BindingSelectorPanel.this._bindingSelector.setEditedObject(bindingValue);
BindingSelectorPanel.this._bindingSelector.fireEditedObjectChanged();
listAtIndex(i + 1).requestFocusInWindow();
}
e.consume();
}
} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
if (!ensureBindingValueExists()) {
return;
}
AbstractBinding bindingValue = BindingSelectorPanel.this._bindingSelector.getEditedObject();
if (bindingValue instanceof BindingValue) {
int i = _lists.indexOf(e.getSource()) - 1;
if (((BindingValue) bindingValue).getBindingPath().size() > i && i > -1 && i < _lists.size()) {
((BindingValue) bindingValue).getBindingPath().removeElementAt(i);
((BindingValue) bindingValue).disconnect();
BindingSelectorPanel.this._bindingSelector.setEditedObject(bindingValue);
BindingSelectorPanel.this._bindingSelector.fireEditedObjectChanged();
listAtIndex(i).requestFocusInWindow();
}
e.consume();
}
}
}
});
_browserPanel.add(new JScrollPane(newList, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)); // ICI
newList.setVisibleRowCount(6);
revalidate();
repaint();
return newList;
}
int _selectedPathElementIndex = -1;
protected void resetMethodCallPanel() {
if (_bindingSelector.getEditedObject() == null || _bindingSelector.getEditedObject().isStaticValue()
|| _bindingSelector.getEditedObject() instanceof BindingValue
&& ((BindingValue) _bindingSelector.getEditedObject()).getBindingPath().size() == 0) {
_selectedPathElementIndex = -1;
} else if (_bindingSelector.getEditedObject() instanceof BindingValue) {
_selectedPathElementIndex = ((BindingValue) _bindingSelector.getEditedObject()).getBindingPath().size();
}
updateMethodCallPanel();
}
void updateMethodCallPanel() {
if (logger.isLoggable(Level.FINE)) {
logger.fine("updateMethodCallPanel with " + _bindingSelector.editionMode + " binding=" + _bindingSelector.getEditedObject()
+ " _selectedPathElementIndex=" + _selectedPathElementIndex);
}
if (_bindingSelector.editionMode == EditionMode.COMPOUND_BINDING && _bindingSelector.getEditedObject() instanceof BindingValue) {
if (((BindingValue) _bindingSelector.getEditedObject()).isCompoundBinding() && _selectedPathElementIndex == -1) {
_selectedPathElementIndex = ((BindingValue) _bindingSelector.getEditedObject()).getBindingPathElementCount();
}
if (_selectedPathElementIndex >= _lists.size()) {
_selectedPathElementIndex = -1;
}
BindingValue bindingValue = (BindingValue) _bindingSelector.getEditedObject();
if (bindingValue == null) {
_selectedPathElementIndex = -1;
} else if (_selectedPathElementIndex > bindingValue.getBindingPath().size()) {
_selectedPathElementIndex = -1;
}
if (_selectedPathElementIndex > -1 && bindingValue != null) {
JList list = _lists.get(_selectedPathElementIndex);
int newSelectedIndex = list.getSelectedIndex();
if (newSelectedIndex > 0) {
BindingColumnElement selectedValue = (BindingColumnElement) list.getSelectedValue();
if (selectedValue.getElement() instanceof MethodDefinition) {
BindingPathElement currentElement = bindingValue.getBindingPathElementAtIndex(_selectedPathElementIndex - 1);
if (currentElement instanceof MethodCall
&& ((MethodCall) currentElement).getMethod().equals(
((MethodDefinition) selectedValue.getElement()).getMethod())) {
getMethodCallBindingsModel().setModel((MethodCall) currentElement);
return;
}
}
}
}
getMethodCallBindingsModel().setModel(null);
return;
}
}
protected void deleteJList(JList list) {
_lists.remove(list);
Component[] scrollPanes = _browserPanel.getComponents();
for (int i = 0; i < scrollPanes.length; i++) {
if (((Container) scrollPanes[i]).isAncestorOf(list)) {
_browserPanel.remove(scrollPanes[i]);
}
}
if (logger.isLoggable(Level.FINE)) {
logger.fine("deleteJList() size = " + _lists.size());
}
revalidate();
repaint();
}
protected FilteredJList listAtIndex(int index) {
if (index >= 0 && index < _lists.size()) {
return _lists.elementAt(index);
}
return null;
}
// TODO ???
/*
* public void setBindingDefinition(BindingDefinition bindingDefinition) {
* if (bindingDefinition != getBindingDefinition()) {
* super.setBindingDefinition(bindingDefinition);
* staticBindingPanel.updateStaticBindingPanel(); } }
*/
@Override
protected void fireBindableChanged() {
_rootBindingColumnListModel = buildRootColumnListModel();
update();
}
@Override
protected void fireBindingDefinitionChanged() {
if (logger.isLoggable(Level.FINE)) {
logger.fine("fireBindingDefinitionChanged / Setting new binding definition: " + _bindingSelector.getBindingDefinition());
}
update();
if (staticBindingPanel != null) {
staticBindingPanel.updateStaticBindingPanel();
}
}
private void clearColumns() {
listAtIndex(0).setModel(_bindingSelector.getRootListModel());
int lastUpdatedList = 0;
// Remove unused lists
int lastVisibleList = defaultVisibleColCount - 1;
if (lastUpdatedList > lastVisibleList) {
lastVisibleList = lastUpdatedList;
}
int currentSize = getVisibleColsCount();
for (int i = lastVisibleList + 1; i < currentSize; i++) {
JList toRemove = listAtIndex(getVisibleColsCount() - 1);
deleteJList(toRemove);
}
// Sets model to null for visible but unused lists
for (int i = lastUpdatedList + 1; i < getVisibleColsCount(); i++) {
JList list = listAtIndex(i);
list.setModel(EMPTY_MODEL);
}
}
@Override
protected void update() {
AbstractBinding binding = _bindingSelector.getEditedObject();
if (logger.isLoggable(Level.FINE)) {
logger.fine("update with " + binding);
}
if (binding == null || binding instanceof StaticBinding) {
clearColumns();
if (binding == null) {
setEditStaticValue(false);
}
} else if (binding instanceof BindingValue) {
BindingValue bindingValue = (BindingValue) binding;
listAtIndex(0).setModel(_bindingSelector.getRootListModel());
int lastUpdatedList = 0;
// logger.info("bindingValue.getBindingVariable()="+bindingValue.getBindingVariable());
if (bindingValue.getBindingVariable() != null) {
if (bindingValue.getBindingVariable().getType() != null) {
listAtIndex(1)
.setModel(
_bindingSelector.getListModelFor(bindingValue.getBindingVariable(), bindingValue.getBindingVariable()
.getType()));
} else {
listAtIndex(1).setModel(EMPTY_MODEL);
}
listAtIndex(0).removeListSelectionListener(this);
BindingColumnElement elementToSelect = listAtIndex(0).getModel().getElementFor(bindingValue.getBindingVariable());
listAtIndex(0).setSelectedValue(elementToSelect, true);
listAtIndex(0).addListSelectionListener(this);
lastUpdatedList = 1;
for (int i = 0; i < bindingValue.getBindingPath().size(); i++) {
BindingPathElement pathElement = bindingValue.getBindingPath().elementAt(i);
if (i + 2 == getVisibleColsCount()) {
final JList l = makeNewJList();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Rectangle r = SwingUtilities.convertRectangle(l, l.getBounds(), _browserPanel);
// System.out.println("scrollRectToVisible with "+r);
_browserPanel.scrollRectToVisible(r); // ICI
}
});
}
/*
* if (i==bindingValue.getBindingPath().size()-1) {
* logger.info("Dernier element: "+pathElement); }
*/
if (!(bindingValue.isConnected() && bindingValue.isLastBindingPathElement(pathElement, i))) {
Type resultingType = bindingValue.getBindingPath().getResultingTypeAtIndex(i);
listAtIndex(i + 2).setModel(_bindingSelector.getListModelFor(bindingValue.getBindingPath().get(i), resultingType));
lastUpdatedList = i + 2;
}
listAtIndex(i + 1).removeListSelectionListener(this);
BindingColumnElement theElementToSelect = listAtIndex(i + 1).getModel().getElementFor(pathElement);
listAtIndex(i + 1).setSelectedValue(theElementToSelect, true);
/*
* if (pathElement instanceof KeyValueProperty) {
* BindingColumnElement propertyElementToSelect =
* listAtIndex(i+1).getModel().getElementFor(pathElement);
* listAtIndex(i +
* 1).setSelectedValue(propertyElementToSelect, true); }
* else if (pathElement instanceof MethodCall) {
* BindingColumnElement methodElementToSelect =
* listAtIndex(i
* +1).getModel().getElementFor(((MethodCall)pathElement
* ).getMethodDefinition()); listAtIndex(i +
* 1).setSelectedValue(methodElementToSelect, true); if
* (methodElementToSelect == null) {
* logger.warning("Unexpected NULL BindingColumnElement"); }
* /
* /logger.info("Set selected value with "+methodElementToSelect
* ); }
*/
listAtIndex(i + 1).addListSelectionListener(this);
if (i < bindingValue.getBindingPath().size() - 1) {
listAtIndex(i).setFilter(null);
}
}
// logger.info("FIN");
}
// Remove and clean unused lists
cleanLists(lastUpdatedList);
if (_bindingSelector.editionMode == EditionMode.COMPOUND_BINDING) {
bindingValueRepresentation.setText(_bindingSelector.renderedString(bindingValue));
bindingValueRepresentation.setForeground(bindingValue.isBindingValid() ? Color.BLACK : Color.RED);
updateMethodCallPanel();
}
// currentTypeLabel.setText(FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "no_type"));
// currentTypeLabel.setToolTipText(null);
}
updateSearchedTypeLabel();
if (binding != null) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Binding " + binding + " isValid()=" + binding.isBindingValid());
} else if (logger.isLoggable(Level.FINE)) {
logger.fine("Binding is null");
}
}
// Set connect button state
_connectButton.setEnabled(binding != null && binding.isBindingValid());
/*if (!binding.isBindingValid()) {
logger.info("Binding NOT valid: " + binding);
binding.debugIsBindingValid();
}*/
if (binding != null && binding.isBindingValid()) {
if (ToolBox.isMacOSLaf()) {
_connectButton.setSelected(true);
}
}
if (binding != null) {
_bindingSelector.getTextField().setForeground(binding.isBindingValid() ? Color.BLACK : Color.RED);
_bindingSelector.getTextField().setSelectedTextColor(binding.isBindingValid() ? Color.BLACK : Color.RED);
}
if (_bindingSelector.areStaticValuesAllowed() && staticBindingPanel != null) {
staticBindingPanel.updateStaticBindingPanel();
}
if (binding instanceof BindingValue) {
setEditStaticValue(false);
} else if (binding instanceof StaticBinding) {
setEditStaticValue(true);
}
}
private void cleanLists(int lastUpdatedList) {
// Remove unused lists
int lastVisibleList = defaultVisibleColCount - 1;
if (lastUpdatedList > lastVisibleList) {
lastVisibleList = lastUpdatedList;
}
int currentSize = getVisibleColsCount();
for (int i = lastVisibleList + 1; i < currentSize; i++) {
JList toRemove = listAtIndex(getVisibleColsCount() - 1);
deleteJList(toRemove);
}
// Sets model to null for visible but unused lists
for (int i = lastUpdatedList + 1; i < getVisibleColsCount(); i++) {
JList list = listAtIndex(i);
list.setModel(EMPTY_MODEL);
}
}
private boolean editStaticValue;
boolean getEditStaticValue() {
return editStaticValue;
}
void setEditStaticValue(boolean aFlag) {
if (!_bindingSelector.areStaticValuesAllowed() || staticBindingPanel == null) {
return;
}
if (editStaticValue != aFlag) {
editStaticValue = aFlag;
if (editStaticValue) {
staticBindingPanel.enableStaticBindingPanel();
for (int i = 0; i < getVisibleColsCount(); i++) {
listAtIndex(i).setEnabled(false);
}
} else {
staticBindingPanel.disableStaticBindingPanel();
// _bindingSelector.setEditedObject(null,false);
for (int i = 0; i < getVisibleColsCount(); i++) {
listAtIndex(i).setEnabled(true);
}
// logger.info("bindable="+getBindable()+" bm="+getBindingModel());
_rootBindingColumnListModel = buildRootColumnListModel();
// if (listAtIndex(0).getModel() instanceof
// EmptyColumnListModel) {
listAtIndex(0).setModel(_bindingSelector.getRootListModel());
// }
}
staticBindingPanel.updateStaticBindingPanel();
}
}
private boolean editTranstypedBinding;
boolean getEditTranstypedBinding() {
return editTranstypedBinding;
}
protected BindingColumnListModel getRootColumnListModel() {
if (_rootBindingColumnListModel == null) {
_rootBindingColumnListModel = buildRootColumnListModel();
}
return _rootBindingColumnListModel;
}
protected BindingColumnListModel buildRootColumnListModel() {
if (_bindingSelector.getBindingModel() != null) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("buildRootColumnListModel() from " + _bindingSelector.getBindingModel());
}
return new RootBindingColumnListModel(_bindingSelector.getBindingModel());
}
if (logger.isLoggable(Level.FINE)) {
logger.fine("buildRootColumnListModel(): EMPTY_MODEL");
}
return EMPTY_MODEL;
}
// public void refreshColumListModel(DMType type){
// _listModels.remove(type);
// getColumnListModel(type);
// }
protected BindingColumnListModel getColumnListModel(BindingPathElement element, Type resultingType) {
if (element == null) {
return EMPTY_MODEL;
}
if (TypeUtils.isResolved(element.getType())) {
Hashtable<Type, BindingColumnListModel> h = _listModels.get(element);
if (h == null) {
h = new Hashtable<Type, BindingColumnListModel>();
_listModels.put(element, h);
}
BindingColumnListModel returned = h.get(resultingType);
if (returned == null) {
returned = makeColumnListModel(element, resultingType);
h.put(resultingType, returned);
}
return returned;
} else {
return EMPTY_MODEL;
}
}
protected BindingColumnListModel makeColumnListModel(BindingPathElement element, Type resultingType) {
return new NormalBindingColumnListModel(element, resultingType);
}
protected class BindingColumnElement {
private BindingPathElement _element;
private Type _resultingType;
protected BindingColumnElement(BindingPathElement element, Type resultingType) {
_element = element;
_resultingType = resultingType;
if (resultingType == null) {
logger.warning("make BindingColumnElement with null type !");
}
}
public BindingPathElement getElement() {
return _element;
}
public Type getResultingType() {
return _resultingType;
}
public String getLabel() {
return getElement().getLabel();
/*
* if (getElement() != null && getElement() instanceof
* BindingVariable) { return
* ((BindingVariable)getElement()).getVariableName(); } else if
* (getElement() != null && getElement() instanceof
* KeyValueProperty) { return ((KeyValueProperty)
* getElement()).getName(); } else if (getElement() != null &&
* getElement() instanceof MethodDefinition) { MethodDefinition
* method = (MethodDefinition) getElement(); return
* method.getSimplifiedSignature(); }
*/
// return "???";
}
public String getTypeStringRepresentation() {
if (getResultingType() == null) {
return FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "no_type");
} else {
return TypeUtils.simpleRepresentation(getResultingType());
}
}
public String getTooltipText() {
return getElement().getTooltipText(getResultingType());
/*
* if (getElement() instanceof BindingVariable) { return
* getTooltipText((BindingVariable)getElement()); } else if
* (getElement() instanceof KeyValueProperty) { return
* getTooltipText
* ((KeyValueProperty)getElement(),getResultingType()); } else if
* (getElement() instanceof MethodDefinition) { return
* getTooltipText
* ((MethodDefinition)getElement(),getResultingType()); } else
* return "???";
*/
}
/*
* private String getTooltipText(BindingVariable bv) { String returned =
* "<html>"; String resultingTypeAsString; if (bv.getType()!=null) {
* resultingTypeAsString = TypeUtils.simpleRepresentation(bv.getType());
* resultingTypeAsString = ToolBox.replaceStringByStringInString("<",
* "<", resultingTypeAsString); resultingTypeAsString =
* ToolBox.replaceStringByStringInString(">", ">",
* resultingTypeAsString); } else { resultingTypeAsString = "???"; }
* returned +=
* "<p><b>"+resultingTypeAsString+" "+bv.getVariableName()+"</b></p>";
* //returned +=
* "<p><i>"+(bv.getDescription()!=null?bv.getDescription():
* FlexoLocalization.localizedForKey("no_description"))+"</i></p>";
* returned += "</html>"; return returned; }
*/
/*
* private String getTooltipText(KeyValueProperty property, Type
* resultingType) { String returned = "<html>"; String
* resultingTypeAsString; if (resultingType!=null) {
* resultingTypeAsString =
* TypeUtils.simpleRepresentation(resultingType); resultingTypeAsString
* = ToolBox.replaceStringByStringInString("<", "<",
* resultingTypeAsString); resultingTypeAsString =
* ToolBox.replaceStringByStringInString(">", ">",
* resultingTypeAsString); } else { resultingTypeAsString = "???"; }
* returned +=
* "<p><b>"+resultingTypeAsString+" "+property.getName()+"</b></p>";
* //returned +=
* "<p><i>"+(property.getDescription()!=null?property.getDescription
* ():FlexoLocalization.localizedForKey("no_description"))+"</i></p>";
* returned += "</html>"; return returned; }
*/
/*
* private String getTooltipText(MethodDefinition method, Type
* resultingType) { String returned = "<html>"; String
* resultingTypeAsString; if (resultingType!=null) {
* resultingTypeAsString =
* TypeUtils.simpleRepresentation(resultingType); resultingTypeAsString
* = ToolBox.replaceStringByStringInString("<", "<",
* resultingTypeAsString); resultingTypeAsString =
* ToolBox.replaceStringByStringInString(">", ">",
* resultingTypeAsString); } else { resultingTypeAsString = "???"; }
* returned +=
* "<p><b>"+resultingTypeAsString+" "+method.getSimplifiedSignature
* ()+"</b></p>"; //returned +=
* "<p><i>"+(method.getDescription()!=null?method
* .getDescription():FlexoLocalization
* .localizedForKey("no_description"))+"</i></p>"; returned +=
* "</html>"; return returned; }
*/
@Override
public String toString() {
return "BindingColumnElement/" + getLabel() + "[" + _element.toString() + "]";
}
@Override
public boolean equals(Object obj) {
if (obj instanceof BindingColumnElement) {
BindingColumnElement bce = (BindingColumnElement) obj;
if (_element == null) {
return false;
}
if (_resultingType == null) {
return false;
}
return _element.equals(bce._element) && _resultingType.equals(bce._resultingType);
} else {
return super.equals(obj);
}
}
}
abstract class BindingColumnListModel extends AbstractListModel {
public void fireModelChanged() {
fireContentsChanged(this, 0, getUnfilteredSize() - 1);
}
public BindingColumnElement getElementFor(BindingPathElement element) {
if (element instanceof MethodCall) {
element = ((MethodCall) element).getMethodDefinition();
}
for (int i = 0; i < getSize(); i++) {
if (getElementAt(i).getElement().equals(element)) {
return getElementAt(i);
}
}
/*logger.info("I cannot find " + element + " of "
+ (element != null ? element.getClass() : null));
for (int i = 0; i < getSize(); i++) {
logger.info("Looking with "
+ getElementAt(i).getElement()
+ " of "
+ (getElementAt(i).getElement() != null ? getElementAt(
i).getElement().getClass() : null));
}*/
return null;
}
public void updateValues() {
}
private String filter = null;
public String getFilter() {
return filter;
}
public void setFilter(String aFilter) {
filter = aFilter;
fireModelChanged();
}
@Override
public int getSize() {
if (getFilter() == null && !_bindingSelector._hideFilteredObjects) {
return getUnfilteredSize();
}
int returned = 0;
if (!_bindingSelector._hideFilteredObjects) {
for (int i = 0; i < getUnfilteredSize(); i++) {
if (getUnfilteredElementAt(i).getLabel().startsWith(filter)) {
returned++;
}
}
} else if (getFilter() == null) {
for (int i = 0; i < getUnfilteredSize(); i++) {
if (!isFiltered(getUnfilteredElementAt(i))) {
returned++;
}
}
} else {
for (int i = 0; i < getUnfilteredSize(); i++) {
if (getUnfilteredElementAt(i).getLabel().startsWith(filter) && !isFiltered(getUnfilteredElementAt(i))) {
returned++;
}
}
}
return returned;
}
@Override
public BindingColumnElement getElementAt(int index) {
if (getFilter() == null && !_bindingSelector._hideFilteredObjects) {
return getUnfilteredElementAt(index);
}
if (!_bindingSelector._hideFilteredObjects) {
int searchedIndex = -1;
for (int i = 0; i < getUnfilteredSize(); i++) {
if (getUnfilteredElementAt(i).getLabel().startsWith(filter)) {
searchedIndex++;
}
if (searchedIndex == index) {
return getUnfilteredElementAt(i);
}
}
} else if (getFilter() == null) {
int searchedIndex = -1;
for (int i = 0; i < getUnfilteredSize(); i++) {
if (!isFiltered(getUnfilteredElementAt(i))) {
searchedIndex++;
}
if (searchedIndex == index) {
return getUnfilteredElementAt(i);
}
}
} else {
int searchedIndex = -1;
for (int i = 0; i < getUnfilteredSize(); i++) {
if (getUnfilteredElementAt(i).getLabel().startsWith(filter) && !isFiltered(getUnfilteredElementAt(i))) {
searchedIndex++;
}
if (searchedIndex == index) {
return getUnfilteredElementAt(i);
}
}
}
return null;
}
private boolean isFiltered(BindingColumnElement columnElement) {
// Class resultingTypeBaseClass =
// TypeUtils.getBaseClass(columnElement.getResultingType());
Type resultingType = columnElement.getResultingType();
if (columnElement.getElement() != null && columnElement.getElement() instanceof BindingVariableImpl) {
BindingVariableImpl bv = (BindingVariableImpl) columnElement.getElement();
if (bv.getType() == null) {
return true;
}
} else if (columnElement.getElement() != null) {
AbstractBinding binding = BindingSelectorPanel.this._bindingSelector.getEditedObject();
if (binding != null && binding instanceof BindingValue) {
BindingValue bindingValue = (BindingValue) binding;
if (bindingValue.isConnected()
&& bindingValue.isLastBindingPathElement(columnElement.getElement(), getIndexOfList(this) - 1)) {
// setIcon(label, CONNECTED_ICON, list);
} else if (columnElement.getResultingType() != null) {
if (TypeUtils.isResolved(columnElement.getResultingType()) && _bindingSelector.getBindable() != null) {
// if (columnElement.getElement().getAccessibleBindingPathElements().size() > 0) {
if (_bindingSelector.getBindable().getBindingFactory()
.getAccessibleBindingPathElements(columnElement.getElement()).size() > 0) {
} else {
if (_bindingSelector.getBindingDefinition() != null
&& _bindingSelector.getBindingDefinition().getType() != null
&& !TypeUtils.isTypeAssignableFrom(BindingSelectorPanel.this._bindingSelector
.getBindingDefinition().getType(), columnElement.getResultingType(), true)) {
return true;
}
if (_bindingSelector.getBindingDefinition() != null
&& _bindingSelector.getBindingDefinition().getIsSettable()
&& !columnElement.getElement().isSettable()) {
return true;
}
}
}
}
}
}/*
* else if (columnElement.getElement() != null &&
* columnElement.getElement() instanceof KeyValueProperty) {
* KeyValueProperty property = (KeyValueProperty)
* columnElement.getElement(); AbstractBinding binding =
* BindingSelectorPanel.this._bindingSelector.getEditedObject(); if
* ((binding != null) && binding instanceof BindingValue) {
* BindingValue bindingValue = (BindingValue)binding; if
* (bindingValue.isConnected() &&
* (bindingValue.isLastBindingPathElement(property,
* getIndexOfList(this) - 1))) { //setIcon(label, CONNECTED_ICON,
* list); } else if (columnElement.getResultingType() != null) { if
* (TypeUtils.isResolved(columnElement.getResultingType()) &&
* _bindingSelector.getBindable() != null) { if
* (_bindingSelector.getBindable
* ().getBindingFactory().getAccessibleBindingPathElements
* (columnElement.getElement()).size() > 0) { //if
* (KeyValueLibrary.getAccessibleProperties(resultingType).size() >
* 0) { //setIcon(label, ARROW_RIGHT_ICON, list); } else { if
* ((_bindingSelector.getBindingDefinition() != null) &&
* (_bindingSelector.getBindingDefinition().getType() != null) &&
* (!TypeUtils
* .isTypeAssignableFrom(BindingSelectorPanel.this._bindingSelector
* .getBindingDefinition
* ().getType(),columnElement.getResultingType(),true))) { return
* true; } if ((_bindingSelector.getBindingDefinition() != null) &&
* (_bindingSelector.getBindingDefinition().getIsSettable()) &&
* !property.isSettable()) { return true; } } } } } } else if
* (columnElement.getElement() != null && columnElement.getElement()
* instanceof MethodDefinition) { MethodDefinition method =
* (MethodDefinition) columnElement.getElement();
*
* String methodAsString = method.getSimplifiedSignature(); int idx
* = getIndexOfList(this); if (idx > 0 &&
* _lists.elementAt(idx-1).getSelectedValue()!=null) { Type context
* =
* ((BindingColumnElement)_lists.elementAt(idx-1).getSelectedValue(
* )).getResultingType(); methodAsString =
* method.getSimplifiedSignature();
* //method.getSimplifiedSignatureInContext(context); }
*
* AbstractBinding binding = _bindingSelector.getEditedObject(); if
* (binding instanceof BindingValue) { BindingValue bindingValue =
* (BindingValue)binding; BindingPathElement bpe =
* bindingValue.getBindingPathElementAtIndex(getIndexOfList(this) -
* 1); if ((bindingValue.isConnected()) &&
* (bindingValue.isLastBindingPathElement(bpe, getIndexOfList(this)
* - 1)) && ((bpe instanceof MethodCall) &&
* (((MethodCall)bpe).getMethod().equals(method.getMethod())))) { }
* else if (columnElement.getResultingType() != null &&
* resultingType != null && _bindingSelector.getBindable() != null)
* { if(_bindingSelector.getBindable().getBindingFactory().
* getAccessibleBindingPathElements
* (columnElement.getElement()).size() +
* _bindingSelector.getBindable
* ().getBindingFactory().getAccessibleCompoundBindingPathElements
* (columnElement.getElement()).size() > 0) { //if
* (KeyValueLibrary.getAccessibleProperties(resultingType).size() //
* + KeyValueLibrary.getAccessibleMethods(resultingType).size() > 0)
* { } else { if ((_bindingSelector.getBindingDefinition() != null)
* && (_bindingSelector.getBindingDefinition().getType() != null &&
* TypeUtils
* .getBaseClass(_bindingSelector.getBindingDefinition().getType
* ())!=null) &&
* (!TypeUtils.isClassAncestorOf(TypeUtils.getBaseClass
* (_bindingSelector
* .getBindingDefinition().getType()),TypeUtils.getBaseClass
* (resultingType)))) { return true; } } } } }
*/
return false;
}
public abstract int getUnfilteredSize();
public abstract BindingColumnElement getUnfilteredElementAt(int index);
}
private class NormalBindingColumnListModel extends BindingColumnListModel implements Observer {
private Type _type;
private BindingPathElement _element;
private Vector<BindingPathElement> _accessibleProperties;
private Vector<BindingPathElement> _accessibleMethods;
private Vector<BindingColumnElement> _elements;
NormalBindingColumnListModel(BindingPathElement element, Type resultingType) {
super();
_element = element;
_type = resultingType;
if (logger.isLoggable(Level.FINE)) {
logger.fine("Build NormalBindingColumnListModel for " + element + " base class=" + TypeUtils.getBaseClass(_type));
}
_accessibleProperties = new Vector<BindingPathElement>();
_accessibleMethods = new Vector<BindingPathElement>();
_elements = new Vector<BindingColumnElement>();
/*
* if(_type.getBaseEntity()!=null)
* _type.getBaseEntity().addObserver(this);
*/
updateValues();
}
@Override
public void updateValues() {
_accessibleProperties.clear();
_accessibleMethods.clear();
if (_bindingSelector.getBindable() == null) {
return;
}
for (BindingColumnElement bce : _elements) {
if (bce.getElement() instanceof Observable) {
((Observable) bce.getElement()).deleteObserver(this);
}
}
_elements.clear();
if (TypeUtils.getBaseClass(_type) == null) {
return;
}
// _accessibleProperties.addAll(KeyValueLibrary.getAccessibleProperties(_type));
_accessibleProperties.addAll(_bindingSelector.getBindable().getBindingFactory().getAccessibleBindingPathElements(_element));
// _accessibleProperties.addAll(_element.getAccessibleBindingPathElements());
if (BindingSelectorPanel.this._bindingSelector.editionMode == EditionMode.COMPOUND_BINDING) {
// _accessibleMethods.addAll(KeyValueLibrary.getAccessibleMethods(_type));
_accessibleProperties.addAll(_bindingSelector.getBindable().getBindingFactory()
.getAccessibleCompoundBindingPathElements(_element));
// _accessibleProperties.addAll(_element.getAccessibleCompoundBindingPathElements());
}
for (BindingPathElement p : _accessibleProperties) {
_elements.add(new BindingColumnElement(p, TypeUtils.makeInstantiatedType(p.getType(), _type)));
}
for (BindingPathElement m : _accessibleMethods) {
_elements.add(new BindingColumnElement(m, TypeUtils.makeInstantiatedType(m.getType(), _type)));
}
for (BindingColumnElement bce : _elements) {
if (bce.getElement() instanceof Observable) {
((Observable) bce.getElement()).addObserver(this);
}
}
}
@Override
public int getUnfilteredSize() {
return _elements.size();
}
@Override
public BindingColumnElement getUnfilteredElementAt(int index) {
if (index < _elements.size() && index >= 0) {
return _elements.elementAt(index);
}
return null;
}
@Override
public void update(Observable observable, Object dataModification) {
/*
* if(((dataModification instanceof PropertyRegistered ||
* dataModification instanceof PropertyUnregistered ||
* dataModification instanceof PropertiesReordered) ||
* (dataModification instanceof DMAttributeDataModification &&
* dataModification.propertyName().equals("parentType")) ||
* (dataModification instanceof DMAttributeDataModification &&
* dataModification.propertyName().equals("isClassProperty"))
*
* ) && observable.equals(_type.getBaseEntity())){ updateValues();
* fireModelChanged(); } if ((dataModification instanceof
* DMAttributeDataModification &&
* (dataModification.propertyName().equals
* ("returnType")||dataModification.propertyName().equals("type"))))
* { updateValues(); fireModelChanged(); if
* (BindingSelectorPanel.this._bindingSelector._selectorPanel!=null)
* BindingSelectorPanel
* .this._bindingSelector._selectorPanel.update(); } if
* (dataModification instanceof ObjectDeleted)
* observable.deleteObserver(this);
*/
}
}
class EmptyColumnListModel extends BindingColumnListModel {
@Override
public int getUnfilteredSize() {
return 0;
}
@Override
public BindingColumnElement getUnfilteredElementAt(int index) {
return null;
}
}
private class RootBindingColumnListModel extends BindingColumnListModel {
private BindingModel _myBindingModel;
private Vector<BindingColumnElement> _elements;
RootBindingColumnListModel(BindingModel bindingModel) {
super();
_myBindingModel = bindingModel;
_elements = new Vector<BindingColumnElement>();
updateValues();
}
@Override
public void updateValues() {
if (logger.isLoggable(Level.FINE)) {
logger.fine("BindingModel is: " + _myBindingModel + " with " + _myBindingModel.getBindingVariablesCount());
}
_elements.clear();
for (int i = 0; i < _myBindingModel.getBindingVariablesCount(); i++) {
_elements.add(new BindingColumnElement(_myBindingModel.getBindingVariableAt(i), _myBindingModel.getBindingVariableAt(i)
.getType()));
}
}
@Override
public int getUnfilteredSize() {
return _elements.size();
}
@Override
public BindingColumnElement getUnfilteredElementAt(int index) {
return _elements.elementAt(index);
}
@Override
public String toString() {
return "RootBindingColumnListModel with " + getSize() + " elements";
}
}
protected class TypeResolver extends MouseAdapter implements MouseMotionListener {
private JList list;
protected TypeResolver(JList aList) {
currentFocused = null;
list = aList;
}
@Override
public void mouseMoved(MouseEvent e) {
displayLabel(e);
}
@Override
public void mouseClicked(MouseEvent e) {
displayLabel(e);
}
private void displayLabel(MouseEvent e) {
// Get item index
int index = list.locationToIndex(e.getPoint());
// Get item
if (index < 0 || index >= list.getModel().getSize()) {
return;
}
BindingColumnElement item = ((BindingColumnListModel) list.getModel()).getElementAt(index);
if (item != currentFocused) {
currentFocused = item;
currentTypeLabel.setText(currentFocused.getTypeStringRepresentation());
}
}
}
protected class BindingSelectorCellRenderer extends DefaultListCellRenderer {
private JPanel panel;
private JLabel iconLabel;
public BindingSelectorCellRenderer() {
panel = new JPanel(new BorderLayout());
iconLabel = new JLabel();
panel.add(iconLabel, BorderLayout.EAST);
panel.add(this);
}
@Override
public Component getListCellRendererComponent(JList list, Object bce, int index, boolean isSelected, boolean cellHasFocus) {
JComponent returned = (JComponent) super.getListCellRendererComponent(list, bce, index, isSelected, cellHasFocus);
if (returned instanceof JLabel) {
JLabel label = (JLabel) returned;
label.setToolTipText(null);
iconLabel.setVisible(false);
if (bce instanceof BindingColumnElement) {
BindingColumnElement columnElement = (BindingColumnElement) bce;
// Class resultingTypeBaseClass =
// TypeUtils.getBaseClass(columnElement.getResultingType());
Type resultingType = columnElement.getResultingType();
label.setText(columnElement.getLabel());
if (!(columnElement.getElement() instanceof FinalBindingPathElement)) {
returned = getIconLabelComponent(label, FIBIconLibrary.ARROW_RIGHT_ICON);
}
if (columnElement.getElement().getType() != null) {
returned.setToolTipText(columnElement.getTooltipText());
} else {
label.setForeground(Color.GRAY);
}
AbstractBinding binding = BindingSelectorPanel.this._bindingSelector.getEditedObject();
if (binding != null && binding instanceof BindingValue) {
BindingValue bindingValue = (BindingValue) binding;
if (bindingValue.isConnected()
&& bindingValue.isLastBindingPathElement(columnElement.getElement(), _lists.indexOf(list) - 1)) {
returned = getIconLabelComponent(label, FIBIconLibrary.CONNECTED_ICON);
} else if (columnElement.getResultingType() != null) {
if (TypeUtils.isResolved(columnElement.getResultingType()) && _bindingSelector.getBindable() != null) {
// if (columnElement.getElement().getAccessibleBindingPathElements().size() > 0) {
if (_bindingSelector.getBindable().getBindingFactory()
.getAccessibleBindingPathElements(columnElement.getElement()) != null
&& _bindingSelector.getBindable().getBindingFactory()
.getAccessibleBindingPathElements(columnElement.getElement()).size() > 0) {
returned = getIconLabelComponent(label, FIBIconLibrary.ARROW_RIGHT_ICON);
} else {
if (_bindingSelector.getBindingDefinition() != null
&& _bindingSelector.getBindingDefinition().getType() != null
&& !TypeUtils.isTypeAssignableFrom(_bindingSelector.getBindingDefinition().getType(),
columnElement.getResultingType(), true)) {
label.setForeground(Color.GRAY);
}
if (_bindingSelector.getBindingDefinition() != null
&& _bindingSelector.getBindingDefinition().getIsSettable()
&& !columnElement.getElement().isSettable()) {
label.setForeground(Color.GRAY);
}
}
}
}
}
// TODO: supprimer la dependance a KeyValueProperty:
// utiliser seulement l'interface BindingPathElement
/*
* if (columnElement.getElement() != null &&
* columnElement.getElement() instanceof BindingVariable) {
* BindingVariable bv =
* (BindingVariable)columnElement.getElement();
* label.setText(columnElement.getLabel()); setIcon(label,
* BindingSelector.ARROW_RIGHT_ICON, list); if (bv.getType()
* != null) {
* label.setToolTipText(columnElement.getTooltipText()); }
* else { label.setForeground(Color.GRAY); } } else if
* (columnElement.getElement() != null &&
* columnElement.getElement() instanceof KeyValueProperty) {
* KeyValueProperty property = (KeyValueProperty)
* columnElement.getElement();
* label.setText(columnElement.getLabel()); AbstractBinding
* binding =
* BindingSelectorPanel.this._bindingSelector.getEditedObject
* (); if ((binding != null) && binding instanceof
* BindingValue) { BindingValue bindingValue =
* (BindingValue)binding; if (bindingValue.isConnected() &&
* (bindingValue.isLastBindingPathElement(property,
* _lists.indexOf(list) - 1))) { setIcon(label,
* BindingSelector.CONNECTED_ICON, list); } else if
* (columnElement.getResultingType() != null) { if
* (TypeUtils.isResolved(columnElement.getResultingType())
* && _bindingSelector.getBindable() != null) { if
* (_bindingSelector.getBindable().getBindingFactory().
* getAccessibleBindingPathElements
* (columnElement.getElement()).size() > 0) { setIcon(label,
* BindingSelector.ARROW_RIGHT_ICON, list); } else { if
* ((_bindingSelector.getBindingDefinition() != null) &&
* (_bindingSelector.getBindingDefinition().getType() !=
* null) &&
* (!TypeUtils.isTypeAssignableFrom(_bindingSelector
* .getBindingDefinition
* ().getType(),columnElement.getResultingType(),true))) {
* label.setForeground(Color.GRAY); } if
* ((_bindingSelector.getBindingDefinition() != null) &&
* (_bindingSelector.getBindingDefinition().getIsSettable())
* && !property.isSettable()) {
* label.setForeground(Color.GRAY); } } } } } if (property
* != null) {
* label.setToolTipText(columnElement.getTooltipText()); }
*
* } else if (columnElement.getElement() != null &&
* columnElement.getElement() instanceof MethodDefinition) {
* MethodDefinition method = (MethodDefinition)
* columnElement.getElement();
*
* String methodAsString = method.getSimplifiedSignature();
* int idx = _lists.indexOf(list); if (idx > 0) { Type
* context =((BindingColumnElement)_lists.elementAt(idx-1).
* getSelectedValue()).getResultingType(); methodAsString =
* method.getSimplifiedSignature();
* //method.getSimplifiedSignatureInContext(context);
* //methodAsString =
* method.getSimplifiedSignatureInContext(context); }
*
* label.setText(methodAsString); AbstractBinding binding =
* BindingSelectorPanel
* .this._bindingSelector.getEditedObject(); if ((binding !=
* null) && binding instanceof BindingValue) { BindingValue
* bindingValue = (BindingValue)binding; BindingPathElement
* bpe =
* bindingValue.getBindingPathElementAtIndex(_lists.indexOf
* (list) - 1); if ((bindingValue.isConnected()) &&
* (bindingValue.isLastBindingPathElement(bpe,
* _lists.indexOf(list) - 1)) && ((bpe instanceof
* MethodCall) &&
* (((MethodCall)bpe).getMethod().equals(method
* .getMethod())))) { setIcon(label,
* BindingSelector.CONNECTED_ICON, list); } else if
* (columnElement.getResultingType() != null &&
* resultingType != null) { if
* (_bindingSelector.getBindable(
* ).getBindingFactory().getAccessibleBindingPathElements
* (columnElement.getElement()).size() +
* _bindingSelector.getBindable().getBindingFactory().
* getAccessibleCompoundBindingPathElements
* (columnElement.getElement()).size() > 0) { setIcon(label,
* BindingSelector.ARROW_RIGHT_ICON, list); } else { if
* ((_bindingSelector.getBindingDefinition() != null) &&
* (_bindingSelector.getBindingDefinition().getType() !=
* null) &&
* (!TypeUtils.isTypeAssignableFrom(_bindingSelector
* .getBindingDefinition
* ().getType(),columnElement.getResultingType(),true))) {
* label.setForeground(Color.GRAY); } } } } if
* (method.getType() != null) {
* label.setToolTipText(columnElement.getTooltipText()); } }
*/
} else {
// Happen because of prototype value !
// logger.warning("Unexpected type: "+bce+" of "+(bce!=null?bce.getClass():"null"));
}
}
return returned;
}
private JComponent getIconLabelComponent(JLabel label, Icon icon) {
iconLabel.setVisible(true);
iconLabel.setIcon(icon);
iconLabel.setOpaque(label.isOpaque());
iconLabel.setBackground(label.getBackground());
panel.setToolTipText(label.getToolTipText());
if (label.getParent() != panel) {
panel.add(label);
}
return panel;
}
}
protected JPanel getControlPanel() {
return _controlPanel;
}
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
AbstractBinding bindingValue = _bindingSelector.getEditedObject();
if (bindingValue == null) {
if (_bindingSelector.getBindingDefinition() != null && _bindingSelector.getBindable() != null) {
bindingValue = _bindingSelector.makeBinding();
// bindingValue.setBindingVariable(getSelectedBindingVariable());
// setEditedObject(bindingValue);
// fireEditedObjectChanged();
} else {
return;
}
}
JList list = (JList) e.getSource();
int index = _lists.indexOf(list);
_selectedPathElementIndex = index;
if (index < 0) {
return;
}
int newSelectedIndex = list.getSelectedIndex();
if (logger.isLoggable(Level.FINE)) {
logger.fine("I select something from list at index " + index + " selected=" + newSelectedIndex);
}
if (newSelectedIndex < 0) {
return;
// if (index == 0 && !(list.getSelectedValue() instanceof
// BindingVariable)) index = index+1;
/*
* if (index == 0 && (list.getSelectedValue() instanceof
* BindingVariable)) { if (list.getSelectedValue() !=
* bindingValue.getBindingVariable()) {
* bindingValue.setBindingVariable((BindingVariable)
* list.getSelectedValue()); setEditedObject(bindingValue);
* fireEditedObjectChanged(); } } else { DMObject selectedValue =
* (DMObject)list.getSelectedValue(); if (selectedValue instanceof
* DMProperty) { if (selectedValue !=
* bindingValue.getBindingPathElementAtIndex(index - 1)) {
* bindingValue.setBindingPathElementAtIndex((DMProperty)selectedValue,
* index - 1); setEditedObject(bindingValue); fireEditedObjectChanged();
* } } else if ((selectedValue instanceof DMMethod) &&
* (_allowsCompoundBindings)) { BindingPathElement currentElement =
* bindingValue.getBindingPathElementAtIndex(index - 1); if
* (!(currentElement instanceof MethodCall) ||
* (((MethodCall)currentElement).getMethod() != selectedValue)) {
* DMMethod method = (DMMethod)selectedValue; MethodCall newMethodCall =
* new MethodCall(bindingValue,method);
* bindingValue.setBindingPathElementAtIndex(newMethodCall, index - 1);
* setEditedObject(bindingValue); fireEditedObjectChanged(); } } }
*/
}
// This call will perform BV edition
_bindingSelector.valueSelected(index, list, bindingValue);
list.removeListSelectionListener(this);
list.setSelectedIndex(newSelectedIndex);
list.addListSelectionListener(this);
}
private boolean hasBindingPathForm(String textValue) {
if (textValue.length() == 0) {
return false;
}
boolean startingPathItem = true;
for (int i = 0; i < textValue.length(); i++) {
char c = textValue.charAt(i);
if (c == '.') {
startingPathItem = true;
} else {
boolean isNormalChar = c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' || c >= '0' && c <= '9' && !startingPathItem;
if (!isNormalChar) {
return false;
}
startingPathItem = false;
}
}
return true;
}
@Override
protected void synchronizePanelWithTextFieldValue(String textValue) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Request synchronizePanelWithTextFieldValue " + textValue);
}
try {
_bindingSelector.isUpdatingModel = true;
if (!_bindingSelector.popupIsShown() && textValue != null
&& !_bindingSelector.isAcceptableAsBeginningOfStaticBindingValue(textValue)) {
boolean requestFocus = _bindingSelector.getTextField().hasFocus();
_bindingSelector.openPopup();
if (requestFocus) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
BindingSelectorPanel.this._bindingSelector.getTextField().requestFocusInWindow();
}
});
}
}
if (_bindingSelector.getTextField().hasFocus()) {
if (_bindingSelector.getEditedObject() != null && _bindingSelector.getEditedObject() instanceof BindingValue) {
((BindingValue) _bindingSelector.getEditedObject()).disconnect();
}
if (_bindingSelector._selectorPanel != null) {
filterWithCurrentInput(textValue);
}
}
if (textValue == null || !textValue.equals(_bindingSelector.renderedString(_bindingSelector.getEditedObject()))) {
_bindingSelector.getTextField().setForeground(Color.RED);
} else {
_bindingSelector.getTextField().setForeground(Color.BLACK);
}
} finally {
_bindingSelector.isUpdatingModel = false;
}
}
private void filterWithCurrentInput(String textValue) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Try to filter for current input " + textValue);
}
if (!hasBindingPathForm(textValue)) {
return;
}
StringTokenizer tokenizer = new StringTokenizer(textValue, ".", false);
boolean isCurrentlyValid = true;
int listIndex = 0;
String element = null;
while (isCurrentlyValid && tokenizer.hasMoreTokens()) {
element = tokenizer.nextToken();
BindingColumnElement col_element = findElementEquals(_lists.get(listIndex).getModel(), element);
if (col_element == null) {
isCurrentlyValid = false;
} else {
_bindingSelector.setUpdatingModel(true);
if (!ensureBindingValueExists()) {
_bindingSelector.setUpdatingModel(false);
return;
}
/*
* if (listIndex == 0) {
* logger.info("Je selectionne "+col_element
* +" pour la premiere colonne"); boolean found = false; for
* (int i=0; i<_lists.get(listIndex).getModel().getSize(); i++)
* { Object o =
* _lists.get(listIndex).getModel().getElementAt(i); if
* (o.equals(col_element)) { found = true;
* logger.info("OK, je l'ai trouve"); } else {
* logger.info("Pas pareil: "+o); } } if (!found)
* logger.info("Je le trouve pas"); }
*/
_lists.get(listIndex).removeListSelectionListener(this);
_lists.get(listIndex).setFilter(null);
_lists.get(listIndex).setSelectedValue(col_element, true);
_lists.get(listIndex).addListSelectionListener(this);
_bindingSelector.valueSelected(listIndex, _lists.get(listIndex), _bindingSelector.getEditedObject());
_bindingSelector.setUpdatingModel(false);
listIndex++;
}
}
if (!isCurrentlyValid) {
_lists.get(listIndex).setFilter(element);
completionInfo = new CompletionInfo(_lists.get(listIndex), element, textValue);
if (completionInfo.matchingElements.size() > 0) {
BindingColumnElement col_element = completionInfo.matchingElements.firstElement();
_lists.get(listIndex).removeListSelectionListener(this);
_lists.get(listIndex).setSelectedValue(col_element, true);
_lists.get(listIndex).addListSelectionListener(this);
}
}
cleanLists(listIndex);
}
private CompletionInfo completionInfo;
protected class CompletionInfo {
String validPath = null;
String completionInitPath = null;
String commonBeginningPath = null;
Vector<BindingColumnElement> matchingElements = null;
protected CompletionInfo(FilteredJList list, String subPartialPath, String fullPath) {
validPath = fullPath.substring(0, fullPath.lastIndexOf(".") + 1);
completionInitPath = subPartialPath;
matchingElements = findElementsMatching(list.getModel(), subPartialPath);
if (matchingElements.size() == 1) {
commonBeginningPath = matchingElements.firstElement().getLabel();
} else if (matchingElements.size() > 1) {
int endCommonPathIndex = 0;
boolean foundDiff = false;
while (!foundDiff) {
if (endCommonPathIndex < matchingElements.firstElement().getLabel().length()) {
char c = matchingElements.firstElement().getLabel().charAt(endCommonPathIndex);
for (int i = 1; i < matchingElements.size(); i++) {
String label = matchingElements.elementAt(i).getLabel();
if (endCommonPathIndex < label.length() && label.charAt(endCommonPathIndex) != c) {
foundDiff = true;
}
}
if (!foundDiff) {
endCommonPathIndex++;
}
} else {
foundDiff = true;
}
}
commonBeginningPath = matchingElements.firstElement().getLabel().substring(0, endCommonPathIndex);
}
}
@Override
public String toString() {
return "CompletionInfo, completionInitPath=" + completionInitPath + " validPath=" + validPath + " commonBeginningPath="
+ commonBeginningPath + " matchingElements=" + matchingElements;
}
private boolean alreadyAutocompleted = false;
protected void autoComplete() {
if (!alreadyAutocompleted) {
BindingSelectorPanel.this._bindingSelector.getTextField().setText(validPath + commonBeginningPath);
} else {
BindingSelectorPanel.this._bindingSelector.getTextField().setText(validPath + commonBeginningPath + ".");
}
alreadyAutocompleted = true;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
BindingSelectorPanel.this._bindingSelector.getTextField().requestFocusInWindow();
}
});
}
}
@Override
protected void processEnterPressed() {
logger.fine("Pressed on ENTER");
int index = 0;
if (_bindingSelector.getEditedObject() != null) {
index = StringUtils.countMatches(_bindingSelector.getTextField().getText(), ".");
}
FilteredJList list = listAtIndex(index);
if (list != null) {
int currentSelected = list.getSelectedIndex();
if (currentSelected > -1) {
valueChanged(new ListSelectionEvent(list, currentSelected, currentSelected, false));
// list.setSelectedIndex(currentSelected);
update();
completionInfo = null;
}
}
if (_bindingSelector.getEditedObject() != null && _bindingSelector.getEditedObject().isBindingValid()) {
_bindingSelector.apply();
}
}
@Override
protected void processDelete() {
logger.fine("Pressed on DELETE");
suppressSelection();
}
@Override
protected void processBackspace() {
logger.fine("Pressed on BACKSPACE");
if (!suppressSelection()) {
if (_bindingSelector.getTextField().getText().length() > 0) {
_bindingSelector.getTextField().setText(
_bindingSelector.getTextField().getText().substring(0, _bindingSelector.getTextField().getText().length() - 1));
}
}
}
private boolean suppressSelection() {
if (_bindingSelector.getTextField().getText().length() > 0) {
if (_bindingSelector.getTextField().getSelectedText() != null && _bindingSelector.getTextField().getSelectedText().length() > 0) {
int begin = _bindingSelector.getTextField().getSelectionStart();
int end = _bindingSelector.getTextField().getSelectionEnd();
_bindingSelector.getTextField().setText(
_bindingSelector.getTextField().getText().substring(0, begin)
+ _bindingSelector.getTextField().getText()
.substring(end, _bindingSelector.getTextField().getText().length()));
return true;
}
}
return false;
}
@Override
protected void processTabPressed() {
logger.fine("Pressed on TAB, completionInfo=" + completionInfo);
if (completionInfo != null) {
completionInfo.autoComplete();
}
}
@Override
protected void processUpPressed() {
logger.fine("Pressed on UP");
int index = 0;
if (_bindingSelector.getEditedObject() != null) {
index = StringUtils.countMatches(_bindingSelector.getTextField().getText(), ".");
}
FilteredJList list = listAtIndex(index);
int currentSelected = list.getSelectedIndex();
if (currentSelected > 0) {
list.removeListSelectionListener(this);
list.setSelectedIndex(currentSelected - 1);
list.addListSelectionListener(this);
}
}
@Override
protected void processDownPressed() {
logger.fine("Pressed on DOWN");
if (!_bindingSelector.popupIsShown()) {
_bindingSelector.openPopup();
}
int index = 0;
if (_bindingSelector.getEditedObject() != null) {
index = StringUtils.countMatches(_bindingSelector.getTextField().getText(), ".");
}
FilteredJList list = listAtIndex(index);
int currentSelected = list.getSelectedIndex();
list.removeListSelectionListener(this);
list.setSelectedIndex(currentSelected + 1);
list.addListSelectionListener(this);
}
@Override
protected void processLeftPressed() {
logger.fine("Pressed on LEFT");
}
@Override
protected void processRightPressed() {
logger.fine("Pressed on RIGHT");
if (!_bindingSelector.popupIsShown()) {
_bindingSelector.openPopup();
}
int index = 0;
if (_bindingSelector.getEditedObject() != null) {
index = StringUtils.countMatches(_bindingSelector.getTextField().getText(), ".");
}
FilteredJList list = listAtIndex(index);
int currentSelected = list.getSelectedIndex();
if (currentSelected > -1 && list.isFiltered()) {
valueChanged(new ListSelectionEvent(list, currentSelected, currentSelected, false));
update();
completionInfo = null;
} else if (completionInfo != null) {
completionInfo.autoComplete();
} else {
list.requestFocusInWindow();
}
}
boolean isKeyPathFromTextASubKeyPath(String inputText) {
int dotCount = StringUtils.countMatches(inputText, ".");
if (listAtIndex(dotCount) == null) {
return false;
}
BindingColumnListModel listModel = listAtIndex(dotCount).getModel();
String subPartialPath = inputText.substring(inputText.lastIndexOf(".") + 1);
Vector<Integer> pathElementIndex = new Vector<Integer>();
;
BindingColumnElement pathElement = findElementMatching(listModel, subPartialPath, pathElementIndex);
return pathElement != null;
}
boolean isKeyPathFromPanelValid() {
if (_bindingSelector.getEditedObject() == null) {
return false;
}
int i = 0;
while (listAtIndex(i) != null && listAtIndex(i).getSelectedValue() != null) {
i++;
}
if (listAtIndex(i - 1).getSelectedValue() instanceof BindingColumnElement) {
if (_bindingSelector.getBindingDefinition().getType() == null
|| TypeUtils.isTypeAssignableFrom(_bindingSelector.getBindingDefinition().getType(),
((BindingColumnElement) listAtIndex(i - 1).getSelectedValue()).getResultingType(), true)) {
return true;
}
}
return false;
}
BindingValue makeBindingValueFromPanel() {
if (_bindingSelector.getEditedObject() == null || !(_bindingSelector.getEditedObject() instanceof BindingValue)) {
return null;
}
int i = 1;
BindingColumnElement last = null;
while (listAtIndex(i) != null && listAtIndex(i).getSelectedValue() != null) {
last = (BindingColumnElement) listAtIndex(i).getSelectedValue();
((BindingValue) _bindingSelector.getEditedObject()).setBindingPathElementAtIndex(last.getElement(), i - 1);
i++;
}
if (last != null) {
((BindingValue) _bindingSelector.getEditedObject()).removeBindingPathElementAfter(last.getElement());
}
return (BindingValue) _bindingSelector.getEditedObject();
}
}