📄 encbrowser.cpp
字号:
/* GHelm - Nautical Navigation Software * Copyright (C) 2004 Jon Michaelchuck * * This application is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. * * This software 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 this software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */#include "iso8211lib/iso8211.h"#include "encbrowser.h"#include "util.h"/** * Constructor */ENCBrowser::ENCBrowser(){}/** * Destructor */ENCBrowser::~ENCBrowser(){}/** * Initialize browser. * @param configuration Configuration to use * @return -1 on failure, 0 on success. */int ENCBrowser::Init(Configuration &configuration){ set_default_size(700, 400); catalog_path = configuration.catalog; DDFModule ddf; // ddf returns 0 on fail if (ddf.Open(catalog_path.string().c_str()) == 0) { std::cerr << "(): Failed loading catalog file " << catalog_path.string() << std::endl; ddf.Close(); return -1; } list_store = Gtk::ListStore::create(model_columns); tree_view.set_model(list_store); tree_view.append_column("Description", model_columns.description); tree_view.append_column("Filename", model_columns.filename); DDFRecord *record; while ((record = ddf.ReadRecord()) != NULL) { signal_progress.emit(); int field_count = record->GetFieldCount(); if (field_count != 2) { std::cerr << "ENCBrowser::Run(): Bad field count" << std::endl; ddf.Close(); return -1; } DDFField *field = record->GetField(1); if (!field) { std::cerr << "ENCBrowser::Run(): Error getting field" << std::endl; ddf.Close(); return -1; } int bytes_remaining; int bytes_consumed; const char *field_data; const char *field_name; DDFFieldDefn *field_defn; DDFSubfieldDefn *subfield_defn; field_defn = field->GetFieldDefn(); field_name = field_defn->GetName(); field_data = field->GetData(); bytes_remaining = field->GetDataSize(); if (strncmp(field_name, "CATD", 4) != 0) { std::cerr << "ENCBrowser::Run(): Bad field name" << std::endl; ddf.Close(); return -1; } if (field_defn->GetSubfieldCount() != 12) { std::cerr << "ENCBrowser::Run(): Bad subfield count" << std::endl; ddf.Close(); return -1; } // skip rcnm subfield_defn = field_defn->GetSubfield(0); subfield_defn->ExtractStringData(field_data, bytes_remaining, &bytes_consumed); bytes_remaining -= bytes_consumed; field_data += bytes_consumed; // skip rcid subfield_defn = field_defn->GetSubfield(1); subfield_defn->ExtractIntData(field_data, bytes_remaining, &bytes_consumed); bytes_remaining -= bytes_consumed; field_data += bytes_consumed; // filename std::string filename; subfield_defn = field_defn->GetSubfield(2); filename = subfield_defn->ExtractStringData(field_data, bytes_remaining, &bytes_consumed); bytes_remaining -= bytes_consumed; field_data += bytes_consumed; boost::filesystem::path filepath = decompose_win32_path(filename); std::string extension = boost::filesystem::extension(filepath); if ((extension != ".TXT") && (filepath.string().size() > 0)) { boost::filesystem::path fullpath = catalog_path.branch_path() / filepath; if (is_chart(fullpath.string().c_str())) { // description std::string description; subfield_defn = field_defn->GetSubfield(3); description = subfield_defn->ExtractStringData(field_data, bytes_remaining, &bytes_consumed); bytes_remaining -= bytes_consumed; field_data += bytes_consumed; // skip stuff to get to long/lat range for (int i = 4; i < 6; i++) { subfield_defn = field_defn->GetSubfield(i); subfield_defn->ExtractStringData(field_data, bytes_remaining, &bytes_consumed); bytes_remaining -= bytes_consumed; field_data += bytes_consumed; } float slat, wlon, nlat, elon; subfield_defn = field_defn->GetSubfield(6); slat = subfield_defn->ExtractFloatData(field_data, bytes_remaining, &bytes_consumed); bytes_remaining -= bytes_consumed; field_data += bytes_consumed; subfield_defn = field_defn->GetSubfield(7); wlon = subfield_defn->ExtractFloatData(field_data, bytes_remaining, &bytes_consumed); bytes_remaining -= bytes_consumed; field_data += bytes_consumed; subfield_defn = field_defn->GetSubfield(8); nlat = subfield_defn->ExtractFloatData(field_data, bytes_remaining, &bytes_consumed); bytes_remaining -= bytes_consumed; field_data += bytes_consumed; subfield_defn = field_defn->GetSubfield(9); elon = subfield_defn->ExtractFloatData(field_data, bytes_remaining, &bytes_consumed); bytes_remaining -= bytes_consumed; Gtk::TreeModel::Row row = *(list_store->append()); filename = filepath.string(); row[model_columns.filename] = filename; row[model_columns.description] = description; row[model_columns.slat] = slat * 60; row[model_columns.wlon] = wlon * 60; row[model_columns.nlat] = nlat * 60; row[model_columns.elon] = elon * 60; } } } ddf.Close(); Gtk::ScrolledWindow *scrolled_window = manage(new Gtk::ScrolledWindow()); scrolled_window->add(tree_view); scrolled_window->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); get_vbox()->add(*scrolled_window); add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK); set_title("Please choose a chart"); return 0;}/** * Get the filename of the selected row * @return filename */boost::filesystem::path ENCBrowser::GetSelectedFilepath(){ Glib::RefPtr<Gtk::TreeView::Selection> selection = tree_view.get_selection(); Gtk::TreeModel::const_iterator it = selection->get_selected(); if (it) { Gtk::TreeModel::Row row = *it; Glib::ustring filename = row[model_columns.filename]; boost::filesystem::path filepath = catalog_path.branch_path(); filepath = filepath / filename.c_str(); return filepath; } else { std::cerr << "ENCBrowser::GetSelectedFilepath(): Nothing selected" << std::endl; return boost::filesystem::path(""); }}/** * Get description of the selected row * @return description string */Glib::ustring ENCBrowser::GetSelectedDescription(){ Glib::RefPtr<Gtk::TreeView::Selection> selection = tree_view.get_selection(); Gtk::TreeModel::iterator it = selection->get_selected(); if (it) { Gtk::TreeModel::Row row = *it; return row[model_columns.description]; } else { std::cerr << "ENCBrowser::GetSelectedDescription(): Nothing selected" << std::endl; return ""; }}/** * Get dimension of selected row * @param which which dimension to get (SLAT, WLON, NLAT or ELON) * @return dimension */float ENCBrowser::GetSelectedDimension(int which){ Glib::RefPtr<Gtk::TreeView::Selection> selection = tree_view.get_selection(); Gtk::TreeModel::iterator it = selection->get_selected(); if (it) { Gtk::TreeModel::Row row = *it; switch (which) { case SLAT: return row[model_columns.slat]; break; case WLON: return row[model_columns.wlon]; break; case NLAT: return row[model_columns.nlat]; break; case ELON: return row[model_columns.elon]; break; default: break; } } else { std::cerr << "ENCBrowser::GetSelectedDimensions(): Nothing selected" << std::endl; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -