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

DVD

开发平台:

Visual C++

  1. /* This is the class definition for the Executing Command Output Dialog.
  2.  *
  3.  * Copyright (C) 2001, 2002  Adam Schlag
  4.  */
  5. /*
  6.  * FreeBurn Software License
  7.  * (based on the Apache Software License)
  8.  * 
  9.  * Version 1.1
  10.  * 
  11.  * Copyright (c) 2001, 2002 The FreeBurn Project. All rights reserved.
  12.  * 
  13.  * Redistribution and use in source and binary forms, with or without 
  14.  * modification, are permitted provided that the following conditions are met:
  15.  * 
  16.  * 1. Redistributions of source code must retain the above copyright 
  17.  * notice, this list of conditions and the following disclaimer.
  18.  * 
  19.  * 2. Redistributions in binary form must reproduce the above copyright 
  20.  * notice, this list of conditions and the following disclaimer in the 
  21.  * documentation and/or other materials provided with the distribution.
  22.  * 
  23.  * 3. The end-user documentation included with the redistribution, if any, must 
  24.  * include the following acknowledgment:
  25.  * 
  26.  *  "This product includes software developed by the FreeBurn 
  27.  *     Project (http://freeburn.sourceforge.net/)."
  28.  * 
  29.  * Alternately, this acknowledgment may appear in the software itself, 
  30.  * if and wherever such third-party acknowledgments normally appear.
  31.  * 
  32.  * 4. The names "FreeBurn" and "FreeBurn Project" must not be 
  33.  * used to endorse or promote products derived from this software 
  34.  * without prior written permission. For written permission, please 
  35.  * contact aschlag@users.sourceforge.net.
  36.  * 
  37.  * 5. Products derived from this software may not be called "FreeBurn", 
  38.  * nor may "FreeBurn" appear in their name, without prior written 
  39.  * permission of the FreeBurn Project.
  40.  * 
  41.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 
  42.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
  43.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  44.  * DISCLAIMED. IN NO EVENT SHALL THE FREEBURN PROJECT OR ITS 
  45.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
  46.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
  47.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 
  48.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
  49.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
  50.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
  51.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  52.  * SUCH DAMAGE.
  53.  * 
  54.  * This software consists of voluntary contributions made by many 
  55.  * individuals on behalf of the FreeBurn Project. For more 
  56.  * information on the FreeBurn Project and FreeBurn, please see 
  57.  * <http://freeburn.sourceforge.net/>.
  58.  * 
  59.  * This software is distributed with software that is released under the GNU 
  60.  * General Public License (GPL).  You can find the terms of this license in the
  61.  * file GPL.txt distributed in this package.  You can find information on the
  62.  * software distributed with this package in the file PROGRAMS.txt.
  63.  */
  64. #include <fx.h>
  65. #include <FXPNGIcon.h>
  66. #include "FreeburnCommandDialog.h"
  67. #include "FreeburnDefs.h"
  68. #include "FreeburnCommandDialogText.h"
  69. #ifndef FREEBURN_ICONS_H
  70. #include "FreeburnIcons.h"
  71. #define FREEBURN_ICONS_H
  72. #endif
  73. #include "FreeburnHelper.h"
  74. #include "FreeBurn.h"
  75. // Message Map for the CFreeburnCommandDialog class
  76. FXDEFMAP(CFreeburnCommandDialog) CFreeburnCommandDialogMap[]={
  77.     //________Message_Type___________________ID________________________________Message_Handler____
  78.     FXMAPFUNC(SEL_COMMAND,  CFreeburnCommandDialog::ID_SAVELOG,  CFreeburnCommandDialog::saveOutputLog)
  79. };
  80. FXIMPLEMENT(CFreeburnCommandDialog,FXDialogBox,CFreeburnCommandDialogMap,ARRAYNUMBER(CFreeburnCommandDialogMap))
  81. // Construct command dialog box
  82. CFreeburnCommandDialog::CFreeburnCommandDialog(FXWindow* owner):
  83.   FXDialogBox(owner,fbCommandDialogTitleText,DECOR_TITLE|DECOR_BORDER, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4)
  84. {
  85.     // create a font that adds bold to the default font (for labels)
  86.     FXFont* systemFont = getApp()->getNormalFont();
  87.     FXFontDesc systemFontDesc;
  88.     systemFont->getFontDesc(systemFontDesc);
  89.     systemFontDesc.weight = FONTWEIGHT_BOLD;
  90.     FXFont* boldSystemFont = new FXFont(getApp(), systemFontDesc);    
  91.     
  92.     // set up the main container for the dialog
  93.     FXVerticalFrame* mainFrame = new FXVerticalFrame(this, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y);
  94.     
  95.     // set up the switcher to change between the regular and log views
  96.     FXSwitcher* commandSwitcher = new FXSwitcher(mainFrame, LAYOUT_FILL_X|LAYOUT_FILL_Y);
  97.     
  98.     // frame for the contents of the regular command output
  99.     FXVerticalFrame* commandFrame = new FXVerticalFrame(commandSwitcher, LAYOUT_FILL_X|LAYOUT_FILL_Y);
  100.     
  101.     // add the title label
  102.     new FXLabel(commandFrame, fbCommandDialogTitleLabelText, NULL, LAYOUT_LEFT);
  103.     
  104.     // add a horizontal ridge separator
  105.     new FXHorizontalSeparator(commandFrame, SEPARATOR_RIDGE|LAYOUT_FILL_X);
  106.     // add the label specifying the command
  107.     FXLabel* labelCommand = new FXLabel(commandFrame, fbCommandDialogCommandLabelText, NULL, LAYOUT_LEFT);
  108.     labelCommand->setFont(boldSystemFont);
  109.     
  110.     // add the label specifying the actual command string
  111.     m_CommandLabel = new FXLabel(commandFrame, EMPTY_STRING, NULL, LAYOUT_LEFT|JUSTIFY_LEFT);
  112.     
  113.     // add the label specifying the current line of output
  114.     FXLabel* labelOutput = new FXLabel(commandFrame, fbCommandDialogOutputLabelText, NULL, LAYOUT_LEFT);
  115.     labelOutput->setFont(boldSystemFont);
  116.     
  117.     // add the label that will contain the current line of output
  118.     m_OutputLabel = new FXLabel(commandFrame, EMPTY_STRING, NULL, LAYOUT_LEFT|JUSTIFY_LEFT);
  119.     
  120.     // set up the show log button
  121.     m_ShowLogButton = new FXButton(commandFrame, fbCommandDialogShowOutputLogButtonText, NULL, 
  122.         commandSwitcher, FXSwitcher::ID_OPEN_SECOND, BUTTON_DEFAULT|LAYOUT_RIGHT|LAYOUT_BOTTOM|FRAME_RAISED);
  123.     
  124.     // frame for the contents of the output log stuff
  125.     FXVerticalFrame* logFrame = new FXVerticalFrame(commandSwitcher, LAYOUT_FILL_X|LAYOUT_FILL_Y);
  126.                    
  127.     // set the output text area
  128.     m_OutputText = new FXText(logFrame,this,ID_LOGTEXT,LAYOUT_LEFT);
  129.     m_OutputText->setEditable(FALSE);
  130.     m_OutputText->setVisRows(10);
  131.     m_OutputText->setVisCols(80);
  132.     FXFont* textFont = new FXFont(getApp(), FIXED_FONT, 10); 
  133.     m_OutputText->setFont(textFont);
  134.     
  135.     // set up a horizontal frame for containing the hide/save log buttons with no default bottom padding
  136.     FXHorizontalFrame* logButtonFrame = new FXHorizontalFrame(logFrame, LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,
  137.         0, 0, 0, 0, 0, 0, 0, 0);
  138.     // add the hide log button
  139.     m_HideLogButton = new FXButton(logButtonFrame, fbCommandDialogHideOutputLogButtonText, NULL, 
  140.         commandSwitcher, FXSwitcher::ID_OPEN_FIRST, BUTTON_DEFAULT|LAYOUT_RIGHT|LAYOUT_BOTTOM|FRAME_RAISED);    
  141.     // add the save log button
  142.     m_SaveLogButton = new FXButton(logButtonFrame, fbCommandDialogSaveOutputLogButtonText, NULL, 
  143.         this, ID_SAVELOG, BUTTON_DEFAULT|LAYOUT_RIGHT|ICON_BEFORE_TEXT|LAYOUT_BOTTOM|FRAME_RAISED);
  144.     // disable the button (it will be enabled when we're done getting output
  145.     m_SaveLogButton->disable();
  146.     
  147.     // set up the buttons for closing the dialog
  148.     new FXHorizontalSeparator(mainFrame, SEPARATOR_GROOVE|LAYOUT_FILL_X);
  149.     FXHorizontalFrame* buttonFrame = new FXHorizontalFrame(mainFrame, LAYOUT_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH);
  150.     m_OkButton = new FXButton(buttonFrame, fbCommandDialogOkButtonText, NULL, this, FXDialogBox::ID_ACCEPT,
  151.         BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 20, 20);
  152.     // disable the button (it will be enabled when we're done getting output)
  153.     m_OkButton->disable();
  154. }
  155. // Clean up 
  156. CFreeburnCommandDialog::~CFreeburnCommandDialog()
  157. {
  158. }
  159. // set the save icon
  160. void CFreeburnCommandDialog::setSaveIcon(FXIcon* saveIcon)
  161. {
  162.     m_SaveLogButton->setIcon(saveIcon);
  163. }
  164. // set the text in the command label
  165. void CFreeburnCommandDialog::setCommandLabelText(FXString& commandString)
  166. {
  167.     // set up method variables so we can break the string if it's too long
  168.     FXString displayString = commandString;
  169.     FXString outputString;
  170.     FXint    stringLength  = displayString.length();
  171.     FXint    insertPos     = 0;
  172.     
  173.     // now we want to add a '' and a newline each 80 characters
  174.     // (we're using 80 because it's usually how wide a command console is)
  175.     while (stringLength > CONSOLE_LINE_SIZE)
  176.     {
  177.         insertPos = insertPos + CONSOLE_LINE_SIZE;
  178.         displayString.insert(insertPos, COMMAND_BREAK);
  179.         stringLength = stringLength - CONSOLE_LINE_SIZE;
  180.     }
  181.     
  182.     m_CommandLabel->setText(displayString);
  183.     
  184.     // also add the command (and other text) to the text area
  185.     outputString = fbCommandDialogCommandLineText;
  186.     m_OutputText->appendText(outputString.text(), outputString.length());
  187.     m_OutputText->appendText(commandString.text(), commandString.length());
  188.     outputString.clear();
  189.     outputString = fbCommandDialogOutputLineText;
  190.     m_OutputText->appendText(outputString.text(), outputString.length());
  191.     m_OutputText->setBottomLine(m_OutputText->getCursorPos());
  192. }
  193. // get a line of text output and do some processing to it for display to the user
  194. void CFreeburnCommandDialog::sendOutputText (FXString& outputString)
  195. {
  196.     // remove any carriage return characters in the output string
  197.     while (outputString.count('r') > 0)
  198.     {
  199.         outputString.remove(outputString.findf('r'), 1);
  200.     }
  201.     // also remove any backspace characters
  202.     while (outputString.count('b') > 0)
  203.     {
  204.         outputString.remove(outputString.findf('b'), 1);
  205.     }
  206.     
  207.     // set the output label to the current line of output text
  208.     m_OutputLabel->setText(outputString);
  209.     
  210.     // append this line of text to the text area and scroll the text
  211.     // widget to the bottom line
  212.     m_OutputText->appendText(outputString.text(), outputString.length());
  213.     m_OutputText->setBottomLine(m_OutputText->getCursorPos());
  214. }
  215. // message handler to save the output of the log to a text file
  216. long CFreeburnCommandDialog::saveOutputLog(FXObject*, FXSelector, void*)
  217. {
  218.     FXString outFile = m_OutputText->getText();
  219.     outFile.trim();
  220.         
  221.     FreeburnHelper::saveNewTextFile(this->getOwner(), outFile);
  222.     
  223.     return 1;
  224. }
  225. // this method is run when the main applicatino receives the message that
  226. // the thread thats catching the process output is complete.
  227. void CFreeburnCommandDialog::outputComplete()
  228. {
  229.     // insert the text to the output area that the output is complete
  230.     FXString outputString = fbCommandDialogOutputDoneText;
  231.     m_OutputText->appendText(outputString.text(), outputString.length());
  232.     
  233.     // enable the "OK" button so the dialog can be closed and the "save log"
  234.     // button so the user can save the output log if they choose to save it
  235.     m_SaveLogButton->enable();
  236.     m_OkButton->enable();
  237. }