I have two sources for dragging and dropping appointments onto the ScheduleView. Both consist of dragging custom appt objects so they both utilize a custom dragdrop handler class and use the override of the ConvertDraggedData method. I am wondering if it would be possible to arrange the appts in such a way that if I grabbed appts from all over the view and then dragged them to a specific resource at a specific time, If I could then just have them updated in such a way that the appts were dropped one after another in the view (stacked horizontally in timeline view for example). I think the issue I am having is that destination slots need to be updated somehow to reflect where I want the appts to eventually be. Hopefully this isn't too confusing and someone can lead me in the right direction. Here is a bit of code that I wrote but obviously it isn't working like I expect at this point. I am basically trying to re-arrange the appts so that one comes right after another when they are dropped. The collection looks like I expect when it comes out of my ArrageTasks, but the result is the appts still end up in slots all over the view.
public
override
IEnumerable<IOccurrence> ConvertDraggedData(
object
data)
{
if
(data.GetType() ==
typeof
(DataObject))
{
return
ArrangeTasks(data);
//return (data as DataObject).GetData("MetrixTaskAppointments") as IList<IOccurrence>;
}
return
base
.ConvertDraggedData(data);
}
private
IEnumerable<IOccurrence> ArrangeTasks(
object
data)
{
IList<IOccurrence> appts = (data
as
DataObject).GetData(
"MetrixTaskAppointments"
)
as
IList<IOccurrence>;
IEnumerable<IOccurrence> sortedAppts = appts.OrderBy(f => f.Start);
IEnumerator apptEnumerator = sortedAppts.GetEnumerator();
DateTime savedPlanTravelEndDttm = DateTime.Now;
bool
firstTask =
true
;
while
(apptEnumerator.MoveNext())
{
MetrixTaskAppointment mAppt = (MetrixTaskAppointment)apptEnumerator.Current;
IAppointment appt = (Appointment)apptEnumerator.Current;
if
(firstTask ==
true
)
{
firstTask =
false
;
}
else
{
mAppt.PlanTravelStartDttm = savedPlanTravelEndDttm;
mAppt.PlanStartDttm = mAppt.PlanTravelStartDttm.AddMinutes(mAppt.PlanTravelToMin);
mAppt.PlanEndDttm = mAppt.PlanStartDttm.AddMinutes(mAppt.PlanTaskDurMin);
mAppt.PlanTravelEndDttm = mAppt.PlanEndDttm.AddMinutes(mAppt.PlanTravelReturnMin);
appt.Start = mAppt.PlanStartDttm;
appt.End = mAppt.PlanEndDttm;
}
savedPlanTravelEndDttm = mAppt.PlanTravelEndDttm;
}
return
sortedAppts;
}
List<Telerik.Windows.Controls.Map.Location> locations =
this
.MyPushpins.Select(pin => pin.Location).ToList();
LocationRect rect = this.GetBestView(locations,
new
Size(0.01, 0.01));
MapCenter = rect.Center;
MapZoomLevel = rect.ZoomLevel;
public
LocationRect GetBestView(IEnumerable<PointOfInterest> itemsList, Size defaultSize)
{
LocationRect bestView =
new
LocationRect();
Location northEast = Location.Empty;
Location southWest = Location.Empty;
foreach
(PointOfInterest item
in
itemsList)
{
Location location = item.Location;
if
(northEast.IsEmpty)
{
northEast = location;
}
else
{
if
(!location.IsEmpty)
{
northEast.Latitude = Math.Max(northEast.Latitude, location.Latitude);
northEast.Longitude = Math.Max(northEast.Longitude, location.Longitude);
}
}
if
(southWest.IsEmpty)
{
southWest = location;
}
else
{
if
(!location.IsEmpty)
{
southWest.Latitude = Math.Min(southWest.Latitude, location.Latitude);
southWest.Longitude = Math.Min(southWest.Longitude, location.Longitude);
}
}
}
if
(!northEast.IsEmpty && !southWest.IsEmpty)
{
bestView =
new
LocationRect(northEast, southWest);
if
(bestView.IsEmpty)
{
bestView =
new
LocationRect(
new
Location(bestView.North + defaultSize.Height / 2.0, bestView.West - defaultSize.Width / 2.0),
new
Location(bestView.North - defaultSize.Height / 2.0, bestView.West + defaultSize.Width / 2.0));
}
}
return
bestView;
}