/** * @file llfloatertranslationsettings.cpp * @brief Machine translation settings for chat * * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2011, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" #include "llfloatertranslationsettings.h" // Viewer includes #include "llfloaterimnearbychat.h" #include "lltranslate.h" #include "llviewercontrol.h" // for gSavedSettings // Linden library includes #include "llbutton.h" #include "llcheckboxctrl.h" #include "llcombobox.h" #include "llfloaterreg.h" #include "lllineeditor.h" #include "llnotificationsutil.h" #include "llradiogroup.h" LLFloaterTranslationSettings::LLFloaterTranslationSettings(const LLSD& key) : LLFloater(key) , mMachineTranslationCB(NULL) , mLanguageCombo(NULL) , mTranslationServiceRadioGroup(NULL) , mBingAPIKeyEditor(NULL) , mGoogleAPIKeyEditor(NULL) , mBingVerifyBtn(NULL) , mGoogleVerifyBtn(NULL) , mOKBtn(NULL) , mBingKeyVerified(false) , mGoogleKeyVerified(false) { } // virtual BOOL LLFloaterTranslationSettings::postBuild() { mMachineTranslationCB = getChild("translate_chat_checkbox"); mLanguageCombo = getChild("translate_language_combo"); mTranslationServiceRadioGroup = getChild("translation_service_rg"); mBingAPIKeyEditor = getChild("bing_api_key"); mGoogleAPIKeyEditor = getChild("google_api_key"); mBingVerifyBtn = getChild("verify_bing_api_key_btn"); mGoogleVerifyBtn = getChild("verify_google_api_key_btn"); mOKBtn = getChild("ok_btn"); mMachineTranslationCB->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this)); mTranslationServiceRadioGroup->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this)); mOKBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnOK, this)); getChild("cancel_btn")->setClickedCallback(boost::bind(&LLFloater::closeFloater, this, false)); mBingVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnBingVerify, this)); mGoogleVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnGoogleVerify, this)); mBingAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1)); mBingAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onBingKeyEdited, this), NULL); mGoogleAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1)); mGoogleAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onGoogleKeyEdited, this), NULL); center(); return TRUE; } // virtual void LLFloaterTranslationSettings::onOpen(const LLSD& key) { mMachineTranslationCB->setValue(gSavedSettings.getBOOL("TranslateChat")); mLanguageCombo->setSelectedByValue(gSavedSettings.getString("TranslateLanguage"), TRUE); mTranslationServiceRadioGroup->setSelectedByValue(gSavedSettings.getString("TranslationService"), TRUE); std::string bing_key = gSavedSettings.getString("BingTranslateAPIKey"); if (!bing_key.empty()) { mBingAPIKeyEditor->setText(bing_key); mBingAPIKeyEditor->setTentative(FALSE); verifyKey(LLTranslate::SERVICE_BING, bing_key, false); } else { mBingAPIKeyEditor->setTentative(TRUE); mBingKeyVerified = FALSE; } std::string google_key = gSavedSettings.getString("GoogleTranslateAPIKey"); if (!google_key.empty()) { mGoogleAPIKeyEditor->setText(google_key); mGoogleAPIKeyEditor->setTentative(FALSE); verifyKey(LLTranslate::SERVICE_GOOGLE, google_key, false); } else { mGoogleAPIKeyEditor->setTentative(TRUE); mGoogleKeyVerified = FALSE; } updateControlsEnabledState(); } void LLFloaterTranslationSettings::setBingVerified(bool ok, bool alert) { if (alert) { showAlert(ok ? "bing_api_key_verified" : "bing_api_key_not_verified"); } mBingKeyVerified = ok; updateControlsEnabledState(); } void LLFloaterTranslationSettings::setGoogleVerified(bool ok, bool alert) { if (alert) { showAlert(ok ? "google_api_key_verified" : "google_api_key_not_verified"); } mGoogleKeyVerified = ok; updateControlsEnabledState(); } std::string LLFloaterTranslationSettings::getSelectedService() const { return mTranslationServiceRadioGroup->getSelectedValue().asString(); } std::string LLFloaterTranslationSettings::getEnteredBingKey() const { return mBingAPIKeyEditor->getTentative() ? LLStringUtil::null : mBingAPIKeyEditor->getText(); } std::string LLFloaterTranslationSettings::getEnteredGoogleKey() const { return mGoogleAPIKeyEditor->getTentative() ? LLStringUtil::null : mGoogleAPIKeyEditor->getText(); } void LLFloaterTranslationSettings::showAlert(const std::string& msg_name) const { LLSD args; args["MESSAGE"] = getString(msg_name); LLNotificationsUtil::add("GenericAlert", args); } void LLFloaterTranslationSettings::updateControlsEnabledState() { // Enable/disable controls based on the checkbox value. bool on = mMachineTranslationCB->getValue().asBoolean(); std::string service = getSelectedService(); bool bing_selected = service == "bing"; bool google_selected = service == "google"; mTranslationServiceRadioGroup->setEnabled(on); mLanguageCombo->setEnabled(on); getChild("bing_api_key_label")->setEnabled(on); mBingAPIKeyEditor->setEnabled(on); getChild("google_api_key_label")->setEnabled(on); mGoogleAPIKeyEditor->setEnabled(on); mBingAPIKeyEditor->setEnabled(on && bing_selected); mGoogleAPIKeyEditor->setEnabled(on && google_selected); mBingVerifyBtn->setEnabled(on && bing_selected && !mBingKeyVerified && !getEnteredBingKey().empty()); mGoogleVerifyBtn->setEnabled(on && google_selected && !mGoogleKeyVerified && !getEnteredGoogleKey().empty()); bool service_verified = (bing_selected && mBingKeyVerified) || (google_selected && mGoogleKeyVerified); gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified); mOKBtn->setEnabled(!on || service_verified); } /*static*/ void LLFloaterTranslationSettings::setVerificationStatus(int service, bool ok, bool alert) { LLFloaterTranslationSettings* floater = LLFloaterReg::getTypedInstance("prefs_translation"); if (!floater) { LL_WARNS() << "Cannot find translation settings floater" << LL_ENDL; return; } switch (service) { case LLTranslate::SERVICE_BING: floater->setBingVerified(ok, alert); break; case LLTranslate::SERVICE_GOOGLE: floater->setGoogleVerified(ok, alert); break; } } void LLFloaterTranslationSettings::verifyKey(int service, const std::string& key, bool alert) { LLTranslate::verifyKey(static_cast(service), key, boost::bind(&LLFloaterTranslationSettings::setVerificationStatus, _1, _2, alert)); } void LLFloaterTranslationSettings::onEditorFocused(LLFocusableElement* control) { LLLineEditor* editor = dynamic_cast(control); if (editor && editor->hasTabStop()) // if enabled. getEnabled() doesn't work { if (editor->getTentative()) { editor->setText(LLStringUtil::null); editor->setTentative(FALSE); } } } void LLFloaterTranslationSettings::onBingKeyEdited() { if (mBingAPIKeyEditor->isDirty()) { setBingVerified(false, false); } } void LLFloaterTranslationSettings::onGoogleKeyEdited() { if (mGoogleAPIKeyEditor->isDirty()) { setGoogleVerified(false, false); } } void LLFloaterTranslationSettings::onBtnBingVerify() { std::string key = getEnteredBingKey(); if (!key.empty()) { verifyKey(LLTranslate::SERVICE_BING, key); } } void LLFloaterTranslationSettings::onBtnGoogleVerify() { std::string key = getEnteredGoogleKey(); if (!key.empty()) { verifyKey(LLTranslate::SERVICE_GOOGLE, key); } } void LLFloaterTranslationSettings::onClose(bool app_quitting) { std::string service = gSavedSettings.getString("TranslationService"); bool bing_selected = service == "bing"; bool google_selected = service == "google"; bool service_verified = (bing_selected && mBingKeyVerified) || (google_selected && mGoogleKeyVerified); gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified); } void LLFloaterTranslationSettings::onBtnOK() { gSavedSettings.setBOOL("TranslateChat", mMachineTranslationCB->getValue().asBoolean()); gSavedSettings.setString("TranslateLanguage", mLanguageCombo->getSelectedValue().asString()); gSavedSettings.setString("TranslationService", getSelectedService()); gSavedSettings.setString("BingTranslateAPIKey", getEnteredBingKey()); gSavedSettings.setString("GoogleTranslateAPIKey", getEnteredGoogleKey()); (LLFloaterReg::getTypedInstance("nearby_chat"))-> showTranslationCheckbox(LLTranslate::isTranslationConfigured()); closeFloater(false); }