glom r1791 - in trunk: . glom
- From: murrayc svn gnome org
- To: svn-commits-list gnome org
- Subject: glom r1791 - in trunk: . glom
- Date: Tue, 9 Dec 2008 18:15:23 +0000 (UTC)
Author: murrayc
Date: Tue Dec 9 18:15:23 2008
New Revision: 1791
URL: http://svn.gnome.org/viewvc/glom?rev=1791&view=rev
Log:
2008-12-09 Murray Cumming <murrayc murrayc com>
* glom/dialog_import_csv.[h|cc]:
validate_primary_key(): Avoid a null pointer dereference (crash) if
there is no primary key, though that should never happen now.
handle_line(), import(): Use a sorted tree model so the fields list is
alphabetically sorted.
Ubuntu bug #https://bugs.launchpad.net/ubuntu/+source/glom/+bug/306593
(elmergato)
Modified:
trunk/ChangeLog
trunk/glom/dialog_import_csv.cc
trunk/glom/dialog_import_csv.h
Modified: trunk/glom/dialog_import_csv.cc
==============================================================================
--- trunk/glom/dialog_import_csv.cc (original)
+++ trunk/glom/dialog_import_csv.cc Tue Dec 9 18:15:23 2008
@@ -321,7 +321,7 @@
Gtk::TreeModel::iterator tree_iter = m_field_model->append();
(*tree_iter)[m_field_columns.m_col_field_name] = _("<None>");
- Document_Glom::type_vecFields fields(document->get_table_fields(into_table));
+ const Document_Glom::type_vecFields fields(document->get_table_fields(into_table));
for(Document_Glom::type_vecFields::const_iterator iter = fields.begin(); iter != fields.end(); ++ iter)
{
sharedptr<Field> field = *iter;
@@ -339,6 +339,12 @@
}
}
+ // Create the sorted version of this model,
+ // so the user sees the fields in alphabetical order:
+ m_field_model_sorted = Gtk::TreeModelSort::create(m_field_model);
+ m_field_model_sorted->set_sort_column(m_field_columns.m_col_field_name, Gtk::SORT_ASCENDING);
+
+
m_file = Gio::File::create_for_uri(uri);
m_file->read_async(sigc::mem_fun(*this, &Dialog_Import_CSV::on_file_read));
@@ -383,6 +389,7 @@
m_sample_view->remove_all_columns();
m_sample_view->set_model(m_sample_model);
m_field_model.reset();
+ m_field_model_sorted.reset();
m_rows.clear();
m_fields.clear();
m_file.reset();
@@ -831,7 +838,7 @@
col->pack_start(*cell, true);
col->set_cell_data_func(*cell, sigc::bind(sigc::mem_fun(*this, &Dialog_Import_CSV::field_data_func), i));
col->set_sizing(Gtk::TREE_VIEW_COLUMN_AUTOSIZE);
- cell->property_model() = m_field_model;
+ cell->property_model() = m_field_model_sorted;
cell->property_text_column() = 0;
cell->property_has_entry() = false;
cell->signal_edited().connect(sigc::bind(sigc::mem_fun(*this, &Dialog_Import_CSV::on_field_edited), i));
@@ -874,7 +881,7 @@
void Dialog_Import_CSV::field_data_func(Gtk::CellRenderer* renderer, const Gtk::TreeModel::iterator& iter, guint column_number)
{
- int row = (*iter)[m_sample_columns.m_col_row];
+ const int row = (*iter)[m_sample_columns.m_col_row];
Gtk::CellRendererCombo* renderer_combo = dynamic_cast<Gtk::CellRendererCombo*>(renderer);
if(!renderer_combo) throw std::logic_error("CellRenderer is not a CellRendererCombo in field_data_func");
@@ -905,8 +912,10 @@
/* Exported data is always stored in postgres format */
Gnome::Gda::Value value = field->from_sql(orig_text, Field::SQL_FORMAT_POSTGRES, success);
- if(!success) text = _("<Import Failure>");
- else text = Glom::Conversions::get_text_for_gda_value(field->get_glom_type(), value);
+ if(!success)
+ text = _("<Import Failure>");
+ else
+ text = Glom::Conversions::get_text_for_gda_value(field->get_glom_type(), value);
}
else
{
@@ -947,7 +956,7 @@
{
sharedptr<Field> field = (*field_iter)[m_field_columns.m_col_field];
// Check whether another column is already using that field
- std::vector<sharedptr<Field> >::iterator vec_field_iter = std::find(m_fields.begin(), m_fields.end(), field);
+ type_vec_fields::iterator vec_field_iter = std::find(m_fields.begin(), m_fields.end(), field);
// Reset the old column since two different columns cannot be imported into the same field
if(vec_field_iter != m_fields.end()) *vec_field_iter = sharedptr<Field>();
@@ -995,7 +1004,7 @@
sharedptr<Field> primary_key = get_field_primary_key_for_table(get_target_table_name());
bool primary_key_selected = false;
- if(!primary_key->get_auto_increment())
+ if(primary_key && !primary_key->get_auto_increment())
{
// If m_rows is empty, then no single line was read from the file yet,
// and the m_fields array is not up to date. It is set in handle_line()
@@ -1003,7 +1012,7 @@
primary_key_selected = false;
if(!m_rows.empty())
{
- for(std::vector<sharedptr<Field> >::iterator iter = m_fields.begin(); iter != m_fields.end(); ++ iter)
+ for(type_vec_fields::iterator iter = m_fields.begin(); iter != m_fields.end(); ++ iter)
{
if(*iter == primary_key)
{
Modified: trunk/glom/dialog_import_csv.h
==============================================================================
--- trunk/glom/dialog_import_csv.h (original)
+++ trunk/glom/dialog_import_csv.h Tue Dec 9 18:15:23 2008
@@ -127,6 +127,7 @@
FieldColumns m_field_columns;
Glib::RefPtr<Gtk::ListStore> m_field_model;
+ Glib::RefPtr<Gtk::TreeModelSort> m_field_model_sorted;
SampleColumns m_sample_columns;
Glib::RefPtr<Gtk::ListStore> m_sample_model;
@@ -176,8 +177,10 @@
// Parsed data:
std::vector<std::vector<Glib::ustring> > m_rows;
+
// The fields into which to import the data:
- std::vector<sharedptr<Field> > m_fields;
+ typedef std::vector< sharedptr<Field> > type_vec_fields;
+ type_vec_fields m_fields;
SignalStateChanged m_signal_state_changed;
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]