1
/* cdrdao - write audio CD-Rs in disc-at-once mode
3
* Copyright (C) 1998-2001 Andreas Mueller <mueller@daneb.ping.de>
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.
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.
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.
20
#include "CdTextDialog.h"
24
#include <libgnomeuimm.h>
33
#include "guiUpdate.h"
35
CdTextDialog::CdTextDialog()
38
Gtk::VBox *contents = manage(new Gtk::VBox);
45
languages_ = manage(new Gtk::Notebook);
47
for (i = 0; i < 8; i++) {
48
page_[i].table = new Gtk::Table(3, 3, false);
49
page_[i].table->set_row_spacings(5);
50
page_[i].table->set_col_spacings(5);
51
page_[i].performer = manage(new Gtk::Entry);
52
page_[i].title = manage(new Gtk::Entry);
53
page_[i].tabLabel = new Gtk::Label("");
54
page_[i].performerButton =
55
new Gtk::CheckButton(_("Enable Perfomer Entries"));
56
page_[i].performerButton->set_active(false);
57
page_[i].performerButton->signal_toggled().
58
connect(bind(slot(*this, &CdTextDialog::activatePerformerAction), i));
59
page_[i].tracks = NULL;
60
page_[i].table->attach(*(new Gtk::Label(_("Performer"))), 1, 2, 0, 1);
61
page_[i].table->attach(*(new Gtk::Label(_("Title"))), 2, 3, 0, 1);
64
Gtk::HBox *hbox = manage(new Gtk::HBox);
65
hbox->pack_end(*(new Gtk::Label(_("Album"))));
67
page_[i].table->attach(*hbox, 0, 1, 1, 2, Gtk::FILL);
68
page_[i].table->attach(*(page_[i].title), 2, 3, 1, 2);
69
page_[i].table->attach(*(page_[i].performer), 1, 2, 1, 2);
73
Gtk::HBox *hbox = manage(new Gtk::HBox);
75
hbox->pack_start(*(page_[i].performerButton));
76
page_[i].table->attach(*hbox, 1, 2, 2, 3);
80
Gtk::HBox *hbox1 = manage(new Gtk::HBox);
81
Gtk::VBox *vbox1 = manage(new Gtk::VBox);
83
hbox1->pack_start(*(page_[i].table), true, true, 5);
84
vbox1->pack_start(*hbox1, false, false, 5);
86
Gtk::ScrolledWindow *swin = manage(new Gtk::ScrolledWindow);
87
swin->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
91
sprintf(buf, " %d ", i);
93
push_back(Gtk::Notebook_Helpers::TabElem(*swin,
94
*(page_[i].tabLabel)));
98
contents->pack_start(*languages_);
101
Gtk::HBox *hbox = manage(new Gtk::HBox);
103
hbox->pack_start(*contents, true, true, 10);
104
get_vbox()->pack_start(*hbox, true, true, 10);
107
Gtk::HButtonBox *bbox = new Gtk::HButtonBox(Gtk::BUTTONBOX_SPREAD);
109
applyButton_ = new Gtk::Button(Gtk::StockID(Gtk::Stock::APPLY));
110
bbox->pack_start(*applyButton_);
111
applyButton_->signal_clicked().connect(slot(*this, &CdTextDialog::applyAction));
113
Gtk::Button *fillButton = new Gtk::Button(_(" Fill Performer "));
114
bbox->pack_start(*fillButton);
115
fillButton->signal_clicked().connect(slot(*this, &CdTextDialog::fillPerformerAction));
117
Gtk::Button *cancelButton = new Gtk::Button(Gtk::StockID(Gtk::Stock::CLOSE));
118
bbox->pack_start(*cancelButton);
119
cancelButton->signal_clicked().connect(slot(*this, &CdTextDialog::stop));
121
get_action_area()->pack_start(*bbox);
124
set_title(_("CD-TEXT Entry"));
127
CdTextDialog::~CdTextDialog()
131
bool CdTextDialog::on_delete_event(GdkEventAny*)
137
void CdTextDialog::updateTabLabels()
139
const Toc *toc = tocEdit_->toc();
142
for (l = 0; l < 8; l++) {
143
const char *s = CdTextContainer::languageName(toc->cdTextLanguage(l));
145
if (page_[l].tabLabel->get_label() != s)
146
page_[l].tabLabel->set_label(s);
150
void CdTextDialog::adjustTableEntries(int n)
155
if (trackEntries_ == n)
158
for (l = 0; l < 8; l++) {
159
if (n < trackEntries_) {
160
page_[l].table->resize(3 + n, 3);
162
for (i = n; i < trackEntries_; i++) {
163
delete page_[l].tracks[i].performer;
164
delete page_[l].tracks[i].title;
165
delete page_[l].tracks[i].hbox;
166
delete page_[l].tracks[i].label;
170
int performerActive = page_[l].performerButton->get_active();
172
TableEntry *newTracks = new TableEntry[n];
174
for (i = 0; i < trackEntries_; i++)
175
newTracks[i] = page_[l].tracks[i];
177
delete[] page_[l].tracks;
178
page_[l].tracks = newTracks;
180
page_[l].table->resize(3 + n, 3);
182
for (i = trackEntries_; i < n; i++) {
183
sprintf(buf, _("Track %02d"), i + 1);
185
page_[l].tracks[i].performer = manage(new Gtk::Entry);
186
page_[l].tracks[i].performer->set_sensitive(performerActive);
187
page_[l].tracks[i].title = manage(new Gtk::Entry);
188
page_[l].tracks[i].label = new Gtk::Label(buf);
189
page_[l].tracks[i].hbox = manage(new Gtk::HBox);
191
page_[l].tracks[i].hbox->pack_end(*(page_[l].tracks[i].label),
194
page_[l].table->attach(*(page_[l].tracks[i].hbox),
195
0, 1, i + 3, i + 4, Gtk::FILL);
196
page_[l].table->attach(*(page_[l].tracks[i].title),
198
page_[l].table->attach(*(page_[l].tracks[i].performer),
202
page_[l].table->show_all();
209
void CdTextDialog::update(unsigned long level, TocEdit *view)
211
if (view != tocEdit_) {
216
std::string s(view->filename());
219
if (view->tocDirty())
223
if (level & UPD_TOC_DATA) {
227
if ((level & UPD_TOC_DATA) ||
228
(level & UPD_TRACK_DATA)) {
232
if (level & UPD_EDITABLE_STATE) {
233
applyButton_->set_sensitive(tocEdit_->editable() ? true : false);
237
void CdTextDialog::start(TocEdit *view)
239
update(UPD_ALL, view);
244
void CdTextDialog::stop()
250
void CdTextDialog::applyAction()
252
if (tocEdit_ == NULL || !tocEdit_->editable())
260
void CdTextDialog::fillPerformerAction()
262
int l = languages_->get_current_page();
264
if (l >= 0 && l <= 7) {
266
const char *s = checkString(page_[l].performer->get_text());
271
char *performer = strdupCC(s);
273
for (i = 0; i < trackEntries_; i++) {
274
if (checkString(page_[l].tracks[i].performer->get_text()) == NULL)
275
page_[l].tracks[i].performer->set_text(performer);
282
void CdTextDialog::activatePerformerAction(int l)
285
int val = page_[l].performerButton->get_active();
287
for (i = 0; i < trackEntries_; i++) {
288
page_[l].tracks[i].performer->set_sensitive(val);
292
void CdTextDialog::importData()
294
const CdTextItem *item;
295
const Toc *toc = tocEdit_->toc();
297
int n = toc->nofTracks();
299
adjustTableEntries(n);
301
for (l = 0; l < 8; l++) {
302
if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_TITLE)) != NULL)
303
page_[l].title->set_text((const char*)item->data());
305
page_[l].title->set_text("");
307
if ((item = toc->getCdTextItem(0, l, CdTextItem::CDTEXT_PERFORMER))
309
page_[l].performer->set_text((const char*)item->data());
311
page_[l].performer->set_text("");
313
for (i = 0; i < n; i++) {
314
if ((item = toc->getCdTextItem(i + 1, l, CdTextItem::CDTEXT_TITLE))
316
page_[l].tracks[i].title->set_text((const char*)item->data());
318
page_[l].tracks[i].title->set_text("");
320
if ((item = toc->getCdTextItem(i + 1, l, CdTextItem::CDTEXT_PERFORMER))
322
page_[l].tracks[i].performer->set_text((const char*)item->data());
324
page_[l].tracks[i].performer->set_text("");
329
void CdTextDialog::exportData()
333
for (l = 0; l < 8; l++) {
334
setCdTextItem(CdTextItem::CDTEXT_TITLE, 0, l,
335
checkString(page_[l].title->get_text()));
336
setCdTextItem(CdTextItem::CDTEXT_PERFORMER, 0, l,
337
checkString(page_[l].performer->get_text()));
339
for (i = 0; i < trackEntries_; i++) {
340
setCdTextItem(CdTextItem::CDTEXT_TITLE, i + 1, l,
341
checkString(page_[l].tracks[i].title->get_text()));
342
setCdTextItem(CdTextItem::CDTEXT_PERFORMER, i + 1, l,
343
checkString(page_[l].tracks[i].performer->get_text()));
348
void CdTextDialog::setCdTextItem(CdTextItem::PackType type, int trackNr,
349
int l, const char *s)
351
const CdTextItem *item;
352
TocEdit *tocEdit = tocEdit_;
353
const Toc *toc = tocEdit->toc();
357
newItem = new CdTextItem(type, l, s);
361
if ((item = toc->getCdTextItem(trackNr, l, type)) != NULL) {
363
tocEdit->setCdTextItem(trackNr, type, l, NULL);
364
else if (*newItem != *item)
365
tocEdit->setCdTextItem(trackNr, type, l, s);
367
else if (newItem != NULL) {
368
tocEdit->setCdTextItem(trackNr, type, l, s);
374
const char *CdTextDialog::checkString(const std::string &str)
376
static char *buf = NULL;
377
static long bufLen = 0;
379
long len = strlen(str.c_str());
384
if (buf == NULL || len + 1 > bufLen) {
387
buf = new char[bufLen];
390
strcpy(buf, str.c_str());
395
while (*s != 0 && isspace(*s))
401
while (p > s && isspace(*p)) {