/*
* vim: softtabstop=4 shiftwidth=4 cindent foldmethod=marker expandtab
*
* $LastChangedDate$
* $Revision$
* $LastChangedBy$
* $URL$
*
* Copyright 2009-2011 Eric Connell
*
* This file is part of Mangler.
*
* Mangler is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Mangler 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Mangler. If not, see .
*/
#include "mangler.h"
#include "manglerserverlist.h"
#include "manglersettings.h"
#include "manglercharset.h"
ManglerServerList::ManglerServerList(Glib::RefPtr builder) {
serverListTreeModel = Gtk::ListStore::create(serverListColumns);
builder->get_widget("serverListWindow", serverListWindow);
serverListWindow->signal_hide().connect(sigc::mem_fun(this, &ManglerServerList::serverListWindow_hide_cb));
builder->get_widget("serverListView", serverListView);
serverListView->set_model(serverListTreeModel);
serverListView->append_column("Name", serverListColumns.name);
serverListView->get_column(0)->set_sort_column(serverListColumns.name);
serverListView->append_column("Username", serverListColumns.username);
serverListView->get_column(1)->set_sort_column(serverListColumns.username);
serverListView->append_column("Hostname", serverListColumns.hostname);
serverListView->get_column(2)->set_sort_column(serverListColumns.hostname);
serverListView->append_column("Port", serverListColumns.port);
serverListView->get_column(3)->set_sort_column(serverListColumns.port);
serverListSelection = serverListView->get_selection();
serverListSelection->signal_changed().connect(sigc::mem_fun(this, &ManglerServerList::serverListSelection_changed_cb));
builder->get_widget("serverListAddButton", serverListServerAddButton);
serverListServerAddButton->signal_clicked().connect(sigc::mem_fun(this, &ManglerServerList::serverListAddButton_clicked_cb));
builder->get_widget("serverListRemoveButton", serverListServerRemoveButton);
serverListServerRemoveButton->signal_clicked().connect(sigc::mem_fun(this, &ManglerServerList::serverListRemoveButton_clicked_cb));
builder->get_widget("serverListCloneButton", serverListServerCloneButton);
serverListServerCloneButton->signal_clicked().connect(sigc::mem_fun(this, &ManglerServerList::serverListCloneButton_clicked_cb));
builder->get_widget("serverListCloseButton", button);
button->signal_clicked().connect(sigc::mem_fun(this, &ManglerServerList::serverListCloseButton_clicked_cb));
builder->get_widget("serverListServerUpdateButton", serverListServerUpdateButton);
serverListServerUpdateButton->signal_clicked().connect(sigc::mem_fun(this, &ManglerServerList::serverListServerUpdateButton_clicked_cb));
builder->get_widget("serverListServerTable", serverListServerTable);
builder->get_widget("serverListUserTable", serverListUserTable);
builder->get_widget("serverListOptionsTable", serverListOptionsTable);
builder->get_widget("serverListServerNameEntry", serverListServerNameEntry);
builder->get_widget("serverListHostnameEntry", serverListHostnameEntry);
builder->get_widget("serverListPortEntry", serverListPortEntry);
builder->get_widget("serverListDefaultChannelEntry", serverListDefaultChannelEntry);
builder->get_widget("serverListUsernameEntry", serverListUsernameEntry);
builder->get_widget("serverListPasswordEntry", serverListPasswordEntry);
builder->get_widget("serverListPhoneticEntry", serverListPhoneticEntry);
builder->get_widget("serverListCommentEntry", serverListCommentEntry);
// CheckButton fields
builder->get_widget("serverListPageCheckButton", serverListPageCheckButton);
builder->get_widget("serverListUtUCheckButton", serverListUtUCheckButton);
builder->get_widget("serverListPrivateChatCheckButton", serverListPrivateChatCheckButton);
builder->get_widget("serverListRecordCheckButton", serverListRecordCheckButton);
builder->get_widget("serverListPersistentConnectionCheckButton", serverListPersistentConnectionCheckButton);
builder->get_widget("serverListPersistentCommentsCheckButton", serverListPersistentCommentsCheckButton);
// Charset combobox
builder->get_widget("serverListCharsetComboBox", serverListCharsetComboBox);
charsetTreeModel = Gtk::ListStore::create(charsetColumns);
serverListCharsetComboBox->set_model(charsetTreeModel);
serverListCharsetComboBox->set_text_column(charsetColumns.name);
for (int ctr = 0; charsetslist[ctr] != NULL; ctr++) {
Gtk::TreeModel::Row charsetRow = *(charsetTreeModel->append());
charsetRow[charsetColumns.name] = charsetslist[ctr];
}
serverListCharsetComboBox->get_entry()->set_text("");
editorName = "";
}
void ManglerServerList::serverListWindow_hide_cb(void) {
clearEntries();
}
void ManglerServerList::serverListSelection_changed_cb(void) {
Gtk::TreeModel::iterator iter = serverListSelection->get_selected();
if (iter) {
Gtk::TreeModel::Row row = *iter;
editorName = Glib::locale_from_utf8(row[serverListColumns.name]);
editRow(editorName);
serverListServerAddButton->set_sensitive(true);
serverListServerRemoveButton->set_sensitive(true);
serverListServerCloneButton->set_sensitive(true);
} else {
serverListServerRemoveButton->set_sensitive(false);
serverListServerCloneButton->set_sensitive(false);
}
}
void ManglerServerList::serverListRemoveButton_clicked_cb(void) {
Gtk::TreeModel::iterator iter = serverListSelection->get_selected();
if (!iter) {
return;
}
Gtk::TreeModel::Row row = *iter;
Glib::ustring name = row[serverListColumns.name];
Mangler::config.servers.erase(name);
Mangler::config.servers.save();
serverListTreeModel->erase(row);
editorName = "";
clearEntries();
queue_resize();
}
void ManglerServerList::serverListCloneButton_clicked_cb(void) {
Gtk::TreeModel::iterator curIter = serverListSelection->get_selected();
if (!curIter) {
return; // should never happen
}
serverListServerAddButton->set_sensitive(false);
Glib::ustring server_name = (*curIter)[serverListColumns.name];
editorName = "";
editRow(server_name);
}
void ManglerServerList::clearEntries(void) {
serverListSelection->unselect_all();
serverListServerNameEntry->set_text("");
serverListHostnameEntry->set_text("");
serverListPortEntry->set_text("");
serverListDefaultChannelEntry->set_text("");
serverListUsernameEntry->set_text("");
serverListPasswordEntry->set_text("");
serverListPhoneticEntry->set_text("");
serverListCommentEntry->set_text("");
serverListPageCheckButton->set_active(false);
serverListUtUCheckButton->set_active(false);
serverListPrivateChatCheckButton->set_active(false);
serverListRecordCheckButton->set_active(false);
serverListPersistentConnectionCheckButton->set_active(false);
serverListPersistentCommentsCheckButton->set_active(false);
serverListCharsetComboBox->get_entry()->set_text("");
serverListServerTable->set_sensitive(false);
serverListUserTable->set_sensitive(false);
serverListOptionsTable->set_sensitive(false);
serverListServerUpdateButton->set_sensitive(false);
serverListServerAddButton->set_sensitive(true);
serverListServerRemoveButton->set_sensitive(false);
serverListServerCloneButton->set_sensitive(false);
}
void ManglerServerList::queue_resize(void) {
for (int ctr = 0, cnt = serverListView->get_columns().size(); ctr < cnt; ctr++) {
serverListView->get_column(ctr)->queue_resize();
}
}
void ManglerServerList::serverListAddButton_clicked_cb(void) {
serverListServerAddButton->set_sensitive(false);
editorName = "";
editRow("");
}
void ManglerServerList::serverListCloseButton_clicked_cb(void) {
serverListWindow->hide();
}
void ManglerServerList::serverListServerUpdateButton_clicked_cb(void) {
saveRow();
}
void ManglerServerList::editRow(const std::string &name) {
if (editorName.empty()) {
serverListSelection->unselect_all();
}
serverListServerTable->set_sensitive(true);
serverListUserTable->set_sensitive(true);
serverListOptionsTable->set_sensitive(true);
serverListServerUpdateButton->set_sensitive(true);
serverListServerCloneButton->set_sensitive(! editorName.empty());
serverListServerRemoveButton->set_sensitive(! editorName.empty());
serverListServerNameEntry->grab_focus();
iniSection server;
if (name.length()) {
server = Mangler::config.servers[name];
}
serverListServerNameEntry->set_text(name);
serverListHostnameEntry->set_text(server["Hostname"].toUString());
serverListPortEntry->set_text(server["Port"].toUString());
serverListDefaultChannelEntry->set_text(server["DefaultChannel"].toUString());
serverListUsernameEntry->set_text(server["Username"].toUString());
serverListPasswordEntry->set_text(server["Password"].toUString());
serverListPhoneticEntry->set_text(server["Phonetic"].toUString());
serverListCommentEntry->set_text(server["Comment"].toUString());
serverListPageCheckButton->set_active(
server["AcceptPages"].length() ?
server["AcceptPages"].toBool() : true);
serverListUtUCheckButton->set_active(
server["AcceptU2U"].length() ?
server["AcceptU2U"].toBool() : true);
serverListPrivateChatCheckButton->set_active(
server["AcceptPrivateChat"].length() ?
server["AcceptPrivateChat"].toBool() : true);
serverListRecordCheckButton->set_active(
server["AllowRecording"].length() ?
server["AllowRecording"].toBool() : true);
serverListPersistentConnectionCheckButton->set_active(
server["PersistentConnection"].length() ?
server["PersistentConnection"].toBool() : true);
serverListPersistentCommentsCheckButton->set_active(
server["PersistentComments"].length() ?
server["PersistentComments"].toBool() : true);
std::string server_charset = server["Charset"].toString();
if (server_charset.empty()) {
server_charset = charsetslist[0];
}
serverListCharsetComboBox->get_entry()->set_text(server_charset);
}
void ManglerServerList::saveRow() {
Glib::ustring charset;
Gtk::TreeModel::iterator curIter = serverListSelection->get_selected();
if (editorName.length() && !curIter) {
return; // should never happen
}
Glib::ustring server_name = trim(serverListServerNameEntry->get_text());
if (server_name.empty()) {
mangler->errorDialog("Cannot save server without a name.");
return;
}
// check for duplicate
Gtk::TreeModel::Children::iterator ckIter = serverListTreeModel->children().begin();
while (ckIter != serverListTreeModel->children().end()) {
if ((editorName.empty() || ckIter != curIter) && (*ckIter)[serverListColumns.name] == server_name) {
mangler->errorDialog("Server names must be unique.");
return;
}
ckIter++;
}
// if name changed, remove old section first
if (editorName.length() && server_name != editorName) {
Mangler::config.servers.erase(editorName);
}
// save to config
iniSection &server( Mangler::config.servers[server_name] );
server["Hostname"] = trim(serverListHostnameEntry->get_text());
server["Port"] = trim(serverListPortEntry->get_text());
server["DefaultChannel"] = trim(serverListDefaultChannelEntry->get_text());
server["Username"] = trim(serverListUsernameEntry->get_text());
server["Password"] = trim(serverListPasswordEntry->get_text());
server["Phonetic"] = trim(serverListPhoneticEntry->get_text());
server["Comment"] = trim(serverListCommentEntry->get_text());
server["AcceptPages"] = serverListPageCheckButton->get_active();
server["AcceptU2U"] = serverListUtUCheckButton->get_active();
server["AcceptPrivateChat"] = serverListPrivateChatCheckButton->get_active();
server["AllowRecording"] = serverListRecordCheckButton->get_active();
server["PersistentConnection"] = serverListPersistentConnectionCheckButton->get_active();
server["PersistentComments"] = serverListPersistentCommentsCheckButton->get_active();
server["Charset"] = serverListCharsetComboBox->get_active_text();
Gtk::TreeModel::Row row = (editorName.empty()) ? *(serverListTreeModel->append()) : *curIter;
row[serverListColumns.name] = server_name;
row[serverListColumns.hostname] = server["Hostname"].toUString();
row[serverListColumns.port] = server["Port"].toUString();
row[serverListColumns.username] = server["Username"].toUString();
queue_resize();
if (editorName.empty()) {
serverListView->set_cursor(serverListTreeModel->get_path(row));
}
editorName = server_name;
Mangler::config.servers.save();
}
Glib::ustring ManglerServerList::trim(Glib::ustring const& orig) {
char const blankChars[] = " \t\n\r";
Glib::ustring::size_type const first = orig.find_first_not_of(blankChars);
return ( first==Glib::ustring::npos )
? Glib::ustring()
: orig.substr(first, orig.find_last_not_of(blankChars)-first+1);
}