def _draw_calendar(self, canvas, redraw=False):
        """Draws calendar."""
        options = self.__options
        # Update labels:
        name = self._cal.formatmonthname(self._date.year, self._date.month, 0,
                                         withyear=False)
        self._lmonth.configure(text=name.title())
        self._lyear.configure(text=str(self._date.year))
        
        # Update calendar
        ch = canvas.winfo_height()
        cw = canvas.winfo_width()
        rowh = ch / 7.0
        colw = cw / 7.0
        # Header background
        if self._rheader is None:
            self._rheader = canvas.create_rectangle(0, 0, cw, rowh, width=0,
                                                    fill=options['headerbg'])
        else:
            canvas.itemconfigure(self._rheader, fill=options['headerbg'])
            canvas.coords(self._rheader, 0, 0, cw, rowh)
        # Header text
        ox = 0
        oy = rowh / 2.0
        coffset = colw / 2.0
        cols = self._cal.formatweekheader(3).split()
        for i in range(0, 7):
            x = ox + i * colw + coffset
            if redraw:
                item = self._theader[i]
                canvas.coords(item, x, oy)
                canvas.itemconfigure(item, text=cols[i],
                                     fill=options['headerfg'])
            else:
                self._theader[i] = canvas.create_text(x, oy, text=cols[i],
                                                      fill=options['headerbg'])
        
        # background matrix
        oy = rowh
        ox = 0
        for i, x, y, x1, y1 in matrix_coords(6, 7, rowh, colw, ox, oy):
            x1 -= 1
            y1 -= 1
            if redraw:
                rec = self._recmat[i]
                canvas.coords(rec, x, y, x1, y1)
                canvas.itemconfigure(rec, fill=options['calendarbg'])
            else:
                rec = canvas.create_rectangle(x, y, x1, y1, width=1,
                                          fill=options['calendarbg'],
                                          outline=options['calendarbg'],
                                          activeoutline=options['selectbg'],
                                          activewidth=1, tags='cell')
                self._recmat[i] = rec
        
        # text matrix
        weeks = self._weeks
        xoffset = colw / 2.0
        yoffset = rowh / 2.0
        oy = rowh
        ox = 0
        for i, x, y, x1, y1 in matrix_coords(6, 7, rowh, colw, ox, oy):
            x += coffset
            y += yoffset
            # day text
            txt = ""
            f, c = i2rc(i, 7)
            if f < len(weeks):
                day = weeks[f][c]
                txt = "{0}".format(day) if day != 0 else ""
            if redraw:
                item = self._txtmat[i]
                canvas.coords(item, x, y)
                canvas.itemconfigure(item, text=txt)
            else:
                self._txtmat[i] = canvas.create_text(x, y, text=txt,
                                                     state=tk.DISABLED)
        # Mark days
        self._mark_days()
Draws calendar.