To achieve Drag and Drop functionality for activities within the adf Calendar:
- Add 'Calendar Drop Target' as a child to Calendar:
- Add the code below in calendarDropListener
For more details on adding Drag and Drop functionality to adf Calendar refer to Oracle docs
- Add 'Calendar Drop Target' as a child to Calendar:
<af:calendarDropTarget dropListener="#{pageFlowScope.calendarBean.calendarDropListener}" actions="MOVE">
<af:dataFlavor flavorClass="org.apache.myfaces.trinidad.model.RowKeySet" discriminant="DnDAcivityModel"/>
</af:calendarDropTarget>
- Add the code below in calendarDropListener
public DnDAction calendarDropListener(DropEvent dropEvent)
{
TimeZone timeZone1 = TimeZone.getDefault();
Transferable transferable = dropEvent.getTransferable();
CalendarActivity activity =
(CalendarActivity) transferable.getData(DataFlavor.getDataFlavor(CalendarActivity.class));
CalendarDropSite dropSite = (CalendarDropSite) dropEvent.getDropSite();
Date dropTargetDate = dropSite.getDate(); //Date at drop target, time is defaulted at 00:00:00 in month view.
System.out.println("Drop Date:"+ dropTargetDate);
Date sourceStartDate = activity.getStartDate(timeZone1); // Start date of dragged activity
Date sourceEndDate = activity.getEndDate(timeZone1); // End date of dragged activity
System.out.println("Old start date:" + sourceStartDate);
System.out.println("Old end date:" + sourceEndDate);
// Calculate new start date for dragged activity
Date targetStartDate = null;
// In day and week view
if (calendarBinding.getView().equals("day") || calendarBinding.getView().equals("week"))
{
// Start date will be same as target date
targetStartDate = dropTargetDate;
}
else // In month view
{
// New start date will be target date with start date time component
// If start date is 12/23/2014 07:38:16 and target date is 12/24/2014 00:00:00
// then the new start date will be 12/24/2014 07:38:16
targetStartDate = setStartDate(sourceStartDate, dropTargetDate);
}
// Calculate new end date by adding the difference of start and end date to new start date.
Date targetEndDate =
setEndDate(sourceStartDate, sourceEndDate, targetStartDate);
System.out.println("New start Date:" + targetStartDate);
System.out.println("New end Date:" + targetEndDate);
//Update Calendar Model with new start and end dates for dragged activity
activity.setStartDate(targetStartDate, timeZone1);
activity.setEndDate(targetEndDate, timeZone1);
OperationBinding op = ADFUtils.findOperation("Commit");
op.execute();
return dropEvent.getProposedAction();
}
public Date setStartDate(Date sourceStartDate, Date targetDate)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(sourceStartDate);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
calendar.setTime(targetDate);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DATE);
calendar.set(year, month, day, hour, minute, second);
Date newStartDate = calendar.getTime();
return newStartDate;
}
public Date setEndDate(Date sourceStartDate, Date sourceEndDate,
Date targetStartDate)
{
long diff = sourceEndDate.getTime() - sourceStartDate.getTime();
int diffDays = (int) ((diff) / (1000 * 60 * 60 * 24));
Calendar calendar = Calendar.getInstance();
calendar.setTime(sourceEndDate);
int tHour = calendar.get(Calendar.HOUR);
int tMinute = calendar.get(Calendar.MINUTE);
int tSecond = calendar.get(Calendar.SECOND);
calendar.setTime(sourceStartDate);
int sHour = calendar.get(Calendar.HOUR);
int sMinute = calendar.get(Calendar.MINUTE);
int sSecond = calendar.get(Calendar.SECOND);
calendar.setTime(targetStartDate);
calendar.add(Calendar.DATE, diffDays);
calendar.add(Calendar.HOUR, tHour - sHour);
calendar.add(Calendar.MINUTE, tMinute - sMinute);
calendar.add(Calendar.SECOND, tSecond - sSecond);
Date newEndDate = calendar.getTime();
return newEndDate;
}
For more details on adding Drag and Drop functionality to adf Calendar refer to Oracle docs