/**
* DataCleaner (community edition)
* Copyright (C) 2014 Neopost - Customer Information Management
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.datacleaner.widgets.visualization;
import static javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeListener;
import java.util.Set;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.KeyStroke;
import org.apache.metamodel.schema.Column;
import org.apache.metamodel.schema.Table;
import org.datacleaner.actions.DefaultRenameComponentActionListener;
import org.datacleaner.job.builder.AnalysisJobBuilder;
import org.datacleaner.job.builder.AnalyzerComponentBuilder;
import org.datacleaner.job.builder.ComponentBuilder;
import org.datacleaner.job.builder.FilterComponentBuilder;
import org.datacleaner.job.builder.TransformerComponentBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Key-bindings manager for the {@link JobGraph}.
*/
public class JobGraphBindingsManager {
private abstract static class JobGraphBindingAction implements Action {
private boolean _enabled = true;
@Override
public Object getValue(final String key) {
return null;
}
@Override
public void putValue(final String key, final Object value) {
}
@Override
public boolean isEnabled() {
return _enabled;
}
@Override
public void setEnabled(final boolean enabled) {
_enabled = enabled;
}
@Override
public void addPropertyChangeListener(final PropertyChangeListener listener) {
}
@Override
public void removePropertyChangeListener(final PropertyChangeListener listener) {
}
}
private static final Logger logger = LoggerFactory.getLogger(JobGraphBindingsManager.class);
private static final int INPUT_MAP_CONDITION = WHEN_IN_FOCUSED_WINDOW;
private static final String KEY_DELETE = "DELETE";
private static final String KEY_BACKSPACE = "BACK_SPACE";
private static final String KEY_F2 = "F2";
private static final String KEY_F5 = "F5";
private static final String KEY_ENTER = "ENTER";
private final JobGraphContext _graphContext;
private final JobGraphActions _actions;
private final JComponent _component;
public JobGraphBindingsManager(final JobGraphContext graphContext, final JobGraphActions actions,
final JComponent component) {
_graphContext = graphContext;
_actions = actions;
_component = component;
}
public void register() {
registerDeleteAction();
registerRenameAction();
registerRefreshAction();
registerEnterConfigurationAction();
}
private void registerRefreshAction() {
registerAction(KEY_F5, KeyStroke.getKeyStroke(KEY_F5), new JobGraphBindingAction() {
@Override
public void actionPerformed(final ActionEvent e) {
_graphContext.getJobGraph().refresh();
}
});
}
private void registerEnterConfigurationAction() {
registerAction(KEY_ENTER, KeyStroke.getKeyStroke(KEY_ENTER), new JobGraphBindingAction() {
@Override
public void actionPerformed(final ActionEvent e) {
final Set<Object> vertices = _graphContext.getSelectedVertices();
if (vertices.size() != 1) {
return;
}
final Object vertex = vertices.iterator().next();
if (vertex instanceof ComponentBuilder) {
final ComponentBuilder componentBuilder = (ComponentBuilder) vertex;
_actions.showConfigurationDialog(componentBuilder);
} else if (vertex instanceof Table) {
final Table table = (Table) vertex;
_actions.showTableConfigurationDialog(table);
}
}
});
}
private void registerRenameAction() {
registerAction(KEY_F2, KeyStroke.getKeyStroke(KEY_F2), new JobGraphBindingAction() {
@Override
public void actionPerformed(final ActionEvent e) {
final Set<Object> vertices = _graphContext.getSelectedVertices();
if (vertices.size() != 1) {
return;
}
final Object vertex = vertices.iterator().next();
if (vertex instanceof ComponentBuilder) {
final ComponentBuilder componentBuilder = (ComponentBuilder) vertex;
final DefaultRenameComponentActionListener actionListener =
new DefaultRenameComponentActionListener(componentBuilder, _graphContext);
actionListener.actionPerformed();
}
}
});
}
private void registerDeleteAction() {
registerAction(KEY_DELETE, KeyStroke.getKeyStroke(KEY_DELETE), new JobGraphBindingAction() {
@Override
public void actionPerformed(final ActionEvent e) {
final Set<Object> vertices = _graphContext.getSelectedVertices();
if ((vertices == null) || vertices.isEmpty()) {
return;
}
for (final Object vertex : vertices) {
final AnalysisJobBuilder analysisJobBuilder = _graphContext.getAnalysisJobBuilder(vertex);
if (vertex instanceof TransformerComponentBuilder) {
final TransformerComponentBuilder<?> tjb = (TransformerComponentBuilder<?>) vertex;
analysisJobBuilder.removeTransformer(tjb);
} else if (vertex instanceof AnalyzerComponentBuilder) {
final AnalyzerComponentBuilder<?> ajb = (AnalyzerComponentBuilder<?>) vertex;
analysisJobBuilder.removeAnalyzer(ajb);
} else if (vertex instanceof FilterComponentBuilder) {
final FilterComponentBuilder<?, ?> fjb = (FilterComponentBuilder<?, ?>) vertex;
analysisJobBuilder.removeFilter(fjb);
} else if (vertex instanceof Table) {
final Table table = (Table) vertex;
analysisJobBuilder.removeSourceTable(table);
} else if (vertex instanceof Column) {
final Column column = (Column) vertex;
analysisJobBuilder.removeSourceColumn(column);
}
}
}
});
// register BACKSPACE key to the same action
_component.getInputMap(INPUT_MAP_CONDITION).put(KeyStroke.getKeyStroke(KEY_BACKSPACE), KEY_DELETE);
}
private void registerAction(final String actionKey, final KeyStroke keyStroke, final Action action) {
_component.getInputMap(INPUT_MAP_CONDITION).put(keyStroke, actionKey);
_component.getActionMap().put(actionKey, action);
}
}