summaryrefslogtreecommitdiffstats
path: root/ui/views
diff options
context:
space:
mode:
authormsw@chromium.org <msw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-06 10:59:41 +0000
committermsw@chromium.org <msw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-06 10:59:41 +0000
commit0089360438b9cbbb36779c3eacf436f20ab85209 (patch)
tree33a35c408c7e597ab97c23429f1d96d8dfb13186 /ui/views
parent27c179e4e4a6567ea60a91dbc28d555474c18b0d (diff)
downloadchromium_src-0089360438b9cbbb36779c3eacf436f20ab85209.zip
chromium_src-0089360438b9cbbb36779c3eacf436f20ab85209.tar.gz
chromium_src-0089360438b9cbbb36779c3eacf436f20ab85209.tar.bz2
Clip Views textfield drag images to selected text.
Paint views::Textfield drag images with views::Labels. Makes the drag image fit the size of the selected text. (not as wide as the origin Omnibox/textfield itself) Use an offset for the image similar to the Unity desktop. This changes the appearance of split-selection BiDi text. (doesn't show blank area between the visually split text) See before/after pictures at http://crbug.com/349105 Remove now unused RenderText::DrawSelectedTextForDrag. BUG=349105 TEST=Linux Aura and ChromeOS text drag images look good. R=sky@chromium.org Review URL: https://codereview.chromium.org/177683005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255310 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/views')
-rw-r--r--ui/views/controls/textfield/textfield.cc62
1 files changed, 36 insertions, 26 deletions
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc
index 94888d7..8442b7c 100644
--- a/ui/views/controls/textfield/textfield.cc
+++ b/ui/views/controls/textfield/textfield.cc
@@ -18,10 +18,13 @@
#include "ui/events/event.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/display.h"
#include "ui/gfx/insets.h"
+#include "ui/gfx/screen.h"
#include "ui/native_theme/native_theme.h"
#include "ui/views/background.h"
#include "ui/views/controls/focusable_border.h"
+#include "ui/views/controls/label.h"
#include "ui/views/controls/menu/menu_item_view.h"
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/controls/native/native_view_host.h"
@@ -37,23 +40,23 @@
#include "base/win/win_util.h"
#endif
+namespace views {
+
namespace {
// Default placeholder text color.
const SkColor kDefaultPlaceholderTextColor = SK_ColorLTGRAY;
-void ConvertRectToScreen(const views::View* src, gfx::Rect* r) {
+void ConvertRectToScreen(const View* src, gfx::Rect* r) {
DCHECK(src);
gfx::Point new_origin = r->origin();
- views::View::ConvertPointToScreen(src, &new_origin);
+ View::ConvertPointToScreen(src, &new_origin);
r->set_origin(new_origin);
}
} // namespace
-namespace views {
-
// static
const char Textfield::kViewClassName[] = "Textfield";
@@ -827,40 +830,47 @@ void Textfield::OnCompositionTextConfirmedOrCleared() {
////////////////////////////////////////////////////////////////////////////////
// Textfield, ContextMenuController overrides:
-void Textfield::ShowContextMenuForView(
- View* source,
- const gfx::Point& point,
- ui::MenuSourceType source_type) {
+void Textfield::ShowContextMenuForView(View* source,
+ const gfx::Point& point,
+ ui::MenuSourceType source_type) {
UpdateContextMenu();
- if (context_menu_runner_->RunMenuAt(GetWidget(), NULL,
- gfx::Rect(point, gfx::Size()), views::MenuItemView::TOPLEFT,
- source_type,
- MenuRunner::HAS_MNEMONICS | views::MenuRunner::CONTEXT_MENU) ==
- MenuRunner::MENU_DELETED)
- return;
+ ignore_result(context_menu_runner_->RunMenuAt(GetWidget(), NULL,
+ gfx::Rect(point, gfx::Size()), MenuItemView::TOPLEFT, source_type,
+ MenuRunner::HAS_MNEMONICS | MenuRunner::CONTEXT_MENU));
}
////////////////////////////////////////////////////////////////////////////////
-// Textfield, views::DragController overrides:
+// Textfield, DragController overrides:
-void Textfield::WriteDragDataForView(views::View* sender,
+void Textfield::WriteDragDataForView(View* sender,
const gfx::Point& press_pt,
OSExchangeData* data) {
- DCHECK_NE(ui::DragDropTypes::DRAG_NONE,
- GetDragOperationsForView(sender, press_pt));
- data->SetString(model_->GetSelectedText());
+ const base::string16& selected_text(GetSelectedText());
+ data->SetString(selected_text);
+ Label label(selected_text, GetFontList());
+ const SkColor background = GetBackgroundColor();
+ label.SetBackgroundColor(SkColorSetA(background, SK_AlphaTRANSPARENT));
+ gfx::Size size(label.GetPreferredSize());
+ gfx::NativeView native_view = GetWidget()->GetNativeView();
+ gfx::Display display = gfx::Screen::GetScreenFor(native_view)->
+ GetDisplayNearestWindow(native_view);
+ size.SetToMin(gfx::Size(display.size().width(), height()));
+ label.SetBoundsRect(gfx::Rect(size));
scoped_ptr<gfx::Canvas> canvas(
- views::GetCanvasForDragImage(GetWidget(), size()));
- GetRenderText()->DrawSelectedTextForDrag(canvas.get());
- drag_utils::SetDragImageOnDataObject(*canvas, size(),
- press_pt.OffsetFromOrigin(),
- data);
+ GetCanvasForDragImage(GetWidget(), label.size()));
+ label.SetEnabledColor(GetTextColor());
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+ // Desktop Linux Aura does not yet support transparency in drag images.
+ canvas->DrawColor(background);
+#endif
+ label.Paint(canvas.get());
+ const gfx::Vector2d kOffset(-15, 0);
+ drag_utils::SetDragImageOnDataObject(*canvas, label.size(), kOffset, data);
if (controller_)
controller_->OnWriteDragData(data);
}
-int Textfield::GetDragOperationsForView(views::View* sender,
- const gfx::Point& p) {
+int Textfield::GetDragOperationsForView(View* sender, const gfx::Point& p) {
int drag_operations = ui::DragDropTypes::DRAG_COPY;
if (!enabled() || text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD ||
!GetRenderText()->IsPointInSelection(p)) {