phoenix-firestorm/indra/newview/llautocorrectfloater.cpp

379 lines
11 KiB
C++

/**
* @file llautocorrectfloater.cpp
* @brief Auto Correct List floater
* @copyright Copyright (c) 2011 LordGregGreg Back
*
* 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; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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
*/
#include "llviewerprecompiledheaders.h"
#include "llautocorrectfloater.h"
#include "llagentdata.h"
#include "llcommandhandler.h"
#include "llfloater.h"
#include "lluictrlfactory.h"
#include "llagent.h"
#include "llpanel.h"
#include "llbutton.h"
#include "llcolorswatch.h"
#include "llcombobox.h"
#include "llview.h"
#include "llhttpclient.h"
#include "llbufferstream.h"
#include "llcheckboxctrl.h"
#include "llviewercontrol.h"
#include "llui.h"
#include "llcontrol.h"
#include "llscrollingpanellist.h"
#include "llautocorrect.h"
#include "llfilepicker.h"
#include "llfile.h"
#include "llsdserialize.h"
//#include "llfloaterchat.h"
#include "llchat.h"
#include "llinventorymodel.h"
#include "llhost.h"
#include "llassetstorage.h"
#include "roles_constants.h"
#include "llviewertexteditor.h"
#include <boost/tokenizer.hpp>
#include <iosfwd>
#include "llfloaterreg.h"
#include "llinspecttoast.h"
#include "llnotificationhandler.h"
#include "llnotificationmanager.h"
AutoCorrectFloater::AutoCorrectFloater(const LLSD& key) :
LLFloater(key)
{
}
void AutoCorrectFloater::onClose(bool app_quitting)
{
destroy();
}
BOOL AutoCorrectFloater::postBuild(void)
{
namesList = getChild<LLScrollListCtrl>("ac_list_name");
entryList = getChild<LLScrollListCtrl>("ac_list_entry");
childSetCommitCallback("ac_enable",onBoxCommitEnabled,this);
childSetCommitCallback("ac_list_enabled",onEntrySettingChange,this);
childSetCommitCallback("ac_list_show",onEntrySettingChange,this);
childSetCommitCallback("ac_list_style",onEntrySettingChange,this);
childSetCommitCallback("ac_priority",onEntrySettingChange,this);
updateEnabledStuff();
updateNamesList();
namesList->setCommitOnSelectionChange(TRUE);
childSetCommitCallback("ac_list_name", onSelectName, this);
childSetAction("ac_deletelist",removeList,this);
childSetAction("ac_rementry",deleteEntry,this);
childSetAction("ac_exportlist",exportList,this);
childSetAction("ac_addentry",addEntry,this);
childSetAction("ac_loadlist",loadList,this);
return true;
}
void AutoCorrectFloater::onSelectName(LLUICtrl* ctrl, void* user_data)
{
if ( user_data )
{
AutoCorrectFloater* self = ( AutoCorrectFloater* )user_data;
if ( self )
self->updateItemsList();
}
}
void AutoCorrectFloater::updateItemsList()
{
entryList->deleteAllItems();
if((namesList->getAllSelected().size())<=0)
{
updateListControlsEnabled(FALSE);
return;
}
updateListControlsEnabled(TRUE);
std::string listName= namesList->getFirstSelected()->getColumn(0)->getValue().asString();
LLSD listData = AutoCorrect::getInstance()->getAutoCorrectEntries(listName);
childSetValue("ac_list_enabled",listData["enabled"].asBoolean());
childSetValue("ac_list_style",listData["wordStyle"].asBoolean());
childSetValue("ac_list_show",listData["announce"].asBoolean());
childSetValue("ac_text_name",listName);
childSetValue("ac_text_author",listData["author"]);
childSetValue("ac_priority",listData["priority"]);
LLSD autoCorrects = listData["data"];
LLSD::map_const_iterator loc_it = autoCorrects.beginMap();
LLSD::map_const_iterator loc_end = autoCorrects.endMap();
for ( ; loc_it != loc_end; ++loc_it)
{
const std::string& wrong = (*loc_it).first;
const std::string& right = (*loc_it).second;
//std::string lentry(wrong+"=>"+right);
LLSD element;
element["id"] = wrong;
LLSD& s_column = element["columns"][0];
s_column["column"] = "Search";
s_column["value"] = wrong;
s_column["font"] = "SANSSERIF";
LLSD& r_column = element["columns"][1];
r_column["column"] = "Replace";
r_column["value"] = right;
r_column["font"] = "SANSSERIF";
entryList->addElement(element, ADD_BOTTOM);
}
}
void AutoCorrectFloater::updateNamesList()
{
namesList->deleteAllItems();
if(!gSavedSettings.getBOOL("AutoCorrect"))
{
updateItemsList();
return;
}
LLSD autoCorrects = AutoCorrect::getInstance()->getAutoCorrects();
LLSD::map_const_iterator loc_it = autoCorrects.beginMap();
LLSD::map_const_iterator loc_end = autoCorrects.endMap();
for ( ; loc_it != loc_end; ++loc_it)
{
const std::string& listName = (*loc_it).first;
LLSD element;
element["id"] = listName;
LLSD& friend_column = element["columns"][0];
friend_column["column"] = "Entries";
friend_column["value"] = listName;
//friend_column["font"] = "SANSSERIF";
const LLSD& loc_map = (*loc_it).second;
if(loc_map["enabled"].asBoolean())
friend_column["font"] = "SANSSERIF";
//friend_column["style"] = "BOLD";
else
friend_column["font"] = "SANSSERIF_SMALL";
//friend_column["style"] = "NORMAL";
if(namesList)
namesList->addElement(element, ADD_BOTTOM);
}
updateItemsList();
}
void AutoCorrectFloater::updateListControlsEnabled(BOOL selected)
{
childSetEnabled("ac_text1",selected);
childSetEnabled("ac_text2",selected);
childSetEnabled("ac_text_name",selected);
childSetEnabled("ac_text_author",selected);
childSetEnabled("ac_list_enabled",selected);
childSetEnabled("ac_list_show",selected);
childSetEnabled("ac_list_style",selected);
childSetEnabled("ac_deletelist",selected);
childSetEnabled("ac_exportlist",selected);
childSetEnabled("ac_addentry",selected);
childSetEnabled("ac_rementry",selected);
childSetEnabled("ac_priority",selected);
}
void AutoCorrectFloater::updateEnabledStuff()
{
BOOL autocorrect = gSavedSettings.getBOOL("AutoCorrect");
if(autocorrect)
{
LLCheckBoxCtrl *enBox = getChild<LLCheckBoxCtrl>("ac_enable");
enBox->setDisabledColor(LLColor4::red);
getChild<LLCheckBoxCtrl>("ac_enable")->setEnabledColor(LLColor4(1.0f,0.0f,0.0f,1.0f));
}else
{
getChild<LLCheckBoxCtrl>("ac_enable")->setEnabledColor(
LLUIColorTable::instance().getColor( "LabelTextColor" ));
}
childSetEnabled("ac_list_name", autocorrect);
childSetEnabled("ac_list_entry", autocorrect);
updateListControlsEnabled(autocorrect);
updateNamesList();
AutoCorrect::getInstance()->save();
}
void AutoCorrectFloater::setData(void * data)
{
}
void AutoCorrectFloater::onBoxCommitEnabled(LLUICtrl* caller, void* user_data)
{
if ( user_data )
{
AutoCorrectFloater* self = ( AutoCorrectFloater* )user_data;
if ( self )
{
self->updateEnabledStuff();
}
}
}
void AutoCorrectFloater::onEntrySettingChange(LLUICtrl* caller, void* user_data)
{
if ( user_data )
{
AutoCorrectFloater* self = ( AutoCorrectFloater* )user_data;
if ( self )
{
std::string listName= self->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
AutoCorrect::getInstance()->setListEnabled(listName,self->childGetValue("ac_list_enabled").asBoolean());
AutoCorrect::getInstance()->setListAnnounceeState(listName,self->childGetValue("ac_list_show").asBoolean());
AutoCorrect::getInstance()->setListStyle(listName,self->childGetValue("ac_list_style").asBoolean());
AutoCorrect::getInstance()->setListPriority(listName,self->childGetValue("ac_priority").asInteger());
//sInstance->updateEnabledStuff();
self->updateItemsList();
AutoCorrect::getInstance()->save();
}
}
}
void AutoCorrectFloater::deleteEntry(void* data)
{
if ( data )
{
AutoCorrectFloater* self = ( AutoCorrectFloater* )data;
if ( self )
{
std::string listName=self->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
if((self->entryList->getAllSelected().size())>0)
{
std::string wrong= self->entryList->getFirstSelected()->getColumn(0)->getValue().asString();
AutoCorrect::getInstance()->removeEntryFromList(wrong,listName);
self->updateItemsList();
AutoCorrect::getInstance()->save();
}
}
}
}
void AutoCorrectFloater::loadList(void* data)
{
LLFilePicker& picker = LLFilePicker::instance();
if(!picker.getOpenFile( LLFilePicker::FFLOAD_XML) )
{return;
}
llifstream file;
file.open(picker.getFirstFile().c_str());
LLSD blankllsd;
if (file.is_open())
{
LLSDSerialize::fromXMLDocument(blankllsd, file);
}
file.close();
gSavedSettings.setBOOL("AutoCorrect",true);
AutoCorrect::getInstance()->addCorrectionList(blankllsd);
if ( data )
{
AutoCorrectFloater* self = ( AutoCorrectFloater* )data;
if ( self )
self->updateEnabledStuff();
}
}
void AutoCorrectFloater::removeList(void* data)
{
if ( data )
{
AutoCorrectFloater* self = ( AutoCorrectFloater* )data;
if ( self )
{
std::string listName= self->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
AutoCorrect::getInstance()->removeCorrectionList(listName);
self->updateEnabledStuff();
}
}
}
void AutoCorrectFloater::exportList(void *data)
{
if ( data )
{
AutoCorrectFloater* self = ( AutoCorrectFloater* )data;
if ( self )
{
std::string listName=self->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
LLFilePicker& picker = LLFilePicker::instance();
if(!picker.getSaveFile( LLFilePicker::FFSAVE_XML) )
{return;
}
llofstream file;
file.open(picker.getFirstFile().c_str());
LLSDSerialize::toPrettyXML(AutoCorrect::getInstance()->exportList(listName), file);
file.close();
}
}
}
void AutoCorrectFloater::addEntry(void* data)
{
if ( data )
{
AutoCorrectFloater* self = ( AutoCorrectFloater* )data;
if ( self )
{
std::string listName= self->namesList->getFirstSelected()->getColumn(0)->getValue().asString();
LLChat chat;
chat.mText ="To add an entry, please type in chat \""+gSavedSettings.getString("CmdLineAutocorrect")+" "+listName+"|wrongWord|rightWord\"";
chat.mSourceType = CHAT_SOURCE_SYSTEM;
LLSD args;
args["type"] = LLNotificationsUI::NT_NEARBYCHAT;
LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
}
}
}
AutoCorrectFloater* AutoCorrectFloater::showFloater()
{
AutoCorrectFloater *floater = dynamic_cast<AutoCorrectFloater*>(LLFloaterReg::getInstance("autocorrect"));
if(floater)
{
floater->setVisible(true);
floater->setFrontmost(true);
floater->center();
return floater;
}
else
{
LL_WARNS("AutoCorrect") << "Can't find floater!" << LL_ENDL;
return NULL;
}
}