mobi_reader/MobiReader/src/mobireader/gui/ui/AppMain.java

339 lines
10 KiB
Java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package mobireader.gui.ui;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.Accordion;
import javafx.scene.control.AccordionBuilder;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBuilder;
import javafx.scene.control.CheckBox;
import javafx.scene.control.CheckBoxBuilder;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.ChoiceBoxBuilder;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.ContextMenuBuilder;
import javafx.scene.control.HyperlinkBuilder;
import javafx.scene.control.Label;
import javafx.scene.control.LabelBuilder;
import javafx.scene.control.ListView;
import javafx.scene.control.ListViewBuilder;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuBarBuilder;
import javafx.scene.control.MenuBuilder;
import javafx.scene.control.MenuButtonBuilder;
import javafx.scene.control.MenuItemBuilder;
import javafx.scene.control.PasswordField;
import javafx.scene.control.PasswordFieldBuilder;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.ProgressBarBuilder;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.ProgressIndicatorBuilder;
import javafx.scene.control.RadioButton;
import javafx.scene.control.RadioButtonBuilder;
import javafx.scene.control.ScrollBar;
import javafx.scene.control.ScrollBarBuilder;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.ScrollPaneBuilder;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.Separator;
import javafx.scene.control.Slider;
import javafx.scene.control.SliderBuilder;
import javafx.scene.control.SplitMenuButtonBuilder;
import javafx.scene.control.SplitPane;
import javafx.scene.control.SplitPaneBuilder;
import javafx.scene.control.Tab;
import javafx.scene.control.TabBuilder;
import javafx.scene.control.TabPane;
import javafx.scene.control.TabPaneBuilder;
import javafx.scene.control.TableColumnBuilder;
import javafx.scene.control.TableView;
import javafx.scene.control.TableViewBuilder;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextAreaBuilder;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFieldBuilder;
import javafx.scene.control.TitledPane;
import javafx.scene.control.TitledPaneBuilder;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleButtonBuilder;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.ToolBar;
import javafx.scene.control.ToolBarBuilder;
import javafx.scene.control.Tooltip;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeItemBuilder;
import javafx.scene.control.TreeView;
import javafx.scene.control.TreeViewBuilder;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.BorderPaneBuilder;
import javafx.scene.layout.HBoxBuilder;
import javafx.scene.layout.StackPaneBuilder;
import javafx.scene.layout.VBox;
import javafx.scene.layout.VBoxBuilder;
import javafx.scene.paint.Color;
import javafx.scene.shape.CircleBuilder;
import javafx.scene.shape.RectangleBuilder;
import javafx.scene.web.HTMLEditor;
import javafx.scene.web.HTMLEditorBuilder;
import javafx.scene.web.WebView;
import javafx.scene.web.WebViewBuilder;
import javafx.stage.Popup;
import javafx.stage.PopupBuilder;
import javafx.stage.Stage;
import mobireader.Book;
import mobireader.SqliteDatabaseHandler;
import mobireader.gui.model.GuiModel;
/**
*
* @author att
*/
public class AppMain extends Application {
// A reference to the model
GuiModel model = new GuiModel();
Stage stage;
CheckBox checkBox;
ContextMenu contextMenu;
Label htmlLabel;
Popup alertPopup;
Tab webViewTab;
ArrayList<Book> myBooks;
SqliteDatabaseHandler db = new SqliteDatabaseHandler("my_books.db");
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(final Stage primaryStage) throws ClassNotFoundException, SQLException {
myBooks = db.getAllBooks();
stage = primaryStage;
Scene scene = SceneBuilder.create()
.width(800)
.height(600)
.root(
BorderPaneBuilder.create()
.top(
VBoxBuilder.create()
.children(
createMenus()
)
.build()
)
.center(createTabs())
.build()
)
.build();
stage.setScene(scene);
stage.setTitle("Mobi reader");
stage.show();
}
MenuBar createMenus() {
MenuBar menuBar = MenuBarBuilder.create()
.menus(
MenuBuilder.create()
.text("Edit")
.items(
MenuItemBuilder.create()
.text("Cut")
.build(),
MenuItemBuilder.create()
.text("Copy")
.build(),
MenuItemBuilder.create()
.text("Paste")
.build()
)
.build()
)
.build();
return menuBar;
}
TabPane createTabs() {
final WebView webView;
TabPane tabPane = TabPaneBuilder.create()
.tabs(
TabBuilder.create()
.text("Your books")
.content(createAddedBooksView())
.closable(false)
.build(),
TabBuilder.create()
.text("Add a book")
.content(createScrollMiscDemoNode())
.closable(false)
.build()
)
.build();
return tabPane;
}
TreeItem createBookTreeItem (Book book)
{
return TreeItemBuilder.create()
.value(book.getTitle())
.children(
TreeItemBuilder.create()
.value("Author: " + book.getAuthor().getName())
.children(
TreeItemBuilder.create()
.value(book.getAuthor().provideAllInfo())
.build()
)
.build(),
TreeItemBuilder.create()
.value("Added: " + book.getTimestamp())
.build()
)
.build();
}
TreeItem createTreeViewOfBooksByAuthor(List<Book> books)
{
List<TreeItem> bookItems= new ArrayList<>();
for (Book book : books)
{
bookItems.add(createBookTreeItem(book));
}
return TreeItemBuilder.create()
.value("Root")
.children(
bookItems.get(0),
bookItems.get(1),
bookItems.get(2)
)
.build();
}
Node createAddedBooksView() {
TreeView treeView = TreeViewBuilder.create()
.minWidth(150)
.showRoot(false)
.editable(false)
.root(
createTreeViewOfBooksByAuthor(myBooks)
)
.build();
ListView listView = ListViewBuilder.create()
.items(model.listViewItems)
.build();
SplitPane splitPane = SplitPaneBuilder.create()
.items(
treeView,
listView
)
.build();
treeView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
treeView.getSelectionModel().selectedItemProperty()
.addListener(new ChangeListener() {
@Override
public void changed(ObservableValue observable, Object oldValue,
Object newValue) {
TreeItem treeItem = (TreeItem)newValue;
if (newValue != null && treeItem.isLeaf()) {
model.listViewItems.clear();
for (int i = 1; i <= 1; i++) {
model.listViewItems.add(treeItem.getValue());
}
}
}
});
return splitPane;
}
Node createScrollMiscDemoNode() {
ScrollPane scrollPane = ScrollPaneBuilder.create()
.hbarPolicy(ScrollPane.ScrollBarPolicy.NEVER)
.vbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED)
.onMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
if (me.getButton() == MouseButton.SECONDARY) {
contextMenu.show(stage, me.getScreenX(), me.getScreenY());
}
}
})
.build();
return scrollPane;
}
Popup createAlertPopup(String text) {
Button okButton;
alertPopup = PopupBuilder.create()
.content(
StackPaneBuilder.create()
.children(
RectangleBuilder.create()
.width(300)
.height(200)
.arcWidth(20)
.arcHeight(20)
.fill(Color.LIGHTBLUE)
.stroke(Color.GRAY)
.strokeWidth(2)
.build(),
BorderPaneBuilder.create()
.center(
htmlLabel = LabelBuilder.create()
.text(text)
.wrapText(true)
.maxWidth(280)
.maxHeight(140)
.build()
)
.bottom(
okButton = ButtonBuilder.create()
.text("OK")
.onAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
alertPopup.hide();
}
})
.build()
)
.build()
)
.build()
)
.build();
BorderPane.setAlignment(okButton, Pos.CENTER);
BorderPane.setMargin(okButton, new Insets(10, 0, 10, 0));
return alertPopup;
}
}