/// /// <summary> /// After current data is changed this function fixes positions of all columns /// and all events</summary> /// private void FixPositions( bool displayEvents, bool animate = false, bool updateDuration = false ) { double startLeft; double posOffset; int colcount; long newStart; long idxOffset; colcount = (m_columnCount + EXTRA_COLUMNS); posOffset = TimeSpanToPixels(CurrentDateTime - m_timeline.GetFloorTime(CurrentDateTime)); newStart = m_timeline.IndexOf(CurrentDateTime) - colcount / 2; //newStart = m_timeline.IndexOf(CurrentDateTime); startLeft = (PixelWidth / 2 - ColumnPixelWidth * (colcount / 2)) - posOffset; //startLeft = 0; if (m_startIndex == INVALID_COLUMN_IDX || newStart > m_startIndex + colcount || newStart + colcount < m_startIndex) { // // this is case when we draw columns for the first time, or there are no columns which data contexts // may be reused // PositionColumnAndMarker(newStart, startLeft, 0, true, null); } else if (m_startIndex == newStart) { // // this is the case when we reuse existing column context (date string) // PositionColumnAndMarker(newStart, startLeft, 0, false, null); } else { idxOffset = m_startIndex - newStart; ShiftArray(m_columns, idxOffset, out m_columns); ShiftArray(m_columnMarkers, idxOffset, out m_columnMarkers); PositionColumnAndMarker(newStart, startLeft, 0, false, null); if (idxOffset > 0) { for (int i = 0; i < idxOffset; ++i) { SetColumnDataContext(newStart + i, i); } } else { for (int i = colcount + (int)idxOffset; i < colcount; ++i) { SetColumnDataContext(newStart + i, i); } } } m_startIndex = Math.Max(0, newStart); //m_startIndex = 0; if (displayEvents) { DisplayEvents(animate); } if (updateDuration) { foreach (var ve in m_visibleEvents) { var evnt = ve.Key; TimelineDisplayEvent tde = m_dispEvents[evnt]; tde.Recalculate(); } } }