@@ -163,53 +163,19 @@ public override void AddChild(IRenderer renderer) {
163
163
}
164
164
else {
165
165
if ( currentArea . IsEmptyArea ( ) && result . GetAreaBreak ( ) == null ) {
166
- if ( true . Equals ( result . GetOverflowRenderer ( ) . GetModelElement ( ) . GetProperty < bool ? > ( Property . KEEP_TOGETHER ) )
167
- ) {
168
- result . GetOverflowRenderer ( ) . GetModelElement ( ) . SetProperty ( Property . KEEP_TOGETHER , false ) ;
169
- ILog logger = LogManager . GetLogger ( typeof ( RootRenderer ) ) ;
170
- logger . Warn ( MessageFormatUtil . Format ( iText . IO . LogMessageConstant . ELEMENT_DOES_NOT_FIT_AREA , "KeepTogether property will be ignored."
171
- ) ) ;
172
- if ( ! rendererIsFloat ) {
173
- rootRendererStateHandler . AttemptGoBackToStoredPreviousStateAndStoreNextState ( this ) ;
174
- }
166
+ bool keepTogetherChanged = TryDisableKeepTogether ( result , rendererIsFloat , rootRendererStateHandler ) ;
167
+ bool areKeepTogetherAndForcedPlacementBothNotChanged = ! keepTogetherChanged ;
168
+ if ( areKeepTogetherAndForcedPlacementBothNotChanged ) {
169
+ areKeepTogetherAndForcedPlacementBothNotChanged = ! UpdateForcedPlacement ( renderer , result . GetOverflowRenderer
170
+ ( ) ) ;
175
171
}
176
- else {
177
- if ( null != result . GetCauseOfNothing ( ) && true . Equals ( result . GetCauseOfNothing ( ) . GetProperty < bool ? > ( Property
178
- . KEEP_TOGETHER ) ) ) {
179
- // set KEEP_TOGETHER false on the deepest parent (maybe the element itself) to have KEEP_TOGETHER == true
180
- IRenderer theDeepestKeptTogether = result . GetCauseOfNothing ( ) ;
181
- IRenderer parent ;
182
- while ( null == theDeepestKeptTogether . GetModelElement ( ) || null == theDeepestKeptTogether . GetModelElement (
183
- ) . GetOwnProperty < bool ? > ( Property . KEEP_TOGETHER ) ) {
184
- parent = ( ( AbstractRenderer ) theDeepestKeptTogether ) . parent ;
185
- if ( parent == null ) {
186
- break ;
187
- }
188
- theDeepestKeptTogether = parent ;
189
- }
190
- theDeepestKeptTogether . GetModelElement ( ) . SetProperty ( Property . KEEP_TOGETHER , false ) ;
191
- ILog logger = LogManager . GetLogger ( typeof ( RootRenderer ) ) ;
192
- logger . Warn ( MessageFormatUtil . Format ( iText . IO . LogMessageConstant . ELEMENT_DOES_NOT_FIT_AREA , "KeepTogether property of inner element will be ignored."
193
- ) ) ;
194
- if ( ! rendererIsFloat ) {
195
- rootRendererStateHandler . AttemptGoBackToStoredPreviousStateAndStoreNextState ( this ) ;
196
- }
197
- }
198
- else {
199
- if ( ! true . Equals ( renderer . GetProperty < bool ? > ( Property . FORCED_PLACEMENT ) ) ) {
200
- result . GetOverflowRenderer ( ) . SetProperty ( Property . FORCED_PLACEMENT , true ) ;
201
- ILog logger = LogManager . GetLogger ( typeof ( RootRenderer ) ) ;
202
- logger . Warn ( MessageFormatUtil . Format ( iText . IO . LogMessageConstant . ELEMENT_DOES_NOT_FIT_AREA , "" ) ) ;
203
- }
204
- else {
205
- // FORCED_PLACEMENT was already set to the renderer and
206
- // LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA message was logged.
207
- // This else-clause should never be hit, otherwise there is a bug in FORCED_PLACEMENT implementation.
208
- System . Diagnostics . Debug . Assert ( false ) ;
209
- // Still handling this case in order to avoid nasty infinite loops.
210
- break ;
211
- }
212
- }
172
+ if ( areKeepTogetherAndForcedPlacementBothNotChanged ) {
173
+ // FORCED_PLACEMENT was already set to the renderer and
174
+ // LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA message was logged.
175
+ // This else-clause should never be hit, otherwise there is a bug in FORCED_PLACEMENT implementation.
176
+ System . Diagnostics . Debug . Assert ( false ) ;
177
+ // Still handling this case in order to avoid nasty infinite loops.
178
+ break ;
213
179
}
214
180
}
215
181
else {
@@ -520,5 +486,49 @@ private void AddWaitingNextPageRenderers() {
520
486
AddChild ( renderer ) ;
521
487
}
522
488
}
489
+
490
+ private bool UpdateForcedPlacement ( IRenderer currentRenderer , IRenderer overflowRenderer ) {
491
+ if ( true . Equals ( currentRenderer . GetProperty < bool ? > ( Property . FORCED_PLACEMENT ) ) ) {
492
+ return false ;
493
+ }
494
+ else {
495
+ overflowRenderer . SetProperty ( Property . FORCED_PLACEMENT , true ) ;
496
+ ILog logger = LogManager . GetLogger ( typeof ( RootRenderer ) ) ;
497
+ if ( logger . IsWarnEnabled ) {
498
+ logger . Warn ( MessageFormatUtil . Format ( iText . IO . LogMessageConstant . ELEMENT_DOES_NOT_FIT_AREA , "" ) ) ;
499
+ }
500
+ return true ;
501
+ }
502
+ }
503
+
504
+ private bool TryDisableKeepTogether ( LayoutResult result , bool rendererIsFloat , RootRendererAreaStateHandler
505
+ rootRendererStateHandler ) {
506
+ IRenderer toDisableKeepTogether = null ;
507
+ // looking for the most outer keep together element
508
+ IRenderer current = result . GetCauseOfNothing ( ) ;
509
+ while ( current != null ) {
510
+ if ( true . Equals ( current . GetProperty < bool ? > ( Property . KEEP_TOGETHER ) ) ) {
511
+ toDisableKeepTogether = current ;
512
+ }
513
+ current = current . GetParent ( ) ;
514
+ }
515
+ if ( toDisableKeepTogether == null ) {
516
+ return false ;
517
+ }
518
+ // Ideally the disabling of keep together property should be done on the renderers layer,
519
+ // but due to the problem with renderers tree (parent links from causeOfNothing
520
+ // may not lead to overflowRenderer) such approach does not work now. So we
521
+ // disabling keep together on the models layer.
522
+ toDisableKeepTogether . GetModelElement ( ) . SetProperty ( Property . KEEP_TOGETHER , false ) ;
523
+ ILog logger = LogManager . GetLogger ( typeof ( RootRenderer ) ) ;
524
+ if ( logger . IsWarnEnabled ) {
525
+ logger . Warn ( MessageFormatUtil . Format ( iText . IO . LogMessageConstant . ELEMENT_DOES_NOT_FIT_AREA , "KeepTogether property will be ignored."
526
+ ) ) ;
527
+ }
528
+ if ( ! rendererIsFloat ) {
529
+ rootRendererStateHandler . AttemptGoBackToStoredPreviousStateAndStoreNextState ( this ) ;
530
+ }
531
+ return true ;
532
+ }
523
533
}
524
534
}
0 commit comments