#include <stdio.h>
#include <string.h>
#include <math.h>

#include "mon_essai.h"

void ajuste_mode_choisi( Mon_essai * celui_la)
{
 s_sc * lequel;
 int i,k;
 sub_ecran * mode;

 lequel=ecran_n(selection->index());

 lequel->mode_perso=(celui_la->mode_ori->isChecked()==0);

 if (lequel->modeline==NULL || lequel->modeline[0]==0) // ligne à commenter pour empêcher le mode perso
 {
  lequel->mode_perso=FALSE;
  celui_la->mode_freq->setChecked(FALSE);
  celui_la->mode_ori->setChecked(TRUE);
 }


 if (lequel->mode_perso==TRUE)
 {
  alerte("Modes non testés","<br><br><table border='0'><tr><td>&nbsp;</td><th bgcolor='#00ff00'><center><font color='#ff0000' size='+3'>Vous utilisez les modes calculés par ce programme.<br>C'est un mode expérimental que je ne suis pas encore arrivé à faire marcher</center></font></th><td>&nbsp;</td></tr></table>");
 }

 for(mode=lequel->mode;mode->couleurs!=lequel->couleurs && mode->suiv;mode=mode->suiv);
 i=0;
 while (mode->mode[i][0]!=0)
 {
  i++;
 }
 celui_la->choisi_taille->setMaxValue(i-1);
 if (lequel->modeline!=NULL)
 if (lequel->modeline[0]!=0)
 {
  i=0;k=0;
  do
  {
   k++;
   i+=10;
   while (lequel->modeline[i]!='"')
   {
    i++;
   }
   i++;
   while (lequel->modeline[i]!='\n')
    i++;
   i++;
   if (lequel->mode_perso==TRUE)
    celui_la->choisi_taille->setMaxValue(k-1);
  } while (lequel->modeline[i]!=0);
 }

 ecran(selection,celui_la);
 afficheicone(celui_la->choisi_taille->value(),celui_la);
}

s_sc * ecran_n(int num)
{
 s_sc * lequel;

 lequel=((s_sc *)(en_xf[screen].info));
 while (lequel->suiv!=NULL && strcmp((((s_l *)(en_xf[serverlayout].info))->ecran[num][0]),lequel->identifier)!=0)
  lequel=lequel->suiv;
 return lequel;
}

QPixmap dessine_ecran(int i,int x,int y,int x_max, int y_max,Mon_essai * travail)
{
 QPixmap im(100*100);
 QPainter paint;
 char ligne[4];


printf("%d %d %d %d\n",x,y,x_max,y_max);

 if (travail->mem_mode->isChecked()==0)
 {
  x_max=x;
  y_max=y;
 }
 else
 {
  if (x_max<x) x_max=x; // cas anormal, mais évitons le plantage!
  if (y_max<y) y_max=y;
 }


 im.resize(x_max,y_max);
 switch (i)
 {
  case 1  : im.fill(QColor("#4444ff"));break;
  case 2  : im.fill(QColor("#00ff00"));break;
  case 3  : im.fill(QColor("#ff2222"));break;
  case 4  : im.fill(QColor("#ff00ff"));break;
  default : im.fill(QColor("#00ffff"));printf("Erreur : plus de 4 écrans, non pris en compte");
 }

 paint.begin( &im );

 paint.setPen("#000000");
 switch (i)
 {
  case 1  : paint.setBrush(QColor("#aaaaff"));break;
  case 2  : paint.setBrush(QColor("#88ff88"));break;
  case 3  : paint.setBrush(QColor("#ff9999"));break;
  case 4  : paint.setBrush(QColor("#ff88ff"));break;
  default : paint.setBrush(QColor("#88ffff"));printf("Erreur : plus de 4 écrans, non pris en compte");
 }

 if (x_max!=x || y_max!=y)
 {
  paint.drawRect((x_max-x)/2,(y_max-y)/2,x,y);
 }

 sprintf(ligne,"%d",i);

 paint.drawLine(0,0,0,y_max-1);
 paint.drawLine(0,0,x_max-1,0);
 paint.drawLine(x_max-1,y_max-1,0,y_max-1);
 paint.drawLine(x_max-1,y_max-1,x_max-1,0);
 paint.setFont( QFont( "times", min(x_max/2,y_max/2), QFont::Bold, FALSE ) );
 paint.drawText(x_max/2,3*y_max/4,ligne);
 paint.end();

 return im;
}

