class SpeedPlotPanel(sc.SizedPanel):
    '''
    classdocs
    '''
    def __init__(self, parent, maxAgeBuffer, *args, **kwargs):
        """Create the DemoPanel."""
        sc.SizedPanel.__init__(self, parent, *args, **kwargs)

        #self.parent = parent

        self._TimeStamps = []
        self._SpeedValuesMotor1 = []
        self._SpeedValuesMotor2 = []

        self._ExtractPlotData(maxAgeBuffer)

        self._InitializePlot()

    def _InitializePlot(self):
        self._DPI = 100
        self._Figure = Figure(dpi=self._DPI)

        self._Plot = self._Figure.add_subplot(111)
        self._Plot.set_axis_bgcolor('black')
        self._Plot.set_title('Speed', size=12)
        self._Plot.grid(True, color='gray')

        pylab.setp(self._Plot.get_xticklabels(), fontsize=8)
        pylab.setp(self._Plot.get_yticklabels(), fontsize=8)

        formatter = mpldates.DateFormatter('%M:%S')
        self._Plot.xaxis.set_major_formatter(formatter)

        # plot the data as a line series, and save the reference
        # to the plotted line series
        #
        self._Traces = []
        trace = self._Plot.plot(
            self._TimeStamps,
            self._SpeedValuesMotor1,
            linewidth=1,
            color=(1, 0, 0),
        )[0]
        self._Traces.append(trace)

        trace = self._Plot.plot(
            self._TimeStamps,
            self._SpeedValuesMotor2,
            linewidth=1,
            color=(0, 1, 0),
        )[0]

        self._Traces.append(trace)

        legend = self._Plot.legend(('Motor 1', 'Motor 2'),
                                   shadow=False,
                                   labelspacing=0.001,
                                   loc='upper left')
        for text in legend.get_texts():
            text.set_fontsize('x-small')  # the legend text fontsize

        self._FigureCanvas = FigureCanvas(self, -1, self._Figure)
        self._FigureCanvas.SetSizerProps(expand=True, proportion=1)

    def Refresh(self, maxAgeBuffer, now):
        self._ExtractPlotData(maxAgeBuffer)
        self._DrawPlot(maxAgeBuffer, now)

    def _ExtractPlotData(self, maxAgeBuffer):

        del self._TimeStamps[:]
        del self._SpeedValuesMotor1[:]
        del self._SpeedValuesMotor2[:]

        try:
            for timeStampedValue in maxAgeBuffer:
                self._TimeStamps.append(timeStampedValue.TimeStamp)
                self._SpeedValuesMotor1.append(timeStampedValue.Value[3])
                self._SpeedValuesMotor2.append(timeStampedValue.Value[4])
        except RuntimeError:
            # We iterate over a queue that is filled by another thread. The correct approach would
            # be to use synchronization. For simplicity we ignore the error.
            # Every so often we get an error of this form:
            # RuntimeError: deque mutated during iteration
            pass

    def _DrawPlot(self, maxAgeBuffer, now):
        """ Redraws the plot
        """

        #print 'redrawing'
        #print self._TimeStamps
        #print self._Values1

        self._Plot.set_xbound(lower=now - maxAgeBuffer.MaximumAge, upper=now)
        self._Plot.set_ybound(lower=-1.1, upper=1.1)

        self._Traces[0].set_xdata(self._TimeStamps)
        self._Traces[0].set_ydata(self._SpeedValuesMotor1)

        self._Traces[1].set_xdata(self._TimeStamps)
        self._Traces[1].set_ydata(self._SpeedValuesMotor2)

        #        self.plot_data.set_xdata(np.arange(len(self.data)))
        #        self.plot_data.set_ydata(np.array(self.data))

        if len(self._TimeStamps) > 0:
            self._FigureCanvas.draw()