//==========================================================================//
//                                  Includes                                //
//==========================================================================//

#include <stdio.h>

#include "perfmon.h"          // included by all source
#include "timefrm.h"          // external declarations for this file

#include "alert.h"            // for PlaybackAlert
#include "grafdata.h"         // for PlaybackChart
#include "perfmops.h"         // for PerfmonViewWindow
#include "playback.h"         // for PlaybackIndexN
#include "report.h"           // for PlaybackReport
#include "timeline.h"         // for TL_INTERVAL
#include "utils.h"
#include "pmhelpid.h"         // for Help IDs

//==========================================================================//
//                                Local Data                                //
//==========================================================================//



static RECT    TFrameRectWindow ;

//==========================================================================//
//                              Local Functions                             //
//==========================================================================//


void ClearSystemTime (SYSTEMTIME *pSystemTime)
   {  // ClearSystemTime
   pSystemTime->wYear = 0 ;
   pSystemTime->wMonth = 0 ;
   pSystemTime->wDayOfWeek = 0 ;
   pSystemTime->wDay = 0 ;
   pSystemTime->wHour = 0 ;
   pSystemTime->wMinute = 0 ;
   pSystemTime->wSecond = 0 ;
   pSystemTime->wMilliseconds = 0 ;
   }  // ClearSystemTime


//==========================================================================//
//                              Message Handlers                            //
//==========================================================================//


void static OnInitDialog (HDLG hDlg)
   {  // OnInitDialog
   PBOOKMARK      pBookmark ;
   int            iIndex ;
   TCHAR          szText [20+20+BookmarkCommentLen] ;
   TCHAR          szDate [20] ;
   TCHAR          szTime [20] ;
   int            iBookmarksNum ;   
   HWND           hWndTLine ;
   HWND           hWndBookmarks ;
   int            currentTextExtent = 0 ;
   int            maxTextExtent = 0 ;
   HDC            hDC = 0 ;
   HFONT          hFont ;

   hWndTLine = DialogControl (hDlg, IDD_TIMEFRAMETIMELINE) ;
   hWndBookmarks = DialogControl (hDlg, IDD_TIMEFRAMEBOOKMARKS) ;
   SetFont (hWndBookmarks, hFontScales) ;
   LBSetHorzExtent (hWndBookmarks, 0) ;

   TLineSetRange (hWndTLine, 0, PlaybackLog.iTotalTics - 1) ;
   TLineSetStart (hWndTLine, PlaybackLog.StartIndexPos.iPosition) ;
   TLineSetStop (hWndTLine, PlaybackLog.StopIndexPos.iPosition) ;

   iBookmarksNum = 0 ;
   pBookmark = PlaybackLog.pBookmarkFirst ;

   if (pBookmark)
      {
      hDC = GetDC (hWndBookmarks) ;
      if (hDC)
         {
         hFont = (HFONT)SendMessage(hWndBookmarks, WM_GETFONT, 0, 0L);
         if (hFont)
            SelectObject(hDC, hFont);
         }

      while (pBookmark)
         {
         SystemTimeDateString (&(pBookmark->SystemTime), szDate) ;
         SystemTimeTimeString (&(pBookmark->SystemTime), szTime, TRUE) ;
         TSPRINTF (szText, TEXT(" %s  %s  %s"),
            szDate, szTime,
            pBookmark->szComment) ;
         iIndex = LBAdd (hWndBookmarks, szText) ;
         LBSetData (hWndBookmarks, iIndex, pBookmark->iTic) ;

         // get the biggest text width
         if (hDC)
            {
            currentTextExtent = TextWidth (hDC, szText) + xScrollWidth / 2 ;
            if (currentTextExtent > maxTextExtent)
               {
               maxTextExtent = currentTextExtent ;
               }
            }

         pBookmark = pBookmark->pBookmarkNext ;
         }

      LBSetSelection (hWndBookmarks, 0) ;

      iBookmarksNum = LBNumItems (hWndBookmarks) ;
      }

   if (iBookmarksNum == 0)
      {
      DialogEnable (hDlg, IDD_TIMEFRAMEBOOKMARKS, FALSE) ;
      DialogEnable (hDlg, IDD_TIMEFRAMEBOOKMARKGRP, FALSE) ;
      DialogEnable (hDlg, IDD_TIMEFRAMESETSTART, FALSE) ;
      DialogEnable (hDlg, IDD_TIMEFRAMESETSTOP, FALSE) ;
      }
   else
      {
      LBSetHorzExtent (hWndBookmarks, maxTextExtent) ;
      }

   if (hDC)
      {
      ReleaseDC (hWndBookmarks, hDC) ;
      }

   if (TFrameRectWindow.right == TFrameRectWindow.left)
      {
      // we have not initialize this data yet.
      // will get init. after the first time frame window invoke
      WindowCenter (hDlg) ;
      }
   else
      {
      // show it in its previous position
      MoveWindow (hDlg,
                 TFrameRectWindow.left,
                 TFrameRectWindow.top,
                 TFrameRectWindow.right - TFrameRectWindow.left,
                 TFrameRectWindow.bottom - TFrameRectWindow.top,
                 TRUE) ;
      }

   dwCurrentDlgID = HC_PM_idDlgEditTimeFrame ;

   }  // OnInitDialog


