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

DVD

开发平台:

Visual C++

  1. /* This is the main class definition for the FreeBurn application,
  2.  * including methods and program layout.
  3.  *
  4.  * Copyright (C) 2001, 2002  Adam Schlag
  5.  */
  6. /*
  7.  * FreeBurn Software License
  8.  * (based on the Apache Software License)
  9.  * 
  10.  * Version 1.1
  11.  * 
  12.  * Copyright (c) 2001, 2002 The FreeBurn Project. All rights reserved.
  13.  * 
  14.  * Redistribution and use in source and binary forms, with or without 
  15.  * modification, are permitted provided that the following conditions are met:
  16.  * 
  17.  * 1. Redistributions of source code must retain the above copyright 
  18.  * notice, this list of conditions and the following disclaimer.
  19.  * 
  20.  * 2. Redistributions in binary form must reproduce the above copyright 
  21.  * notice, this list of conditions and the following disclaimer in the 
  22.  * documentation and/or other materials provided with the distribution.
  23.  * 
  24.  * 3. The end-user documentation included with the redistribution, if any, must 
  25.  * include the following acknowledgment:
  26.  * 
  27.  *  "This product includes software developed by the FreeBurn 
  28.  *     Project (http://freeburn.sourceforge.net/)."
  29.  * 
  30.  * Alternately, this acknowledgment may appear in the software itself, 
  31.  * if and wherever such third-party acknowledgments normally appear.
  32.  * 
  33.  * 4. The names "FreeBurn" and "FreeBurn Project" must not be 
  34.  * used to endorse or promote products derived from this software 
  35.  * without prior written permission. For written permission, please 
  36.  * contact aschlag@users.sourceforge.net.
  37.  * 
  38.  * 5. Products derived from this software may not be called "FreeBurn", 
  39.  * nor may "FreeBurn" appear in their name, without prior written 
  40.  * permission of the FreeBurn Project.
  41.  * 
  42.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 
  43.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
  44.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  45.  * DISCLAIMED. IN NO EVENT SHALL THE FREEBURN PROJECT OR ITS 
  46.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
  47.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
  48.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 
  49.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
  50.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
  51.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
  52.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  53.  * SUCH DAMAGE.
  54.  * 
  55.  * This software consists of voluntary contributions made by many 
  56.  * individuals on behalf of the FreeBurn Project. For more 
  57.  * information on the FreeBurn Project and FreeBurn, please see 
  58.  * <http://freeburn.sourceforge.net/>.
  59.  * 
  60.  * This software is distributed with software that is released under the GNU 
  61.  * General Public License (GPL).  You can find the terms of this license in the
  62.  * file GPL.txt distributed in this package.  You can find information on the
  63.  * software distributed with this package in the file PROGRAMS.txt.
  64.  */
  65. // The main FOX include file, and the PNG Icon include file (it's not in fx.h)
  66. #include <fx.h>
  67. #include <FXPNGIcon.h>
  68. #include "fbspinner.h"
  69. #ifdef WIN32
  70. #include <windows.h>
  71. #endif
  72. // Application include files go here
  73. // the main freeburn definition class and additional
  74. // helper and gui classes go here
  75. #include "FreeburnDefs.h"
  76. #include "FreeburnText.h"
  77. #include "FreeburnHelpText.h"
  78. #ifndef FREEBURN_ICONS_H
  79. #include "FreeburnIcons.h"
  80. #define FREEBURN_ICONS_H
  81. #endif
  82. #include "FreeburnHelper.h"
  83. // these contain the classes for the disc and track layouts,
  84. // and their helper and utility methods
  85. #include "FreeburnTrack.h"
  86. #include "FreeburnDisc.h"
  87. // these contain the includes for the various dialog classes
  88. #include "FreeburnNewDiscDialog.h"
  89. #include "FreeburnBurnDiscDialog.h"
  90. #include "FreeburnDiscImageDialog.h"
  91. #include "FreeburnCommandDialog.h"
  92. #include "FreeburnPreferences.h"
  93. #include "FreeburnGlobalTextDialog.h"
  94. #include "FreeburnTrackDialog.h"
  95. #include "HelpWindow.h"
  96. #include "FreeburnAbout.h"
  97. // these contain the system-level process and threading classes
  98. #include "FreeburnSystem.h"
  99. // finally, the main freeburn include header
  100. #include "FreeBurn.h"
  101. // Message Map for FreeBurn class
  102. FXDEFMAP(CFreeBurn) CFreeBurnMap[]={
  103.     //________Message_Type_______________ID_______________________Message_Handler___________
  104.     
  105.     // These are for the thread events to process the output of external commands
  106.     FXMAPFUNC(SEL_IO_EXCEPT, CFreeBurn::ID_GET_THREAD_BUFFER, CFreeBurn::getThreadBuffer),
  107.     FXMAPFUNC(SEL_IO_EXCEPT, CFreeBurn::ID_THREAD_COMPLETE,   CFreeBurn::threadComplete),    
  108.     
  109.     // These are for handling messages to change the application colors
  110.     FXMAPFUNCS(SEL_COMMAND,  CFreeBurn::ID_BASECOLOR,
  111.                              CFreeBurn::ID_BORDCOLOR,         CFreeBurn::onCmdColor),
  112.     FXMAPFUNCS(SEL_CHANGED,  CFreeBurn::ID_BASECOLOR,
  113.                              CFreeBurn::ID_BORDCOLOR,         CFreeBurn::onCmdColor),
  114.     FXMAPFUNCS(SEL_UPDATE,   CFreeBurn::ID_BASECOLOR,
  115.                              CFreeBurn::ID_BORDCOLOR,         CFreeBurn::onUpdColor),
  116.     FXMAPFUNCS(SEL_COMMAND,  CFreeBurn::ID_BASECOLOR_DEFAULT,
  117.                              CFreeBurn::ID_BORDCOLOR_DEFAULT, CFreeBurn::onCmdColorDefault),    
  118.     
  119.     // These are handling messages for commands, updates, etc. for the main program controls
  120.     FXMAPFUNCS(SEL_UPDATE,   CFreeBurn::ID_DISC_SIZE,
  121.                              CFreeBurn::ID_PERCENT_FULL,      CFreeBurn::updMainControls),
  122.     FXMAPFUNC(SEL_CHANGED,   CFreeBurn::ID_CAT_NUM,           CFreeBurn::updCatalogNum),
  123.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_USE_CD_TEXT,       CFreeBurn::cmdUseCdText),
  124.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_EDIT_CD_TEXT,      CFreeBurn::cmdEditCdText),
  125.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_ADD_TRACK,         CFreeBurn::cmdAddTrack),
  126.     FXMAPFUNCS(SEL_COMMAND,  CFreeBurn::ID_AUDIO_TRACK,
  127.                              CFreeBurn::ID_XA_RAW_TRACK,      CFreeBurn::cmdTrackType),
  128.     FXMAPFUNCS(SEL_COMMAND,  CFreeBurn::ID_EDIT_TRACK,
  129.                              CFreeBurn::ID_DELETE_TRACK,      CFreeBurn::cmdModTrackCommand),
  130.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_MODIFY_TRACK,      CFreeBurn::cmdModifyTrack),
  131.     
  132.     // These are handling messages to open the various dialogs and process basic toolbar/menu commands
  133.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_NEW,               CFreeBurn::newDiscLayout),
  134.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_OPEN,              CFreeBurn::openDiscToc),
  135.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_SAVE,              CFreeBurn::saveDiscToc),
  136.     FXMAPFUNC(SEL_UPDATE,    CFreeBurn::ID_SAVE,              CFreeBurn::updSave),
  137.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_CLOSE,             CFreeBurn::closeDiscLayout),
  138.     FXMAPFUNC(SEL_UPDATE,    CFreeBurn::ID_CLOSE,             CFreeBurn::updClose),
  139.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_BURN_CD,           CFreeBurn::burnDisc),
  140.     FXMAPFUNC(SEL_UPDATE,    CFreeBurn::ID_BURN_CD,           CFreeBurn::updBurnDisc),
  141.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_CD_IMAGE,          CFreeBurn::imageDisc),
  142.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_PREFERENCES,       CFreeBurn::editPreferences),
  143.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_HELP,              CFreeBurn::showHelp),
  144.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_HELP_CDRECORD,     CFreeBurn::showHelpCdrecord),
  145.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_HELP_MKISOFS,      CFreeBurn::showHelpMkisofs),
  146.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_HELP_CDRDAO,       CFreeBurn::showHelpCdrdao),
  147.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_ABOUT,             CFreeBurn::aboutFreeburn),    
  148.     
  149.     // these handle messages for the various ways the application can be terminated
  150.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_EXIT,              CFreeBurn::exitApp),
  151.     FXMAPFUNC(SEL_SIGNAL,    CFreeBurn::ID_EXIT,              CFreeBurn::exitApp),
  152.     FXMAPFUNC(SEL_CLOSE,     CFreeBurn::ID_TITLE,             CFreeBurn::exitApp), 
  153.        
  154.     // these handle messages to get or set the values of various settings in the application
  155.     FXMAPFUNC(SEL_COMMAND,   CFreeBurn::ID_ICONTHEME,         CFreeBurn::onCmdIconTheme),
  156.     FXMAPFUNC(SEL_UPDATE,    CFreeBurn::ID_ICONTHEME,         CFreeBurn::onUpdIconTheme),    
  157. };
  158. // Macro for the CFreeBurn class hierarchy implementation
  159. FXIMPLEMENT(CFreeBurn,FXMainWindow,CFreeBurnMap,ARRAYNUMBER(CFreeBurnMap))
  160. // Construct the application window
  161. CFreeBurn::CFreeBurn(FXApp *app):FXMainWindow(app,fbAppTitle,NULL,NULL,DECOR_ALL,FB_XPOS,FB_YPOS,FB_WIDTH,FB_HEIGHT,0,0)
  162. {
  163.     // Setup any class variables
  164.     readThemeSettings();
  165.     m_programToExecute = TRACK_AT_ONCE;
  166.     m_programToExecuteDataTarget.connect(m_programToExecute);
  167.     m_discExists = FALSE;
  168.     m_discSaved  = TRUE;
  169.     m_trackAddType    = 0;
  170.     m_modTrackCommand = 0;
  171.     
  172.     // set up the system process/threading class
  173.     m_SystemClass          = new CFreeburnSystem();
  174.     m_ReadOutputHandle     = m_SystemClass->getProcessEventHandle();
  175.     m_ThreadCompleteHandle = m_SystemClass->getCompleteEventHandle();
  176.     
  177.     // setup mkisofs string (thanks microsoft...)
  178. FXString mkisofsString;
  179. mkisofsString.append(fbHelpMkisofsText);
  180. mkisofsString.append(fbHelpMkisofsText2);
  181.     
  182.     // set up the help windows
  183.     m_HelpWindow         = new HelpWindow(this, fbHelpText,           fbHelpTitleText,         FALSE);
  184.     m_CdrecordHelpWindow = new HelpWindow(this, fbHelpCdrecordText,   fbHelpCdrecordTitleText, TRUE);
  185.     m_MkisofsHelpWindow  = new HelpWindow(this, mkisofsString.text(), fbHelpMkisofsTitleText,  TRUE);
  186.     m_CdrdaoHelpWindow   = new HelpWindow(this, fbHelpCdrdaoText,     fbHelpCdrdaoTitleText,   TRUE);
  187.     
  188.     // Load the icons for use
  189.     loadThemeIcons();
  190.     setThemeIcons();
  191.     m_bigIcon   = new FXPNGIcon(getApp(), fbicon_big_png);
  192.     m_smallIcon = new FXPNGIcon(getApp(), fbicon_small_png);
  193.     
  194.     // Set the application icons
  195.     setIcon(m_bigIcon);
  196.     setMiniIcon(m_smallIcon);
  197.     // Make main window; set myself as the target
  198.     setTarget(this);
  199.     setSelector(ID_TITLE);
  200.     // Setup the m_menuBar
  201.     FXToolbarShell* menuBarShell = new FXToolbarShell(this, FRAME_RAISED|FRAME_THICK);
  202.     m_menuBar = new FXMenubar(this, menuBarShell, LAYOUT_SIDE_TOP|LAYOUT_FILL_X);
  203.     m_menuBarGrip = new FXToolbarGrip(m_menuBar, m_menuBar, FXMenubar::ID_TOOLBARGRIP, TOOLBARGRIP_DOUBLE);
  204.     
  205.     // populate the menubar with some menus
  206.     setupProgramMenus();
  207.     // Setup the m_toolBar
  208.     FXToolbarShell* toolBarShell = new FXToolbarShell(this,FRAME_RAISED|FRAME_THICK);
  209.     m_toolBar     = new FXToolbar(this, toolBarShell, 
  210.         LAYOUT_SIDE_TOP|LAYOUT_FILL_X|PACK_UNIFORM_HEIGHT);
  211.     m_toolBarGrip = new FXToolbarGrip(m_toolBar,m_toolBar,FXToolbar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE);
  212.     
  213.     // populate the toolbar with its buttons
  214.     setupToolBar();
  215.     // Setup the status bar
  216.     m_statusBar = new FXStatusbar(this, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER);
  217.     // Set up the main content frame and populate it with controls
  218.     setupContentFrame();
  219.   
  220.     // Make a tool tip
  221.     new FXTooltip(getApp(), 0);
  222. }
  223. // FreeBurn destructor
  224. CFreeBurn::~CFreeBurn()
  225. {
  226.     // here we delete the widgets and other data that need to
  227.     // be deleted explicitly, in a semi-logical order in the 
  228.     // reverse of the application's creation.  The memory
  229.     // allocated from the disc layout should already be closed
  230.     // from the closeDisc method.
  231.     
  232.     delete m_HelpWindow;
  233.     delete m_CdrecordHelpWindow;
  234.     delete m_MkisofsHelpWindow;
  235.     delete m_CdrdaoHelpWindow;   
  236.     
  237.     delete m_DefaultNewIcon;
  238.     delete m_DefaultOpenIcon;
  239.     delete m_DefaultSaveIcon;
  240.     delete m_DefaultCloseIcon;
  241.     delete m_DefaultBurnCdIcon;
  242.     delete m_DefaultCdImageIcon;
  243.     delete m_DefaultPreferencesIcon;
  244.     delete m_DefaultHelpIcon;
  245.     delete m_DefaultExitIcon;
  246.     delete m_DefaultThemePreviewIcon;
  247.     delete m_DefaultFindIcon;
  248.     
  249.     delete m_GnomeNewIcon;
  250.     delete m_GnomeOpenIcon;
  251.     delete m_GnomeSaveIcon;
  252.     delete m_GnomeCloseIcon;
  253.     delete m_GnomeBurnCdIcon;
  254.     delete m_GnomeCdImageIcon;
  255.     delete m_GnomePreferencesIcon;
  256.     delete m_GnomeHelpIcon;
  257.     delete m_GnomeExitIcon;
  258.     delete m_GnomeThemePreviewIcon;
  259.     delete m_GnomeFindIcon;
  260.     
  261.     delete m_KdeNewIcon;
  262.     delete m_KdeOpenIcon;
  263.     delete m_KdeSaveIcon;
  264.     delete m_KdeCloseIcon;
  265.     delete m_KdeBurnCdIcon;
  266.     delete m_KdeCdImageIcon;
  267.     delete m_KdePreferencesIcon;
  268.     delete m_KdeHelpIcon;
  269.     delete m_KdeExitIcon;
  270.     delete m_KdeThemePreviewIcon;
  271.     delete m_KdeFindIcon;
  272.     
  273.     delete m_XpNewIcon;
  274.     delete m_XpOpenIcon;
  275.     delete m_XpSaveIcon;
  276.     delete m_XpCloseIcon;
  277.     delete m_XpBurnCdIcon;
  278.     delete m_XpCdImageIcon;
  279.     delete m_XpPreferencesIcon;
  280.     delete m_XpHelpIcon;
  281.     delete m_XpExitIcon;
  282.     delete m_XpThemePreviewIcon;
  283.     delete m_XpFindIcon;
  284.     
  285.     delete m_bigIcon;
  286.     delete m_smallIcon;
  287.     
  288.     delete m_toolBar;
  289.     delete m_fileMenu;
  290.     delete m_optionsMenu;
  291.     delete m_helpMenu;
  292.     delete m_menuBar;
  293. // Create and initialize 
  294. void CFreeBurn::create(){
  295.     // read the program settings from the registry
  296.     readProgramSettings();
  297.     // Create the windows
  298.     FXMainWindow::create();
  299.   
  300.     // Make the main window appear
  301.     show(PLACEMENT_VISIBLE);
  302. }
  303. // method to run to create a new disc layout in the program
  304. long CFreeBurn::newDiscLayout(FXObject*, FXSelector, void*)
  305. {
  306.     // if the layout isn't saved, then ask if the user wants
  307.     // to save the layout
  308.     if (!m_discSaved)
  309.     {
  310.         if(!saveChanges()) return 1;
  311.     }
  312.     
  313.     // close the current disc layout
  314.     closeDisc();
  315.     
  316.     // initialize variables to hold the information about creating the disc
  317.     FXint discSize = _74_650_DISC;
  318.     FXint discType = CD_DA;
  319.     
  320.     // initialize data targets for the disc initialization variables
  321.     FXDataTarget discSizeTarget;
  322.     discSizeTarget.connect(discSize);
  323.     FXDataTarget discTypeTarget;
  324.     discTypeTarget.connect(discType);
  325.     
  326.     // Create an instance of the create disc dialog
  327.     CFreeburnNewDiscDialog newDiscDialog(this, &discSizeTarget, &discTypeTarget);
  328.     
  329.     // run the dialog
  330.     if (newDiscDialog.execute(PLACEMENT_OWNER))
  331.     {
  332.         // create the disc class if the dialog returns TRUE, and set
  333.         // the discExists and discSaved flags to TRUE.
  334.         m_mainDisc   = new CFreeburnDisc(discSize, discType);
  335.         m_discExists = TRUE;
  336.         m_discSaved  = FALSE;
  337.         
  338.         // set the track option menu
  339.         switch(discType)
  340.         {
  341.             case CD_DA:
  342.                 m_trackOptions->setPopup(m_cddaPopup);
  343.                 // set the default track type for this disc type
  344.                 m_trackAddType = AUDIO;
  345.                 break;
  346.             case CD_ROM:
  347.                 m_trackOptions->setPopup(m_cdromPopup);
  348.                 // set the default track type for this disc type
  349.                 m_trackAddType = MODE_1;
  350.                 break;
  351.             case CDROM_XA:
  352.                 m_trackOptions->setPopup(m_cdxaPopup);
  353.                 // set the default track type for this disc type
  354.                 m_trackAddType = AUDIO;
  355.                 break;
  356.         }
  357.      }
  358.         
  359.     return 1;
  360. }
  361. // method to run to open a .toc file
  362. long CFreeBurn::openDiscToc(FXObject*, FXSelector, void*)
  363. {
  364.     // if the layout isn't saved, then ask if the user wants
  365.     // to save the layout
  366.     if (!m_discSaved)
  367.     {
  368.         if(!saveChanges()) return 1;
  369.     }
  370.     
  371.     FXMessageBox::information(this,MBOX_OK|PLACEMENT_CURSOR,"Open TOC",
  372.         "Open TOC not yet fully implemented.");
  373.     
  374.     return 1;
  375. }
  376. // method to run to save a .toc file
  377. long CFreeBurn::saveDiscToc(FXObject*, FXSelector, void*)
  378. {
  379.     FXMessageBox::information(this,MBOX_OK|PLACEMENT_CURSOR,"Save TOC",
  380.         "Save TOC not yet fully implemented.");
  381.         
  382.     m_discSaved = TRUE;
  383.     
  384.     return 1;
  385. }
  386. // method to enable/disable the save buttons/commands if they are not needed
  387. long CFreeBurn::updSave(FXObject* sender, FXSelector, void* ptr)
  388. {
  389.     FXuint msg = (m_discExists && !m_discSaved) ? FXWindow::ID_ENABLE : FXWindow::ID_DISABLE;
  390.     
  391.     sender->handle(this, MKUINT(msg,SEL_COMMAND), ptr);
  392.     
  393.     return 1;
  394. }
  395. // method to close the current disc layout
  396. long CFreeBurn::closeDiscLayout(FXObject*, FXSelector, void*)
  397. {
  398.     // if the layout isn't saved, then ask if the user wants
  399.     // to save the layout
  400.     if (!m_discSaved)
  401.     {
  402.         if(!saveChanges()) return 1;
  403.     }
  404.     
  405.     // close the current disc layout
  406.     closeDisc();
  407.     
  408.     return 1;
  409. }
  410. // method to enable/disable the close commands if they are not needed
  411. long CFreeBurn::updClose(FXObject* sender, FXSelector, void* ptr)
  412. {
  413.     FXuint msg = m_discExists ? FXWindow::ID_ENABLE : FXWindow::ID_DISABLE;
  414.     
  415.     sender->handle(this, MKUINT(msg,SEL_COMMAND), ptr);
  416.     
  417.     return 1;
  418. }
  419. // method to run when the burn disc command is executed
  420. long CFreeBurn::burnDisc(FXObject*, FXSelector, void*)
  421. {
  422.     m_programToExecute = TRACK_AT_ONCE;
  423.     m_useUnixShell     = FALSE;
  424.     m_commandLineOptions.clear();
  425.     
  426.     CFreeburnBurnDiscDialog burnDialog(this, &m_programToExecuteDataTarget);
  427.     
  428.     burnDialog.setHelpIcon(m_helpIcon);
  429.     burnDialog.setCommandString(m_commandLineOptions);
  430.     burnDialog.setShellFlag(m_useUnixShell);
  431.     
  432.     if (burnDialog.execute(PLACEMENT_OWNER))
  433.     {
  434.         m_commandLineOptions = burnDialog.getCommandString();
  435.         m_useUnixShell       = burnDialog.getShellFlag();
  436.         runProgram();
  437.     }
  438.     
  439.     return 1;
  440. }
  441. // method to enable/disable the burn disc command if they are not needed
  442. long CFreeBurn::updBurnDisc(FXObject* sender, FXSelector, void* ptr)
  443. {
  444.     FXuint msg = m_discExists ? FXWindow::ID_ENABLE : FXWindow::ID_DISABLE;
  445.     
  446.     sender->handle(this, MKUINT(msg,SEL_COMMAND), ptr);
  447.     
  448.     return 1;
  449. }
  450. // method to run when the image disc command is executed
  451. long CFreeBurn::imageDisc(FXObject*, FXSelector, void*)
  452. {
  453.     m_programToExecute = RUN_MKISOFS;
  454.     m_useUnixShell     = FALSE;
  455.     m_commandLineOptions.clear();
  456.     
  457.     CFreeburnDiscImageDialog imageDialog(this);
  458.     
  459.     imageDialog.setHelpIcon(m_helpIcon);
  460.     imageDialog.setCommandString(m_commandLineOptions);
  461.     imageDialog.setShellFlag(m_useUnixShell);
  462.     
  463.     if (imageDialog.execute(PLACEMENT_OWNER))
  464.     {
  465.         m_commandLineOptions = imageDialog.getCommandString();
  466.         m_useUnixShell       = imageDialog.getShellFlag();
  467.         runProgram();
  468.     }
  469.     
  470.     return 1;
  471. }
  472. // method to run to execute an external program and set up the necessary
  473. // data and objects needed to start the program
  474. void CFreeBurn::runProgram()
  475. {
  476.     // First, set up the command line string
  477.     FXString programString;
  478.     FXString commandString;
  479.     
  480.     // assign programString to the program the user wants 
  481.     // to execute (cdrecord, cdrdao, or mkisofs)
  482.     switch(m_programToExecute)
  483.     {
  484.         case RUN_CDRECORD:
  485.             programString = m_cdrecordPath;
  486.             break;
  487.         case RUN_CDRDAO:
  488.             programString = m_cdrdaoPath;
  489.             break;
  490.         case RUN_MKISOFS:
  491.             programString = m_mkisofsPath;
  492.             break;
  493.     }
  494.     
  495.     // make sure the program exists first...if not, show an error and exit
  496.     // the method so we don't get errors running FreeBurn.
  497.     if (!(FXFile::exists(programString)))
  498.     {
  499.         FXMessageBox::error(this,MBOX_OK|PLACEMENT_OWNER,fbCmdNotExistTitleText,
  500.         fbCmdNotExistMessageText, FXFile::name(programString), programString);
  501.         
  502.         return;
  503.     }
  504.     
  505.     if (m_useUnixShell) // set up the command to execute through the UNIX shell
  506.     {
  507.         // make sure that the unix shell program exists first...
  508.         if (!(FXFile::exists(m_shellPath)))
  509.         {
  510.             FXMessageBox::error(this,MBOX_OK|PLACEMENT_OWNER,fbCmdNotExistTitleText,
  511.             fbCmdNotExistMessageText, FXFile::name(m_shellPath), m_shellPath);
  512.         
  513.             return;
  514.         }
  515.         commandString = m_shellPath;
  516.         FXString unixCommand;
  517.         FreeburnHelper::winPathToUnixPath(programString, unixCommand);
  518.         commandString.append(SHELL_COMMAND);
  519.         commandString.append(QUOTE);
  520.         commandString.append(unixCommand);
  521.         commandString.append(SPACE);
  522.         commandString.append(m_commandLineOptions);
  523.         commandString.append(QUOTE);
  524.     }
  525.     else                // set up the command to execute as it is
  526.     {
  527.         commandString = programString;
  528.         commandString.append(SPACE);
  529.         commandString.append(m_commandLineOptions);
  530.     }
  531.     
  532.     // create the command dialog
  533.     CFreeburnCommandDialog commandDialog(this);
  534.     m_CommandDialog = &commandDialog;
  535.         
  536.     // set the save icon for the dialog
  537.     commandDialog.setSaveIcon(m_SaveIcon);
  538.     
  539.     // set the text of the command to execute
  540.     commandDialog.setCommandLabelText(commandString);
  541.     
  542.     // send the command out to run
  543.     FXint returnValue; // returnValue is used to see if there is an error sending the command
  544.     returnValue = m_SystemClass->createCommandWithPipes(commandString);
  545.     // if the return value from createCommandWithPipes is anything but
  546.     // 0, there is an error.  The error number will give us a hint as to
  547.     // where the error occured.  This is the only place where we will use
  548.     // a string that isn't from one of the [CLASSNAME]Text files, since
  549.     // we are only using this for error purposes, and there probably won't
  550.     // ever be an error
  551.     if (returnValue != 0)
  552.     {
  553.         FXMessageBox::error(this,MBOX_OK|PLACEMENT_OWNER,fbCmdErrorTitleText,
  554.         fbCmdErrorMessageText, returnValue);
  555.         commandDialog.outputComplete();
  556.         m_CommandDialog = NULL;
  557.         
  558.         return;
  559.     }
  560.     // execute the dialog to display the command output
  561.     commandDialog.execute(PLACEMENT_OWNER);
  562.     
  563. }
  564. // method to run when we receive a message from the thread that 
  565. // is catching command output that it has a string for us to read
  566. long CFreeBurn::getThreadBuffer(FXObject*, FXSelector, void*)
  567. {
  568.     FXString outputString;
  569.     
  570.     m_SystemClass->getStringText(outputString);
  571.     
  572.     m_CommandDialog->sendOutputText(outputString);
  573.     
  574.     return 1;
  575. }
  576. // method to run when we receive a message from the thread that
  577. // is catching command output that is is finished reading output
  578. long CFreeBurn::threadComplete(FXObject*, FXSelector, void*)
  579. {
  580.     m_CommandDialog->outputComplete();
  581.     
  582.     m_CommandDialog = NULL;
  583.     
  584.     return 1;
  585. }    
  586. // method to run when the properties command is executed
  587. long CFreeBurn::editPreferences(FXObject*, FXSelector, void*)
  588. {
  589.     // setup local method variables so we can revert to the old
  590.     // values in case the dialog is cancelled
  591.     FXString tempShellPath    = m_shellPath;
  592.     FXString tempCdrecordPath = m_cdrecordPath;
  593.     FXString tempMkisofsPath  = m_mkisofsPath;
  594.     FXString tempCdrdaoPath   = m_cdrdaoPath;    
  595.     FXint    tempThemeValue   = m_theme;
  596.     FXColor  tempBaseColor    = getBaseColor();
  597.     FXColor  tempBackColor    = getBackgroundColor();
  598.     FXColor  tempForeColor    = getForegroundColor();
  599.     FXColor  tempBordColor    = getBorderColor();
  600.     
  601.     // show the prefs dialog
  602.     CFreeburnPreferences prefsDialog(this, m_theme);
  603.     
  604.     // set the command line strings for the programs
  605.     prefsDialog.setShellString(m_shellPath);
  606.     prefsDialog.setCdrecordString(m_cdrecordPath);
  607.     prefsDialog.setMkisofsString(m_mkisofsPath);
  608.     prefsDialog.setCdrdaoString(m_cdrdaoPath);
  609.     
  610.     // set the icon to use for the find button
  611.     prefsDialog.setFindIcon(m_FindIcon);
  612.     
  613.     // get the preview label from the prefs dialog
  614.     m_PreviewLabel = prefsDialog.getPreviewLabel();
  615.     // set the preview icon
  616.     m_PreviewLabel->setIcon(m_ThemePreviewIcon);
  617.     
  618.     // if the dialog returns false (cancel), then set the path
  619.     // strings and app colors back to what they were
  620.     if (prefsDialog.execute(PLACEMENT_OWNER))   // change anything that is different
  621.     {
  622.         // get the program strings
  623.         m_shellPath    = prefsDialog.getShellString();
  624.         m_cdrecordPath = prefsDialog.getCdrecordString();
  625.         m_mkisofsPath  = prefsDialog.getMkisofsString();
  626.         m_cdrdaoPath   = prefsDialog.getCdrdaoString();
  627.         
  628.         if (m_theme != tempThemeValue) // The icon theme is changed...
  629.         {
  630.             // change the theme icons for the toolbar buttons
  631.             changeToolBarIcons();
  632.             
  633.             // change the theme icons for the menu panes
  634.             changeMenuIcons();            
  635.         }
  636.     }
  637.     else // dialog was cancelled, so don't make any changes
  638.     {
  639.         m_shellPath      = tempShellPath;
  640.         m_cdrecordPath   = tempCdrecordPath;
  641.         m_mkisofsPath    = tempMkisofsPath;
  642.         m_cdrdaoPath     = tempCdrdaoPath;
  643.         m_theme          = tempThemeValue;
  644.         setBaseColor      (tempBaseColor);
  645.         setBackgroundColor(tempBackColor);
  646.         setForegroundColor(tempForeColor);
  647.         setBorderColor    (tempBordColor);
  648.         // revert the icons back to the proper theme
  649.         setThemeIcons();        
  650.     }
  651.     
  652.     // the application (for some reason) gets sent back at times
  653.     // when colors change, so let's raise the app back to the top
  654.     raise();
  655.     
  656.     return 1;
  657. }
  658. // method to run when the help command is executed
  659. long CFreeBurn::showHelp(FXObject*, FXSelector, void*)
  660. {
  661.     m_HelpWindow->execute(PLACEMENT_OWNER);
  662.     
  663.     return 1;
  664. }
  665. // method to run to show the cdrecord man page help window
  666. long CFreeBurn::showHelpCdrecord (FXObject*, FXSelector, void*)
  667. {
  668.     m_CdrecordHelpWindow->execute(PLACEMENT_OWNER);
  669.     
  670.     return 1;
  671. }
  672. // method to run to show the mkisofs man page help window
  673. long CFreeBurn::showHelpMkisofs  (FXObject*, FXSelector, void*)
  674. {
  675.     m_MkisofsHelpWindow->execute(PLACEMENT_OWNER);
  676.     
  677.     return 1;
  678. }
  679. // method to run to show the cdrdao man page help window
  680. long CFreeBurn::showHelpCdrdao   (FXObject*, FXSelector, void*)
  681. {
  682.     m_CdrdaoHelpWindow->execute(PLACEMENT_OWNER);
  683.     
  684.     return 1;
  685. }
  686. // method to run when the exit command is executed
  687. long CFreeBurn::exitApp(FXObject*, FXSelector, void*)
  688. {
  689.     // if the layout isn't saved, then ask if the user wants
  690.     // to save the layout
  691.     if (!m_discSaved)
  692.     {
  693.         if(!saveChanges()) return 1;
  694.     }
  695.     
  696.     // save program settings to the registry
  697.     writeProgramSettings();
  698.     
  699.     // exit the application
  700.     getApp()->exit(0);
  701.     return 1;
  702. }
  703. // method to run when about command is executed
  704. long CFreeBurn::aboutFreeburn (FXObject*, FXSelector, void*)
  705. {
  706.     // show the about dialog
  707.     CFreeburnAbout aboutDialog(this);
  708.     aboutDialog.execute(PLACEMENT_OWNER);
  709.     
  710.     return 1;
  711. }
  712. // method to handle setting the theme value
  713. long CFreeBurn::onCmdIconTheme(FXObject* sender, FXSelector, void*)
  714. {
  715.     FXint theme;
  716.     sender->handle(this, MKUINT(ID_GETINTVALUE,SEL_COMMAND), (void*)&theme);
  717.     m_theme = theme;
  718.     
  719.     // load the icons for the new theme
  720.     setThemeIcons();
  721.             
  722.     // set the new preview icon
  723.     m_PreviewLabel->setIcon(m_ThemePreviewIcon);
  724.     return 1;
  725. }
  726. // method to handle getting the theme value
  727. long CFreeBurn::onUpdIconTheme(FXObject* sender, FXSelector, void*)
  728. {
  729.     FXint theme = m_theme;
  730.     sender->handle(this,MKUINT(ID_SETINTVALUE,SEL_COMMAND),(void*)&theme);
  731.     
  732.     return 1;
  733. }
  734. // method to handle updating the main window controls
  735. long CFreeBurn::updMainControls(FXObject*, FXSelector sel, void*)
  736. {
  737.     FXString spaceString;
  738.     
  739.     // fisrt, determine if the disc exists or not
  740.     if (m_discExists)
  741.     {
  742.         // the disc exists, so switch on the selector
  743.         switch(SELID(sel))
  744.         {
  745.             case ID_DISC_SIZE:
  746.                 // disc exists, so set the text of the disc and make
  747.                 // sure the widget is enabled.
  748.                 m_sizeField->enable();
  749.                 
  750.                 // now, set the field to the specify the size
  751.                 // of the disc
  752.                 switch(m_mainDisc->discSizeType())
  753.                 {
  754.                     case _74_650_DISC:
  755.                         m_sizeField->setText(fb74650DiscText);
  756.                         break;
  757.                     case _80_700_DISC:
  758.                         m_sizeField->setText(fb80700DiscText);
  759.                         break;
  760.                 }
  761.                 
  762.                 break;
  763.             case ID_DISC_TYPE:
  764.                 // disc exists, so set the text of the disc and make
  765.                 // sure the widget is enabled.
  766.                 m_typeField->enable();
  767.                 
  768.                 // now, set the field to the specify the size
  769.                 // of the disc
  770.                 switch(m_mainDisc->discType())
  771.                 {
  772.                     case CD_DA:
  773.                         m_typeField->setText(fbAudioDiscText);
  774.                         break;
  775.                     case CD_ROM:
  776.                         m_typeField->setText(fbCdRomDiscText);
  777.                         break;
  778.                     case CDROM_XA:
  779.                         m_typeField->setText(fbCdRomXaDiscText);
  780.                         break;
  781.                 }
  782.                 
  783.                 break;
  784.             case ID_CAT_NUM:
  785.                 // disc exists, so set enable the widget
  786.                 m_catalogField->enable();
  787.                 
  788.                 break;
  789.             case ID_USE_CD_TEXT:
  790.                 // disc exists, so set enable the widget
  791.                 m_cdTextButton->enable();
  792.                 
  793.                 break;
  794.             case ID_EDIT_CD_TEXT:
  795.                 // now check if CD Text is enabled first.
  796.                 if (m_mainDisc->usingCdText())
  797.                     // CD Text is on, so set enable the widget
  798.                     m_editTextBut->enable();
  799.                 else
  800.                     // CD Text is disabled, so disable the edit 
  801.                     // CD Text button
  802.                     m_editTextBut->disable();
  803.                 
  804.                 break;
  805.             case ID_TRACK_TYPE:
  806.                 // check if the max track number is reached yet.
  807.                 if (m_mainDisc->trackCount() >= MAX_CD_TRACKS)
  808.                     m_trackOptions->disable();
  809.                 else
  810.                     m_trackOptions->enable();
  811.                 
  812.                 break;
  813.             case ID_ADD_TRACK:
  814.                 // check if the max track number is reached yet.
  815.                 if (m_mainDisc->trackCount() >= MAX_CD_TRACKS)
  816.                     m_addTrackBut->disable();
  817.                 else
  818.                     m_addTrackBut->enable();
  819.                 
  820.                 break;
  821.             case ID_MODIFY_TRACK_OPT:
  822.                 // also check if there are any tracks on the disc
  823.                 if (m_mainDisc->trackCount() >= 1)
  824.                     m_modTrackOpts->enable();
  825.                 else
  826.                     m_modTrackOpts->disable();
  827.                 
  828.                 break;
  829.             case ID_TRACK_NUM:
  830.                 // enable if there are any tracks on the disc
  831.                 if (m_mainDisc->trackCount() >= 1)
  832.                     m_modTrackNum->enable();
  833.                 else
  834.                     m_modTrackNum->disable();
  835.                 
  836.                 break;
  837.             case ID_MODIFY_TRACK:
  838.                 // enable if there are any tracks on the disc
  839.                 if (m_mainDisc->trackCount() >= 1)
  840.                     m_modTrackBut->enable();
  841.                 else
  842.                     m_modTrackBut->disable();
  843.                     
  844.                 break;
  845.             case ID_USED_SPACE:
  846.                 // set the used space to the space (in blocks) used on the disc
  847.                 m_usedSpaceField->enable();
  848.                 
  849.                 spaceString.format("%d", m_mainDisc->discCurrentSize());
  850.                 m_usedSpaceField->setText(spaceString);
  851.                 
  852.                 break;
  853.             case ID_FREE_SPACE:
  854.                 // set the free space to the space (in blocks) free on the disc
  855.                 m_freeSpaceField->enable();
  856.                 
  857.                 spaceString.format("%d", m_mainDisc->discFreeSpace());
  858.                 m_freeSpaceField->setText(spaceString);
  859.                 
  860.                 break;
  861.             case ID_PERCENT_FULL:
  862.                 // update the percent full progress bar for the disc
  863.                 m_percentFull->enable();
  864.                 m_percentFull->setProgress(m_mainDisc->discCurrentSize() / (m_mainDisc->discCurrentSize() + m_mainDisc->discFreeSpace()));
  865.                 
  866.                 break;
  867.         }
  868.     }
  869.     else
  870.     {
  871.         // the disc doesn't exist, switch on the selector
  872.         switch(SELID(sel))
  873.         {
  874.             case ID_DISC_SIZE:
  875.                 // disable the size field, since there is no disc allocated.
  876.                 // also set the text to "" (Or empty) so the field is clear
  877.                 m_sizeField->setText(EMPTY_STRING);
  878.                 m_sizeField->disable();
  879.                 
  880.                 break;
  881.             case ID_DISC_TYPE:
  882.                 // disable the size field, since there is no disc allocated.
  883.                 // also set the text to "" (Or empty) so the field is clear
  884.                 m_typeField->setText(EMPTY_STRING);
  885.                 m_typeField->disable();
  886.                 
  887.                 break;
  888.             case ID_CAT_NUM:
  889.                 // disable the field, since there is no disc allocated.
  890.                 // also set the text to "" (Or empty) so the field is clear
  891.                 m_catalogField->setText(EMPTY_STRING);
  892.                 m_catalogField->disable();
  893.                 
  894.                 break;
  895.             case ID_USE_CD_TEXT:
  896.                 // disable the field, since there is no disc allocated.
  897.                 // also set the text to "" (Or empty) so the field is clear
  898.                 m_cdTextButton->setCheck(FALSE);
  899.                 m_cdTextButton->disable();
  900.                 
  901.                 break;
  902.             case ID_EDIT_CD_TEXT:
  903.                 // disable the field, since there is no disc allocated.
  904.                 // also set the text to "" (or empty) so the field is clear
  905.                 m_editTextBut->disable();
  906.                 
  907.                 break;
  908.             case ID_TRACK_TYPE:
  909.                 // disable the track type option box
  910.                 m_trackOptions->disable();
  911.                 
  912.                 break;
  913.             case ID_ADD_TRACK:
  914.                 // disable the add track button
  915.                 m_addTrackBut->disable();
  916.                 
  917.                 break;
  918.             case ID_MODIFY_TRACK_OPT:
  919.                 // disable the modify track option box
  920.                 m_modTrackOpts->disable();
  921.                 
  922.                 break;
  923.             case ID_TRACK_NUM:
  924.                 // disable the track number spinner
  925.                 m_modTrackNum->disable();
  926.                 
  927.                 break;
  928.             case ID_MODIFY_TRACK:
  929.                 // disable the modify track button
  930.                 m_modTrackBut->disable();
  931.                 
  932.                 break;
  933.             case ID_USED_SPACE:
  934.                 // disable the used space field
  935.                 m_usedSpaceField->setText(EMPTY_STRING);
  936.                 m_usedSpaceField->disable();
  937.                 
  938.                 break;
  939.             case ID_FREE_SPACE:
  940.                 // disable the free space field
  941.                 m_freeSpaceField->setText(EMPTY_STRING);
  942.                 m_freeSpaceField->disable();
  943.                 
  944.                 break;
  945.             case ID_PERCENT_FULL:
  946.                 // disable the percent full progress bar
  947.                 m_percentFull->setProgress(0);
  948.                 m_percentFull->disable();
  949.                 
  950.                 break;
  951.         }
  952.     }
  953.     
  954.     return 1;
  955. }
  956. // method to handle updating the catalog number control
  957. long CFreeBurn::updCatalogNum(FXObject*, FXSelector, void* ptr)
  958. {
  959.     // The catalog number string has changed, so update the disc class
  960.     // with the new catalog number.
  961.     m_mainDisc->catalogNumber((FXchar *)ptr);
  962.     
  963.     return 1;
  964. }
  965. // method to update the use cd text flag
  966. long CFreeBurn::cmdUseCdText(FXObject*, FXSelector, void*)
  967. {
  968.     // set the flag in the disc class for using cd text
  969.     m_mainDisc->usingCdText(m_cdTextButton->getCheck());
  970.     
  971.     return 1;
  972. }
  973. // method to edit the global cd text
  974. long CFreeBurn::cmdEditCdText(FXObject*, FXSelector, void*)
  975. {
  976.     // First, back up all the CD Text strings
  977.     FXString titleString      = m_mainDisc->discTitle();
  978.     FXString performerString  = m_mainDisc->discPerformer();
  979.     FXString songwriterString = m_mainDisc->discSongWriter();
  980.     FXString composerString   = m_mainDisc->discComposer();
  981.     FXString arrangerString   = m_mainDisc->discArranger();
  982.     FXString messageString    = m_mainDisc->discMessage();
  983.     FXString discidString     = m_mainDisc->discId();
  984.     FXString genreString      = m_mainDisc->discGenre();
  985.     
  986.     // Now, create the dialog
  987.     CFreeburnGlobalTextDialog globalTextDialog(this);
  988.     
  989.     // set the property strings in the dialog
  990.     globalTextDialog.setTitleString(titleString);
  991.     globalTextDialog.setPerformerString(performerString);
  992.     globalTextDialog.setSongwriterString(songwriterString);
  993.     globalTextDialog.setComposerString(composerString);
  994.     globalTextDialog.setArrangerString(arrangerString);
  995.     globalTextDialog.setMessageString(messageString);
  996.     globalTextDialog.setDiscidString(discidString);
  997.     globalTextDialog.setGenreString(genreString);
  998.     
  999.     // execute the dialog
  1000.     if (globalTextDialog.execute(PLACEMENT_OWNER))
  1001.     {
  1002.         m_mainDisc->discTitle(globalTextDialog.getTitleString());
  1003.         m_mainDisc->discPerformer(globalTextDialog.getPerformerString());
  1004.         m_mainDisc->discSongWriter(globalTextDialog.getSongwriterString());
  1005.         m_mainDisc->discComposer(globalTextDialog.getComposerString());
  1006.         m_mainDisc->discArranger(globalTextDialog.getArrangerString());
  1007.         m_mainDisc->discMessage(globalTextDialog.getMessageString());
  1008.         m_mainDisc->discId(globalTextDialog.getDiscidString());
  1009.         m_mainDisc->discGenre(globalTextDialog.getGenreString());
  1010.     }
  1011.     else
  1012.     {
  1013.         // dialog was cancelled, so revert the strings back to what they should be
  1014.         m_mainDisc->discTitle(titleString);
  1015.         m_mainDisc->discPerformer(performerString);
  1016.         m_mainDisc->discSongWriter(songwriterString);
  1017.         m_mainDisc->discComposer(composerString);
  1018.         m_mainDisc->discArranger(arrangerString);
  1019.         m_mainDisc->discMessage(messageString);
  1020.         m_mainDisc->discId(discidString);
  1021.         m_mainDisc->discGenre(genreString);
  1022.     }
  1023.         
  1024.     return 1;
  1025. }
  1026. // method to update the track type to add
  1027. long CFreeBurn::cmdTrackType(FXObject*, FXSelector sel, void*)
  1028. {
  1029.     // to set the track type, first determine what item is set
  1030.     // with a switch, then set to the appropriate type.
  1031.     switch(SELID(sel))
  1032.     {
  1033.         case ID_AUDIO_TRACK:
  1034.             m_trackAddType = AUDIO;
  1035.             break;
  1036.         case ID_DATA_TRACK:
  1037.             m_trackAddType = MODE_1;
  1038.             break;
  1039.         case ID_RAW_TRACK:
  1040.             m_trackAddType = MODE_1_RAW;
  1041.             break;
  1042.         case ID_XA_DATA_TRACK:
  1043.             m_trackAddType = MODE_2_FORM_1;
  1044.             break;
  1045.         case ID_XA_AUDIO_TRACK:
  1046.             m_trackAddType = MODE_2_FORM_2;
  1047.             break;
  1048.         case ID_XA_RAW_TRACK:
  1049.             m_trackAddType = MODE_2_RAW;
  1050.             break;
  1051.     }
  1052.     
  1053.     return 1;
  1054. }
  1055. // method to add a new track to the CD layout
  1056. long CFreeBurn::cmdAddTrack(FXObject*, FXSelector, void*)
  1057. {
  1058.     // create the new track
  1059.     m_mainDisc->createTrack(m_trackAddType);
  1060.     
  1061.     // set the new range for the spinner
  1062.     m_modTrackNum->setRange(MIN_CD_TRACKS, m_mainDisc->trackCount());
  1063.     
  1064.     // set the value in the spinner to the newly created track
  1065.     m_modTrackNum->setValue(m_mainDisc->trackCount());
  1066.     
  1067.     // create the track editor dialog
  1068.     CFreeburnTrackDialog trackDialog(this, m_mainDisc);
  1069.     
  1070.     // execute the dialog
  1071.     trackDialog.execute();
  1072.     
  1073.     return 1;
  1074. }
  1075. // method to change the command for modifying the track
  1076. long CFreeBurn::cmdModTrackCommand(FXObject*, FXSelector sel, void*)
  1077. {
  1078.     // to set the track type, first determine what item is set
  1079.     // with a switch, then set to the appropriate type.
  1080.     switch(SELID(sel))
  1081.     {
  1082.         case ID_EDIT_TRACK:
  1083.             m_modTrackCommand = EDIT_TRACK;
  1084.             break;
  1085.         case ID_DELETE_TRACK:
  1086.             m_modTrackCommand = DELETE_TRACK;
  1087.             break;
  1088.     }
  1089.     
  1090.     return 1;
  1091. }
  1092. // method to modify an existing track of the CD layout
  1093. long CFreeBurn::cmdModifyTrack(FXObject*, FXSelector, void*)
  1094. {
  1095.     if (m_modTrackCommand == EDIT_TRACK)
  1096.     {
  1097.         // set the active track number in the disc class to
  1098.         // the number the user has selected in the dialog
  1099.         m_mainDisc->setActiveTrack(m_modTrackNum->getValue());
  1100.         
  1101.         // create a track editor dialog, then execute it
  1102.         CFreeburnTrackDialog trackDialog(this, m_mainDisc);
  1103.         trackDialog.execute();
  1104.     }
  1105.     else if (m_modTrackCommand == DELETE_TRACK)
  1106.     {            
  1107.         // ask the user if it indeed wants to delete the selected track
  1108.         FXuint answer = FXMessageBox::question(this, MBOX_YES_NO_CANCEL|PLACEMENT_CURSOR,
  1109.             fbDeleteTrackTitleText, fbDeleteTrackMessageText, m_modTrackNum->getValue());
  1110.     
  1111.         // if the answer is yes, try to delete the track
  1112.         if (answer == MBOX_CLICKED_YES)
  1113.         {
  1114.             // Delete the track.  If it's successful, reset the track range.
  1115.             // If it's not, notify the user that the delete was unsuccessful.
  1116.             if (m_mainDisc->deleteTrack(m_modTrackNum->getValue()))
  1117.             {
  1118.                 // set the new range for the spinner
  1119.                 // if the track count is less than MIN_CD_TRACKS, set the range to 0..0
  1120.                 if (m_mainDisc->trackCount() < MIN_CD_TRACKS)
  1121.                     m_modTrackNum->setRange(0, 0);
  1122.                 else
  1123.                     m_modTrackNum->setRange(MIN_CD_TRACKS, m_mainDisc->trackCount());
  1124.             }
  1125.             else
  1126.             {
  1127.                 FXMessageBox::error(this, MBOX_OK|PLACEMENT_CURSOR, fbDeleteTrackErrorTitleText,
  1128.                     fbDeleteTrackErrorMessageText);
  1129.             }
  1130.         }
  1131.     
  1132.     }
  1133.     
  1134.     return 1;
  1135. }
  1136. // method to handle commands for changing the colors of the application
  1137. long CFreeBurn::onCmdColor(FXObject*, FXSelector sel, void* ptr)
  1138. {
  1139.     FXColor color = (FXColor)(long)ptr;
  1140.   
  1141.     // call the proper method based on what was actually selected
  1142.     // and give it the color to update to
  1143.     switch(SELID(sel))
  1144.     {
  1145.         case ID_BASECOLOR: 
  1146.             setBaseColor(color); 
  1147.             break;
  1148.         case ID_BACKCOLOR: 
  1149.             setBackgroundColor(color); 
  1150.             break;
  1151.         case ID_FORECOLOR: 
  1152.             setForegroundColor(color); 
  1153.             break;
  1154.         case ID_BORDCOLOR: 
  1155.             setBorderColor(color); 
  1156.             break;
  1157.     }
  1158.   
  1159.     return 1;
  1160. }
  1161. // Update colors
  1162. long CFreeBurn::onUpdColor(FXObject* sender, FXSelector sel, void*)
  1163. {
  1164.     FXColor color;
  1165.   
  1166.     // get the right color based on what we want to change
  1167.     switch(SELID(sel))
  1168.     {
  1169.         case ID_BASECOLOR: 
  1170.             color = getBaseColor(); 
  1171.             break;
  1172.         case ID_BACKCOLOR: 
  1173.             color = getBackgroundColor(); 
  1174.             break;
  1175.         case ID_FORECOLOR: 
  1176.             color = getForegroundColor(); 
  1177.             break;
  1178.         case ID_BORDCOLOR: 
  1179.             color = getBorderColor(); 
  1180.             break;
  1181.     }
  1182.   
  1183.     // send the color back to whoever asked for it
  1184.     sender->handle(this,MKUINT(ID_SETINTVALUE,SEL_COMMAND),(void*)&color);
  1185.   
  1186.     return 1;
  1187. }
  1188. // method to set the base color for the application (widget colors)
  1189. void CFreeBurn::setBaseColor(FXColor color)
  1190. {
  1191.     // Each setBackColor is followed by a setHiliteColor and
  1192.     // setShadowColor so that everything looks right.  We'll
  1193.     // create variables for these colors so they only need
  1194.     // to be calculated once each time this method is called.
  1195.     FXColor hiliteColor = makeHiliteColor(color);
  1196.     FXColor shadowColor = makeShadowColor(color);
  1197.     
  1198.     // The colors of the widgets are changed in an order where
  1199.     // the stuff the user sees is changed first, so the change
  1200.     // is quicker(the toolbar, statusbar, etc. will be seen 
  1201.     // before a menu pane).  It may not make a difference, but
  1202.     // it may on a slower computer or sometime in the future, so
  1203.     // it doesn't hurt.
  1204.     
  1205.     // First, set the color of the menu bar
  1206.     m_menuBar->setBackColor(color);
  1207.     m_menuBar->setHiliteColor(hiliteColor);
  1208.     m_menuBar->setShadowColor(shadowColor);
  1209.     
  1210.     // Now set the color of the menu bar grip
  1211.     m_menuBarGrip->setBackColor(color);
  1212.     m_menuBarGrip->setHiliteColor(hiliteColor);
  1213.     m_menuBarGrip->setShadowColor(shadowColor);
  1214.     
  1215.     // Now, set the color for the menu titles
  1216.     // The regular back color AND the selected back
  1217.     // color need to be changed so it looks right when
  1218.     // selected and not selected.
  1219.     m_FileMenuTitle->setBackColor(color);
  1220.     m_FileMenuTitle->setSelBackColor(color);
  1221.     m_FileMenuTitle->setHiliteColor(hiliteColor);
  1222.     m_FileMenuTitle->setShadowColor(shadowColor);
  1223.     
  1224.     m_OptionsMenuTitle->setBackColor(color);
  1225.     m_OptionsMenuTitle->setSelBackColor(color);
  1226.     m_OptionsMenuTitle->setHiliteColor(hiliteColor);
  1227.     m_OptionsMenuTitle->setShadowColor(shadowColor);
  1228.     
  1229.     m_HelpMenuTitle->setBackColor(color);
  1230.     m_HelpMenuTitle->setSelBackColor(color);
  1231.     m_HelpMenuTitle->setHiliteColor(hiliteColor);
  1232.     m_HelpMenuTitle->setShadowColor(shadowColor);
  1233.     
  1234.     // The toolbar is next for color change
  1235.     m_toolBar->setBackColor(color);
  1236.     m_toolBar->setHiliteColor(hiliteColor);
  1237.     m_toolBar->setShadowColor(shadowColor);
  1238.     
  1239.     // Now set the color of the toolbar grip
  1240.     m_toolBarGrip->setBackColor(color);
  1241.     m_toolBarGrip->setHiliteColor(hiliteColor);
  1242.     m_toolBarGrip->setShadowColor(shadowColor);
  1243.     
  1244.     // Now do the toolbar buttons
  1245.     m_NewDiscButton->setBackColor(color);
  1246.     m_NewDiscButton->setHiliteColor(hiliteColor);
  1247.     m_NewDiscButton->setShadowColor(shadowColor);
  1248.     
  1249.     m_OpenDiscButton->setBackColor(color);
  1250.     m_OpenDiscButton->setHiliteColor(hiliteColor);
  1251.     m_OpenDiscButton->setShadowColor(shadowColor);
  1252.     
  1253.     m_SaveDiscButton->setBackColor(color);
  1254.     m_SaveDiscButton->setHiliteColor(hiliteColor);
  1255.     m_SaveDiscButton->setShadowColor(shadowColor);
  1256.     
  1257.     m_ToolSeparator1->setBackColor(color);
  1258.     m_ToolSeparator1->setHiliteColor(hiliteColor);
  1259.     m_ToolSeparator1->setShadowColor(shadowColor);
  1260.     
  1261.     m_BurnCdButton->setBackColor(color);
  1262.     m_BurnCdButton->setHiliteColor(hiliteColor);
  1263.     m_BurnCdButton->setShadowColor(shadowColor);
  1264.     
  1265.     m_CdImageButton->setBackColor(color);
  1266.     m_CdImageButton->setHiliteColor(hiliteColor);
  1267.     m_CdImageButton->setShadowColor(shadowColor);
  1268.     
  1269.     m_ToolSeparator2->setBackColor(color);
  1270.     m_ToolSeparator2->setHiliteColor(hiliteColor);
  1271.     m_ToolSeparator2->setShadowColor(shadowColor);
  1272.     
  1273.     m_PrefsButton->setBackColor(color);
  1274.     m_PrefsButton->setHiliteColor(hiliteColor);
  1275.     m_PrefsButton->setShadowColor(shadowColor);
  1276.     
  1277.     m_HelpButton->setBackColor(color);
  1278.     m_HelpButton->setHiliteColor(hiliteColor);
  1279.     m_HelpButton->setShadowColor(shadowColor);
  1280.     
  1281.     m_ToolSeparator3->setBackColor(color);
  1282.     m_ToolSeparator3->setHiliteColor(hiliteColor);
  1283.     m_ToolSeparator3->setShadowColor(shadowColor);
  1284.     
  1285.     m_ExitButton->setBackColor(color);
  1286.     m_ExitButton->setHiliteColor(hiliteColor);
  1287.     m_ExitButton->setShadowColor(shadowColor);
  1288.     
  1289.     // change the main content window
  1290.     m_contents->setBackColor(color);
  1291.     m_contents->setHiliteColor(hiliteColor);
  1292.     m_contents->setShadowColor(shadowColor);
  1293.     
  1294.     // change the status bar colors
  1295.     // we'll also have to change the status line
  1296.     // and drag corner elements of the status bar, too
  1297.     m_statusBar->setBackColor(color);
  1298.     m_statusBar->setHiliteColor(hiliteColor);
  1299.     m_statusBar->setShadowColor(shadowColor);
  1300.     m_statusBar->getStatusline()->setBackColor(color);
  1301.     m_statusBar->getStatusline()->setHiliteColor(hiliteColor);
  1302.     m_statusBar->getStatusline()->setShadowColor(shadowColor);
  1303.     m_statusBar->getDragCorner()->setBackColor(color);
  1304.     m_statusBar->getDragCorner()->setHiliteColor(hiliteColor);
  1305.     m_statusBar->getDragCorner()->setShadowColor(shadowColor);
  1306.     
  1307.     // Now we'll change the colors for the menu panes
  1308.     m_fileMenu->setBackColor(color);
  1309.     m_fileMenu->setHiliteColor(hiliteColor);
  1310.     m_fileMenu->setShadowColor(shadowColor);
  1311.     
  1312.     m_optionsMenu->setBackColor(color);
  1313.     m_optionsMenu->setHiliteColor(hiliteColor);
  1314.     m_optionsMenu->setShadowColor(shadowColor);
  1315.     
  1316.     m_helpMenu->setBackColor(color);
  1317.     m_helpMenu->setHiliteColor(hiliteColor);
  1318.     m_helpMenu->setShadowColor(shadowColor);
  1319.         
  1320.     // Next, set the colors for the menu commands
  1321.     // (menu separators are included with the commands)
  1322.     // First, the file menu commands
  1323.     m_NewMenuCommand->setBackColor(color);
  1324.     m_NewMenuCommand->setHiliteColor(hiliteColor);
  1325.     m_NewMenuCommand->setShadowColor(shadowColor);
  1326.     
  1327.     m_OpenMenuCommand->setBackColor(color);
  1328.     m_OpenMenuCommand->setHiliteColor(hiliteColor);
  1329.     m_OpenMenuCommand->setShadowColor(shadowColor);
  1330.     
  1331.     m_SaveMenuCommand->setBackColor(color);
  1332.     m_SaveMenuCommand->setHiliteColor(hiliteColor);
  1333.     m_SaveMenuCommand->setShadowColor(shadowColor);
  1334.     
  1335.     m_FileMenuSeparator->setHiliteColor(hiliteColor);
  1336.     m_FileMenuSeparator->setShadowColor(shadowColor);
  1337.     
  1338.     m_CloseMenuCommand->setBackColor(color);
  1339.     m_CloseMenuCommand->setHiliteColor(hiliteColor);
  1340.     m_CloseMenuCommand->setShadowColor(shadowColor);
  1341.     
  1342.     m_ExitMenuCommand->setBackColor(color);
  1343.     m_ExitMenuCommand->setHiliteColor(hiliteColor);
  1344.     m_ExitMenuCommand->setShadowColor(shadowColor);
  1345.     // Then, the options menu commands
  1346.     m_PrefsMenuCommand->setBackColor(color);
  1347.     m_PrefsMenuCommand->setHiliteColor(hiliteColor);
  1348.     m_PrefsMenuCommand->setShadowColor(shadowColor);
  1349.     // Now the help menu commands
  1350.     m_HelpMenuCommand->setBackColor(color);
  1351.     m_HelpMenuCommand->setHiliteColor(hiliteColor);
  1352.     m_HelpMenuCommand->setShadowColor(shadowColor);
  1353.     
  1354.     m_CdrecordHelpMenuCommand->setBackColor(color);
  1355.     m_CdrecordHelpMenuCommand->setHiliteColor(hiliteColor);
  1356.     m_CdrecordHelpMenuCommand->setShadowColor(shadowColor);
  1357.     
  1358.     m_MkisofsHelpMenuCommand->setBackColor(color);
  1359.     m_MkisofsHelpMenuCommand->setHiliteColor(hiliteColor);
  1360.     m_MkisofsHelpMenuCommand->setShadowColor(shadowColor);
  1361.     
  1362.     m_CdrdaoHelpMenuCommand->setBackColor(color);
  1363.     m_CdrdaoHelpMenuCommand->setHiliteColor(hiliteColor);
  1364.     m_CdrdaoHelpMenuCommand->setShadowColor(shadowColor);
  1365.     
  1366.     m_HelpMenuSeparator->setHiliteColor(hiliteColor);
  1367.     m_HelpMenuSeparator->setShadowColor(shadowColor);
  1368.     
  1369.     m_AboutMenuCommand->setBackColor(color);
  1370.     m_AboutMenuCommand->setHiliteColor(hiliteColor);
  1371.     m_AboutMenuCommand->setShadowColor(shadowColor);
  1372.     
  1373.     // set the colors for the main window controls
  1374.     setMainControlsBaseColor(color, hiliteColor, shadowColor);
  1375.     
  1376.     // set the colors for the already-created help windows
  1377.     m_HelpWindow->setWindowBaseColor(color, hiliteColor, shadowColor);
  1378.     m_CdrecordHelpWindow->setWindowBaseColor(color, hiliteColor, shadowColor);
  1379.     m_MkisofsHelpWindow->setWindowBaseColor(color, hiliteColor, shadowColor);
  1380.     m_CdrdaoHelpWindow->setWindowBaseColor(color, hiliteColor, shadowColor);
  1381.     
  1382.     // finally, after all the visible changes are made, change the
  1383.     // application base color (and hilite and shadow colors) so
  1384.     // everything is changed (i.e. in child dialogs)
  1385.     getApp()->setBaseColor(color);
  1386.     getApp()->setHiliteColor(hiliteColor);
  1387.     getApp()->setShadowColor(shadowColor);
  1388. }
  1389. // method for getting the current base color
  1390. FXColor CFreeBurn::getBaseColor() const
  1391. {
  1392.     return getApp()->getBaseColor();
  1393. }
  1394. // method for changing the background color for things
  1395. // that use a background color (i.e. input widgets) 
  1396. // instead of a set base color.
  1397. void CFreeBurn::setBackgroundColor(FXColor color)
  1398. {
  1399.     // set the main window controls background colors
  1400.     setMainControlsBackgroundColor(color);
  1401.     
  1402.     // set the colors for the already-created help windows
  1403.     m_HelpWindow->setWindowBackColor(color);
  1404.     m_CdrecordHelpWindow->setWindowBackColor(color);
  1405.     m_MkisofsHelpWindow->setWindowBackColor(color);
  1406.     m_CdrdaoHelpWindow->setWindowBackColor(color); 
  1407.     
  1408.     // after all the widgets are set, now set the
  1409.     // app back color
  1410.     getApp()->setBackColor(color);
  1411. }
  1412. // method for getting the current background color
  1413. FXColor CFreeBurn::getBackgroundColor() const
  1414. {
  1415.    return getApp()->getBackColor();
  1416. }
  1417. // method for changing the foreground color for
  1418. // the widgets, including setting the text color
  1419. // for most of the widgets
  1420. void CFreeBurn::setForegroundColor(FXColor color)
  1421. {
  1422.     // Now, set the color for the menu titles
  1423.     m_FileMenuTitle->setTextColor(color);
  1424.     m_FileMenuTitle->setSelTextColor(color);
  1425.     
  1426.     m_OptionsMenuTitle->setTextColor(color);
  1427.     m_OptionsMenuTitle->setSelTextColor(color);
  1428.     
  1429.     m_HelpMenuTitle->setTextColor(color);
  1430.     m_HelpMenuTitle->setSelTextColor(color);
  1431.     
  1432.     // Now do the toolbar buttons
  1433.     m_NewDiscButton->setTextColor(color);
  1434.     
  1435.     m_OpenDiscButton->setTextColor(color);
  1436.     
  1437.     m_SaveDiscButton->setTextColor(color);
  1438.     
  1439.     m_BurnCdButton->setTextColor(color);
  1440.     
  1441.     m_CdImageButton->setTextColor(color);
  1442.     
  1443.     m_PrefsButton->setTextColor(color);
  1444.     
  1445.     m_HelpButton->setTextColor(color);
  1446.     
  1447.     m_ExitButton->setTextColor(color);
  1448.     
  1449.     // change the status bar colors
  1450.     m_statusBar->getStatusline()->setTextColor(color);
  1451.     
  1452.     // Next, set the colors for the menu commands
  1453.     // (menu separators are included with the commands)
  1454.     // First, the file menu commands
  1455.     m_NewMenuCommand->setTextColor(color);
  1456.     m_OpenMenuCommand->setTextColor(color);
  1457.     m_SaveMenuCommand->setTextColor(color);
  1458.     m_CloseMenuCommand->setTextColor(color);
  1459.     m_ExitMenuCommand->setTextColor(color);
  1460.     // Then, the options menu commands
  1461.     m_PrefsMenuCommand->setTextColor(color);
  1462.     // Now the help menu commands
  1463.     m_HelpMenuCommand->setTextColor(color);    
  1464.     m_CdrecordHelpMenuCommand->setTextColor(color);    
  1465.     m_MkisofsHelpMenuCommand->setTextColor(color);    
  1466.     m_CdrdaoHelpMenuCommand->setTextColor(color);    
  1467.     m_AboutMenuCommand->setTextColor(color);
  1468.     
  1469.     // set the main window controls foreground colors
  1470.     setMainControlsForegroundColor(color);
  1471.     
  1472.     // set the colors for the already-created help windows
  1473.     m_HelpWindow->setWindowForeColor(color);
  1474.     m_CdrecordHelpWindow->setWindowForeColor(color);
  1475.     m_MkisofsHelpWindow->setWindowForeColor(color);
  1476.     m_CdrdaoHelpWindow->setWindowForeColor(color); 
  1477.     
  1478.     // finally, after all the visible changes are made, change the
  1479.     // application foreground color 
  1480.     getApp()->setForeColor(color);
  1481. }
  1482. FXColor CFreeBurn::getForegroundColor() const
  1483. {
  1484.     return getApp()->getForeColor();
  1485. }
  1486. void CFreeBurn::setBorderColor(FXColor color)
  1487. {
  1488.     // menubar first
  1489.     m_menuBar->setBorderColor(color);
  1490.     
  1491.     // change the toolbar
  1492.     m_toolBar->setBorderColor(color);
  1493.     
  1494.     // now the toolbar buttons
  1495.     m_NewDiscButton->setBorderColor(color);
  1496.     m_OpenDiscButton->setBorderColor(color);
  1497.     m_SaveDiscButton->setBorderColor(color);
  1498.     m_BurnCdButton->setBorderColor(color);
  1499.     m_CdImageButton->setBorderColor(color);
  1500.     m_PrefsButton->setBorderColor(color);
  1501.     m_HelpButton->setBorderColor(color);
  1502.     m_ExitButton->setBorderColor(color);
  1503.     
  1504.     // next the content frame
  1505.     m_contents->setBorderColor(color);
  1506.     // now the status bar (and status line)
  1507.     m_statusBar->setBorderColor(color);
  1508.     m_statusBar->getStatusline()->setBorderColor(color);
  1509.     // then the menu panes
  1510.     m_fileMenu->setBorderColor(color);
  1511.     m_optionsMenu->setBorderColor(color);
  1512.     m_helpMenu->setBorderColor(color);
  1513.         
  1514.     // set the main window controls background colors
  1515.     setMainControlsBorderColor(color);
  1516.     
  1517.     // set the colors for the already-created help windows
  1518.     m_HelpWindow->setWindowBordColor(color);
  1519.     m_CdrecordHelpWindow->setWindowBordColor(color);
  1520.     m_MkisofsHelpWindow->setWindowBordColor(color);
  1521.     m_CdrdaoHelpWindow->setWindowBordColor(color); 
  1522.     
  1523.     // finally, set the application value
  1524.     getApp()->setBorderColor(color);
  1525. }
  1526. FXColor CFreeBurn::getBorderColor() const
  1527. {
  1528.     return getApp()->getBorderColor();
  1529. }
  1530. // method to handle commands for changing the colors of the application
  1531. long CFreeBurn::onCmdColorDefault(FXObject*, FXSelector sel, void*)
  1532. {
  1533.     switch(SELID(sel))
  1534.     {
  1535.         case ID_BASECOLOR_DEFAULT: 
  1536.             setDefaultBaseColor(); 
  1537.             break;
  1538.         case ID_BACKCOLOR_DEFAULT: 
  1539.             setDefaultBackgroundColor(); 
  1540.             break;
  1541.         case ID_FORECOLOR_DEFAULT: 
  1542.             setDefaultForegroundColor(); 
  1543.             break;
  1544.         case ID_BORDCOLOR_DEFAULT: 
  1545.             setDefaultBorderColor(); 
  1546.             break;
  1547.     }
  1548.   
  1549.     return 1;
  1550. }
  1551. // method to set the default base color
  1552. void CFreeBurn::setDefaultBaseColor()
  1553. {
  1554.     FXColor baseColor;
  1555.     
  1556. #ifndef WIN32
  1557.     baseColor = FXRGB(192,192,192);
  1558. #else
  1559.     DWORD dwColor;
  1560.     dwColor   = GetSysColor(COLOR_3DFACE);
  1561.     baseColor = FXRGB(GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor)); 
  1562.     
  1563. #endif
  1564.     setBaseColor(baseColor);
  1565. }
  1566. // method to set the default background color
  1567. void CFreeBurn::setDefaultBackgroundColor()
  1568. {
  1569.     FXColor backColor;
  1570.     
  1571. #ifndef WIN32
  1572.     backColor = FXRGB(255,255,255);
  1573. #else
  1574.     DWORD dwColor;
  1575.     dwColor   = GetSysColor(COLOR_WINDOW);
  1576.     backColor = FXRGB(GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor)); 
  1577.     
  1578. #endif
  1579.     setBackgroundColor(backColor);
  1580. }
  1581. // method to set the default foreground color
  1582. void CFreeBurn::setDefaultForegroundColor()
  1583. {
  1584.     FXColor foreColor;
  1585.     
  1586. #ifndef WIN32
  1587.     foreColor = FXRGB(0,0,0);
  1588. #else
  1589.     DWORD dwColor;
  1590.     dwColor   = GetSysColor(COLOR_BTNTEXT);
  1591.     foreColor = FXRGB(GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor)); 
  1592.     
  1593. #endif
  1594.     setForegroundColor(foreColor);
  1595. }
  1596. // method to set the default border color
  1597. void CFreeBurn::setDefaultBorderColor()
  1598. {
  1599.     FXColor borderColor;
  1600.     
  1601. #ifndef WIN32
  1602.     borderColor = FXRGB(0,0,0);
  1603. #else
  1604.     DWORD dwColor;
  1605.     dwColor     = GetSysColor(COLOR_WINDOWFRAME);
  1606.     borderColor = FXRGB(GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor)); 
  1607.     
  1608. #endif
  1609.     setBorderColor(borderColor);
  1610. }
  1611. // Load the proper icons for the program based on the configured theme
  1612. void CFreeBurn::loadThemeIcons()
  1613. {
  1614.     // first, load all the icons for all the themes so we have them to use...
  1615.     m_DefaultNewIcon          = new FXPNGIcon(getApp(), w_new_png);
  1616.     m_DefaultOpenIcon         = new FXPNGIcon(getApp(), w_open_png);
  1617.     m_DefaultSaveIcon         = new FXPNGIcon(getApp(), w_save_png);
  1618.     m_DefaultCloseIcon        = new FXPNGIcon(getApp(), w_close_png);
  1619.     m_DefaultBurnCdIcon       = new FXPNGIcon(getApp(), w_burncd_png); 
  1620.     m_DefaultCdImageIcon      = new FXPNGIcon(getApp(), w_cdimage_png); 
  1621.     m_DefaultPreferencesIcon  = new FXPNGIcon(getApp(), w_preferences_png);
  1622.     m_DefaultHelpIcon         = new FXPNGIcon(getApp(), w_help_png);
  1623.     m_DefaultExitIcon         = new FXPNGIcon(getApp(), w_exit_png);
  1624.     m_DefaultThemePreviewIcon = new FXPNGIcon(getApp(), w_theme_preview_png);
  1625.     m_DefaultFindIcon         = new FXPNGIcon(getApp(), w_find_png);
  1626.     
  1627.     m_GnomeNewIcon            = new FXPNGIcon(getApp(), g_new_png);
  1628.     m_GnomeOpenIcon           = new FXPNGIcon(getApp(), g_open_png);
  1629.     m_GnomeSaveIcon           = new FXPNGIcon(getApp(), g_save_png);
  1630.     m_GnomeCloseIcon          = new FXPNGIcon(getApp(), g_close_png);
  1631.     m_GnomeBurnCdIcon         = new FXPNGIcon(getApp(), g_burncd_png);
  1632.     m_GnomeCdImageIcon        = new FXPNGIcon(getApp(), g_cdimage_png);
  1633.     m_GnomePreferencesIcon    = new FXPNGIcon(getApp(), g_preferences_png);
  1634.     m_GnomeHelpIcon           = new FXPNGIcon(getApp(), g_help_png);
  1635.     m_GnomeExitIcon           = new FXPNGIcon(getApp(), g_exit_png);
  1636.     m_GnomeThemePreviewIcon   = new FXPNGIcon(getApp(), g_theme_preview_png);
  1637.     m_GnomeFindIcon           = new FXPNGIcon(getApp(), g_find_png);
  1638.     
  1639.     m_KdeNewIcon              = new FXPNGIcon(getApp(), k_new_png);
  1640.     m_KdeOpenIcon             = new FXPNGIcon(getApp(), k_open_png);
  1641.     m_KdeSaveIcon             = new FXPNGIcon(getApp(), k_save_png);
  1642.     m_KdeCloseIcon            = new FXPNGIcon(getApp(), k_close_png);
  1643.     m_KdeBurnCdIcon           = new FXPNGIcon(getApp(), k_burncd_png);
  1644.     m_KdeCdImageIcon          = new FXPNGIcon(getApp(), k_cdimage_png);
  1645.     m_KdePreferencesIcon      = new FXPNGIcon(getApp(), k_preferences_png);
  1646.     m_KdeHelpIcon             = new FXPNGIcon(getApp(), k_help_png);
  1647.     m_KdeExitIcon             = new FXPNGIcon(getApp(), k_exit_png);
  1648.     m_KdeThemePreviewIcon     = new FXPNGIcon(getApp(), k_theme_preview_png);
  1649.     m_KdeFindIcon             = new FXPNGIcon(getApp(), k_find_png);
  1650.     
  1651.     m_XpNewIcon               = new FXPNGIcon(getApp(), xp_new_png);
  1652.     m_XpOpenIcon              = new FXPNGIcon(getApp(), xp_open_png);
  1653.     m_XpSaveIcon              = new FXPNGIcon(getApp(), xp_save_png);
  1654.     m_XpCloseIcon             = new FXPNGIcon(getApp(), xp_close_png);
  1655.     m_XpBurnCdIcon            = new FXPNGIcon(getApp(), xp_burncd_png);
  1656.     m_XpCdImageIcon           = new FXPNGIcon(getApp(), xp_cdimage_png);
  1657.     m_XpPreferencesIcon       = new FXPNGIcon(getApp(), xp_preferences_png);
  1658.     m_XpHelpIcon              = new FXPNGIcon(getApp(), xp_help_png);
  1659.     m_XpExitIcon              = new FXPNGIcon(getApp(), xp_exit_png);
  1660.     m_XpThemePreviewIcon      = new FXPNGIcon(getApp(), xp_theme_preview_png);
  1661.     m_XpFindIcon              = new FXPNGIcon(getApp(), xp_find_png);
  1662.     
  1663.     // create all the icons for use...
  1664.     m_DefaultNewIcon->create();
  1665.     m_DefaultOpenIcon->create();
  1666.     m_DefaultSaveIcon->create();
  1667.     m_DefaultCloseIcon->create();
  1668.     m_DefaultBurnCdIcon->create();
  1669.     m_DefaultCdImageIcon->create();
  1670.     m_DefaultPreferencesIcon->create();
  1671.     m_DefaultHelpIcon->create();
  1672.     m_DefaultExitIcon->create();
  1673.     m_DefaultThemePreviewIcon->create();
  1674.     m_DefaultFindIcon->create();
  1675.     
  1676.     m_GnomeNewIcon->create();
  1677.     m_GnomeOpenIcon->create();
  1678.     m_GnomeSaveIcon->create();
  1679.     m_GnomeCloseIcon->create();
  1680.     m_GnomeBurnCdIcon->create();
  1681.     m_GnomeCdImageIcon->create();
  1682.     m_GnomePreferencesIcon->create();
  1683.     m_GnomeHelpIcon->create();
  1684.     m_GnomeExitIcon->create();
  1685.     m_GnomeThemePreviewIcon->create();
  1686.     m_GnomeFindIcon->create();
  1687.     m_KdeNewIcon->create();
  1688.     m_KdeOpenIcon->create();
  1689.     m_KdeSaveIcon->create();
  1690.     m_KdeCloseIcon->create();
  1691.     m_KdeBurnCdIcon->create();
  1692.     m_KdeCdImageIcon->create();
  1693.     m_KdePreferencesIcon->create();
  1694.     m_KdeHelpIcon->create();
  1695.     m_KdeExitIcon->create();
  1696.     m_KdeThemePreviewIcon->create();
  1697.     m_KdeFindIcon->create();
  1698.     
  1699.     m_XpNewIcon->create();
  1700.     m_XpOpenIcon->create();
  1701.     m_XpSaveIcon->create();
  1702.     m_XpCloseIcon->create();
  1703.     m_XpBurnCdIcon->create();
  1704.     m_XpCdImageIcon->create();
  1705.     m_XpPreferencesIcon->create();
  1706.     m_XpHelpIcon->create();
  1707.     m_XpExitIcon->create();
  1708.     m_XpThemePreviewIcon->create();
  1709.     m_XpFindIcon->create();
  1710. }
  1711. // set the proper icons for the program based on the configured theme
  1712. void CFreeBurn::setThemeIcons()
  1713. {
  1714.     // set the default icons based on the current theme...
  1715.     if (m_theme == GNOME_THEME)    // GNOME theme
  1716.     {
  1717.         m_NewIcon          = m_GnomeNewIcon;
  1718.         m_OpenIcon         = m_GnomeOpenIcon;
  1719.         m_SaveIcon         = m_GnomeSaveIcon;
  1720.         m_CloseIcon        = m_GnomeCloseIcon;
  1721.         m_burnCdIcon       = m_GnomeBurnCdIcon;
  1722.         m_cdImageIcon      = m_GnomeCdImageIcon;
  1723.         m_preferencesIcon  = m_GnomePreferencesIcon;
  1724.         m_helpIcon         = m_GnomeHelpIcon;
  1725.         m_exitIcon         = m_GnomeExitIcon;
  1726.         m_ThemePreviewIcon = m_GnomeThemePreviewIcon;
  1727.         m_FindIcon         = m_GnomeFindIcon;
  1728.     }
  1729.     else if (m_theme == KDE_THEME) // KDE theme
  1730.     {
  1731.         m_NewIcon          = m_KdeNewIcon;
  1732.         m_OpenIcon         = m_KdeOpenIcon;
  1733.         m_SaveIcon         = m_KdeSaveIcon;
  1734.         m_CloseIcon        = m_KdeCloseIcon;
  1735.         m_burnCdIcon       = m_KdeBurnCdIcon;
  1736.         m_cdImageIcon      = m_KdeCdImageIcon;
  1737.         m_preferencesIcon  = m_KdePreferencesIcon;
  1738.         m_helpIcon         = m_KdeHelpIcon;
  1739.         m_exitIcon         = m_KdeExitIcon;
  1740.         m_ThemePreviewIcon = m_KdeThemePreviewIcon;
  1741.         m_FindIcon         = m_KdeFindIcon;
  1742.     }
  1743.     else if (m_theme == XP_THEME)  // XP theme
  1744.     {
  1745.         m_NewIcon          = m_XpNewIcon;
  1746.         m_OpenIcon         = m_XpOpenIcon;
  1747.         m_SaveIcon         = m_XpSaveIcon;
  1748.         m_CloseIcon        = m_XpCloseIcon;
  1749.         m_burnCdIcon       = m_XpBurnCdIcon;
  1750.         m_cdImageIcon      = m_XpCdImageIcon;
  1751.         m_preferencesIcon  = m_XpPreferencesIcon;
  1752.         m_helpIcon         = m_XpHelpIcon;
  1753.         m_exitIcon         = m_XpExitIcon;
  1754.         m_ThemePreviewIcon = m_XpThemePreviewIcon;
  1755.         m_FindIcon         = m_XpFindIcon;
  1756.     }
  1757.     else // use default theme if no valid theme is given
  1758.     {
  1759.         m_NewIcon          = m_DefaultNewIcon;
  1760.         m_OpenIcon         = m_DefaultOpenIcon;
  1761.         m_SaveIcon         = m_DefaultSaveIcon;
  1762.         m_CloseIcon        = m_DefaultCloseIcon;
  1763.         m_burnCdIcon       = m_DefaultBurnCdIcon;
  1764.         m_cdImageIcon      = m_DefaultCdImageIcon;
  1765.         m_preferencesIcon  = m_DefaultPreferencesIcon;
  1766.         m_helpIcon         = m_DefaultHelpIcon;
  1767.         m_exitIcon         = m_DefaultExitIcon;
  1768.         m_ThemePreviewIcon = m_DefaultThemePreviewIcon;
  1769.         m_FindIcon         = m_DefaultFindIcon;
  1770.     }
  1771. }
  1772. // setup the program toolbar with buttons and stuff
  1773. void CFreeBurn::setupToolBar()
  1774. {
  1775.     // setup and add the m_toolBar buttons
  1776.     m_NewDiscButton   = new FXButton(m_toolBar, fbNewButtonText,       m_NewIcon, 
  1777.         this, ID_NEW,         BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
  1778.     m_OpenDiscButton  = new FXButton(m_toolBar, fbOpenButtonText,       m_OpenIcon, 
  1779.         this, ID_OPEN,        BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
  1780.     m_SaveDiscButton  = new FXButton(m_toolBar, fbSaveButtonText,       m_SaveIcon, 
  1781.         this, ID_SAVE,        BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
  1782.     m_ToolSeparator1  = new FXVerticalSeparator(m_toolBar);
  1783.     m_BurnCdButton    = new FXButton(m_toolBar, fbBurnCDButtonText,     m_burnCdIcon, 
  1784.         this, ID_BURN_CD,     BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
  1785.     m_CdImageButton   = new FXButton(m_toolBar, fbCDImageButtonText,    m_cdImageIcon,
  1786.         this, ID_CD_IMAGE,    BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
  1787.     m_ToolSeparator2  = new FXVerticalSeparator(m_toolBar);
  1788.     m_PrefsButton     = new FXButton(m_toolBar, fbPropertiesButtonText, m_preferencesIcon, 
  1789.         this, ID_PREFERENCES, BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
  1790.     m_HelpButton    = new FXButton(m_toolBar, fbHelpButtonText,         m_helpIcon,
  1791.         this, ID_HELP,        BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
  1792.     m_ToolSeparator3  = new FXVerticalSeparator(m_toolBar);
  1793.     m_ExitButton      = new FXButton(m_toolBar, fbExitButtonText,       m_exitIcon,
  1794.         this, ID_EXIT,        BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT);
  1795.         
  1796. }
  1797. // change the icons for the buttons in the toolbar
  1798. void CFreeBurn::changeToolBarIcons()
  1799. {
  1800.     m_NewDiscButton->setIcon(m_NewIcon);
  1801.     m_OpenDiscButton->setIcon(m_OpenIcon);
  1802.     m_SaveDiscButton->setIcon(m_SaveIcon);
  1803.     m_BurnCdButton->setIcon(m_burnCdIcon);
  1804.     m_CdImageButton->setIcon(m_cdImageIcon);
  1805.     m_PrefsButton->setIcon(m_preferencesIcon);
  1806.     m_HelpButton->setIcon(m_helpIcon);
  1807.     m_ExitButton->setIcon(m_exitIcon);
  1808. }
  1809. // setup all the program menus
  1810. void CFreeBurn::setupProgramMenus()
  1811. {
  1812.     // Construct menu panes and add
  1813.     // them to the m_menuBar
  1814.     m_fileMenu = new FXMenuPane(this);
  1815.     m_FileMenuTitle = new FXMenuTitle(m_menuBar, fbFileMenuTitle,    NULL, m_fileMenu);
  1816.     
  1817.     m_optionsMenu = new FXMenuPane(this);
  1818.     m_OptionsMenuTitle = new FXMenuTitle(m_menuBar, fbOptionsMenuTitle, NULL, m_optionsMenu);
  1819.     
  1820.     m_helpMenu = new FXMenuPane(this);
  1821.     m_HelpMenuTitle = new FXMenuTitle(m_menuBar, fbHelpMenuTitle,    NULL, m_helpMenu);
  1822.     
  1823.     // setup and add the file menu commands
  1824.     m_NewMenuCommand    = new FXMenuCommand(m_fileMenu, fbFileMenuNewText,   m_NewIcon,   this, ID_NEW);
  1825.     m_OpenMenuCommand   = new FXMenuCommand(m_fileMenu, fbFileMenuOpenText,  m_OpenIcon,  this, ID_OPEN);
  1826.     m_SaveMenuCommand   = new FXMenuCommand(m_fileMenu, fbFileMenuSaveText,  m_SaveIcon,  this, ID_SAVE);
  1827.     m_FileMenuSeparator = new FXMenuSeparator(m_fileMenu);
  1828.     m_CloseMenuCommand  = new FXMenuCommand(m_fileMenu, fbFileMenuCloseText, m_CloseIcon, this, ID_CLOSE);
  1829.     m_ExitMenuCommand   = new FXMenuCommand(m_fileMenu, fbFileMenuQuitText,  m_exitIcon,  this, ID_EXIT);
  1830.     
  1831.     // setup and add the options menu commands
  1832.     m_PrefsMenuCommand = new FXMenuCommand(m_optionsMenu, fbOptionsMenuPropertiesText, 
  1833.         m_preferencesIcon, this, ID_PREFERENCES);
  1834.     
  1835.     // setup and add the help menu commands
  1836.     m_HelpMenuCommand         = new FXMenuCommand(m_helpMenu, fbHelpMenuHelpText,      
  1837.         m_helpIcon,  this, ID_HELP);
  1838.     m_CdrecordHelpMenuCommand = new FXMenuCommand(m_helpMenu, fbHelpMenuCdrecordText,  
  1839.         m_helpIcon,  this, ID_HELP_CDRECORD);
  1840.     m_MkisofsHelpMenuCommand  = new FXMenuCommand(m_helpMenu, fbHelpMenuMkisofsText,
  1841.         m_helpIcon,  this, ID_HELP_MKISOFS);
  1842.     m_CdrdaoHelpMenuCommand   = new FXMenuCommand(m_helpMenu, fbHelpMenuCdrdaoText,
  1843.         m_helpIcon,  this, ID_HELP_CDRDAO);
  1844.     m_HelpMenuSeparator = new FXMenuSeparator(m_helpMenu);
  1845.     m_AboutMenuCommand        = new FXMenuCommand(m_helpMenu, fbHelpMenuAboutText,
  1846.         m_smallIcon, this, ID_ABOUT);
  1847. }
  1848. // change the icons for all the menu commands
  1849. void CFreeBurn::changeMenuIcons()
  1850. {
  1851.     // the File menu commands...
  1852.     m_NewMenuCommand->setIcon(m_NewIcon);
  1853.     m_OpenMenuCommand->setIcon(m_OpenIcon);
  1854.     m_SaveMenuCommand->setIcon(m_SaveIcon);
  1855.     m_CloseMenuCommand->setIcon(m_CloseIcon);
  1856.     m_ExitMenuCommand->setIcon(m_exitIcon);
  1857.     // then the Options menu commands...
  1858.     m_PrefsMenuCommand->setIcon(m_preferencesIcon);
  1859.     // finally the Help menu commands (About doesn't change)
  1860.     m_HelpMenuCommand->setIcon(m_helpIcon);
  1861.     m_CdrecordHelpMenuCommand->setIcon(m_helpIcon);
  1862.     m_MkisofsHelpMenuCommand->setIcon(m_helpIcon);
  1863.     m_CdrdaoHelpMenuCommand->setIcon(m_helpIcon);
  1864. }
  1865. // set up the main content window controls
  1866. void CFreeBurn::setupContentFrame()
  1867. {
  1868.     m_contents      = new FXVerticalFrame(this, FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,
  1869.                     0, 0, 0, 0, 15, 15, 15, 15);
  1870.     
  1871.     m_mainFrame = new FXVerticalFrame(m_contents, LAYOUT_CENTER_X|LAYOUT_CENTER_Y);
  1872.     
  1873.     m_Group1 = new FXGroupBox(m_mainFrame, fbDiscConfigBoxText, GROUPBOX_NORMAL|FRAME_LINE);
  1874.     // matrix to hold all the window controls in a nice looking layout
  1875.     m_contentMatrix = new FXMatrix(m_Group1, 4, MATRIX_BY_COLUMNS|PACK_UNIFORM_HEIGHT, 
  1876.         0, 0, 0, 0, 0, 0, 0, 0, 5, 15);
  1877.     
  1878.     // row 1
  1879.     m_DiscSizeLabel = new FXLabel(m_contentMatrix, fbDiscSizeLabelText, NULL, JUSTIFY_RIGHT|LAYOUT_FILL_X);
  1880.     m_sizeField     = new FXTextField(m_contentMatrix, 20, this, ID_DISC_SIZE, 
  1881.         TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK);
  1882.     m_DiscTypeLabel = new FXLabel(m_contentMatrix, fbDiscTypeLabelText, NULL, JUSTIFY_RIGHT|LAYOUT_FILL_X);
  1883.     m_typeField     = new FXTextField(m_contentMatrix, 20, this, ID_DISC_TYPE, 
  1884.         TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK);
  1885.     
  1886.     // row 2
  1887.     m_catalogLabel  = new FXLabel(m_contentMatrix, fbCatNumLabelText, NULL, JUSTIFY_RIGHT);
  1888.     m_catalogField  = new FXTextField(m_contentMatrix, CD_CATALOG_STRING_LENGTH, this, ID_CAT_NUM, 
  1889.         TEXTFIELD_LIMITED|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X);
  1890.     m_cdTextButton  = new FXCheckButton(m_contentMatrix, fbCdTextLabelText, this, ID_USE_CD_TEXT,
  1891.         ICON_BEFORE_TEXT);
  1892.     m_editTextBut   = new FXButton(m_contentMatrix, fbEditGlobalCdTextButtonText, NULL, this, ID_EDIT_CD_TEXT,
  1893.         FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X);
  1894.     
  1895.     m_Group2 = new FXGroupBox(m_mainFrame, fbTrackFuncsBoxText, GROUPBOX_NORMAL|FRAME_LINE|LAYOUT_FILL_X);
  1896.     
  1897.     m_secondMatrix = new FXMatrix(m_Group2, 4, MATRIX_BY_COLUMNS|PACK_UNIFORM_HEIGHT|LAYOUT_CENTER_X);
  1898.     
  1899.     // row 3
  1900.     m_addTrackLabel = new FXLabel(m_secondMatrix, fbAddCdTrackLabelText, NULL, JUSTIFY_CENTER_X|LAYOUT_FILL_X);
  1901.     m_trackOptions  = new FXOptionMenu(m_secondMatrix, NULL, 
  1902.         FRAME_RAISED|FRAME_THICK|JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1903.         m_trackOptions->setTarget(this);
  1904.         m_trackOptions->setSelector(ID_TRACK_TYPE);
  1905.     m_trackLabel1   = new FXLabel(m_secondMatrix,  fbTrackLabel1Text, NULL);
  1906.     m_addTrackBut   = new FXButton(m_secondMatrix, fbAddTrackButtonText, NULL, this, ID_ADD_TRACK,
  1907.         FRAME_RAISED|FRAME_THICK);
  1908.         
  1909.     // row 4
  1910.     m_modTrackPopup = new FXPopup(this);
  1911.     m_editTrack     = new FXOption(m_modTrackPopup, fbEditTrackOptionText,   NULL, this, 
  1912.         ID_EDIT_TRACK,   JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1913.     m_deleteTrack   = new FXOption(m_modTrackPopup, fbDeleteTrackOptionText, NULL, this, 
  1914.         ID_DELETE_TRACK, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1915.     m_modTrackOpts  = new FXOptionMenu(m_secondMatrix, NULL,
  1916.         LAYOUT_TOP|FRAME_RAISED|FRAME_THICK|JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1917.         m_modTrackOpts->setTarget(this);
  1918.         m_modTrackOpts->setSelector(ID_MODIFY_TRACK_OPT);
  1919.         m_modTrackOpts->setPopup(m_modTrackPopup);
  1920.     m_modTrackLabel = new FXLabel(m_secondMatrix, fbModTrackLabelText, NULL, JUSTIFY_CENTER_X|LAYOUT_FILL_X);
  1921.     m_modTrackNum   = new FBSpinner(m_secondMatrix, 2, this, ID_TRACK_NUM, SPIN_NORMAL|FRAME_SUNKEN|FRAME_THICK);
  1922.         // set the initial range of the spinner to 0..0
  1923.         m_modTrackNum->setRange(0, 0);
  1924.         // set the help text for the spinner
  1925.         m_modTrackNum->setHelpText(fbTrackNumberHelpText);
  1926.     m_modTrackBut   = new FXButton(m_secondMatrix, fbModTrackButtonText, NULL, this, ID_MODIFY_TRACK,
  1927.         FRAME_RAISED|FRAME_THICK);
  1928.         
  1929.     // The popup for audio tracks
  1930.     m_cddaPopup     = new FXPopup(this);
  1931.     m_cddaAudio     = new FXOption(m_cddaPopup, fbAudioTrackOptionText, NULL, this, 
  1932.         ID_AUDIO_TRACK, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1933.     m_trackOptions->setPopup(m_cddaPopup);
  1934.     
  1935.     // The popup for data tracks
  1936.     m_cdromPopup    = new FXPopup(this);
  1937.     m_cdromData     = new FXOption(m_cdromPopup, fbDataTrackOptionText,    NULL, this, 
  1938.         ID_DATA_TRACK,  JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1939.     m_cdromAudio    = new FXOption(m_cdromPopup, fbAudioTrackOptionText,   NULL, this, 
  1940.         ID_AUDIO_TRACK, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1941.     m_cdromRaw      = new FXOption(m_cdromPopup, fbRawDataTrackOptionText, NULL, this, 
  1942.         ID_RAW_TRACK,   JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1943.         
  1944.     // The popup for XA tracks
  1945.     m_cdxaPopup     = new FXPopup(this);
  1946.     m_cdxaAudio     = new FXOption(m_cdxaPopup, fbAudioTrackOptionText,      NULL, this, 
  1947.         ID_AUDIO_TRACK,    JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1948.     m_cdxaData      = new FXOption(m_cdxaPopup, fbMode2DataTrackOptionText,  NULL, this, 
  1949.         ID_XA_DATA_TRACK,  JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1950.     m_cdxaAudio2    = new FXOption(m_cdxaPopup, fbMode2AudioTrackOptionText, NULL, this, 
  1951.         ID_XA_AUDIO_TRACK, JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1952.     m_cdxaRaw       = new FXOption(m_cdxaPopup, fbMode2RawTrackOptionText,   NULL, this, 
  1953.         ID_XA_RAW_TRACK,   JUSTIFY_HZ_APART|ICON_AFTER_TEXT);
  1954.         
  1955.     // The bottom area for reporting disc used and free space
  1956.     m_spaceFrame     = new FXHorizontalFrame(m_contents, LAYOUT_BOTTOM|LAYOUT_FILL_X|LAYOUT_CENTER_X);
  1957.     m_usedSpaceLabel = new FXLabel(m_spaceFrame, fbDiscUsedSpaceLabelText, NULL, LAYOUT_LEFT, 0, 0, 0, 0, 15, 5);
  1958.     m_usedSpaceField = new FXTextField(m_spaceFrame, 6, this, ID_USED_SPACE, 
  1959.         TEXTFIELD_READONLY|TEXTFIELD_INTEGER|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT);
  1960.     m_freeSpaceLabel = new FXLabel(m_spaceFrame, fbDiscFreeSpaceLabelText, NULL, LAYOUT_LEFT, 0, 0, 0, 0, 15, 5);
  1961.     m_freeSpaceField = new FXTextField(m_spaceFrame, 6, this, ID_FREE_SPACE, 
  1962.         TEXTFIELD_READONLY|TEXTFIELD_INTEGER|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT);
  1963.     m_percentFull    = new FXProgressBar(m_spaceFrame, this, ID_PERCENT_FULL, 
  1964.         FRAME_SUNKEN|FRAME_THICK|PROGRESSBAR_PERCENTAGE|PROGRESSBAR_HORIZONTAL|LAYOUT_FILL_X);
  1965. }
  1966. // set the base color for the main window controls
  1967. void CFreeBurn::setMainControlsBaseColor(FXColor color, FXColor hilite, FXColor shadow)
  1968. {
  1969.     // set the colors for all vertical frames
  1970.     m_mainFrame->setBackColor(color);
  1971.     m_mainFrame->setHiliteColor(hilite);
  1972.     m_mainFrame->setShadowColor(shadow);
  1973.     
  1974.     // set the colors for all horizontal frames
  1975.     m_spaceFrame->setBackColor(color);
  1976.     m_spaceFrame->setHiliteColor(hilite);
  1977.     m_spaceFrame->setShadowColor(shadow);
  1978.     
  1979.     // set the colors for all group boxes
  1980.     m_Group1->setBackColor(color);
  1981.     m_Group1->setHiliteColor(hilite);
  1982.     m_Group1->setShadowColor(shadow);
  1983.     m_Group2->setBackColor(color);
  1984.     m_Group2->setHiliteColor(hilite);
  1985.     m_Group2->setShadowColor(shadow);
  1986.     
  1987.     // set the colors for all matricies
  1988.     m_contentMatrix->setBackColor(color);
  1989.     m_contentMatrix->setHiliteColor(hilite);
  1990.     m_contentMatrix->setShadowColor(shadow);
  1991.     m_secondMatrix->setBackColor(color);
  1992.     m_secondMatrix->setHiliteColor(hilite);
  1993.     m_secondMatrix->setShadowColor(shadow);
  1994.     
  1995.     // set the colors for all labels
  1996.     m_DiscSizeLabel->setBackColor(color);
  1997.     m_DiscSizeLabel->setHiliteColor(hilite);
  1998.     m_DiscSizeLabel->setShadowColor(shadow);
  1999.     m_DiscTypeLabel->setBackColor(color);
  2000.     m_DiscTypeLabel->setHiliteColor(hilite);
  2001.     m_DiscTypeLabel->setShadowColor(shadow);
  2002.     m_catalogLabel->setBackColor(color);
  2003.     m_catalogLabel->setHiliteColor(hilite);
  2004.     m_catalogLabel->setShadowColor(shadow);
  2005.     m_addTrackLabel->setBackColor(color);
  2006.     m_addTrackLabel->setHiliteColor(hilite);
  2007.     m_addTrackLabel->setShadowColor(shadow);
  2008.     m_trackLabel1->setBackColor(color);
  2009.     m_trackLabel1->setHiliteColor(hilite);
  2010.     m_trackLabel1->setShadowColor(shadow);
  2011.     m_modTrackLabel->setBackColor(color);
  2012.     m_modTrackLabel->setHiliteColor(hilite);
  2013.     m_modTrackLabel->setShadowColor(shadow);
  2014.     m_usedSpaceLabel->setBackColor(color);
  2015.     m_usedSpaceLabel->setHiliteColor(hilite);
  2016.     m_usedSpaceLabel->setShadowColor(shadow);
  2017.     m_freeSpaceLabel->setBackColor(color);
  2018.     m_freeSpaceLabel->setHiliteColor(hilite);
  2019.     m_freeSpaceLabel->setShadowColor(shadow);
  2020.     
  2021.     // set the colors for all text fields
  2022.     m_sizeField->setHiliteColor(hilite);
  2023.     m_sizeField->setShadowColor(shadow);
  2024.     m_typeField->setHiliteColor(hilite);
  2025.     m_typeField->setShadowColor(shadow);
  2026.     m_catalogField->setHiliteColor(hilite);
  2027.     m_catalogField->setShadowColor(shadow);
  2028.     m_usedSpaceField->setHiliteColor(hilite);
  2029.     m_usedSpaceField->setShadowColor(shadow);
  2030.     m_freeSpaceField->setHiliteColor(hilite);
  2031.     m_freeSpaceField->setShadowColor(shadow);
  2032.     
  2033.     // set the colors for all check boxes
  2034.     m_cdTextButton->setBackColor(color);
  2035.     m_cdTextButton->setHiliteColor(hilite);
  2036.     m_cdTextButton->setShadowColor(shadow);
  2037.     
  2038.     // set the colors for all buttons
  2039.     m_editTextBut->setBackColor(color);
  2040.     m_editTextBut->setHiliteColor(hilite);
  2041.     m_editTextBut->setShadowColor(shadow);
  2042.     m_addTrackBut->setBackColor(color);
  2043.     m_addTrackBut->setHiliteColor(hilite);
  2044.     m_addTrackBut->setShadowColor(shadow);
  2045.     m_modTrackBut->setBackColor(color);
  2046.     m_modTrackBut->setHiliteColor(hilite);
  2047.     m_modTrackBut->setShadowColor(shadow);
  2048.     
  2049.     // set the colors for all option menus
  2050.     m_trackOptions->setBackColor(color);
  2051.     m_trackOptions->setHiliteColor(hilite);
  2052.     m_trackOptions->setShadowColor(shadow);
  2053.     m_modTrackOpts->setBackColor(color);
  2054.     m_modTrackOpts->setHiliteColor(hilite);
  2055.     m_modTrackOpts->setShadowColor(shadow);
  2056.     
  2057.     // set the colors for all pop-ups
  2058.     m_cddaPopup->setBackColor(color);
  2059.     m_cddaPopup->setHiliteColor(hilite);
  2060.     m_cddaPopup->setShadowColor(shadow);
  2061.     m_cdromPopup->setBackColor(color);
  2062.     m_cdromPopup->setHiliteColor(hilite);
  2063.     m_cdromPopup->setShadowColor(shadow);
  2064.     m_cdxaPopup->setBackColor(color);
  2065.     m_cdxaPopup->setHiliteColor(hilite);
  2066.     m_cdxaPopup->setShadowColor(shadow);
  2067.     m_modTrackPopup->setBackColor(color);
  2068.     m_modTrackPopup->setHiliteColor(hilite);
  2069.     m_modTrackPopup->setShadowColor(shadow);
  2070.     
  2071.     // set the colors for all options
  2072.     m_cddaAudio->setBackColor(color);
  2073.     m_cddaAudio->setHiliteColor(hilite);
  2074.     m_cddaAudio->setShadowColor(shadow);
  2075.     m_cdromData->setBackColor(color);
  2076.     m_cdromData->setHiliteColor(hilite);
  2077.     m_cdromData->setShadowColor(shadow);
  2078.     m_cdromAudio->setBackColor(color);
  2079.     m_cdromAudio->setHiliteColor(hilite);
  2080.     m_cdromAudio->setShadowColor(shadow);
  2081.     m_cdromRaw->setBackColor(color);
  2082.     m_cdromRaw->setHiliteColor(hilite);
  2083.     m_cdromRaw->setShadowColor(shadow);
  2084.     m_cdxaAudio->setBackColor(color);
  2085.     m_cdxaAudio->setHiliteColor(hilite);
  2086.     m_cdxaAudio->setShadowColor(shadow);
  2087.     m_cdxaData->setBackColor(color);
  2088.     m_cdxaData->setHiliteColor(hilite);
  2089.     m_cdxaData->setShadowColor(shadow);
  2090.     m_cdxaAudio2->setBackColor(color);
  2091.     m_cdxaAudio2->setHiliteColor(hilite);
  2092.     m_cdxaAudio2->setShadowColor(shadow);
  2093.     m_cdxaRaw->setBackColor(color);
  2094.     m_cdxaRaw->setHiliteColor(hilite);
  2095.     m_cdxaRaw->setShadowColor(shadow);
  2096.     m_editTrack->setBackColor(color);
  2097.     m_editTrack->setHiliteColor(hilite);
  2098.     m_editTrack->setShadowColor(shadow);
  2099.     m_deleteTrack->setBackColor(color);
  2100.     m_deleteTrack->setHiliteColor(hilite);
  2101.     m_deleteTrack->setShadowColor(shadow);
  2102.     
  2103.     // set the colors for all spinners
  2104.     m_modTrackNum->fbSetBaseColor(color);
  2105.     m_modTrackNum->fbSetHiliteColor(hilite);
  2106.     m_modTrackNum->fbSetShadowColor(shadow);
  2107. }
  2108. // set the background color for the main window controls
  2109. void CFreeBurn::setMainControlsBackgroundColor(FXColor color)
  2110. {
  2111.     // set the colors for all text fields
  2112.     m_sizeField->setBackColor(color);
  2113.     m_typeField->setBackColor(color);
  2114.     m_catalogField->setBackColor(color);
  2115.     m_usedSpaceField->setBackColor(color);
  2116.     m_freeSpaceField->setBackColor(color);
  2117.     
  2118.     // set the colors for all check boxes
  2119.     m_cdTextButton->setBoxColor(color);    
  2120.     
  2121.     // set the colors for all spinners
  2122.     m_modTrackNum->fbSetBackgroundColor(color);
  2123.     
  2124.     // set the colors for the progress bars
  2125.     m_percentFull->setBarBGColor(color);
  2126. }
  2127. // set the foreground color for the main window controls
  2128. void CFreeBurn::setMainControlsForegroundColor(FXColor color)
  2129. {
  2130.     // set the colors for all group boxes
  2131.     m_Group1->setTextColor(color);
  2132.     m_Group2->setTextColor(color);
  2133.     
  2134.     // set the colors for all labels
  2135.     m_DiscSizeLabel->setTextColor(color);
  2136.     m_DiscTypeLabel->setTextColor(color);
  2137.     m_catalogLabel->setTextColor(color);
  2138.     m_addTrackLabel->setTextColor(color);
  2139.     m_trackLabel1->setTextColor(color);
  2140.     m_modTrackLabel->setTextColor(color);
  2141.     m_usedSpaceLabel->setTextColor(color);
  2142.     m_freeSpaceLabel->setTextColor(color);
  2143.     
  2144.     // set the colors for all text fields
  2145.     m_sizeField->setTextColor(color);
  2146.     m_typeField->setTextColor(color);
  2147.     m_catalogField->setTextColor(color);
  2148.     m_usedSpaceField->setTextColor(color);
  2149.     m_freeSpaceField->setTextColor(color);
  2150.     
  2151.     // set the colors for all check boxes
  2152.     m_cdTextButton->setTextColor(color);    
  2153.     
  2154.     // set the colors for all buttons
  2155.     m_editTextBut->setTextColor(color);
  2156.     m_addTrackBut->setTextColor(color);
  2157.     m_modTrackBut->setTextColor(color);
  2158.     
  2159.     // set the colors for all option menus
  2160.     m_trackOptions->setTextColor(color);
  2161.     m_modTrackOpts->setTextColor(color);
  2162.     
  2163.     // set the colors for all options
  2164.     m_cddaAudio->setTextColor(color);
  2165.     m_cdromData->setTextColor(color);
  2166.     m_cdromAudio->setTextColor(color);
  2167.     m_cdromRaw->setTextColor(color);
  2168.     m_cdxaAudio->setTextColor(color);
  2169.     m_cdxaData->setTextColor(color);
  2170.     m_cdxaAudio2->setTextColor(color);
  2171.     m_cdxaRaw->setTextColor(color);
  2172.     m_editTrack->setTextColor(color);
  2173.     m_deleteTrack->setTextColor(color);
  2174.     
  2175.     // set the colors for all spinners
  2176.     m_modTrackNum->fbSetForegroundColor(color);
  2177. }
  2178. // set the border color for the main window controls
  2179. void CFreeBurn::setMainControlsBorderColor(FXColor color)
  2180. {
  2181.     // set the colors for all vertical frames
  2182.     m_mainFrame->setBorderColor(color);
  2183.     
  2184.     // set the colors for all horizontal frames
  2185.     m_spaceFrame->setBorderColor(color);
  2186.     
  2187.     // set the colors for all group boxes
  2188.     m_Group1->setBorderColor(color);
  2189.     m_Group2->setBorderColor(color);
  2190.     
  2191.     // set the colors for all matricies
  2192.     m_contentMatrix->setBorderColor(color);
  2193.     
  2194.     // set the colors for all labels
  2195.     m_DiscSizeLabel->setBorderColor(color);
  2196.     m_DiscTypeLabel->setBorderColor(color);
  2197.     m_catalogLabel->setBorderColor(color);
  2198.     m_addTrackLabel->setBorderColor(color);
  2199.     m_trackLabel1->setBorderColor(color);
  2200.     m_modTrackLabel->setBorderColor(color);
  2201.     m_usedSpaceLabel->setBorderColor(color);
  2202.     m_freeSpaceLabel->setBorderColor(color);
  2203.     
  2204.     // set the colors for all text fields
  2205.     m_sizeField->setBorderColor(color);
  2206.     m_typeField->setBorderColor(color);
  2207.     m_catalogField->setBorderColor(color);
  2208.     m_usedSpaceField->setBorderColor(color);
  2209.     m_freeSpaceField->setBorderColor(color);
  2210.     
  2211.     // set the colors for all check boxes
  2212.     m_cdTextButton->setBorderColor(color);    
  2213.     
  2214.     // set the colors for all buttons
  2215.     m_editTextBut->setBorderColor(color);
  2216.     m_addTrackBut->setBorderColor(color);
  2217.     m_modTrackBut->setBorderColor(color);
  2218.     
  2219.     // set the colors for all option menus
  2220.     m_trackOptions->setBorderColor(color);
  2221.     m_modTrackOpts->setBorderColor(color);
  2222.     
  2223.     // set the colors for all pop-ups
  2224.     m_cddaPopup->setBorderColor(color);
  2225.     m_cdromPopup->setBorderColor(color);
  2226.     m_cdxaPopup->setBorderColor(color);
  2227.     m_modTrackPopup->setBorderColor(color);
  2228.     
  2229.     // set the colors for all options
  2230.     m_cddaAudio->setBorderColor(color);
  2231.     m_cdromData->setBorderColor(color);
  2232.     m_cdromAudio->setBorderColor(color);
  2233.     m_cdromRaw->setBorderColor(color);
  2234.     m_cdxaAudio->setBorderColor(color);
  2235.     m_cdxaData->setBorderColor(color);
  2236.     m_cdxaAudio2->setBorderColor(color);
  2237.     m_cdxaRaw->setBorderColor(color);
  2238.     m_editTrack->setBorderColor(color);
  2239.     m_deleteTrack->setBorderColor(color);
  2240.     
  2241.     // set the colors for all spinners
  2242.     m_modTrackNum->fbSetBorderColor(color);
  2243. }
  2244. // Save changes to the layout to a .toc file
  2245. FXbool CFreeBurn::saveChanges()
  2246. {
  2247.     FXuint   answer;
  2248.     FXString file;
  2249.     
  2250.     // ask if the user wants to save the unsaved log file
  2251.     answer = FXMessageBox::question(this,MBOX_YES_NO_CANCEL|PLACEMENT_CURSOR,
  2252.         fbSaveChangesTitleText,fbSaveChangesMessageText);
  2253.     
  2254.     // if not, exit
  2255.     if(answer==MBOX_CLICKED_CANCEL) return FALSE;
  2256.     
  2257.     // if yes...
  2258.     if(answer==MBOX_CLICKED_YES)
  2259.     {
  2260.         /*file=m_fileName;
  2261.         
  2262.         // if we don't have a m_fileName, we need to
  2263.         // get a m_fileName.  this is the same process
  2264.         // as the "save as" process.
  2265.         if(!m_haveFileName)
  2266.         {
  2267.             FXFileDialog savedialog(this,"Save Log");
  2268.             savedialog.setSelectMode(SELECTFILE_ANY);
  2269.             savedialog.setPatternList("All Files (*.*)");
  2270.             savedialog.setFilename(file);
  2271.             if(!savedialog.execute()) return FALSE;
  2272.             
  2273.             file=savedialog.getFilename();
  2274.             
  2275.             if(FXFile::exists(file))
  2276.             {
  2277.                 if(MBOX_CLICKED_NO==FXMessageBox::question(this,MBOX_YES_NO,"Overwrite File",
  2278.                     "Overwrite existing file: %s?",file.text())) return FALSE;
  2279.             }
  2280.             file=savedialog.getFilename();
  2281.         }
  2282.         // finally, save the file.
  2283.         saveFile(file);*/
  2284.         FXMessageBox::information(this, MBOX_OK|PLACEMENT_CURSOR, "Saving Unimplemented", 
  2285.             "Saving files has not yet been implemented.");
  2286.     }
  2287.     // success
  2288.     return TRUE;
  2289. }
  2290. // method to close out and delete any current disc settings
  2291. FXbool CFreeBurn::closeDisc()
  2292. {
  2293.     if (m_discExists)
  2294.     {
  2295.         // delete/clear any data from the old layout
  2296.         delete m_mainDisc;
  2297.     
  2298.         // reset the settings of the layout flags
  2299.         m_discExists = FALSE;
  2300.         m_discSaved  = TRUE;
  2301.     }
  2302.     
  2303.     return TRUE;
  2304. }
  2305. // Read the settings for the FreeBurn theme from the registry to set up icons and stuff
  2306. void CFreeBurn::readThemeSettings()
  2307. {
  2308.     m_theme = getApp()->reg().readIntEntry(fbRegSectionProgramText, fbRegPropertyThemeText, DEFAULT_THEME);
  2309. }
  2310. // Read registry settings for the application
  2311. void CFreeBurn::readProgramSettings()
  2312. {
  2313.     // read the position and height/width settings from the registry
  2314.     m_xpos   = getApp()->reg().readIntEntry(fbRegSectionProgramText, fbRegPropertyXposText,   FB_XPOS);
  2315.     m_ypos   = getApp()->reg().readIntEntry(fbRegSectionProgramText, fbRegPropertyYposText,   FB_YPOS);
  2316.     m_width  = getApp()->reg().readIntEntry(fbRegSectionProgramText, fbRegPropertyWidthText,  FB_WIDTH);
  2317.     m_height = getApp()->reg().readIntEntry(fbRegSectionProgramText, fbRegPropertyHeightText, FB_HEIGHT);
  2318.     
  2319.     // read the path to commands from the registry
  2320.     m_shellPath    = getApp()->reg().readStringEntry(fbRegSectionCommandPathsText, 
  2321.         fbRegPropertyShellPathText,    fbRegDefaultShellPathText);
  2322.     m_cdrecordPath = getApp()->reg().readStringEntry(fbRegSectionCommandPathsText, 
  2323.         fbRegPropertyCdrecordPathText, fbRegDefaultCdrecordPathText);
  2324.     m_mkisofsPath  = getApp()->reg().readStringEntry(fbRegSectionCommandPathsText, 
  2325.         fbRegPropertyMkisofsPathText,  fbRegDefaultMkisofsPathText);
  2326.     m_cdrdaoPath   = getApp()->reg().readStringEntry(fbRegSectionCommandPathsText, 
  2327.         fbRegPropertyCdrdaoPathText,   fbRegDefaultCdrdaoPathText);
  2328.     
  2329.     // Set the program options that were read from the registry
  2330.     // The x -4 offset and the y -27 offset are to account for a 
  2331.     // slightly off saving of the x and y attributes of the window,
  2332.     // so the window will come up where it should
  2333.     position((m_xpos-4),(m_ypos-27),m_width,m_height);    
  2334. }
  2335. // Write registry settings for the application
  2336. void CFreeBurn::writeProgramSettings()
  2337. {
  2338.     // write the current program theme to the registry
  2339.     getApp()->reg().writeIntEntry(fbRegSectionProgramText, fbRegPropertyThemeText, m_theme);
  2340.     
  2341.     // write the position, height, and width settings to the registry
  2342.     getApp()->reg().writeIntEntry(fbRegSectionProgramText, fbRegPropertyXposText,   getX());
  2343.     getApp()->reg().writeIntEntry(fbRegSectionProgramText, fbRegPropertyYposText,   getY());
  2344.     getApp()->reg().writeIntEntry(fbRegSectionProgramText, fbRegPropertyWidthText,  getWidth());
  2345.     getApp()->reg().writeIntEntry(fbRegSectionProgramText, fbRegPropertyHeightText, getHeight());
  2346.     
  2347.     // write the external program paths to the registry
  2348.     getApp()->reg().writeStringEntry(fbRegSectionCommandPathsText, 
  2349.         fbRegPropertyShellPathText,    m_shellPath.text());
  2350.     getApp()->reg().writeStringEntry(fbRegSectionCommandPathsText, 
  2351.         fbRegPropertyCdrecordPathText, m_cdrecordPath.text());
  2352.     getApp()->reg().writeStringEntry(fbRegSectionCommandPathsText, 
  2353.         fbRegPropertyMkisofsPathText,  m_mkisofsPath.text());
  2354.     getApp()->reg().writeStringEntry(fbRegSectionCommandPathsText, 
  2355.         fbRegPropertyCdrdaoPathText,   m_cdrdaoPath.text());
  2356. }
  2357. // Main program starts here
  2358. int main(int argc,char *argv[])
  2359. {
  2360.     // Make application
  2361.     FXApp application(FB_APP_NAME,FB_VENDOR_NAME);
  2362.     
  2363.     // set the Registry mode to use a text file, 
  2364.     // and not the Windows Registry
  2365.     application.reg().setAsciiMode(TRUE);
  2366.     // Start app
  2367.     application.init(argc,argv);
  2368.     // the main program window
  2369.     CFreeBurn* fb = new CFreeBurn(&application);
  2370.     
  2371.     // now, add the process/thread event handlers since we're going to
  2372.     // be using external programs a lot to make FreeBurn work good
  2373.     
  2374.     // This event handler will handle the event that lets the app know it can
  2375.     // read a string that was output from the process
  2376.     application.addInput(fb->getReadOutputHandle(),     INPUT_EXCEPT, fb, CFreeBurn::ID_GET_THREAD_BUFFER);
  2377.     // This event handler lets the app know that the process is done, so the buttons can be
  2378.     // re-enabled.
  2379.     application.addInput(fb->getThreadCompleteHandle(), INPUT_EXCEPT, fb, CFreeBurn::ID_THREAD_COMPLETE);
  2380.     // Create the application's windows
  2381.     application.create();
  2382.   
  2383.     // Run the application
  2384.     return application.run();
  2385. }