/*
* BTC-e client for JavaFX
* Copyright (C) 2014 QuarkDev Solutions <quarkdev.solutions@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.QuarkLabs.BTCeClientJavaFX;
import com.QuarkLabs.BTCeClientJavaFX.models.PublicTrade;
import com.QuarkLabs.BTCeClientJavaFX.networking.App;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.util.Callback;
import org.json.JSONArray;
import org.json.JSONObject;
import java.net.URL;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.ResourceBundle;
/**
* Controller for Public Trades layout
*/
public class PublicTradesController {
@FXML
private ResourceBundle resources;
@FXML
private URL location;
@FXML
private TableView<PublicTrade> publicTradesTable;
@FXML
private TableColumn<PublicTrade, Double> publicTradesTableAmountColumn;
@FXML
private TableColumn<PublicTrade, String> publicTradesTableDateColumn;
@FXML
private TableColumn<PublicTrade, String> publicTradesTableItemColumn;
@FXML
private TableColumn<PublicTrade, Double> publicTradesTablePriceColumn;
@FXML
private TableColumn<PublicTrade, String> publicTradesTablePriceCurrencyColumn;
@FXML
private TableColumn<PublicTrade, Long> publicTradesTableTIDColumn;
@FXML
private TableColumn<PublicTrade, String> publicTradesTableTradeTypeColumn;
private ObservableList<PublicTrade> publicTrades = FXCollections.observableArrayList();
private String pair;
@FXML
void initialize() {
assert publicTradesTable != null : "fx:id=\"publicTradesTable\" was not injected: check your FXML file 'markettrades.fxml'.";
assert publicTradesTableAmountColumn != null : "fx:id=\"publicTradesTableAmountColumn\" was not injected: check your FXML file 'markettrades.fxml'.";
assert publicTradesTableDateColumn != null : "fx:id=\"publicTradesTableDateColumn\" was not injected: check your FXML file 'markettrades.fxml'.";
assert publicTradesTableItemColumn != null : "fx:id=\"publicTradesTableItemColumn\" was not injected: check your FXML file 'markettrades.fxml'.";
assert publicTradesTablePriceColumn != null : "fx:id=\"publicTradesTablePriceColumn\" was not injected: check your FXML file 'markettrades.fxml'.";
assert publicTradesTablePriceCurrencyColumn != null : "fx:id=\"publicTradesTablePriceCurrencyColumn\" was not injected: check your FXML file 'markettrades.fxml'.";
assert publicTradesTableTIDColumn != null : "fx:id=\"publicTradesTableTIDColumn\" was not injected: check your FXML file 'markettrades.fxml'.";
assert publicTradesTableTradeTypeColumn != null : "fx:id=\"publicTradesTableTradeTypeColumn\" was not injected: check your FXML file 'markettrades.fxml'.";
publicTradesTable.setItems(publicTrades);
publicTradesTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
publicTradesTableAmountColumn.setCellValueFactory(new PropertyValueFactory<PublicTrade, Double>("amount"));
publicTradesTableDateColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<PublicTrade, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<PublicTrade, String> publicTradeStringCellDataFeatures) {
PublicTrade publicTrade = publicTradeStringCellDataFeatures.getValue();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(publicTrade.getDate() * 1000);
DateFormat dateFormat = DateFormat.getDateTimeInstance();
return new SimpleStringProperty(dateFormat.format(calendar.getTime()));
}
});
publicTradesTableItemColumn.setCellValueFactory(new PropertyValueFactory<PublicTrade, String>("item"));
publicTradesTablePriceColumn.setCellValueFactory(new PropertyValueFactory<PublicTrade, Double>("price"));
publicTradesTablePriceCurrencyColumn.setCellValueFactory(new PropertyValueFactory<PublicTrade, String>("priceCurrency"));
publicTradesTableTIDColumn.setCellValueFactory(new PropertyValueFactory<PublicTrade, Long>("tid"));
publicTradesTableTradeTypeColumn.setCellValueFactory(new PropertyValueFactory<PublicTrade, String>("tradeType"));
Task<JSONArray> loadPublicTrades = new Task<JSONArray>() {
@Override
protected JSONArray call() throws Exception {
return App.getPublicTrades(pair);
}
};
loadPublicTrades.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent workerStateEvent) {
JSONArray jsonArray = (JSONArray) workerStateEvent.getSource().getValue();
publicTrades.clear();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject item = jsonArray.getJSONObject(i);
PublicTrade publicTrade = new PublicTrade();
publicTrade.setDate(item.getLong("date"));
publicTrade.setAmount(item.getDouble("amount"));
publicTrade.setItem(item.getString("item"));
publicTrade.setPrice(item.getDouble("price"));
publicTrade.setPriceCurrency(item.getString("price_currency"));
publicTrade.setTid(item.getLong("tid"));
publicTrade.setTradeType(item.getString("trade_type"));
publicTrades.add(publicTrade);
}
}
});
Thread thread = new Thread(loadPublicTrades);
thread.start();
}
/**
* Loads public trades data
*
* @param pair Currency pair
*/
void injectPair(final String pair) {
this.pair = pair;
}
}