Example #1
0
        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;
                    }
                }
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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);
            }
        }
Example #6
0
        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);
            }
        }