Home | History | Annotate | Download | only in UefiShellDebug1CommandsLib
      1 /** @file
      2   Implements titlebar interface functions.
      3 
      4   (C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR>
      5   Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved. <BR>
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #include "EditTitleBar.h"
     17 #include "UefiShellDebug1CommandsLib.h"
     18 
     19 CHAR16  *Title = NULL;
     20 
     21 /**
     22   Initialize a title bar.
     23 
     24   @param[in] Prompt             The prompt to print in the title bar.
     25 
     26   @retval EFI_SUCCESS           The initialization was successful.
     27   @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.
     28 **/
     29 EFI_STATUS
     30 EFIAPI
     31 MainTitleBarInit (
     32   CONST CHAR16 *Prompt
     33   )
     34 {
     35   SHELL_FREE_NON_NULL (Title);
     36   if (Prompt == NULL) {
     37     Title = CatSPrint (NULL, L"");
     38   } else {
     39     //
     40     // set Title
     41     //
     42     Title = CatSPrint (NULL, L"%s", Prompt);
     43   }
     44   if (Title == NULL) {
     45     return EFI_OUT_OF_RESOURCES;
     46   }
     47 
     48   return EFI_SUCCESS;
     49 }
     50 
     51 /**
     52   Clean up the memory used.
     53 **/
     54 VOID
     55 EFIAPI
     56 MainTitleBarCleanup (
     57   VOID
     58   )
     59 {
     60   SHELL_FREE_NON_NULL (Title);
     61   Title = NULL;
     62 }
     63 
     64 typedef struct {
     65   UINT32  Foreground : 4;
     66   UINT32  Background : 4;
     67 } TITLE_BAR_COLOR_ATTRIBUTES;
     68 
     69 typedef union {
     70   TITLE_BAR_COLOR_ATTRIBUTES  Colors;
     71   UINTN                       Data;
     72 } TITLE_BAR_COLOR_UNION;
     73 
     74 /**
     75   Refresh function for MainTitleBar
     76 
     77   @param[in] FileName           The open file's name (or NULL).
     78   @param[in] FileType           The type fo the file.
     79   @param[in] ReadOnly           TRUE if the file is read only.  FALSE otherwise.
     80   @param[in] Modified           TRUE if the file was modified.  FALSE otherwise.
     81   @param[in] LastCol            The last printable column.
     82   @param[in] LastRow            The last printable row.
     83   @param[in] Offset             The offset into the file. (only for mem/disk)
     84   @param[in] Size               The file's size. (only for mem/disk)
     85 
     86   @retval EFI_SUCCESS           The operation was successful.
     87 **/
     88 EFI_STATUS
     89 EFIAPI
     90 MainTitleBarRefresh (
     91   IN CONST CHAR16                 *FileName OPTIONAL,
     92   IN CONST EDIT_FILE_TYPE         FileType,
     93   IN CONST BOOLEAN                ReadOnly,
     94   IN CONST BOOLEAN                Modified,
     95   IN CONST UINTN                  LastCol,
     96   IN CONST UINTN                  LastRow,
     97   IN CONST UINTN                  Offset,
     98   IN CONST UINTN                  Size
     99   )
    100 {
    101   TITLE_BAR_COLOR_UNION   Orig;
    102   TITLE_BAR_COLOR_UNION   New;
    103   CONST CHAR16            *FileNameTmp;
    104   INTN                    TempInteger;
    105 
    106 
    107   //
    108   // backup the old screen attributes
    109   //
    110   Orig.Data             = gST->ConOut->Mode->Attribute;
    111   New.Data              = 0;
    112   New.Colors.Foreground = Orig.Colors.Background & 0xF;
    113   New.Colors.Background = Orig.Colors.Foreground & 0x7;
    114 
    115   gST->ConOut->SetAttribute (gST->ConOut, New.Data & 0x7F);
    116 
    117   //
    118   // clear the title line
    119   //
    120   EditorClearLine (1, LastCol, LastRow);
    121 
    122   if (Title != NULL) {
    123     //
    124     // print the new title bar prefix
    125     //
    126     ShellPrintEx (
    127       0,
    128       0,
    129       L"%s ",
    130       Title
    131       );
    132   }
    133   if (FileName == NULL) {
    134     gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);
    135     return EFI_SUCCESS;
    136   }
    137   //
    138   // First Extract the FileName from fullpath
    139   //
    140   FileNameTmp = FileName;
    141   for (TempInteger = StrLen (FileNameTmp) - 1; TempInteger >= 0; TempInteger--) {
    142     if (FileNameTmp[TempInteger] == L'\\') {
    143       break;
    144     }
    145   }
    146 
    147   FileNameTmp = FileNameTmp + TempInteger + 1;
    148 
    149   //
    150   // the space for file name is 20 characters
    151   //
    152   if (StrLen (FileNameTmp) <= 20) {
    153     ShellPrintEx (-1,-1, L"%s   ", FileNameTmp);
    154     for (TempInteger = StrLen (FileNameTmp); TempInteger < 20; TempInteger++) {
    155       ShellPrintEx (-1,-1, L" ");
    156     }
    157 
    158   } else {
    159     for (TempInteger = 0; TempInteger < 17; TempInteger++) {
    160       ShellPrintEx (-1,-1, L"%c", FileNameTmp[TempInteger]);
    161     }
    162     //
    163     // print "..."
    164     //
    165     ShellPrintEx (-1,-1, L"...   ");
    166   }
    167   //
    168   // print file type field
    169   //
    170   switch (FileType){
    171     case FileTypeAscii:
    172     case FileTypeUnicode:
    173       if (FileType == FileTypeAscii){
    174         ShellPrintEx (-1,-1, L"     ASCII     ");
    175       } else {
    176         ShellPrintEx (-1,-1, L"     UNICODE   ");
    177       }
    178       //
    179       // print read-only field for text files
    180       //
    181       if (ReadOnly) {
    182         ShellPrintEx (-1,-1, L"ReadOnly   ");
    183       } else {
    184         ShellPrintEx (-1,-1, L"           ");
    185       }
    186     break;
    187     case FileTypeDiskBuffer:
    188     case FileTypeMemBuffer:
    189       //
    190       // Print the offset.
    191       //
    192       ShellPrintEx (-1,-1, L"Offset %X | Size %X", Offset, Size);
    193     case FileTypeFileBuffer:
    194       break;
    195     default:
    196       break;
    197   }
    198   //
    199   // print modified field
    200   //
    201   if (Modified) {
    202     ShellPrintEx (-1,-1, L"Modified");
    203   }
    204   //
    205   // restore the old attribute
    206   //
    207   gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);
    208 
    209   return EFI_SUCCESS;
    210 }
    211