/*
* Copyright 2016 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.red.nattable.edit;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.transform;
import java.util.ArrayList;
import java.util.List;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
/**
* @author Michal Anglart
*
*/
class DetailEntriesCollection<D> {
private static final int JUMP_STEP = 5;
private final List<DetailWithEntry<D>> entries = new ArrayList<>();
public List<DetailCellEditorEntry<D>> getEntries() {
return transform(entries, new Function<DetailWithEntry<D>, DetailCellEditorEntry<D>>() {
@Override
public DetailCellEditorEntry<D> apply(final DetailWithEntry<D> detailWithEntry) {
return detailWithEntry.entry;
}
});
}
boolean isEmpty() {
return entries.isEmpty();
}
int size() {
return entries.size();
}
void add(final DetailWithEntry<D> detailWithEntry) {
entries.add(detailWithEntry);
}
private void selectEntries(final int from, final int howMany, final int direction) {
Preconditions.checkArgument(direction == 1 || direction == -1);
int selected = 0;
int i = from + direction, j = 0;
for (; 0 <= i && i < size() && j < howMany; i += direction, j++) {
entries.get(i).entry.select(false);
selected++;
}
if (i < 0 && selected < howMany) {
entries.get(0).entry.select(false);
}
if (i >= size() && selected < howMany) {
entries.get(size() - 1).entry.select(false);
}
}
void selectOnlyEntry(final int index) {
deselectAll();
entries.get(index).entry.select(false);
}
void selectEntries(final List<Integer> indexes) {
deselectAll();
for (final int index : indexes) {
entries.get(Math.max(0, Math.min(index, size() - 1))).entry.select(false);
}
}
void selectOnlyPreviousEntry(final DetailCellEditorEntry<D> entry) {
deselectAll();
selectEntries(getEntryIndex(entry), 1, -1);
}
void selectPreviousEntry(final DetailCellEditorEntry<D> entry) {
selectEntries(getEntryIndex(entry), 1, -1);
}
void selectOnlyPreviousEntryJumping(final DetailCellEditorEntry<D> entry) {
deselectAll();
selectEntries(getEntryIndex(entry) - JUMP_STEP, 1, -1);
}
void selectPreviousEntryJumping(final DetailCellEditorEntry<D> entry) {
selectEntries(getEntryIndex(entry), JUMP_STEP, -1);
}
public void selectOnlyFirstEntry() {
deselectAll();
selectEntries(0, 1, -1);
}
public void selectTillFirstEntry(final DetailCellEditorEntry<D> entry) {
selectEntries(getEntryIndex(entry), Integer.MAX_VALUE, -1);
}
void selectOnlyNextEntry(final DetailCellEditorEntry<D> entry) {
deselectAll();
selectEntries(getEntryIndex(entry), 1, 1);
}
void selectNextEntry(final DetailCellEditorEntry<D> entry) {
selectEntries(getEntryIndex(entry), 1, 1);
}
void selectOnlyNextEntryJumping(final DetailCellEditorEntry<D> entry) {
deselectAll();
selectEntries(getEntryIndex(entry) + JUMP_STEP, 1, 1);
}
void selectNextEntriesJumping(final DetailCellEditorEntry<D> entry) {
selectEntries(getEntryIndex(entry), JUMP_STEP, 1);
}
public void selectOnlyLastEntry() {
deselectAll();
selectEntries(size() - 1, 1, 1);
}
public void selectTillLastEntry(final DetailCellEditorEntry<D> entry) {
selectEntries(getEntryIndex(entry), Integer.MAX_VALUE, 1);
}
void selectAll() {
for (final DetailWithEntry<D> entry : entries) {
if (!entry.entry.isSelected()) {
entry.entry.select(false);
}
}
}
void deselectAll() {
for (final DetailWithEntry<D> entry : entries) {
if (entry.entry.isSelected()) {
entry.entry.deselect();
}
}
}
void redrawEntries() {
for (final DetailWithEntry<D> entry : entries) {
entry.entry.redraw();
}
}
boolean isFirst(final DetailCellEditorEntry<D> entry) {
return !entries.isEmpty() && entries.get(0).entry == entry;
}
boolean isFirstSelected() {
return !entries.isEmpty() && entries.get(0).entry.isSelected();
}
boolean isLast(final DetailCellEditorEntry<D> entry) {
return !entries.isEmpty() && entries.get(entries.size() - 1).entry == entry;
}
public boolean isLastSelected() {
return !entries.isEmpty() && entries.get(size() - 1).entry.isSelected();
}
int getEntryIndex(final DetailCellEditorEntry<D> entry) {
int i = 0;
for (final DetailWithEntry<D> detailEntry : entries) {
if (detailEntry.entry == entry) {
return i;
}
i++;
}
return -1;
}
List<D> getSelectedDetails() {
final List<D> elements = newArrayList();
for (final DetailWithEntry<D> entry : entries) {
if (entry.entry.isSelected()) {
elements.add(entry.detail);
}
}
return elements;
}
List<Integer> getSelectedIndexes() {
final List<Integer> indexes = newArrayList();
int i = 0;
for (final DetailWithEntry<D> entry : entries) {
if (entry.entry.isSelected()) {
indexes.add(i);
}
i++;
}
return indexes;
}
void disposeEntries() {
for (final DetailWithEntry<D> entry : entries) {
entry.entry.dispose();
}
entries.clear();
}
void openEntryForEdit(final DetailCellEditorEntry<D> entry) {
for (final DetailWithEntry<D> detailEntry : entries) {
detailEntry.entry.cancelEdit();
}
if (!entry.isEditorOpened()) {
entry.openForEditing();
}
}
static class DetailWithEntry<D> {
private final D detail;
private final DetailCellEditorEntry<D> entry;
DetailWithEntry(final D detail, final DetailCellEditorEntry<D> entry) {
this.detail = detail;
this.entry = entry;
}
}
}