xref: /haiku/src/apps/cortex/InfoView/FileNodeInfoView.cpp (revision bf6a2a2bf1b5a1d8736bb07f92c25eacf815aee0)
1 /*
2  * Copyright (c) 1999-2000, Eric Moon.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions, and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions, and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * 3. The name of the author may not be used to endorse or promote products
17  *    derived from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21  * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 
32 // FileNodeInfoView.cpp
33 
34 #include "FileNodeInfoView.h"
35 #include "MediaIcon.h"
36 #include "MediaString.h"
37 #include "NodeRef.h"
38 
39 #undef B_CATALOG
40 #define B_CATALOG (&sCatalog)
41 #include <Catalog.h>
42 #include <MediaFile.h>
43 #include <MediaNode.h>
44 #include <MediaRoster.h>
45 #include <MediaTrack.h>
46 #include <TimeCode.h>
47 
48 #undef B_TRANSLATION_CONTEXT
49 #define B_TRANSLATION_CONTEXT "FileNodeInfoView"
50 
51 __USE_CORTEX_NAMESPACE
52 
53 #include <Debug.h>
54 #define D_METHOD(x) //PRINT (x)
55 
56 static BCatalog sCatalog("x-vnd.Cortex.InfoView");
57 
58 // -------------------------------------------------------- //
59 // *** ctor/dtor (public)
60 // -------------------------------------------------------- //
61 
FileNodeInfoView(const NodeRef * ref)62 FileNodeInfoView::FileNodeInfoView(
63 	const NodeRef *ref)
64 	: LiveNodeInfoView(ref)
65 {
66 	D_METHOD(("FileNodeInfoView::FileNodeInfoView()\n"));
67 
68 	// adjust view properties
69 	setSideBarWidth(be_plain_font->StringWidth(B_TRANSLATE("File format"))
70 		+ 2 * InfoView::M_H_MARGIN);
71 	setSubTitle(B_TRANSLATE("Live file-interface node"));
72 
73 	// if a ref is set for this file-interface display some info
74 	// thru MediaFile and set the title appropriatly
75 	BString title;
76 	BString s;
77 	entry_ref nodeFile;
78 	status_t error;
79 	error = BMediaRoster::Roster()->GetRefFor(ref->node(), &nodeFile);
80 	if (!error)
81 	{
82 		BMediaFile file(&nodeFile);
83 		if (file.InitCheck() == B_OK)
84 		{
85 			// add separator field
86 			addField("", "");
87 
88 			// add "File Format" fields
89 			media_file_format format;
90 			if (file.GetFileFormatInfo(&format) == B_OK)
91 			{
92 				s = "";
93 				s << format.pretty_name << " (" << format.mime_type << ")";
94 				addField(B_TRANSLATE("File format"), s);
95 			}
96 
97 			// add "Copyright" field
98 			const char *copyRight = file.Copyright();
99 			if (copyRight)
100 			{
101 				s = copyRight;
102 				addField(B_TRANSLATE("Copyright"), s);
103 			}
104 
105 			// add "Tracks" list
106 			if (file.CountTracks() > 0)
107 			{
108 				addField(B_TRANSLATE("Tracks"), "");
109 				for (int32 i = 0; i < file.CountTracks(); i++)
110 				{
111 					BString label;
112 					label << "(" << i + 1 << ")";
113 					BMediaTrack *track = file.TrackAt(i);
114 
115 					// add format
116 					media_format format;
117 					if (track->EncodedFormat(&format) == B_OK)
118 					{
119 						s = MediaString::getStringFor(format, false);
120 					}
121 
122 					if ((format.type == B_MEDIA_ENCODED_AUDIO)
123 					 || (format.type == B_MEDIA_ENCODED_VIDEO))
124 					{
125 						// add codec
126 						media_codec_info codec;
127 						if (track->GetCodecInfo(&codec) == B_OK)
128 						{
129 							s << B_TRANSLATE("\n- Codec:") << " "
130 								<< codec.pretty_name;
131 							if (codec.id > 0)
132 							{
133 								s << " (" << B_TRANSLATE("ID:") << " "
134 									<< codec.id << ")";
135 							}
136 						}
137 					}
138 
139 					// add duration
140 					bigtime_t duration = track->Duration();
141 					int hours, minutes, seconds, frames;
142 					us_to_timecode(duration, &hours, &minutes, &seconds, &frames);
143 					char buffer[64];
144 					sprintf(buffer, "%02d:%02d:%02d:%02d", hours, minutes, seconds, frames);
145 					s << B_TRANSLATE("\n- Duration:") << " " << buffer;
146 
147 					// add quality
148 					float quality;
149 					if (track->GetQuality(&quality) == B_OK)
150 					{
151 						s << B_TRANSLATE("\n- Quality:") << " " << quality;
152 					}
153 					addField(label, s);
154 				}
155 			}
156 		}
157 		// set title
158 		BEntry entry(&nodeFile);
159 		char fileName[B_FILE_NAME_LENGTH];
160 		entry.GetName(fileName);
161 		title = fileName;
162 	}
163 	else
164 	{
165 		// set title
166 		title = ref->name();
167 		title += " ";
168 		title += B_TRANSLATE("(no file)");
169 	}
170 	setTitle(title);
171 }
172 
~FileNodeInfoView()173 FileNodeInfoView::~FileNodeInfoView()
174 {
175 	D_METHOD(("FileNodeInfoView::~FileNodeInfoView()\n"));
176 }
177 
178 // END -- FileNodeInfoView.cpp --
179