ProjectWindow::ProjectWindow(BRect frame, Project *project) : DWindow(frame, "Paladin", B_DOCUMENT_WINDOW, B_NOT_ZOOMABLE | B_WILL_ACCEPT_FIRST_CLICK), fErrorWindow(NULL), fFilePanel(NULL), fProject(project), fSourceControl(NULL), fShowingLibs(false), fMenusLocked(false), fBuilder(BMessenger(this)) { AddCommonFilter(new AltTabFilter()); SetSizeLimits(200,30000,200,30000); RegisterWindow(); // This is for our in-program debug menu which comes in handy now and then. // Paladin -d doesn't always get the job done AddShortcut('9', B_COMMAND_KEY | B_SHIFT_KEY | B_CONTROL_KEY, new BMessage(M_TOGGLE_DEBUG_MENU)); if (fProject) { fSourceControl = GetSCM(fProject->SourceControl()); if (fSourceControl) { if (gPrintDebugMode > 0) fSourceControl->SetDebugMode(true); fSourceControl->SetUpdateCallback(SCMOutputCallback); fSourceControl->SetWorkingDirectory(fProject->GetPath().GetFolder()); if (fSourceControl->NeedsInit(fProject->GetPath().GetFolder())) fSourceControl->CreateRepository(fProject->GetPath().GetFolder()); } } BView *top = GetBackgroundView(); BRect bounds(Bounds()); BRect r(bounds); r.bottom = 16; fMenuBar = new BMenuBar(r,"documentbar"); top->AddChild(fMenuBar); r = bounds; r.top = fMenuBar->Frame().bottom + 1; r.right -= B_V_SCROLL_BAR_WIDTH; r.bottom -= B_H_SCROLL_BAR_HEIGHT; fProjectList = new ProjectList(fProject, r,"filelist",B_FOLLOW_ALL); fProjectList->SetInvocationMessage(new BMessage(M_EDIT_FILE)); BScrollView *scrollView = new BScrollView("scrollView",fProjectList, B_FOLLOW_ALL,0,false,true); top->AddChild(scrollView); fProjectList->SetTarget(this); r.top = r.bottom + 1; r.bottom = Bounds().bottom; fStatusBar = new BStringView(r,"statusbar", NULL, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM); top->AddChild(fStatusBar); fStatusBar->SetViewColor(235,235,235); fStatusBar->SetFontSize(10.0); SetupMenus(); if (project) { BString title("Paladin: "); title << project->GetName(); SetTitle(title.String()); for (int32 i = 0; i < project->CountGroups(); i++) { SourceGroup *group = project->GroupAt(i); SourceGroupItem *groupitem = new SourceGroupItem(group); fProjectList->AddItem(groupitem); groupitem->SetExpanded(group->expanded); for (int32 j = 0; j < group->filelist.CountItems(); j++) { SourceFile *file = group->filelist.ItemAt(j); SourceFileItem *fileitem = new SourceFileItem(file,1); // fProjectList->AddUnder(fileitem,groupitem); fProjectList->AddItem(fileitem); BString abspath = file->GetPath().GetFullPath(); if (abspath[0] != '/') { abspath.Prepend("/"); abspath.Prepend(project->GetPath().GetFolder()); } BEntry entry(abspath.String()); if (entry.Exists()) { if (project->CheckNeedsBuild(file,false)) { fileitem->SetDisplayState(SFITEM_NEEDS_BUILD); fProjectList->InvalidateItem(fProjectList->IndexOf(fileitem)); } else file->SetBuildFlag(BUILD_NO); } else { fileitem->SetDisplayState(SFITEM_MISSING); fProjectList->InvalidateItem(fProjectList->IndexOf(fileitem)); } } } } BNode node(fProject->GetPath().GetFullPath()); if (node.ReadAttr("project_frame",B_RECT_TYPE,0,&r,sizeof(BRect)) == sizeof(BRect)) { if (r.Width() < 200) r.right = r.left + 200; if (r.Height() < 200) r.top = r.bottom + 200; MoveTo(r.left,r.top); ResizeTo(r.Width(),r.Height()); } fProjectList->MakeFocus(true); if (gShowFolderOnOpen) { // Duplicated code from MessageReceived::M_SHOW_PROJECT_FOLDER. Doing // it here in combo with snooze() makes it much more likely that the // opened project window is frontmost instead of the project folder's window entry_ref ref; BEntry(fProject->GetPath().GetFolder()).GetRef(&ref); BMessenger msgr("application/x-vnd.Be-TRAK"); BMessage reply; BMessage openmsg(B_REFS_RECEIVED); openmsg.AddRef("refs",&ref); msgr.SendMessage(&openmsg); snooze(50000); } if (gAutoSyncModules) PostMessage(M_SYNC_MODULES); }