xref: /haiku/src/apps/terminal/TitlePlaceholderMapper.cpp (revision 25a7b01d15612846f332751841da3579db313082)
1 /*
2  * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "TitlePlaceholderMapper.h"
8 
9 #include <Catalog.h>
10 
11 #include "TermConst.h"
12 
13 
14 // #pragma mark - TitlePlaceholderMapper
15 
16 
TitlePlaceholderMapper(const ShellInfo & shellInfo,const ActiveProcessInfo & processInfo)17 TitlePlaceholderMapper::TitlePlaceholderMapper(const ShellInfo& shellInfo,
18 	const ActiveProcessInfo& processInfo)
19 	:
20 	fShellInfo(shellInfo),
21 	fProcessInfo(processInfo)
22 {
23 }
24 
25 
26 bool
MapPlaceholder(char placeholder,int64 number,bool numberGiven,BString & _string)27 TitlePlaceholderMapper::MapPlaceholder(char placeholder, int64 number,
28 	bool numberGiven, BString& _string)
29 {
30 	switch (placeholder) {
31 		case 'd':
32 		{
33 			// current working directory
34 
35 			// If a number is given, extract the respective number of rightmost
36 			// components.
37 			BString directory(fProcessInfo.CurrentDirectory());
38 			if (numberGiven && number > 0) {
39 				int32 index = directory.Length();
40 				while (number > 0 && index > 0) {
41 					index = directory.FindLast('/', index - 1);
42 					number--;
43 				}
44 
45 				if (number == 0 && index >= 0 && index + 1 < directory.Length())
46 					directory.Remove(0, index + 1);
47 			}
48 
49 			_string = directory;
50 			return true;
51 		}
52 
53 		case 'e':
54 			if (fShellInfo.Encoding() != M_UTF8) {
55 				_string.Truncate(0);
56 				_string << "[" << fShellInfo.EncodingName() << "]";
57 			}
58 			return true;
59 
60 		case 'p':
61 			// process name -- use "--", if the shell is active and it is the
62 			// default shell
63 			if (fProcessInfo.ID() == fShellInfo.ProcessID()
64 				&& fShellInfo.IsDefaultShell()) {
65 				_string = "--";
66 			} else
67 				_string = fProcessInfo.Name();
68 			return true;
69 	}
70 
71 	return false;
72 }
73 
74 
75 // #pragma mark - WindowTitlePlaceholderMapper
76 
77 
WindowTitlePlaceholderMapper(const ShellInfo & shellInfo,const ActiveProcessInfo & processInfo,int32 windowIndex,const BString & tabTitle)78 WindowTitlePlaceholderMapper::WindowTitlePlaceholderMapper(
79 	const ShellInfo& shellInfo, const ActiveProcessInfo& processInfo,
80 	int32 windowIndex, const BString& tabTitle)
81 	:
82 	TitlePlaceholderMapper(shellInfo, processInfo),
83 	fWindowIndex(windowIndex),
84 	fTabTitle(tabTitle)
85 {
86 }
87 
88 
89 bool
MapPlaceholder(char placeholder,int64 number,bool numberGiven,BString & _string)90 WindowTitlePlaceholderMapper::MapPlaceholder(char placeholder, int64 number,
91 	bool numberGiven, BString& _string)
92 {
93 	switch (placeholder) {
94 		case 'T':
95 			// The Terminal application name for the current locale
96 			_string = B_TRANSLATE_SYSTEM_NAME("Terminal");
97 			return true;
98 
99 		case 'i':
100 			// window index
101 			_string.Truncate(0);
102 			if (fWindowIndex != 0)
103 				_string << fWindowIndex;
104 			return true;
105 
106 		case 't':
107 			// the tab title
108 			_string = fTabTitle;
109 			return true;
110 	}
111 
112 	return TitlePlaceholderMapper::MapPlaceholder(placeholder, number,
113 		numberGiven, _string);
114 }
115 
116 
117 // #pragma mark - TabTitlePlaceholderMapper
118 
119 
TabTitlePlaceholderMapper(const ShellInfo & shellInfo,const ActiveProcessInfo & processInfo,int32 tabIndex)120 TabTitlePlaceholderMapper::TabTitlePlaceholderMapper(const ShellInfo& shellInfo,
121 	const ActiveProcessInfo& processInfo, int32 tabIndex)
122 	:
123 	TitlePlaceholderMapper(shellInfo, processInfo),
124 	fTabIndex(tabIndex)
125 {
126 }
127 
128 
129 bool
MapPlaceholder(char placeholder,int64 number,bool numberGiven,BString & _string)130 TabTitlePlaceholderMapper::MapPlaceholder(char placeholder, int64 number,
131 	bool numberGiven, BString& _string)
132 {
133 	switch (placeholder) {
134 		case 'i':
135 			// tab index
136 			_string.Truncate(0);
137 			_string << fTabIndex;
138 			return true;
139 	}
140 
141 	return TitlePlaceholderMapper::MapPlaceholder(placeholder, number,
142 		numberGiven, _string);
143 }
144