int32 LibraryWindow::ScanThread(void *data) { LibraryWindow *win = (LibraryWindow *)data; float maxwidth; BRect r(5,5,105,20); BView *systemheader = win->AddHeader(r.LeftTop(),TR("System Libraries:")); win->Lock(); r = systemheader->Frame(); win->Unlock(); maxwidth = r.right; r.OffsetBy(0,r.Height() + 10); DPath sysPath = GetSystemPath(B_USER_DEVELOP_DIRECTORY); sysPath << "lib/x86"; BRect out = win->ScanFolder(r.LeftTop(),sysPath.GetFullPath(),&maxwidth); if (out != BRect(0,0,-1,-1)) { r = out; r.OffsetBy(0,10); } if (gPlatform == PLATFORM_HAIKU || gPlatform == PLATFORM_HAIKU_GCC4) { BView *commonheader = win->AddHeader(r.LeftTop(),TR("Common Libraries:")); win->Lock(); r = commonheader->Frame(); win->Unlock(); maxwidth = MAX(r.right,maxwidth); r.OffsetBy(0,r.Height() + 10); out = win->ScanFolder(r.LeftTop(),GetSystemPath(B_USER_LIB_DIRECTORY).GetFullPath(), &maxwidth); if (out != BRect(0,0,-1,-1)) { r = out; r.OffsetBy(0,10); } } BView *userheader = win->AddHeader(r.LeftTop(),TR("User Libraries:")); win->Lock(); r = userheader->Frame(); win->Unlock(); maxwidth = MAX(r.right,maxwidth); r.OffsetBy(0,r.Height() + 10); out = win->ScanFolder(r.LeftTop(),GetSystemPath(B_USER_LIB_DIRECTORY).GetFullPath(), &maxwidth); if (out.IsValid()) { r = out; r.OffsetBy(0,10); } win->Lock(); BView *top = win->GetBackgroundView(); BScrollView *scrollView = (BScrollView*)top->FindView("scrollView"); BScrollBar *vbar = scrollView->ScrollBar(B_VERTICAL); vbar->SetRange(0, r.bottom - scrollView->Bounds().Height()); vbar->SetSteps(r.Height() * 2.0,r.Height() * 8.0); gSettings.Lock(); BRect savedframe; if (gSettings.FindRect("libwin_frame",&savedframe) == B_OK) win->ResizeTo(savedframe.Width(),savedframe.Height()); gSettings.Unlock(); BStringView *label = (BStringView*)top->FindView("label"); label->SetText(TR("Choose the system libraries for your project.")); float minw = label->Frame().right + 10; win->SetSizeLimits(minw,30000,200,30000); if (win->Bounds().Width() < minw) win->ResizeTo(minw,win->Bounds().Height()); win->fScanThread = -1; win->Unlock(); return 0; }
void WrappingTextView::KeyDown(const char *bytes, int32 numBytes) { if (IsEditable() && numBytes==1) { m_last_key_was_del = (bytes[0]==B_DELETE); switch( bytes[0]) { case B_RIGHT_ARROW: { // implement word-wise movement: int32 mods = Window()->CurrentMessage()->FindInt32("modifiers"); if (mods & (B_LEFT_CONTROL_KEY | B_RIGHT_OPTION_KEY)) { int32 len=TextLength(); int32 startPos, endPos; GetSelection( &startPos, &endPos); if (endPos==len) break; if (startPos==endPos && (mods & B_SHIFT_KEY)) m_selection_start=B_RIGHT_ARROW; int32 wordStart, wordEnd; if (mods & B_SHIFT_KEY && m_selection_start==B_LEFT_ARROW) { do { FindWord( startPos, &wordStart, &wordEnd); if (wordEnd > wordStart+1) break; if (wordEnd == wordStart+1 && ByteAt( wordStart)!=' ') break; } while( ++startPos < len); Select( MIN(endPos, wordEnd), endPos); } else { do { FindWord( endPos, &wordStart, &wordEnd); if (wordEnd > wordStart+1) break; if (wordEnd == wordStart+1 && ByteAt( wordStart)!=' ') break; } while( ++endPos < len); if (mods & B_SHIFT_KEY) { Select( startPos, wordEnd); } else Select( wordEnd, wordEnd); } ScrollToSelection(); } else inherited::KeyDown( bytes, numBytes); break; } case B_LEFT_ARROW: { // implement word-wise movement: int32 mods = Window()->CurrentMessage()->FindInt32("modifiers"); if (mods & (B_LEFT_CONTROL_KEY | B_RIGHT_OPTION_KEY)) { int32 startPos, endPos; GetSelection( &startPos, &endPos); if (!startPos) break; if (startPos==endPos && (mods & B_SHIFT_KEY)) m_selection_start=B_LEFT_ARROW; int32 wordStart, wordEnd; if (mods & B_SHIFT_KEY && m_selection_start==B_RIGHT_ARROW) { --endPos; do { FindWord( endPos, &wordStart, &wordEnd); if (wordEnd > wordStart+1) break; if (wordEnd == wordStart+1 && ByteAt( wordStart)!=' ') break; } while( --endPos > 0); Select( startPos, MAX( startPos, wordStart)); } else { --startPos; do { FindWord( startPos, &wordStart, &wordEnd); if (wordEnd > wordStart+1) break; if (wordEnd == wordStart+1 && ByteAt( wordStart)!=' ') break; } while( --startPos > 0); if (mods & B_SHIFT_KEY) Select( wordStart, endPos); else Select( wordStart, wordStart); } ScrollToSelection(); } else inherited::KeyDown( bytes, numBytes); break; } default: inherited::KeyDown( bytes, numBytes); break; } } else if ( numBytes == 1 ) { // in read-only mode, we use cursor-keys to move scrollbar, and // we remap HOME / END to the vertical scrollbar (not the horizontal, // which is default). switch( bytes[0]) { case B_PAGE_UP: case B_PAGE_DOWN: case B_UP_ARROW: case B_DOWN_ARROW: case B_HOME: case B_END: { // move vertical scrollbar: float min, max, smallStep, bigStep, value; BScrollBar* bar = ScrollBar( B_VERTICAL); if (!bar) return; bar->GetRange( &min, &max); bar->GetSteps( &smallStep, &bigStep); value = bar->Value(); if (bytes[0] == B_UP_ARROW) { value = MAX( value-smallStep, min); } else if (bytes[0] == B_DOWN_ARROW) { value = MIN( value+smallStep, max); } else if (bytes[0] == B_PAGE_UP) { value = MAX( value-bigStep, min); } else if (bytes[0] == B_PAGE_DOWN) { value = MIN( value+bigStep, max); } else if (bytes[0] == B_HOME) { value = min; } else if (bytes[0] == B_END) { value = max; } bar->SetValue( value); break; } default: BTextView::KeyDown( bytes, numBytes); break; } } else inherited::KeyDown( bytes, numBytes); }
SerialWindow::SerialWindow() : BWindow(BRect(100, 100, 400, 400), SerialWindow::kWindowTitle, B_DOCUMENT_WINDOW, B_QUIT_ON_WINDOW_CLOSE | B_AUTO_UPDATE_SIZE_LIMITS) , fLogFilePanel(NULL) { BMenuBar* menuBar = new BMenuBar(Bounds(), "menuBar"); menuBar->ResizeToPreferred(); BRect r = Bounds(); r.top = menuBar->Bounds().bottom + 1; r.right -= B_V_SCROLL_BAR_WIDTH; fTermView = new TermView(r); fTermView->ResizeToPreferred(); r = fTermView->Frame(); r.left = r.right + 1; r.right = r.left + B_V_SCROLL_BAR_WIDTH; r.top -= 1; r.bottom -= B_H_SCROLL_BAR_HEIGHT - 1; BScrollBar* scrollBar = new BScrollBar(r, "scrollbar", NULL, 0, 0, B_VERTICAL); scrollBar->SetTarget(fTermView); ResizeTo(r.right - 1, r.bottom + B_H_SCROLL_BAR_HEIGHT - 1); AddChild(menuBar); AddChild(fTermView); AddChild(scrollBar); fConnectionMenu = new BMenu("Connection"); BMenu* fileMenu = new BMenu("File"); BMenu* settingsMenu = new BMenu("Settings"); fConnectionMenu->SetRadioMode(true); menuBar->AddItem(fConnectionMenu); menuBar->AddItem(fileMenu); menuBar->AddItem(settingsMenu); // TODO edit menu - what's in it ? //BMenu* editMenu = new BMenu("Edit"); //menuBar->AddItem(editMenu); BMenuItem* logFile = new BMenuItem("Log to file" B_UTF8_ELLIPSIS, new BMessage(kMsgLogfile)); fileMenu->AddItem(logFile); #if 0 // TODO implement these BMenuItem* xmodemSend = new BMenuItem("X/Y/ZModem send" B_UTF8_ELLIPSIS, NULL); fileMenu->AddItem(xmodemSend); BMenuItem* xmodemReceive = new BMenuItem( "X/Y/Zmodem receive" B_UTF8_ELLIPSIS, NULL); fileMenu->AddItem(xmodemReceive); #endif // Configuring all this by menus may be a bit unhandy. Make a setting // window instead ? fBaudrateMenu = new BMenu("Baud rate"); fBaudrateMenu->SetRadioMode(true); settingsMenu->AddItem(fBaudrateMenu); fParityMenu = new BMenu("Parity"); fParityMenu->SetRadioMode(true); settingsMenu->AddItem(fParityMenu); fStopbitsMenu = new BMenu("Stop bits"); fStopbitsMenu->SetRadioMode(true); settingsMenu->AddItem(fStopbitsMenu); fFlowcontrolMenu = new BMenu("Flow control"); fFlowcontrolMenu->SetRadioMode(true); settingsMenu->AddItem(fFlowcontrolMenu); fDatabitsMenu = new BMenu("Data bits"); fDatabitsMenu->SetRadioMode(true); settingsMenu->AddItem(fDatabitsMenu); BMessage* message = new BMessage(kMsgSettings); message->AddInt32("parity", B_NO_PARITY); BMenuItem* parityNone = new BMenuItem("None", message); message = new BMessage(kMsgSettings); message->AddInt32("parity", B_ODD_PARITY); BMenuItem* parityOdd = new BMenuItem("Odd", message); message = new BMessage(kMsgSettings); message->AddInt32("parity", B_EVEN_PARITY); BMenuItem* parityEven = new BMenuItem("Even", message); fParityMenu->AddItem(parityNone); fParityMenu->AddItem(parityOdd); fParityMenu->AddItem(parityEven); fParityMenu->SetTargetForItems(be_app); message = new BMessage(kMsgSettings); message->AddInt32("databits", B_DATA_BITS_7); BMenuItem* data7 = new BMenuItem("7", message); message = new BMessage(kMsgSettings); message->AddInt32("databits", B_DATA_BITS_8); BMenuItem* data8 = new BMenuItem("8", message); fDatabitsMenu->AddItem(data7); fDatabitsMenu->AddItem(data8); fDatabitsMenu->SetTargetForItems(be_app); message = new BMessage(kMsgSettings); message->AddInt32("stopbits", B_STOP_BITS_1); BMenuItem* stop1 = new BMenuItem("1", message); message = new BMessage(kMsgSettings); message->AddInt32("stopbits", B_STOP_BITS_2); BMenuItem* stop2 = new BMenuItem("2", message); fStopbitsMenu->AddItem(stop1); fStopbitsMenu->AddItem(stop2); fStopbitsMenu->SetTargetForItems(be_app); // Loop backwards to add fastest rates at top of menu for (int i = sizeof(kBaudrates) / sizeof(char*); --i >= 0;) { message = new BMessage(kMsgSettings); message->AddInt32("baudrate", kBaudrateConstants[i]); char buffer[7]; sprintf(buffer, "%d", kBaudrates[i]); BMenuItem* item = new BMenuItem(buffer, message); fBaudrateMenu->AddItem(item); } fBaudrateMenu->SetTargetForItems(be_app); message = new BMessage(kMsgSettings); message->AddInt32("flowcontrol", B_HARDWARE_CONTROL); BMenuItem* hardware = new BMenuItem("Hardware", message); message = new BMessage(kMsgSettings); message->AddInt32("flowcontrol", B_SOFTWARE_CONTROL); BMenuItem* software = new BMenuItem("Software", message); message = new BMessage(kMsgSettings); message->AddInt32("flowcontrol", B_HARDWARE_CONTROL | B_SOFTWARE_CONTROL); BMenuItem* both = new BMenuItem("Both", message); message = new BMessage(kMsgSettings); message->AddInt32("flowcontrol", 0); BMenuItem* noFlow = new BMenuItem("None", message); fFlowcontrolMenu->AddItem(hardware); fFlowcontrolMenu->AddItem(software); fFlowcontrolMenu->AddItem(both); fFlowcontrolMenu->AddItem(noFlow); fFlowcontrolMenu->SetTargetForItems(be_app); CenterOnScreen(); }
// SavePanel class SavePanel::SavePanel(const char* name, BMessenger* target, entry_ref* startDirectory, uint32 nodeFlavors, bool allowMultipleSelection, BMessage* message, BRefFilter* filter, bool modal, bool hideWhenDone) : BFilePanel(B_SAVE_PANEL, target, startDirectory, nodeFlavors, allowMultipleSelection, message, filter, modal, hideWhenDone), BHandler(name), fConfigWindow(NULL), fFormatM(NULL), fExportMode(EXPORT_MODE_ICON_RDEF) { BWindow* window = Window(); if (!window || !window->Lock()) return; window->SetTitle(B_TRANSLATE("Save image")); // add this instance as BHandler to the window's looper window->AddHandler(this); // find a couple of important views and mess with their layout BView* background = Window()->ChildAt(0); BButton* cancel = dynamic_cast<BButton*>(background->FindView("cancel button")); BView* textview = background->FindView("text view"); BScrollBar* hscrollbar = dynamic_cast<BScrollBar*>(background->FindView("HScrollBar")); if (!background || !cancel || !textview || !hscrollbar) { printf("SavePanel::SavePanel() - couldn't find necessary controls.\n"); return; } _BuildMenu(); BRect rect = textview->Frame(); rect.top = cancel->Frame().top; font_height fh; be_plain_font->GetHeight(&fh); rect.bottom = rect.top + fh.ascent + fh.descent + 5.0; fFormatMF = new BMenuField(rect, "format popup", B_TRANSLATE("Format"), fFormatM, true, B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, B_WILL_DRAW | B_NAVIGABLE); fFormatMF->SetDivider(be_plain_font->StringWidth( B_TRANSLATE("Format")) + 7); fFormatMF->MenuBar()->ResizeToPreferred(); fFormatMF->ResizeToPreferred(); float height = fFormatMF->Bounds().Height() + 8.0; // find all the views that are in the way and // move up them up the height of the menu field BView *poseview = background->FindView("PoseView"); if (poseview) poseview->ResizeBy(0, -height); BButton *insert = (BButton *)background->FindView("default button"); if (hscrollbar) hscrollbar->MoveBy(0, -height); BScrollBar *vscrollbar = (BScrollBar *)background->FindView("VScrollBar"); if (vscrollbar) vscrollbar->ResizeBy(0, -height); BView *countvw = (BView *)background->FindView("CountVw"); if (countvw) countvw->MoveBy(0, -height); textview->MoveBy(0, -height); #if HAIKU_TARGET_PLATFORM_DANO fFormatMF->MoveTo(textview->Frame().left, fFormatMF->Frame().top + 2); #else fFormatMF->MoveTo(textview->Frame().left, fFormatMF->Frame().top); #endif background->AddChild(fFormatMF); // Build the "Settings" button relative to the format menu rect = cancel->Frame(); rect.OffsetTo(fFormatMF->Frame().right + 5.0, rect.top); fSettingsB = new BButton(rect, "settings", B_TRANSLATE("Settings"B_UTF8_ELLIPSIS), new BMessage(MSG_SETTINGS), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, B_WILL_DRAW | B_NAVIGABLE); fSettingsB->ResizeToPreferred(); background->AddChild(fSettingsB); fSettingsB->SetTarget(this); textview->ResizeTo(fSettingsB->Frame().right - fFormatMF->Frame().left, textview->Frame().Height()); // Make sure the smallest window won't draw the "Settings" button over anything else float minWindowWidth = textview->Bounds().Width() + cancel->Bounds().Width() + (insert ? insert->Bounds().Width() : 0.0) + 90; Window()->SetSizeLimits(minWindowWidth, 10000, 250, 10000); if (Window()->Bounds().IntegerWidth() + 1 < minWindowWidth) Window()->ResizeTo(minWindowWidth, Window()->Bounds().Height()); window->Unlock(); }
ProjectSettingsWindow::ProjectSettingsWindow(BRect frame, Project *proj) : DWindow(frame,TR("Project Settings"),B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_NOT_H_RESIZABLE), fProject(proj), fDirty(false) { if (!fProject) debugger("Bad project given to Project Settings window"); fRefFilter = new TypedRefFilter(NULL,B_DIRECTORY_NODE); BMessenger msgr(this); entry_ref projfolder_ref; BEntry(fProject->GetPath().GetFolder()).GetRef(&projfolder_ref); fFilePanel = new BFilePanel(B_OPEN_PANEL,&msgr,&projfolder_ref,B_DIRECTORY_NODE, true, new BMessage(M_ADD_PATH),fRefFilter); fAutolock = new BAutolock(fProject); AddCommonFilter(new EscapeCancelFilter()); BView *top = GetBackgroundView(); BRect r(Bounds()); fTabView = new BTabView(r,"tabview"); top->AddChild(fTabView); r.InsetBy(5,5); r.bottom -= fTabView->TabHeight(); BRect bounds = r.OffsetToCopy(0,0); fGeneralView = new BView(r,TR("General"),B_FOLLOW_ALL,B_WILL_DRAW); fGeneralView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); fTabView->AddTab(fGeneralView); r.right -= 10.0; fTargetText = new AutoTextControl(r,"targetname",TR("Target Name:"), fProject->GetTargetName(), new BMessage(M_TARGET_NAME_CHANGED), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); fGeneralView->AddChild(fTargetText); float pwidth, pheight; fTargetText->GetPreferredSize(&pwidth, &pheight); fTargetText->ResizeTo(r.Width(),pheight); r.bottom = r.top + pheight; fTargetText->SetDivider(fTargetText->StringWidth(TR("Target Name:")) + 5.0); r = fTargetText->Frame(); r.OffsetBy(0,r.Height() + 10.0); BMenu *menu = new BMenu(TR("Target Type")); menu->AddItem(new BMenuItem(TR("Application"),new BMessage(M_SET_TARGET_TYPE))); menu->AddItem(new BMenuItem(TR("Shared Library"),new BMessage(M_SET_TARGET_TYPE))); menu->AddItem(new BMenuItem(TR("Static Library"),new BMessage(M_SET_TARGET_TYPE))); menu->AddItem(new BMenuItem(TR("Device Driver"),new BMessage(M_SET_TARGET_TYPE))); r.right = (bounds.right - 5.0) / 2.0; r.bottom = r.top + 25; fTypeField = new BMenuField(r,"type",TR("Target Type:"),menu); fGeneralView->AddChild(fTypeField); fTypeField->SetDivider(fTypeField->StringWidth(TR("Target Type:")) + 5.0); SetToolTip(fTypeField,TR("The kind of program you want to build")); menu->SetTargetForItems(this); menu->SetLabelFromMarked(true); BMenuItem *item = menu->ItemAt(fProject->TargetType()); if (item) item->SetMarked(true); r.OffsetBy(0,r.Height() + 10.0); BStringView *label = new BStringView(r,"label",TR("Include Paths:")); label->ResizeToPreferred(); fGeneralView->AddChild(label); r = label->Frame(); r.OffsetBy(0,r.Height() + 5.0); // We create a button now so that the list expands to fill the entire window // while leaving space for the two buttons at the bottom. Note that we do not // actually add the button to the window until later to preserve proper // keyboard navigation order BButton *add = new BButton(BRect(0,0,1,1),"addbutton",TR("Add…"), new BMessage(M_SHOW_ADD_PATH), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM); add->ResizeToPreferred(); add->MoveTo(5,fGeneralView->Bounds().bottom - 10.0 - add->Frame().Height()); r.right = bounds.right - 10.0 - B_V_SCROLL_BAR_WIDTH; r.bottom = add->Frame().top - 10.0 - B_H_SCROLL_BAR_HEIGHT; fIncludeList = new IncludeList(r,fProject->GetPath().GetFolder()); BScrollView *scrollView = new BScrollView("scrollview",fIncludeList, B_FOLLOW_ALL,0, true, true); scrollView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); fGeneralView->AddChild(scrollView); float width = 0.0; for (int32 i = 0; i < fProject->CountLocalIncludes(); i++) { BStringItem *item = new BStringItem(fProject->LocalIncludeAt(i).Relative().String()); float strwidth = fIncludeList->StringWidth(item->Text()); width = MAX(width, strwidth); fIncludeList->AddItem(item); } if (width > fIncludeList->Bounds().Width()) { BScrollBar *hbar = scrollView->ScrollBar(B_HORIZONTAL); hbar->SetRange(0.0, width - fIncludeList->Bounds().Width()); } SetToolTip(fIncludeList,TR("The folders you want Paladin to search for header files")); fGeneralView->AddChild(add); BButton *remove = new BButton(BRect(0,0,1,1),"removebutton",TR("Remove"), new BMessage(M_REMOVE_PATH), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM); remove->ResizeToPreferred(); remove->MoveTo(add->Frame().right + 10.0, add->Frame().top); fGeneralView->AddChild(remove); r = bounds; fBuildView = new BView(bounds.OffsetByCopy(5,5),TR("Build"),B_FOLLOW_ALL,B_WILL_DRAW); fBuildView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); fTabView->AddTab(fBuildView); menu = new BMenu(TR("Optimization")); menu->AddItem(new BMenuItem(TR("None"),new BMessage(M_SET_OP_VALUE))); menu->AddItem(new BMenuItem(TR("Some"),new BMessage(M_SET_OP_VALUE))); menu->AddItem(new BMenuItem(TR("More"),new BMessage(M_SET_OP_VALUE))); menu->AddItem(new BMenuItem(TR("Full"),new BMessage(M_SET_OP_VALUE))); r.right = (bounds.right - 5.0) / 2.0; r.bottom = r.top + 25; fOpField = new BMenuField(r,"optimize",TR("Optimize"),menu); fBuildView->AddChild(fOpField); fOpField->SetDivider(fOpField->StringWidth(TR("Optimize")) + 5.0); SetToolTip(fOpField,TR("Compiler optimization level. Disabled when debugging info is checked.")); menu->SetTargetForItems(this); menu->SetLabelFromMarked(true); item = menu->ItemAt(fProject->OpLevel()); if (item) item->SetMarked(true); r.right = bounds.right - 10.0; r.OffsetTo(5, fOpField->Frame().bottom + 5); fOpSizeBox = new BCheckBox(r,"opsizebox",TR("Optimize for size over speed"), new BMessage(M_TOGGLE_OPSIZE)); fOpSizeBox->ResizeToPreferred(); fBuildView->AddChild(fOpSizeBox); r = fOpSizeBox->Frame(); if (fProject->OpForSize()) fOpSizeBox->SetValue(B_CONTROL_ON); if (fProject->Debug()) { fOpField->SetEnabled(false); fOpSizeBox->SetEnabled(false); } r.OffsetBy(0, r.Height() + 10); fDebugBox = new BCheckBox(r,"debugbox",TR("Build debugging information"), new BMessage(M_TOGGLE_DEBUG)); fDebugBox->ResizeToPreferred(); if (fProject->Debug()) fDebugBox->SetValue(B_CONTROL_ON); fBuildView->AddChild(fDebugBox); SetToolTip(fDebugBox,TR("Check this if you want to use your program in a debugger during development." "You'll want to rebuild your project after change this.")); r.OffsetBy(0, r.Height()); fProfileBox = new BCheckBox(r,"profilebox",TR("Build profiling information"), new BMessage(M_TOGGLE_PROFILE)); fProfileBox->ResizeToPreferred(); if (fProject->Profiling()) fProfileBox->SetValue(B_CONTROL_ON); fBuildView->AddChild(fProfileBox); SetToolTip(fProfileBox,TR("Check this if you want to use your program " "with gprof or bprof for profiling.")); r.OffsetBy(0, r.Height() + 10.0); r.right = bounds.right - 10.0; fCompileText = new AutoTextControl(r,"extracc","Extra Compiler Options:", fProject->ExtraCompilerOptions(), new BMessage(M_CCOPTS_CHANGED), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); fBuildView->AddChild(fCompileText); fCompileText->SetDivider(fCompileText->StringWidth(fCompileText->Label()) + 5.0); SetToolTip(fCompileText,TR("Extra GCC flags you wish included when each file is compiled.")); r = fCompileText->Frame(); r.OffsetBy(0,r.Height() + 10); fLinkText = new AutoTextControl(r,"extrald",TR("Extra Linker Options:"), fProject->ExtraLinkerOptions(), new BMessage(M_LDOPTS_CHANGED), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); fBuildView->AddChild(fLinkText); fLinkText->SetDivider(fCompileText->Divider()); SetToolTip(fLinkText,TR("Extra GCC linker flags you wish included when your project is linked.")); fTabView->Select(0L); fBuildView->ResizeTo(fGeneralView->Bounds().Width(),fGeneralView->Bounds().Height()); fTargetText->MakeFocus(true); }
void ColumnListView::UpdateScrollBars() { if(fScrollView) { //Figure out the bounds and scroll if necessary BRect ViewBounds; float DeltaX,DeltaY; do { ViewBounds = Bounds(); //Figure out the width of the page rectangle fPageWidth = fDataWidth; fPageHeight = fDataHeight; //If view runs past the end, make more visible at the beginning DeltaX = 0.0; if(ViewBounds.right > fDataWidth && ViewBounds.left > 0) { DeltaX = ViewBounds.right-fDataWidth; if(DeltaX > ViewBounds.left) DeltaX = ViewBounds.left; } DeltaY = 0.0; if(ViewBounds.bottom > fDataHeight && ViewBounds.top > 0) { DeltaY = ViewBounds.bottom-fDataHeight; if(DeltaY > ViewBounds.top) DeltaY = ViewBounds.top; } if(DeltaX != 0.0 || DeltaY != 0.0) { ScrollTo(BPoint(ViewBounds.left-DeltaX,ViewBounds.top-DeltaY)); ViewBounds = Bounds(); } if(ViewBounds.right-ViewBounds.left > fDataWidth) fPageWidth = ViewBounds.right; if(ViewBounds.bottom-ViewBounds.top > fDataHeight) fPageHeight = ViewBounds.bottom; }while(DeltaX != 0.0 || DeltaY != 0.0); //Figure out the ratio of the bounds rectangle width or height to the page rectangle width or height float WidthProp = (ViewBounds.right-ViewBounds.left)/fPageWidth; float HeightProp = (ViewBounds.bottom-ViewBounds.top)/fPageHeight; BScrollBar* HScrollBar = fScrollView->ScrollBar(B_HORIZONTAL); BScrollBar* VScrollBar = fScrollView->ScrollBar(B_VERTICAL); //Set the scroll bar ranges and proportions. If the whole document is visible, inactivate the //slider if(HScrollBar) { if(WidthProp >= 1.0 && ViewBounds.left == 0.0) HScrollBar->SetRange(0.0,0.0); else HScrollBar->SetRange(0.0,fPageWidth-(ViewBounds.right-ViewBounds.left)); HScrollBar->SetProportion(WidthProp); //Set the step values HScrollBar->SetSteps(20.0,ViewBounds.right-ViewBounds.left); } if(VScrollBar) { if(HeightProp >= 1.0 && ViewBounds.top == 0.0) { VScrollBar->SetRange(0.0,0.0); if(fFillerView) fFillerView->SetViewColor(BeInactiveControlGrey); } else { VScrollBar->SetRange(0.0,fPageHeight-(ViewBounds.bottom-ViewBounds.top)); if(fFillerView) fFillerView->SetViewColor(BeBackgroundGrey); } VScrollBar->SetProportion(HeightProp); } } }
void ChatWindow::MessageReceived( BMessage* aMessage ) { switch( aMessage->what ) { case SHOW_MESSAGE: { const char *msg; aMessage->FindString( "msg", &msg ); time_t _now = time( NULL ); struct tm *now = localtime( &_now ); BString *str = NULL; BString *str2 = NULL; char *string = NULL; Person *person = NULL; for( int i = 0; i < iWindow->GetProfile()->GetUserlist()->GetList()->CountItems(); i++ ) { person = ( Person* ) iWindow->GetProfile()->GetUserlist()->GetList()->ItemAt( i ); if( iWho == person->GetUIN() ) { str = new BString(); str->SetTo( person->GetDisplay() ); break; } } if( !str ) { str = new BString(); *str << ( int32 ) iWho; } BFont *font = new BFont( be_plain_font ); font->SetSize( 16.0 ); font->SetEncoding( B_ISO_8859_2 ); rgb_color yellow = { 255, 255, 0, 0 }; rgb_color red = { 255, 0, 0, 0 }; rgb_color white = { 255, 255, 255, 0 }; string = ( char* ) calloc( strlen( "[00:00] " ), 1 ); sprintf( string, "[%02d:%02d] ", now->tm_hour, now->tm_min); str2 = new BString(); str2->SetTo( string ); free( string ); iChat->SetFontAndColor( iChat->TextLength(), iChat->TextLength() + str2->Length(), font, B_FONT_ALL, &yellow ); iChat->Insert( iChat->TextLength(), str2->String(), str2->Length() ); str->Append( ": " ); iChat->SetFontAndColor( iChat->TextLength(), iChat->TextLength() + str->Length(), font, B_FONT_ALL, &red ); iChat->Insert( iChat->TextLength(), str->String(), str->Length() ); str2->SetTo( msg ); str2->Append( "\n" ); iChat->SetFontAndColor( iChat->TextLength(), iChat->TextLength() + str2->Length(), font, B_FONT_ALL, &white ); iChat->Insert( iChat->TextLength(), str2->String(), str2->Length() ); BScrollBar * scrollBar = iScrollView->ScrollBar( B_VERTICAL ); if( scrollBar->LockLooper() ) { float max,min; scrollBar->GetRange( &min, &max ); scrollBar->SetValue( max ); scrollBar->UnlockLooper(); } delete str; delete str2; break; } case BEGG_SEND: { if( iSayControl->LockLooper()) { if( !(*iSayControl->Text() ) ) { /* nothing to send */ iSayControl->UnlockLooper(); break; } /* first we add message into chat window */ time_t _now = time( NULL ); struct tm * now = localtime( &_now ); BString str; BString str2; char *string; // int id = iNetwork->GetIdent(); BFont *font = new BFont( be_plain_font ); font->SetSize( 16.0 ); font->SetEncoding( B_ISO_8859_2 ); rgb_color yellow = { 255, 255, 0, 0 }; rgb_color green = { 0, 255, 0, 0 }; rgb_color white = { 255, 255, 255, 0 }; string = ( char* ) calloc( strlen( "[00:00] " ), 1 ); sprintf( string, "[%02d:%02d] ", now->tm_hour, now->tm_min ); str2.SetTo( string ); free( string ); iChat->SetFontAndColor( iChat->TextLength(), iChat->TextLength() + str2.Length(), font, B_FONT_ALL, &yellow ); iChat->Insert( iChat->TextLength(), str2.String(), str2.Length() ); str.SetTo( iWindow->GetProfile()->GetProfileName() ); str.Append( ": " ); iChat->SetFontAndColor( iChat->TextLength(), iChat->TextLength() + str.Length(), font, B_FONT_ALL, &green ); iChat->Insert( iChat->TextLength(), str.String(), str.Length() ); str2.SetTo( iSayControl->Text() ); str2.Append( "\n" ); iChat->SetFontAndColor( iChat->TextLength(), iChat->TextLength() + str2.Length(), font, B_FONT_ALL, &white ); iChat->Insert( iChat->TextLength(), str2.String(), str2.Length() ); /* scroll down */ BScrollBar * scrollBar = iScrollView->ScrollBar( B_VERTICAL ); if( scrollBar->LockLooper() ) { float max,min; scrollBar->GetRange( &min, &max ); scrollBar->SetValue( max ); scrollBar->UnlockLooper(); } /* sending... */ BMessage *newmessage; newmessage = new BMessage( SEND_MESSAGE ); newmessage->AddInt32( "who", iWho ); newmessage->AddString( "msg", iSayControl->Text()); BMessenger( iNetwork ).SendMessage( newmessage ); delete newmessage; /* clearing edit box */ iSayControl->SetText( NULL ); iSayControl->UnlockLooper(); } break; } default: BWindow::MessageReceived( aMessage ); break; } }