// *++
//
// Copyright (c) 2006, Intel Corporation                                                         
// All rights reserved. This program and the accompanying materials                          
// are licensed and made available under the terms and conditions of the BSD License         
// which accompanies this distribution.  The full text of the license may be found at        
// http://opensource.org/licenses/bsd-license.php                                            
//                                                                                           
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
// 
// Module Name:
//
//   FE.vfr 
// 
// Abstract:
// 
//   File Explorer Formset
// 
// Revision History: 
// 
// --*/

#include "EdkGenericPlatformBdsLibStrDefs.h" 
#include "FormGuid.h"

#pragma pack(1)
typedef struct {
  UINT16                    DescriptionData[75];
  UINT16                    OptionalData[127];
  UINT8                     Active;
  UINT8                     ForceReconnect;  
} FILE_EXPLORER_NV_DATA;
#pragma pack()

#define FORM_FILE_EXPLORER_ID                 0x001E
#define FORM_BOOT_ADD_DESCRIPTION_ID          0x001F
#define FORM_DRIVER_ADD_FILE_DESCRIPTION_ID   0x0020
#define KEY_VALUE_SAVE_AND_EXIT               0x0090
#define KEY_VALUE_NO_SAVE_AND_EXIT            0x0091



formset 
  guid = FILE_EXPLORE_FORMSET_GUID,
  title = STRING_TOKEN(STR_FILE_EXPLORER_TITLE),
  help = STRING_TOKEN(STR_NULL_STRING),
  class = 0,
  subclass = 0,

  form formid = FORM_FILE_EXPLORER_ID,
       title = STRING_TOKEN(STR_FILE_EXPLORER_TITLE);

       label FORM_FILE_EXPLORER_ID;
  endform;
  
  form formid = FORM_BOOT_ADD_DESCRIPTION_ID,
       title = STRING_TOKEN(STR_FORM_BOOT_ADD_DESC_TITLE);
       
       label FORM_BOOT_ADD_DESCRIPTION_ID;

       subtitle  text = STRING_TOKEN(STR_NULL_STRING);
       
       string    varid    = FILE_EXPLORER_NV_DATA.DescriptionData,
                 prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),
                 help     = STRING_TOKEN(STR_NULL_STRING),
                 minsize  = 6,
                 maxsize  = 75,
       endstring;

       string    varid    = FILE_EXPLORER_NV_DATA.OptionalData,
       		prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),
       		help     = STRING_TOKEN(STR_NULL_STRING),
       		minsize  = 0,
       		maxsize  = 120,
       endstring;

       text 
         help   = STRING_TOKEN(STR_SAVE_AND_EXIT),  
         text   = STRING_TOKEN(STR_SAVE_AND_EXIT), 
         text   = STRING_TOKEN(STR_NULL_STRING),
         flags  = INTERACTIVE | NV_ACCESS,
         key    = KEY_VALUE_SAVE_AND_EXIT;
             
       text 
         help   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),  
         text   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT), 
         text   = STRING_TOKEN(STR_NULL_STRING),
         flags  = INTERACTIVE | NV_ACCESS,
         key    = KEY_VALUE_NO_SAVE_AND_EXIT;
    
  endform;

  form formid = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID,
       title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);
       
       label FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;
       
       subtitle  text = STRING_TOKEN(STR_NULL_STRING);

       string    varid    = FILE_EXPLORER_NV_DATA.DescriptionData,
                 prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),
                 help     = STRING_TOKEN(STR_NULL_STRING),
                 minsize  = 6,
                 maxsize  = 75,
       endstring;

       string    varid    = FILE_EXPLORER_NV_DATA.OptionalData,
                 prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),
                 help     = STRING_TOKEN(STR_NULL_STRING),
                 minsize  = 0,
                 maxsize  = 120,
       endstring; 
       
       checkbox varid    = FILE_EXPLORER_NV_DATA.ForceReconnect,
               prompt   = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),
               help     = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),  
               flags    = 1,
               key      = 0,
       endcheckbox;

       text 
         help   = STRING_TOKEN(STR_SAVE_AND_EXIT),  
         text   = STRING_TOKEN(STR_SAVE_AND_EXIT), 
         text   = STRING_TOKEN(STR_NULL_STRING),
         flags  = INTERACTIVE | NV_ACCESS,
         key    = KEY_VALUE_SAVE_AND_EXIT;
      
       text 
         help   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),  
         text   = STRING_TOKEN(STR_NO_SAVE_AND_EXIT), 
         text   = STRING_TOKEN(STR_NULL_STRING),
         flags  = INTERACTIVE | NV_ACCESS,
         key    = KEY_VALUE_NO_SAVE_AND_EXIT;
               
  endform;
  
endformset;
