outils/OutilMacConsRec.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 OutilMac from './OutilMac'
import { natObjGraphPourProto } from '../kernel/kernelAdd'
import CMacroConstructionRecursive from '../objets/CMacroConstructionRecursive'
import MacConsRecDlg from '../dialogs/MacConsRecDlg'
import ConstImpSrcNumDlg from '../dialogs/ConstImpSrcNumDlg'
import CAffLiePt from '../objets/CAffLiePt'
import Color from '../types/Color'
import StyleTrait from '../types/StyleTrait'
import CSousListeObjets from '../objets/CSousListeObjets'
import CPrototype from '../objets/CPrototype'

export default OutilMacConsRec

/**
 * Outil servant à créer une macro d'implémentation récursive de construction
 * @param {MtgApp} app L'application propriétaire
 * @constructor
 */
function OutilMacConsRec (app) {
  if (arguments.length === 0) return
  OutilMac.call(this, app, 'MacConsRec', 33065)
}

OutilMacConsRec.prototype = new OutilMac()

OutilMacConsRec.prototype.select = function () {
  OutilMac.prototype.select.call(this)
  this.mac = null
}

OutilMacConsRec.prototype.traiteObjetDesigne = function (elg, point) {
  let i
  const self = this
  const app = this.app
  const doc = app.doc
  const list = app.listePr
  const tableProto = []
  // Pa défaut profondeur de récursion de 2 avec la première construction disponible
  for (i = 0; i < 3; i++) tableProto.push(doc.tablePrototypes[0])
  if (this.mac === null) {
    this.addComClign(point)
    this.mac = new CMacroConstructionRecursive(list, null, false, app.getCouleur(), point.x, point.y, 0, 0, false, null,
      16, false, doc.couleurFond, CAffLiePt.alignHorLeft, CAffLiePt.alignVerTop, '', '', null, tableProto, 1, 2, 0,
      false, false, Color.black, 0, StyleTrait.stfc(list), Color.black, false)
    new MacConsRecDlg(app, this.mac, false,
      function () {
        self.actionApresDlg()
      },
      function () {
        app.activeOutilCapt()
      })
  } else {
    const proto = this.mac.tableProto[0]
    this.excluDeDesignation(elg)
    this.ajouteClignotementDe(elg)
    this.tab.push(elg)
    this.indEnCours++
    if (this.indEnCours < proto.nbSrcGraph()) { // Modifié version 6.4.1
      app.outilPointageCre.aDesigner = natObjGraphPourProto(proto.get(this.indEnCours).getNature())
      app.indication(proto.chIndSourceGraph(this.indEnCours), 'ClicOn', true)
    } else this.end()
  }
}

// this.tab est un array qui, si on doit choisir des éléments graphiques sources, contient soit un pointeur sur un élément de
// la liste des objets choisi comme source soit une chaîne de caractères qui contient un calcul à créer et à rajouter
// à la figure, on affecte alors comme élément source un pointeur sur ce calcul créé
/**
 * Fonction appelée une fois qu'on a choisi un prototype à implémenter dans la boîte de dialogue de choix de prototype
 */
OutilMacConsRec.prototype.actionApresDlg = function () {
  // Si les éléments sources ne sont pas que des objets graphiques, il faut ouvrir une boîte de dialogue de choix
  // d'objets sources numériques
  const self = this
  this.mac.listeAssociee = new CSousListeObjets() // Contiendra les objets sources pour l'implémentation récursive
  const proto = this.mac.tableProto[0]
  if (proto.natureSources !== CPrototype.graph) {
    new ConstImpSrcNumDlg(this.app, proto, function (tab) {
      self.tab = tab
      self.suite(tab)
    })
  } else {
    this.tab = []
    this.suite()
  }
}

OutilMacConsRec.prototype.suite = function () {
  const app = this.app
  const proto = this.mac.tableProto[0]
  if (proto.natureSources === CPrototype.calc) this.end()
  else {
    // Il faut maintenant choisir les objets sources graphiques
    this.indEnCours = proto.nbSrcCal() // this.indEnCours contient l'indice de l'objet source (graphique) qu'il faut désigner
    this.app.outilPointageActif = app.outilPointageCre
    app.outilPointageCre.aDesigner = natObjGraphPourProto(proto.get(this.indEnCours).getNature())
    app.outilPointageCre.reset()
    app.indication(proto.chIndSourceGraph(this.indEnCours), 'ClicOn', true)
  }
}

OutilMacConsRec.prototype.end = function () {
  const tab = this.tab
  const mac = this.mac
  for (let i = 0; i < tab.length; i++) {
    mac.listeAssociee.add(tab[i])
  }
  this.annuleClignotement()
  this.creeObjet()
}

OutilMacConsRec.prototype.activationValide = function () {
  return this.app.doc.tablePrototypes.length > 0
}