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
MainTitleBarInit(CONST CHAR16 * Prompt)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
MainTitleBarCleanup(VOID)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
MainTitleBarRefresh(IN CONST CHAR16 * FileName OPTIONAL,IN CONST EDIT_FILE_TYPE FileType,IN CONST BOOLEAN ReadOnly,IN CONST BOOLEAN Modified,IN CONST UINTN LastCol,IN CONST UINTN LastRow,IN CONST UINTN Offset,IN CONST UINTN Size)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