/** @file
  User Profile Manager formset.

Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
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.

**/

#include "UserProfileManagerData.h"

#define USER_MANAGER_CLASS       0x00
#define USER_MANAGER_SUBCLASS    0x04

formset 
  guid     = USER_PROFILE_MANAGER_GUID,
  title    = STRING_TOKEN(STR_FORMSET_TITLE),  
  help     = STRING_TOKEN(STR_TITLE_HELP),
    
  // User manager form
  form formid = FORMID_USER_MANAGE,
    title     = STRING_TOKEN(STR_USERMAN_TITLE);

    label LABEL_USER_MANAGE_FUNC;
    label LABEL_END;

    suppressif TRUE;
      text
        help   = STRING_TOKEN(STR_NULL_STRING),
        text   = STRING_TOKEN(STR_NULL_STRING),
        flags  = INTERACTIVE,
        key    = QUESTIONID_USER_MANAGE;
    endif;
     
  endform;
  
  // Modify user profile form
  form formid = FORMID_MODIFY_USER,
    title     = STRING_TOKEN(STR_MODIFY_USER_TITLE);

    label LABEL_USER_MOD_FUNC;
    label LABEL_END;

  endform;
  
  // Delete user profile form
  form formid = FORMID_DEL_USER,
    title     = STRING_TOKEN(STR_DELETE_USER_TITLE);
  
    label LABEL_USER_DEL_FUNC;
    label LABEL_END;
    
    subtitle 
      text   = STRING_TOKEN(STR_NULL_STRING);
  endform;
  
  //
  // User profile information form
  //
  form formid = FORMID_USER_INFO,
    title     = STRING_TOKEN(STR_USER_INFO);

    text 
      help   = STRING_TOKEN(STR_USER_NAME_VAL),  
      text   = STRING_TOKEN(STR_USER_NAME),
      flags  = INTERACTIVE,
      key    = KEY_MODIFY_USER_NAME;
      
    text 
      help   = STRING_TOKEN(STR_CREATE_DATE_VAL),  
      text   = STRING_TOKEN(STR_CREATE_DATE);
      
    text 
      help   = STRING_TOKEN(STR_USAGE_DATE_VAL),  
      text   = STRING_TOKEN(STR_USAGE_DATE);
      
    text 
      help   = STRING_TOKEN(STR_USAGE_COUNT_VAL),  
      text   = STRING_TOKEN(STR_USAGE_COUNT);
      
    label LABEL_USER_INFO_FUNC; 
    label LABEL_END;

  endform;
  
  //
  // Identify policy modify form
  //
  form formid = FORMID_MODIFY_IP,
    title     = STRING_TOKEN(STR_IDENTIFY_POLICY);

    text 
      help   = STRING_TOKEN(STR_IDENTIFY_POLICY_HELP),
      text   = STRING_TOKEN(STR_IDENTIFY_POLICY),
        text   = STRING_TOKEN(STR_IDENTIFY_POLICY_VALUE);
      
    label LABEL_IP_MOD_FUNC;
    label LABEL_END;
    
    text 
      help   = STRING_TOKEN(STR_ADD_OPTION_HELP),  
      text   = STRING_TOKEN(STR_ADD_OPTION),
      flags  = INTERACTIVE,
      key    = KEY_ADD_LOGICAL_OP;
      
    subtitle 
      text   = STRING_TOKEN(STR_NULL_STRING);

    text
      help   = STRING_TOKEN(STR_IDENTIFY_SAVE_HELP),
      text   = STRING_TOKEN(STR_SAVE),
      flags  = INTERACTIVE,
      key    = KEY_IP_RETURN;

  endform;
  
  //
  // Access policy modify form
  //
  form formid = FORMID_MODIFY_AP,
    title     = STRING_TOKEN(STR_ACCESS_POLICY);

    label LABEL_AP_MOD_FUNC;
    label LABEL_END;

    goto FORMID_LOAD_DP,
      prompt  = STRING_TOKEN(STR_LOAD),
      help    = STRING_TOKEN(STR_LOAD_HELP),
      flags   = INTERACTIVE,
      key     = KEY_LOAD_DP;

    goto FORMID_CONNECT_DP,
      prompt  = STRING_TOKEN(STR_CONNECT),
      help    = STRING_TOKEN(STR_CONNECT_HELP),
      flags   = INTERACTIVE,
      key     = KEY_CONN_DP;

    subtitle 
      text   = STRING_TOKEN(STR_NULL_STRING);
   
    text
      help   = STRING_TOKEN(STR_ACCESS_SAVE_HELP),
      text   = STRING_TOKEN(STR_SAVE),
      flags  = INTERACTIVE,
      key    = KEY_AP_RETURN;

  endform;

  //
  // Load device path form
  //
  form formid = FORMID_LOAD_DP,
    title     = STRING_TOKEN(STR_LOAD);

    goto FORMID_PERMIT_LOAD_DP,
      prompt  = STRING_TOKEN(STR_LOAD_PERMIT),
      help    = STRING_TOKEN(STR_LOAD_PERMIT_HELP),
      flags   = INTERACTIVE,
      key     = KEY_LOAD_PERMIT;
    
    goto FORMID_FORBID_LOAD_DP,
      prompt  = STRING_TOKEN(STR_LOAD_FORBID),
      help    = STRING_TOKEN(STR_LOAD_FORBID_HELP),
      flags   = INTERACTIVE,
      key     = KEY_LOAD_FORBID;
 
  endform;
  
  //
  // Permit load device path form
  //
  form formid = FORMID_PERMIT_LOAD_DP,
    title     = STRING_TOKEN(STR_LOAD_PERMIT);
  
    label LABEL_PERMIT_LOAD_FUNC;
    label LABEL_END;
  
    subtitle 
      text   = STRING_TOKEN(STR_NULL_STRING);

  endform;
  
  //
  // Forbid load device path form
  //
  form formid = FORMID_FORBID_LOAD_DP,
    title     = STRING_TOKEN(STR_LOAD_FORBID);
  
    label LABLE_FORBID_LOAD_FUNC;
    label LABEL_END;
   
    subtitle 
      text   = STRING_TOKEN(STR_NULL_STRING);

  endform;
  
  //
  // Connect device path form
  //
  form formid = FORMID_CONNECT_DP,
    title     = STRING_TOKEN(STR_CONNECT);

    goto FORMID_PERMIT_CONNECT_DP,
      prompt  = STRING_TOKEN(STR_CONNECT_PERMIT),
      help    = STRING_TOKEN(STR_CONNECT_PERMIT_HELP),
      flags   = INTERACTIVE,
      key     = KEY_CONNECT_PERMIT;
      
    goto FORMID_FORBID_CONNECT_DP,
      prompt  = STRING_TOKEN(STR_CONNECT_FORBID),
      help    = STRING_TOKEN(STR_CONNECT_FORBID_HELP),
      flags   = INTERACTIVE,
      key     = KEY_CONNECT_FORBID;
      
  endform;
  
  //
  // Permit connect device path form
  //
  form formid = FORMID_PERMIT_CONNECT_DP,
    title     = STRING_TOKEN(STR_CONNECT_PERMIT);
     
    subtitle 
      text   = STRING_TOKEN(STR_NULL_STRING);

  endform;
  
  //
  // Forbid connect device path form
  //
  form formid = FORMID_FORBID_CONNECT_DP,
    title     = STRING_TOKEN(STR_CONNECT_FORBID);
     
   subtitle 
     text   = STRING_TOKEN(STR_NULL_STRING);

  endform;
  
endformset;
