Index: chrome/browser/views/download_item_view.cc |
=================================================================== |
--- chrome/browser/views/download_item_view.cc (revision 4245) |
+++ chrome/browser/views/download_item_view.cc (working copy) |
@@ -201,10 +201,23 @@ |
AddChildView(save_button_); |
AddChildView(discard_button_); |
std::wstring file_name = download->original_name(); |
+ |
// Ensure the file name is not too long. |
- ElideString(file_name, kFileNameMaxLength, &file_name); |
+ |
+ // Extract the file extension (if any). |
+ std::wstring extension = file_util::GetFileExtensionFromPath(file_name); |
+ std::wstring rootname = |
+ file_util::GetFilenameWithoutExtensionFromPath(file_name); |
+ |
+ // Elide giant extensions (this shouldn't currently be hit, but might |
+ // in future, should we ever notice unsafe giant extensions). |
+ if (extension.length() > kFileNameMaxLength / 2) |
+ ElideString(extension, kFileNameMaxLength / 2, &extension); |
+ |
+ ElideString(rootname, kFileNameMaxLength - extension.length(), &rootname); |
dangerous_download_label_ = new views::Label( |
- l10n_util::GetStringF(IDS_PROMPT_DANGEROUS_DOWNLOAD, file_name)); |
+ l10n_util::GetStringF(IDS_PROMPT_DANGEROUS_DOWNLOAD, |
+ rootname + L"." + extension)); |
dangerous_download_label_->SetMultiLine(true); |
dangerous_download_label_->SetHorizontalAlignment( |
views::Label::ALIGN_LEFT); |
@@ -438,15 +451,51 @@ |
} |
} |
- // Print the text, left aligned. |
+ // Print the text, left aligned and always print the file extension. |
// Last value of x was the end of the right image, just before the button. |
// Note that in dangerous mode we use a label (as the text is multi-line). |
if (!IsDangerousMode()) { |
+ // Because just drawing the filename using DrawStringInt results in |
+ // Windows eliding the text and potentially chopping off the file |
+ // extension, we need to draw the file's name and extension separately. |
+ |
+ // Extract the file extension (if any). |
+ std::wstring extension = L"." + |
+ file_util::GetFileExtensionFromPath(download_->GetFileName()); |
+ std::wstring rootname = file_util::GetFilenameWithoutExtensionFromPath( |
+ download_->GetFileName()); |
+ |
+ // Figure out the width of the extension. |
+ int ext_width = 0; |
+ int file_width = 0; |
+ int h = 0; |
+ canvas->SizeStringInt(extension, font_, &ext_width, &h, |
+ ChromeCanvas::NO_ELLIPSIS); |
+ canvas->SizeStringInt(rootname, font_, &file_width, &h, |
+ ChromeCanvas::NO_ELLIPSIS); |
+ |
+ // If the extension is ridiculously long, truncate it. |
+ if (ext_width > kTextWidth / 2) |
+ ext_width = kTextWidth / 2; |
+ |
+ // Expand the extension width to fill any spare space so that |
+ // it is aligned to the right edge of the file. |
+ if (file_width < kTextWidth - ext_width) |
+ ext_width = kTextWidth - file_width; |
+ |
if (show_status_text_) { |
int y = box_y_ + kVerticalPadding; |
- canvas->DrawStringInt(download_->GetFileName(), font_, kFileNameColor, |
+ |
+ // Draw the file's name. |
+ canvas->DrawStringInt(rootname, font_, kFileNameColor, |
download_util::kSmallProgressIconSize, y, |
- kTextWidth, font_.height()); |
+ kTextWidth - ext_width, font_.height()); |
+ |
+ // Draw the file's extension. |
+ canvas->DrawStringInt(extension, font_, kFileNameColor, |
+ download_util::kSmallProgressIconSize + |
+ kTextWidth - ext_width, y, |
+ ext_width, font_.height()); |
y += font_.height() + kVerticalTextPadding; |
canvas->DrawStringInt(status_text_, font_, kStatusColor, |
@@ -454,9 +503,17 @@ |
kTextWidth, font_.height()); |
} else { |
int y = box_y_ + (box_height_ - font_.height()) / 2; |
- canvas->DrawStringInt(download_->GetFileName(), font_, kFileNameColor, |
+ |
+ // Draw the file's name. |
+ canvas->DrawStringInt(rootname, font_, kFileNameColor, |
download_util::kSmallProgressIconSize, y, |
- kTextWidth, font_.height()); |
+ kTextWidth - ext_width, font_.height()); |
+ |
+ // Draw the file's extension. |
+ canvas->DrawStringInt(extension, font_, kFileNameColor, |
+ download_util::kSmallProgressIconSize + |
+ kTextWidth - ext_width, y, |
+ ext_width, font_.height()); |
} |
} |