public CNormalProgress2DateTimeMapper(DateTime startTime, DateTime endTime)
 {
     m_dateTimeRange = new CPipeWorkingTimeRange(startTime, endTime);
     UpdateRange();
 }
        public IProgress2DateTimeMapper GetMapper(int iIndex)
        {
            if (m_listProgress2DateTimeMapper.ContainsKey(iIndex))
            {
                return m_listProgress2DateTimeMapper[iIndex];
            }

            IHistoryDataQuery dataQuery = IApp.theApp.HistoryTimeDataQuery;
            if (dataQuery != null && dataQuery.IsConnected)
            {
                try
                {
                    // Query the time
                    DateTime beginingTime = DateTime.Now;
                    DateTime endTime = DateTime.Now;

                    if (iIndex == 0) // View all pipes
                    {
                        CPipeWorkingRanges workingRanges = new CPipeWorkingRanges();

                        int pipeModelCount = IApp.theApp.DataModel.PipeModels.Count;
                        for (int i = pipeModelCount; i > 0; --i)
                        {
                            if (dataQuery.IsPipeStarted(i))
                            {
                                beginingTime = dataQuery.GetPipeStartTime(i, true);
                                endTime = dataQuery.GetPipeEndTime(i, true);

                                for (int j = 1; j < i; ++j)
                                {
                                    if (m_listProgress2DateTimeMapper.ContainsKey(j))
                                    {
                                        CRemoveUnusedDateTimerMapper mapper = m_listProgress2DateTimeMapper[j] as CRemoveUnusedDateTimerMapper;
                                        if (mapper != null)
                                        {
                                            workingRanges.AddRange(mapper.WorkingRanges);
                                            continue;
                                        }
                                    }

                                    // Get the start and end time
                                    CPipeWorkingTimeRange workingRange = new CPipeWorkingTimeRange(dataQuery.GetPipeStartTime(j, true),
                                    dataQuery.GetPipeEndTime(j, true));

                                    workingRanges.Add(workingRange);
                                }

                                // Add a working time range for this pipe
                                workingRanges.Add(new CPipeWorkingTimeRange(beginingTime, endTime));

                                // Construct a CRemoveUnusedDateTimerMapper for iIndex = 0 (the view all pipes option)
                                CRemoveUnusedDateTimerMapper removeUnusedDateTimerMapper = new CRemoveUnusedDateTimerMapper(workingRanges);
                                m_listProgress2DateTimeMapper[iIndex] = removeUnusedDateTimerMapper;
                                return removeUnusedDateTimerMapper;
                            }
                        }
                    }
                    else
                    {
                        //// View specific pipe and Get all count
                        //trackRange[1] = (int)dataQuery.GetPipeRecordCount(iSelectedIndex); // iSelectedIndex should start from 1

                        // Get the beginning time
                        beginingTime = dataQuery.GetPipeStartTime(iIndex, true);

                        // Get the end time
                        endTime = dataQuery.GetPipeEndTime(iIndex, true);
                    }

                    // Construct the mapper
                    CNormalProgress2DateTimeMapper normalProgress2DateTimeMapper = new CNormalProgress2DateTimeMapper(beginingTime, endTime);
                    m_listProgress2DateTimeMapper[iIndex] = normalProgress2DateTimeMapper;
                    return normalProgress2DateTimeMapper;
                }
                catch (Exception ex)
                {
                    string errMsg = ex.Message + "\n" + ex.StackTrace;
                    vtk.vtkOutputWindow.GetInstance().DisplayErrorText(errMsg);
                }
            }

            return null;
        }