Calendar Architecture
BeepCalendar internal architecture — 90+ partial file decomposition covering event operations, painting, interactions, commands, and layout theming
Table of Contents
Overview
BeepCalendar is the most decomposed control in the library, split across 90+ partial files organized into 8 subsystems. This design keeps each file focused and manageable despite the control's complexity (~15,000+ lines total).
Partial Class Design
| Subsystem | Files | Responsibility |
|---|---|---|
| Core | 6 files | Constructor, public API, lifecycle, style, appearance |
| Commands | 5 files | Public commands, execution core, helpers, duplicate detection |
| Event Operations | 13 files | CRUD, history (undo/redo), navigation, queries, editor |
| Interactions | 16 files | Pointer events, timing, proposals, hit testing, commitment |
| Painting | 11 files | Pipeline, views (Month/Week/Day/List), design-time, sidebar |
| Layout Theme | 9 files | Theme application, controls, categories, responsive labels |
| Visual Updates | 3 files | Flush, scope, invalidation strategy |
| Types & Fields | 5 files | Enums, EventArgs, command types, event model |
Event Operations
EventOperations/
├── BeepCalendar.EventOperations.cs — Main partial
├── BeepCalendar.EventOperations.Public.cs — Public API
├── BeepCalendar.EventOperations.Navigation.cs — Today/Next/Prev
├── BeepCalendar.EventOperations.Queries.cs — Filter/Search
├── BeepCalendar.EventOperations.Crud.cs — CRUD coordinator
│ ├── Crud.Add.cs — Add event logic
│ ├── Crud.Remove.cs — Remove event logic
│ └── Crud.Upsert.cs — Upsert logic
├── BeepCalendar.EventOperations.History.cs — Undo/redo coordinator
│ ├── History.Internal.cs
│ └── History.Apply.cs — Apply/Apply.Upsert/Apply.Remove
└── BeepCalendar.EventOperations.Editor.cs — Event editor integration
└── Editor.Commit.csPainting Pipeline
Painting/
├── BeepCalendar.Painting.cs — Main partial
├── BeepCalendar.Painting.Pipeline.cs — Paint orchestration
│ ├── Pipeline.Views.cs — View dispatch
│ ├── Pipeline.Telemetry.cs — Performance metrics
│ ├── Pipeline.Legacy.cs — Backward compat
│ └── Pipeline.HeaderFormatting.cs
├── BeepCalendar.Painting.Views.cs — View-level paint
│ ├── Painting.MonthView.cs + MonthView.Events.cs + MonthView.Headers.cs
│ ├── Painting.WeekView.cs + WeekView.Events.cs
│ ├── Painting.DayView.cs
│ └── Painting.ListView.cs
├── BeepCalendar.Painting.DesignTime.cs — Designer preview
├── BeepCalendar.Painting.Helpers.cs — Paint utilities
└── BeepCalendar.Painting.Sidebar.cs — Sidebar calendarInteraction System
The interaction system handles all pointer/touch/mouse events with hit testing that adapts to the current view mode:
- Pointer — Mouse down/up/move/cancel with view-specific hit testing
- Timing — Start/end time selection with snap-to-grid (configurable interval)
- Proposals — Visual preview of event being created (ghost rectangle)
- Hit Testing — MonthView, WeekView, DayView, TimelineView, TimedView, ListView, AgendaView
- Commitment — New event creation, copy-on-drag, modification tracking
File Map
Notable internal helpers:
- CalendarEventEditor — Public sealed class implementing
ICalendarEventEditor. Opens a dialog form with a UserControl for editing event details (title, start/end, all-day, location, status, organizer, description). - CalendarLayoutManager — Calculates cell positions and dimensions for each view mode
- CalendarViewStateHelper — Tracks view state across mode switches
- CalendarPerformanceMetrics — Measures rendering performance
- CalendarEventService — Conflict detection and resolution
Examples
var cal = new BeepCalendar();
// View modes
cal.ViewMode = CalendarViewMode.Month; // Month/Week/Day/Agenda/Timeline
cal.CurrentDate = DateTime.Today;
cal.ShowSidebar = true;
// Events
cal.Events.Add(new CalendarEvent
{
Title = "Team Standup",
Start = DateTime.Today.AddHours(9),
End = DateTime.Today.AddHours(9.5),
Category = categories["Meeting"]
});
// Undo/redo
if (cal.CanUndo) cal.Undo();
if (cal.CanRedo) cal.Redo();
// Conflict detection
cal.ConflictDetected += (s, e) =>
Console.WriteLine($"Conflict: {e.Conflict.Description}");