FreeburnTrackDialog.cpp
上传用户:cnxinhai
上传日期:2013-08-06
资源大小:265k
文件大小:22k
源码类别:

DVD

开发平台:

Visual C++

  1. /* This is the class definition for the Track Editor Dialog.
  2.  *
  3.  * Copyright (C) 2001, 2002  Adam Schlag
  4.  */
  5. /*
  6.  * FreeBurn Software License
  7.  * (based on the Apache Software License)
  8.  * 
  9.  * Version 1.1
  10.  * 
  11.  * Copyright (c) 2001, 2002 The FreeBurn Project. All rights reserved.
  12.  * 
  13.  * Redistribution and use in source and binary forms, with or without 
  14.  * modification, are permitted provided that the following conditions are met:
  15.  * 
  16.  * 1. Redistributions of source code must retain the above copyright 
  17.  * notice, this list of conditions and the following disclaimer.
  18.  * 
  19.  * 2. Redistributions in binary form must reproduce the above copyright 
  20.  * notice, this list of conditions and the following disclaimer in the 
  21.  * documentation and/or other materials provided with the distribution.
  22.  * 
  23.  * 3. The end-user documentation included with the redistribution, if any, must 
  24.  * include the following acknowledgment:
  25.  * 
  26.  *  "This product includes software developed by the FreeBurn 
  27.  *     Project (http://freeburn.sourceforge.net/)."
  28.  * 
  29.  * Alternately, this acknowledgment may appear in the software itself, 
  30.  * if and wherever such third-party acknowledgments normally appear.
  31.  * 
  32.  * 4. The names "FreeBurn" and "FreeBurn Project" must not be 
  33.  * used to endorse or promote products derived from this software 
  34.  * without prior written permission. For written permission, please 
  35.  * contact aschlag@users.sourceforge.net.
  36.  * 
  37.  * 5. Products derived from this software may not be called "FreeBurn", 
  38.  * nor may "FreeBurn" appear in their name, without prior written 
  39.  * permission of the FreeBurn Project.
  40.  * 
  41.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 
  42.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
  43.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  44.  * DISCLAIMED. IN NO EVENT SHALL THE FREEBURN PROJECT OR ITS 
  45.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
  46.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
  47.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 
  48.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
  49.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
  50.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
  51.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  52.  * SUCH DAMAGE.
  53.  * 
  54.  * This software consists of voluntary contributions made by many 
  55.  * individuals on behalf of the FreeBurn Project. For more 
  56.  * information on the FreeBurn Project and FreeBurn, please see 
  57.  * <http://freeburn.sourceforge.net/>.
  58.  * 
  59.  * This software is distributed with software that is released under the GNU 
  60.  * General Public License (GPL).  You can find the terms of this license in the
  61.  * file GPL.txt distributed in this package.  You can find information on the
  62.  * software distributed with this package in the file PROGRAMS.txt.
  63.  */
  64. #include <fx.h>
  65. #include <FXPNGIcon.h>
  66. #include "FreeburnDefs.h"
  67. #include "FreeburnTrack.h"
  68. #include "FreeburnDisc.h"
  69. #include "FreeburnTrackDialog.h"
  70. #include "FreeburnTrackDialogText.h"
  71. #include "FreeburnTrackTextDialog.h"
  72. // we also want to borrow some of the text from FreeburnText.h
  73. #include "FreeburnText.h"
  74. // Message Map for FreeburnTrackDialog class
  75. FXDEFMAP(CFreeburnTrackDialog) CFreeburnTrackDialogMap[]={
  76.     //________Message_Type_____________________ID________________________________Message_Handler________________
  77.     FXMAPFUNC(SEL_COMMAND, CFreeburnTrackDialog::ID_EDIT_TRACK_TEXT, CFreeburnTrackDialog::onCmdEditTrackText),
  78. };
  79. FXIMPLEMENT(CFreeburnTrackDialog,FXDialogBox,CFreeburnTrackDialogMap,ARRAYNUMBER(CFreeburnTrackDialogMap))
  80. // Construct help dialog box
  81. CFreeburnTrackDialog::CFreeburnTrackDialog(FXWindow* owner, CFreeburnDisc* mainDisc):
  82.     FXDialogBox(owner, fbTrackDialogTitleText,DECOR_TITLE|DECOR_BORDER, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4)
  83. {
  84.     // assign the disc pointer
  85.     m_disc = mainDisc;
  86.     
  87.     // temporary int to hold the disc type
  88.     FXint discType = m_disc->discType();
  89.         
  90.     // set up the track type and target
  91.     switch(m_disc->activeTrackMode())
  92.     {
  93.         case AUDIO:
  94.             m_trackMode = AUDIO_TRACK;
  95.             break;
  96.         case MODE_1:
  97.             m_trackMode = MODE1_DATA_TRACK;
  98.             break;
  99.         case MODE_1_RAW:
  100.             m_trackMode = MODE1_RAW;
  101.             break;
  102.         case MODE_2_FORM_1:
  103.             m_trackMode = MODE2_DATA_TRACK;
  104.             break;
  105.         case MODE_2_FORM_2:
  106.             m_trackMode = MODE2_AUDIO_TRACK;
  107.             break;
  108.         case MODE_2_RAW:
  109.             m_trackMode = MODE2_RAW;
  110.             break;
  111.     }
  112.     m_trackModeTarget.connect(m_trackMode);
  113.     
  114.     // set up the main container for the dialog
  115.     FXVerticalFrame* mainTrackFrame = new FXVerticalFrame(this, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y);
  116.     
  117.     // add the title label
  118.     new FXLabel(mainTrackFrame, fbTrackDialogTitleLabelText, NULL, LAYOUT_LEFT);
  119.     
  120.     // add a horizontal ridge separator
  121.     new FXHorizontalSeparator(mainTrackFrame, SEPARATOR_RIDGE|LAYOUT_FILL_X);
  122.     
  123.     // create the popup for the track mode option menu
  124.     m_trackModePopup = new FXPopup(this);
  125.     // only create options for the popup for the data types that we can switch to
  126.     if (discType == CD_DA)
  127.     {
  128.         new FXOption(m_trackModePopup, fbAudioTrackOptionText, NULL, &m_trackModeTarget, 
  129.             FXDataTarget::ID_OPTION+AUDIO_TRACK, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  130.     }
  131.     else if (discType == CD_ROM)
  132.     {
  133.         new FXOption(m_trackModePopup, fbAudioTrackOptionText,   NULL, &m_trackModeTarget, 
  134.             FXDataTarget::ID_OPTION+MODE1_AUDIO_TRACK, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  135.         new FXOption(m_trackModePopup, fbDataTrackOptionText,    NULL, &m_trackModeTarget, 
  136.             FXDataTarget::ID_OPTION+MODE1_DATA_TRACK,  JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  137.         new FXOption(m_trackModePopup, fbRawDataTrackOptionText, NULL, &m_trackModeTarget, 
  138.             FXDataTarget::ID_OPTION+MODE1_RAW,         JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  139.     }
  140.     else if (discType == CDROM_XA)
  141.     {
  142.         new FXOption(m_trackModePopup, fbAudioTrackOptionText,      NULL, &m_trackModeTarget, 
  143.             FXDataTarget::ID_OPTION+MODE2_AUDIO,       JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  144.         new FXOption(m_trackModePopup, fbMode2DataTrackOptionText,  NULL, &m_trackModeTarget, 
  145.             FXDataTarget::ID_OPTION+MODE2_DATA_TRACK,  JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  146.         new FXOption(m_trackModePopup, fbMode2AudioTrackOptionText, NULL, &m_trackModeTarget, 
  147.             FXDataTarget::ID_OPTION+MODE2_AUDIO_TRACK, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  148.         new FXOption(m_trackModePopup, fbMode2RawTrackOptionText,   NULL, &m_trackModeTarget,
  149.             FXDataTarget::ID_OPTION+MODE2_RAW,         JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  150.     }
  151.     
  152.     // add the label and option menu for the track mode, and set the option menu to be
  153.     // the current track mode
  154.     FXHorizontalFrame* rowOne = new FXHorizontalFrame(mainTrackFrame, LAYOUT_FILL_X); 
  155.     new FXLabel(rowOne, fbTrackDialogTrackModeLabelText, NULL);
  156.     FXOptionMenu* trackModeOptions = new FXOptionMenu(rowOne, m_trackModePopup, 
  157.         LAYOUT_TOP|FRAME_RAISED|FRAME_THICK|JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  158.         trackModeOptions->setTarget(&m_trackModeTarget);
  159.         trackModeOptions->setSelector(FXDataTarget::ID_VALUE);
  160.         
  161.     // set the copy mode and pre-emphasis mode variables and data targets
  162.     if (m_disc->activeTrackCopyMode() == COPY)
  163.         m_copyMode = TRUE;
  164.     else
  165.         m_copyMode = FALSE;
  166.     m_copyModeTarget.connect(m_copyMode);
  167.     
  168.     if (m_disc->activeTrackPreEmphMode() == PRE_EMPHASIS)
  169.         m_preEmphMode = TRUE;
  170.     else
  171.         m_preEmphMode = FALSE;
  172.     m_preEmphModeTarget.connect(m_preEmphMode);
  173.     
  174.     // create a horizontal frame to hold the checkbox matrix and the cd text button
  175.     FXHorizontalFrame* optionsFrame = new FXHorizontalFrame(mainTrackFrame, LAYOUT_FILL_X);
  176.     
  177.     // create a matrix to hold the next couple of rows
  178.     FXMatrix* checkMatrix = new FXMatrix(optionsFrame, 2, MATRIX_BY_COLUMNS|PACK_UNIFORM_HEIGHT);
  179.     
  180.     // add check buttons for the copy and pre-emphasis states
  181.     new FXCheckButton(checkMatrix, fbTrackDialogCopyModeLabelText,    &m_copyModeTarget,    
  182.         FXDataTarget::ID_VALUE, ICON_BEFORE_TEXT);
  183.     new FXCheckButton(checkMatrix, fbTrackDialogPreEmphModeLabelText, &m_preEmphModeTarget, 
  184.         FXDataTarget::ID_VALUE, ICON_BEFORE_TEXT);
  185.         
  186.     // set the 2 and 4 channel audio mode variables and data targets
  187.     m_twoTrackMode  = m_disc->activeTrackTwoChannelAudio();
  188.     m_fourTrackMode = m_disc->activeTrackFourChannelAudio();
  189.     m_twoTrackModeTarget.connect(m_twoTrackMode);
  190.     m_fourTrackModeTarget.connect(m_fourTrackMode);
  191.     
  192.     // add check buttons for the two and four channel modes
  193.     new FXCheckButton(checkMatrix, fbTrackDialogTwoChannelLabelText,  &m_twoTrackModeTarget,    
  194.         FXDataTarget::ID_VALUE, ICON_BEFORE_TEXT);
  195.     new FXCheckButton(checkMatrix, fbTrackDialogFourChannelLabelText, &m_fourTrackModeTarget, 
  196.         FXDataTarget::ID_VALUE, ICON_BEFORE_TEXT);
  197.         
  198.     // add a button to edit the CD Text
  199.     FXButton* trackTextButton = new FXButton(optionsFrame, fbTrackDialogCdTextButtonText, NULL, this, 
  200.         ID_EDIT_TRACK_TEXT, FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y, 0, 0, 0, 0, 20, 20);
  201.     // if cd text isn't enabled for the disc, disable the button
  202.     if (!m_disc->usingCdText())
  203.         trackTextButton->disable();
  204.         
  205.     // add the label and text areas for the ISRC stuff
  206.     new FXLabel(mainTrackFrame, fbTrackDialogIsrcLabelText, NULL);
  207.     
  208.     FXHorizontalFrame* isrcFrame = new FXHorizontalFrame(mainTrackFrame, LAYOUT_FILL_X|PACK_UNIFORM_WIDTH);
  209.     
  210.     new FXLabel(isrcFrame, fbTrackDialogIsrcCountryLabelText, NULL);
  211.     m_isrcCountry = new FXTextField(isrcFrame, ISRC_COUNTRY, this, ID_LAST, 
  212.         TEXTFIELD_LIMITED|FRAME_SUNKEN|FRAME_THICK);
  213.     
  214.     new FXLabel(isrcFrame, fbTrackDialogIsrcOwnerLabelText,   NULL);
  215.     m_isrcOwner   = new FXTextField(isrcFrame, ISRC_OWNER,   this, ID_LAST, 
  216.         TEXTFIELD_LIMITED|FRAME_SUNKEN|FRAME_THICK);
  217.     
  218.     new FXLabel(isrcFrame, fbTrackDialogIsrcYearLabelText,    NULL);
  219.     m_isrcYear    = new FXTextField(isrcFrame, ISRC_YEAR,    this, ID_LAST, 
  220.         TEXTFIELD_LIMITED|FRAME_SUNKEN|FRAME_THICK);
  221.     
  222.     new FXLabel(isrcFrame, fbTrackDialogIsrcSerialLabelText,  NULL);
  223.     m_isrcSerial  = new FXTextField(isrcFrame, ISRC_SERIAL,  this, ID_LAST, 
  224.         TEXTFIELD_LIMITED|FRAME_SUNKEN|FRAME_THICK);
  225.     
  226.     // set the contents of the isrc fields
  227.     FXString isrc = m_disc->activeTrackIsrc();
  228.     m_isrcCountry->setText(isrc.mid(0, 2));
  229.     m_isrcOwner->setText(isrc.mid(3, 3));
  230.     m_isrcYear->setText(isrc.mid(7, 2));
  231.     m_isrcSerial->setText(isrc.mid(10, 5));
  232.     
  233.     // add a horizontal separator
  234.     new FXHorizontalSeparator(mainTrackFrame, SEPARATOR_RIDGE|LAYOUT_FILL_X);
  235.     
  236.     // add a horizontal frame for the track commands
  237.     FXHorizontalFrame* trackCommandFrame = new FXHorizontalFrame(mainTrackFrame, LAYOUT_FILL_X);
  238.     
  239.     // add a vertical frame for the add track commands
  240.     FXVerticalFrame* addTrackCommandFrame = new FXVerticalFrame(trackCommandFrame, LAYOUT_FILL_X);
  241.     
  242.     // Add the label for the add track data panel
  243.     new FXLabel(addTrackCommandFrame, "Add Track DatattLayout the data that will be a part of this track", NULL);
  244.     
  245.     // add the row for selecting the type of data to add
  246.     FXHorizontalFrame* addCommandFrame = new FXHorizontalFrame(addTrackCommandFrame);
  247.     new FXLabel(addCommandFrame, "Add", NULL);
  248.     m_trackDataTypePopup = new FXPopup(this);
  249.     new FXOption(m_trackDataTypePopup, "Audio",   NULL, this, ID_LAST, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  250.     new FXOption(m_trackDataTypePopup, "Data",    NULL, this, ID_LAST, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  251.     new FXOption(m_trackDataTypePopup, "Silence", NULL, this, ID_LAST, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  252.     new FXOption(m_trackDataTypePopup, "Zero",    NULL, this, ID_LAST, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  253.     new FXOption(m_trackDataTypePopup, "Start",   NULL, this, ID_LAST, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  254.     new FXOption(m_trackDataTypePopup, "Pregap",  NULL, this, ID_LAST, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  255.     new FXOption(m_trackDataTypePopup, "Index",   NULL, this, ID_LAST, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  256.     FXOptionMenu* trackDataType = new FXOptionMenu(addCommandFrame, m_trackDataTypePopup, 
  257.         LAYOUT_TOP|FRAME_RAISED|FRAME_THICK|JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  258.     new FXButton (addCommandFrame, "Add Data", NULL, this, ID_LAST, FRAME_RAISED|FRAME_THICK);
  259.     
  260.     // add the file row
  261.     FXHorizontalFrame* fileAddFrame = new FXHorizontalFrame(addTrackCommandFrame);
  262.     new FXLabel(fileAddFrame, "File:ttName of the file to add as track data", NULL);
  263.     new FXTextField(fileAddFrame, 20,  this, ID_LAST, TEXTFIELD_NORMAL|FRAME_SUNKEN|FRAME_THICK);
  264.     new FXButton(fileAddFrame, "Find", NULL, this, ID_LAST, FRAME_RAISED|FRAME_THICK);
  265.     
  266.     // add the length (bytes) row
  267.     FXHorizontalFrame* lengthBytesFrame = new FXHorizontalFrame(addTrackCommandFrame);
  268.     new FXLabel(lengthBytesFrame, "Length (Bytes):ttLength in bytes of the data to add, use 0 if you want to use the whole file", NULL);
  269.     new FXTextField(lengthBytesFrame, 15,  this, ID_LAST, TEXTFIELD_NORMAL|FRAME_SUNKEN|FRAME_THICK);
  270.     
  271.     // add the length (time) row
  272.     FXHorizontalFrame* lengthTimeFrame = new FXHorizontalFrame(addTrackCommandFrame);
  273.     new FXLabel(lengthTimeFrame, "Length (Time):ttLength in time of the data to add, use 0:0:0 if you want to use the whole file", NULL);
  274.     FXSpinner* lengthMinutesSpinner = new FXSpinner(lengthTimeFrame, 2, this, ID_LAST, SPIN_NORMAL|FRAME_SUNKEN|FRAME_THICK);
  275.         lengthMinutesSpinner->setRange(MIN_MINUTES, m_disc->discFreeSpace()/BLOCKS_IN_ONE_MINUTE);
  276.     new FXLabel(lengthTimeFrame, ":", NULL);
  277.     FXSpinner* lengthSecondsSpinner = new FXSpinner(lengthTimeFrame, 2, this, ID_LAST, SPIN_NORMAL|FRAME_SUNKEN|FRAME_THICK);
  278.         lengthSecondsSpinner->setRange(MIN_SECONDS, MAX_SECONDS);
  279.     new FXLabel(lengthTimeFrame, ":", NULL);
  280.     FXSpinner* lengthFramesSpinner = new FXSpinner(lengthTimeFrame, 2, this, ID_LAST, SPIN_NORMAL|FRAME_SUNKEN|FRAME_THICK);
  281.         lengthFramesSpinner->setRange(MIN_FRAMES, MAX_FRAMES);
  282.     
  283.     // add the start time row
  284.     FXHorizontalFrame* startTimeFrame = new FXHorizontalFrame(addTrackCommandFrame);
  285.     new FXLabel(startTimeFrame, "Start (Time):ttTime to start the audio file track at", NULL);
  286.     FXSpinner* startMinutesSpinner = new FXSpinner(startTimeFrame, 2, this, ID_LAST, SPIN_NORMAL|FRAME_SUNKEN|FRAME_THICK);
  287.         startMinutesSpinner->setRange(MIN_MINUTES, m_disc->discFreeSpace()/BLOCKS_IN_ONE_MINUTE);
  288.     new FXLabel(startTimeFrame, ":", NULL);
  289.     FXSpinner* startSecondsSpinner = new FXSpinner(startTimeFrame, 2, this, ID_LAST, SPIN_NORMAL|FRAME_SUNKEN|FRAME_THICK);
  290.         startSecondsSpinner->setRange(MIN_SECONDS, MAX_SECONDS);
  291.     new FXLabel(startTimeFrame, ":", NULL);
  292.     FXSpinner* startFramesSpinner = new FXSpinner(startTimeFrame, 2, this, ID_LAST, SPIN_NORMAL|FRAME_SUNKEN|FRAME_THICK);
  293.         startFramesSpinner->setRange(MIN_FRAMES, MAX_FRAMES);
  294.     
  295.     // add a vertical separator to the track data functions frame
  296.     new FXVerticalSeparator(trackCommandFrame, SEPARATOR_GROOVE|LAYOUT_FILL_Y);
  297.     
  298.     // add the delete track frame
  299.     FXVerticalFrame* deleteTrackCommandFrame = new FXVerticalFrame(trackCommandFrame, LAYOUT_FILL_X);
  300.     
  301.     // add the delete data item row
  302.     FXHorizontalFrame* deleteDataItemFrame = new FXHorizontalFrame(deleteTrackCommandFrame);
  303.     new FXLabel(deleteDataItemFrame, "Delete Track Data Item #:", NULL);
  304.     new FXSpinner(deleteDataItemFrame, 3, this, ID_LAST, SPIN_NORMAL|FRAME_SUNKEN|FRAME_THICK);
  305.     
  306.     // add the label for the item preview
  307.     FXHorizontalFrame* deleteDataItemPreviewFrame = new FXHorizontalFrame(deleteTrackCommandFrame, 0, 0, 0, 0, 0, 10, 10, 10, 10);
  308.     new FXLabel(deleteDataItemPreviewFrame, "AUDIOFILE "musicfile.cdr" 0", NULL);
  309.     
  310.     // add the button for deleting the item
  311.     new FXButton(deleteTrackCommandFrame, "Delete", NULL, this, ID_LAST, FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT);
  312.     
  313.     // set up the buttons for canceling or accepting changes
  314.     new FXHorizontalSeparator(mainTrackFrame, SEPARATOR_GROOVE|LAYOUT_FILL_X);
  315.     FXHorizontalFrame* buttonFrame = new FXHorizontalFrame(mainTrackFrame, 
  316.         LAYOUT_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH);
  317.     new FXButton(buttonFrame, fbTrackDialogOkButtonText, NULL, this, FXDialogBox::ID_ACCEPT,
  318.         BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 20, 20);
  319. }
  320. // Clean up 
  321. CFreeburnTrackDialog::~CFreeburnTrackDialog()
  322. {
  323.     // set the track type
  324.     switch(m_disc->discType())
  325.     {
  326.         case CD_DA:
  327.             m_disc->activeTrackMode(AUDIO); break;
  328.         case CD_ROM:
  329.             switch(m_trackMode)
  330.             {
  331.                 case MODE1_AUDIO_TRACK:
  332.                     m_disc->activeTrackMode(AUDIO);      break;
  333.                 case MODE1_DATA_TRACK:
  334.                     m_disc->activeTrackMode(MODE_1);     break;
  335.                 case MODE1_RAW:
  336.                     m_disc->activeTrackMode(MODE_1_RAW); break;
  337.             }
  338.             break;
  339.         case CDROM_XA:
  340.             switch(m_trackMode)
  341.             {
  342.                 case MODE2_AUDIO:
  343.                     m_disc->activeTrackMode(AUDIO);         break;
  344.                 case MODE2_DATA_TRACK:
  345.                     m_disc->activeTrackMode(MODE_2_FORM_1); break;
  346.                 case MODE2_AUDIO_TRACK:
  347.                     m_disc->activeTrackMode(MODE_2_FORM_2); break;
  348.                 case MODE2_RAW:
  349.                     m_disc->activeTrackMode(MODE_2_RAW);    break;
  350.             }
  351.             break;
  352.     }
  353.     
  354.     // set the copy and pre-emphasis properties
  355.     if (m_copyMode)
  356.         m_disc->activeTrackCopyMode(COPY);
  357.     else
  358.         m_disc->activeTrackCopyMode(NO_COPY);
  359.     
  360.     if (m_preEmphMode)
  361.         m_disc->activeTrackPreEmphMode(PRE_EMPHASIS);
  362.     else
  363.         m_disc->activeTrackPreEmphMode(NO_PRE_EMPHASIS);
  364.         
  365.     // set the two and four channel audio properties
  366.     m_disc->activeTrackTwoChannelAudio(m_twoTrackMode);
  367.     m_disc->activeTrackFourChannelAudio(m_fourTrackMode);
  368.     
  369.     // set the isrc string
  370.     FXString isrc;
  371.     isrc.format("%s-%s-%s-%s", m_isrcCountry->getText(), m_isrcOwner->getText(), 
  372.         m_isrcYear->getText(), m_isrcSerial->getText());
  373.     m_disc->activeTrackIsrc(isrc);
  374.     // delete the stuff needed to be deleted
  375.     delete m_trackModePopup;
  376.     delete m_trackDataTypePopup;    
  377. }
  378. // method for launching the track CD Text editor dialog
  379. long CFreeburnTrackDialog::onCmdEditTrackText (FXObject*, FXSelector, void*)
  380. {
  381.     // First, set the cd text isrc string to the current isrc in the main window
  382.     FXString isrc;
  383.     isrc.format("%s-%s-%s-%s", m_isrcCountry->getText(), m_isrcOwner->getText(), 
  384.         m_isrcYear->getText(), m_isrcSerial->getText());
  385.     m_disc->activeTrackIsrc(isrc);
  386.     
  387.     // next, back up all the CD Text strings
  388.     FXString titleString      = m_disc->activeTrackTitle();
  389.     FXString performerString  = m_disc->activeTrackPerformer();
  390.     FXString songwriterString = m_disc->activeTrackSongWriter();
  391.     FXString composerString   = m_disc->activeTrackComposer();
  392.     FXString arrangerString   = m_disc->activeTrackArranger();
  393.     FXString messageString    = m_disc->activeTrackMessage();
  394.     FXString isrcString       = m_disc->activeTrackIsrc();
  395.     
  396.     // Now, create the dialog
  397.     CFreeburnTrackTextDialog trackTextDialog(this);
  398.     
  399.     // set the property strings in the dialog
  400.     trackTextDialog.setTitleString(titleString);
  401.     trackTextDialog.setPerformerString(performerString);
  402.     trackTextDialog.setSongwriterString(songwriterString);
  403.     trackTextDialog.setComposerString(composerString);
  404.     trackTextDialog.setArrangerString(arrangerString);
  405.     trackTextDialog.setMessageString(messageString);
  406.     trackTextDialog.setIsrcString(isrcString);
  407.     
  408.     // execute the dialog
  409.     if (trackTextDialog.execute(PLACEMENT_OWNER))
  410.     {
  411.         m_disc->activeTrackTitle(trackTextDialog.getTitleString());
  412.         m_disc->activeTrackPerformer(trackTextDialog.getPerformerString());
  413.         m_disc->activeTrackSongWriter(trackTextDialog.getSongwriterString());
  414.         m_disc->activeTrackComposer(trackTextDialog.getComposerString());
  415.         m_disc->activeTrackArranger(trackTextDialog.getArrangerString());
  416.         m_disc->activeTrackMessage(trackTextDialog.getMessageString());
  417.         m_disc->activeTrackIsrc(trackTextDialog.getIsrcString());
  418.         
  419.         // update the isrc in the dialog
  420.         isrc.clear();
  421.         isrc = trackTextDialog.getIsrcString();
  422.         m_isrcCountry->setText(isrc.mid(0, 2));
  423.         m_isrcOwner->setText(isrc.mid(3, 3));
  424.         m_isrcYear->setText(isrc.mid(7, 2));
  425.         m_isrcSerial->setText(isrc.mid(10, 5));
  426.     }
  427.     else
  428.     {
  429.         // dialog was cancelled, so revert the strings back to what they should be
  430.         m_disc->activeTrackTitle(titleString);
  431.         m_disc->activeTrackPerformer(performerString);
  432.         m_disc->activeTrackSongWriter(songwriterString);
  433.         m_disc->activeTrackComposer(composerString);
  434.         m_disc->activeTrackArranger(arrangerString);
  435.         m_disc->activeTrackMessage(messageString);
  436.         m_disc->activeTrackIsrc(isrcString);
  437.     }
  438.         
  439.     return 1;
  440. }