int hauteur(QIconViewItem * i, Mon_essai * celui_la) // erreur entre la dénomination de larqeur et hauteur :-(
{
 s_sc * lequel;
 sub_ecran * mode;
 int j,k,x,y;
 int fin;



 lequel=ecran_n(i->index());
 fin=lequel->garde_mode?0:lequel->num_mode;
 if (lequel->mode_perso==FALSE)
 {
  mode=lequel->mode;
  while (lequel->couleurs!=mode->couleurs && mode->suiv!=NULL) mode=mode->suiv;
  return mode->mode[fin][0]/ECHELLE;
 }
 else
 {
  if (lequel->modeline!=NULL)
  if (lequel->modeline[0]!=0)
  {
   j=0;k=-1;
   do
   {
    k++;
    j+=10;
    sscanf(lequel->modeline+j,"%dx%d",&x,&y);
    while (lequel->modeline[j]!='"') j++;
    j++;
    while (lequel->modeline[j]!='\n') j++;
    j++;
   } while (lequel->modeline[j]!=0 && k!=fin);
  }
  return x/ECHELLE;
 }

}

int eccart_x(QIconViewItem * i1,QIconViewItem * i2, Mon_essai * celui_la)
{
 if ( i1->x()<i2->x() )
  return hauteur(i2,celui_la);
 else
  return hauteur(i1,celui_la);
}

int largeur(QIconViewItem * i, Mon_essai * celui_la)
{
 s_sc * lequel;
 sub_ecran * mode;
 int j,k,x,y;
 int fin;
 lequel=ecran_n(i->index());
 fin=lequel->garde_mode?0:lequel->num_mode;
 if (lequel->mode_perso==FALSE)
 {
  mode=lequel->mode;
  while (lequel->couleurs!=mode->couleurs && mode->suiv!=NULL) mode=mode->suiv;
  return mode->mode[fin][1]/ECHELLE;
 }
 else
 {
  if (lequel->modeline!=NULL)
  if (lequel->modeline[0]!=0)
  {
   j=0;k=-1;
   do
   {
    k++;
    j+=10;
    sscanf(lequel->modeline+j,"%dx%d",&x,&y);
    while (lequel->modeline[j]!='"') j++;
    j++;
    while (lequel->modeline[j]!='\n') j++;
    j++;
   } while (lequel->modeline[j]!=0 && k!=fin);
  }
  return y/ECHELLE;
 }
}

int eccart_y(QIconViewItem * i1,QIconViewItem * i2, Mon_essai * celui_la)
{
 if ( i1->y()<i2->y() )
  return largeur(i2,celui_la);
 else
  return largeur(i1,celui_la);
}


int calcul_dist(QIconViewItem * i1,QIconViewItem * i2, Mon_essai * celui_la)
{
 if (i1==i2)
  return -1;
 else
  return (car(max(0,abs(i1->x()-i2->x())-eccart_x(i1,i2,celui_la)+1))+car(max(0,abs(i1->y()-i2->y())-eccart_y(i1,i2,celui_la)+1)));
}

