/* * Copyright 199 Kelvin W sherlock * * $Id: main_window.cpp,v 1.10 1999/04/17 15:30:08 baron Exp baron $ */ #include "main_window.h" #include "TrackWindow.h" #include "Builtins.h" #include #include #include #include #include #include #include #include #include //-- stuff for menus #include #include #include #include #include #include #include int Main_Window::__Count = 0; Main_Window::Main_Window(BRect rect, const char *title): BWindow(rect, title, B_DOCUMENT_WINDOW, 0), background(NULL), dirtyFlag(false), ListView(NULL), OpenPanel(NULL), SavePanel(NULL) { InitWindow(); dirtyFlag = false; Show(); } Main_Window::Main_Window(BRect rect, entry_ref *ref): BWindow(rect, "", B_DOCUMENT_WINDOW, 0), background(NULL), dirtyFlag(false), ListView(NULL), OpenPanel(NULL), SavePanel(NULL) { InitWindow(); SetTitle(ref->name); if (OpenFile(ref)) Show(); else Quit(); } Main_Window::~Main_Window() { #define DELETE(x) if (x) delete x DELETE(OpenPanel); DELETE(SavePanel); #undef DELETE } /* * Common window initialization * * */ void Main_Window::InitWindow(void) { BMenuBar *bMenuBar; BMenu *bMenu; BMenuItem *mItem; BRect r; __Count++; SetSizeLimits(200, 1000, 100, 1000); background = new BView(Bounds(), "BView", B_FOLLOW_ALL, B_WILL_DRAW); background->SetViewColor(216, 216, 216); AddChild(background); bMenuBar = new BMenuBar(BRect(0,0,20,20), "BMenuBar"); bMenu = new BMenu("File"); mItem = new BMenuItem("New", new BMessage(MENU_NEW), 'N'); bMenu->AddItem(mItem); mItem = new BMenuItem("Open", new BMessage(MENU_OPEN), 'O'); bMenu->AddItem(mItem); bMenu->AddSeparatorItem(); mItem = new BMenuItem("Save", new BMessage(MENU_SAVE), 'S'); bMenu->AddItem(mItem); mItem = new BMenuItem("Save As...", new BMessage(MENU_SAVE_AS), 0); bMenu->AddItem(mItem); bMenu->AddSeparatorItem(); mItem = new BMenuItem("Close", new BMessage(MENU_CLOSE), 'W'); bMenu->AddItem(mItem); mItem = new BMenuItem("Quit", new BMessage(MENU_QUIT), 'Q'); bMenu->AddItem(mItem); bMenu->AddSeparatorItem(); mItem = new BMenuItem("About" B_UTF8_ELLIPSIS, new BMessage(B_ABOUT_REQUESTED)); // this is handled by BApplication, not BWindow mItem->SetTarget(be_app); bMenu->AddItem(mItem); bMenuBar->AddItem(bMenu); /* * Create the edit menu * * */ bMenu = new BMenu("Edit"); mItem = new BMenuItem("Undo", new BMessage(MENU_UNDO), 'Z'); bMenu->AddItem(mItem); bMenu->AddSeparatorItem(); mItem = new BMenuItem("Cut", new BMessage(MENU_CUT), 'X'); bMenu->AddItem(mItem); mItem = new BMenuItem("Copy", new BMessage(MENU_COPY), 'C'); bMenu->AddItem(mItem); mItem = new BMenuItem("Paste", new BMessage(MENU_PASTE), 'V'); bMenu->AddItem(mItem); mItem = new BMenuItem("Clear", new BMessage(MENU_CLEAR), 0); bMenu->AddItem(mItem); bMenuBar->AddItem(bMenu); /* * Create the "Midi" menu * */ bMenu = new BMenu("Midi"); mItem = new BMenuItem("New Track", new BMessage(MENU_NEW_TRACK), 'T'); bMenu->AddItem(mItem); mItem = new BMenuItem("Copyright", new BMessage(MENU_COPYRIGHT)); bMenu->AddItem(mItem); bMenuBar->AddItem(bMenu); background->AddChild(bMenuBar); BStringView *S; r = BRect(0,20,0,36); r.right = background->StringWidth(" Track "); S = new BStringView(r, "", " Track "); background->AddChild(S); r = BRect(50, 20, 0, 36); r.right = 50 + background->StringWidth(" Track Name "); S = new BStringView(r, "", " Track Name "); background->AddChild(S); r = BRect(200, 20, 0, 36); r.right = 200 + background->StringWidth(" Instrument "); S = new BStringView(r, "", " Instrument "); background->AddChild(S); r = BRect(350, 20, 0, 36); r.right = 350 + background->StringWidth(" Events "); S = new BStringView(r, "", " Events "); background->AddChild(S); r = Bounds(); r.top += 20;//25; //height of menubar is 20 //r.bottom -= 5; r.right -= 14; //15; //20; //r.left += 5; r.top += 20; //height of MY info bar ListView = new MyListView(r, "ListView", B_SINGLE_SELECTION_LIST, B_FOLLOW_ALL); ListView->SetInvocationMessage(new BMessage(LIST_INVOKE)); BScrollView *ScrollView = new BScrollView("", ListView, B_FOLLOW_ALL, 0, false, true); background->AddChild(ScrollView); OpenPanel = new BFilePanel; SavePanel = new BFilePanel(B_SAVE_PANEL); // TODO - other args? //BMenuItem *tmp; //PopUp = new BPopUpMenu("MidiSpecialist", false, false); //tmp = new BMenuItem("Delete Track", new BMessage(MENU_DELETE_TRACK),0); //PopUp->AddItem(tmp); } // returns TRUE on failure, FALSE otherwise. bool Main_Window::OpenFile(entry_ref *ref) { #if 0 status_t err; BAlert *b; BString S; #endif LoadMidi *m; TrackListList *Tracks; printf("OpenFile Called\n"); m = new LoadMidi(ref); Tracks = m->Load(); delete m; if (Tracks) ListView->AddList(Tracks); return (bool)Tracks; } #if 0 void Main_Window::MouseDown(Point where) { } #endif void Main_Window::Quit(void) { int i; if (--__Count == 0) be_app->PostMessage(new BMessage(B_QUIT_REQUESTED)); //will the ListView's contentents be deleted?? if (ListView) { for (uint32 i = 0; i < ListView->CountItems(); i++) { TrackList * T = (TrackList *)ListView->ItemAt(i); if (T) T->QuitWindow(); } } BWindow::Quit(); } bool Main_Window::QuitRequested(void) { return (DoClose()); // do close will check if the window is dirty } void Main_Window::FrameResized(float width, float height) { } #define SUBWINDOW_CLOSE 'cclo' void Main_Window::MessageReceived(BMessage *msg) { switch(msg->what) { case B_SIMPLE_DATA: //someone dragged an icon on me! { BMessage *m = new BMessage(msg); m->what = B_REFS_RECEIVED; be_app->PostMessage(m); delete m; } break; //TODO - should be moved to TrackListList?? //TODO - add menu of windows/subwindows?? // This shouldn't be handled here... case LIST_INVOKE: { int32 index; status_t err; err = msg->FindInt32("index", &index); if (err == B_OK) { TrackList * T = (TrackList *)ListView->ItemAt(index); if (T) { T->EditWindow(); } } } break; case MENU_NEW: (new Main_Window(BRect(100, 50, 300, 300), "New window"))->Show(); break; case MENU_OPEN: OpenPanel->Show(); break; case MENU_QUIT: be_app->PostMessage(new BMessage(B_QUIT_REQUESTED)); break; case MENU_CLOSE: if (DoClose()) Quit(); break; /* * add a new track to the tracks. * should I limit to 128?? */ case MENU_NEW_TRACK: { TrackList *T; int32 count; count = ListView->CountItems(); T = new TrackList(); T->SetName("New Track"); T->SetTrackNumber(count); ListView->AddItem(T); dirtyFlag = true; //should I yet? } break; /* * delete the selected track * */ case MENU_DELETE_TRACK: { TrackList *T; int32 index; index = ListView->CurrentSelection(); if (index >= 0) { T = (TrackList *)ListView->RemoveItem(index); if (T) { dirtyFlag = true; T->QuitWindow(); delete T; } for(; index < ListView->CountItems(); index++) { T = (TrackList *)ListView->ItemAt(index); T->SetTrackNumber(index); } ListView->Invalidate(); } } break; case MENU_TRANSPOSE_TRACK: printf("no!\n"); { TrackList *T; int32 index; index = ListView->CurrentSelection(); if (index >= 0) { printf("yes!\n"); T = (TrackList *)ListView->ItemAt(index); Transpose(T); } } break; default: BWindow::MessageReceived(msg); } } /* * Somebody wants to close the window - check if we're dirty * */ bool Main_Window::DoClose(void) { BAlert *B; uint32 i; if (dirtyFlag) { B = new BAlert(NULL, "Save changes?", "Cancel", "Don't save", "Save", B_WIDTH_AS_USUAL, B_OFFSET_SPACING, B_WARNING_ALERT); B->SetShortcut(0, B_ESCAPE); i = B->Go(); switch(i) { case 0: return false; // cancel; case 1: return true; // Don't save case 2: return DoSave(); } } return true; // } bool Main_Window::DoSave(void) { return false; }