/*******************************************************************************
* Copyright (c) 2017 Skymatic UG (haftungsbeschränkt).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the accompanying LICENSE file.
*******************************************************************************/
package org.cryptomator.ui.model;
import java.util.List;
import java.util.stream.IntStream;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VaultSettings;
import com.google.common.collect.Lists;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.collections.transformation.TransformationList;
@Singleton
public class VaultList extends TransformationList<Vault, VaultSettings> {
private final VaultFactory vaultFactory;
private final ObservableList<VaultSettings> source;
@Inject
public VaultList(Settings settings, VaultFactory vaultFactory) {
super(settings.getDirectories());
this.source = settings.getDirectories();
this.vaultFactory = vaultFactory;
}
@Override
public int getSourceIndex(int index) {
return index;
}
@Override
public Vault get(int index) {
VaultSettings s = source.get(index);
return vaultFactory.get(s);
}
@Override
public void add(int index, Vault element) {
source.add(index, element.getVaultSettings());
}
@Override
public Vault remove(int index) {
VaultSettings s = source.remove(index);
return vaultFactory.get(s);
}
@Override
public int size() {
return getSource().size();
}
@Override
protected void sourceChanged(ListChangeListener.Change<? extends VaultSettings> c) {
this.fireChange(new VaultListChange(c));
}
private class VaultListChange extends ListChangeListener.Change<Vault> {
private final ListChangeListener.Change<? extends VaultSettings> delegate;
public VaultListChange(ListChangeListener.Change<? extends VaultSettings> delegate) {
super(VaultList.this);
this.delegate = delegate;
}
@Override
public boolean next() {
return delegate.next();
}
@Override
public boolean wasUpdated() {
return delegate.wasUpdated();
}
@Override
public void reset() {
delegate.reset();
}
@Override
public int getFrom() {
return delegate.getFrom();
}
@Override
public int getTo() {
return delegate.getTo();
}
@Override
public List<Vault> getRemoved() {
return Lists.transform(delegate.getRemoved(), vaultFactory::get);
}
@Override
public boolean wasPermutated() {
return delegate.wasPermutated();
}
@Override
protected int[] getPermutation() {
if (delegate.wasPermutated()) {
return IntStream.range(getFrom(), getTo()).map(delegate::getPermutation).toArray();
} else {
return new int[0];
}
}
@Override
public String toString() {
return delegate.toString();
}
}
}