dialogs/ListeObjNumPrConst.js

/*
 * MathGraph32 Javascript : Software for animating online dynamic mathematics figures
 * https://www.mathgraph32.org/
 * @Author Yves Biton (yves.biton@sesamath.net)
 * @License: GNU AGPLv3 https://www.gnu.org/licenses/agpl-3.0.html
 */

import $ from 'jquery'
import { ce } from '../kernel/kernel'
import ListeMacros from './ListeMacros'
import NatCal from '../types/NatCal'

export default ListeObjNumPrConst

/**
 * Objet représentant une liste d'objets numériques utilisés dans la boîte de dialogue de choix d'objets
 * numériques sourves pour une construction.
 * Herite de certaines propriétés de ListeMacros
 * @constructor
 * @param {MtgApp} app L'application propriétaire
 * @param bListeGauche true si c'est la liste de gauche de la boîte de dialogue qui présente les objets disponibles
 * sinon il s'agit de la liste de droite qui représente les objets numériques sélectionnés
 * @param listeSourcesCalculsChoisis Pour la liste de gauche pointe sur la liste de droite
 * @param callBackOnDblClick Fonction de callBack à appeler si on double clique sur un élément, seulement pour la liste de gauche
 */
function ListeObjNumPrConst (app, bListeGauche, listeSourcesCalculsChoisis, callBackOnDblClick = null) {
  this.app = app
  this.callBackOnDblClick = callBackOnDblClick

  this.select = ce('select', {
    size: 12, // Le nombre de lignes visibles par défaut
    style: 'width:220px'
  })
  if (bListeGauche) this.metAJourListe(listeSourcesCalculsChoisis)
  else {
    const list = app.listeSrcNG
    this.int = [] // Contiendra la liste des noms des éléments de la liste
    this.pointeurs = [] // Contiendra des pointeurs sur les macros correspondantes
    let prem = true
    for (const el of list.col) {
      const nom = el.getNom()
      this.int.push(nom)
      this.pointeurs.push(el)
      const option = ce('option', {
        class: 'mtgOption'
      })
      $(option).html(nom)
      this.select.appendChild(option)
      if (prem) {
        $(option).attr('selected', 'selected')
        prem = false
      }
    }
  }
}

ListeObjNumPrConst.prototype = new ListeMacros()

/**
 * metAJour la liste d'éléments disponibles comme éléments sources numériques pour une construction
 * sachant que listeSourcesCalculsChoisis contient la liste d'éléments déjà choisis.
 * @param listeSourcesCalculsChoisis
 */
ListeObjNumPrConst.prototype.metAJourListe = function (listeSourcesCalculsChoisis) {
  const app = this.app
  const list = app.listePr
  let prem = true
  this.retAll() // Appelé depuis ListeMacros
  for (const elb of list.col) {
    if ((elb.estDeNatureCalcul(NatCal.NObjCalcPourSourcesProto)) && !elb.estElementIntermediaire() &&
        (listeSourcesCalculsChoisis.pointeurs.indexOf(elb) === -1)) {
      let valide = true
      for (let j = 0; (j < listeSourcesCalculsChoisis.pointeurs.length) && valide; j++) {
        const el = listeSourcesCalculsChoisis.pointeurs[j]
        valide = !el.depDe(elb) && !elb.depDe(el)
      }
      for (let j = 0; (j < app.listeSrcG.longueur()) && valide; j++) {
        const el = app.listeSrcG.get(j)
        valide = !el.depDe(elb) && !elb.depDe(el)
      }
      if (valide) {
        const nom = elb.getNom()
        this.int.push(nom)
        this.pointeurs.push(elb)
        const option = ce('option', {
          class: 'mtgOption'
        })
        $(option).html(nom)
        this.select.appendChild(option)
        if (this.callBackOnDblClick) option.ondblclick = this.callBackOnDblClick
        if (prem) {
          $(option).attr('selected', 'selected')
          prem = false
        }
      }
    }
  }
}

/**
 * Fonction insérant dans la liste devant l'élément sélectionné l'objet el
 * @param el
 */
ListeObjNumPrConst.prototype.insert = function (el) {
  const sel = this.select
  const ind = sel.selectedIndex
  if (sel.selectedIndex === -1) this.add(el)
  else {
    const nom = el.getNom()
    this.int.splice(ind, 0, nom)
    this.pointeurs.splice(ind, 0, el)
    const option = ce('option', {
      class: 'mtgOption'
    })
    $(option).html(nom)
    $(sel.options[ind]).before(option)
  }
}

/**
 * Fonction insérant au début de la liste la macro mac
 * @param el
 */
ListeObjNumPrConst.prototype.add = function (el) {
  const nom = el.getNom()
  this.int.push(nom)
  this.pointeurs.push(el)
  const option = ce('option', {
    class: 'mtgOption'
  })
  $(option).html(nom)
  this.select.appendChild(option)
  this.select.selectedIndex = this.select.length - 1
}