/*
* Copyright (c) 2014 Dennis Fischer.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0+
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors: Dennis Fischer
*/
package de.chaosfisch.uploader.gui.controller;
import com.google.inject.Inject;
import de.chaosfisch.google.account.Account;
import de.chaosfisch.google.account.IAccountService;
import de.chaosfisch.google.youtube.playlist.IPlaylistService;
import de.chaosfisch.google.youtube.playlist.Playlist;
import de.chaosfisch.uploader.gui.renderer.AccountStringConverter;
import de.chaosfisch.uploader.gui.renderer.DialogHelper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URL;
public class PlaylistAddController extends UndecoratedDialogController {
@FXML
private URL location;
@FXML
private ChoiceBox<Account> accounts;
@FXML
private CheckBox playlistPrivate;
@FXML
private TextArea summary;
@FXML
private TextField title;
private static final Logger logger = LoggerFactory.getLogger(PlaylistAddController.class);
private final ObservableList<Account> accountItems = FXCollections.observableArrayList();
private final IPlaylistService playlistService;
private final IAccountService accountService;
private final DialogHelper dialogHelper;
@Inject
private PlaylistAddController(final IPlaylistService playlistService, final IAccountService accountService, final DialogHelper dialogHelper) {
this.playlistService = playlistService;
this.accountService = accountService;
this.dialogHelper = dialogHelper;
}
@FXML
void initialize() {
assert null != accounts : "fx:id=\"accounts\" was not injected: check your FXML file 'PlaylistAddDialog.fxml'.";
assert null != playlistPrivate : "fx:id=\"playlistPrivate\" was not injected: check your FXML file 'PlaylistAddDialog.fxml'.";
assert null != summary : "fx:id=\"summary\" was not injected: check your FXML file 'PlaylistAddDialog.fxml'.";
assert null != title : "fx:id=\"title\" was not injected: check your FXML file 'PlaylistAddDialog.fxml'.";
accountItems.addAll(accountService.getAll());
accounts.setItems(accountItems);
accounts.getSelectionModel().selectFirst();
accounts.setConverter(new AccountStringConverter());
}
@FXML
public void addPlaylist(final ActionEvent actionEvent) {
dialogHelper.resetControlls(new Control[]{title, accounts});
try {
final Playlist playlist = new Playlist(title.getText(), accounts.getValue());
playlist.setSummary(summary.getText());
playlist.setPrivate_(playlistPrivate.isSelected());
final Thread th = new Thread(createPlaylistAddTask(playlist));
th.setDaemon(true);
th.start();
} catch (final IllegalArgumentException e) {
switch (e.getMessage()) {
case Playlist.Validation.TITLE:
case Playlist.Validation.TITLE_SIZE:
title.getStyleClass().add("input-invalid");
title.setTooltip(TooltipBuilder.create()
.autoHide(true)
.text(resources.getString("validation.playlisttitle"))
.build());
title.getTooltip().show(title, dialogHelper.getTooltipX(title), dialogHelper.getTooltipY(title));
break;
case Playlist.Validation.ACCOUNT:
accounts.getStyleClass().add("input-invalid");
accounts.setTooltip(TooltipBuilder.create()
.autoHide(true)
.text(resources.getString("validation.account"))
.build());
accounts.getTooltip()
.show(accounts, dialogHelper.getTooltipX(accounts), dialogHelper.getTooltipY(accounts));
break;
}
}
}
private Task<Void> createPlaylistAddTask(final Playlist playlist) {
final Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
updateProgress(-1, -1);
updateMessage("Adding playlist...");
playlistService.addYoutubePlaylist(playlist);
return null;
}
@Override
protected void failed() {
logger.warn("Playlist add error", getException());
dialogHelper.showErrorDialog(resources.getString("dialog.playlistadd.error.title"), resources.getString("dialog.playlistadd.error.message"));
}
@Override
protected void succeeded() {
updateMessage("Playlist added!");
updateProgress(1, 1);
closeDialog(null);
}
};
dialogHelper.registerBusyTask(task);
return task;
}
}