All Downloads are FREE. Search and download functionalities are using the official Maven repository.

us.ihmc.scs2.sessionVisualizer.jfx.controllers.yoComposite.entry.YoEntryTabPaneController Maven / Gradle / Ivy

package us.ihmc.scs2.sessionVisualizer.jfx.controllers.yoComposite.entry;

import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.stage.Window;
import org.kordamp.ikonli.javafx.FontIcon;
import us.ihmc.log.LogTools;
import us.ihmc.messager.javafx.JavaFXMessager;
import us.ihmc.scs2.definition.yoEntry.YoEntryConfigurationDefinition;
import us.ihmc.scs2.definition.yoEntry.YoEntryListDefinition;
import us.ihmc.scs2.session.SessionState;
import us.ihmc.scs2.sessionVisualizer.jfx.SessionVisualizerIOTools;
import us.ihmc.scs2.sessionVisualizer.jfx.SessionVisualizerTopics;
import us.ihmc.scs2.sessionVisualizer.jfx.managers.SessionVisualizerToolkit;
import us.ihmc.scs2.sessionVisualizer.jfx.tools.JavaFXMissingTools;
import us.ihmc.scs2.sessionVisualizer.jfx.tools.MenuTools;
import us.ihmc.scs2.sessionVisualizer.jfx.tools.TabPaneTools;
import us.ihmc.scs2.sessionVisualizer.jfx.xml.XMLTools;

import jakarta.xml.bind.JAXBException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

public class YoEntryTabPaneController
{
   @FXML
   private TabPane yoEntryTabPane;
   @FXML
   private Tab initialTab;
   @FXML
   private YoEntryListViewController initialListViewController;

   private final Map tabToControllerMap = new HashMap<>();

   private SessionVisualizerToolkit toolkit;
   private Window owner;

   public void initialize(SessionVisualizerToolkit toolkit)
   {
      this.toolkit = toolkit;
      owner = toolkit.getMainWindow();
      initialListViewController.initialize(toolkit);
      Label initialTabHeader = TabPaneTools.editableTabHeader(initialTab);
      initialListViewController.nameProperty().bindBidirectional(initialTabHeader.textProperty());

      tabToControllerMap.put(initialTab, initialListViewController);
      MenuTools.setupContextMenu(yoEntryTabPane,
                                 TabPaneTools.addBeforeMenuItemFactory(this::newEmptyTab),
                                 TabPaneTools.addAfterMenuItemFactory(this::newEmptyTab),
                                 TabPaneTools.removeMenuItemFactory(),
                                 TabPaneTools.removeAllMenuItemFactory(false),
                                 exportTabMenuItemFactory(),
                                 exportAllTabMenuItemFactory(),
                                 importTabMenuItemFactory());

      yoEntryTabPane.getTabs().addListener((ListChangeListener) change ->
      {
         while (change.next())
         {
            if (change.wasRemoved())
            {
               for (Tab removedTab : change.getRemoved())
               {
                  if (removedTab == initialTab)
                  {
                     JavaFXMissingTools.runLater(getClass(), () -> yoEntryTabPane.getTabs().add(initialTab));
                     initialTabHeader.setText("Default");
                     initialListViewController.clear();
                  }
                  else
                  {
                     tabToControllerMap.remove(removedTab);
                  }
               }
            }
         }
      });

      // By disabling the entry tabs, we unlink YoVariables reducing the cost of a run tick for the Session
      yoEntryTabPane.getSelectionModel().selectedItemProperty().addListener((o, oldValue, newValue) ->
                                                                            {
                                                                               for (Tab tab : yoEntryTabPane.getTabs())
                                                                               {
                                                                                  Node content = tab.getContent();
                                                                                  if (content != null)
                                                                                     content.setDisable(tab != newValue);
                                                                               }
                                                                            });

      JavaFXMessager messager = toolkit.getMessager();
      SessionVisualizerTopics topics = toolkit.getTopics();
      messager.addFXTopicListener(topics.getSessionCurrentState(), state ->
      {
         if (state == SessionState.INACTIVE)
            yoEntryTabPane.getTabs().clear();
      });
      messager.addFXTopicListener(topics.getYoEntryListAdd(), this::addYoEntryList);
   }

   public void setInput(YoEntryConfigurationDefinition input)
   {
      if (input.getYoEntryLists() == null)
         return;

      ObservableList tabs = yoEntryTabPane.getTabs();
      tabs.retainAll(initialTab);

      while (tabs.size() < input.getYoEntryLists().size())
         tabs.add(newEmptyTab());

      List yoEntryLists = input.getYoEntryLists();
      for (int i = 0; i < yoEntryLists.size(); i++)
      {
         tabToControllerMap.get(tabs.get(i)).setInput(yoEntryLists.get(i));
      }
   }

   public void addYoEntryList(YoEntryListDefinition yoEntryListDefinition)
   {
      if (yoEntryListDefinition.getName() == null)
      {
         // We'll use the default tab
         tabToControllerMap.get(initialTab).addYoEntries(yoEntryListDefinition.getYoEntries());
      }
      else
      {
         for (Tab tab : yoEntryTabPane.getTabs())
         {
            if (yoEntryListDefinition.getName().equals(tab.getText()))
            {
               tabToControllerMap.get(tab).addYoEntries(yoEntryListDefinition.getYoEntries());
               return;
            }
         }

         Tab newTab = newEmptyTab();
         tabToControllerMap.get(newTab).setInput(yoEntryListDefinition);
         yoEntryTabPane.getTabs().add(newTab);
      }
   }

