1/* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6#include "ThreadWindow.h" 7 8#include <stdio.h> 9 10#include <Application.h> 11#include <GroupLayoutBuilder.h> 12#include <String.h> 13#include <TabView.h> 14 15#include <AutoLocker.h> 16 17#include "MessageCodes.h" 18#include "ThreadModel.h" 19#include "ThreadModelLoader.h" 20 21#include "thread_window/ActivityPage.h" 22#include "thread_window/GeneralPage.h" 23#include "thread_window/WaitObjectsPage.h" 24 25 26static BString 27get_window_name(Model::Thread* thread) 28{ 29 char buffer[1024]; 30 snprintf(buffer, sizeof(buffer), "Thread: %s (%" B_PRId32 ")", 31 thread->Name(), thread->ID()); 32 return BString(buffer); 33} 34 35 36ThreadWindow::ThreadWindow(SubWindowManager* manager, Model* model, 37 Model::Thread* thread) 38 : 39 SubWindow(manager, BRect(50, 50, 599, 499), 40 get_window_name(thread).String(), B_DOCUMENT_WINDOW, 41 B_ASYNCHRONOUS_CONTROLS), 42 fMainTabView(NULL), 43 fGeneralPage(NULL), 44 fWaitObjectsPage(NULL), 45 fActivityPage(NULL), 46 fModel(model), 47 fThread(thread), 48 fThreadModel(NULL), 49 fThreadModelLoader(NULL) 50{ 51 BGroupLayout* rootLayout = new BGroupLayout(B_VERTICAL); 52 SetLayout(rootLayout); 53 54 fMainTabView = new BTabView("main tab view"); 55 56 BGroupLayoutBuilder(rootLayout) 57 .Add(fMainTabView); 58 59 fMainTabView->AddTab(fGeneralPage = new GeneralPage); 60 fMainTabView->AddTab(fWaitObjectsPage = new WaitObjectsPage); 61 fMainTabView->AddTab(fActivityPage = new ActivityPage); 62 63 fGeneralPage->SetModel(fModel, fThread); 64 65 fModel->AcquireReference(); 66 67 // create a thread model loader 68 fThreadModelLoader = new ThreadModelLoader(fModel, fThread, 69 BMessenger(this), NULL); 70} 71 72 73ThreadWindow::~ThreadWindow() 74{ 75 if (fThreadModelLoader != NULL) 76 fThreadModelLoader->Delete(); 77 78 delete fThreadModel; 79 80 fModel->ReleaseReference(); 81} 82 83 84void 85ThreadWindow::MessageReceived(BMessage* message) 86{ 87 switch (message->what) { 88 case MSG_MODEL_LOADED_SUCCESSFULLY: 89 { 90printf("MSG_MODEL_LOADED_SUCCESSFULLY\n"); 91 ThreadModel* model = fThreadModelLoader->DetachModel(); 92 fThreadModelLoader->Delete(); 93 fThreadModelLoader = NULL; 94 _SetModel(model); 95 break; 96 } 97 98 case MSG_MODEL_LOADED_FAILED: 99 case MSG_MODEL_LOADED_ABORTED: 100 { 101printf("MSG_MODEL_LOADED_FAILED/MSG_MODEL_LOADED_ABORTED\n"); 102 fThreadModelLoader->Delete(); 103 fThreadModelLoader = NULL; 104 // TODO: User feedback (in failed case)! 105 break; 106 } 107 108 default: 109 SubWindow::MessageReceived(message); 110 break; 111 } 112} 113 114 115void 116ThreadWindow::Quit() 117{ 118 if (fThreadModelLoader != NULL) 119 fThreadModelLoader->Abort(true); 120 121 SubWindow::Quit(); 122} 123 124 125void 126ThreadWindow::Show() 127{ 128 SubWindow::Show(); 129 130 AutoLocker<ThreadWindow> locker; 131 132 if (fThreadModelLoader == NULL) 133 return; 134 135 status_t error = fThreadModelLoader->StartLoading(); 136 if (error != B_OK) { 137 fThreadModelLoader->Delete(); 138 fThreadModelLoader = NULL; 139 // TODO: User feedback! 140 } 141} 142 143 144void 145ThreadWindow::_SetModel(ThreadModel* model) 146{ 147 delete fThreadModel; 148 149 fThreadModel = model; 150 151 fWaitObjectsPage->SetModel(fThreadModel); 152 fActivityPage->SetModel(fThreadModel); 153} 154