private void SetDragCursor(bool?columnIsCompatible, AppointmentDragObject appointmentDragObject) { const string CannotDropTag = "0"; const string CanDropTag = "1"; if (columnIsCompatible == null) { Cursor.Tag = null; } else { if (columnIsCompatible.Value) { if ((Cursor.Tag as string) != CanDropTag) { Cursor.Current = Tools.Cursor.CreateCursor(appointmentDragObject.CanDropAppointmentBitmap, 0, 0); Cursor.Tag = CanDropTag; } } else { if ((Cursor.Tag as string) != CannotDropTag) { Cursor.Current = Tools.Cursor.CreateCursor(appointmentDragObject.CannotDropAppointmentBitmap, 0, 0); Cursor.Tag = CannotDropTag; } } } }
internal void FireAppointmentDraggedEvent(AppointmentDragObject dragObject) { try { var sourceColumn = dragObject.SourceColumn; var appointment = dragObject.Appointment; if (appointment == null) { throw new ArgumentException("dragObject", "Appointment property is null"); } OnAppointmentDrag(sourceColumn, appointment); if (AppointmentDragged != null) { AppointmentDragged( new AppointmentDraggedEvent { Source = this, SourceColumn = sourceColumn, Appointment = appointment, } ); } } catch (Exception error) { ExceptionDialog.Show(this, error); } }
internal bool FireAppointmentDraggingEvent(int col, int row, AppointmentDragObject dragObject) { var result = _lastDraggedOver.Item3; try { if (_lastDraggedOver.Item1 == col && _lastDraggedOver.Item2 == row) { return(_lastDraggedOver.Item3); } var dragOverColumn = ViewModel.GetColumnAt(col); if (dragOverColumn == null) { return(false); } var sourceColumn = dragObject.SourceColumn; var appointment = dragObject.Appointment; if (appointment == null) { throw new ArgumentException("dragObject", "Appointment property is null"); } var draggingOverStartTime = base.HasColHeaders && row == -1 ? appointment.StartTime : ViewModel.RowToStartTime(row); var draggingOverEndTime = draggingOverStartTime.Add(appointment.EndTime.Subtract(appointment.StartTime)); var dragCompatible = OnAppointmentDragging(appointment, dragOverColumn.ColumnDataObject, draggingOverStartTime, draggingOverEndTime); if (dragCompatible) { if (AppointmentDragging != null) { foreach (EventHandlerEx <AppointmentDraggingEvent> handler in AppointmentDragging.GetInvocationList()) { var eventArgs = new AppointmentDraggingEvent { Source = this, SourceColumn = sourceColumn, DestinationColumn = dragOverColumn.ColumnDataObject, DestinationStartTime = draggingOverStartTime, DestinationEndTime = draggingOverEndTime, Appointment = appointment }; handler.Invoke(eventArgs); dragCompatible = eventArgs.IsDestinationCompatible; if (!dragCompatible) { break; } } } } result = dragCompatible; } catch (Exception error) { ExceptionDialog.Show(this, error); result = false; } finally { _lastDraggedOver = Tuple.Create(col, row, result); } return(result); }
internal void FireAppointmentDropEvent(AppointmentDragObject dragObject, int col, int row) { try { var column = ViewModel.GetColumnAt(col); if (column == null) { throw new ArgumentOutOfRangeException("col"); } var sourceColumn = dragObject.SourceColumn; var appointment = dragObject.Appointment; if (appointment == null) { throw new ArgumentException("dragObject", "Appointment property is null"); } DateTime startTime, endTime; if (row < 0) { // appointment dragged over column header, which means use original start/end time startTime = appointment.StartTime; endTime = appointment.EndTime; } else { var rowStart = ViewModel.RowToStartTime(row); var offset = rowStart.Subtract(appointment.StartTime); startTime = appointment.StartTime.Add(offset); endTime = appointment.EndTime.Add(offset); } OnAppointmentDrop(sourceColumn, column.ColumnDataObject, appointment, startTime, endTime); if (AppointmentDrop != null) { AppointmentDrop( new AppointmentDropEvent { Source = this, SourceColumn = sourceColumn, TargetColumn = column.ColumnDataObject, StartTime = startTime, EndTime = endTime, Appointment = appointment } ); } } catch (Exception error) { ExceptionDialog.Show(this, error); } }
public override void BeginDragging(int col, int row, Point mouseLocation) { try { // Select the appointment if not selected var appointment = ViewModel.GetAppointmentBlockAt(col, row); if (_selectedAppointment != appointment) { SelectAppointment(appointment.AppointmentDataObject); } // initiate dragging start if (!FireAppointmentDragStartingEvent(col, row)) { return; } // Tell base grid the state is dragging SelectState = GridSelectingState.Dragging; if (appointment == null) { throw new ArgumentOutOfRangeException("col, row", "No appointment found at specified position"); } int startCol = col, startRow = appointment.StartRow; int endCol = col, endRow = appointment.EndRow; TransformModelToGrid(ref startCol, ref startRow); TransformModelToGrid(ref endCol, ref endRow); var rectangle = _grid.RangeToRectangle( new Range( new Position(startRow, startCol), new Position(endRow, endCol) ) ); var column = ViewModel.GetColumnAt(col); var appointmentDragObject = new AppointmentDragObject { SourceColumn = column.ColumnDataObject, Appointment = appointment.AppointmentDataObject }; using (var controlBitmap = new Bitmap(_grid.Width, _grid.Height)) { _grid.DrawToBitmap(controlBitmap, new Rectangle(0, 0, _grid.Width, _grid.Height)); appointmentDragObject.CanDropAppointmentBitmap = controlBitmap.Copy(rectangle); appointmentDragObject.CannotDropAppointmentBitmap = appointmentDragObject .CanDropAppointmentBitmap .Resize( new Size( Tools.Maths.ClipValue(appointmentDragObject.CanDropAppointmentBitmap.Width, CannotDropIcon.Width, appointmentDragObject.CanDropAppointmentBitmap.Width), Tools.Maths.ClipValue(appointmentDragObject.CanDropAppointmentBitmap.Height, CannotDropIcon.Height, appointmentDragObject.CanDropAppointmentBitmap.Height) ), ResizeMethod.AspectFitPadded, ResizeAlignment.TopLeft, InterpolationMode.Low, Color.Transparent, PixelFormat.Format32bppArgb ); // Draw a cross on the CannotDrop bitmap using (var graphics = Graphics.FromImage(appointmentDragObject.CannotDropAppointmentBitmap)) { graphics.DrawIcon(CannotDropIcon, 0, 0); } } Debug.Assert(appointment != null); var startCellRectangle = _grid.PositionToRectangle(new Position(startRow, startCol)); var offset = mouseLocation.Subtract(startCellRectangle.Location); Cursor.Position = Cursor.Position.Subtract(offset); appointmentDragObject.CursorOffset = offset; var result = base.DoDragDrop(appointmentDragObject, DragDropEffects.Move); Cursor.Tag = null; if (result.HasAnyFlags(DragDropEffects.Move, DragDropEffects.Copy)) { FireAppointmentDraggedEvent(appointmentDragObject); } Cursor.Position = Cursor.Position.Add(offset); EndDragging(); FireMouseUp(0, 0, new MouseEventArgs(MouseButtons.Left, 1, 0, 0, 0)); if (result.HasFlag(DragDropEffects.Copy)) { RefreshFromDataSource(); // if we dropped into another grid, then the source (this) needs to hydrate too } } catch (Exception error) { ExceptionDialog.Show(this, error); } }
internal bool FireAppointmentDropStartingEvent(AppointmentDragObject dragObject, int col, int row) { try { var column = ViewModel.GetColumnAt(col); if (column == null) { return(false); } var sourceColumn = dragObject.SourceColumn; var appointment = dragObject.Appointment; if (appointment == null) { return(false); } DateTime startTime, endTime; if (row < 0) { // appointment dragged over column header, which means use original start/end time startTime = appointment.StartTime; endTime = appointment.EndTime; } else { var rowStart = ViewModel.RowToStartTime(row); var offset = rowStart.Subtract(appointment.StartTime); startTime = appointment.StartTime.Add(offset); endTime = appointment.EndTime.Add(offset); } var dragAccepted = OnAppointmentDropStarting(sourceColumn, column.ColumnDataObject, appointment, startTime, endTime); if (dragAccepted) { if (AppointmentResizingFinished != null) { foreach (EventHandlerEx <AppointmentDropStartingEvent> handler in AppointmentDropStarting.GetInvocationList()) { var eventArgs = new AppointmentDropStartingEvent { Source = this, SourceColumn = sourceColumn, TargetColumn = column.ColumnDataObject, StartTime = startTime, EndTime = endTime, Appointment = appointment }; handler.Invoke(eventArgs); dragAccepted = !eventArgs.Cancel; if (!dragAccepted) { break; } } } } return(dragAccepted); } catch (Exception error) { ExceptionDialog.Show(this, error); return(false); } }