@@ -118,6 +118,7 @@ private void OnEventItemDropped(object sender, EventItemDragDropArgs e)
118
118
UnhookEventItemContainer ( e ) ;
119
119
120
120
var newDateItemContainer = e . Source as UIElement ;
121
+ DateTime dropDate = Calendar . GetDay ( newDateItemContainer ) . Date ;
121
122
if ( ! this . InternalDateItemToEventItemLookupTable . TryGetValue ( newDateItemContainer , out List < FrameworkElement > eventItemContainersOfNewDateItemContainer ) )
122
123
{
123
124
eventItemContainersOfNewDateItemContainer = new List < FrameworkElement > ( ) { e . ItemContainer } ;
@@ -156,7 +157,8 @@ private void OnEventItemDropped(object sender, EventItemDragDropArgs e)
156
157
. Select ( itemContainer => this . InternalHostPanels [ itemContainer ] )
157
158
. Distinct ( )
158
159
. OrderByDescending ( Grid . GetColumnSpan ) ;
159
- ArrangeMovedCalendarEventItem ( e . ItemContainer , droppedEventItemContainerHostSiblings , newDateItemContainer ) ;
160
+ double verticalContainerOffset = ( this . DateColumnItemOffsetTable . TryGetValue ( dropDate , out int precedingItemCount ) ? precedingItemCount : 0 ) * e . ItemContainer . DesiredSize . Height ;
161
+ ArrangeMovedCalendarEventItem ( e . ItemContainer , droppedEventItemContainerHostSiblings , newDateItemContainer , verticalContainerOffset ) ;
160
162
}
161
163
162
164
private void UnhookEventItemContainer ( EventItemDragDropArgs e )
@@ -178,7 +180,7 @@ private void UnhookEventItemContainer(EventItemDragDropArgs e)
178
180
}
179
181
}
180
182
181
- private void ArrangeMovedCalendarEventItem ( FrameworkElement movedEventItem , IEnumerable < Panel > movedEventItemHostSiblings , UIElement newDateItemContainer , double verticalContainerOffset = 0 )
183
+ private void ArrangeMovedCalendarEventItem ( FrameworkElement movedEventItem , IEnumerable < Panel > movedEventItemHostSiblings , UIElement newDateItemContainer , double verticalContainerOffset = 1 )
182
184
{
183
185
if ( ! this . InternalDateHeaderToCalendarIndexTable . TryGetValue ( newDateItemContainer , out int calendarIndex ) )
184
186
{
@@ -189,8 +191,9 @@ private void ArrangeMovedCalendarEventItem(FrameworkElement movedEventItem, IEnu
189
191
{
190
192
return ;
191
193
}
192
-
194
+ newDateItemContainer . Measure ( new Size ( double . PositiveInfinity , double . PositiveInfinity ) ) ;
193
195
double heightOffset = newDateItemContainer . DesiredSize . Height + verticalContainerOffset ;
196
+
194
197
List < Panel > siblingHosts = movedEventItemHostSiblings . ToList ( ) ;
195
198
for ( var index = 0 ; index < siblingHosts . Count ; index ++ )
196
199
{
@@ -317,14 +320,18 @@ private int GetRowIndexOf(UIElement itemContainer)
317
320
return rowIndex ;
318
321
}
319
322
323
+ private Dictionary < DateTime , int > DateColumnItemOffsetTable { get ; } = new Dictionary < DateTime , int > ( ) ;
324
+ private Dictionary < Panel , DateTime > PreviouslySpannedPanelsTable { get ; } = new Dictionary < Panel , DateTime > ( ) ;
320
325
private void SpanEventItemOnSpanningRequested ( object sender , EventItemDragDropArgs eventItemDragDropArgs )
321
326
{
322
327
var currentDateContainer = eventItemDragDropArgs . Source as UIElement ;
323
- DateTime targetCalendarDate = Calendar . GetDay ( currentDateContainer ) ;
324
- int dateSpan = targetCalendarDate . Date . Subtract ( eventItemDragDropArgs . OriginalDay . Date ) . Days + 1 ;
328
+ DateTime newTargetCalendarDate = Calendar . GetDay ( currentDateContainer ) ;
329
+ int newDateSpan = newTargetCalendarDate . Date . Subtract ( eventItemDragDropArgs . OriginalDay . Date ) . Days + 1 ;
325
330
bool isNextDateRequireCleanup =
326
331
this . InternalHostPanels . TryGetValue ( eventItemDragDropArgs . ItemContainer , out Panel currentEventItemHost )
327
- && Grid . GetColumnSpan ( currentEventItemHost ) > dateSpan ;
332
+ && Grid . GetColumnSpan ( currentEventItemHost ) > newDateSpan ;
333
+ bool isIncreasingSpan = ! isNextDateRequireCleanup && ! ( this . InternalHostPanels . TryGetValue ( eventItemDragDropArgs . ItemContainer , out Panel eventItemHost ) && this . PreviouslySpannedPanelsTable . TryGetValue ( eventItemHost , out DateTime oldTargetDate ) && oldTargetDate . Equals ( newTargetCalendarDate ) ) ;
334
+
328
335
if ( this . InternalDateHeaderItemLookupTable . TryGetValue (
329
336
eventItemDragDropArgs . OriginalDay . Date ,
330
337
out UIElement originalDateItemContainer ) )
@@ -337,7 +344,7 @@ private void SpanEventItemOnSpanningRequested(object sender, EventItemDragDropAr
337
344
eventItemContainer => this . InternalHostPanels . TryGetValue ( eventItemContainer , out Panel eventHost )
338
345
? eventHost
339
346
: new StackPanel ( ) )
340
- . FirstOrDefault ( eventHost => Grid . GetColumnSpan ( eventHost ) . Equals ( dateSpan ) ) ;
347
+ . FirstOrDefault ( eventHost => Grid . GetColumnSpan ( eventHost ) . Equals ( newDateSpan ) ) ;
341
348
342
349
Panel eventItemContainerHost = null ;
343
350
if ( matchingSpanningHost != null )
@@ -346,22 +353,22 @@ private void SpanEventItemOnSpanningRequested(object sender, EventItemDragDropAr
346
353
if ( this . InternalHostPanels . TryGetValue ( eventItemDragDropArgs . ItemContainer , out Panel originalHost ) )
347
354
{
348
355
originalHost . Children . Remove ( eventItemDragDropArgs . ItemContainer ) ;
349
- this . InternalHostPanels [ eventItemDragDropArgs . ItemContainer ] = matchingSpanningHost ;
356
+ this . InternalHostPanels [ eventItemDragDropArgs . ItemContainer ] = eventItemContainerHost ;
350
357
}
351
358
352
- List < UIElement > panelChildren = matchingSpanningHost . Children . Cast < UIElement > ( ) . ToList ( ) ;
359
+ List < UIElement > panelChildren = eventItemContainerHost . Children . Cast < UIElement > ( ) . ToList ( ) ;
353
360
panelChildren . Add ( eventItemDragDropArgs . ItemContainer ) ;
354
- matchingSpanningHost . Children . Clear ( ) ;
361
+ eventItemContainerHost . Children . Clear ( ) ;
355
362
panelChildren . Sort ( ( element1 , element2 ) => Calendar . GetDay ( element1 ) . CompareTo ( Calendar . GetDay ( element2 ) ) ) ;
356
- panelChildren . ForEach ( item => matchingSpanningHost . Children . Add ( item ) ) ;
363
+ panelChildren . ForEach ( item => eventItemContainerHost . Children . Add ( item ) ) ;
357
364
}
358
365
else
359
366
{
360
367
if ( this . InternalHostPanels . TryGetValue ( eventItemDragDropArgs . ItemContainer , out Panel originalHost ) )
361
368
{
362
369
if ( originalHost . Children . Count == 1 )
363
370
{
364
- Grid . SetColumnSpan ( originalHost , dateSpan ) ;
371
+ Grid . SetColumnSpan ( originalHost , newDateSpan ) ;
365
372
eventItemContainerHost = originalHost ;
366
373
}
367
374
else
@@ -372,57 +379,80 @@ private void SpanEventItemOnSpanningRequested(object sender, EventItemDragDropAr
372
379
this . Children . Remove ( originalHost ) ;
373
380
}
374
381
375
- eventItemContainerHost = new StackPanel ( ) { VerticalAlignment = VerticalAlignment . Top } ;
382
+ eventItemContainerHost = new StackPanel ( ) { VerticalAlignment = VerticalAlignment . Top } ;
376
383
eventItemContainerHost . Children . Add ( eventItemDragDropArgs . ItemContainer ) ;
377
384
eventItemContainerHost . Measure ( new Size ( double . PositiveInfinity , double . PositiveInfinity ) ) ;
378
- Grid . SetColumnSpan ( eventItemContainerHost , dateSpan ) ;
379
- InternalHostPanels [ eventItemDragDropArgs . ItemContainer ] = eventItemContainerHost ;
385
+ Grid . SetColumnSpan ( eventItemContainerHost , newDateSpan ) ;
386
+ this . InternalHostPanels [ eventItemDragDropArgs . ItemContainer ] = eventItemContainerHost ;
387
+
388
+ //for (int dayOffset = 1; dayOffset < dateSpan; dayOffset++)
389
+ //{0
390
+ // DateTime key = eventItemDragDropArgs.OriginalDay.Date.AddDays(dayOffset);
391
+ // this.DateColumnItemOffsetTable[eventItemDragDropArgs.OriginalDay.Date] += 1;
392
+ //}
380
393
}
381
394
}
382
395
}
383
396
397
+ this . PreviouslySpannedPanelsTable [ eventItemContainerHost ] = newTargetCalendarDate . Date ;
398
+
399
+ if ( isIncreasingSpan )
400
+ {
401
+ if ( ! this . DateColumnItemOffsetTable . ContainsKey ( newTargetCalendarDate ) )
402
+ {
403
+ this . DateColumnItemOffsetTable . Add ( newTargetCalendarDate , 0 ) ;
404
+ }
405
+
406
+ this . DateColumnItemOffsetTable [ newTargetCalendarDate ] += 1 ;
407
+ }
384
408
385
409
List < Panel > originalDateEventItemHosts = originalDateEventItems
386
410
. Select ( itemContainer => this . InternalHostPanels [ itemContainer ] )
387
411
. Distinct ( )
388
412
. OrderByDescending ( Grid . GetColumnSpan )
389
413
. ToList ( ) ;
390
- int eventItemPositionInOriginalDateItem = originalDateEventItemHosts . IndexOf ( eventItemContainerHost ) + 1 ;
414
+ int precedingItemsOffset = this . DateColumnItemOffsetTable . TryGetValue (
415
+ eventItemDragDropArgs . OriginalDay . Date ,
416
+ out int itemOffset )
417
+ ? itemOffset
418
+ : 0 ;
391
419
392
- ArrangeMovedCalendarEventItem ( eventItemDragDropArgs . ItemContainer , originalDateEventItemHosts , originalDateItemContainer ) ;
420
+ ArrangeMovedCalendarEventItem ( eventItemDragDropArgs . ItemContainer , originalDateEventItemHosts , originalDateItemContainer , precedingItemsOffset * eventItemDragDropArgs . ItemContainer . DesiredSize . Height ) ;
393
421
394
422
if ( ! object . ReferenceEquals ( currentDateContainer , originalDateItemContainer )
395
423
&& this . InternalDateItemToEventItemLookupTable . TryGetValue (
396
424
currentDateContainer ,
397
- out List < FrameworkElement > currentDateEventItems ) )
425
+ out List < FrameworkElement > currentDateEventItems ) && currentDateEventItems . Any ( ) )
398
426
{
399
427
IEnumerable < Panel > currentDateEventItemHosts = currentDateEventItems
400
428
. Select ( itemContainer => this . InternalHostPanels [ itemContainer ] )
401
429
. Distinct ( )
402
430
. OrderByDescending ( Grid . GetColumnSpan ) ;
403
431
ArrangeCalendarEventItemHostsOfDateItem ( currentDateEventItemHosts ,
404
- currentDateContainer , eventItemDragDropArgs . ItemContainer . DesiredSize . Height * eventItemPositionInOriginalDateItem ) ;
432
+ currentDateContainer , this . DateColumnItemOffsetTable [ newTargetCalendarDate ] * eventItemDragDropArgs . ItemContainer . DesiredSize . Height ) ;
405
433
}
406
434
407
435
if ( isNextDateRequireCleanup )
408
436
{
437
+ DateTime nextDate = newTargetCalendarDate . AddDays ( 1 ) . Date ;
409
438
if ( this . InternalDateHeaderItemLookupTable . TryGetValue (
410
- targetCalendarDate . AddDays ( 1 ) . Date ,
439
+ nextDate ,
411
440
out UIElement nextDateItemContainer ) )
412
441
{
442
+ this . DateColumnItemOffsetTable [ nextDate ] -= 1 ;
413
443
if ( this . InternalDateItemToEventItemLookupTable . TryGetValue (
414
444
nextDateItemContainer ,
415
- out List < FrameworkElement > nextDateEventItems ) )
445
+ out List < FrameworkElement > nextDateEventItems ) && nextDateEventItems . Any ( ) )
416
446
{
417
- int offset = originalDateEventItemHosts . Count ( panel => Grid . GetColumnSpan ( panel ) > dateSpan ) ;
447
+ double offset = this . DateColumnItemOffsetTable [ nextDate ] * eventItemDragDropArgs . ItemContainer . DesiredSize . Height ;
418
448
IEnumerable < Panel > nextDateEventItemHosts = nextDateEventItems
419
449
. Select ( itemContainer => this . InternalHostPanels [ itemContainer ] )
420
450
. Distinct ( )
421
451
. OrderByDescending ( panel => Grid . GetColumnSpan ( panel ) ) ;
422
452
ArrangeCalendarEventItemHostsOfDateItem (
423
453
nextDateEventItemHosts ,
424
454
nextDateItemContainer ,
425
- eventItemDragDropArgs . ItemContainer . DesiredSize . Height * offset ) ;
455
+ offset ) ;
426
456
}
427
457
}
428
458
}
0 commit comments