   public YoEntryConfigurationDefinition toYoEntryConfigurationDefinition()
   {
      YoEntryConfigurationDefinition definition = new YoEntryConfigurationDefinition();
      definition.setYoEntryLists(new ArrayList<>());
      for (Tab tab : yoEntryTabPane.getTabs())
      {
         definition.getYoEntryLists().add(tabToControllerMap.get(tab).toYoEntryListDefinition());
      }
      return definition;
   }

   private Function exportTabMenuItemFactory()
   {
      return tabPane ->
      {
         Tab selectedTab = yoEntryTabPane.getSelectionModel().getSelectedItem();

         if (selectedTab == null)
            return null;

         FontIcon exportIcon = new FontIcon();
         exportIcon.getStyleClass().add("save-icon-view");
         MenuItem menuItem = new MenuItem("Export active tab...", exportIcon);

         menuItem.setOnAction(e ->
                              {
                                 File result = SessionVisualizerIOTools.yoEntryConfigurationSaveFileDialog(owner);
                                 if (result != null)
                                    exportSingleTab(result, selectedTab);
                              });

         return menuItem;
      };
   }

   private Function exportAllTabMenuItemFactory()
   {
      return tabPane ->
      {
         Tab selectedTab = yoEntryTabPane.getSelectionModel().getSelectedItem();

         if (selectedTab == null)
            return null;

         FontIcon exportIcon = new FontIcon();
         exportIcon.getStyleClass().add("save-icon-view");
         MenuItem menuItem = new MenuItem("Export all tabs...", exportIcon);

         menuItem.setOnAction(e ->
                              {
                                 File result = SessionVisualizerIOTools.yoEntryConfigurationSaveFileDialog(owner);
                                 if (result != null)
                                    exportAllTabs(result);
                              });

         return menuItem;
      };
   }

   private Function importTabMenuItemFactory()
   {
      return tabPane ->
      {
         Tab selectedTab = yoEntryTabPane.getSelectionModel().getSelectedItem();

         if (selectedTab == null)
            return null;

         FontIcon exportIcon = new FontIcon();
         exportIcon.getStyleClass().add("load-icon-view");
         MenuItem menuItem = new MenuItem("Import tab(s)...", exportIcon);

         menuItem.setOnAction(e ->
                              {
                                 File result = SessionVisualizerIOTools.yoEntryConfigurationOpenFileDialog(owner);
                                 if (result != null)
                                    importTabsAt(result, selectedTab);
                              });

         return menuItem;
      };
   }

   private Tab newEmptyTab()
   {
      try
      {
         Tab tab = new Tab("Tab" + (yoEntryTabPane.getTabs().size() - 1));
         Label tabHeader = TabPaneTools.editableTabHeader(tab);
         FXMLLoader loader = new FXMLLoader(SessionVisualizerIOTools.YO_ENTRY_LIST_VIEW_URL);
         Node node = loader.load();
         tab.setContent(node);
         YoEntryListViewController controller = loader.getController();
         controller.nameProperty().bindBidirectional(tabHeader.textProperty());
         controller.initialize(toolkit);
         tabToControllerMap.put(tab, controller);
         return tab;
      }
      catch (IOException e)
      {
         e.printStackTrace();
         return null;
      }
   }

   public void exportAllTabs(File file)
   {
      LogTools.info("Saving to file: " + file);

      try
      {
         YoEntryConfigurationDefinition yoEntryConfigurationDefinition = toYoEntryConfigurationDefinition();
         if (yoEntryConfigurationDefinition.getYoEntryLists().isEmpty())
            return;

         XMLTools.saveYoEntryConfigurationDefinition(new FileOutputStream(file), yoEntryConfigurationDefinition);
      }
      catch (IOException | JAXBException e)
      {
         e.printStackTrace();
      }
   }

   public void exportSingleTab(File file, Tab tabToExport)
   {
      LogTools.info("Saving single tab to file: " + file);

      try
      {
         YoEntryListDefinition tabDefinition = tabToControllerMap.get(tabToExport).toYoEntryListDefinition();
         XMLTools.saveYoEntryConfigurationDefinition(new FileOutputStream(file), new YoEntryConfigurationDefinition(tabDefinition));
      }
      catch (IOException | JAXBException e)
      {
         e.printStackTrace();
      }
   }

   public void load(File file)
   {
      LogTools.info("Loading from file: " + file);

      try
      {
         YoEntryConfigurationDefinition definition = XMLTools.loadYoEntryConfigurationDefinition(new FileInputStream(file));
         setInput(definition);
      }
      catch (IOException | JAXBException e)
      {
         e.printStackTrace();
      }
   }

   public void importTabsAt(File file, Tab insertionPoint)
   {
      LogTools.info("Loading from file: " + file);

      try
      {
         YoEntryConfigurationDefinition definition = XMLTools.loadYoEntryConfigurationDefinition(new FileInputStream(file));

         List yoEntryLists = definition.getYoEntryLists();
         if (yoEntryLists == null || yoEntryLists.isEmpty())
            return;

         int startIndex = 0;

         if (isTabEmpty(insertionPoint))
         {
            tabToControllerMap.get(insertionPoint).setInput(yoEntryLists.get(0));
            startIndex++;
         }

         ObservableList tabs = yoEntryTabPane.getTabs();
         int insertionIndex = tabs.indexOf(insertionPoint) + 1;

         for (int i = startIndex; i < yoEntryLists.size(); i++)
         {
            Tab newEmptyTab = newEmptyTab();
            tabToControllerMap.get(newEmptyTab).setInput(yoEntryLists.get(i));
            tabs.add(insertionIndex, newEmptyTab);
            insertionIndex++;
         }
      }
      catch (IOException | JAXBException e)
      {
         e.printStackTrace();
      }
   }

   private boolean isTabEmpty(Tab query)
   {
      return tabToControllerMap.get(query).isEmpty();
   }

   public void start()
   {
   }

   public void stop()
   {
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy