def rebuildMonth( self ):
        """
        Rebuilds the current item in month mode.
        """
        scene = self.scene()
        if ( not scene ):
            return
        
        start_date  = self.dateStart()
        end_date    = self.dateEnd()
        min_date    = scene.minimumDate()
        max_date    = scene.maximumDate()
        
        # make sure our item is visible
        if ( not (min_date <= end_date and start_date <= max_date)):
            self.hide()
            self.setPath(QPainterPath())
            return
        
        # make sure we have valid range information
        if ( start_date < min_date ):
            start_date    = min_date
            start_inrange = False
        else:
            start_inrange = True
        
        if ( max_date < end_date ):
            end_date     = max_date
            end_inrange  = False
        else:
            end_inrange  = True
        
        start_rect = scene.dateRect(start_date)
        end_rect   = scene.dateRect(end_date)
        
        if ( not (start_rect.isValid() and end_rect.isValid()) ):
            self.hide()
            return
        
        # rebuild an all day path
        path = QPainterPath()
        self.setPos(0, 0)
        
        pad         = 2
        offset      = 18
        height      = 16
        
        min_left    = 10
        max_right   = scene.width() - 16
        delta_h     = start_rect.height()
        
        # draw the all day event
        if ( self.isAllDay() ):
            top   = start_rect.top()
            left  = start_rect.left() + 3
            first = start_inrange
            
            while ( top <= end_rect.top() ):
                sub_path  = QPainterPath()
                
                # calculate the end position
                if ( end_rect.top() - 2 <= top and end_inrange ):
                    at_end = True
                    right = end_rect.right() - pad
                else:
                    at_end = False
                    right = max_right
                
                if ( first ):
                    sub_path.moveTo(left, top + offset)
                    text_left = left + 4
                else:
                    sub_path.moveTo(left + height / 2, top + offset)
                    text_left = left + height / 2 + 2
                
                if ( at_end ):
                    sub_path.lineTo(right, top + offset)
                    sub_path.lineTo(right, top + offset + height)
                else:
                    sub_path.lineTo(right - height / 2, top + offset)
                    sub_path.lineTo(right, top + offset + height / 2)
                    sub_path.lineTo(right - height / 2, top + offset + height)
                
                if ( first ):
                    sub_path.lineTo(left, top + offset + height)
                    sub_path.lineTo(left, top + offset)
                else:
                    sub_path.lineTo(left + height / 2, top + offset + height)
                    sub_path.lineTo(left, top + offset + height / 2)
                    sub_path.lineTo(left + height / 2, top + offset)
                
                path.addPath(sub_path)
                
                data = (text_left,
                        top + offset + 1,
                        right,
                        height,
                        Qt.AlignLeft | Qt.AlignVCenter,
                        self.title())
                
                self._textData.append(data)
                
                left = min_left
                top += delta_h
                first = False
        else:
            text = '%s: (%s)' % (self.timeStart().toString('h:mm ap'), 
                                 self.title())
            
            font   = scene.font()
            left   = start_rect.left() + 2 * pad
            top    = start_rect.top() + offset
            
            path.addText(left, top + height / 2, font, text)
        
        # setup the path for this item
        self.setPath(path)
        self.show()
        
        # make sure there are no collisions
        while ( self.collidingItems() ):
            self.setPos(self.pos().x(), self.pos().y() + height + 2)
            
            # hide the item if out of the visible scope
            if ( delta_h - offset <= self.pos().y() + height ):
                self.hide()
                break