/* * 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.cachelist; import de.geofroggerfx.application.SessionContext; import de.geofroggerfx.fx.components.CacheListCell; import de.geofroggerfx.fx.components.IconManager; import de.geofroggerfx.fx.components.SortingMenuItem; import de.geofroggerfx.model.Cache; import de.geofroggerfx.model.CacheList; import de.geofroggerfx.service.CacheService; import de.geofroggerfx.service.CacheSortField; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.*; import javafx.scene.image.ImageView; import javax.inject.Inject; import java.net.URL; import java.util.List; import java.util.ResourceBundle; import static de.geofroggerfx.application.SessionConstants.*; import static de.geofroggerfx.fx.utils.JavaFXUtils.addClasses; import static de.geofroggerfx.service.CacheSortField.*; /** * FXML Controller class * * @author Andreas */ public class CacheListController implements Initializable { private static final String CACHE_LIST_ACTION_ICONS = "cache-list-action-icons"; private ResourceBundle resourceBundle; @Inject private SessionContext sessionContext; @Inject private CacheService cacheService; private SortingMenuItem currentSortingButton = null; @FXML private ListView cacheListView; @FXML private Label cacheNumber; @FXML private MenuButton menuIcon; @FXML private ComboBox cacheListComboBox; @Override @SuppressWarnings("unchecked") public void initialize(URL url, ResourceBundle rb) { this.resourceBundle = rb; setSessionListener(); setCellFactory(); cacheListView.getSelectionModel().selectedItemProperty().addListener( observable -> sessionContext.setData(CURRENT_CACHE, cacheListView.getSelectionModel().getSelectedItem()) ); initCacheListComboBox(); initListMenuButton(); } @SuppressWarnings("unchecked") private void setCellFactory() { cacheListView.setCellFactory( param -> new CacheListCell() ); } private void setSessionListener() { sessionContext.addListener(CACHE_LIST, () -> Platform.runLater(this::resetCacheList)); sessionContext.addListener(CACHE_LISTS, () -> Platform.runLater(this::refreshCacheListComboAndSelectFirst)); } @SuppressWarnings("unchecked") private void resetCacheList() { List<Cache> caches = (List<Cache>) sessionContext.getData(CACHE_LIST); cacheNumber.setText(" " + caches.size()); cacheListView.getItems().setAll(caches); } @SuppressWarnings("unchecked") private void refreshCacheListComboAndSelectFirst() { List<CacheList> cacheLists = (List<CacheList>) sessionContext.getData(CACHE_LISTS); cacheListComboBox.getItems().clear(); cacheListComboBox.getItems().add(resourceBundle.getString("all.caches")); cacheListComboBox.getItems().addAll(cacheLists); cacheListComboBox.getSelectionModel().selectFirst(); } private void initCacheListComboBox() { cacheListComboBox.setOnAction(actionEvent -> { final Object selectedItem = cacheListComboBox.getSelectionModel().getSelectedItem(); Platform.runLater(() -> cacheListSelectAction(selectedItem)); }); } private void cacheListSelectAction(Object selectedItem) { if (selectedItem != null) { if (selectedItem.equals(resourceBundle.getString("all.caches"))) { loadAllCaches(); } else{ CacheList cacheList = (CacheList)selectedItem; sessionContext.setData(CACHE_LIST, cacheList.getCaches()); } } else { cacheListComboBox.getSelectionModel().selectFirst(); } } private void initListMenuButton() { addClasses(menuIcon, CACHE_LIST_ACTION_ICONS); menuIcon.setGraphic(new ImageView(IconManager.getIcon("iconmonstr-menu-icon.png", IconManager.IconSize.SMALL))); menuIcon.getItems().addAll(createSortMenu()); menuIcon.minHeightProperty().bind(cacheListComboBox.heightProperty()); menuIcon.prefHeightProperty().bind(cacheListComboBox.heightProperty()); menuIcon.maxHeightProperty().bind(cacheListComboBox.heightProperty()); } private Menu createSortMenu() { Menu sortMenu = new Menu(resourceBundle.getString("menu.title.sort")); currentSortingButton = createSortButton(NAME); currentSortingButton.setSelected(true); sortMenu.getItems().addAll( currentSortingButton, createSortButton(TYPE), createSortButton(DIFFICULTY), createSortButton(TERRAIN), createSortButton(OWNER), createSortButton(PLACEDBY)); return sortMenu; } private SortingMenuItem createSortButton(final CacheSortField field) { SortingMenuItem button = new SortingMenuItem(resourceBundle.getString("sort.cache."+field.getFieldName()), field); button.setOnAction(actionEvent -> { // if there was another button selected, change the selection if (!currentSortingButton.equals(button)) { currentSortingButton.setSelected(false); currentSortingButton = button; } currentSortingButton.setSelected(true); loadAllCaches(); }); return button; } private void loadAllCaches() { sessionContext.setData(CACHE_LIST, cacheService.getAllCaches(currentSortingButton.getField(), currentSortingButton.getSortDirection())); } }