Content of file JavaFxAudioExplorerPresentationDelegate.java.html

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../../jacoco-resources/report.gif" type="image/gif"/><title>JavaFxAudioExplorerPresentationDelegate.java</title><link rel="stylesheet" href="../../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../../index.html" class="el_report">blueMarine II :: Application :: JavaFX</a> &gt; <a href="../index.html" class="el_bundle">it-tidalwave-bluemarine2-ui-javafx</a> &gt; <a href="index.source.html" class="el_package">it.tidalwave.bluemarine2.ui.audio.explorer.impl.javafx</a> &gt; <span class="el_source">JavaFxAudioExplorerPresentationDelegate.java</span></div><h1>JavaFxAudioExplorerPresentationDelegate.java</h1><pre class="source lang-java linenums">/*
 * *********************************************************************************************************************
 *
 * blueMarine II: Semantic Media Centre
 * http://tidalwave.it/projects/bluemarine2
 *
 * Copyright (C) 2015 - 2021 by Tidalwave s.a.s. (http://tidalwave.it)
 *
 * *********************************************************************************************************************
 *
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations under the License.
 *
 * *********************************************************************************************************************
 *
 * git clone https://bitbucket.org/tidalwave/bluemarine2-src
 * git clone https://github.com/tidalwave-it/bluemarine2-src
 *
 * *********************************************************************************************************************
 */
package it.tidalwave.bluemarine2.ui.audio.explorer.impl.javafx;

import javax.annotation.Nonnull;
import javax.inject.Inject;
import java.util.Optional;
import java.util.stream.Stream;
import java.net.URI;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import it.tidalwave.role.ui.PresentationModel;
import it.tidalwave.role.ui.UserAction;
import it.tidalwave.role.ui.javafx.JavaFXBinder;
import it.tidalwave.bluemarine2.ui.audio.explorer.AudioExplorerPresentation;
import it.tidalwave.bluemarine2.ui.audio.renderer.AudioRendererPresentation;
import lombok.Getter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import static java.util.stream.Collectors.*;
import static it.tidalwave.bluemarine2.ui.impl.javafx.NodeFactory.label;

/***********************************************************************************************************************
 *
 * The JavaFX Delegate for {@link AudioRendererPresentation}.
 *
 * @stereotype  JavaFXDelegate
 *
 * @author  Fabrizio Giudici
 *
 **********************************************************************************************************************/
<span class="nc" id="L65">@Slf4j</span>
<span class="nc" id="L66">public class JavaFxAudioExplorerPresentationDelegate implements AudioExplorerPresentation</span>
  {
<span class="nc" id="L68">    @Getter @ToString</span>
    static class Memento
      {
<span class="nc" id="L71">        private final int selectedIndex;</span>

        public Memento()
<span class="nc" id="L74">          {</span>
<span class="nc" id="L75">            selectedIndex = 0;</span>
<span class="nc" id="L76">          }</span>

        public Memento (@Nonnull final ListView&lt;PresentationModel&gt; lvFiles)
<span class="nc" id="L79">          {</span>
        // TODO: add further properties, such as the precise scroller position
<span class="nc" id="L81">            selectedIndex = lvFiles.getSelectionModel().getSelectedIndex();</span>
<span class="nc" id="L82">          }</span>

        public void applyTo (@Nonnull final ListView&lt;PresentationModel&gt; lvFiles)
          {
<span class="nc" id="L86">            lvFiles.getSelectionModel().select(selectedIndex);</span>
<span class="nc" id="L87">            lvFiles.scrollTo(selectedIndex);</span>
<span class="nc" id="L88">          }</span>
      }

    @FXML
    private ListView&lt;PresentationModel&gt; lvFiles;

    @FXML
    private Button btUp;

    @FXML
    private Label lbFolderName;

    @FXML
    private HBox hbBrowserButtons;

    @FXML
    private Pane pnCoverArt;

    @FXML
    private ImageView ivCoverArt;

    @FXML
    private VBox vbDetails;

    @Inject
    private JavaFXBinder binder;

    @FXML
    private void initialize()
      {
<span class="nc" id="L118">        pnCoverArt.prefHeightProperty().bind(pnCoverArt.widthProperty());</span>
<span class="nc" id="L119">        ivCoverArt.fitWidthProperty().bind(pnCoverArt.widthProperty().multiply(0.9));</span>
<span class="nc" id="L120">        ivCoverArt.fitHeightProperty().bind(pnCoverArt.heightProperty().multiply(0.9));</span>
<span class="nc" id="L121">      }</span>

    @Override
    public void bind (@Nonnull final Properties properties, @Nonnull final UserAction upAction)
      {
<span class="nc" id="L126">        binder.bind(btUp, upAction);</span>
<span class="nc" id="L127">        lbFolderName.textProperty().bind(properties.folderNameProperty());</span>
<span class="nc" id="L128">      }</span>

    @Override
    public void showUp (@Nonnull final Object control)
      {
<span class="nc" id="L133">      }</span>

    @Override
    public void populateBrowsers (@Nonnull final PresentationModel pm)
      {
<span class="nc" id="L138">        binder.bindToggleButtons(hbBrowserButtons, pm);</span>
<span class="nc" id="L139">      }</span>

    @Override
    public void populateItems (@Nonnull final PresentationModel pm, @Nonnull final Optional&lt;Object&gt; optionalMemento)
      {
<span class="nc" id="L144">        binder.bind(lvFiles, pm, () -&gt;</span>
          {
<span class="nc bnc" id="L146" title="All 2 branches missed.">            if (!lvFiles.getItems().isEmpty())</span>
              {
<span class="nc" id="L148">                ((Memento)optionalMemento.orElse(new Memento())).applyTo(lvFiles);</span>
<span class="nc" id="L149">                lvFiles.requestFocus();</span>
              }
<span class="nc" id="L151">          });</span>
<span class="nc" id="L152">      }</span>

    @Override
    public void renderDetails (@Nonnull final String entityDetails)
      {
<span class="nc" id="L157">        vbDetails.getChildren().setAll(Stream.of(entityDetails.split(&quot;\n&quot;))</span>
<span class="nc" id="L158">                                             .map(s -&gt; label(&quot;track-details&quot;, s))</span>
<span class="nc" id="L159">                                             .collect(toList()));</span>
<span class="nc" id="L160">      }</span>

    @Override
    public void focusOnMediaItems()
      {
<span class="nc" id="L165">        lvFiles.requestFocus();</span>
<span class="nc" id="L166">      }</span>

    @Override @Nonnull
    public Object getMemento()
      {
<span class="nc" id="L171">        return new Memento(lvFiles);</span>
      }

    @Override
    public void setCoverArt (@Nonnull final Optional&lt;URI&gt; optionalCoverArtUri)
      {
<span class="nc" id="L177">        ivCoverArt.setImage(optionalCoverArtUri.map(uri -&gt; new Image(uri.toString())).orElse(null));</span>
<span class="nc" id="L178">      }</span>

    /*******************************************************************************************************************
     *
     * With a remote there's no TAB key, so we must emulate some tab control with left and right arrows.
     *
     * FIXME: try to generalise (e.g. cyclefocus?) and move to JavaFxApplicationPresentationDelegate.
try to generalise (e.g. cyclefocus?) and move to JavaFxApplicationPresentationDelegate.
* * @param event the key event * ******************************************************************************************************************/ @FXML public void onKeyPressed (@Nonnull final KeyEvent event) { <span class="nc" id="L192"> log.debug(&quot;onKeyPressed({})&quot;, event);</span> <span class="nc bnc" id="L194" title="All 2 branches missed."> if (lvFiles.isFocused())</span> { <span class="nc bnc" id="L196" title="All 2 branches missed."> if (event.getCode().equals(KeyCode.LEFT))</span> { <span class="nc" id="L198"> btUp.requestFocus();</span> } <span class="nc bnc" id="L200" title="All 2 branches missed."> else if (event.getCode().equals(KeyCode.RIGHT))</span> { <span class="nc" id="L202"> hbBrowserButtons.getChildren().get(0).requestFocus();</span> } } <span class="nc" id="L205"> }</span> } </pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.7.202105040129</span></div></body></html>