home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Audio Plus 10-94
/
AUDIOPLUS.ISO
/
win3
/
edit
/
muzika
/
file.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1992-07-21
|
18KB
|
477 lines
// **********************************************
// File: FILE.CPP
// File menu dialog box functions
#include "muzika.h"
#include "dialog.h"
#include <dir.h>
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
char programTitle[MAXPATH+7] = "MUZIKA "; // Main window caption
char *filepath = programTitle+7; // Pointer to file path in caption
BOOL melodyModified = FALSE; // Becomes TRUE whenever melody modified
// **********************************************
// AskSave requests the user to confirm qutting
// the current melody after modification. Return TRUE
// if whatever the user requests succeeds (allowing therefore
// to proceed with the previous operation), or FALSE if either
// the user chooses CANCEL or the save fails.
BOOL AskSave()
{
int reply;
// If melody has been modified, display an asking message box
// and save the melody if the user selects YES
return melodyModified ?
((reply = MessageBox(hMainWnd, "Current melody has been modified. "
"Do you wish to save it?", "Warning",
MB_ICONINFORMATION | MB_YESNOCANCEL)) == IDYES) ?
Save() : (reply == IDNO) : TRUE;
}
// **********************************************
// DialogNew is the "File/New..." dialog box function,
// processing messages intended for this dialog box.
BOOL FAR PASCAL DialogNew(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
static const unsigned widths[]={640-144, 800-144, 1024-144, 0};
switch (message) {
case WM_INITDIALOG:
// Process a WM_INITDIALOG message, indicating that
// the DialogNew function is called for the first time.
// A list box with the widths list is created.
for (int index = 0; widths[index]; ++index) {
char wstr[5];
itoa(widths[index], wstr, 10);
SendMessage(GetDlgItem(hDlg, ID_STAFFWIDTH),
LB_INSERTSTRING, -1, (LONG) wstr);
}
SendMessage(GetDlgItem(hDlg, ID_STAFFWIDTH), LB_SETCURSEL, 0, 0);
return TRUE;
case WM_COMMAND:
// Process a WM_COMMAND message, indicating that the user
// has finished making a selection either by pressing OK, CANCEL,
// or double-clicking the requested width.
if (wParam == IDOK || HIWORD(lParam) == LBN_DBLCLK) {
// Set the melody staff width according to what the user selected
melody.SetStaffWidth(widths[(int)
SendMessage(GetDlgItem(hDlg, ID_STAFFWIDTH), LB_GETCURSEL, 0, 0)]);
EndDialog(hDlg, TRUE);
// Initialize the database:
// create a melody with only one UNNAMED part in it,
// and reset the various Boolean flags.
while (melody.part.number())
melody.part.destroyAt(melody.part.number()-1);
melodyExists = TRUE;
melody.part.insertAt(*new Part("UNNAMED", 1), 0);
scoreDisplay = FALSE;
displayedPart = 0;
filepath[0] = 0;
melodyModified = FALSE;
// Refresh the screen
SetWindowText(hMainWnd, "MUZIKA (Untitled)");
InitializeMenu(TRUE);
SetScrollRange(hEditWnd, SB_VERT, 0, 0, TRUE);
ShowScrollBar(hEditWnd, SB_VERT, TRUE);
InvalidateRect(hMainWnd, NULL, TRUE);
InvalidateRect(hEditWnd, NULL, TRUE);
IdentifyEditModeSymbol(0x00020002L);
return TRUE;
}
if (wParam == IDCANCEL) {
// The user cancelled the operation:
// just exit the dialog box without doing anything
EndDialog(hDlg, FALSE);
return TRUE;
}
}
return FALSE;
}
// **********************************************
// LoadError is a generic load error recovery function,
// called whenever there is an error loading a file (probably
// because the file does not conform to MUZIKA format).
void LoadError()
{
// Display an error message box
SetCursor(LoadCursor(NULL, IDC_ARROW));
MessageBox(hEditWnd, "The file is not a valid MUZIKA file.", NULL,
MB_SYSTEMMODAL | MB_OK);
// Delete the currently stored melody
while (melody.part.number())
melody.part.destroyAt(melody.part.number()-1);
melodyExists = FALSE;
filepath[0] = 0;
SetWindowText(hMainWnd, "MUZIKA (Untitled)");
InitializeMenu(FALSE);
hEditCursor = LoadCursor(NULL, IDC_ARROW);
ShowScrollBar(hEditWnd, SB_VERT, FALSE);
InvalidateRect(hMainWnd, NULL, TRUE);
InvalidateRect(hEditWnd, NULL, TRUE);
}
// **********************************************
// DialogOpen is the "File/Open..." dialog box function,
// processing messages intended for this dialog box.
BOOL FAR PASCAL DialogOpen(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
char path[MAXPATH];
char drive[MAXDRIVE], dir[MAXDIR], file[MAXFILE], ext[MAXEXT];
switch (message) {
case WM_INITDIALOG:
// Process a WM_INITDIALOG message, indicating that
// the DialogOpen function is called for the first time.
// The file and directory lists are filled.
DlgDirList(hDlg, "*.MUZ", ID_FILELIST, NULL, 0x0000);
DlgDirList(hDlg, "*.*", ID_DIRLIST, ID_DIRNAME, 0xC010);
SetDlgItemText(hDlg, ID_FILENAME, "*.MUZ");
SendDlgItemMessage(hDlg, ID_FILENAME, EM_SETSEL, NULL, 0x7FFF0000L);
return TRUE;
case WM_COMMAND:
// Process a WM_COMMAND message, indicating an action
// of some kind in the dialog box.
switch (wParam) {
case ID_FILELIST:
switch (HIWORD(lParam)) {
case LBN_SELCHANGE:
// The user has made a selection in the file list:
// respond by copying the selection to the text field
DlgDirSelect(hDlg, path, ID_FILELIST);
SetDlgItemText(hDlg, ID_FILENAME, path);
SendDlgItemMessage(hDlg, ID_FILENAME, EM_SETSEL, NULL, 0x7FFF0000L);
SendDlgItemMessage(hDlg, ID_DIRLIST, LB_SETCURSEL, -1, NULL);
break;
case LBN_DBLCLK:
// The user has double-clicked a selection in the file list:
// go on and open the file
goto openfile;
}
return TRUE;
case ID_DIRLIST:
switch(HIWORD(lParam)) {
case LBN_SELCHANGE:
// The user has made a selection in the file list:
// respond by copying the selection to the text field
DlgDirSelect(hDlg, path, ID_DIRLIST);
strcat(path, "*.MUZ");
SetDlgItemText(hDlg, ID_FILENAME, path);
SendDlgItemMessage(hDlg, ID_FILENAME, EM_SETSEL, NULL, 0x7FFF0000L);
SendDlgItemMessage(hDlg, ID_FILELIST, LB_SETCURSEL, -1, NULL);
break;
case LBN_DBLCLK:
// The user has double-clicked a selection
// in the directory list:
// go on and change the directory
goto openfile;
}
return TRUE;
case IDOK:
openfile:
// This point is reached whenever the user chooses OK
// or double-clicks a file or directory selection.
GetDlgItemText(hDlg, ID_FILENAME, path, MAXPATH);
if (strchr(path, '*')) {
// The path still contains an '*', meaning that
// it's not a file name yet:
// update the file and directory lists
DlgDirList(hDlg, path, ID_FILELIST, NULL, 0x0000);
DlgDirList(hDlg, "*.*", ID_DIRLIST, ID_DIRNAME, 0xC010);
SetDlgItemText(hDlg, ID_FILENAME, "*.MUZ");
SendDlgItemMessage(hDlg, ID_FILENAME, EM_SETSEL, NULL, 0x7FFF0000L);
}
else if (path[0]) {
// Append a ".MUZ" extension if none given
if (!(fnsplit(path, drive, dir, file, ext) & EXTENSION))
strcpy(ext, ".MUZ");
fnmerge(path, drive, dir, file, ext);
// Check that the file exists
ifstream in;
in.open(path, ios::in | ios::nocreate | ios::binary);
if (in.fail())
MessageBox(hDlg, "File does not exist.", NULL,
MB_ICONEXCLAMATION | MB_OK);
else {
// The file exists: close it, and ask if the user
// wants to save the current melody (in case it
// has been modified).
EndDialog(hDlg, TRUE);
in.close();
if (!AskSave())
return TRUE;
melodyModified = FALSE;
// Clear the workspace
while (melody.part.number())
melody.part.destroyAt(melody.part.number()-1);
// Use the LoadFrom() virtual function to load the melody
HCURSOR hPrevCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
in.open(path, ios::in | ios::binary);
if (melody.LoadFrom(in, LoadError)) {
// The melody has been successfully loaded:
// reset a few Boolean flags and make
// part 0 as the displayed part
melodyExists = TRUE;
strcpy(filepath, path);
SetWindowText(hMainWnd, programTitle);
InitializeMenu(TRUE);
scoreDisplay = FALSE;
displayedPart = 0;
Part &p = *((Part *) &melody.part[0]);
SetScrollRange(hEditWnd, SB_VERT, 0,
p.staff.number() ?
((Staff *) &p.staff[p.staff.number()-1])->Y() : 0, TRUE);
InvalidateRect(hMainWnd, NULL, TRUE);
InvalidateRect(hEditWnd, NULL, TRUE);
SetCursor(hPrevCursor);
}
}
in.close();
}
return TRUE;
case IDCANCEL:
// The user cancelled the operation:
// just exit the dialog box without doing anything
EndDialog(hDlg, FALSE);
return TRUE;
}
}
return FALSE;
}
// **********************************************
// Save saves the current melody, asking for a file name
// (i.e. calling SaveAs) if no current file name exists.
BOOL Save()
{
ofstream out;
if (filepath[0]) {
// The melody already has a file name:
// open the stream and use Melody::printOn to save the melody
HCURSOR hPrevCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
out.open(filepath, ios::out | ios::binary);
melody.printOn(out);
out.close();
melodyModified = FALSE;
SetCursor(hPrevCursor);
return TRUE;
}
else {
// No current file name:
// open a "Save As..." dialog box
FARPROC lpDialog = MakeProcInstance((FARPROC) DialogSaveAs, hInst);
BOOL saved = DialogBox(hInst, "D_FILESAVEAS", hMainWnd, lpDialog);
FreeProcInstance(lpDialog);
return saved;
}
}
// **********************************************
// DialogSaveAs is the "File/Save As..." dialog box function,
// processing messages intended for this dialog box.
BOOL FAR PASCAL DialogSaveAs(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
char path[MAXPATH];
char drive[MAXDRIVE], dir[MAXDIR], file[MAXFILE], ext[MAXEXT];
switch (message) {
case WM_INITDIALOG:
// Process a WM_INITDIALOG message, indicating that
// the DialogSaveAs function is called for the first time.
// The directory list is filled.
DlgDirList(hDlg, "*.*", ID_DIRLIST, ID_DIRNAME, 0xC010);
return TRUE;
case WM_COMMAND:
// Process a WM_COMMAND message, indicating an action
// of some kind in the dialog box.
switch (wParam) {
case ID_DIRLIST:
switch(HIWORD(lParam)) {
case LBN_SELCHANGE:
// The user has selected a directory:
// respond by copying the selection to the text field
DlgDirSelect(hDlg, path, ID_DIRLIST);
SetDlgItemText(hDlg, ID_FILENAME, path);
SendDlgItemMessage(hDlg, ID_FILENAME, EM_SETSEL, NULL, 0x7FFF0000L);
break;
case LBN_DBLCLK:
// The user has double-clicked a directory:
// go on and update the directory list
goto savefile;
}
return TRUE;
case IDOK:
savefile:
// This point is reached when the user selects OK
// or double-clicks a directory selection.
GetDlgItemText(hDlg, ID_FILENAME, path, MAXPATH);
if (path[strlen(path)-1] == ':' || path[strlen(path)-1] == '\\') {
// The text field ends with a ':' or '\\', meaning
// that no file name has been selected yet:
// refill the directory list box
DlgDirList(hDlg, path, ID_DIRLIST, ID_DIRNAME, 0xC010);
SetDlgItemText(hDlg, ID_FILENAME, "");
}
else if (path[0]) {
// Append a ".MUZ" extension to the file name if necessary
if (!(fnsplit(path, drive, dir, file, ext) & EXTENSION))
strcpy(ext, ".MUZ");
fnmerge(path, drive, dir, file, ext);
// Check if the file already exists
ofstream out;
out.open(path, ios::out | ios::noreplace | ios::binary);
if (out.fail())
// The file already exists:
// confirm that it should be overwritten
if (MessageBox(hDlg, "File already exists. Overwrite?",
"Warning", MB_ICONINFORMATION | MB_YESNOCANCEL) != IDYES) {
out.close();
return TRUE;
}
out.close();
HDC hPrevCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));;
out.open(path, ios::out | ios::trunc | ios::binary);
EndDialog(hDlg, TRUE);
// Use the printOn() virtual function to save the melody
melody.printOn(out);
out.close();
melodyModified = FALSE;
strcpy(filepath, path);
SetWindowText(hMainWnd, programTitle);
SetCursor(hPrevCursor);
}
return TRUE;
case IDCANCEL:
// The user cancelled the operation:
// exit the dialog box without doing anything
EndDialog(hDlg, FALSE);
return TRUE;
}
}
return FALSE;
}
// **********************************************
// DialogCreateMIDI is the "File/Create MIDI..." dialog box function,
// processing message intended for this dialog box.
BOOL FAR PASCAL DialogCreateMIDI(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
char path[MAXPATH];
char drive[MAXDRIVE], dir[MAXDIR], file[MAXFILE], ext[MAXEXT];
switch (message) {
case WM_INITDIALOG:
// Process a WM_INITDIALOG message, indicating that the
// DialogCreateMIDI function is called for the first time.
// The directory list is filled.
DlgDirList(hDlg, "*.*", ID_DIRLIST, ID_DIRNAME, 0xC010);
return TRUE;
case WM_COMMAND:
// Process a WM_COMMAND message, indicating an action
// of some kind in the dialog box.
switch (wParam) {
case ID_DIRLIST:
switch(HIWORD(lParam)) {
case LBN_SELCHANGE:
// The user has selected a directory:
// respond by copying the selection to the text field
DlgDirSelect(hDlg, path, ID_DIRLIST);
SetDlgItemText(hDlg, ID_FILENAME, path);
SendDlgItemMessage(hDlg, ID_FILENAME, EM_SETSEL, NULL, 0x7FFF0000L);
break;
case LBN_DBLCLK:
// The user has double-clicked a directory selection:
// go on and update the directory list
goto savefile;
}
return TRUE;
case IDOK:
savefile:
// This point is reached when the user selects OK
// or double-clicks a directory selection.
GetDlgItemText(hDlg, ID_FILENAME, path, MAXPATH);
if (path[strlen(path)-1] == ':' || path[strlen(path)-1] == '\\') {
// The text field ends with ':' or '\\', meaning
// that no file has been selected yet:
// refill the directory list box
DlgDirList(hDlg, path, ID_DIRLIST, ID_DIRNAME, 0xC010);
SetDlgItemText(hDlg, ID_FILENAME, "");
}
else if (path[0]) {
// Append a ".MUZ" extension if necessary
if (!(fnsplit(path, drive, dir, file, ext) & EXTENSION))
strcpy(ext, ".MID");
fnmerge(path, drive, dir, file, ext);
// Check if the file already exists
ofstream out;
out.open(path, ios::out | ios::noreplace | ios::binary);
if (out.fail())
// The file already exists:
// confirm that the user wants it overwritten
if (MessageBox(hDlg, "File already exists. Overwrite?",
"Warning", MB_ICONINFORMATION | MB_YESNOCANCEL) != IDYES) {
out.close();
return TRUE;
}
out.close();
HDC hPrevCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));;
out.open(path, ios::out | ios::trunc | ios::binary);
EndDialog(hDlg, TRUE);
// Create the MIDI file
CreateMIDIFile(out);
out.close();
SetCursor(hPrevCursor);
}
return TRUE;
case IDCANCEL:
// The user cancelled the operation:
// exit the dialog box without doing anything
EndDialog(hDlg, FALSE);
return TRUE;
}
}
return FALSE;
}