2016-08-14 15:17:14 +02:00
/ * *
2018-03-01 15:42:47 +01:00
* Project - HomeFlix
2016-08-14 15:17:14 +02:00
*
2018-03-10 14:16:37 +01:00
* Copyright 2016 - 2018 < @Seil0 >
2016-08-14 15:17:14 +02:00
*
* 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 , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston ,
* MA 02110 - 1301 , USA .
*
* /
2018-03-01 15:42:47 +01:00
package kellerkinder.HomeFlix.application ;
2016-08-14 15:17:14 +02:00
import java.awt.Desktop ;
import java.io.BufferedReader ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.FileOutputStream ;
2018-03-04 20:07:43 +01:00
import java.io.FileReader ;
import java.io.FileWriter ;
2016-08-14 15:17:14 +02:00
import java.io.IOException ;
import java.io.InputStream ;
import java.io.InputStreamReader ;
import java.io.OutputStream ;
2016-11-12 15:02:55 +01:00
import java.io.PrintWriter ;
import java.io.StringWriter ;
2018-03-04 20:07:43 +01:00
import java.io.Writer ;
2016-08-14 15:17:14 +02:00
import java.math.BigInteger ;
2017-03-05 18:29:24 +01:00
import java.util.ArrayList ;
2016-08-14 15:17:14 +02:00
import java.util.Locale ;
import java.util.Properties ;
import java.util.ResourceBundle ;
2017-09-16 18:22:46 +02:00
import org.apache.logging.log4j.LogManager ;
import org.apache.logging.log4j.Logger ;
2018-03-02 13:50:21 +01:00
import com.cemu_UI.uiElements.JFXInfoDialog ;
2018-03-04 20:07:43 +01:00
import com.eclipsesource.json.Json ;
import com.eclipsesource.json.JsonArray ;
import com.eclipsesource.json.JsonObject ;
2016-08-14 15:17:14 +02:00
import com.jfoenix.controls.JFXButton ;
import com.jfoenix.controls.JFXColorPicker ;
2017-06-07 01:42:18 +02:00
import com.jfoenix.controls.JFXHamburger ;
2016-08-14 15:17:14 +02:00
import com.jfoenix.controls.JFXSlider ;
import com.jfoenix.controls.JFXTextField ;
import com.jfoenix.controls.JFXToggleButton ;
2017-06-07 01:42:18 +02:00
import com.jfoenix.transitions.hamburger.HamburgerBackArrowBasicTransition ;
2016-08-14 15:17:14 +02:00
2016-10-10 16:55:26 +02:00
import javafx.animation.TranslateTransition ;
2016-08-14 15:17:14 +02:00
import javafx.beans.value.ChangeListener ;
import javafx.beans.value.ObservableValue ;
import javafx.collections.FXCollections ;
import javafx.collections.ObservableList ;
2017-01-06 00:04:07 +01:00
import javafx.event.ActionEvent ;
import javafx.event.EventHandler ;
2016-08-14 15:17:14 +02:00
import javafx.fxml.FXML ;
import javafx.scene.control.Alert ;
import javafx.scene.control.Alert.AlertType ;
import javafx.scene.control.ChoiceBox ;
2017-01-06 00:04:07 +01:00
import javafx.scene.control.ContextMenu ;
2016-08-14 15:17:14 +02:00
import javafx.scene.control.Label ;
2017-01-06 00:04:07 +01:00
import javafx.scene.control.MenuItem ;
2017-03-05 18:29:24 +01:00
import javafx.scene.control.ScrollPane ;
2016-09-09 20:41:20 +02:00
import javafx.scene.control.TableColumn ;
import javafx.scene.control.TableView ;
2016-11-12 15:02:55 +01:00
import javafx.scene.control.TextArea ;
2016-08-14 15:17:14 +02:00
import javafx.scene.control.TreeItem ;
import javafx.scene.control.TreeTableColumn ;
2017-03-05 18:29:24 +01:00
import javafx.scene.control.TreeTableColumn.SortType ;
2016-08-14 15:17:14 +02:00
import javafx.scene.control.TreeTableView ;
import javafx.scene.image.Image ;
import javafx.scene.image.ImageView ;
2017-06-07 01:42:18 +02:00
import javafx.scene.input.MouseEvent ;
2016-08-14 15:17:14 +02:00
import javafx.scene.layout.AnchorPane ;
2016-11-12 15:02:55 +01:00
import javafx.scene.layout.GridPane ;
2016-10-09 16:05:44 +02:00
import javafx.scene.layout.HBox ;
2016-11-12 15:02:55 +01:00
import javafx.scene.layout.Priority ;
2016-08-14 15:17:14 +02:00
import javafx.scene.layout.VBox ;
import javafx.scene.paint.Color ;
import javafx.scene.text.Font ;
2017-03-05 18:29:24 +01:00
import javafx.scene.text.TextFlow ;
2016-08-14 15:17:14 +02:00
import javafx.stage.DirectoryChooser ;
2018-03-04 20:07:43 +01:00
import javafx.stage.FileChooser ;
2016-10-10 16:55:26 +02:00
import javafx.util.Duration ;
2018-03-01 15:42:47 +01:00
import kellerkinder.HomeFlix.controller.DBController ;
2018-03-08 17:59:28 +01:00
import kellerkinder.HomeFlix.controller.OMDbAPIController ;
2018-03-01 15:42:47 +01:00
import kellerkinder.HomeFlix.controller.UpdateController ;
2018-03-05 22:37:32 +01:00
import kellerkinder.HomeFlix.datatypes.SourceDataType ;
import kellerkinder.HomeFlix.datatypes.FilmTabelDataType ;
2016-08-14 15:17:14 +02:00
2017-03-05 18:29:24 +01:00
public class MainWindowController {
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
2018-03-01 23:18:40 +01:00
private AnchorPane mainAnchorPane ;
@FXML
private ScrollPane settingsScrollPane ;
@FXML
private ScrollPane textScrollPane ;
2016-08-14 15:17:14 +02:00
@FXML
2016-10-09 16:05:44 +02:00
private HBox topHBox ;
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
2016-10-09 16:05:44 +02:00
private VBox sideMenuVBox ;
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
2018-03-07 23:51:02 +01:00
private TreeTableView < FilmTabelDataType > filmsTreeTable ;
2018-03-01 23:18:40 +01:00
2016-09-09 20:41:20 +02:00
@FXML
2018-03-05 22:37:32 +01:00
private TableView < SourceDataType > sourcesTable ;
2018-03-04 20:07:43 +01:00
2017-01-03 23:29:45 +01:00
@FXML
2018-03-01 15:42:47 +01:00
private TextFlow textFlow ;
2018-03-01 23:18:40 +01:00
2017-03-05 18:29:24 +01:00
@FXML
2016-08-14 15:17:14 +02:00
private JFXButton playbtn ;
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
private JFXButton openfolderbtn ;
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
private JFXButton returnBtn ;
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
private JFXButton forwardBtn ;
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
2018-03-02 13:50:21 +01:00
private JFXButton aboutBtn ;
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
2016-10-09 16:05:44 +02:00
private JFXButton settingsBtn ;
2018-03-01 23:18:40 +01:00
2016-09-09 20:41:20 +02:00
@FXML
2016-10-09 16:05:44 +02:00
private JFXButton debugBtn ;
2018-03-01 23:18:40 +01:00
2016-09-09 20:41:20 +02:00
@FXML
2016-12-01 18:24:58 +01:00
public JFXButton updateBtn ;
2018-03-01 23:18:40 +01:00
2016-09-09 20:41:20 +02:00
@FXML
2018-03-04 20:07:43 +01:00
private JFXButton addDirectoryBtn ;
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
2018-03-04 20:07:43 +01:00
private JFXButton addStreamSourceBtn ;
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
2017-06-07 01:42:18 +02:00
private JFXHamburger menuHam ;
2018-03-01 23:18:40 +01:00
2017-06-07 01:42:18 +02:00
@FXML
2018-03-01 15:42:47 +01:00
private JFXToggleButton autoUpdateToggleBtn ;
2018-03-01 23:18:40 +01:00
2016-08-14 15:17:14 +02:00
@FXML
2018-03-01 23:18:40 +01:00
private JFXTextField searchTextField ;
2017-06-07 01:42:18 +02:00
@FXML
2018-03-01 23:18:40 +01:00
public JFXColorPicker colorPicker ;
@FXML
public ChoiceBox < String > languageChoisBox = new ChoiceBox < > ( ) ;
@FXML
public ChoiceBox < String > branchChoisBox = new ChoiceBox < > ( ) ;
@FXML
public JFXSlider fontsizeSlider ;
2017-06-07 01:42:18 +02:00
@FXML
2018-03-01 23:18:40 +01:00
private Label homeflixSettingsLbl ;
2016-08-14 15:17:14 +02:00
@FXML
2018-03-01 23:18:40 +01:00
private Label mainColorLbl ;
@FXML
private Label fontsizeLbl ;
2017-06-07 01:42:18 +02:00
@FXML
2018-03-01 23:18:40 +01:00
private Label languageLbl ;
@FXML
private Label updateLbl ;
@FXML
private Label branchLbl ;
2018-03-04 20:07:43 +01:00
@FXML
private Label sourcesLbl ;
2018-03-01 23:18:40 +01:00
@FXML
private Label versionLbl ;
2018-03-01 15:42:47 +01:00
@FXML
2018-03-07 23:51:02 +01:00
private ImageView posterImageView ;
2017-02-02 20:41:38 +01:00
private ImageView imv1 ;
2016-08-14 15:17:14 +02:00
2018-03-01 16:10:37 +01:00
@FXML
2018-03-09 20:12:03 +01:00
private TreeItem < FilmTabelDataType > filmRoot = new TreeItem < > ( new FilmTabelDataType ( " " , " " , " " , " " , false , false , imv1 ) ) ;
2018-03-01 16:10:37 +01:00
@FXML
2018-03-07 23:51:02 +01:00
private TreeTableColumn < FilmTabelDataType , String > columnStreamUrl = new TreeTableColumn < > ( " File Name " ) ;
2018-03-01 16:10:37 +01:00
@FXML
2018-03-07 23:51:02 +01:00
private TreeTableColumn < FilmTabelDataType , String > columnTitle = new TreeTableColumn < > ( " Title " ) ;
2018-03-01 16:10:37 +01:00
@FXML
2018-03-09 20:12:03 +01:00
private TreeTableColumn < FilmTabelDataType , String > columnSeason = new TreeTableColumn < > ( " Season " ) ;
2018-03-01 16:10:37 +01:00
@FXML
2018-03-09 20:12:03 +01:00
private TreeTableColumn < FilmTabelDataType , String > columnEpisode = new TreeTableColumn < > ( " Episode " ) ;
2018-03-01 16:10:37 +01:00
@FXML
2018-03-09 20:12:03 +01:00
private TreeTableColumn < FilmTabelDataType , ImageView > columnFavorite = new TreeTableColumn < > ( " Favorite " ) ;
2016-09-09 20:41:20 +02:00
@FXML
2018-03-07 23:51:02 +01:00
private TreeItem < SourceDataType > sourceRoot = new TreeItem < > ( new SourceDataType ( " " , " " ) ) ;
2016-09-09 20:41:20 +02:00
@FXML
2018-03-05 22:37:32 +01:00
private TableColumn < SourceDataType , String > sourceColumn ;
2016-09-09 20:41:20 +02:00
@FXML
2018-03-05 22:37:32 +01:00
private TableColumn < SourceDataType , String > modeColumn ;
2016-08-14 15:17:14 +02:00
2018-03-01 16:10:37 +01:00
private boolean menuTrue = false ;
2017-06-07 01:42:18 +02:00
private boolean settingsTrue = false ;
2017-03-25 16:20:48 +01:00
private boolean autoUpdate = false ;
2018-03-01 15:42:47 +01:00
private boolean useBeta = false ;
2017-09-16 18:22:46 +02:00
private static final Logger LOGGER = LogManager . getLogger ( MainWindowController . class . getName ( ) ) ;
private int hashA = - 647380320 ;
2018-03-01 16:10:37 +01:00
2018-03-07 00:20:14 +01:00
private String version = " 0.5.99 " ;
private String buildNumber = " 137 " ;
2017-07-10 11:27:33 +02:00
private String versionName = " solidify cow " ;
2018-03-02 13:50:21 +01:00
private String dialogBtnStyle ;
2018-03-07 00:20:14 +01:00
private String color ;
private String title ;
private String streamUrl ;
private String ratingSortType ;
private String local ;
2018-03-08 17:59:28 +01:00
private String omdbAPIKey ;
2018-03-01 15:42:47 +01:00
2018-03-02 13:50:21 +01:00
// text strings
2016-08-15 18:36:57 +02:00
private String errorPlay ;
2016-11-21 18:24:06 +01:00
private String errorLoad ;
private String errorSave ;
2016-08-14 15:17:14 +02:00
private String infoText ;
2016-08-15 18:36:57 +02:00
private String vlcNotInstalled ;
2018-03-01 15:42:47 +01:00
public double size ;
2016-08-14 15:17:14 +02:00
private int last ;
2018-03-08 17:59:28 +01:00
private int indexTable ;
private int indexList ;
2016-08-14 15:17:14 +02:00
private int next ;
2018-03-01 15:42:47 +01:00
private ResourceBundle bundle ;
2016-08-14 15:17:14 +02:00
2018-03-01 23:18:40 +01:00
private ObservableList < String > languages = FXCollections . observableArrayList ( " English (en_US) " , " Deutsch (de_DE) " ) ;
private ObservableList < String > branches = FXCollections . observableArrayList ( " stable " , " beta " ) ;
2018-03-07 23:51:02 +01:00
private ObservableList < FilmTabelDataType > filterData = FXCollections . observableArrayList ( ) ;
private ObservableList < FilmTabelDataType > filmsList = FXCollections . observableArrayList ( ) ;
2018-03-05 22:37:32 +01:00
private ObservableList < SourceDataType > sourcesList = FXCollections . observableArrayList ( ) ;
2017-07-26 17:10:37 +02:00
private ImageView skip_previous_white = new ImageView ( new Image ( " icons/ic_skip_previous_white_18dp_1x.png " ) ) ;
private ImageView skip_previous_black = new ImageView ( new Image ( " icons/ic_skip_previous_black_18dp_1x.png " ) ) ;
private ImageView skip_next_white = new ImageView ( new Image ( " icons/ic_skip_next_white_18dp_1x.png " ) ) ;
private ImageView skip_next_black = new ImageView ( new Image ( " icons/ic_skip_next_black_18dp_1x.png " ) ) ;
private ImageView play_arrow_white = new ImageView ( new Image ( " icons/ic_play_arrow_white_18dp_1x.png " ) ) ;
private ImageView play_arrow_black = new ImageView ( new Image ( " icons/ic_play_arrow_black_18dp_1x.png " ) ) ;
2016-08-14 15:17:14 +02:00
private DirectoryChooser directoryChooser = new DirectoryChooser ( ) ;
2017-01-06 00:04:07 +01:00
private MenuItem like = new MenuItem ( " like " ) ;
private MenuItem dislike = new MenuItem ( " dislike " ) ; //TODO one option (like or dislike)
2017-02-09 20:39:43 +01:00
private ContextMenu menu = new ContextMenu ( like , dislike ) ;
2018-03-05 22:37:32 +01:00
private Properties props = new Properties ( ) ;
2016-08-14 15:17:14 +02:00
2017-03-20 22:32:54 +01:00
private Main main ;
2018-03-08 17:59:28 +01:00
private MainWindowController mainWindowController ;
2018-03-01 15:42:47 +01:00
private UpdateController updateController ;
2018-03-08 17:59:28 +01:00
private OMDbAPIController omdbAPIController ;
2018-03-07 23:51:02 +01:00
private DBController dbController ;
2016-12-01 18:24:58 +01:00
2018-03-05 22:37:32 +01:00
/ * *
* " Main " Method called in Main . java main ( ) when starting
2017-04-30 23:17:55 +02:00
* Initialize other objects : Updater , dbController and ApiQuery
* /
2017-03-05 18:29:24 +01:00
void setMain ( Main main ) {
2017-03-20 22:32:54 +01:00
this . main = main ;
2018-03-08 17:59:28 +01:00
mainWindowController = this ;
2018-03-01 15:42:47 +01:00
dbController = new DBController ( this . main , this ) ;
2018-03-08 17:59:28 +01:00
omdbAPIController = new OMDbAPIController ( this , dbController , this . main ) ;
2016-08-14 15:17:14 +02:00
}
2018-03-01 15:42:47 +01:00
void init ( ) {
loadSettings ( ) ;
checkAutoUpdate ( ) ;
initTabel ( ) ;
initActions ( ) ;
2018-03-04 20:07:43 +01:00
initUI ( ) ;
2018-03-01 15:42:47 +01:00
}
2018-03-05 22:37:32 +01:00
// Initialize the tables (treeTableViewfilm and sourcesTable)
2018-03-01 16:10:37 +01:00
private void initTabel ( ) {
2016-08-14 15:17:14 +02:00
2018-03-05 22:37:32 +01:00
// film Table
columnStreamUrl . setMaxWidth ( 0 ) ;
2018-03-07 00:20:14 +01:00
columnTitle . setMaxWidth ( 215 ) ;
2018-03-09 20:12:03 +01:00
columnFavorite . setMaxWidth ( 60 ) ;
2018-03-07 00:20:14 +01:00
columnSeason . setMaxWidth ( 55 ) ;
columnEpisode . setMaxWidth ( 64 ) ;
2018-03-09 20:12:03 +01:00
columnFavorite . setStyle ( " -fx-alignment: CENTER; " ) ;
2018-03-05 22:37:32 +01:00
2018-03-07 23:51:02 +01:00
filmsTreeTable . setRoot ( filmRoot ) ;
filmsTreeTable . setColumnResizePolicy ( TreeTableView . CONSTRAINED_RESIZE_POLICY ) ;
filmsTreeTable . setShowRoot ( false ) ;
2018-03-05 22:37:32 +01:00
// write content into cell
columnStreamUrl . setCellValueFactory ( cellData - > cellData . getValue ( ) . getValue ( ) . streamUrlProperty ( ) ) ;
2018-03-08 17:59:28 +01:00
columnTitle . setCellValueFactory ( cellData - > cellData . getValue ( ) . getValue ( ) . titleProperty ( ) ) ;
2018-03-09 20:12:03 +01:00
columnSeason . setCellValueFactory ( cellData - > cellData . getValue ( ) . getValue ( ) . seasonProperty ( ) ) ;
columnEpisode . setCellValueFactory ( cellData - > cellData . getValue ( ) . getValue ( ) . episodeProperty ( ) ) ;
columnFavorite . setCellValueFactory ( cellData - > cellData . getValue ( ) . getValue ( ) . imageProperty ( ) ) ;
2018-03-05 22:37:32 +01:00
// add columns to treeTableViewfilm
2018-03-07 23:51:02 +01:00
filmsTreeTable . getColumns ( ) . add ( columnStreamUrl ) ;
filmsTreeTable . getColumns ( ) . add ( columnTitle ) ;
2018-03-09 20:12:03 +01:00
filmsTreeTable . getColumns ( ) . add ( columnFavorite ) ;
2018-03-07 23:51:02 +01:00
filmsTreeTable . getColumns ( ) . add ( columnSeason ) ;
filmsTreeTable . getColumns ( ) . add ( columnEpisode ) ;
2018-03-08 17:59:28 +01:00
filmsTreeTable . getColumns ( ) . get ( 0 ) . setVisible ( false ) ; //hide columnStreamUrl (important)
2016-08-14 15:17:14 +02:00
2018-03-05 22:37:32 +01:00
// context menu for treeTableViewfilm
2018-03-07 23:51:02 +01:00
filmsTreeTable . setContextMenu ( menu ) ;
2018-03-04 20:07:43 +01:00
// sourcesTreeTable
2018-03-05 22:37:32 +01:00
sourceColumn . setCellValueFactory ( cellData - > cellData . getValue ( ) . pathProperty ( ) ) ;
modeColumn . setCellValueFactory ( cellData - > cellData . getValue ( ) . modeProperty ( ) ) ;
2018-03-04 20:07:43 +01:00
sourcesTable . setItems ( sourcesList ) ;
2016-09-09 20:41:20 +02:00
}
2017-01-06 00:04:07 +01:00
//Initializing the actions
2018-03-04 20:07:43 +01:00
private void initActions ( ) {
2017-06-07 01:42:18 +02:00
HamburgerBackArrowBasicTransition burgerTask = new HamburgerBackArrowBasicTransition ( menuHam ) ;
2018-03-04 20:07:43 +01:00
menuHam . addEventHandler ( MouseEvent . MOUSE_PRESSED , ( e ) - > {
if ( menuTrue = = false ) {
2017-06-07 01:42:18 +02:00
sideMenuSlideIn ( ) ;
burgerTask . setRate ( 1 . 0 ) ;
burgerTask . play ( ) ;
menuTrue = true ;
2018-03-04 20:07:43 +01:00
} else {
2017-06-07 01:42:18 +02:00
sideMenuSlideOut ( ) ;
burgerTask . setRate ( - 1 . 0 ) ;
burgerTask . play ( ) ;
menuTrue = false ;
}
2018-03-04 20:07:43 +01:00
if ( settingsTrue = = true ) {
2018-03-01 23:18:40 +01:00
settingsScrollPane . setVisible ( false ) ;
2017-06-07 01:42:18 +02:00
saveSettings ( ) ;
settingsTrue = false ;
}
} ) ;
2018-03-04 20:07:43 +01:00
2018-03-01 23:18:40 +01:00
searchTextField . textProperty ( ) . addListener ( new ChangeListener < String > ( ) {
2018-03-04 20:07:43 +01:00
@Override
public void changed ( ObservableValue < ? extends String > observable , String oldValue , String newValue ) {
2018-03-05 22:37:32 +01:00
ObservableList < FilmTabelDataType > helpData ;
2018-03-04 20:07:43 +01:00
filterData . removeAll ( filterData ) ;
2018-03-05 22:37:32 +01:00
filmRoot . getChildren ( ) . removeAll ( filmRoot . getChildren ( ) ) ;
2018-03-04 20:07:43 +01:00
2018-03-07 23:51:02 +01:00
helpData = filmsList ;
2018-03-07 00:20:14 +01:00
2018-03-04 20:07:43 +01:00
for ( int i = 0 ; i < helpData . size ( ) ; i + + ) {
if ( helpData . get ( i ) . getTitle ( ) . toLowerCase ( ) . contains ( searchTextField . getText ( ) . toLowerCase ( ) ) ) {
filterData . add ( helpData . get ( i ) ) ; // add data from newDaten to filteredData where title contains search input
}
}
for ( int i = 0 ; i < filterData . size ( ) ; i + + ) {
2018-03-05 22:37:32 +01:00
filmRoot . getChildren ( ) . add ( new TreeItem < FilmTabelDataType > ( filterData . get ( i ) ) ) ; // add filtered data to root node after search
2018-03-04 20:07:43 +01:00
}
if ( searchTextField . getText ( ) . hashCode ( ) = = hashA ) {
setColor ( " 000000 " ) ;
applyColor ( ) ;
}
}
} ) ;
2016-10-09 18:35:55 +02:00
2018-03-04 20:07:43 +01:00
languageChoisBox . getSelectionModel ( ) . selectedIndexProperty ( ) . addListener ( new ChangeListener < Number > ( ) {
@Override
public void changed ( ObservableValue < ? extends Number > ov , Number value , Number new_value ) {
String local = languageChoisBox . getItems ( ) . get ( ( int ) new_value ) . toString ( ) ;
local = local . substring ( local . length ( ) - 6 , local . length ( ) - 1 ) ; // reading only en_US from English (en_US)
setLocal ( local ) ;
setLocalUI ( ) ;
saveSettings ( ) ;
}
} ) ;
branchChoisBox . getSelectionModel ( ) . selectedIndexProperty ( ) . addListener ( new ChangeListener < Number > ( ) {
2018-03-01 23:18:40 +01:00
@Override
public void changed ( ObservableValue < ? extends Number > ov , Number value , Number new_value ) {
if ( branchChoisBox . getItems ( ) . get ( ( int ) new_value ) . toString ( ) = = " beta " ) {
setUseBeta ( true ) ;
} else {
setUseBeta ( false ) ;
}
saveSettings ( ) ;
}
} ) ;
2018-03-04 20:07:43 +01:00
fontsizeSlider . valueProperty ( ) . addListener ( new ChangeListener < Number > ( ) {
@Override
public void changed ( ObservableValue < ? extends Number > ov , Number old_val , Number new_val ) {
setSize ( fontsizeSlider . getValue ( ) ) ;
2018-03-05 22:37:32 +01:00
if ( title ! = null ) {
dbController . readCache ( streamUrl ) ;
2017-03-09 22:26:37 +01:00
}
2018-03-04 20:07:43 +01:00
// ta1.setFont(Font.font("System", size));
2017-03-05 18:29:24 +01:00
saveSettings ( ) ;
2018-03-04 20:07:43 +01:00
}
} ) ;
2017-01-06 00:04:07 +01:00
2018-03-04 20:07:43 +01:00
like . setOnAction ( new EventHandler < ActionEvent > ( ) {
@Override
public void handle ( ActionEvent event ) {
2018-03-05 22:37:32 +01:00
dbController . like ( streamUrl ) ;
2018-03-08 17:59:28 +01:00
dbController . refresh ( streamUrl , indexList ) ;
2017-01-06 00:04:07 +01:00
refreshTable ( ) ;
2016-09-09 20:41:20 +02:00
}
2018-03-04 20:07:43 +01:00
} ) ;
2017-01-06 00:04:07 +01:00
2018-03-04 20:07:43 +01:00
dislike . setOnAction ( new EventHandler < ActionEvent > ( ) {
@Override
public void handle ( ActionEvent event ) {
2018-03-05 22:37:32 +01:00
dbController . dislike ( streamUrl ) ;
2018-03-08 17:59:28 +01:00
dbController . refresh ( streamUrl , indexList ) ;
2017-01-06 00:04:07 +01:00
refreshTable ( ) ;
2016-09-09 20:41:20 +02:00
}
2018-03-04 20:07:43 +01:00
} ) ;
2017-03-05 18:29:24 +01:00
2018-03-04 20:07:43 +01:00
/ * *
* FIXME fix bug when sort by ASCENDING , wrong order
* /
2018-03-09 20:12:03 +01:00
columnFavorite . sortTypeProperty ( ) . addListener ( new ChangeListener < SortType > ( ) {
2018-03-04 20:07:43 +01:00
@Override
2018-03-05 22:37:32 +01:00
public void changed ( ObservableValue < ? extends SortType > paramObservableValue , SortType paramT1 , SortType paramT2 ) {
2018-03-04 20:07:43 +01:00
LOGGER . info ( " NAME Clicked -- sortType = " + paramT1 + " , SortType= " + paramT2 ) ;
ArrayList < Integer > fav_true = new ArrayList < Integer > ( ) ;
ArrayList < Integer > fav_false = new ArrayList < Integer > ( ) ;
2018-03-05 22:37:32 +01:00
ObservableList < FilmTabelDataType > helpData ;
2018-03-04 20:07:43 +01:00
filterData . removeAll ( filterData ) ;
// treeTableViewfilm.getSelectionModel().clearSelection(selected);
2018-03-05 22:37:32 +01:00
filmRoot . getChildren ( ) . removeAll ( filmRoot . getChildren ( ) ) ;
2018-03-04 20:07:43 +01:00
2018-03-07 23:51:02 +01:00
helpData = filmsList ;
2018-03-04 20:07:43 +01:00
for ( int i = 0 ; i < helpData . size ( ) ; i + + ) {
2018-03-09 20:12:03 +01:00
if ( helpData . get ( i ) . getFavorite ( ) = = true ) {
2018-03-04 20:07:43 +01:00
fav_true . add ( i ) ;
} else {
fav_false . add ( i ) ;
}
}
if ( paramT2 . toString ( ) . equals ( " DESCENDING " ) ) {
LOGGER . info ( " Absteigend " ) ; // Debug, delete?
for ( int i = 0 ; i < fav_true . size ( ) ; i + + ) {
filterData . add ( helpData . get ( fav_true . get ( i ) ) ) ;
}
for ( int i = 0 ; i < fav_false . size ( ) ; i + + ) {
filterData . add ( helpData . get ( fav_false . get ( i ) ) ) ;
}
} else {
for ( int i = 0 ; i < fav_false . size ( ) ; i + + ) {
filterData . add ( helpData . get ( fav_false . get ( i ) ) ) ;
}
for ( int i = 0 ; i < fav_true . size ( ) ; i + + ) {
filterData . add ( helpData . get ( fav_true . get ( i ) ) ) ;
}
}
LOGGER . info ( filterData . size ( ) ) ; // Debug, delete?
for ( int i = 0 ; i < filterData . size ( ) ; i + + ) {
// LOGGER.info(filterData.get(i).getTitle()+"; "+filterData.get(i).getRating()); // Debugging
2018-03-05 22:37:32 +01:00
// add filtered data to root node after search
filmRoot . getChildren ( ) . add ( new TreeItem < FilmTabelDataType > ( filterData . get ( i ) ) ) ;
2018-03-04 20:07:43 +01:00
}
}
} ) ;
// Change-listener for treeTableViewfilm
2018-03-07 23:51:02 +01:00
filmsTreeTable . getSelectionModel ( ) . selectedItemProperty ( ) . addListener ( new ChangeListener < Object > ( ) {
2018-03-04 20:07:43 +01:00
@Override
public void changed ( ObservableValue < ? > observable , Object oldVal , Object newVal ) {
2018-03-08 17:59:28 +01:00
indexTable = filmsTreeTable . getSelectionModel ( ) . getSelectedIndex ( ) ; // get selected item
last = indexTable - 1 ;
next = indexTable + 1 ;
title = columnTitle . getCellData ( indexTable ) ; // get name of selected item
streamUrl = columnStreamUrl . getCellData ( indexTable ) ; // get file path of selected item
2018-03-08 23:01:07 +01:00
for ( FilmTabelDataType helpData : filmsList ) {
if ( helpData . getStreamUrl ( ) . equals ( streamUrl ) ) {
indexList = filmsList . indexOf ( helpData ) ;
}
}
2018-03-08 17:59:28 +01:00
if ( filmsList . get ( indexList ) . getCached ( ) ) {
2018-03-07 00:20:14 +01:00
LOGGER . info ( " loading from cache: " + title ) ;
dbController . readCache ( streamUrl ) ;
2018-03-04 20:07:43 +01:00
} else {
2018-03-08 17:59:28 +01:00
omdbAPIController = new OMDbAPIController ( mainWindowController , dbController , main ) ;
Thread omdbAPIThread = new Thread ( omdbAPIController ) ;
omdbAPIThread . setName ( " OMDbAPI " ) ;
omdbAPIThread . start ( ) ;
2018-03-04 20:07:43 +01:00
}
}
} ) ;
2016-09-09 20:41:20 +02:00
}
2018-03-01 15:42:47 +01:00
// initialize UI elements
2018-03-01 16:10:37 +01:00
private void initUI ( ) {
2018-03-01 15:42:47 +01:00
debugBtn . setDisable ( true ) ; // debugging button for tests
2017-02-09 20:39:43 +01:00
debugBtn . setVisible ( false ) ;
2018-03-01 15:42:47 +01:00
2018-03-02 13:50:21 +01:00
versionLbl . setText ( " Version: " + version + " (Build: " + buildNumber + " ) " ) ;
2018-03-01 23:18:40 +01:00
fontsizeSlider . setValue ( getSize ( ) ) ;
colorPicker . setValue ( Color . valueOf ( getColor ( ) ) ) ;
2018-03-01 15:42:47 +01:00
updateBtn . setFont ( Font . font ( " System " , 12 ) ) ;
autoUpdateToggleBtn . setSelected ( isAutoUpdate ( ) ) ;
2018-03-01 23:18:40 +01:00
languageChoisBox . setItems ( languages ) ;
branchChoisBox . setItems ( branches ) ;
if ( isUseBeta ( ) ) {
branchChoisBox . getSelectionModel ( ) . select ( 1 ) ;
} else {
branchChoisBox . getSelectionModel ( ) . select ( 0 ) ;
}
2017-02-09 20:39:43 +01:00
2018-03-01 15:42:47 +01:00
setLocalUI ( ) ;
applyColor ( ) ;
2017-02-09 20:39:43 +01:00
}
2018-03-01 16:10:37 +01:00
@FXML
2018-03-06 20:41:52 +01:00
private void playbtnclicked ( ) {
2018-03-07 00:20:14 +01:00
// TODO rework when #19 is coming
if ( System . getProperty ( " os.name " ) . contains ( " Linux " ) ) {
String line ;
String output = " " ;
Process p ;
try {
p = Runtime . getRuntime ( ) . exec ( " which vlc " ) ;
BufferedReader input = new BufferedReader ( new InputStreamReader ( p . getInputStream ( ) ) ) ;
while ( ( line = input . readLine ( ) ) ! = null ) {
output = line ;
}
LOGGER . info ( output ) ;
input . close ( ) ;
} catch ( IOException e1 ) {
e1 . printStackTrace ( ) ;
2018-03-01 16:10:37 +01:00
}
2018-03-07 00:20:14 +01:00
if ( output . contains ( " which: no vlc " ) | | output = = " " ) {
JFXInfoDialog vlcInfoDialog = new JFXInfoDialog ( " Info " , vlcNotInstalled , dialogBtnStyle , 350 , 200 , main . getPane ( ) ) ;
vlcInfoDialog . show ( ) ;
} else {
2018-03-01 16:10:37 +01:00
try {
2018-03-07 00:20:14 +01:00
Runtime . getRuntime ( ) . exec ( new String [ ] { " vlc " , streamUrl } ) ; // TODO switch to ProcessBuilder
} catch ( IOException e ) {
showErrorMsg ( errorPlay , e ) ;
2018-03-01 16:10:37 +01:00
}
2018-03-07 00:20:14 +01:00
}
} else if ( System . getProperty ( " os.name " ) . contains ( " Windows " ) | | System . getProperty ( " os.name " ) . contains ( " Mac OS X " ) ) {
try {
Desktop . getDesktop ( ) . open ( new File ( streamUrl ) ) ;
} catch ( IOException e ) {
showErrorMsg ( errorPlay , e ) ;
}
} else {
LOGGER . error ( System . getProperty ( " os.name " ) + " , OS is not supported, please contact a developer! " ) ;
2018-03-01 16:10:37 +01:00
}
}
@FXML
2018-03-04 20:19:46 +01:00
private void openfolderbtnclicked ( ) {
2018-03-05 22:37:32 +01:00
String dest = new File ( streamUrl ) . getParentFile ( ) . getAbsolutePath ( ) ;
2018-03-04 20:19:46 +01:00
if ( ! System . getProperty ( " os.name " ) . contains ( " Linux " ) ) {
try {
Desktop . getDesktop ( ) . open ( new File ( dest ) ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
2018-03-01 16:10:37 +01:00
}
@FXML
private void returnBtnclicked ( ) {
2018-03-07 23:51:02 +01:00
filmsTreeTable . getSelectionModel ( ) . select ( last ) ;
2018-03-01 16:10:37 +01:00
}
@FXML
private void forwardBtnclicked ( ) {
2018-03-07 23:51:02 +01:00
filmsTreeTable . getSelectionModel ( ) . select ( next ) ;
2018-03-01 16:10:37 +01:00
}
@FXML
2018-03-02 13:50:21 +01:00
private void aboutBtnAction ( ) {
String bodyText = " cemu_UI by @Seil0 \ nVersion: " + version + " (Build: " + buildNumber + " ) \" "
+ versionName + " \" \ n " + infoText ;
JFXInfoDialog aboutDialog = new JFXInfoDialog ( " Project HomeFlix " , bodyText , dialogBtnStyle , 350 , 200 , main . getPane ( ) ) ;
aboutDialog . show ( ) ;
2018-03-01 16:10:37 +01:00
}
@FXML
private void settingsBtnclicked ( ) {
if ( settingsTrue = = false ) {
2018-03-01 23:18:40 +01:00
settingsScrollPane . setVisible ( true ) ;
2018-03-01 16:10:37 +01:00
settingsTrue = true ;
} else {
2018-03-01 23:18:40 +01:00
settingsScrollPane . setVisible ( false ) ;
2018-03-01 16:10:37 +01:00
saveSettings ( ) ;
settingsTrue = false ;
}
}
@FXML
private void debugBtnclicked ( ) {
//for testing
}
@FXML
2018-03-04 20:07:43 +01:00
private void addDirectoryBtnAction ( ) {
File selectedFolder = directoryChooser . showDialog ( null ) ;
if ( selectedFolder ! = null & & selectedFolder . exists ( ) ) {
addSource ( selectedFolder . getPath ( ) , " local " ) ;
dbController . refreshDataBase ( ) ;
} else {
LOGGER . error ( " The selected folder dosen't exist! " ) ;
}
2018-03-01 16:10:37 +01:00
}
@FXML
2018-03-04 20:07:43 +01:00
private void addStreamSourceBtnAction ( ) {
FileChooser fileChooser = new FileChooser ( ) ;
fileChooser . setTitle ( " Open Resource File " ) ;
File selectedFile = fileChooser . showOpenDialog ( main . getPrimaryStage ( ) ) ;
if ( selectedFile ! = null & & selectedFile . exists ( ) ) {
2018-03-05 12:14:54 +01:00
addSource ( selectedFile . getPath ( ) , " stream " ) ;
2018-03-04 20:07:43 +01:00
dbController . refreshDataBase ( ) ;
} else {
LOGGER . error ( " The selected file dosen't exist! " ) ;
}
2018-03-01 16:10:37 +01:00
}
@FXML
2018-03-01 23:18:40 +01:00
private void colorPickerAction ( ) {
editColor ( colorPicker . getValue ( ) . toString ( ) ) ;
2018-03-01 16:10:37 +01:00
applyColor ( ) ;
}
@FXML
private void updateBtnAction ( ) {
updateController = new UpdateController ( this , buildNumber , useBeta ) ;
Thread updateThread = new Thread ( updateController ) ;
updateThread . setName ( " Updater " ) ;
updateThread . start ( ) ;
}
@FXML
private void autoUpdateToggleBtnAction ( ) {
if ( autoUpdate ) {
setAutoUpdate ( false ) ;
} else {
setAutoUpdate ( true ) ;
}
saveSettings ( ) ;
}
2018-03-05 22:37:32 +01:00
// refresh the selected child of the root node
private void refreshTable ( ) {
2018-03-08 17:59:28 +01:00
filmRoot . getChildren ( ) . get ( indexTable ) . setValue ( filmsList . get ( indexList ) ) ;
2017-01-06 00:04:07 +01:00
}
2018-03-07 23:51:02 +01:00
/ * *
* add data from films - list to films - table
* /
2018-03-05 23:03:05 +01:00
public void addDataUI ( ) {
2018-03-07 23:51:02 +01:00
for ( FilmTabelDataType element : filmsList ) {
2018-03-09 20:12:03 +01:00
// only if the entry contains a season and a episode it's a valid series
if ( ! element . getSeason ( ) . isEmpty ( ) & & ! element . getEpisode ( ) . isEmpty ( ) ) {
2018-03-07 00:20:14 +01:00
// System.out.println("Found Series: " + element.getTitle());
// check if there is a series node to add the item
for ( int i = 0 ; i < filmRoot . getChildren ( ) . size ( ) ; i + + ) {
if ( filmRoot . getChildren ( ) . get ( i ) . getValue ( ) . getTitle ( ) . equals ( element . getTitle ( ) ) ) {
// System.out.println("Found a root node to add child");
// System.out.println("Adding: " + element.getStreamUrl());
TreeItem < FilmTabelDataType > episodeNode = new TreeItem < > ( new FilmTabelDataType ( element . getStreamUrl ( ) ,
2018-03-09 20:12:03 +01:00
element . getTitle ( ) , element . getSeason ( ) , element . getEpisode ( ) , element . getFavorite ( ) ,
2018-03-07 00:20:14 +01:00
element . getCached ( ) , element . getImage ( ) ) ) ;
filmRoot . getChildren ( ) . get ( i ) . getChildren ( ) . add ( episodeNode ) ;
} else if ( i = = filmRoot . getChildren ( ) . size ( ) - 1 ) {
// System.out.println("Create a root node to add child");
// System.out.println("Adding: " + element.getStreamUrl());
TreeItem < FilmTabelDataType > seriesRootNode = new TreeItem < > ( new FilmTabelDataType ( element . getStreamUrl ( ) ,
2018-03-09 20:12:03 +01:00
element . getTitle ( ) , " " , " " , element . getFavorite ( ) , element . getCached ( ) , element . getImage ( ) ) ) ;
2018-03-07 00:20:14 +01:00
filmRoot . getChildren ( ) . add ( seriesRootNode ) ;
2018-03-06 20:41:52 +01:00
}
}
2018-03-07 00:20:14 +01:00
} else {
filmRoot . getChildren ( ) . add ( new TreeItem < FilmTabelDataType > ( element ) ) ; // add data to root-node
2016-09-09 20:41:20 +02:00
}
2016-08-14 15:17:14 +02:00
}
}
2018-03-05 23:03:05 +01:00
// add a source to the sources table on the settings pane
2018-03-04 20:07:43 +01:00
public void addSourceToTable ( String path , String mode ) {
2018-03-05 22:37:32 +01:00
sourcesList . add ( new SourceDataType ( path , mode ) ) ;
2018-03-07 23:51:02 +01:00
sourceRoot . getChildren ( ) . add ( new TreeItem < SourceDataType > ( sourcesList . get ( sourcesList . size ( ) - 1 ) ) ) ; // adds data to root-node
2016-09-09 20:41:20 +02:00
}
2018-02-24 17:13:52 +01:00
2018-03-05 23:03:05 +01:00
// add a source to the newsources list
2018-03-04 20:07:43 +01:00
public void addSource ( String path , String mode ) {
JsonObject source = null ;
JsonArray newsources = null ;
try {
// read old array
newsources = Json . parse ( new FileReader ( main . getDirectory ( ) + " /sources.json " ) ) . asArray ( ) ;
// add new source
Writer writer = new FileWriter ( main . getDirectory ( ) + " /sources.json " ) ;
source = Json . object ( ) . add ( " path " , path ) . add ( " mode " , mode ) ;
newsources . add ( source ) ;
newsources . writeTo ( writer ) ;
writer . close ( ) ;
} catch ( IOException e ) {
LOGGER . error ( e ) ;
}
2016-08-14 15:17:14 +02:00
}
2017-02-09 20:39:43 +01:00
//set color of UI-Elements
2018-03-01 16:10:37 +01:00
private void applyColor ( ) {
2018-02-24 17:13:52 +01:00
String style = " -fx-background-color: # " + getColor ( ) + " ; " ;
String btnStyleBlack = " -fx-button-type: RAISED; -fx-background-color: # " + getColor ( ) + " ; -fx-text-fill: BLACK; " ;
String btnStyleWhite = " -fx-button-type: RAISED; -fx-background-color: # " + getColor ( ) + " ; -fx-text-fill: WHITE; " ;
BigInteger icolor = new BigInteger ( getColor ( ) , 16 ) ;
BigInteger ccolor = new BigInteger ( " 78909cff " , 16 ) ;
2016-10-09 16:05:44 +02:00
sideMenuVBox . setStyle ( style ) ;
topHBox . setStyle ( style ) ;
2018-03-01 23:18:40 +01:00
searchTextField . setFocusColor ( Color . valueOf ( getColor ( ) ) ) ;
2018-02-24 17:13:52 +01:00
if ( icolor . compareTo ( ccolor ) = = - 1 ) {
2018-03-02 13:50:21 +01:00
dialogBtnStyle = btnStyleWhite ;
2016-08-14 15:17:14 +02:00
settingsBtn . setStyle ( " -fx-text-fill: WHITE; " ) ;
2018-03-02 13:50:21 +01:00
aboutBtn . setStyle ( " -fx-text-fill: WHITE; " ) ;
2016-10-09 16:05:44 +02:00
debugBtn . setStyle ( " -fx-text-fill: WHITE; " ) ;
2018-03-04 20:07:43 +01:00
addDirectoryBtn . setStyle ( btnStyleWhite ) ;
addStreamSourceBtn . setStyle ( btnStyleWhite ) ;
2016-11-21 18:24:06 +01:00
updateBtn . setStyle ( btnStyleWhite ) ;
playbtn . setStyle ( btnStyleWhite ) ;
openfolderbtn . setStyle ( btnStyleWhite ) ;
returnBtn . setStyle ( btnStyleWhite ) ;
forwardBtn . setStyle ( btnStyleWhite ) ;
playbtn . setGraphic ( play_arrow_white ) ;
returnBtn . setGraphic ( skip_previous_white ) ;
forwardBtn . setGraphic ( skip_next_white ) ;
2017-06-07 01:42:18 +02:00
menuHam . getStyleClass ( ) . add ( " jfx-hamburgerW " ) ;
2018-02-24 17:13:52 +01:00
} else {
2018-03-02 13:50:21 +01:00
dialogBtnStyle = btnStyleBlack ;
2016-08-14 15:17:14 +02:00
settingsBtn . setStyle ( " -fx-text-fill: BLACK; " ) ;
2018-03-02 13:50:21 +01:00
aboutBtn . setStyle ( " -fx-text-fill: BLACK; " ) ;
2016-10-09 16:05:44 +02:00
debugBtn . setStyle ( " -fx-text-fill: BLACK; " ) ;
2018-03-04 20:07:43 +01:00
addDirectoryBtn . setStyle ( btnStyleBlack ) ;
addStreamSourceBtn . setStyle ( btnStyleBlack ) ;
2016-11-21 18:24:06 +01:00
updateBtn . setStyle ( btnStyleBlack ) ;
playbtn . setStyle ( btnStyleBlack ) ;
openfolderbtn . setStyle ( btnStyleBlack ) ;
returnBtn . setStyle ( btnStyleBlack ) ;
forwardBtn . setStyle ( btnStyleBlack ) ;
playbtn . setGraphic ( play_arrow_black ) ;
returnBtn . setGraphic ( skip_previous_black ) ;
forwardBtn . setGraphic ( skip_next_black ) ;
2017-06-07 01:42:18 +02:00
menuHam . getStyleClass ( ) . add ( " jfx-hamburgerB " ) ;
2016-08-14 15:17:14 +02:00
}
}
2018-03-04 20:07:43 +01:00
// slide in in 400ms
2018-02-24 17:13:52 +01:00
private void sideMenuSlideIn ( ) {
2016-10-10 16:55:26 +02:00
sideMenuVBox . setVisible ( true ) ;
TranslateTransition translateTransition = new TranslateTransition ( Duration . millis ( 400 ) , sideMenuVBox ) ;
translateTransition . setFromX ( - 150 ) ;
translateTransition . setToX ( 0 ) ;
2018-03-04 20:07:43 +01:00
translateTransition . play ( ) ;
2016-10-10 16:55:26 +02:00
}
2016-08-14 15:17:14 +02:00
2018-03-04 20:07:43 +01:00
// slide out in 400ms
2018-02-24 17:13:52 +01:00
private void sideMenuSlideOut ( ) {
2016-10-10 16:55:26 +02:00
TranslateTransition translateTransition = new TranslateTransition ( Duration . millis ( 400 ) , sideMenuVBox ) ;
translateTransition . setFromX ( 0 ) ;
translateTransition . setToX ( - 150 ) ;
2018-03-04 20:07:43 +01:00
translateTransition . play ( ) ;
2016-10-10 16:55:26 +02:00
}
2016-08-14 15:17:14 +02:00
2018-02-24 17:13:52 +01:00
void setLocalUI ( ) {
switch ( getLocal ( ) ) {
case " en_US " :
2018-03-01 15:42:47 +01:00
setBundle ( ResourceBundle . getBundle ( " locals.HomeFlix-Local " , Locale . US ) ) ; // us_English
2018-03-01 23:18:40 +01:00
languageChoisBox . getSelectionModel ( ) . select ( 0 ) ;
2017-02-09 20:39:43 +01:00
break ;
2018-02-24 17:13:52 +01:00
case " de_DE " :
2018-03-01 15:42:47 +01:00
setBundle ( ResourceBundle . getBundle ( " locals.HomeFlix-Local " , Locale . GERMAN ) ) ; // German
2018-03-01 23:18:40 +01:00
languageChoisBox . getSelectionModel ( ) . select ( 1 ) ;
2017-02-09 20:39:43 +01:00
break ;
2018-02-24 17:13:52 +01:00
default :
2018-03-01 15:42:47 +01:00
setBundle ( ResourceBundle . getBundle ( " locals.HomeFlix-Local " , Locale . US ) ) ; // default local
2018-03-01 23:18:40 +01:00
languageChoisBox . getSelectionModel ( ) . select ( 0 ) ;
2017-02-09 20:39:43 +01:00
break ;
2018-02-24 17:13:52 +01:00
}
2018-03-02 13:50:21 +01:00
aboutBtn . setText ( getBundle ( ) . getString ( " info " ) ) ;
2018-03-01 15:42:47 +01:00
settingsBtn . setText ( getBundle ( ) . getString ( " settings " ) ) ;
2018-03-01 23:18:40 +01:00
searchTextField . setPromptText ( getBundle ( ) . getString ( " tfSearch " ) ) ;
2018-03-01 15:42:47 +01:00
openfolderbtn . setText ( getBundle ( ) . getString ( " openFolder " ) ) ;
updateBtn . setText ( getBundle ( ) . getString ( " checkUpdates " ) ) ;
2018-03-04 20:07:43 +01:00
addDirectoryBtn . setText ( getBundle ( ) . getString ( " addDirectory " ) ) ;
addStreamSourceBtn . setText ( getBundle ( ) . getString ( " addStreamSource " ) ) ;
2018-03-01 23:18:40 +01:00
homeflixSettingsLbl . setText ( getBundle ( ) . getString ( " homeflixSettingsLbl " ) ) ;
mainColorLbl . setText ( getBundle ( ) . getString ( " mainColorLbl " ) ) ;
fontsizeLbl . setText ( getBundle ( ) . getString ( " fontsizeLbl " ) ) ;
languageLbl . setText ( getBundle ( ) . getString ( " languageLbl " ) ) ;
autoUpdateToggleBtn . setText ( getBundle ( ) . getString ( " autoUpdate " ) ) ;
branchLbl . setText ( getBundle ( ) . getString ( " branchLbl " ) ) ;
2018-03-01 15:42:47 +01:00
columnStreamUrl . setText ( getBundle ( ) . getString ( " columnStreamUrl " ) ) ;
2018-03-09 20:12:03 +01:00
columnTitle . setText ( getBundle ( ) . getString ( " columnName " ) ) ;
2018-03-01 15:42:47 +01:00
columnSeason . setText ( getBundle ( ) . getString ( " columnSeason " ) ) ;
2018-03-09 20:12:03 +01:00
columnEpisode . setText ( getBundle ( ) . getString ( " columnEpisode " ) ) ;
columnFavorite . setText ( getBundle ( ) . getString ( " columnFavorite " ) ) ;
2018-03-01 15:42:47 +01:00
errorPlay = getBundle ( ) . getString ( " errorPlay " ) ;
errorLoad = getBundle ( ) . getString ( " errorLoad " ) ;
errorSave = getBundle ( ) . getString ( " errorSave " ) ;
2018-03-02 13:50:21 +01:00
infoText = getBundle ( ) . getString ( " infoText " ) ;
2018-03-01 15:42:47 +01:00
vlcNotInstalled = getBundle ( ) . getString ( " vlcNotInstalled " ) ;
2016-08-14 15:17:14 +02:00
}
2018-03-10 14:16:37 +01:00
// TODO remove after #19 has landed
2018-03-05 22:37:32 +01:00
public void showErrorMsg ( String msg , Exception exception ) {
2016-11-12 15:02:55 +01:00
Alert alert = new Alert ( AlertType . ERROR ) ;
2018-02-24 17:13:52 +01:00
alert . setTitle ( " Error " ) ;
alert . setHeaderText ( " " ) ;
alert . setContentText ( msg ) ;
2018-03-01 15:42:47 +01:00
alert . initOwner ( main . getPrimaryStage ( ) ) ;
2016-11-12 15:02:55 +01:00
2018-02-24 17:13:52 +01:00
// Create expandable Exception.
StringWriter sw = new StringWriter ( ) ;
PrintWriter pw = new PrintWriter ( sw ) ;
exception . printStackTrace ( pw ) ;
String exceptionText = sw . toString ( ) ;
2016-11-12 15:02:55 +01:00
2018-02-24 17:13:52 +01:00
TextArea textArea = new TextArea ( exceptionText ) ;
textArea . setEditable ( false ) ;
textArea . setWrapText ( true ) ;
2016-11-12 15:02:55 +01:00
2018-02-24 17:13:52 +01:00
textArea . setMaxWidth ( Double . MAX_VALUE ) ;
textArea . setMaxHeight ( Double . MAX_VALUE ) ;
GridPane . setVgrow ( textArea , Priority . ALWAYS ) ;
GridPane . setHgrow ( textArea , Priority . ALWAYS ) ;
2016-11-12 15:02:55 +01:00
2018-02-24 17:13:52 +01:00
GridPane expContent = new GridPane ( ) ;
expContent . setMaxWidth ( Double . MAX_VALUE ) ;
expContent . add ( textArea , 0 , 1 ) ;
// Set expandable Exception into the dialog pane.
alert . getDialogPane ( ) . setExpandableContent ( expContent ) ;
alert . showAndWait ( ) ;
LOGGER . error ( " An error occurred " , exception ) ;
2016-11-12 15:02:55 +01:00
}
2018-03-01 16:10:37 +01:00
// save settings
2018-02-24 17:13:52 +01:00
public void saveSettings ( ) {
2017-09-16 18:22:46 +02:00
LOGGER . info ( " saving settings ... " ) ;
2016-08-14 15:17:14 +02:00
try {
props . setProperty ( " color " , getColor ( ) ) ;
2017-03-25 16:20:48 +01:00
props . setProperty ( " autoUpdate " , String . valueOf ( isAutoUpdate ( ) ) ) ;
2018-03-01 23:18:40 +01:00
props . setProperty ( " useBeta " , String . valueOf ( isUseBeta ( ) ) ) ;
2016-08-14 15:17:14 +02:00
props . setProperty ( " size " , getSize ( ) . toString ( ) ) ;
2017-02-09 20:39:43 +01:00
props . setProperty ( " local " , getLocal ( ) ) ;
2018-03-09 20:12:03 +01:00
props . setProperty ( " ratingSortType " , columnFavorite . getSortType ( ) . toString ( ) ) ;
2018-03-01 16:10:37 +01:00
OutputStream outputStream = new FileOutputStream ( main . getConfigFile ( ) ) ; // new output-stream
2018-02-24 17:13:52 +01:00
props . storeToXML ( outputStream , " Project HomeFlix settings " ) ; // writes new .xml
2016-08-14 15:17:14 +02:00
outputStream . close ( ) ;
} catch ( IOException e ) {
2018-03-01 16:10:37 +01:00
LOGGER . error ( errorLoad , e ) ;
2016-08-14 15:17:14 +02:00
}
}
2018-03-01 16:10:37 +01:00
// load settings
2018-02-24 17:13:52 +01:00
public void loadSettings ( ) {
2017-09-16 18:22:46 +02:00
LOGGER . info ( " loading settings ... " ) ;
2018-03-01 16:10:37 +01:00
2016-08-14 15:17:14 +02:00
try {
2018-03-01 16:10:37 +01:00
InputStream inputStream = new FileInputStream ( main . getConfigFile ( ) ) ;
2018-02-24 17:13:52 +01:00
props . loadFromXML ( inputStream ) ; // new input-stream from .xml
2017-09-16 18:22:46 +02:00
try {
setColor ( props . getProperty ( " color " ) ) ;
} catch ( Exception e ) {
LOGGER . error ( " cloud not load color " , e ) ;
setColor ( " " ) ;
}
2018-02-24 17:13:52 +01:00
2017-09-16 18:22:46 +02:00
try {
2018-02-24 17:13:52 +01:00
setSize ( Double . parseDouble ( props . getProperty ( " size " ) ) ) ;
2017-09-16 18:22:46 +02:00
} catch ( Exception e ) {
LOGGER . error ( " cloud not load fontsize " , e ) ;
setSize ( 17 . 0 ) ;
}
2018-02-24 17:13:52 +01:00
2017-09-16 18:22:46 +02:00
try {
setAutoUpdate ( Boolean . parseBoolean ( props . getProperty ( " autoUpdate " ) ) ) ;
} catch ( Exception e ) {
LOGGER . error ( " cloud not load autoUpdate " , e ) ;
setAutoUpdate ( false ) ;
}
2018-03-01 23:18:40 +01:00
try {
setUseBeta ( Boolean . parseBoolean ( props . getProperty ( " useBeta " ) ) ) ;
} catch ( Exception e ) {
LOGGER . error ( " cloud not load autoUpdate " , e ) ;
setUseBeta ( false ) ;
}
2017-09-16 18:22:46 +02:00
try {
setLocal ( props . getProperty ( " local " ) ) ;
} catch ( Exception e ) {
LOGGER . error ( " cloud not load local " , e ) ;
2018-02-24 17:13:52 +01:00
setLocal ( System . getProperty ( " user.language " ) + " _ " + System . getProperty ( " user.country " ) ) ;
2017-09-16 18:22:46 +02:00
}
2018-02-24 17:13:52 +01:00
2017-09-16 18:22:46 +02:00
try {
setRatingSortType ( props . getProperty ( " ratingSortType " ) ) ;
} catch ( Exception e ) {
LOGGER . error ( " cloud not load autoUpdate " , e ) ;
setRatingSortType ( " " ) ;
}
2018-02-24 17:13:52 +01:00
2016-08-14 15:17:14 +02:00
inputStream . close ( ) ;
} catch ( IOException e ) {
2018-03-01 16:10:37 +01:00
LOGGER . error ( errorSave , e ) ;
2016-08-14 15:17:14 +02:00
}
2018-03-08 17:59:28 +01:00
// try loading the omdbAPI key
try {
File file = new File ( getClass ( ) . getClassLoader ( ) . getResource ( " apiKeys.json " ) . getFile ( ) ) ;
JsonObject apiKeys = Json . parse ( new FileReader ( file ) ) . asObject ( ) ;
omdbAPIKey = apiKeys . getString ( " omdbAPIKey " , " " ) ;
} catch ( Exception e ) {
LOGGER . error ( " Cloud not load the omdbAPI key. Please contact the developer! " , e ) ;
}
2016-08-14 15:17:14 +02:00
}
2018-03-01 15:42:47 +01:00
// if AutoUpdate, then check for updates
private void checkAutoUpdate ( ) {
if ( isAutoUpdate ( ) ) {
try {
LOGGER . info ( " AutoUpdate: looking for updates on startup ... " ) ;
updateController = new UpdateController ( this , buildNumber , useBeta ) ;
Thread updateThread = new Thread ( updateController ) ;
updateThread . setName ( " Updater " ) ;
updateThread . start ( ) ;
updateThread . join ( ) ;
} catch ( InterruptedException e ) {
e . printStackTrace ( ) ;
}
}
}
2018-02-24 17:13:52 +01:00
// cuts 0x of the Color-pickers return value
private void editColor ( String input ) {
2016-09-09 20:41:20 +02:00
StringBuilder sb = new StringBuilder ( input ) ;
sb . delete ( 0 , 2 ) ;
this . color = sb . toString ( ) ;
2017-03-05 18:29:24 +01:00
saveSettings ( ) ;
2016-09-09 20:41:20 +02:00
}
2018-02-24 17:13:52 +01:00
// getter and setter
2018-03-07 23:51:02 +01:00
public DBController getDbController ( ) {
return dbController ;
}
2018-02-24 17:13:52 +01:00
public void setColor ( String input ) {
2016-08-14 15:17:14 +02:00
this . color = input ;
}
2018-02-24 17:13:52 +01:00
public String getColor ( ) {
2016-08-14 15:17:14 +02:00
return color ;
}
2016-09-09 20:41:20 +02:00
2018-03-08 17:59:28 +01:00
public String getTitle ( ) {
return title ;
}
public String getStreamUrl ( ) {
return streamUrl ;
}
2018-02-24 17:13:52 +01:00
public void setSize ( Double input ) {
2016-08-14 15:17:14 +02:00
this . size = input ;
}
2018-02-24 17:13:52 +01:00
public Double getSize ( ) {
2016-08-14 15:17:14 +02:00
return size ;
}
2018-02-24 17:13:52 +01:00
2018-03-08 17:59:28 +01:00
public int getIndexTable ( ) {
return indexTable ;
}
public int getIndexList ( ) {
return indexList ;
}
2018-02-24 17:13:52 +01:00
public void setAutoUpdate ( boolean input ) {
2016-08-14 15:17:14 +02:00
this . autoUpdate = input ;
}
2018-02-24 17:13:52 +01:00
public boolean isAutoUpdate ( ) {
2016-08-14 15:17:14 +02:00
return autoUpdate ;
}
2018-02-24 17:13:52 +01:00
2018-03-01 23:18:40 +01:00
public boolean isUseBeta ( ) {
return useBeta ;
}
public void setUseBeta ( boolean useBeta ) {
this . useBeta = useBeta ;
}
2018-02-24 17:13:52 +01:00
public void setLocal ( String input ) {
2016-08-14 15:17:14 +02:00
this . local = input ;
}
2018-02-24 17:13:52 +01:00
public String getLocal ( ) {
2016-08-14 15:17:14 +02:00
return local ;
}
2018-02-24 17:13:52 +01:00
2018-03-08 17:59:28 +01:00
public String getOmdbAPIKey ( ) {
return omdbAPIKey ;
}
2018-03-07 23:51:02 +01:00
public ObservableList < FilmTabelDataType > getFilmsList ( ) {
return filmsList ;
2017-09-16 18:22:46 +02:00
}
2018-03-05 22:37:32 +01:00
public ObservableList < SourceDataType > getSourcesList ( ) {
2018-03-04 20:07:43 +01:00
return sourcesList ;
2017-09-16 18:22:46 +02:00
}
public String getRatingSortType ( ) {
return ratingSortType ;
}
public void setRatingSortType ( String ratingSortType ) {
this . ratingSortType = ratingSortType ;
}
2018-03-01 15:42:47 +01:00
public ResourceBundle getBundle ( ) {
return bundle ;
}
public void setBundle ( ResourceBundle bundle ) {
this . bundle = bundle ;
}
2018-03-08 23:01:07 +01:00
public TreeTableView < FilmTabelDataType > getFilmsTreeTable ( ) {
return filmsTreeTable ;
}
2018-03-01 15:42:47 +01:00
public TextFlow getTextFlow ( ) {
return textFlow ;
}
2018-03-07 23:51:02 +01:00
public ImageView getPosterImageView ( ) {
return posterImageView ;
2018-03-01 15:42:47 +01:00
}
public JFXButton getUpdateBtn ( ) {
return updateBtn ;
}
2018-03-05 22:37:32 +01:00
public TreeItem < FilmTabelDataType > getFilmRoot ( ) {
return filmRoot ;
}
2018-03-07 23:51:02 +01:00
public TreeItem < SourceDataType > getSourceRoot ( ) {
return sourceRoot ;
2018-03-01 15:42:47 +01:00
}
2017-01-26 16:32:47 +01:00
}