/** * Copyright (c) 2015, MindFusion LLC - Bulgaria. */ package effects; import java.awt.*; import java.util.*; import javax.swing.*; import com.mindfusion.common.*; import com.mindfusion.common.Rectangle; import com.mindfusion.drawing.*; import com.mindfusion.drawing.Color; import com.mindfusion.drawing.Font; import com.mindfusion.drawing.Graphics; import com.mindfusion.scheduling.*; import com.mindfusion.scheduling.awt.AwtCalendar; import com.mindfusion.scheduling.model.*; public class MainWindow extends JFrame { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { MainWindow window = null; try { window = new MainWindow(); window.setVisible(true); } catch (Exception exp) { } } }); } public MainWindow() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationByPlatform(true); setSize(1024, 768); calendar = new AwtCalendar(); calendar.setCurrentTime(DateTime.now()); calendar.setDate(new DateTime(2012, 6, 8)); calendar.setEndDate(new DateTime(2012, 7, 7)); setLayout(new BorderLayout()); getContentPane().add(calendar, BorderLayout.CENTER); // Defaults calendar.beginInit(); calendar.setCurrentView(CalendarView.Timetable); calendar.setTheme(ThemeType.Vista); calendar.setCustomDraw(CustomDrawElements.TimetableCell); calendar.getSelection().getSelectedElementsStyle().setBorderBottomColor(Colors.Transparent); calendar.getSelection().getSelectedElementsStyle().setBorderBottomWidth(-1); calendar.getSelection().getSelectedElementsStyle().setBorderLeftColor(Colors.Transparent); calendar.getSelection().getSelectedElementsStyle().setBorderLeftWidth(-1); calendar.getSelection().getSelectedElementsStyle().setBorderRightColor(Colors.Transparent); calendar.getSelection().getSelectedElementsStyle().setBorderRightWidth(-1); calendar.getSelection().getSelectedElementsStyle().setBorderTopColor(Colors.Transparent); calendar.getSelection().getSelectedElementsStyle().setBorderTopWidth(-1); calendar.getSelection().getSelectedElementsStyle().setFillColor(Colors.Transparent); calendar.getSelection().getSelectedElementsStyle().setBrush(Brushes.Transparent); calendar.getSelection().getSelectedElementsStyle().setHeaderBorderBottomColor(new Color(0, 0, 0, 0)); calendar.getTimetableSettings().getCellStyle().setBorderBottomColor(new Color(169, 169, 169)); calendar.getTimetableSettings().getCellStyle().setBorderBottomWidth(1); calendar.getTimetableSettings().getCellStyle().setBorderLeftColor(new Color(169, 169, 169)); calendar.getTimetableSettings().getCellStyle().setBorderLeftWidth(1); calendar.getTimetableSettings().getCellStyle().setBorderRightColor(new Color(169, 169, 169)); calendar.getTimetableSettings().getCellStyle().setBorderRightWidth(1); calendar.getTimetableSettings().getCellStyle().setBorderTopColor(new Color(169, 169, 169)); calendar.getTimetableSettings().getCellStyle().setBorderTopWidth(1); calendar.getTimetableSettings().getCellStyle().setHeaderTextShadowOffset(0); calendar.getTimetableSettings().getCellStyle().setHeaderTextShadowStyle(ShadowStyle.None); calendar.getTimetableSettings().getDates().clear(); calendar.getTimetableSettings().getDates().add(DateTime.today()); calendar.getTimetableSettings().getDates().add(DateTime.today().addDays(1)); calendar.getTimetableSettings().setItemOffset(infoSize); calendar.getTimetableSettings().setShowItemSpans(false); calendar.getTimetableSettings().setVisibleColumns(2); calendar.getTimetableSettings().setSnapInterval(Duration.fromMinutes(1)); calendar.getTimetableSettings().setMaxItemSize(100); calendar.endInit(); zones.add(new Zone(DateTime.today().addHours(10), DateTime.today().addHours(12), 2)); zones.add(new Zone(DateTime.today().addHours(28), DateTime.today().addHours(35), 4)); calendar.setCustomDraw(CustomDrawElements.TimetableCell); calendar.addCalendarListener(new CalendarAdapter() { @Override public void draw(DrawEvent e) { if (e.getElement() == CustomDrawElements.TimetableCell) { DateTime cellStart = DateTime.op_Addition(e.getDate(), e.getStartTime()); DateTime cellEnd = DateTime.op_Addition(cellStart, calendar.getTimetableSettings().getCellTime()); boolean zone = false; boolean zoneStart = false; boolean zoneEnd = false; Zone theZone = null; for (Zone z : zones) { if (DateTime.op_Equality(z.getStart(), cellStart)) { zone = true; zoneStart = true; } if (DateTime.op_Equality(z.getEnd(), cellEnd)) { zone = true; zoneEnd = true; } if (DateTime.op_LessThan(z.getStart(), cellStart) && DateTime.op_LessThan(cellStart, z.getEnd()) || DateTime.op_LessThan(z.getStart(), cellEnd) && DateTime.op_LessThan(cellEnd, z.getEnd())) { zone = true; } if (zone) { theZone = z; break; } } boolean selected = false; if (calendar.getSelection().contains(cellStart)) selected = true; Rectangle b = new Rectangle(e.getBounds()); Graphics g = e.getGraphics(); Pen p = new Pen(e.getStyle().getLineColor(), 1); if (zone) { Brush b2 = new SolidBrush(new Color(20, 255, 255, 255)); Brush b4 = new SolidBrush(new Color(75, Colors.LightSteelBlue)); g.fillRectangle(b2, b); g.fillRectangle(b4, b.getLeft() + 1, b.getTop(), infoSize, b.getHeight()); g.drawLine(p, b.getLeft() + infoSize, b.getTop(), b.getLeft() + infoSize, b.getBottom() - 1); g.drawLine(p, b.getLeft(), b.getTop(), b.getLeft(), b.getBottom() - 1); g.drawLine(p, b.getRight() - 1, b.getTop(), b.getRight() - 1, b.getBottom() - 1); if (zoneStart) { g.drawLine(p, b.getLeft(), b.getTop(), b.getRight() - 1, b.getTop()); // Draw the remaining slots int items = calendar.getSchedule().getAllItems(theZone.getStart(), theZone.getEnd()).size(); g.drawString(String.format("%1$d/%2$d", items, theZone.getSlots()), new Font("Arial", 10), Brushes.Black, new RectangleD(b.getLeft(), b.getTop(), infoSize, b.getHeight())); } if (zoneEnd) g.drawLine(p, b.getLeft(), b.getBottom() - 1, b.getRight() - 1, b.getBottom() - 1); b2.dispose(); b4.dispose(); } Brush b1 = new SolidBrush(new Color(40, 0, 0, 0)); if (selected) { boolean start = false; boolean end = false; for (int i = 0; i < calendar.getSelection().getRanges().size(); i += 2) { DateTime istart = calendar.getSelection().getRanges().get(i); DateTime iend = calendar.getSelection().getRanges().get(i + 1); if (DateTime.op_Equality(cellStart, istart)) start = true; if (DateTime.op_Equality(cellEnd, iend)) end = true; } g.fillRectangle(b1, b); g.drawLine(p, b.getLeft(), b.getTop(), b.getLeft(), b.getBottom() - 1); g.drawLine(p, b.getRight() - 1, b.getTop(), b.getRight() - 1, b.getBottom() - 1); if (start) g.drawLine(p, b.getLeft(), b.getTop(), b.getRight() - 1, b.getTop()); if (end) g.drawLine(p, b.getLeft(), b.getBottom() - 1, b.getRight() - 1, b.getBottom() - 1); } b1.dispose(); p.dispose(); } } }); } private static final long serialVersionUID = 1L; protected AwtCalendar calendar; private final ArrayList zones = new ArrayList<>(); private final int infoSize = 100; } class Zone { public Zone(DateTime start, DateTime end, int slots) { _start = start; _end = end; _slots = slots; } public DateTime getStart() { return _start; } public DateTime getEnd() { return _end; } public int getSlots() { return _slots; } private DateTime _start; private DateTime _end; private int _slots; }