/** * This file is a part of GrantMaster. * Copyright (C) 2015 Gábor Fehér <feherga@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.github.gaborfeher.grantmaster.ui; import com.github.gaborfeher.grantmaster.framework.base.TablePageControllerBase; import com.github.gaborfeher.grantmaster.framework.utils.DatabaseSingleton; import com.github.gaborfeher.grantmaster.framework.utils.Utils; import com.github.gaborfeher.grantmaster.logic.entities.BudgetCategory; import com.github.gaborfeher.grantmaster.logic.entities.Project; import com.github.gaborfeher.grantmaster.logic.entities.ProjectExpense; import com.github.gaborfeher.grantmaster.logic.wrappers.GlobalBudgetCategoryWrapper; import com.github.gaborfeher.grantmaster.logic.wrappers.ProjectExpenseWrapper; import com.github.gaborfeher.grantmaster.logic.wrappers.ProjectWrapper; import java.util.List; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.scene.control.ChoiceBox; import javafx.scene.control.DatePicker; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TextField; import javafx.util.Callback; import javax.persistence.EntityManager; public class SearchTabController extends TablePageControllerBase<ProjectExpenseWrapper> { @FXML private ExpenseTableController tableController; @FXML private ChoiceBox<Project> project; @FXML private DatePicker startDate; @FXML private DatePicker endDate; @FXML private ChoiceBox<BudgetCategory> budgetCategory; @FXML private TextField budgetCategoryGroup; @FXML private TextField accountNo; @FXML private TextField partnerName; @FXML private TextField comment1; @FXML private TextField comment2; private List<ProjectExpenseWrapper> searchResults; @FXML private void search() { fetchSearchResults(); onRefresh(); } private void fetchSearchResults() { DatabaseSingleton.INSTANCE.query((EntityManager em) -> { searchResults = ProjectExpenseWrapper.getExpenseList( em, project.getValue(), startDate.getValue(), endDate.getValue(), budgetCategory.getValue(), budgetCategoryGroup.getText(), accountNo.getText(), partnerName.getText(), comment1.getText(), comment2.getText()); return true; }); Utils.logMemoryUsage("fetchSearchResults: "); } @FXML private void reset() { project.setValue(null); startDate.setValue(null); endDate.setValue(null); budgetCategory.setValue(null); budgetCategoryGroup.setText(null); accountNo.setText(null); partnerName.setText(null); comment1.setText(null); comment2.setText(null); searchResults.clear(); onRefresh(); } @Override public void getItemListForRefresh(EntityManager em, List<ProjectExpenseWrapper> items) { items.clear(); fetchSearchResults(); if (searchResults != null) { items.addAll(searchResults); } } @Override protected void refreshOtherContent() { DatabaseSingleton.INSTANCE.query((EntityManager em) -> { BudgetCategory selectedBudgetCategory = budgetCategory.getSelectionModel().getSelectedItem(); budgetCategory.getItems().clear(); budgetCategory.getItems().add(null); budgetCategory.getItems().addAll(GlobalBudgetCategoryWrapper.getBudgetCategories(em, BudgetCategory.Direction.PAYMENT)); budgetCategory.getSelectionModel().select(selectedBudgetCategory); Project selectedProject = project.getSelectionModel().getSelectedItem(); project.getItems().clear(); project.getItems().add(null); project.getItems().addAll(ProjectWrapper.getProjectsWithoutWrapping(em)); project.getSelectionModel().select(selectedProject); tableController.accountingCurrencyAmountColumn.setCellValueFactory( new Callback<TableColumn.CellDataFeatures<ProjectExpenseWrapper, Object>, ObservableValue<Object>>() { @Override public ObservableValue<Object> call(TableColumn.CellDataFeatures<ProjectExpenseWrapper, Object> p) { ProjectExpenseWrapper expenseWrapper = p.getValue(); ProjectExpense expense = p.getValue().getEntity(); String result = String.format( "%2.2f %s", expenseWrapper.getAccountingCurrencyAmount(), expense.getProject().getAccountCurrency().getCode()); return new ReadOnlyObjectWrapper<Object>(result); } }); tableController.accountingCurrencyAmountColumn.setCellFactory( new Callback<TableColumn<ProjectExpenseWrapper, Object>, TableCell<ProjectExpenseWrapper, Object>>() { @Override public TableCell<ProjectExpenseWrapper, Object> call(TableColumn<ProjectExpenseWrapper, Object> p) { return (TableCell<ProjectExpenseWrapper, Object>) TableColumn.DEFAULT_CELL_FACTORY.call(p); } }); tableController.grantCurrencyAmountColumn.setCellValueFactory( new Callback<TableColumn.CellDataFeatures<ProjectExpenseWrapper, Object>, ObservableValue<Object>>() { @Override public ObservableValue<Object> call(TableColumn.CellDataFeatures<ProjectExpenseWrapper, Object> p) { ProjectExpenseWrapper expenseWrapper = p.getValue(); ProjectExpense expense = p.getValue().getEntity(); String result = String.format( "%2.2f %s", expenseWrapper.getGrantCurrencyAmount(), expense.getProject().getGrantCurrency()); return new ReadOnlyObjectWrapper<Object>(result); } }); tableController.grantCurrencyAmountColumn.setCellFactory( new Callback<TableColumn<ProjectExpenseWrapper, Object>, TableCell<ProjectExpenseWrapper, Object>>() { @Override public TableCell<ProjectExpenseWrapper, Object> call(TableColumn<ProjectExpenseWrapper, Object> p) { return (TableCell<ProjectExpenseWrapper, Object>) TableColumn.DEFAULT_CELL_FACTORY.call(p); } }); return true; }); } @Override protected ProjectExpenseWrapper createNewEntity(EntityManager em) { return null; } }