#ifndef _Output_h #include "Output.h" #endif #include #include #include /* #ifndef _Preferences_h #include "Preferences.h" #endif */ /****************************************************************/ /* OutputView */ /****************************************************************/ OutputView::OutputView(BRect frame) : BView(frame, "OutputView", B_FOLLOW_ALL, B_WILL_DRAW) { SetViewColor(216,216,216); rgb_color color = {255,255,255}; BRect b = Bounds(); AddChild(m_pTextView = new BTextView(BRect(b.left+5,b.top+5,b.right-B_V_SCROLL_BAR_WIDTH-6,b.bottom-5), "Output", BRect(b.left+5,b.top+5,b.right-B_V_SCROLL_BAR_WIDTH-6,b.bottom-5), NULL, &color, B_FOLLOW_ALL_SIDES, B_WILL_DRAW)); m_pTextView->SetViewColor(0,0,100); m_pTextView->MakeEditable(false); AddChild(m_pScrollBar = new BScrollBar(BRect(b.right-B_V_SCROLL_BAR_WIDTH-5,b.top+5,b.right-5, b.bottom-5), "outputScroll", m_pTextView, 0, 0, B_VERTICAL)); } void OutputView::FrameResized(float width, float height) { BView::FrameResized(width, height); m_pTextView->SetTextRect(BRect(0,0,width,height)); } /****************************************************************/ /* Output */ /****************************************************************/ // Singleton implementation Output* Output::m_instance = 0; Output::Output() : BWindow(BRect(200,200,800,800), "Output", B_TITLED_WINDOW, B_NOT_ZOOMABLE) { BRect b = Bounds(); fTabsList = new BList(20); fOutputViewsList = new BList(20); BView* resetView = new BView(BRect(b.left,b.bottom-25,b.right,b.bottom), "resetView", B_FOLLOW_BOTTOM | B_FOLLOW_LEFT_RIGHT , B_WILL_DRAW); resetView->SetViewColor(216,216,216); resetView->AddChild(m_pReset = new BButton(BRect(1,1,61,20), "reset all", "Clear", new BMessage(MSG_OUTPUT_RESET), B_FOLLOW_BOTTOM)); resetView->AddChild(m_pResetAll = new BButton(BRect(70,1,130,20), "reset", "Clear all", new BMessage(MSG_OUTPUT_RESET_ALL), B_FOLLOW_BOTTOM)); AddChild(resetView); fTabView = new BTabView(BRect(b.left,b.top,b.right,b.bottom-25), "tab_view", B_WIDTH_FROM_LABEL ,B_FOLLOW_ALL, B_FULL_UPDATE_ON_RESIZE | B_WILL_DRAW | B_NAVIGABLE_JUMP ); fTabView->SetViewColor(216,216,216); fBounds = fTabView->Bounds(); fBounds.bottom -= fTabView->TabHeight(); fTabView->AddTab(m_pAll = new OutputView(fBounds), m_pAllTab = new BTab()); m_pAllTab->SetLabel("All"); AddChild(fTabView); /* MoveTo( Preferences::Instance()->OutputX(), Preferences::Instance()->OutputY()); */ } void Output::AddTab(const char* text, int32 index) { OutputView* customOutput; BTab* customTab; Lock(); fTabView->AddTab(customOutput = new OutputView(fBounds), customTab = new BTab()); customTab->SetLabel( text ); fTabView->Invalidate(); Unlock(); fTabsList->AddItem(customTab, index); fOutputViewsList->AddItem(customOutput, index); } Output::~Output() { /* BWindow::~BWindow();*/ delete fTabsList; delete fOutputViewsList; } Output* Output::Instance() { if (!m_instance) m_instance = new Output; return m_instance; } bool Output::QuitRequested() { Hide(); return false; } void Output::MessageReceived(BMessage* msg) { switch(msg->what) { case MSG_OUTPUT_RESET: for (int32 index = 0 ; indexCountItems() ; index++) { if (fTabsList->ItemAt(index) != NULL && ((BTab*)fTabsList->ItemAt(index))->IsSelected() ) ((OutputView*)fOutputViewsList->ItemAt(index))->Clear(); } break; case MSG_OUTPUT_RESET_ALL: m_pAll->Clear(); for (int32 index = 0 ; indexCountItems() ; index++) { if (fTabsList->ItemAt(index) != NULL ) ((OutputView*)fOutputViewsList->ItemAt(index))->Clear(); } break; default: BWindow::MessageReceived(msg); break; } } void Output::FrameMoved(BPoint point) { /* Preferences::Instance()->OutputX(point.x); Preferences::Instance()->OutputY(point.y); */ } int Output::Postf(uint32 index, const char *format, ...) { char string[200]; va_list arg; int done; va_start (arg, format); done = vsprintf (string, format, arg); va_end (arg); Post(string, index); return done; } void Output::Post(const char* text, uint32 index) { Lock(); OutputView* view = (OutputView*) fOutputViewsList->ItemAt(index); if (view != NULL) Add(text, view ); else // Note that the view should be added before this! // Dropping twice to the main Add(text, m_pAll ); Unlock(); } void Output::Add(const char* text, OutputView* view) { view->Add(text); m_pAll->Add(text); }