private void UpdatePvw()
 {
     if (textList == null)
     {
         return;
     }
     UpdateBorders();
     PvwContent.Content    = textList[pvwManager.PageNumber];
     PvwContent.Foreground = isTitleList[pvwManager.PageNumber] ? titleColor : Brushes.White;
     PvwPage.Content       = pvwManager.PageNumber;
     if (WrapPanelPageList != null && WrapPanelPageList.Children.Count > 1)
     {
         double offset  = ScrollViewerPageList.VerticalOffset;
         int    rowSize = (int)(WrapPanelPageList.ActualWidth / PAGE_ITEM_FULL_WIDTH);
         int    firstFullyDisplayedRow = (int)Math.Ceiling(offset / PAGE_ITEM_FULL_HEIGHT);
         int    lastFullyDisplayedRow  = (int)Math.Floor((offset + ScrollViewerPageList.ViewportHeight) / PAGE_ITEM_FULL_HEIGHT) - 1;
         int    currentPvwRow          = (pvwManager.PageNumber - 1) / rowSize;
         if (currentPvwRow < firstFullyDisplayedRow)
         {
             ScrollViewerPageList.ScrollToVerticalOffset(currentPvwRow * PAGE_ITEM_FULL_HEIGHT);
         }
         else if (currentPvwRow > lastFullyDisplayedRow)
         {
             ScrollViewerPageList.ScrollToVerticalOffset((currentPvwRow - lastFullyDisplayedRow + firstFullyDisplayedRow) * PAGE_ITEM_FULL_HEIGHT);
         }
     }
 }
        private void WindowMainWindow_PreviewKeyDown(object sender, KeyEventArgs e) // process input when keydown
        {
            if (Keyboard.Modifiers == ModifierKeys.Shift && e.Key == Key.Escape)    // Shift+ESC: presenter window button
            {
                OpenAndClosePresenterWindow();
                return;
            }
            if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.Enter)   // Ctrl+Enter: free text presentation
            {
                FreeCut();
                return;
            }
            if (MenuItemRefresh.IsEnabled == true && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && e.Key == Key.R)   // Ctrl+R: reload the current file
            {
                OpenTxtFile(false);
                return;
            }

            if (TextBoxFreeContent.IsFocused)   // free text presentation box is focused
            {
                switch (e.Key)
                {
                case Key.Escape:
                    KillFocus();
                    break;

                case Key.OemPeriod: // normal .(>) key
                case Key.Decimal:   // keypad .(Del) key
                    if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
                    {
                        ClearPgm();
                    }
                    break;
                }
            }
            else if (TextBoxFreeLines.IsFocused)     // free text presentation line limit box is focused
            {
                if (e.Key == Key.Enter && (Keyboard.Modifiers & ModifierKeys.Control) != ModifierKeys.Control)
                {
                    CheckFreeLine();
                }
            }
            else
            {
                if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)   // + Shift
                {
                    switch (e.Key)
                    {
                    case Key.Up:
                        ScrollViewerPageList.ScrollToVerticalOffset(ScrollViewerPageList.VerticalOffset - PAGE_ITEM_FULL_HEIGHT);
                        e.Handled = true;
                        break;

                    case Key.Down:
                        ScrollViewerPageList.ScrollToVerticalOffset(ScrollViewerPageList.VerticalOffset + PAGE_ITEM_FULL_HEIGHT);
                        e.Handled = true;
                        break;
                    }
                }
                else                                                  // no modifier
                {
                    if (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) // numpad
                    {
                        pageNum.Add(e.Key - Key.NumPad0);
                        UpdatePageIndicator();
                        return;
                    }
                    if (e.Key >= Key.D0 && e.Key <= Key.D9)   // number keys above Q-P
                    {
                        pageNum.Add(e.Key - Key.D0);
                        UpdatePageIndicator();
                        return;
                    }
                    switch (e.Key)
                    {
                    case Key.Enter:
                        CutAction();
                        KillFocus();
                        e.Handled = true;
                        break;

                    case Key.Up:
                        if (WrapPanelPageList != null && WrapPanelPageList.Children.Count > 1)
                        {
                            pvwManager.PageNumber -= (int)(WrapPanelPageList.ActualWidth / PAGE_ITEM_FULL_WIDTH);
                            UpdatePvw();
                        }
                        KillFocus();
                        e.Handled = true;
                        break;

                    case Key.Down:
                        if (WrapPanelPageList != null && WrapPanelPageList.Children.Count > 1)
                        {
                            pvwManager.PageNumber += (int)(WrapPanelPageList.ActualWidth / PAGE_ITEM_FULL_WIDTH);
                            UpdatePvw();
                        }
                        KillFocus();
                        e.Handled = true;
                        break;

                    case Key.OemPeriod:   // normal  .(>) key
                    case Key.Decimal:     // keypad .(Del) key
                        ClearPgm();
                        KillFocus();
                        e.Handled = true;
                        break;

                    case Key.Left:
                        pvwManager.PageNumber -= 1;
                        UpdatePvw();
                        KillFocus();
                        e.Handled = true;
                        break;

                    case Key.Right:
                        pvwManager.PageNumber += 1;
                        UpdatePvw();
                        KillFocus();
                        e.Handled = true;
                        break;
                    }
                }
            }
        }