14
14
15
15
// FIXME:
16
16
#define EVENT_MESSAGE_EVENTTEXT_BUFFER (1024*10)
17
+ extern WCHAR szTitle [];
17
18
extern HWND hwndListView ;
18
19
extern BOOL
19
20
GetEventMessage (IN LPCWSTR KeyName ,
@@ -24,7 +25,9 @@ GetEventMessage(IN LPCWSTR KeyName,
24
25
25
26
typedef struct _DETAILDATA
26
27
{
28
+ /* Data initialized from EVENTDETAIL_INFO */
27
29
PEVENTLOGFILTER EventLogFilter ;
30
+ INT iEventItem ;
28
31
29
32
BOOL bDisplayWords ;
30
33
HFONT hMonospaceFont ;
@@ -37,8 +40,16 @@ typedef struct _DETAILDATA
37
40
38
41
static
39
42
VOID
40
- DisplayEvent (HWND hDlg , PEVENTLOGFILTER EventLogFilter )
43
+ DisplayEvent (
44
+ _In_ HWND hDlg ,
45
+ _In_ PDETAILDATA pDetailData )
41
46
{
47
+ PEVENTLOGFILTER EventLogFilter = pDetailData -> EventLogFilter ;
48
+ INT iItem = pDetailData -> iEventItem ;
49
+ LVITEMW li ;
50
+ PEVENTLOGRECORD pevlr ;
51
+ BOOL bEventData ;
52
+
42
53
WCHAR szEventType [MAX_PATH ];
43
54
WCHAR szTime [MAX_PATH ];
44
55
WCHAR szDate [MAX_PATH ];
@@ -48,38 +59,22 @@ DisplayEvent(HWND hDlg, PEVENTLOGFILTER EventLogFilter)
48
59
WCHAR szCategory [MAX_PATH ];
49
60
WCHAR szEventID [MAX_PATH ];
50
61
WCHAR szEventText [EVENT_MESSAGE_EVENTTEXT_BUFFER ];
51
- BOOL bEventData = FALSE;
52
- LVITEMW li ;
53
- PEVENTLOGRECORD pevlr ;
54
- int iIndex ;
55
-
56
- /* Get index of selected item */
57
- iIndex = ListView_GetNextItem (hwndListView , -1 , LVNI_SELECTED | LVNI_FOCUSED );
58
- if (iIndex == -1 )
59
- {
60
- MessageBoxW (hDlg ,
61
- L"No Items in ListView" ,
62
- L"Error" ,
63
- MB_OK | MB_ICONINFORMATION );
64
- return ;
65
- }
66
62
67
63
li .mask = LVIF_PARAM ;
68
- li .iItem = iIndex ;
64
+ li .iItem = iItem ;
69
65
li .iSubItem = 0 ;
70
-
71
66
ListView_GetItem (hwndListView , & li );
72
67
73
68
pevlr = (PEVENTLOGRECORD )li .lParam ;
74
69
75
- ListView_GetItemText (hwndListView , iIndex , 0 , szEventType , ARRAYSIZE (szEventType ));
76
- ListView_GetItemText (hwndListView , iIndex , 1 , szDate , ARRAYSIZE (szDate ));
77
- ListView_GetItemText (hwndListView , iIndex , 2 , szTime , ARRAYSIZE (szTime ));
78
- ListView_GetItemText (hwndListView , iIndex , 3 , szSource , ARRAYSIZE (szSource ));
79
- ListView_GetItemText (hwndListView , iIndex , 4 , szCategory , ARRAYSIZE (szCategory ));
80
- ListView_GetItemText (hwndListView , iIndex , 5 , szEventID , ARRAYSIZE (szEventID ));
81
- ListView_GetItemText (hwndListView , iIndex , 6 , szUser , ARRAYSIZE (szUser ));
82
- ListView_GetItemText (hwndListView , iIndex , 7 , szComputer , ARRAYSIZE (szComputer ));
70
+ ListView_GetItemText (hwndListView , iItem , 0 , szEventType , ARRAYSIZE (szEventType ));
71
+ ListView_GetItemText (hwndListView , iItem , 1 , szDate , ARRAYSIZE (szDate ));
72
+ ListView_GetItemText (hwndListView , iItem , 2 , szTime , ARRAYSIZE (szTime ));
73
+ ListView_GetItemText (hwndListView , iItem , 3 , szSource , ARRAYSIZE (szSource ));
74
+ ListView_GetItemText (hwndListView , iItem , 4 , szCategory , ARRAYSIZE (szCategory ));
75
+ ListView_GetItemText (hwndListView , iItem , 5 , szEventID , ARRAYSIZE (szEventID ));
76
+ ListView_GetItemText (hwndListView , iItem , 6 , szUser , ARRAYSIZE (szUser ));
77
+ ListView_GetItemText (hwndListView , iItem , 7 , szComputer , ARRAYSIZE (szComputer ));
83
78
84
79
SetDlgItemTextW (hDlg , IDC_EVENTDATESTATIC , szDate );
85
80
SetDlgItemTextW (hDlg , IDC_EVENTTIMESTATIC , szTime );
@@ -180,32 +175,23 @@ PrintWordDataLine(PWCHAR pBuffer, UINT uOffset, PULONG pData, UINT uLength)
180
175
181
176
static
182
177
VOID
183
- DisplayEventData (HWND hDlg , BOOL bDisplayWords )
178
+ DisplayEventData (
179
+ _In_ HWND hDlg ,
180
+ _In_ PDETAILDATA pDetailData )
184
181
{
182
+ BOOL bDisplayWords = pDetailData -> bDisplayWords ;
183
+ INT iItem = pDetailData -> iEventItem ;
185
184
LVITEMW li ;
186
185
PEVENTLOGRECORD pevlr ;
187
- int iIndex ;
188
186
189
187
LPBYTE pData ;
190
188
UINT i , uOffset ;
191
189
UINT uBufferSize , uLineLength ;
192
190
PWCHAR pTextBuffer , pLine ;
193
191
194
- /* Get index of selected item */
195
- iIndex = ListView_GetNextItem (hwndListView , -1 , LVNI_SELECTED | LVNI_FOCUSED );
196
- if (iIndex == -1 )
197
- {
198
- MessageBoxW (hDlg ,
199
- L"No Items in ListView" ,
200
- L"Error" ,
201
- MB_OK | MB_ICONINFORMATION );
202
- return ;
203
- }
204
-
205
192
li .mask = LVIF_PARAM ;
206
- li .iItem = iIndex ;
193
+ li .iItem = iItem ;
207
194
li .iSubItem = 0 ;
208
-
209
195
ListView_GetItem (hwndListView , & li );
210
196
211
197
pevlr = (PEVENTLOGRECORD )li .lParam ;
@@ -800,7 +786,12 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
800
786
}
801
787
SetWindowLongPtrW (hDlg , DWLP_USER , (LONG_PTR )pData );
802
788
803
- pData -> EventLogFilter = (PEVENTLOGFILTER )lParam ;
789
+ if (lParam != 0 )
790
+ {
791
+ PEVENTDETAIL_INFO DetailInfo = (PEVENTDETAIL_INFO )lParam ;
792
+ pData -> EventLogFilter = DetailInfo -> EventLogFilter ;
793
+ pData -> iEventItem = DetailInfo -> iEventItem ;
794
+ }
804
795
pData -> bDisplayWords = FALSE;
805
796
pData -> hMonospaceFont = CreateMonospaceFont ();
806
797
@@ -811,12 +802,6 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
811
802
812
803
InitDetailsDlgCtrl (hDlg , pData );
813
804
814
- #if 0
815
- /* Show event info on dialog box */
816
- DisplayEvent (hDlg , pData -> EventLogFilter );
817
- DisplayEventData (hDlg , pData -> bDisplayWords );
818
- #endif
819
-
820
805
// OnSize(hDlg, pData, pData->cxOld, pData->cyOld);
821
806
return (INT_PTR )TRUE;
822
807
}
@@ -835,39 +820,76 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
835
820
return (INT_PTR )TRUE;
836
821
837
822
case EVT_DISPLAY :
823
+ {
824
+ pData -> iEventItem = (INT )lParam ;
838
825
if (pData -> EventLogFilter )
839
826
{
840
- /* Show event info on dialog box */
841
- DisplayEvent (hDlg , pData -> EventLogFilter );
842
- DisplayEventData (hDlg , pData -> bDisplayWords );
827
+ /* Show event info in control */
828
+ DisplayEvent (hDlg , pData );
829
+ DisplayEventData (hDlg , pData );
843
830
}
844
831
return (INT_PTR )TRUE;
832
+ }
845
833
846
834
case WM_COMMAND :
847
835
switch (LOWORD (wParam ))
848
836
{
849
837
case IDC_PREVIOUS :
838
+ case IDC_NEXT :
850
839
{
851
- SendMessageW (hwndListView , WM_KEYDOWN , VK_UP , 0 );
840
+ BOOL bPrev = (LOWORD (wParam ) == IDC_PREVIOUS );
841
+ INT iItem , iSel ;
842
+
843
+ /* Select the previous/next item from our current one */
844
+ iItem = ListView_GetNextItem (hwndListView ,
845
+ pData -> iEventItem ,
846
+ bPrev ? LVNI_ABOVE : LVNI_BELOW );
847
+ if (iItem == -1 )
848
+ {
849
+ // TODO: Localization.
850
+ if (MessageBoxW (hDlg ,
851
+ bPrev
852
+ ? L"You have reached the beginning of the event log. Do you want to continue from the end?"
853
+ : L"You have reached the end of the event log. Do you want to continue from the beginning?" ,
854
+ szTitle ,
855
+ MB_YESNO | MB_ICONQUESTION )
856
+ == IDNO )
857
+ {
858
+ break ;
859
+ }
860
+
861
+ /* Determine from where to restart */
862
+ if (bPrev )
863
+ iItem = ListView_GetItemCount (hwndListView ) - 1 ;
864
+ else
865
+ iItem = 0 ;
866
+ }
852
867
853
- /* Show event info on dialog box */
854
- if (pData -> EventLogFilter )
868
+ /*
869
+ * Deselect the currently selected items in the list view.
870
+ * (They may be different from our current one, if multiple
871
+ * event details are being displayed concurrently!)
872
+ */
873
+ iSel = -1 ;
874
+ while ((iSel = ListView_GetNextItem (hwndListView , iSel , LVNI_SELECTED )) != -1 )
855
875
{
856
- DisplayEvent ( hDlg , pData -> EventLogFilter );
857
- DisplayEventData ( hDlg , pData -> bDisplayWords );
876
+ ListView_SetItemState ( hwndListView , iSel ,
877
+ 0 , LVIS_FOCUSED | LVIS_SELECTED );
858
878
}
859
- return (INT_PTR )TRUE;
860
- }
861
879
862
- case IDC_NEXT :
863
- {
864
- SendMessageW (hwndListView , WM_KEYDOWN , VK_DOWN , 0 );
880
+ /* Select the new item */
881
+ ListView_SetItemState (hwndListView , iItem ,
882
+ LVIS_FOCUSED | LVIS_SELECTED ,
883
+ LVIS_FOCUSED | LVIS_SELECTED );
884
+ ListView_EnsureVisible (hwndListView , iItem , FALSE);
885
+
886
+ pData -> iEventItem = iItem ;
865
887
866
- /* Show event info on dialog box */
888
+ /* Show event info in control */
867
889
if (pData -> EventLogFilter )
868
890
{
869
- DisplayEvent (hDlg , pData -> EventLogFilter );
870
- DisplayEventData (hDlg , pData -> bDisplayWords );
891
+ DisplayEvent (hDlg , pData );
892
+ DisplayEventData (hDlg , pData );
871
893
}
872
894
return (INT_PTR )TRUE;
873
895
}
@@ -883,7 +905,7 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
883
905
if (pData -> EventLogFilter )
884
906
{
885
907
pData -> bDisplayWords = (LOWORD (wParam ) == IDC_WORDRADIO );
886
- DisplayEventData (hDlg , pData -> bDisplayWords );
908
+ DisplayEventData (hDlg , pData );
887
909
}
888
910
return (INT_PTR )TRUE;
889
911
}
0 commit comments