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
19CHAR16  *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**/
29EFI_STATUS
30EFIAPI
31MainTitleBarInit (
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**/
54VOID
55EFIAPI
56MainTitleBarCleanup (
57  VOID
58  )
59{
60  SHELL_FREE_NON_NULL (Title);
61  Title = NULL;
62}
63
64typedef struct {
65  UINT32  Foreground : 4;
66  UINT32  Background : 4;
67} TITLE_BAR_COLOR_ATTRIBUTES;
68
69typedef 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**/
88EFI_STATUS
89EFIAPI
90MainTitleBarRefresh (
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