| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/omnibox/omnibox_view_views.h" | 5 #include "chrome/browser/ui/views/omnibox/omnibox_view_views.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/app/chrome_command_ids.h" | 10 #include "chrome/app/chrome_command_ids.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 #include "ui/base/dragdrop/drag_drop_types.h" | 32 #include "ui/base/dragdrop/drag_drop_types.h" |
| 33 #include "ui/base/dragdrop/os_exchange_data.h" | 33 #include "ui/base/dragdrop/os_exchange_data.h" |
| 34 #include "ui/base/events/event.h" | 34 #include "ui/base/events/event.h" |
| 35 #include "ui/base/ime/text_input_client.h" | 35 #include "ui/base/ime/text_input_client.h" |
| 36 #include "ui/base/ime/text_input_type.h" | 36 #include "ui/base/ime/text_input_type.h" |
| 37 #include "ui/base/l10n/l10n_util.h" | 37 #include "ui/base/l10n/l10n_util.h" |
| 38 #include "ui/base/models/simple_menu_model.h" | 38 #include "ui/base/models/simple_menu_model.h" |
| 39 #include "ui/base/resource/resource_bundle.h" | 39 #include "ui/base/resource/resource_bundle.h" |
| 40 #include "ui/gfx/canvas.h" | 40 #include "ui/gfx/canvas.h" |
| 41 #include "ui/gfx/font.h" | 41 #include "ui/gfx/font.h" |
| 42 #include "ui/gfx/render_text.h" | 42 #include "ui/gfx/selection_model.h" |
| 43 #include "ui/views/border.h" | 43 #include "ui/views/border.h" |
| 44 #include "ui/views/controls/textfield/textfield.h" | 44 #include "ui/views/controls/textfield/textfield.h" |
| 45 #include "ui/views/ime/input_method.h" | 45 #include "ui/views/ime/input_method.h" |
| 46 #include "ui/views/layout/fill_layout.h" | 46 #include "ui/views/layout/fill_layout.h" |
| 47 #include "ui/views/views_delegate.h" | 47 #include "ui/views/views_delegate.h" |
| 48 #include "ui/views/widget/widget.h" | 48 #include "ui/views/widget/widget.h" |
| 49 | 49 |
| 50 #if defined(USE_AURA) | 50 #if defined(USE_AURA) |
| 51 #include "ui/aura/focus_manager.h" | 51 #include "ui/aura/focus_manager.h" |
| 52 #include "ui/aura/root_window.h" | 52 #include "ui/aura/root_window.h" |
| 53 #include "ui/compositor/layer.h" | 53 #include "ui/compositor/layer.h" |
| 54 #endif | 54 #endif |
| 55 | 55 |
| 56 using content::WebContents; | |
| 57 | |
| 58 namespace { | 56 namespace { |
| 59 | 57 |
| 60 // Stores omnibox state for each tab. | 58 // Stores omnibox state for each tab. |
| 61 struct ViewState { | 59 struct OmniboxState : public base::SupportsUserData::Data { |
| 62 explicit ViewState(const gfx::SelectionModel& selection_model) | 60 static const char kKey[]; |
| 63 : selection_model(selection_model) { | |
| 64 } | |
| 65 | 61 |
| 66 // SelectionModel of selected text. | 62 OmniboxState(const OmniboxEditModel::State& model_state, |
| 67 gfx::SelectionModel selection_model; | 63 const gfx::SelectionModel& selection_model); |
| 64 virtual ~OmniboxState(); |
| 65 |
| 66 const OmniboxEditModel::State model_state; |
| 67 const gfx::SelectionModel selection_model; |
| 68 }; | 68 }; |
| 69 | 69 |
| 70 const char kAutocompleteEditStateKey[] = "AutocompleteEditState"; | 70 // static |
| 71 const char OmniboxState::kKey[] = "OmniboxState"; |
| 71 | 72 |
| 72 struct AutocompleteEditState : public base::SupportsUserData::Data { | 73 OmniboxState::OmniboxState(const OmniboxEditModel::State& model_state, |
| 73 AutocompleteEditState(const OmniboxEditModel::State& model_state, | 74 const gfx::SelectionModel& selection_model) |
| 74 const ViewState& view_state) | 75 : model_state(model_state), |
| 75 : model_state(model_state), | 76 selection_model(selection_model) { |
| 76 view_state(view_state) { | 77 } |
| 77 } | |
| 78 virtual ~AutocompleteEditState() {} | |
| 79 | 78 |
| 80 const OmniboxEditModel::State model_state; | 79 OmniboxState::~OmniboxState() {} |
| 81 const ViewState view_state; | |
| 82 }; | |
| 83 | 80 |
| 84 // The following const value is the same as in browser_defaults. | 81 // The following const value is the same as in browser_defaults. |
| 85 const int kAutocompleteEditFontPixelSize = 15; | 82 const int kAutocompleteEditFontPixelSize = 15; |
| 86 // Font size 10px (as defined in browser_defaults) is too small for many | 83 // Font size 10px (as defined in browser_defaults) is too small for many |
| 87 // non-Latin/Greek/Cyrillic (non-LGC) scripts. For pop-up window, the total | 84 // non-Latin/Greek/Cyrillic (non-LGC) scripts. For pop-up window, the total |
| 88 // rectangle is 21px tall and the height available for "ink" is 17px (please | 85 // rectangle is 21px tall and the height available for "ink" is 17px (please |
| 89 // refer to kAutocompleteVerticalMarginInPopup). With 12px font size, the | 86 // refer to kAutocompleteVerticalMarginInPopup). With 12px font size, the |
| 90 // tallest glyphs in UI fonts we're building for ChromeOS (across all scripts) | 87 // tallest glyphs in UI fonts we're building for ChromeOS (across all scripts) |
| 91 // still fit within 17px "ink" height. | 88 // still fit within 17px "ink" height. |
| 92 const int kAutocompleteEditFontPixelSizeInPopup = 12; | 89 const int kAutocompleteEditFontPixelSizeInPopup = 12; |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 // Close the popup. | 352 // Close the popup. |
| 356 CloseOmniboxPopup(); | 353 CloseOmniboxPopup(); |
| 357 // Tell the model to reset itself. | 354 // Tell the model to reset itself. |
| 358 model()->OnKillFocus(); | 355 model()->OnKillFocus(); |
| 359 controller()->OnKillFocus(); | 356 controller()->OnKillFocus(); |
| 360 } | 357 } |
| 361 | 358 |
| 362 //////////////////////////////////////////////////////////////////////////////// | 359 //////////////////////////////////////////////////////////////////////////////// |
| 363 // OmniboxViewViews, OmniboxView implementation: | 360 // OmniboxViewViews, OmniboxView implementation: |
| 364 | 361 |
| 365 void OmniboxViewViews::SaveStateToTab(WebContents* tab) { | 362 void OmniboxViewViews::SaveStateToTab(content::WebContents* tab) { |
| 366 DCHECK(tab); | 363 DCHECK(tab); |
| 367 | 364 |
| 368 // We don't want to keep the IME status, so force quit the current | 365 // We don't want to keep the IME status, so force quit the current |
| 369 // session here. It may affect the selection status, so order is | 366 // session here. It may affect the selection status, so order is |
| 370 // also important. | 367 // also important. |
| 371 if (IsIMEComposing()) { | 368 if (IsIMEComposing()) { |
| 372 GetTextInputClient()->ConfirmCompositionText(); | 369 GetTextInputClient()->ConfirmCompositionText(); |
| 373 GetInputMethod()->CancelComposition(this); | 370 GetInputMethod()->CancelComposition(this); |
| 374 } | 371 } |
| 375 | 372 |
| 376 // NOTE: GetStateForTabSwitch may affect GetSelection, so order is important. | 373 // NOTE: GetStateForTabSwitch may affect GetSelection, so order is important. |
| 377 OmniboxEditModel::State model_state = model()->GetStateForTabSwitch(); | 374 OmniboxEditModel::State state = model()->GetStateForTabSwitch(); |
| 378 gfx::SelectionModel selection; | 375 gfx::SelectionModel selection; |
| 379 GetSelectionModel(&selection); | 376 GetSelectionModel(&selection); |
| 380 tab->SetUserData( | 377 tab->SetUserData(OmniboxState::kKey, new OmniboxState(state, selection)); |
| 381 kAutocompleteEditStateKey, | |
| 382 new AutocompleteEditState(model_state, ViewState(selection))); | |
| 383 } | 378 } |
| 384 | 379 |
| 385 void OmniboxViewViews::Update(const WebContents* contents) { | 380 void OmniboxViewViews::Update(const content::WebContents* contents) { |
| 386 // NOTE: We're getting the URL text here from the ToolbarModel. | 381 // NOTE: We're getting the URL text here from the ToolbarModel. |
| 387 bool visibly_changed_permanent_text = | 382 bool visibly_changed_permanent_text = |
| 388 model()->UpdatePermanentText(toolbar_model()->GetText(true)); | 383 model()->UpdatePermanentText(toolbar_model()->GetText(true)); |
| 389 ToolbarModel::SecurityLevel security_level = | 384 ToolbarModel::SecurityLevel security_level = |
| 390 toolbar_model()->GetSecurityLevel(); | 385 toolbar_model()->GetSecurityLevel(); |
| 391 bool changed_security_level = (security_level != security_level_); | 386 bool changed_security_level = (security_level != security_level_); |
| 392 security_level_ = security_level; | 387 security_level_ = security_level; |
| 393 | 388 |
| 394 // TODO(oshima): Copied from gtk implementation which is | 389 // TODO(msw|oshima): Copied from GTK, determine correct Win/CrOS behavior. |
| 395 // slightly different from WIN impl. Find out the correct implementation | |
| 396 // for views-implementation. | |
| 397 if (contents) { | 390 if (contents) { |
| 398 RevertAll(); | 391 RevertAll(); |
| 399 const AutocompleteEditState* state = static_cast<AutocompleteEditState*>( | 392 const OmniboxState* state = static_cast<OmniboxState*>( |
| 400 contents->GetUserData(&kAutocompleteEditStateKey)); | 393 contents->GetUserData(&OmniboxState::kKey)); |
| 401 if (state) { | 394 if (state) { |
| 395 // Restore the saved state and selection. |
| 402 model()->RestoreState(state->model_state); | 396 model()->RestoreState(state->model_state); |
| 403 | 397 SelectSelectionModel(state->selection_model); |
| 404 // Move the marks for the cursor and the other end of the selection to | 398 // TODO(oshima): Consider saving/restoring edit history. |
| 405 // the previously-saved offsets (but preserve PRIMARY). | |
| 406 SelectSelectionModel(state->view_state.selection_model); | |
| 407 // We do not carry over the current edit history to another tab. | |
| 408 // TODO(oshima): consider saving/restoring edit history. | |
| 409 ClearEditHistory(); | 399 ClearEditHistory(); |
| 410 } | 400 } |
| 411 } else if (visibly_changed_permanent_text) { | 401 } else if (visibly_changed_permanent_text) { |
| 412 RevertAll(); | 402 RevertAll(); |
| 413 } else if (changed_security_level) { | 403 } else if (changed_security_level) { |
| 414 EmphasizeURLComponents(); | 404 EmphasizeURLComponents(); |
| 415 } | 405 } |
| 416 } | 406 } |
| 417 | 407 |
| 418 string16 OmniboxViewViews::GetText() const { | 408 string16 OmniboxViewViews::GetText() const { |
| (...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 864 const string16 text(GetClipboardText()); | 854 const string16 text(GetClipboardText()); |
| 865 if (!text.empty()) { | 855 if (!text.empty()) { |
| 866 // Record this paste, so we can do different behavior. | 856 // Record this paste, so we can do different behavior. |
| 867 model()->on_paste(); | 857 model()->on_paste(); |
| 868 // Force a Paste operation to trigger the text_changed code in | 858 // Force a Paste operation to trigger the text_changed code in |
| 869 // OnAfterPossibleChange(), even if identical contents are pasted. | 859 // OnAfterPossibleChange(), even if identical contents are pasted. |
| 870 text_before_change_.clear(); | 860 text_before_change_.clear(); |
| 871 ReplaceSelection(text); | 861 ReplaceSelection(text); |
| 872 } | 862 } |
| 873 } | 863 } |
| OLD | NEW |