diff options
author | Rouslan Solomakhin <rouslan@chromium.org> | 2013-11-19 19:40:14 +0000 |
---|---|---|
committer | Fredrik Roubert <roubert@google.com> | 2014-09-01 19:20:39 +0200 |
commit | 4870f4360052023174d191bf30a8f5920dd197db (patch) | |
tree | bb7cbb36fd15ddd81f28b8358bab564d3ba3df64 /cpp/src/address_ui.cc | |
parent | 9828d31cefd342a5b0738eff8052b54941813354 (diff) | |
download | src-4870f4360052023174d191bf30a8f5920dd197db.tar.gz |
[cpp] Address UI.
This patch is part of a series of patches that enable showing an address
input form. This patch adds a function to build a list of
AddressUiComponents for a region code.
Diffstat (limited to 'cpp/src/address_ui.cc')
-rw-r--r-- | cpp/src/address_ui.cc | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/cpp/src/address_ui.cc b/cpp/src/address_ui.cc new file mode 100644 index 0000000..2867dae --- /dev/null +++ b/cpp/src/address_ui.cc @@ -0,0 +1,131 @@ +// Copyright (C) 2013 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include <libaddressinput/address_ui.h> + +#include <libaddressinput/address_field.h> +#include <libaddressinput/address_ui_component.h> +#include <libaddressinput/localization.h> + +#include <string> +#include <vector> + +#include "address_field_util.h" +#include "grit.h" +#include "messages.h" +#include "region_data_constants.h" +#include "rule.h" + +namespace i18n { +namespace addressinput { + +namespace { + +// Parses the default region data into the static Rule object and returns a +// constant reference to this object. Cannot return a copy of the object, +// because Rule objects are not copyable. +const Rule& InitDefaultRule() { + static Rule rule; + rule.ParseSerializedRule(RegionDataConstants::GetDefaultRegionData()); + return rule; +} + +// Returns the constant reference to the Rule object from InitDefaultRule(). The +// static object is in InitDefaultRule(), but this function maintains a constant +// static reference to it. The constant static reference avoids re-parsing the +// default region data. +const Rule& GetDefaultRule() { + static const Rule& kDefaultRule(InitDefaultRule()); + return kDefaultRule; +} + +int GetMessageIdForField(AddressField field, + int admin_area_name_message_id, + int postal_code_name_message_id) { + switch (field) { + case COUNTRY: + return IDS_LIBADDRESSINPUT_I18N_COUNTRY_LABEL; + case ADMIN_AREA: + return admin_area_name_message_id; + case LOCALITY: + return IDS_LIBADDRESSINPUT_I18N_LOCALITY_LABEL; + case DEPENDENT_LOCALITY: + return IDS_LIBADDRESSINPUT_I18N_DEPENDENT_LOCALITY_LABEL; + case SORTING_CODE: + return IDS_LIBADDRESSINPUT_I18N_CEDEX_LABEL; + case POSTAL_CODE: + return postal_code_name_message_id; + case STREET_ADDRESS: + return IDS_LIBADDRESSINPUT_I18N_ADDRESS_LINE1_LABEL; + case ORGANIZATION: + return IDS_LIBADDRESSINPUT_I18N_ORGANIZATION_LABEL; + case RECIPIENT: + return IDS_LIBADDRESSINPUT_I18N_RECIPIENT_LABEL; + default: + return INVALID_MESSAGE_ID; + } +} + +bool IsNewline(AddressField field) { + // NEWLINE is an extension for AddressField enum that's used only internally. + return field == static_cast<AddressField>(NEWLINE); +} + +} // namespace + +const std::vector<std::string>& GetRegionCodes() { + return RegionDataConstants::GetRegionCodes(); +} + +std::vector<AddressUiComponent> BuildComponents( + const std::string& region_code, + const Localization& localization) { + std::vector<AddressUiComponent> result; + + Rule rule; + rule.CopyFrom(GetDefaultRule()); + if (!rule.ParseSerializedRule( + RegionDataConstants::GetRegionData(region_code))) { + return result; + } + + bool previous_field_is_newline = true; + bool next_field_is_newline = true; + for (std::vector<AddressField>::const_iterator field_it = + rule.GetFormat().begin(); + field_it != rule.GetFormat().end(); ++field_it) { + if (IsNewline(*field_it)) { + previous_field_is_newline = true; + continue; + } + AddressUiComponent component; + std::vector<AddressField>::const_iterator next_field_it = field_it + 1; + next_field_is_newline = + next_field_it == rule.GetFormat().end() || IsNewline(*next_field_it); + component.length_hint = previous_field_is_newline && next_field_is_newline + ? AddressUiComponent::HINT_LONG + : AddressUiComponent::HINT_SHORT; + previous_field_is_newline = false; + component.field = *field_it; + component.name = localization.GetString( + GetMessageIdForField(*field_it, rule.GetAdminAreaNameMessageId(), + rule.GetPostalCodeNameMessageId())); + result.push_back(component); + } + + return result; +} + +} // namespace addressinput +} // namespace i18n |