/*
* Copyright (c) 2013, Andreas Billmann <abi@geofroggerfx.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package de.geofroggerfx.fx.components;
import de.geofroggerfx.model.Cache;
import javafx.geometry.Insets;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.image.ImageView;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import static de.geofroggerfx.fx.utils.JavaFXUtils.addClasses;
import static de.geofroggerfx.fx.utils.JavaFXUtils.removeClasses;
/**
* Multi-Column-Row list cell to shows the most important data in a list.
*
* @author Andreas
*/
public class CacheListCell extends ListCell<Cache> {
private static final String CACHE_LIST_FOUND_CLASS = "cache-list-found";
private static final String CACHE_LIST_NOT_FOUND_CLASS = "cache-list-not-found";
private static final String CACHE_LIST_NAME_CLASS = "cache-list-name";
private static final String CACHE_LIST_DT_CLASS = "cache-list-dt";
private static final String CACHE_LIST_ICON_CLASS = "cache-list-icon";
private final GridPane grid = new GridPane();
private final ImageView icon = new ImageView();
private final Label name = new Label();
private final Label dt = new Label();
private final Label owner = new Label();
private final ImageView foundIcon = new ImageView();
public CacheListCell() {
configureGrid();
configureIcon();
configureName();
configureDifficultyTerrain();
addControlsToGrid();
}
@Override
public void updateItem(Cache cache, boolean empty) {
super.updateItem(cache, empty);
if (empty) {
clearContent();
} else {
addContent(cache);
}
}
private void configureGrid() {
grid.setHgap(10);
grid.setVgap(4);
grid.setPadding(new Insets(0, 10, 0, 10));
ColumnConstraints column1 = new ColumnConstraints(32);
ColumnConstraints column2 = new ColumnConstraints(100, 100, Double.MAX_VALUE);
column2.setHgrow(Priority.ALWAYS);
ColumnConstraints column3 = new ColumnConstraints(100, 100, 200);
column3.setHgrow(Priority.SOMETIMES);
ColumnConstraints column4 = new ColumnConstraints(32);
grid.getColumnConstraints().addAll(column1, column2, column3, column4);
}
private void configureIcon() {
icon.getStyleClass().add(CACHE_LIST_ICON_CLASS);
}
private void configureName() {
name.getStyleClass().add(CACHE_LIST_NAME_CLASS);
}
private void configureDifficultyTerrain() {
dt.getStyleClass().add(CACHE_LIST_DT_CLASS);
}
private void addControlsToGrid() {
grid.add(icon, 0, 0, 1, 2);
grid.add(name, 1, 0, 2, 1);
grid.add(dt, 2, 1);
grid.add(owner, 1, 1);
grid.add(foundIcon, 3, 0);
}
private void clearContent() {
setText(null);
setGraphic(null);
}
private void addContent(Cache cache) {
setText(null);
icon.setImage(GeocachingIcons.getIcon(cache));
name.setText(cache.getName());
dt.setText("D: " + cache.getDifficulty() + " / T:" + cache.getTerrain());
String ownerText = cache.getPlacedBy().equals(cache.getOwner().getName()) ? cache.getPlacedBy() : cache.getPlacedBy() + " (" + cache.getOwner().getName() + ")";
owner.setText(ownerText);
if (cache.isFound()) {
foundIcon.setImage(IconManager.getIcon("iconmonstr-check-mark-11-icon.png", IconManager.IconSize.SMALL));
} else {
foundIcon.setImage(null);
}
setStyleClassDependingOnFoundState(cache);
setGraphic(grid);
}
private void setStyleClassDependingOnFoundState(Cache cache) {
if (cache.isFound()) {
addClasses(this, CACHE_LIST_FOUND_CLASS);
removeClasses(this, CACHE_LIST_NOT_FOUND_CLASS);
} else {
addClasses(this, CACHE_LIST_NOT_FOUND_CLASS);
removeClasses(this, CACHE_LIST_FOUND_CLASS);
}
}
}