void ecran(QIconViewItem * lui, Mon_essai * travail)
{
 int xx, yy;

 int distance=-1;
 int d;
 QIconViewItem * etudie;
 QIconViewItem * pres;

 etudie = travail->iconView1->firstItem();

 do
 {
  d=calcul_dist(lui,etudie,travail);
  if (d!=-1 && (distance==-1 || d < distance))
  {
   distance=d;
   pres=etudie;
  }
  etudie=etudie->nextItem();
 }  while (etudie!=travail->iconView1->lastItem());
 d=calcul_dist(lui,etudie,travail);
 if (d!=-1 && (distance==-1 || d < distance))
 {
  distance=d;
  pres=etudie;
 }

 if (abs(pres->y()-lui->y())>abs(pres->x()-lui->x()))
 {
  if (pres->y() < lui->y())
  {
   yy=pres->y()+largeur(pres,travail);
  }
  else
  {
   yy=pres->y()-largeur(lui,travail);
  }
  if (travail->decalage->isChecked())
   xx=pres->x();
  else
  {
   if (abs(pres->x()-lui->x())>eccart_x(lui,etudie,travail))
   {
    if (pres->x() < lui->x())
    {
     xx=pres->x()+hauteur(pres,travail);
    }
    else
    {
     xx=pres->x()-hauteur(lui,travail);
    }
   }
   else
   {
    xx=lui->x();
   }
  }
 }
 else
 {
  if (pres->x() < lui->x())
  {
   xx=pres->x()+hauteur(pres,travail);
  }
  else
  {
   xx=pres->x()-hauteur(lui,travail);
  }
  if (travail->decalage->isChecked())
   yy=pres->y();
  else
  {
   if (abs(pres->y()-lui->y())>eccart_y(lui,etudie,travail))
   {
    if (pres->y() < lui->y())
     yy=pres->y()+largeur(pres,travail);
    else
     yy=pres->y()-largeur(lui,travail);
   }
   else
    yy=lui->y();
  }
 }


 if (lui==travail->iconView1->firstItem())
  d=0;
 else
 {
  etudie=lui->prevItem();
  d=1;
 }

 lui->move(xx,yy);
 lui->repaint();
}

void afficheicone(int taille, Mon_essai * celui_la)
{
 char s[100];
 s_sc * lequel;
 sub_ecran * mode;
 int i,j,k,x,y,x_max,y_max;

 lequel=ecran_n(selection->index());
 if (lequel->mode_perso==FALSE)
 {
  for(mode=lequel->mode;mode->couleurs!=lequel->couleurs && mode->suiv;mode=mode->suiv);
  sprintf(s,"<center>taille :<br>%d points par %d points</center>",mode->mode[taille][0],mode->mode[taille][1]);
  x=mode->mode[taille][0];
  y=mode->mode[taille][1];
  x_max=mode->mode[0][0];
  y_max=mode->mode[0][1];
 }
 else
 {
  if (lequel->modeline!=NULL)
  if (lequel->modeline[0]!=0)
  {
   sprintf(s,"<center>taille :<br>");
   i=0;k=-1;
   do
   {
    j=20;
    k++;
    i+=10;
    sscanf(lequel->modeline+i,"%dx%d",&x,&y);
    if (k==0)
    {
     x_max=x;
     y_max=y;
    }
    while (lequel->modeline[i]!='"')
    {
     if (lequel->modeline[i]!='x')
      s[j]=lequel->modeline[i];
     else
     {
      sprintf(s+j," points par ");
      j+=11;
     }
     j++;
     i++;
    }
    i++;
    while (lequel->modeline[i]!='\n')
    i++;
    i++;
   } while (lequel->modeline[i]!=0 && k!=taille);
  }
  sprintf(s+j," points</center>");
 }
 celui_la->affiche_taille->setText( QString(s));

 selection->setPixmap(dessine_ecran(selection->index()+1,x/ECHELLE,y/ECHELLE,x_max/ECHELLE,y_max/ECHELLE,celui_la));
 ecran(selection, celui_la);
}

void alerte(char * titre,char * message)// titre : nom de la fenêtre, message : message à afficher
{
 QWidget * app =new QWidget(0,titre,0); // Mon expérience dit que ça marche mieux avec des pointeurs
 QLabel * label = new QLabel(app,0);    // Premier objet de ma fenêtre : un label
 label->setText(message);               // Message du label
 label->setAutoResize( TRUE );         // Pour mettre la fenre à la taille du texte, sinon, elle est trop petite!
 label->setAlignment( 3 );              // Alignement du texte
 QPushButton * mes = new QPushButton("Ok",app); // Second objet = un bouton
 mes->move((label->width()-mes->width())/2,4+label->height());
                                        // Mettre le bouton aileurs que sur le texte qui est en (0,0)
 mes->connect (mes, SIGNAL(clicked()),app, SLOT(close()));
                                        // Dire que la fenêtre se ferme quand on clique sur le bouton
 app->resize(max(label->width(),mes->width()),4+label->height()+mes->height());
                                        // Mettre la fenêtre à la bonne taille
 app->show();                           // Afficher la fenêtre
}
