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

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$
  21.  */
  22. static char rcsid[] = "$Id$";
  23. #include <stddef.h>
  24. #include <string.h>
  25. #include <ctype.h>
  26. #include "RecordProgressDialog.h"
  27. #include "MessageBox.h"
  28. #include "TocEdit.h"
  29. #include "guiUpdate.h"
  30. #include "CdDevice.h"
  31. RecordProgressDialog::RecordProgressDialog(RecordProgressDialogPool *father)
  32. {
  33.   Gtk_Label *label;
  34.   Gtk_HBox *hbox;
  35.   Gtk_VBox *contents = new Gtk_VBox;
  36.   Gtk_Table *table;
  37.   Gtk_Alignment *align;
  38.   poolFather_ = father;
  39.   active_ = 0;
  40.   device_ = NULL;
  41.   poolNext_ = NULL;
  42.   contents->set_spacing(5);
  43.   statusMsg_ = new Gtk_Label(string("XXXXXXXXXXXXXXXXXXX"));
  44.   totalProgress_ = new Gtk_ProgressBar;
  45.   bufferFillRate_ = new Gtk_ProgressBar;
  46.   tocName_ = new Gtk_Label;
  47.   abortLabel_ = new Gtk_Label(string(" Abort "));
  48.   closeLabel_ = new Gtk_Label(string(" Dismiss "));
  49.   closeButton_ = new Gtk_Button;
  50.   closeButton_->add(*closeLabel_);
  51.   closeLabel_->show();
  52.   abortLabel_->show();
  53.   actCloseButtonLabel_ = 2;
  54.   hbox = new Gtk_HBox;
  55.   label = new Gtk_Label(string("Project: "));
  56.   hbox->pack_start(*label, FALSE);
  57.   label->show();
  58.   hbox->pack_start(*tocName_, FALSE);
  59.   tocName_->show();
  60.   contents->pack_start(*hbox, FALSE);
  61.   hbox->show();
  62.   hbox = new Gtk_HBox;
  63.   hbox->pack_start(*statusMsg_, FALSE);
  64.   statusMsg_->show();
  65.   contents->pack_start(*hbox, FALSE);
  66.   hbox->show();
  67.   table = new Gtk_Table(2, 2, FALSE);
  68.   table->set_row_spacings(5);
  69.   table->set_col_spacings(5);
  70.   contents->pack_start(*table, FALSE);
  71.   table->show();
  72.   label = new Gtk_Label(string("Progress:"));
  73.   align = new Gtk_Alignment(1.0, 0.0, 0.0, 0.0);
  74.   align->add(*label);
  75.   label->show();
  76.   table->attach(*align, 0, 1, 0, 1, GTK_FILL);
  77.   align->show();
  78.   hbox = new Gtk_HBox;
  79.   hbox->pack_start(*totalProgress_);
  80.   totalProgress_->show();
  81.   table->attach(*hbox, 1, 2, 0, 1);
  82.   hbox->show();
  83.   label = new Gtk_Label(string("Buffer:"));
  84.   align = new Gtk_Alignment(1.0, 0.0, 0.0, 0.0);
  85.   align->add(*label);
  86.   label->show();
  87.   table->attach(*align, 0, 1, 1, 2, GTK_FILL);
  88.   align->show();
  89.   
  90.   hbox = new Gtk_HBox;
  91.   hbox->pack_start(*bufferFillRate_);
  92.   bufferFillRate_->show();
  93.   table->attach(*hbox, 1, 2, 1, 2);
  94.   hbox->show();
  95.   
  96.   hbox = new Gtk_HBox;
  97.   hbox->pack_start(*contents, TRUE, TRUE, 10);
  98.   contents->show();
  99.   get_vbox()->pack_start(*hbox, FALSE, FALSE, 10);
  100.   hbox->show();
  101.   get_vbox()->show();
  102.   Gtk_HButtonBox *bbox = new Gtk_HButtonBox(GTK_BUTTONBOX_SPREAD);
  103.   bbox->pack_start(*closeButton_);
  104.   closeButton_->show();
  105.   connect_to_method(closeButton_->clicked, this, &RecordProgressDialog::closeAction);
  106.   get_action_area()->pack_start(*bbox);
  107.   bbox->show();
  108.   get_action_area()->show();
  109.   set_usize(400, 0);
  110. }
  111. RecordProgressDialog::~RecordProgressDialog()
  112. {
  113. }
  114. void RecordProgressDialog::start(CdDevice *device, TocEdit *tocEdit)
  115. {
  116.   string s;
  117.   if (device == NULL)
  118.     return;
  119.   if (active_) {
  120.     get_window().raise();
  121.     return;
  122.   }
  123.   active_ = 1;
  124.   device_ = device;
  125.   clear();
  126.   statusMsg_->set_text(string("Initializing..."));
  127.   tocName_->set_text(string(tocEdit->filename()));
  128.   setCloseButtonLabel(1);
  129.   s = device->vendor();
  130.   s += " ";
  131.   s += device->product();
  132.   set_title(s);
  133.   
  134.   show();
  135. }
  136. void RecordProgressDialog::stop()
  137. {
  138.   if (active_) {
  139.     hide();
  140.     active_ = 0;
  141.     device_ = NULL;
  142.   }
  143. }
  144. gint RecordProgressDialog::delete_event_impl(GdkEventAny*)
  145. {
  146.   if (finished_) {
  147.     poolFather_->stop(this);
  148.   }
  149.   return 1;
  150. }
  151. void RecordProgressDialog::closeAction()
  152. {
  153.   if (finished_) {
  154.     poolFather_->stop(this);
  155.   }
  156.   else {
  157.     Ask2Box msg(this, "Abort Recording", 0, 2,
  158. "Abort recording process?", NULL);
  159.     if (msg.run() == 1) {
  160.       if (device_ != NULL) 
  161. device_->abortDaoRecording();
  162.     }
  163.   }
  164. }
  165. void RecordProgressDialog::clear()
  166. {
  167.   finished_ = 0;
  168.   actStatus_ = 0;
  169.   actTrack_ = 0;
  170.   actTotalProgress_ = 0;
  171.   actBufferFill_ = 0;
  172.   statusMsg_->set_text(string(""));
  173.   totalProgress_->set_percentage(0.0);
  174.   bufferFillRate_->set_percentage(0.0);
  175.   
  176.   set_title(string(""));
  177. }
  178. void RecordProgressDialog::update(unsigned long level, TocEdit *tocEdit)
  179. {
  180.   int status;
  181.   int track;
  182.   int totalProgress;
  183.   int bufferFill;
  184.   char buf[20];
  185.   string s;
  186.   if (!active_ || device_ == NULL)
  187.     return;
  188.   if (finished_)
  189.     return;
  190.   if ((level & UPD_PROGRESS_STATUS) && device_->progressStatusChanged()) {
  191.     
  192.     device_->recordProgress(&status, &track, &totalProgress, &bufferFill);
  193.     if (status != actStatus_) {
  194.       actStatus_ = status;
  195.       switch (status) {
  196.       case 1:
  197. statusMsg_->set_text(string("Writing lead-in..."));
  198. break;
  199.       case 2:
  200. actTrack_ = track;
  201. s = "Writing track ";
  202. sprintf(buf, "%d", track);
  203. s += buf;
  204. statusMsg_->set_text(s);
  205. break;
  206.       case 3:
  207. statusMsg_->set_text(string("Writing lead-out..."));
  208. break;
  209.       }
  210.     }
  211.     if (track != actTrack_ && status == 2) {
  212.       actTrack_ = track;
  213.       s = "Writing track ";
  214.       sprintf(buf, "%d", track);
  215.       s += buf;
  216.       statusMsg_->set_text(s);
  217.     }
  218.     if (totalProgress != actTotalProgress_) {
  219.       actTotalProgress_ = totalProgress;
  220.       totalProgress_->set_percentage(gfloat(totalProgress) / 1000.0);
  221.     }
  222.     if (bufferFill != actBufferFill_) {
  223.       actBufferFill_ = bufferFill;
  224.       bufferFillRate_->set_percentage(gfloat(bufferFill) / 100.0);
  225.     }
  226.   }
  227.   if (device_->status() != CdDevice::DEV_RECORDING) {
  228.     switch (device_->exitStatus()) {
  229.     case 0:
  230.       statusMsg_->set_text(string("Recoring finished successfully."));
  231.       break;
  232.     case 255:
  233.       statusMsg_->set_text(string("Cannot execute cdrdao. Please check your PATH."));
  234.       break;
  235.     default:
  236.       statusMsg_->set_text(string("Recoring aborted with error."));
  237.       break;
  238.     }
  239.     finished_ = 1;
  240.     setCloseButtonLabel(2);
  241.   }
  242. }
  243. // Sets label of close button.
  244. // l: 1: 'abort'
  245. //    2: 'dismiss'
  246. void RecordProgressDialog::setCloseButtonLabel(int l)
  247. {
  248.   if (actCloseButtonLabel_ == l)
  249.     return;
  250.   switch (actCloseButtonLabel_) {
  251.   case 1:
  252.     closeButton_->remove(abortLabel_);
  253.     break;
  254.   case 2:
  255.     closeButton_->remove(closeLabel_);
  256.     break;
  257.   }
  258.   switch (l) {
  259.   case 1:
  260.     closeButton_->add(*abortLabel_);
  261.     break;
  262.   case 2:
  263.     closeButton_->add(*closeLabel_);
  264.     break;
  265.   }
  266.   actCloseButtonLabel_ = l;
  267. }
  268. RecordProgressDialogPool::RecordProgressDialogPool()
  269. {
  270.   activeDialogs_ = NULL;
  271.   pool_ = NULL;
  272. }
  273. RecordProgressDialogPool::~RecordProgressDialogPool()
  274. {
  275. }
  276. void RecordProgressDialogPool::update(unsigned long status, TocEdit *tocEdit)
  277. {
  278.   RecordProgressDialog *run;
  279.   for (run = activeDialogs_; run != NULL; run = run->poolNext_)
  280.     run->update(status, tocEdit);
  281. }
  282.   
  283. RecordProgressDialog *RecordProgressDialogPool::start(CdDevice *device,
  284.       TocEdit *tocEdit)
  285. {
  286.   RecordProgressDialog *dialog;
  287.   if (pool_ == NULL) {
  288.     dialog = new RecordProgressDialog(this);
  289.   }
  290.   else {
  291.     dialog = pool_;
  292.     pool_ = pool_->poolNext_;
  293.   }
  294.   dialog->poolNext_ = activeDialogs_;
  295.   activeDialogs_ = dialog;
  296.   dialog->start(device, tocEdit);
  297.   return dialog;
  298. }
  299. void RecordProgressDialogPool::stop(RecordProgressDialog *dialog)
  300. {
  301.   RecordProgressDialog *run, *pred;
  302.   for (pred = NULL, run = activeDialogs_; run != NULL;
  303.        pred = run, run = run->poolNext_) {
  304.     if (run == dialog)
  305.       break;
  306.   }
  307.   if (run == NULL)
  308.     return;
  309.   dialog->stop();
  310.   if (pred == NULL)
  311.     activeDialogs_ = activeDialogs_->poolNext_;
  312.   else
  313.     pred->poolNext_ = run->poolNext_;
  314.   dialog->poolNext_ = pool_;
  315.   pool_ = dialog;
  316. }