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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/autofill/autofill_dialog_types.h" 6 7 #include "base/logging.h" 8 #include "base/strings/string_split.h" 9 #include "base/strings/string_util.h" 10 #include "grit/generated_resources.h" 11 #include "ui/base/resource/resource_bundle.h" 12 13 namespace { 14 15 bool IsSureError(const autofill::ValidityMessage& message) { 16 return message.sure && !message.text.empty(); 17 } 18 19 } // namespace 20 21 namespace autofill { 22 23 static const base::char16 kRangeSeparator = '|'; 24 25 // Street address is multi-line, except in countries where it shares a line 26 // with other inputs (such as Coite d'Ivoire). 27 bool DetailInput::IsMultiline() const { 28 return (type == ADDRESS_HOME_STREET_ADDRESS || 29 type == ADDRESS_BILLING_STREET_ADDRESS) && 30 length == DetailInput::LONG; 31 } 32 33 DialogNotification::DialogNotification() : type_(NONE) {} 34 35 DialogNotification::DialogNotification(Type type, 36 const base::string16& display_text) 37 : type_(type), 38 display_text_(display_text), 39 checked_(false) { 40 // If there's a range separated by bars, mark that as the anchor text. 41 std::vector<base::string16> pieces; 42 base::SplitStringDontTrim(display_text, kRangeSeparator, &pieces); 43 if (pieces.size() > 1) { 44 size_t start = pieces[0].size(); 45 size_t end = start + pieces[1].size(); 46 link_range_ = gfx::Range(start, end); 47 display_text_ = JoinString(pieces, base::string16()); 48 } 49 } 50 51 DialogNotification::~DialogNotification() {} 52 53 SkColor DialogNotification::GetBackgroundColor() const { 54 switch (type_) { 55 case DialogNotification::WALLET_USAGE_CONFIRMATION: 56 return SkColorSetRGB(0xf5, 0xf5, 0xf5); 57 case DialogNotification::REQUIRED_ACTION: 58 case DialogNotification::WALLET_ERROR: 59 return SkColorSetRGB(0xfc, 0xf3, 0xbf); 60 case DialogNotification::DEVELOPER_WARNING: 61 case DialogNotification::SECURITY_WARNING: 62 return kWarningColor; 63 case DialogNotification::NONE: 64 return SK_ColorTRANSPARENT; 65 } 66 67 NOTREACHED(); 68 return SK_ColorTRANSPARENT; 69 } 70 71 SkColor DialogNotification::GetBorderColor() const { 72 switch (type_) { 73 case DialogNotification::WALLET_USAGE_CONFIRMATION: 74 return SkColorSetRGB(0xe5, 0xe5, 0xe5); 75 case DialogNotification::REQUIRED_ACTION: 76 case DialogNotification::WALLET_ERROR: 77 case DialogNotification::DEVELOPER_WARNING: 78 case DialogNotification::SECURITY_WARNING: 79 case DialogNotification::NONE: 80 return GetBackgroundColor(); 81 } 82 83 NOTREACHED(); 84 return SK_ColorTRANSPARENT; 85 } 86 87 SkColor DialogNotification::GetTextColor() const { 88 switch (type_) { 89 case DialogNotification::REQUIRED_ACTION: 90 case DialogNotification::WALLET_ERROR: 91 case DialogNotification::WALLET_USAGE_CONFIRMATION: 92 return SkColorSetRGB(102, 102, 102); 93 case DialogNotification::DEVELOPER_WARNING: 94 case DialogNotification::SECURITY_WARNING: 95 return SK_ColorWHITE; 96 case DialogNotification::NONE: 97 return SK_ColorTRANSPARENT; 98 } 99 100 NOTREACHED(); 101 return SK_ColorTRANSPARENT; 102 } 103 104 bool DialogNotification::HasArrow() const { 105 return type_ == DialogNotification::WALLET_ERROR || 106 type_ == DialogNotification::WALLET_USAGE_CONFIRMATION; 107 } 108 109 bool DialogNotification::HasCheckbox() const { 110 return type_ == DialogNotification::WALLET_USAGE_CONFIRMATION; 111 } 112 113 SkColor const kWarningColor = SkColorSetRGB(0xde, 0x49, 0x32); 114 115 SuggestionState::SuggestionState() 116 : visible(false) {} 117 SuggestionState::SuggestionState( 118 bool visible, 119 const base::string16& vertically_compact_text, 120 const base::string16& horizontally_compact_text, 121 const gfx::Image& icon, 122 const base::string16& extra_text, 123 const gfx::Image& extra_icon) 124 : visible(visible), 125 vertically_compact_text(vertically_compact_text), 126 horizontally_compact_text(horizontally_compact_text), 127 icon(icon), 128 extra_text(extra_text), 129 extra_icon(extra_icon) {} 130 SuggestionState::~SuggestionState() {} 131 132 DialogOverlayString::DialogOverlayString() {} 133 DialogOverlayString::~DialogOverlayString() {} 134 135 DialogOverlayState::DialogOverlayState() {} 136 DialogOverlayState::~DialogOverlayState() {} 137 138 ValidityMessage::ValidityMessage(const base::string16& text, bool sure) 139 : text(text), sure(sure) {} 140 ValidityMessage::~ValidityMessage() {} 141 142 ValidityMessages::ValidityMessages() 143 : default_message_(ValidityMessage(base::string16(), false)) {} 144 ValidityMessages::~ValidityMessages() {} 145 146 void ValidityMessages::Set( 147 ServerFieldType field, const ValidityMessage& message) { 148 MessageMap::iterator iter = messages_.find(field); 149 if (iter != messages_.end()) { 150 if (!iter->second.text.empty()) 151 return; 152 153 messages_.erase(iter); 154 } 155 156 messages_.insert(MessageMap::value_type(field, message)); 157 } 158 159 const ValidityMessage& ValidityMessages::GetMessageOrDefault( 160 ServerFieldType field) const { 161 MessageMap::const_iterator iter = messages_.find(field); 162 return iter != messages_.end() ? iter->second : default_message_; 163 } 164 165 bool ValidityMessages::HasSureError(ServerFieldType field) const { 166 return IsSureError(GetMessageOrDefault(field)); 167 } 168 169 bool ValidityMessages::HasErrors() const { 170 for (MessageMap::const_iterator iter = messages_.begin(); 171 iter != messages_.end(); ++iter) { 172 if (!iter->second.text.empty()) 173 return true; 174 } 175 return false; 176 } 177 178 bool ValidityMessages::HasSureErrors() const { 179 for (MessageMap::const_iterator iter = messages_.begin(); 180 iter != messages_.end(); ++iter) { 181 if (IsSureError(iter->second)) 182 return true; 183 } 184 return false; 185 } 186 187 } // namespace autofill 188