Subversion Repositories Games.Chess Giants

Rev

Rev 124 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. // dialog_save.cpp
  2.  
  3. #include "../common.h"
  4.  
  5.  
  6. // global variables used in this module only
  7. static wchar_t ofn_customfilter[256] = L"";
  8. static bool quit_after_save = false;
  9.  
  10.  
  11. // local prototypes
  12. static void StartThread_ThisDialog (void *thread_parms);
  13.  
  14.  
  15. void DialogBox_Save (bool want_quit_after_save)
  16. {
  17.    // helper function to fire up the modeless Save dialog box
  18.  
  19.    quit_after_save = want_quit_after_save;
  20.    is_dialogbox_displayed = true;
  21.    _beginthread (StartThread_ThisDialog, 0, NULL); // fire up a new one
  22.  
  23.    return; // return as soon as the thread is fired up
  24. }
  25.  
  26.  
  27. void DialogBox_Save_Validated (void)
  28. {
  29.    // callback function called by the main game thread when the dialog box is validated
  30.  
  31.    int length;
  32.  
  33.    // remember this callback is no longer to be called
  34.    is_dialogbox_save_validated = false;
  35.  
  36.    length = wcslen (save_pathname); // get pathname length
  37.  
  38.    // is it a FEN or a PGN filename ?
  39.    if ((length > 4) && (_wcsicmp (&save_pathname[length - 4], L".fen") == 0))
  40.    {
  41.       // save the requested FEN file
  42.       if (!FENFile_Save (save_pathname, the_board.moves[the_board.viewed_move].fen_string))
  43.       {
  44.          messagebox.hWndParent = hMainWnd;
  45.          wcscpy_s (messagebox.title, WCHAR_SIZEOF (messagebox.title), LOCALIZE (L"ImportantMessage"));
  46.          wcscpy_s (messagebox.text, WCHAR_SIZEOF (messagebox.text), LOCALIZE (L"Error_SaveFailed"));
  47.          messagebox.flags = MB_ICONWARNING | MB_OK;
  48.          DialogBox_Message (&messagebox); // on error, display a modeless error message box
  49.       }
  50.    }
  51.    else
  52.    {
  53.       // save the requested PGN file
  54.       if (!PGNFile_Save (&the_board, save_pathname))
  55.       {
  56.          messagebox.hWndParent = hMainWnd;
  57.          wcscpy_s (messagebox.title, WCHAR_SIZEOF (messagebox.title), LOCALIZE (L"ImportantMessage"));
  58.          wcscpy_s (messagebox.text, WCHAR_SIZEOF (messagebox.text), LOCALIZE (L"Error_SaveFailed"));
  59.          messagebox.flags = MB_ICONWARNING | MB_OK;
  60.          DialogBox_Message (&messagebox); // on error, display a modeless error message box
  61.       }
  62.    }
  63.  
  64.    // did we want to quit after save ?
  65.    if (quit_after_save)
  66.       is_dialogbox_quit_validated = true; // if so, act as if the quit dialog box was validated
  67.  
  68.    return; // finished, game has been saved
  69. }
  70.  
  71.  
  72. static void StartThread_ThisDialog (void *thread_parms)
  73. {
  74.    // this function runs in a separate thread, for that's the only way (seemingly)
  75.    // to implement a non-modal Save dialog box using the Common Controls library.
  76.  
  77.    OPENFILENAME ofn;
  78.    int length;
  79.  
  80.    length = wcslen (save_pathname); // get current save pathname length
  81.  
  82.    // reset and prepare the open file name structure
  83.    memset (&ofn, 0, sizeof (ofn));
  84.    ofn.lStructSize = sizeof (ofn);
  85.    ofn.hwndOwner = hMainWnd;
  86.    ofn.lpstrFilter = LOCALIZE (L"GameFileFilter");
  87.    if ((length > 4) && (_wcsicmp (&save_pathname[length - 4], L".fen") == 0))
  88.    {
  89.       ofn.lpstrDefExt = L"fen"; // default extension will be .fen (because it was selected previously)
  90.       ofn.nFilterIndex = 2; // second filter (list is 1-based)
  91.    }
  92.    else
  93.    {
  94.       ofn.lpstrDefExt = L"pgn"; // default extension will be .pgn
  95.       ofn.nFilterIndex = 1; // first filter (list is 1-based)
  96.    }
  97.    ofn.lpstrCustomFilter = ofn_customfilter;
  98.    ofn.nMaxCustFilter = WCHAR_SIZEOF (ofn_customfilter);
  99.    ofn.lpstrFile = save_pathname;
  100.    ofn.nMaxFile = WCHAR_SIZEOF (save_pathname);
  101.    ofn.Flags = OFN_ENABLESIZING | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_OVERWRITEPROMPT;
  102.  
  103.    // display the dialog box and get the file name
  104.    if (GetSaveFileName (&ofn) != 0)
  105.       is_dialogbox_save_validated = true;
  106.    is_dialogbox_displayed = false;
  107.  
  108.    the_board.reevaluate = true; // refresh the GUI buttons if needed
  109.    return; // _endthread() implied
  110. }
  111.