(*        par Marcel Délèze    *)

BeginPackage["Tableaux`"]

fusionneColonnes::usage=
	"fusionneColonnes[a,b] assemble le tableau (\!\(\*GridBox[{
{a},
{b}
}]\))."

fusionneLignes::usage=
	"fusionneLignes[a,b] assemble le tableau (\!\(\*GridBox[{
{a, b}
}]\))."

fusionneTableaux::usage=
	"fusionneTableaux[a, b, c, d] assemble le tableau {{a, b}, {c, d}}."

afficheTableau::usage=
	"afficheTableau[l, c, t] affiche le tableau {{Null, c}, {l, t}} où\n     l est la liste  des en-têtes de lignes,\n     c est la liste des en-têtes de colonnes et\n     t est un tableau bidimensionnel.\n\nafficheTableau[l, c, t, f] affiche le tableau au format numérique f."

afficheTableauTitre::usage="afficheTableauTitre[e, l, c, t] affiche le tableau {{e, c}, {l, t}} où\n     e désigne le titre du tableau,\n     l est la liste des en-têtes de lignes,\n     c est la liste des en-têtes de colonnes et\n     t est un tableau bidimensionnel.\n\nafficheTableauTitre[e, l, c, t, f] affiche le tableau {{e, c}, {l, t}} au format numérique f."

tableauGraph::usage=
	"tableauGraph[t] affiche le tableau bidimensionnel t tourné d'un quart de tour;\nafficheTableau[l, c, t] affiche le tableau {{Null, c}, {l, t}} tourné d'un quart de tour où\n     l est la liste des en-têtes de lignes,\n     c est la liste des en-têtes de colonnes et\n     t est un tableau bidimensionnel."

arrondis::usage=
	"arrondis[x, f] arrondit le nombre (ou la liste) x à un nombre entier de fois f."

prodCart::usage=
	"prodCart[a, b] construit un tableau qui est le produit cartésien\n     des lignes de a et b."

prodCartTrans::usage=
	"prodCartTrans[a, b] construit un tableau qui est le produit\n     cartésien transposé des lignes de a et b."

Begin["`Private`"]

fusionneColonnes[a_List,b_List]:=Join[a,b]

fusionneColonnes[a_List,b_List,c__List]:=fusionneColonnes[fusionneColonnes[a,b],c]

fusionneLignes[a_List,b_List]:=Transpose[Join[Transpose[a],Transpose[b]]]

fusionneLignes[a_List,b_List,c__List]:=fusionneLignes[fusionneLignes[a,b],c]

fusionneTableaux[a_List,b_List,c_List,d_List]:=fusionneColonnes[fusionneLignes[a,b],fusionneLignes[c,d]]

arrondis[Null,f_]:=Null;
arrondis[x_List,f_]:=Map[Function[t,arrondis[t,f]],x];
arrondis[x_,f_]:=f Floor[x/f+(1/2)]

cellule[Null]=ToBoxes[""];
cellule[{}]=ToBoxes["{}"];
cellule[x_List]:=GridBox[Map[cellule,x,{2}],RowLines->True,ColumnLines->True]/; SameQ[Head[x[[1]]],List];
cellule[x_]:=ToBoxes[x]

apparence[x_List]:=Map[Function[v,StyleBox[cellule[v],FontFamily->"Courier",FontWeight->"Bold",FontSlant->"Oblique"]],x,{1}]

form[t_List,f_List]:=Module[{tt},tt=Transpose[t];Transpose[Table[Map[f[[j]],tt[[j]],{1}],{j,1,Length[tt]}]]]

form[t_List,f_]:=Map[f,t,{2}]

formLigne[t_List,f_List]:=Table[Map[f[[j]],t[[j]],{1}],{j,1,Length[t]}]

formLigne[t_List,f_]:=Map[f,t,{2}]

afficheTableau[None, None,t_List,f_:Identity]:=FrameBox[GridBox[Map[cellule,form[t,f],{2}],RowLines->True,ColumnLines->True]]//DisplayForm

afficheTableau[None, c_List,t_List,f_:Identity]:=FrameBox[GridBox[fusionneColonnes[{apparence[c]},Map[cellule,form[t,f],{2}]],RowLines->True,ColumnLines->True]]//DisplayForm

afficheTableau[l_List, None,t_List,f_:Identity]:=FrameBox[GridBox[fusionneLignes[Transpose[{apparence[l]}],Map[cellule,formLigne[t,f],{2}]],RowLines->True,ColumnLines->True]]//DisplayForm

afficheTableau[l_List, c_List,t_List,f_:Identity]:=FrameBox[GridBox[fusionneTableaux[{{""}},{apparence[c]},Transpose[{apparence[l]}],Map[cellule,form[t,f],{2}]],RowLines->True,ColumnLines->True]]//DisplayForm

afficheTableauTitre[e_,l_List, c_List,t_List,f_:Identity]:=FrameBox[GridBox[fusionneTableaux[{{StyleBox[cellule[e],FontFamily->"Courier",FontWeight->"Bold",FontSlant->"Oblique"]}},{apparence[c]},Transpose[{apparence[l]}],Map[cellule,form[t,f],{2}]],RowLines->True,ColumnLines->True]]//DisplayForm

tableauGraph[tb_List]:=Module[{m,n,bLn,cLn,ΔCol,bCol,cCol,i,j,t},
{m,n}=Dimensions[tb,2];
t=Map[ToString,tb,{2}];
bLn=Range[0,m];
cLn=Table[((bLn[[i]]+bLn[[i+1]])/2),{i,1,m}];
ΔCol=3+Map[Max,Map[StringLength,Transpose[t],{2}]];
bCol=Table[Apply[Plus,ΔCol[[Range[j]]]],{j,0,n}];
cCol=Table[((bCol[[j]]+bCol[[j+1]])/2),{j,1,n}];
Show[Graphics[{{Thickness[0.001],
Table[Line[{{bLn[[i]],bCol[[1]]},{bLn[[i]],bCol[[n+1]]}}],{i,1,m+1}],
Table[Line[{{bLn[[1]],bCol[[j]]},{bLn[[m+1]],bCol[[j]]}}],{j,1,n+1}]},Table[Text[t[[i]][[j]],{cLn[[i]],cCol[[j]]},{0,0},{0,1}],{i,1,m},{j,1,n}]},
PlotRange->All,ImageSize->{18 m,6bCol[[n+1]]},AspectRatio->((6bCol[[n+1]])/(18 m))]]]

tableauGraph[el_,ec_,ta_]:=tableauGraph[fusionneTableaux[{{""}},{ec},Transpose[{el}],ta]]

prodCart[a_List,b_List]:=Flatten[Table[Join[a[[i]],b[[j]]],{i,1,Length[a]},{j,1,Length[b]}],1]

prodCartTrans[a_List,b_List]:=Flatten[Table[Join[a[[i]],b[[j]]],{j,1,Length[b]},{i,1,Length[a]}],1]

End[]

EndPackage[]