!7 concept CalendarEntry { int year, month, day; S text; } module Calendar > DynSCP { int year = localYear(), month = localMonth(); start { dbIndexing(CalendarEntry, 'year); onChange(r revisualize2); } visualize { ret northAndCenterWithMargins(rightAlignedLine( dm_fieldSpinner('year, 1970, 2030)), super.visualize()); } visualize2 { setModuleName("Calendar (" + month + "/" + year + ")"); int days = daysInMonth(year, month); int weekDay = dayOfWeek_nr(calendarFromYMD(year, month, 1))-1; print("Weekday " + year + "/" + month + "/" + 1 + ": " + weekDay); new LL rows; rows.add(map(intRangeList(7), func(int i) -> Component { jcenteredlabel(shortEnglishWeekdays().get(i)) })); rows.add(new L); Map entries = indexByField day(conceptsWhere(CalendarEntry, +year, +month)); for (int i = 1; i <= days; i++) { if (l(last(rows)) > weekDay) rows.add(new L); while (weekDay > l(last(rows))) last(rows).add(jlabel()); JLabel lbl = jcenteredlabel(str(i)); if (entries.containsKey(i)) setOpaqueBackground(Color.GREEN, lbl); last(rows).add(lbl); weekDay = (weekDay+1) % 7; } while (l(last(rows)) < 7) last(rows).add(jlabel()); ret hvgrid(rows); } }