package gui; import java.beans.Beans; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Persistence; import javax.persistence.Query; import javax.persistence.RollbackException; import entity.AccessLevel; import entity.Configuration; import entity.User; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.HPos; import javafx.geometry.Pos; import javafx.geometry.VPos; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ChoiceBox; import javafx.scene.control.Label; import javafx.scene.control.ProgressBar; import javafx.scene.control.ProgressIndicator; import javafx.scene.control.Separator; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextBox; import javafx.scene.control.ToolBar; import javafx.scene.control.Tooltip; import javafx.scene.control.TableColumn.CellDataFeatures; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.MouseEvent; import javafx.scene.layout.BorderPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.util.Callback; public class UserList { private byte returnMode; private boolean returnStatus; private boolean loadingPages; private final boolean RET_CANCEL = false; private final boolean RET_OK = true; private BorderPane windowBorderPane; private BorderPane applicationBorderPane; private BorderPane mainPanelBorderPane; private Button addButton; private Button modifyButton; private Button deleteButton; private Button updateButton; private Button backwardButton; private Button forwardButton; private Button addEmailRecipientButton; private ChoiceBox accessLevelChoiceBox; private ChoiceBox pageChoiceBox; private Configuration configuration; private EntityManager trainingManager; private GridPane filterPanelGridPane; private GridPane statusPanelGridPane; private HBox logoHBox; private HBox progressHBox; private Label nameLabel; private Label cityLabel; private Label accessLevelLabel; private Label statusMessageLabel; private List accessLevelList; private List userList; private ProgressBar progressBar; private ProgressIndicator progressIndicator; private Query accessLevelQuery; private Query userQuery; private Stage stage; private Stage parentStage; private TableView resultsTableView; private TextBox nameTextBox; private TextBox cityTextBox; private ToolBar toolBar; private User user; public UserList(Stage parentStage, byte returnMode, Configuration configuration) { this.parentStage = parentStage; this.returnMode = returnMode; returnStatus = RET_CANCEL; loadingPages = false; // this.configuration = configuration; initComponents(); this.configuration = configuration; } @SuppressWarnings("unchecked") private void initComponents() { configuration = new Configuration(); trainingManager = Beans.isDesignTime() ? null : Persistence .createEntityManagerFactory("TrainingManager") .createEntityManager(); accessLevelQuery = Beans.isDesignTime() ? null : trainingManager .createQuery("SELECT a FROM AccessLevel a"); userQuery = Beans.isDesignTime() ? null : trainingManager .createQuery("SELECT u FROM User u ORDER BY u.name ASC"); userQuery.setFirstResult(0); userQuery.setMaxResults(2); accessLevelList = Beans.isDesignTime() ? java.util.Collections .emptyList() : FXCollections.observableList(accessLevelQuery .getResultList()); userList = Beans.isDesignTime() ? java.util.Collections.emptyList() : FXCollections.observableList(userQuery.getResultList()); windowBorderPane = new BorderPane(); applicationBorderPane = new BorderPane(); mainPanelBorderPane = new BorderPane(); addButton = new Button("Añadir", new ImageView(new Image(getClass() .getResourceAsStream("resources/icons/32/add.png")))); addButton.setTooltip(new Tooltip("Añadir Nuevo Usuario")); addButton.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { newRegister(); } }); modifyButton = new Button("Modificar", new ImageView(new Image( getClass().getResourceAsStream("resources/icons/32/tool.png")))); modifyButton.setTooltip(new Tooltip("Modificar Usuario Seleccionado")); deleteButton = new Button("Eliminar", new ImageView(new Image( getClass().getResourceAsStream("resources/icons/32/del.png")))); deleteButton.setTooltip(new Tooltip("Eliminar Usuario Seleccionado")); updateButton = new Button("Actualizar", new ImageView(new Image(getClass().getResourceAsStream( "resources/icons/32/refresh.png")))); updateButton.setTooltip(new Tooltip("Actualizar Lista de Usuarios")); updateButton.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { update(); } }); backwardButton = new Button("Página Anterior", new ImageView(new Image( getClass().getResourceAsStream( "resources/icons/32/object_06.png")))); backwardButton.setTooltip(new Tooltip("Página Anterior")); backwardButton.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { int previousPage = pageChoiceBox.getSelectionModel() .getSelectedIndex() - 1; if ((previousPage >= 0)) { pageChoiceBox.getSelectionModel().selectPrevious(); } } }); forwardButton = new Button("Página Siguiente", new ImageView(new Image( getClass().getResourceAsStream( "resources/icons/32/object_07.png")))); forwardButton.setTooltip(new Tooltip("Página Siguiente")); forwardButton.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { int nextPage = pageChoiceBox.getSelectionModel() .getSelectedIndex() + 1; int lastPage = pageChoiceBox.getItems().size() - 1; if ((nextPage <= lastPage)) { pageChoiceBox.getSelectionModel().selectNext(); } } }); addEmailRecipientButton = new Button("Añadir Destinatarios", new ImageView(new Image(getClass().getResourceAsStream( "resources/icons/32/email.png")))); addEmailRecipientButton.setTooltip(new Tooltip( "Añadir Usuarios Seleccionados\n a la Lista de Destinatarios")); accessLevelChoiceBox = new ChoiceBox(); /* * accessLevelChoiceBox = new * ChoiceBox(FXCollections.observableArrayList("Administrador", * "Gerente", "Contable", "Administrativo", "Agente Comercial")); */ for (AccessLevel al : accessLevelList) { accessLevelChoiceBox.getItems().add(al.getName()); } /* * org.jdesktop.swingbinding.JComboBoxBinding jComboBoxBinding = * org.jdesktop.swingbinding.SwingBindings .createJComboBoxBinding( * org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, * accessLevelList, accessLevelChoiceBox); */ pageChoiceBox = new ChoiceBox(); pageChoiceBox.getSelectionModel().selectFirst(); pageChoiceBox.getSelectionModel().selectedIndexProperty() .addListener(new ChangeListener() { public void changed(ObservableValue ov, Number value, Number new_value) { showPage(); } }); filterPanelGridPane = new GridPane(); filterPanelGridPane.setHgap(10); filterPanelGridPane.setVgap(10); filterPanelGridPane.setAlignment(Pos.CENTER); statusPanelGridPane = new GridPane(); statusPanelGridPane.setHgap(10); statusPanelGridPane.setVgap(10); statusPanelGridPane.setAlignment(Pos.CENTER_RIGHT); logoHBox = new HBox(); logoHBox.setSpacing(5); logoHBox.setAlignment(Pos.CENTER_LEFT); logoHBox.getChildren().add( new ImageView(new Image(UserList.class .getResourceAsStream("resources/images/Logo.jpg")))); progressHBox = new HBox(); progressHBox.setSpacing(5); progressHBox.setAlignment(Pos.CENTER_RIGHT); nameLabel = new Label("Nombre:"); cityLabel = new Label("Población:"); accessLevelLabel = new Label("Nivel de Acceso:"); statusMessageLabel = new Label(""); progressBar = new ProgressBar(1); progressIndicator = new ProgressIndicator(1); resultsTableView = new TableView(); user = new User(); TableColumn idTableColumn = new TableColumn("Id"); idTableColumn .setDataRetriever(new Callback, Integer>() { public Integer call(CellDataFeatures u) { return ((User) u.getValue()).getId(); } }); TableColumn nameTableColumn = new TableColumn("Nombre"); nameTableColumn .setDataRetriever(new Callback, String>() { public String call(CellDataFeatures u) { return ((User) u.getValue()).getName(); } }); TableColumn nifTableColumn = new TableColumn("N.I.F."); nifTableColumn .setDataRetriever(new Callback, String>() { public String call(CellDataFeatures u) { return ((User) u.getValue()).getNif(); } }); TableColumn emailTableColumn = new TableColumn("E-mail"); emailTableColumn .setDataRetriever(new Callback, String>() { public String call(CellDataFeatures u) { return ((User) u.getValue()).getEmail(); } }); TableColumn phoneTableColumn = new TableColumn( "Teléfono"); phoneTableColumn .setDataRetriever(new Callback, String>() { public String call(CellDataFeatures u) { return ((User) u.getValue()).getPhone(); } }); TableColumn cityTableColumn = new TableColumn( "Población"); cityTableColumn .setDataRetriever(new Callback, String>() { public String call(CellDataFeatures u) { return ((User) u.getValue()).getCity(); } }); /* * for(int i=0; i < 7; i++){ final TableColumn col = new * TableColumn("Col "+i); //setting property for easy access * col.setProperty(String.valueOf(i)); col.setDataRetriever(new * Callback,Object>(){ public String * call(CellDataFeatures u) { int i = * Integer.parseInt(col.getProperty()); return * ((ArrayList)u.getValue()).get(i).toString(); } * * }); resultsTableView.getColumns().add(col); * System.out.println("Column ["+i+"]"); } */ resultsTableView.getColumns().setAll(idTableColumn, nameTableColumn, nifTableColumn, emailTableColumn, phoneTableColumn, cityTableColumn); resultsTableView.setItems(FXCollections . observableArrayList(userList)); resultsTableView.setOnMouseClicked(new EventHandler() { @Override public void handle(MouseEvent e) { if (e.getClickCount() == 2) { user = (User) resultsTableView.getSelectionModel() .getSelectedItem(); if (returnMode == 0) { modifyRegister(); } else if (returnMode == 1) { doClose(RET_OK); } } } }); modifyButton.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { user = (User) resultsTableView.getSelectionModel() .getSelectedItem(); modifyRegister(); } }); nameTextBox = new TextBox(); cityTextBox = new TextBox(); toolBar = new ToolBar(); toolBar.getStyleClass().add("map-toolbar"); toolBar.getItems().addAll(addButton, modifyButton, deleteButton, updateButton, new Separator(), backwardButton, pageChoiceBox, forwardButton, new Separator(), addEmailRecipientButton); GridPane.setValignment(nameLabel, VPos.CENTER); GridPane.setHalignment(nameLabel, HPos.RIGHT); GridPane.setValignment(nameTextBox, VPos.CENTER); GridPane.setHalignment(nameTextBox, HPos.LEFT); GridPane.setValignment(cityLabel, VPos.CENTER); GridPane.setHalignment(cityLabel, HPos.RIGHT); GridPane.setValignment(cityTextBox, VPos.CENTER); GridPane.setHalignment(cityTextBox, HPos.LEFT); GridPane.setValignment(accessLevelLabel, VPos.CENTER); GridPane.setHalignment(accessLevelLabel, HPos.RIGHT); GridPane.setValignment(accessLevelChoiceBox, VPos.CENTER); GridPane.setHalignment(accessLevelChoiceBox, HPos.LEFT); filterPanelGridPane.add(nameLabel, 0, 0); filterPanelGridPane.add(cityLabel, 2, 0); filterPanelGridPane.add(accessLevelLabel, 4, 0); filterPanelGridPane.add(nameTextBox, 1, 0); filterPanelGridPane.add(cityTextBox, 3, 0); filterPanelGridPane.add(accessLevelChoiceBox, 5, 0); GridPane.setValignment(statusMessageLabel, VPos.CENTER); GridPane.setHalignment(statusMessageLabel, HPos.LEFT); GridPane.setValignment(progressHBox, VPos.CENTER); GridPane.setHalignment(progressHBox, HPos.RIGHT); statusPanelGridPane.add(statusMessageLabel, 0, 0); statusPanelGridPane.add(progressHBox, 1, 0); progressHBox.getChildren().addAll(progressBar, progressIndicator); mainPanelBorderPane.setTop(filterPanelGridPane); mainPanelBorderPane.setCenter(resultsTableView); applicationBorderPane.setTop(toolBar); applicationBorderPane.setCenter(mainPanelBorderPane); applicationBorderPane.setBottom(statusPanelGridPane); windowBorderPane.setTop(logoHBox); windowBorderPane.setCenter(applicationBorderPane); loadPages(); } public boolean getReturnStatus() { return returnStatus; } private void setReturnStatus(boolean returnStatus) { this.returnStatus = returnStatus; } private void doClose(boolean returnStatus) { this.returnStatus = returnStatus; stage.setVisible(false); stage.close(); } private synchronized void loadPages() { Query queryPages = Beans.isDesignTime() ? null : trainingManager .createQuery("SELECT COUNT(u) FROM User u " + getFilter()); long p = (Long) queryPages.getSingleResult(); // setChangePageEnabled(false); loadingPages = true; pageChoiceBox.getItems().clear(); pageChoiceBox.getItems().add("1"); pageChoiceBox.getSelectionModel().selectFirst(); if (p > 2) { int q = (int) (p / 2); if ((p % 2) > 0) { q++; } for (int i = 2; i <= q; i++) { pageChoiceBox.getItems().add(String.valueOf(i)); } pageChoiceBox.setDisable(false); forwardButton.setDisable(false); } else { pageChoiceBox.setDisable(true); forwardButton.setDisable(true); } backwardButton.setDisable(true); loadingPages = false; // setChangePageEnabled(true); } private synchronized void showPage() { if (!loadingPages) { int selectedPage = pageChoiceBox.getSelectionModel() .getSelectedIndex(); int lastPage = pageChoiceBox.getItems().size() - 1; int firstRegister = selectedPage * 2; backwardButton.setDisable(true); forwardButton.setDisable(true); // setChangePageEnabled(false); // selectedPage = // pageChoiceBox.getSelectionModel().getSelectedIndex(); // lastPage = pageChoiceBox.getItems().size() - 1; statusMessageLabel.setText("Recuperando Datos..."); progressBar.setProgress(-1); progressIndicator.setProgress(-1); userQuery = Beans.isDesignTime() ? null : trainingManager .createQuery("SELECT u FROM User u " + getFilter()); userQuery.setFirstResult(firstRegister); userQuery.setMaxResults(2); List uList = userQuery.getResultList(); for (User u : uList) { trainingManager.refresh(u); } userList.clear(); userList.addAll(uList); resultsTableView.getItems().clear(); resultsTableView.setItems(FXCollections . observableArrayList(userList)); // setChangePageEnabled(true); statusMessageLabel.setText("Búsqueda Finalizada."); progressBar.setProgress(1); progressIndicator.setProgress(1); backwardButton.setDisable((selectedPage > 0) ? false : true); forwardButton.setDisable((selectedPage < lastPage) ? false : true); } } private synchronized void newRegister() { user = new User(); configuration = new Configuration(); configuration.setEmailFormat(1); configuration.setEmailSignature(""); /* * JFrame mainFrame = EnsenaApp.getApplication().getMainFrame(); userBox * = new UserEdit(mainFrame, true, configuration); * userBox.setLocationRelativeTo(mainFrame); userBox.setUser(user); * EnsenaApp.getApplication().show(userBox); */ UserEdit userBox = new UserEdit(stage); userBox.setUser(user); userBox.start(stage); if (userBox.getReturnStatus()) { user.setUser(userBox.getUser()); try { if (!trainingManager.getTransaction().isActive()) { trainingManager.getTransaction().begin(); } trainingManager.persist(user); userList.add(user); trainingManager.getTransaction().commit(); if (!trainingManager.getTransaction().isActive()) { trainingManager.getTransaction().begin(); } configuration.setUser(user); trainingManager.persist(configuration); trainingManager.getTransaction().commit(); /* * userList.add(0, new User()); * resultsTableView.setRowSelectionInterval(0, 0); * userList.remove(0); * * int row = userList.size() - 1; * resultsTableView.setRowSelectionInterval(row, row); * resultsTableView.scrollRectToVisible(resultsTableView * .getCellRect(row, 0, true)); */ update(); } catch (RollbackException e) { if (!trainingManager.getTransaction().isActive()) { trainingManager.getTransaction().begin(); } List uList = new ArrayList(userList.size()); for (User us : userList) { uList.add(trainingManager.merge(us)); } userList.clear(); userList.addAll(uList); } } } private void modifyRegister() { /* * JFrame mainFrame = EnsenaApp.getApplication().getMainFrame(); userBox * = new UserEdit(mainFrame, true, configuration); * userBox.setLocationRelativeTo(mainFrame); userBox.setUser(user); * EnsenaApp.getApplication().show(userBox); */ UserEdit userBox = new UserEdit(stage); userBox.setUser(user); userBox.start(new Stage()); System.out.println("Mostrado"); /*if (userBox.getReturnStatus()) { user.setUser(userBox.getUser()); System.out.println(user.getAddress()); if (!trainingManager.getTransaction().isActive()) { trainingManager.getTransaction().begin(); } trainingManager.merge(user); trainingManager.getTransaction().commit(); update(); }*/ } private synchronized void update() { loadPages(); showPage(); } private String getFilter() { StringBuilder filter = new StringBuilder(); String nameField = nameTextBox.getText(); String cityField = cityTextBox.getText(); if (nameField != null && cityField != null) { if (!nameField.isEmpty() || !cityField.isEmpty()) { filter.append("WHERE "); if (!nameField.isEmpty()) { filter.append("u.name LIKE '%").append(nameField) .append("%' "); } if (!nameField.isEmpty() && !cityField.isEmpty()) { filter.append("AND "); } if (!cityField.isEmpty()) { filter.append("u.city LIKE '%").append(cityField) .append("%' "); } } } filter.append("ORDER BY u.name ASC"); return filter.toString(); } public void start(Stage stage) { this.stage = stage; Group rootGroup = new Group(); Scene scene = new Scene(rootGroup, 800, 400); stage.initModality(Modality.APPLICATION_MODAL); stage.initOwner(parentStage); stage.setTitle("Listado de Usuarios"); stage.setResizable(true); scene.setRoot(windowBorderPane); stage.setScene(scene); stage.centerOnScreen(); stage.setVisible(true); } public static void main(String[] args) { Application.launch(args); } }