void static OnTLineInterval (HDLG hDlg, 
                             int iInterval, 
                             SYSTEMTIME *pSystemTime)
   {  // OnTLineInterval
   PLOGINDEX      pIndex ;


   pIndex = PlaybackIndexN (iInterval) ;

   if (pIndex)
      *pSystemTime = pIndex->SystemTime ;
   else
      ClearSystemTime (pSystemTime) ;
   }  // OnTLineInterval


void static OnOK (HDLG hDlg)
   {  // OnOK
   LOGPOSITION    lp ;
   int            iIndex ;
   HWND           hWndTLine = DialogControl (hDlg, IDD_TIMEFRAMETIMELINE) ;

   iIndex = TLineStart (hWndTLine) ;
   if (LogPositionN (iIndex, &lp)) ;
      PlaybackLog.StartIndexPos = lp ;

   iIndex = TLineStop (hWndTLine) ;
   if (LogPositionN (iIndex, &lp))
      PlaybackLog.StopIndexPos = lp ;

   
   PlaybackLog.iSelectedTics = 
      PlaybackLog.StopIndexPos.iPosition -
      PlaybackLog.StartIndexPos.iPosition + 1 ;

   PlaybackChart (hWndGraph) ;
   PlaybackAlert (hWndAlert, 0) ;
   PlaybackReport (hWndReport) ;

   WindowInvalidate (PerfmonViewWindow ()) ;

   GetWindowRect (hDlg, &TFrameRectWindow) ;

   dwCurrentDlgID = 0 ;
   }  // OnOK

void static OnCancel (HWND hWnd)
   {
   HDC            hGraphDC ;
   PGRAPHSTRUCT   pGraph ;

   pGraph = GraphData (hWndGraph) ;
   hGraphDC = GetDC (hWndGraph) ;
   if (!hGraphDC || !pGraph)
      {
      return ;
      }

   TLineRedraw (hGraphDC, pGraph) ;

   GetWindowRect (hWnd, &TFrameRectWindow) ;

   dwCurrentDlgID = 0 ;
   }


void OnSetStartStop (HWND hDlg, BOOL bSetStart)
   {
   int            iTic ;
   int            iStopTic ;
   int            iStartTic ;
   HWND           hWndTLine = DialogControl (hDlg, IDD_TIMEFRAMETIMELINE) ;
   HWND           hWndBookmarks = DialogControl (hDlg, IDD_TIMEFRAMEBOOKMARKS) ;

   iStartTic = TLineStart (hWndTLine) ;
   iStopTic = TLineStop (hWndTLine) ;

   iTic = LBData (hWndBookmarks, LBSelection (hWndBookmarks)) ;
   if ((bSetStart && iStopTic <= iTic) ||
      (!bSetStart && iStartTic >= iTic))
      {
      DlgErrorBox (hDlg, ERR_STOPBEFORESTART) ;
      }
   else
      {
      if (bSetStart)
         {
         TLineSetStart (hWndTLine, iTic) ;
         }
      else
         {
         TLineSetStop (hWndTLine, iTic) ;
         }
      WindowInvalidate (hWndTLine) ;
      }
   }  // OnSetStartStop


//==========================================================================//
//                             Exported Functions                           //
//==========================================================================//


int FAR WINAPI TimeframeDlgProc (HWND hDlg, 
                                 unsigned iMessage, 
                                 WPARAM wParam, 
                                 LONG lParam)
   {
   BOOL           bHandled ;

   bHandled = TRUE ;
   switch (iMessage)
      {
      case TL_INTERVAL:
         OnTLineInterval (hDlg, wParam, (SYSTEMTIME *) lParam) ;
         break ;

      case WM_INITDIALOG:
         OnInitDialog (hDlg) ;
         return  (TRUE) ;

      case WM_CLOSE:
         OnCancel (hDlg) ;
         EndDialog (hDlg, 0) ;
         break ;

      case WM_COMMAND:
         switch(wParam)
            {
            case IDD_OK:
               SetHourglassCursor() ;
               OnOK (hDlg) ;
               SetArrowCursor() ;
               EndDialog (hDlg, 1) ;
               break ;

            case IDD_TIMEFRAMESETSTART:
            case IDD_TIMEFRAMESETSTOP:
               OnSetStartStop (hDlg, wParam == IDD_TIMEFRAMESETSTART) ;
               break ;

            case IDD_CANCEL:
               OnCancel (hDlg) ;
               GetWindowRect (hDlg, &TFrameRectWindow) ;
               EndDialog (hDlg, 0) ;
               break ;

            case IDD_TIMEFRAMEHELP:
               CallWinHelp (dwCurrentDlgID) ;
               break ;

            default:
               bHandled = FALSE ;
               break;
            }
         break;


      default:
            bHandled = FALSE ;
         break ;            
      }  // switch

   return (bHandled) ;
   }  // TimeframeDlgProc



BOOL SetTimeframe (HWND hWndParent)
   {  // SetTimeframe
   if (DialogBox (hInstance, idDlgTimeframe,
                  hWndParent, (DLGPROC) TimeframeDlgProc))
      {
      return (TRUE) ;
      }
   return (FALSE) ;
   }

