CSS Zibaldone

[ Home ] - [ Articoli ] - [ Traduzioni ] - [ Altro ] - [ Appunti sui CSS ] - [ L'autore ]

Sei qui: Home > Traduzioni > Design di alto livello dello Space Manager

Design di alto livello dello Space Manager

Articolo originale: http://lxr.mozilla.org/seamonkey/source/layout/doc/HLD-SpaceManager.html

Traduzione: Gabriele Romanato (18 agosto 2007)

Introduzione

Lo Space Manager (e classi e strutture associate) vengono usati dal layout Block e Line per controllare le zone rettangolari che sono occupate o disponibili, per la corretta gestione degli elementi flottati e degli elementi che fluiscono intorno a questi ultimi. Quando gli elementi sono flottati a destra o a sinistra in un layout, essi occupano spazio ed influenzano il posizionamento degli altri elementi. Lo Space Manager ha il compito di registrare dove viene occupato spazio e dove invece è disponibile. Questa informazione viene usata dal layout di blocco per calcolare correttamente dove devono essere posizionati altri elementi flottati, e quanto spazio resta disponibile per i normali elementi nel flusso che scorrono attorno alle parti flottate.

Lo Space Manager lavora congiuntamente con diverse altre classi. Le classi che vengono considerate parte dello Space Manager sono:

Al di fuori dello Space Manager stesso, i client dello Space Manager rivestono un ruolo importante nella gestione dello spazio disponibile ed in uso. Le classi principali che interagiscono con lo Space Manager sono:

Il modello di interazione generico consiste nel creare uno Space Manager per un frame di blocco nel contesto di un Reflow, e di associarlo con il BlockReflowState in modo che venga passato ai metodi di reflow dei frame figli. Dopo il reflow, lo Space Manager viene distrutto. Durante il reflow, lo Space Manager memorizza lo spazio occupato dai float (UpdateSpaceManager in nsBlockFrame) e fornisce informazioni sullo spazio disponibile per gli altri elementi (GetAvailableSpace in nsBlockReflowState).

Inoltre vi è il bisogno di gestire l'impatto sulle righe causato dai cambiamenti agli elementi flottati. Questo viene detto Propagation of Float Damage e viene gestito dal Block Frame, che fa uso dello Space Manager. Quando un float viene risistemato in modo incrementale, lo Space Manager si accorge se la zona del float è cambiata. Se ciò avviene, lo spazio verticale (che comprende la precendente zona del float e la sua nuova zona) viene segnalato nell' nsIntervalSet interno come "danno potenziale del float" (il metodo è IncludeInDamage). Durante la risistemazione incrementale delle righe "sporche" il frame di blocco può incontrare righe che NON sono sporche. In questo caso viene chiesto allo Space Manager se vi è un danno dei float, e in caso affermativo il blocco prosegue verificando se il danno interseca l'area della riga non-sporca, rendendola sporca se vi è un'intersezione. In questo modo i cambiamenti ai float su altre righe possono avere un impatto su righe altrimenti "pulite", e lo Space Manager ne facilita l'individuazione.

Modello di dati

Diagramma classi/componenti

Diagramma delle classi di Space Manager

Casi d'uso

Caso d'uso 1: Space Manager viene creato/distrutto

Le istanze di Space Manager vengono create nel metodo Reflow di nsBlockFrame.

Se il BlockReflowState ha già un'istanza di Space Manager ad esso associata, viene memorizzata prima di essere sostituita e quindi restituita all'istanza di dopo che la nuova è stata distrutta. Di fatto gli Space Manager sono "annidati" durante il reflow, con ciascun blocco che introduce il proprio Space Manager.

Caso d'uso 2: Un float viene aggiunto allo Space Manager

Dopo che uno Space Manager è stato creato per un reflow di blocco, si può aggiungere un float ad esso. Ciò avviene nel metodo nsBlockReflowState::RecoverFloats e nsBlockReflowState::FlowAndPlaceFloat (prima veniva fatto in nsBlockFrame::UpdateSpaceManager).

L'algoritmo generale in nsBlockReflowState::RecoverFloats è:

L'algoritmo generale in nsBlockReflowState::FlowAndPlaceFloat è:

Caso d'uso 3: Space Manager viene usato per trovare lo spazio disponibile per il reflow

nsBlockFrame fa uso dello Space Manager per ottenere lo spazio disponibile per il reflow di un figlio di blocco o inline. Il frame di blocco usa un metodo helper sulla classe nsBlockReflowState per effettuare il calcolo effettivo dello spazio disponibile sulla base dei dati dello Space Manager. Ecco il suo funzionamento nel caso di un reflow di un frame inline all'interno di un blocco (e anche nel caso del reflow di un frame di blocco e, parzialmente, per la preparazione di un ridimensionamento).

Caso d'uso 4: Propagazione del Float Damage: individuare e gestire il danno dei float

Questo processo è gestito dal Block Frame.

Problemi/bug riscontrati durante la documentazione: