TocInfoDialog.cc
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:28k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*  cdrdao - write audio CD-Rs in disc-at-once mode
  2.  *
  3.  *  Copyright (C) 1998  Andreas Mueller <mueller@daneb.ping.de>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. /*
  20.  * $Log: TocInfoDialog.cc,v $
  21.  * Revision 1.1  1999/08/21 14:17:39  mueller
  22.  * Initial revision
  23.  *
  24.  */
  25. static char rcsid[] = "$Id: TocInfoDialog.cc,v 1.1 1999/08/21 14:17:39 mueller Exp mueller $";
  26. #include "TocInfoDialog.h"
  27. #include <stddef.h>
  28. #include <string.h>
  29. #include <ctype.h>
  30. #include "TocEdit.h"
  31. #include "guiUpdate.h"
  32. #include "Toc.h"
  33. #include "CdTextItem.h"
  34. #include "TextEdit.h"
  35. #define MAX_CD_TEXT_LANGUAGE_CODES 22
  36. struct LanguageCode {
  37.   int code;
  38.   const char *name;
  39. };
  40. static LanguageCode CD_TEXT_LANGUAGE_CODES[MAX_CD_TEXT_LANGUAGE_CODES] = {
  41.   { -1, "Unknown" }, 
  42.   { -1, "Undefined" },
  43.   { 0x75, "Chinese" },
  44.   { 0x06, "Czech" },
  45.   { 0x07, "Danish" },
  46.   { 0x1d, "Dutch" },
  47.   { 0x09, "English" },
  48.   { 0x27, "Finnish" },
  49.   { 0x0f, "French" },
  50.   { 0x08, "German" },
  51.   { 0x70, "Greek" },
  52.   { 0x1b, "Hungarian" },
  53.   { 0x15, "Italian" },
  54.   { 0x69, "Japanese" },
  55.   { 0x65, "Korean" },
  56.   { 0x1e, "Norwegian" },
  57.   { 0x20, "Polish" },
  58.   { 0x21, "Portuguese" },
  59.   { 0x56, "Russian" },
  60.   { 0x26, "Slovene" },
  61.   { 0x0a, "Spanish" },
  62.   { 0x28, "Swedish" }
  63. };
  64. #define MAX_CD_TEXT_GENRE_CODES 28
  65. struct GenreCode {
  66.   int code1;
  67.   int code2;
  68.   const char *name;
  69. };
  70. static GenreCode CD_TEXT_GENRE_CODES[MAX_CD_TEXT_GENRE_CODES] = {
  71.   { -1, -1, "Unknown" },
  72.   { -1, -1, "Not Used" },
  73.   { 0x00, 0x01, "Not Defined" },
  74.   { 0x00, 0x02, "Adult Contemporary" },
  75.   { 0x00, 0x03, "Alternative Rock" },
  76.   { 0x00, 0x04, "Children's Music" },
  77.   { 0x00, 0x05, "Classical" },
  78.   { 0x00, 0x07, "Country" },
  79.   { 0x00, 0x08, "Dance" },
  80.   { 0x00, 0x09, "Easy Listening" },
  81.   { 0x00, 0x0a, "Erotic" },
  82.   { 0x00, 0x0b, "Folk" },
  83.   { 0x00, 0x0c, "Gospel" },
  84.   { 0x00, 0x0d, "Hip Hop" },
  85.   { 0x00, 0x0e, "Jazz" },
  86.   { 0x00, 0x0f, "Latin" },
  87.   { 0x00, 0x10, "Musical" },
  88.   { 0x00, 0x11, "New Age" },
  89.   { 0x00, 0x12, "Opera" },
  90.   { 0x00, 0x13, "Operetta" },
  91.   { 0x00, 0x14, "Pop Music" },
  92.   { 0x00, 0x15, "RAP" },
  93.   { 0x00, 0x16, "Reggae" },
  94.   { 0x00, 0x17, "Rock Music" },
  95.   { 0x00, 0x19, "Sound Effects" },
  96.   { 0x00, 0x1a, "Sound Track" },
  97.   { 0x00, 0x1b, "Spoken Word" },
  98.   { 0x00, 0x1c, "World Music" }
  99. };
  100. TocInfoDialog::TocInfoDialog()
  101. {
  102.   int i;
  103.   Gtk_Label *label;
  104.   Gtk_HBox *hbox;
  105.   Gtk_VBox *vbox, *vbox1;
  106.   Gtk_Frame *frame;
  107.   Gtk_Table *table;
  108.   Gtk_Button *button;
  109.   Gtk_VBox *contents = new Gtk_VBox;
  110.   Toc::TocType tocType;
  111.   tocEdit_ = NULL;
  112.   active_ = 0;
  113.   selectedTocType_ = Toc::CD_DA;
  114.   nofTracks_ = new Gtk_Label(string("99"));
  115.   tocLength_ = new Gtk_Label(string("100:00:00"));
  116.   catalog_ = new TextEdit("1234567890123");
  117.   catalog_->set_max_length(13);
  118.   catalog_->lowerCase(0);
  119.   catalog_->upperCase(0);
  120.   catalog_->space(0);
  121.   catalog_->digits(1);
  122.   tocTypeMenuFactory_ = new Gtk_ItemFactory_Menu("<Main>");
  123.   tocType = Toc::CD_DA;
  124.   tocTypeMenuFactory_->create_item("/CD-DA", 0, "<Item>", ItemFactoryConnector<TocInfoDialog, Toc::TocType>(this, &TocInfoDialog::setSelectedTocType, tocType));
  125.   tocType = Toc::CD_ROM;
  126.   tocTypeMenuFactory_->create_item("/CD-ROM", 0, "<Item>", ItemFactoryConnector<TocInfoDialog, Toc::TocType>(this, &TocInfoDialog::setSelectedTocType, tocType));
  127.   tocType = Toc::CD_ROM_XA;
  128.   tocTypeMenuFactory_->create_item("/CD-ROM-XA", 0, "<Item>", ItemFactoryConnector<TocInfoDialog, Toc::TocType>(this, &TocInfoDialog::setSelectedTocType, tocType));
  129.   tocType = Toc::CD_I;
  130.   tocTypeMenuFactory_->create_item("/CD-I", 0, "<Item>", ItemFactoryConnector<TocInfoDialog, Toc::TocType>(this, &TocInfoDialog::setSelectedTocType, tocType));
  131.   tocType_ = new Gtk_OptionMenu;
  132.   tocType_->set_menu(tocTypeMenuFactory_->get_menu_widget(string("")));
  133.   contents->set_spacing(10);
  134.   // time data
  135.   frame = new Gtk_Frame(string("Summary"));
  136.   table = new Gtk_Table(2, 2, FALSE);
  137.   table->set_row_spacings(5);
  138.   table->set_col_spacings(5);
  139.   hbox = new Gtk_HBox;
  140.   hbox->pack_start(*table, FALSE, FALSE, 5);
  141.   vbox = new Gtk_VBox;
  142.   vbox->pack_start(*hbox, TRUE, TRUE, 5);
  143.   frame->add(vbox);
  144.   vbox->show();
  145.   hbox->show();
  146.   table->show();
  147.   contents->pack_start(*frame, FALSE, FALSE);
  148.   frame->show();
  149.   
  150.   label = new Gtk_Label(string("Tracks:"));
  151.   hbox = new Gtk_HBox;
  152.   hbox->pack_end(*label, FALSE, FALSE);
  153.   table->attach(*hbox, 0, 1, 0, 1);
  154.   label->show();
  155.   hbox->show();
  156.   hbox = new Gtk_HBox;
  157.   hbox->pack_start(*nofTracks_, FALSE, FALSE);
  158.   table->attach(*hbox, 1, 2, 0, 1);
  159.   nofTracks_->show();
  160.   hbox->show();
  161.   label = new Gtk_Label(string("Length:"));
  162.   hbox = new Gtk_HBox;
  163.   hbox->pack_end(*label, FALSE, FALSE);
  164.   table->attach(*hbox, 0, 1, 1, 2);
  165.   label->show();
  166.   hbox->show();
  167.   hbox = new Gtk_HBox;
  168.   hbox->pack_start(*tocLength_, FALSE, FALSE);
  169.   table->attach(*hbox, 1, 2, 1, 2);
  170.   tocLength_->show();
  171.   hbox->show();
  172.   // sub-channel data
  173.   frame = new Gtk_Frame(string("Sub-Channel"));
  174.   vbox = new Gtk_VBox;
  175.   vbox->set_spacing(0);
  176.   hbox = new Gtk_HBox;
  177.   label = new Gtk_Label(string("Toc Type: "));
  178.   hbox->pack_start(*label, FALSE);
  179.   label->show();
  180.   hbox->pack_start(*tocType_, FALSE);
  181.   tocType_->show();
  182.   vbox->pack_start(*hbox);
  183.   hbox->show();
  184.   hbox = new Gtk_HBox;
  185.   label = new Gtk_Label(string("UPC/EAN: "));
  186.   hbox->pack_start(*label, FALSE);
  187.   label->show();
  188.   hbox->pack_start(*catalog_, FALSE);
  189.   catalog_->show();
  190.   vbox->pack_start(*hbox);
  191.   hbox->show();
  192.   
  193.   vbox1 = new Gtk_VBox;
  194.   vbox1->pack_start(*vbox, TRUE, TRUE, 5);
  195.   hbox = new Gtk_HBox;
  196.   hbox->pack_start(*vbox1, TRUE, TRUE, 5);
  197.   frame->add(hbox);
  198.   vbox->show();
  199.   vbox1->show();
  200.   hbox->show();
  201.   contents->pack_start(*frame, FALSE);
  202.   frame->show();
  203.   // CD-TEXT data
  204.   frame = new Gtk_Frame(string("CD-TEXT"));
  205.   Gtk_Notebook *notebook = new Gtk_Notebook;
  206.   for (i = 0; i < 8; i++) {
  207.     vbox = createCdTextPage(i);
  208.     notebook->append_page(*vbox, *(cdTextPages_[i].label));
  209.   }
  210.   vbox1 = new Gtk_VBox;
  211.   vbox1->pack_start(*notebook, FALSE, FALSE, 5);
  212.   hbox = new Gtk_HBox;
  213.   hbox->pack_start(*vbox1, TRUE, TRUE, 5);
  214.   frame->add(hbox);
  215.   notebook->show();
  216.   vbox1->show();
  217.   hbox->show();
  218.   contents->pack_start(*frame, FALSE);
  219.   frame->show();
  220.   hbox = new Gtk_HBox;
  221.   hbox->pack_start(*contents, TRUE, TRUE, 10);
  222.   contents->show();
  223.   get_vbox()->pack_start(*hbox, TRUE, TRUE, 10);
  224.   hbox->show();
  225.   get_vbox()->show();
  226.   Gtk_HButtonBox *bbox = new Gtk_HButtonBox(GTK_BUTTONBOX_SPREAD);
  227.   applyButton_ = new Gtk_Button(string(" Apply "));
  228.   bbox->pack_start(*applyButton_);
  229.   applyButton_->show();
  230.   connect_to_method(applyButton_->clicked, this, &TocInfoDialog::applyAction);
  231.   button = new Gtk_Button(string(" Cancel "));
  232.   bbox->pack_start(*button);
  233.   button->show();
  234.   connect_to_method(button->clicked, this, &TocInfoDialog::cancelAction);
  235.   get_action_area()->pack_start(*bbox);
  236.   bbox->show();
  237.   get_action_area()->show();
  238.   set_title(string("Disk Info"));
  239. }
  240. TocInfoDialog::~TocInfoDialog()
  241. {
  242. }
  243. void TocInfoDialog::start(TocEdit *tocEdit)
  244. {
  245.   if (active_) {
  246.     get_window().raise();
  247.     return;
  248.   }
  249.   active_ = 1;
  250.   update(UPD_ALL, tocEdit);
  251.   show();
  252. }
  253. void TocInfoDialog::stop()
  254. {
  255.   if (active_) {
  256.     hide();
  257.     active_ = 0;
  258.   }
  259. }
  260. void TocInfoDialog::setSelectedTocType(Toc::TocType t)
  261. {
  262.   selectedTocType_ = t;
  263. }
  264. void TocInfoDialog::setSelectedCDTextLanguage(BlockValue val)
  265. {
  266.   int i;
  267.   int found;
  268.   if (val.block < 0 || val.block >= 8)
  269.     return;
  270.   if (val.value == 0) {
  271.     // cannot set to 'unknown', restore old setting
  272.     if (cdTextPages_[val.block].selectedLanguage != 0) 
  273.       cdTextPages_[val.block].language->set_history(cdTextPages_[val.block].selectedLanguage);
  274.     return;
  275.   }
  276.   if (val.value != 1) {
  277.     // check if same language is alread used
  278.     found = 0;
  279.     for (i = 0; i < 8; i++) {
  280.       if (i != val.block && cdTextPages_[i].selectedLanguage == val.value) {
  281. found = 1;
  282. break;
  283.       }
  284.     }
  285.     if (found ||
  286. (val.block > 0 && 
  287.  cdTextPages_[val.block - 1].selectedLanguage == 1)) {
  288.       // reset to old value if the same language is already used or
  289.       // if the language of the previous block is undefined
  290.       cdTextPages_[val.block].language->set_history(cdTextPages_[val.block].selectedLanguage);
  291.       return;
  292.     }
  293.   }
  294.     
  295.   cdTextPages_[val.block].selectedLanguage = val.value;
  296. }
  297. void TocInfoDialog::setSelectedCDTextGenre(BlockValue val)
  298. {
  299.   if (val.block < 0 || val.block >= 8)
  300.     return;
  301.   if (val.value == 0) {
  302.     // cannot set to 'unknown', restore old setting
  303.     if (cdTextPages_[val.block].selectedGenre != 0) 
  304.       cdTextPages_[val.block].genre->set_history(cdTextPages_[val.block].selectedGenre);
  305.     return;
  306.   }
  307.   cdTextPages_[val.block].selectedGenre = val.value;
  308. }
  309. void TocInfoDialog::createCdTextLanguageMenu(int n)
  310. {
  311.   BlockValue bval;
  312.   int i;
  313.   bval.block = n;
  314.   cdTextPages_[n].languageMenuFactory = new Gtk_ItemFactory_Menu("<Main>");
  315.   for (i = 0; i < MAX_CD_TEXT_LANGUAGE_CODES; i++) {
  316.     string s("/");
  317.     s += CD_TEXT_LANGUAGE_CODES[i].name;
  318.     bval.value = i;
  319.     cdTextPages_[n].languageMenuFactory->create_item(s, 0, "<Item>", ItemFactoryConnector<TocInfoDialog, TocInfoDialog::BlockValue>(this, &TocInfoDialog::setSelectedCDTextLanguage, bval));
  320.   }
  321.   cdTextPages_[n].language = new Gtk_OptionMenu;
  322.   cdTextPages_[n].language->set_menu(cdTextPages_[n].languageMenuFactory->get_menu_widget(string("")));
  323. }
  324. void TocInfoDialog::createCdTextGenreMenu(int n)
  325. {
  326.   BlockValue bval;
  327.   int i;
  328.   bval.block = n;
  329.   cdTextPages_[n].genreMenuFactory = new Gtk_ItemFactory_Menu("<Main>");
  330.   for (i = 0; i < MAX_CD_TEXT_GENRE_CODES; i++) {
  331.     string s("/");
  332.     s += CD_TEXT_GENRE_CODES[i].name;
  333.     bval.value = i;
  334.     cdTextPages_[n].genreMenuFactory->create_item(s, 0, "<Item>", ItemFactoryConnector<TocInfoDialog, TocInfoDialog::BlockValue>(this, &TocInfoDialog::setSelectedCDTextGenre, bval));
  335.   }
  336.   cdTextPages_[n].genre = new Gtk_OptionMenu;
  337.   cdTextPages_[n].genre->set_menu(cdTextPages_[n].genreMenuFactory->get_menu_widget(string("")));
  338. }
  339. Gtk_VBox *TocInfoDialog::createCdTextPage(int n)
  340. {
  341.   char buf[20];
  342.   Gtk_Table *table = new Gtk_Table(11, 2, FALSE);
  343.   Gtk_VBox *vbox = new Gtk_VBox;
  344.   Gtk_HBox *hbox;
  345.   Gtk_Label *label;
  346.   sprintf(buf, "%d", n);
  347.   cdTextPages_[n].label = new Gtk_Label(string(buf));
  348.   cdTextPages_[n].label->show();
  349.   cdTextPages_[n].title = new Gtk_Entry;
  350.   cdTextPages_[n].performer = new Gtk_Entry;
  351.   cdTextPages_[n].songwriter = new Gtk_Entry;
  352.   cdTextPages_[n].composer = new Gtk_Entry;
  353.   cdTextPages_[n].arranger = new Gtk_Entry;
  354.   cdTextPages_[n].message = new Gtk_Entry;
  355.   cdTextPages_[n].catalog = new Gtk_Entry;
  356.   cdTextPages_[n].upcEan = new Gtk_Entry;
  357.   cdTextPages_[n].genreInfo = new Gtk_Entry;
  358.   createCdTextLanguageMenu(n);
  359.   createCdTextGenreMenu(n);
  360.   table->set_row_spacings(5);
  361.   table->set_col_spacings(5);
  362.   table->show();
  363.   label = new Gtk_Label(string("Language:"));
  364.   hbox = new Gtk_HBox;
  365.   hbox->pack_end(*label, FALSE);
  366.   table->attach(*hbox, 0, 1, 0, 1, GTK_FILL);
  367.   hbox->show();
  368.   label->show();
  369.   table->attach(*(cdTextPages_[n].language), 1, 2, 0, 1);
  370.   cdTextPages_[n].language->show();
  371.   label = new Gtk_Label(string("Title:"));
  372.   hbox = new Gtk_HBox;
  373.   hbox->pack_end(*label, FALSE);
  374.   table->attach(*hbox, 0, 1, 1, 2, GTK_FILL);
  375.   hbox->show();
  376.   label->show();
  377.   table->attach(*(cdTextPages_[n].title), 1, 2, 1, 2);
  378.   cdTextPages_[n].title->show();
  379.   label = new Gtk_Label(string("Performer:"));
  380.   hbox = new Gtk_HBox;
  381.   hbox->pack_end(*label, FALSE);
  382.   table->attach(*hbox, 0, 1, 2, 3, GTK_FILL);
  383.   hbox->show();
  384.   label->show();
  385.   table->attach(*(cdTextPages_[n].performer), 1, 2, 2, 3);
  386.   cdTextPages_[n].performer->show();
  387.   label = new Gtk_Label(string("Songwriter:"));
  388.   hbox = new Gtk_HBox;
  389.   hbox->pack_end(*label, FALSE);
  390.   table->attach(*hbox, 0, 1, 3, 4, GTK_FILL);
  391.   hbox->show();
  392.   label->show();
  393.   table->attach(*(cdTextPages_[n].songwriter), 1, 2, 3, 4);
  394.   cdTextPages_[n].songwriter->show();
  395.   label = new Gtk_Label(string("Composer:"));
  396.   hbox = new Gtk_HBox;
  397.   hbox->pack_end(*label, FALSE);
  398.   table->attach(*hbox, 0, 1, 4, 5, GTK_FILL);
  399.   hbox->show();
  400.   label->show();
  401.   table->attach(*(cdTextPages_[n].composer), 1, 2, 4, 5);
  402.   cdTextPages_[n].composer->show();
  403.   label = new Gtk_Label(string("Arranger:"));
  404.   hbox = new Gtk_HBox;
  405.   hbox->pack_end(*label, FALSE);
  406.   table->attach(*hbox, 0, 1, 5, 6, GTK_FILL);
  407.   hbox->show();
  408.   label->show();
  409.   table->attach(*(cdTextPages_[n].arranger), 1, 2, 5, 6);
  410.   cdTextPages_[n].arranger->show();
  411.   label = new Gtk_Label(string("Message:"));
  412.   hbox = new Gtk_HBox;
  413.   hbox->pack_end(*label, FALSE);
  414.   table->attach(*hbox, 0, 1, 6, 7, GTK_FILL);
  415.   hbox->show();
  416.   label->show();
  417.   table->attach(*(cdTextPages_[n].message), 1, 2, 6, 7);
  418.   cdTextPages_[n].message->show();
  419.   label = new Gtk_Label(string("Catalog:"));
  420.   hbox = new Gtk_HBox;
  421.   hbox->pack_end(*label, FALSE);
  422.   table->attach(*hbox, 0, 1, 7, 8, GTK_FILL);
  423.   hbox->show();
  424.   label->show();
  425.   table->attach(*(cdTextPages_[n].catalog), 1, 2, 7, 8);
  426.   cdTextPages_[n].catalog->show();
  427.   label = new Gtk_Label(string("UPC/EAN:"));
  428.   hbox = new Gtk_HBox;
  429.   hbox->pack_end(*label, FALSE);
  430.   table->attach(*hbox, 0, 1, 8, 9, GTK_FILL);
  431.   hbox->show();
  432.   label->show();
  433.   table->attach(*(cdTextPages_[n].upcEan), 1, 2, 8, 9);
  434.   cdTextPages_[n].upcEan->show();
  435.   label = new Gtk_Label(string("Genre:"));
  436.   hbox = new Gtk_HBox;
  437.   hbox->pack_end(*label, FALSE);
  438.   table->attach(*hbox, 0, 1, 9, 10, GTK_FILL);
  439.   hbox->show();
  440.   label->show();
  441.   table->attach(*(cdTextPages_[n].genre), 1, 2, 9, 10);
  442.   cdTextPages_[n].genre->show();
  443.   label = new Gtk_Label(string("Genre Info:"));
  444.   hbox = new Gtk_HBox;
  445.   hbox->pack_end(*label, FALSE);
  446.   table->attach(*hbox, 0, 1, 10, 11, GTK_FILL);
  447.   hbox->show();
  448.   label->show();
  449.   table->attach(*(cdTextPages_[n].genreInfo), 1, 2, 10, 11);
  450.   cdTextPages_[n].genreInfo->show();
  451.   vbox->pack_start(*table, FALSE);
  452.   vbox->show();
  453.   return vbox;
  454. }
  455. gint TocInfoDialog::delete_event_impl(GdkEventAny*)
  456. {
  457.   stop();
  458.   return 1;
  459. }
  460. void TocInfoDialog::cancelAction()
  461. {
  462.   stop();
  463. }
  464. void TocInfoDialog::clear()
  465. {
  466.   nofTracks_->set_text(string(""));
  467.   tocLength_->set_text(string(""));
  468.   tocType_->set_history(0);
  469.   selectedTocType_ = Toc::CD_DA;
  470.   catalog_->set_text(string(""));
  471.   catalog_->set_editable(false);
  472.   clearCdText();
  473. }
  474. void TocInfoDialog::update(unsigned long level, TocEdit *tocEdit)
  475. {
  476.   const Toc *toc;
  477.   if (!active_)
  478.     return;
  479.   tocEdit_ = tocEdit;
  480.   if (tocEdit == NULL) {
  481.     clear();
  482.     return;
  483.   }
  484.   if (level & UPD_TOC_DATA) {
  485.     toc = tocEdit->toc();
  486.     importData(toc);
  487.   }
  488.   if (level & UPD_EDITABLE_STATE) {
  489.     applyButton_->set_sensitive(tocEdit->editable() ? TRUE : FALSE);
  490.   }
  491. }
  492. void TocInfoDialog::clearCdText()
  493. {
  494.   int l;
  495.   for (l = 0; l < 8; l++) {
  496.     cdTextPages_[l].title->set_text(string(""));
  497.     cdTextPages_[l].title->set_editable(false);
  498.     cdTextPages_[l].performer->set_text(string(""));
  499.     cdTextPages_[l].performer->set_editable(false);
  500.     cdTextPages_[l].songwriter->set_text(string(""));
  501.     cdTextPages_[l].songwriter->set_editable(false);
  502.     cdTextPages_[l].composer->set_text(string(""));
  503.     cdTextPages_[l].composer->set_editable(false);
  504.     cdTextPages_[l].arranger->set_text(string(""));
  505.     cdTextPages_[l].arranger->set_editable(false);
  506.     cdTextPages_[l].message->set_text(string(""));
  507.     cdTextPages_[l].message->set_editable(false);
  508.     cdTextPages_[l].catalog->set_text(string(""));
  509.     cdTextPages_[l].catalog->set_editable(false);
  510.     cdTextPages_[l].upcEan->set_text(string(""));
  511.     cdTextPages_[l].upcEan->set_editable(false);
  512.     cdTextPages_[l].language->set_history(1);
  513.     cdTextPages_[l].selectedLanguage = 1;
  514.     cdTextPages_[l].genre->set_history(1);
  515.     cdTextPages_[l].selectedGenre = 1;
  516.   }
  517. }
  518. void TocInfoDialog::applyAction()
  519. {
  520.   if (tocEdit_ == NULL || !tocEdit_->editable())
  521.     return;
  522.   exportData(tocEdit_);
  523.   guiUpdate(UPD_TOC_DATA);
  524. }
  525. const char *TocInfoDialog::checkString(const string &str)
  526. {
  527.   static char *buf = NULL;
  528.   static long bufLen = 0;
  529.   char *p, *s;
  530.   long len = strlen(str.c_str());
  531.   if (len == 0)
  532.     return NULL;
  533.   if (buf == NULL || len + 1 > bufLen) {
  534.     delete[] buf;
  535.     bufLen = len + 1;
  536.     buf = new char[bufLen];
  537.   }
  538.   strcpy(buf, str.c_str());
  539.   s = buf;
  540.   p = buf + len - 1;
  541.   while (*s != 0 && isspace(*s))
  542.     s++;
  543.   if (*s == 0)
  544.     return NULL;
  545.   while (p > s && isspace(*p)) {
  546.     *p = 0;
  547.     p--;
  548.   }
  549.   
  550.   return s;
  551. }
  552. int TocInfoDialog::getCdTextLanguageIndex(int code)
  553. {
  554.   int i;
  555.   if (code < 0)
  556.     return 1; // undefined
  557.   for (i = 2; i < MAX_CD_TEXT_LANGUAGE_CODES; i++) {
  558.     if (CD_TEXT_LANGUAGE_CODES[i].code == code)
  559.       return i;
  560.   }
  561.   return 0; // unknown
  562. }
  563. int TocInfoDialog::getCdTextGenreIndex(int code1, int code2)
  564. {
  565.   int i;
  566.   for (i = 2; i < MAX_CD_TEXT_GENRE_CODES; i++) {
  567.     if (CD_TEXT_GENRE_CODES[i].code1 == code1 &&
  568. CD_TEXT_GENRE_CODES[i].code2 == code2)
  569.       return i;
  570.   }
  571.   return 0;
  572. }
  573. void TocInfoDialog::importCdText(const Toc *toc)
  574. {
  575.   int l;
  576.   const CdTextItem *item; 
  577.   for (l = 0; l < 8; l++) {
  578.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_TITLE))
  579. != NULL) 
  580.       cdTextPages_[l].title->set_text(string((const char*)(item->data())));
  581.     else
  582.       cdTextPages_[l].title->set_text(string(""));
  583.     cdTextPages_[l].title->set_editable(true);
  584.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_PERFORMER))
  585. != NULL) 
  586.       cdTextPages_[l].performer->set_text(string((const char*)(item->data())));
  587.     else
  588.       cdTextPages_[l].performer->set_text(string(""));
  589.     cdTextPages_[l].performer->set_editable(true);
  590.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_SONGWRITER))
  591. != NULL) 
  592.       cdTextPages_[l].songwriter->set_text(string((const char*)(item->data())));
  593.     else
  594.       cdTextPages_[l].songwriter->set_text(string(""));
  595.     cdTextPages_[l].songwriter->set_editable(true);
  596.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_COMPOSER))
  597. != NULL) 
  598.       cdTextPages_[l].composer->set_text(string((const char*)(item->data())));
  599.     else
  600.       cdTextPages_[l].composer->set_text(string(""));
  601.     cdTextPages_[l].composer->set_editable(true);
  602.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_ARRANGER))
  603. != NULL) 
  604.       cdTextPages_[l].arranger->set_text(string((const char*)(item->data())));
  605.     else
  606.       cdTextPages_[l].arranger->set_text(string(""));
  607.     cdTextPages_[l].arranger->set_editable(true);
  608.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_MESSAGE))
  609. != NULL) 
  610.       cdTextPages_[l].message->set_text(string((const char*)(item->data())));
  611.     else
  612.       cdTextPages_[l].message->set_text(string(""));
  613.     cdTextPages_[l].message->set_editable(true);
  614.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_DISK_ID))
  615. != NULL) 
  616.       cdTextPages_[l].catalog->set_text(string((const char*)(item->data())));
  617.     else
  618.       cdTextPages_[l].catalog->set_text(string(""));
  619.     cdTextPages_[l].catalog->set_editable(true);
  620.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_UPCEAN_ISRC))
  621. != NULL) 
  622.       cdTextPages_[l].upcEan->set_text(string((const char*)(item->data())));
  623.     else
  624.       cdTextPages_[l].upcEan->set_text(string(""));
  625.     cdTextPages_[l].upcEan->set_editable(true);
  626.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_GENRE)) != NULL) {
  627.       if (item->dataLen() >= 2) {
  628. cdTextPages_[l].selectedGenre = getCdTextGenreIndex(item->data()[0],
  629.     item->data()[1]);
  630.       }
  631.       else {
  632. cdTextPages_[l].selectedGenre = 0; // Unknwon
  633.       }
  634.       if (item->dataLen() > 2) {
  635. // Copy the supplementary genre information from the CD-TEXT item.
  636. // Carefully handle the case that the terminating 0 is missing.
  637. int len = item->dataLen() - 2 + 1;
  638. char *s = new char[len];
  639. memcpy(s, item->data() + 2, len - 1);
  640. s[len - 1] = 0;
  641. cdTextPages_[l].genreInfo->set_text(string(s));
  642. delete[] s;
  643.       }
  644.       else {
  645. cdTextPages_[l].genreInfo->set_text(string(""));
  646.       }
  647.     }
  648.     else {
  649.       cdTextPages_[l].selectedGenre = 1; // not used
  650.       cdTextPages_[l].genreInfo->set_text(string(""));
  651.     }
  652.     cdTextPages_[l].genre->set_history(cdTextPages_[l].selectedGenre);
  653.     cdTextPages_[l].selectedLanguage = getCdTextLanguageIndex(toc->cdTextLanguage(l));
  654.     cdTextPages_[l].language->set_history(cdTextPages_[l].selectedLanguage);
  655.   }
  656. }
  657. void TocInfoDialog::importData(const Toc *toc)
  658. {
  659.   char buf[50];
  660.   int i;
  661.   sprintf(buf, "%3d:%02d:%02d", toc->length().min(), toc->length().sec(),
  662.   toc->length().frac());
  663.   tocLength_->set_text(string(buf));
  664.   sprintf(buf, "%3d", toc->nofTracks());
  665.   nofTracks_->set_text(string(buf));
  666.   if (toc->catalogValid()) {
  667.     for (i = 0; i < 13; i++)
  668.       buf[i] = toc->catalog(i) + '0';
  669.     buf[13] = 0;
  670.     catalog_->set_text(string(buf));
  671.   }
  672.   else {
  673.     catalog_->set_text(string(""));
  674.   }
  675.   catalog_->set_editable(true);
  676.   switch (toc->tocType()) {
  677.   case Toc::CD_DA:
  678.     tocType_->set_history(0);
  679.     break;
  680.   case Toc::CD_ROM:
  681.     tocType_->set_history(1);
  682.     break;
  683.   case Toc::CD_ROM_XA:
  684.     tocType_->set_history(2);
  685.     break;
  686.   case Toc::CD_I:
  687.     tocType_->set_history(3);
  688.     break;
  689.   }
  690.   selectedTocType_ = toc->tocType();
  691.   importCdText(toc);
  692. }
  693. void TocInfoDialog::exportData(TocEdit *tocEdit)
  694. {
  695.   const char *s, *s1;
  696.   Toc *toc = tocEdit->toc();
  697.   
  698.   if (toc->tocType() != selectedTocType_) {
  699.     tocEdit->setTocType(selectedTocType_);
  700.   }
  701.   s = checkString(catalog_->get_text());
  702.   if (s == NULL) {
  703.     if (toc->catalogValid())
  704.       tocEdit->setCatalogNumber(NULL);
  705.   }
  706.   else if (strlen(s) == 13) {
  707.     if ((s1 = toc->catalog()) == NULL || strcmp(s1, s) != 0)
  708.       tocEdit->setCatalogNumber(s);
  709.   }
  710.   exportCdText(tocEdit);
  711. }
  712. void TocInfoDialog::exportCdText(TocEdit *tocEdit)
  713. {
  714.   int l;
  715.   const char *s;
  716.   const Toc *toc = tocEdit->toc();
  717.   const CdTextItem *item; 
  718.   CdTextItem *newItem;
  719.   for (l = 0; l < 8; l++) {
  720.     // Title
  721.     if ((s = checkString(cdTextPages_[l].title->get_text())) != NULL)
  722.       newItem = new CdTextItem(CdTextItem::CDTEXT_TITLE, l, s);
  723.     else
  724.       newItem = NULL;
  725.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_TITLE))
  726. != NULL) {
  727.       if (newItem == NULL)
  728. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_TITLE, l, NULL);
  729.       else if (*newItem != *item) 
  730. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_TITLE, l, s);
  731.     }
  732.     else if (newItem != NULL) {
  733. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_TITLE, l, s);
  734.     }
  735.     delete newItem;
  736.     // Performer
  737.     if ((s = checkString(cdTextPages_[l].performer->get_text())) != NULL)
  738.       newItem = new CdTextItem(CdTextItem::CDTEXT_PERFORMER, l, s);
  739.     else
  740.       newItem = NULL;
  741.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_PERFORMER))
  742. != NULL) {
  743.       if (newItem == NULL)
  744. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_PERFORMER, l, NULL);
  745.       else if (*newItem != *item) 
  746. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_PERFORMER, l, s);
  747.     }
  748.     else if (newItem != NULL) {
  749. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_PERFORMER, l, s);
  750.     }
  751.     delete newItem;
  752.     // Songwriter
  753.     if ((s = checkString(cdTextPages_[l].songwriter->get_text())) != NULL)
  754.       newItem = new CdTextItem(CdTextItem::CDTEXT_SONGWRITER, l, s);
  755.     else
  756.       newItem = NULL;
  757.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_SONGWRITER))
  758. != NULL) {
  759.       if (newItem == NULL)
  760. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_SONGWRITER, l,
  761.        NULL);
  762.       else if (*newItem != *item) 
  763. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_SONGWRITER, l, s);
  764.     }
  765.     else if (newItem != NULL) {
  766. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_SONGWRITER, l, s);
  767.     }
  768.     delete newItem;
  769.     // Composer
  770.     if ((s = checkString(cdTextPages_[l].composer->get_text())) != NULL)
  771.       newItem = new CdTextItem(CdTextItem::CDTEXT_COMPOSER, l, s);
  772.     else
  773.       newItem = NULL;
  774.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_COMPOSER))
  775. != NULL) {
  776.       if (newItem == NULL)
  777. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_COMPOSER, l, NULL);
  778.       else if (*newItem != *item) 
  779. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_COMPOSER, l, s);
  780.     }
  781.     else if (newItem != NULL) {
  782. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_COMPOSER, l, s);
  783.     }
  784.     delete newItem;
  785.     // Arranger
  786.     if ((s = checkString(cdTextPages_[l].arranger->get_text())) != NULL)
  787.       newItem = new CdTextItem(CdTextItem::CDTEXT_ARRANGER, l, s);
  788.     else
  789.       newItem = NULL;
  790.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_ARRANGER))
  791. != NULL) {
  792.       if (newItem == NULL)
  793. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_ARRANGER, l, NULL);
  794.       else if (*newItem != *item) 
  795. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_ARRANGER, l, s);
  796.     }
  797.     else if (newItem != NULL) {
  798. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_ARRANGER, l, s);
  799.     }
  800.     delete newItem;
  801.     // Message
  802.     if ((s = checkString(cdTextPages_[l].message->get_text())) != NULL)
  803.       newItem = new CdTextItem(CdTextItem::CDTEXT_MESSAGE, l, s);
  804.     else
  805.       newItem = NULL;
  806.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_MESSAGE))
  807. != NULL) {
  808.       if (newItem == NULL)
  809. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_MESSAGE, l, NULL);
  810.       else if (*newItem != *item) 
  811. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_MESSAGE, l, s);
  812.     }
  813.     else if (newItem != NULL) {
  814. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_MESSAGE, l, s);
  815.     }
  816.     delete newItem;
  817.     // Catalog
  818.     if ((s = checkString(cdTextPages_[l].catalog->get_text())) != NULL)
  819.       newItem = new CdTextItem(CdTextItem::CDTEXT_DISK_ID, l, s);
  820.     else
  821.       newItem = NULL;
  822.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_DISK_ID))
  823. != NULL) {
  824.       if (newItem == NULL)
  825. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_DISK_ID, l,
  826.        NULL);
  827.       else if (*newItem != *item) 
  828. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_DISK_ID, l, s);
  829.     }
  830.     else if (newItem != NULL) {
  831. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_DISK_ID, l, s);
  832.     }
  833.     delete newItem;
  834.     // Upc/Ean
  835.     if ((s = checkString(cdTextPages_[l].upcEan->get_text())) != NULL)
  836.       newItem = new CdTextItem(CdTextItem::CDTEXT_UPCEAN_ISRC, l, s);
  837.     else
  838.       newItem = NULL;
  839.     if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_UPCEAN_ISRC))
  840. != NULL) {
  841.       if (newItem == NULL)
  842. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_UPCEAN_ISRC, l,
  843.        NULL);
  844.       else if (*newItem != *item) 
  845. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_UPCEAN_ISRC, l, s);
  846.     }
  847.     else if (newItem != NULL) {
  848. tocEdit->setCdTextItem(0, CdTextItem::CDTEXT_UPCEAN_ISRC, l, s);
  849.     }
  850.     delete newItem;
  851.     // Genre
  852.     if (cdTextPages_[l].selectedGenre != 0) {
  853.       int code1 = CD_TEXT_GENRE_CODES[cdTextPages_[l].selectedGenre].code1;
  854.       int code2 = CD_TEXT_GENRE_CODES[cdTextPages_[l].selectedGenre].code2;
  855.       s = checkString(cdTextPages_[l].genreInfo->get_text());
  856.       if (cdTextPages_[l].selectedGenre > 1)
  857. newItem = new CdTextItem(l, code1, code2, s);
  858.       else
  859. newItem = NULL;
  860.       if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_GENRE))
  861.   != NULL) {
  862. if (newItem == NULL)
  863.   tocEdit->setCdTextGenreItem(l, -1, -1, NULL);
  864. else if (*newItem != *item) 
  865.   tocEdit->setCdTextGenreItem(l, code1, code2, s);
  866.       }
  867.       else if (newItem != NULL) {
  868. tocEdit->setCdTextGenreItem(l, code1, code2, s);
  869.       }
  870.       delete newItem;
  871.     }
  872.     // language
  873.     if (cdTextPages_[l].selectedLanguage != 0) {
  874.       int langCode = CD_TEXT_LANGUAGE_CODES[cdTextPages_[l].selectedLanguage].code;
  875.       if (langCode != toc->cdTextLanguage(l)) 
  876. tocEdit->setCdTextLanguage(l, langCode);
  877.     }
  878.   }
  879. }