El primer intento ha sido intentar escribir una función que modifique el colspan de una celda directamente. El resultado ha sido una función que no me da muchas garantías en las que no tengo claro si cubro todos los casos y con limitaciones del tipo “si la celda adyacente tiene un rowspan, no se puede modificar el colspan de la celda previa”. El punto culminante ha sido al intentar duplicar esa función para tratar cambios del rowspan, con lo que podría suceder que “para modificar el rowspan la celda no debe tener un colspan”. En definitiva podría darse un caso recursivo que impidiese el realizar ciertas estructuras. Al menos, me ha ayudado a ir viendo los distintos casos y a ver más claramente el problema.
El siguiente intento ha sido simplificar el problema a un primer paso, incrementos del colspan en una única celda y del rowspan en una única celda. Con esto se simplifican los casos y, posteriormente, iterando se llega al mismo resultado (más costoso para el ordenador pero mucho más sencillo, más mantenible, y mucho más fiable).
Colspan + 1
1. Partimos de una celda seleccionada y queremos añadir 1 a su colspan dejando la tabla html en condiciones y teniendo en cuenta que las celdas adyacentes pueden tener muchas disposiciones posibles:
El asterisco representa la celda seleccionada que queremos ampliar con un colspan +1. Las celdas rojas son las afectadas. A la derecha de la flecha aparece el resultado final, la celda amplia su colspan, la roja desaparece o se reduce y pueden aparecer celdas nuevas (amarillas).
2. Creación de un modelo para la tabla. La mejor forma, en informática, de representar algo es mediante números. En este caso, he decidido asignar un número a cada color, o a cada celda. Con este modelo en mente, el dibujo anterior se traduce en:
Hay que tener en cuenta, también, que la celda inicial puede tener su colspan y su rowspan y que debe seguir funcionando.
3. Creamos, primero, unas funciones para representar las dos tablas, el modelo y su representación con colspans y rowspans y la página html. Las pintamos utilizando jquery. Cada celda de la tabla tiene como id su id en el modelo.
4. Dada una celda seleccionada (click) en la tabla pulsamos el botón de colspan+1. El proceso, mirando en los ejemplos es el siguiente:
- Cogemos el id de la celda seleccionada y calculamos su cuadrado (filaIni, columnaIni, filaFin, columnaFin) utilizando para ello los valores almacenados en el modelo para ese id.
- Recorremos la columna adyacente a la columnaFin (si no es la última, columnaFin+1) desde la filaIni hasta la filaFin.
- Hacemos idAEliminar = modeloTabla[filaFin+1][j];
- Si el identificador de la siguiente columna (columnaFin+2) es igual al que vamos a eliminar entonces debemos eliminar ese identificador de la columna columnaFin+1.
- Ponemos el id de la celda seleccionada en lugar del idAEliminar.
El código de ejemplo y su funcionamiento (probado en Firefox 15) está en:
Colspan - 1
El colspan -1 es bastante más sencillo:
Simplemente se crean nuevos ids para la columna que se pierde. Si la celda tiene colspan 1 no se permite reducirlo.
El ejemplo:
Rowspan + 1 y Rowspan -1
Tal y como debería haber sido desde el principio si cambiamos col por row, i por j, y filas por columnas, tendremos los métodos para modificar el rowspan directamente desde los anteriores, sin necesidad de comernos el tarro.
El ejemplo:
Iterando
Aquí dejo el resultado final. He modificado las funciones anteriores para que retornen un booleano indicando si el incremento o decremento en uno se puede o no hacer en lugar de mostrar un mensaje de error. La iteración se realizará hasta que se llegue al final o se obtenga un false en una de las iteraciones. Simplemente, calculamos la diferencia entre el valor actual y el introducido para saber cuantos pasos tenemos que realizar.
El código final en: