- Add correct scrolling by keypress
[reactos.git] / reactos / base / setup / usetup / genlist.c
index ea3f2fb..464c8bd 100644 (file)
@@ -538,42 +538,59 @@ VOID
 GenericListKeyPress (PGENERIC_LIST GenericList, CHAR AsciChar)
 {
     PGENERIC_LIST_ENTRY ListEntry;
-    PLIST_ENTRY Entry;
-
-    Entry = &GenericList->CurrentEntry->Entry;
-    ListEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry);
+    PGENERIC_LIST_ENTRY OldListEntry;
+    BOOLEAN Flag = FALSE;
 
-Reset:
+    ListEntry = GenericList->CurrentEntry;
+    OldListEntry = GenericList->CurrentEntry;
 
-    if (tolower(ListEntry->Text[0]) != AsciChar)
-        Entry = GenericList->ListHead.Flink;
+    GenericList->Redraw = FALSE;
 
-    while (Entry != &GenericList->ListHead)
+    if ((strlen(ListEntry->Text) > 0) && (tolower(ListEntry->Text[0]) == AsciChar) &&
+         (GenericList->CurrentEntry->Entry.Flink != &GenericList->ListHead))
     {
-        ListEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry);
+        ScrollDownGenericList(GenericList);
+        ListEntry = GenericList->CurrentEntry;
 
         if ((strlen(ListEntry->Text) > 0) && (tolower(ListEntry->Text[0]) == AsciChar))
-        {
-            if (CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry) == GenericList->CurrentEntry)
-            {
-                Entry = Entry->Flink;
-                if (Entry == &GenericList->ListHead)
-                    goto Reset;
+            goto End;
+    }
 
-                ListEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry);
-                if ((strlen(ListEntry->Text) < 1) || (tolower(ListEntry->Text[0]) != AsciChar))
-                    goto Reset;
-            }
+    while (GenericList->CurrentEntry->Entry.Blink != &GenericList->ListHead)
+        ScrollUpGenericList(GenericList);
 
-            GenericList->CurrentEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry);
+    ListEntry = GenericList->CurrentEntry;
+
+    for (;;)
+    {
+        if ((strlen(ListEntry->Text) > 0) && (tolower(ListEntry->Text[0]) == AsciChar))
+        {
+            Flag = TRUE;
             break;
         }
 
-        Entry = Entry->Flink;
+        if (GenericList->CurrentEntry->Entry.Flink == &GenericList->ListHead)
+            break;
+
+        ScrollDownGenericList(GenericList);
+        ListEntry = GenericList->CurrentEntry;
+    }
+
+    if (!Flag)
+    {
+        while (GenericList->CurrentEntry->Entry.Blink != &GenericList->ListHead)
+        {
+            if (GenericList->CurrentEntry != OldListEntry)
+                ScrollUpGenericList(GenericList);
+            else
+                break;
+        }
     }
+End:
+    DrawListEntries(GenericList);
+    DrawScrollBarGenericList(GenericList);
 
-    if (Entry)
-        DrawListEntries(GenericList);
+    GenericList->Redraw = TRUE;
 }