void ProjectWindow::ShowErrorWindow(ErrorList *list) { if (fErrorWindow && list) { BMessage msg; list->Flatten(msg); msg.what = M_BUILD_WARNINGS; fErrorWindow->PostMessage(&msg); } else { BRect screen(BScreen().Frame()); BRect r(screen); r.left = r.right / 4.0; r.right *= .75; r.top = r.bottom - 200; BDeskbar deskbar; if (deskbar.Location() == B_DESKBAR_BOTTOM) r.OffsetBy(0,-deskbar.Frame().Height()); fErrorWindow = new ErrorWindow(r,this,list); fErrorWindow->Show(); } fStatusBar->SetText(""); }
void AsciiWindow::Zoom(BPoint, float, float) { if (!fIsZoomed) { fLastFrame = Frame(); BDeskbar deskbar; BRect deskbarFrame = deskbar.Frame(); BRect screenFrame = (BScreen(this)).Frame(); switch (deskbar.Location()) { case B_DESKBAR_TOP: MoveTo(std::max(fLastFrame.left, screenFrame.left + 4.0f), deskbarFrame.bottom + 28.0f); ResizeTo(std::max(fLastFrame.Width(), kWindowWidth), screenFrame.bottom - deskbarFrame.Height() - 33.0f); break; case B_DESKBAR_BOTTOM: MoveTo(std::max(fLastFrame.left, screenFrame.left + 4.0f), 26.0f); ResizeTo(std::max(fLastFrame.Width(), kWindowWidth), deskbarFrame.top - 33.0f); break; case B_DESKBAR_LEFT_TOP: case B_DESKBAR_LEFT_BOTTOM: MoveTo(std::max(fLastFrame.left, deskbarFrame.right + 7.0f), 26.0f); ResizeTo(std::max(fLastFrame.Width(), kWindowWidth), screenFrame.bottom - 30.0f); break; case B_DESKBAR_RIGHT_TOP: case B_DESKBAR_RIGHT_BOTTOM: ResizeTo(std::max(fLastFrame.Width(), kWindowWidth), screenFrame.bottom - 30.0f); if (fLastFrame.right + 7.0f > deskbarFrame.left) { MoveTo(fLastFrame.left - 7.0f - (fLastFrame.right - deskbarFrame.left), 26.0f); } else { MoveTo(std::max(fLastFrame.left, screenFrame.left + 4.0f), 26.0f); } break; default: MoveTo(std::max(fLastFrame.left, screenFrame.left + 4.0f), 26.0f); ResizeTo(std::max(fLastFrame.Width(), kWindowWidth), screenFrame.bottom - 30.0f); break; } } else { MoveTo(fLastFrame.LeftTop()); ResizeTo(fLastFrame.Width(), fLastFrame.Height()); } fIsZoomed = !fIsZoomed; }
void NotificationWindow::SetPosition() { Layout(true); BRect bounds = DecoratorFrame(); float width = Bounds().Width() + 1; float height = Bounds().Height() + 1; float leftOffset = Frame().left - bounds.left; float topOffset = Frame().top - bounds.top + 1; float rightOffset = bounds.right - Frame().right; float bottomOffset = bounds.bottom - Frame().bottom; // Size of the borders around the window float x = Frame().left, y = Frame().top; // If we can't guess, don't move... BDeskbar deskbar; BRect frame = deskbar.Frame(); switch (deskbar.Location()) { case B_DESKBAR_TOP: // Put it just under, top right corner y = frame.bottom + topOffset; x = frame.right - width + rightOffset; break; case B_DESKBAR_BOTTOM: // Put it just above, lower left corner y = frame.top - height - bottomOffset; x = frame.right - width + rightOffset; break; case B_DESKBAR_RIGHT_TOP: x = frame.left - width - rightOffset; y = frame.top - topOffset; break; case B_DESKBAR_LEFT_TOP: x = frame.right + leftOffset; y = frame.top - topOffset; break; case B_DESKBAR_RIGHT_BOTTOM: y = frame.bottom - height + bottomOffset; x = frame.left - width - rightOffset; break; case B_DESKBAR_LEFT_BOTTOM: y = frame.bottom - height + bottomOffset; x = frame.right + leftOffset; break; default: break; } MoveTo(x, y); }
void NotificationWindow::PopupAnimation(float width, float height) { float x = 0, y = 0, sx, sy; float pad = 0; BDeskbar deskbar; BRect frame = deskbar.Frame(); switch (deskbar.Location()) { case B_DESKBAR_TOP: // Put it just under, top right corner sx = frame.right; sy = frame.bottom + pad; y = sy; x = sx - width - pad; break; case B_DESKBAR_BOTTOM: // Put it just above, lower left corner sx = frame.right; sy = frame.top - height - pad; y = sy; x = sx - width - pad; break; case B_DESKBAR_LEFT_TOP: // Put it just to the right of the deskbar sx = frame.right + pad; sy = frame.top - height; x = sx; y = frame.top + pad; break; case B_DESKBAR_RIGHT_TOP: // Put it just to the left of the deskbar sx = frame.left - width - pad; sy = frame.top - height; x = sx; y = frame.top + pad; break; case B_DESKBAR_LEFT_BOTTOM: // Put it to the right of the deskbar. sx = frame.right + pad; sy = frame.bottom; x = sx; y = sy - height - pad; break; case B_DESKBAR_RIGHT_BOTTOM: // Put it to the left of the deskbar. sx = frame.left - width - pad; sy = frame.bottom; y = sy - height - pad; x = sx; break; default: break; } MoveTo(x, y); if (IsHidden() && fViews.size() != 0) Show(); // Activate();// it hides floaters from apps :-( }
void ProjectWindow::MessageReceived(BMessage *msg) { status_t status; if ( (msg->WasDropped() && msg->what == B_SIMPLE_DATA) || msg->what == M_ADD_FILES) { fAddFileStruct.refmsg = *msg; fAddFileStruct.parent = this; uint32 buttons; fProjectList->GetMouse(&fAddFileStruct.droppt,&buttons); thread_id addThread = spawn_thread(AddFileThread,"file adding thread", B_NORMAL_PRIORITY, &fAddFileStruct); if (addThread >= 0) resume_thread(addThread); } switch (msg->what) { case M_IMPORT_REFS: { fImportStruct.refmsg = *msg; fImportStruct.parent = this; thread_id importThread = spawn_thread(ImportFileThread,"file import thread", B_NORMAL_PRIORITY, &fImportStruct); if (importThread >= 0) resume_thread(importThread); break; } case M_BACKUP_PROJECT: { thread_id backupThread = spawn_thread(BackupThread,"project backup thread", B_NORMAL_PRIORITY, this); if (backupThread >= 0) { fStatusBar->SetText(TR("Backing up project")); UpdateIfNeeded(); SetMenuLock(true); resume_thread(backupThread); } break; } case M_GET_CHECK_IN_MSG: { if (!fSourceControl) { printf("NULL source control\n"); break; } BString out; fSourceControl->GetCheckinHeader(out); bool select = false; if (out.CountChars() > 1) out.Prepend("\n\n"); else { out = TR("Enter the description for the changes in this revision."); select = true; } GetTextWindow *gtw = new GetTextWindow("Paladin", out.String(), BMessage(M_CHECK_IN_PROJECT), BMessenger(this)); if (!select) gtw->GetTextView()->Select(0,0); gtw->Show(); break; } case M_CHECK_IN_PROJECT: { BString commitstr; if (msg->FindString("text", &commitstr) == B_OK && fSourceControl) { SCMOutputWindow *win = new SCMOutputWindow(TR("Commit")); win->Show(); fSourceControl->Commit(commitstr.String()); } break; } case M_REVERT_PROJECT: { if (!fSourceControl) break; int32 result = ShowAlert(TR("This will undo all changes since the last commit. " "Continue?"), "Don't Revert", "Revert"); if (result == 1) { SCMOutputWindow *win = new SCMOutputWindow(TR("Revert")); win->Show(); fSourceControl->Revert(NULL); } break; } case M_REBUILD_FILE: case M_ADD_SELECTION_TO_REPO: case M_REMOVE_SELECTION_FROM_REPO: case M_REVERT_SELECTION: case M_DIFF_SELECTION: { ActOnSelectedFiles(msg->what); break; } case M_DIFF_PROJECT: { if (fSourceControl) { SCMOutputWindow *win = new SCMOutputWindow(TR("Differences")); win->Show(); fSourceControl->Diff(NULL); } break; } case M_PROJECT_SCM_STATUS: { if (fSourceControl) { SCMOutputWindow *win = new SCMOutputWindow(TR("Project Status")); BString strstatus; fSourceControl->GetChangeStatus(strstatus); win->GetTextView()->SetText(strstatus.String()); win->Show(); } break; } case M_PUSH_PROJECT: { if (fSourceControl) { SCMOutputWindow *win = new SCMOutputWindow(TR("Push")); win->Show(); fSourceControl->Push(NULL); } break; } case M_PULL_PROJECT: { if (fSourceControl) { SCMOutputWindow *win = new SCMOutputWindow(TR("Pull")); win->Show(); status = fSourceControl->Pull(NULL); if (!status) ShowAlert("Unable to pull from the remote repository. If it " "uses a secure connection, please set up the appropriate " "SSH keys on the remote server.", "OK"); } break; } case M_CULL_EMPTY_GROUPS: { CullEmptyGroups(); break; } case M_RUN_FILE_TYPES: { int32 selection = fProjectList->FullListCurrentSelection(); if (selection < 0) break; SourceFileItem *item = dynamic_cast<SourceFileItem*>(fProjectList->FullListItemAt(selection)); if (!item) break; SpawnFileTypes(item->GetData()->GetPath()); break; } case M_OPEN_PARENT_FOLDER: { BMessage openmsg(B_REFS_RECEIVED); int32 selindex = 0; int32 selection = fProjectList->FullListCurrentSelection(); selindex++; if (selection >= 0) { while (selection >= 0) { SourceFileItem *item = dynamic_cast<SourceFileItem*>(fProjectList->FullListItemAt(selection)); if (!item) break; SourceFile *file = item->GetData(); BString abspath = file->GetPath().GetFullPath(); if (abspath[0] != '/') { abspath.Prepend("/"); abspath.Prepend(fProject->GetPath().GetFolder()); } DPath filepath(abspath); entry_ref ref; BEntry(filepath.GetFolder()).GetRef(&ref); openmsg.AddRef("refs",&ref); selection = fProjectList->FullListCurrentSelection(selindex++); } BMessenger msgr("application/x-vnd.Be-TRAK"); msgr.SendMessage(&openmsg); } break; } case M_SHOW_PROJECT_FOLDER: { entry_ref ref; BEntry(fProject->GetPath().GetFolder()).GetRef(&ref); BMessenger msgr("application/x-vnd.Be-TRAK"); BMessage openmsg(B_REFS_RECEIVED); openmsg.AddRef("refs",&ref); msgr.SendMessage(&openmsg); break; } case M_SHOW_ASCII_TABLE: { AsciiWindow *ascwin = new AsciiWindow(); ascwin->Show(); break; } case M_SHOW_VREGEX: { VRegWindow *vregwin = new VRegWindow(); vregwin->Show(); break; } case M_SHOW_LICENSES: { LicenseManager *man = new LicenseManager(fProject->GetPath().GetFolder()); man->Show(); break; } case M_RUN_TOOL: { BString sig; if (msg->FindString("signature", &sig) == B_OK) { LaunchHelper launcher(sig.String()); launcher.Launch(); } break; } case M_MAKE_MAKE: { DPath out(fProject->GetPath().GetFolder()); out.Append("Makefile"); if (MakeMake(fProject,out) == B_OK); { BEntry entry(out.GetFullPath()); entry_ref ref; if (entry.InitCheck() == B_OK) { entry.GetRef(&ref); BMessage refmsg(B_REFS_RECEIVED); refmsg.AddRef("refs",&ref); be_app->PostMessage(&refmsg); } } break; } case M_SHOW_CODE_LIBRARY: { #ifdef BUILD_CODE_LIBRARY CodeLibWindow *libwin = CodeLibWindow::GetInstance(BRect(100,100,500,350)); libwin->Show(); #endif break; } case M_OPEN_PARTNER: { int32 selection = fProjectList->FullListCurrentSelection(); if (selection < 0) break; SourceFileItem *item = dynamic_cast<SourceFileItem*>( fProjectList->FullListItemAt(selection)); if (!item) break; entry_ref ref; BEntry(fProject->GetPathForFile(item->GetData()).GetFullPath()).GetRef(&ref); BMessage refmsg(M_OPEN_PARTNER); refmsg.AddRef("refs",&ref); be_app->PostMessage(&refmsg); break; } case M_NEW_GROUP: { MakeGroup(fProjectList->FullListCurrentSelection()); PostMessage(M_SHOW_RENAME_GROUP); break; } case M_SHOW_RENAME_GROUP: { int32 selection = fProjectList->FullListCurrentSelection(); SourceGroupItem *groupItem = NULL; if (selection < 0) { // Don't need a selection if there is only one group in the project if (fProject->CountGroups() == 1) groupItem = fProjectList->ItemForGroup(fProject->GroupAt(0)); } else { BStringItem *strItem = (BStringItem*)fProjectList->FullListItemAt(selection); groupItem = fProjectList->GroupForItem(strItem); } if (!groupItem) break; GroupRenameWindow *grwin = new GroupRenameWindow(groupItem->GetData(), BMessage(M_RENAME_GROUP), BMessenger(this)); grwin->Show(); break; } case M_RENAME_GROUP: { SourceGroup *group; BString newname; if (msg->FindPointer("group",(void**)&group) != B_OK || msg->FindString("newname",&newname) != B_OK) break; group->name = newname; SourceGroupItem *groupItem = fProjectList->ItemForGroup(group); if (!groupItem) break; groupItem->SetText(newname.String()); fProjectList->InvalidateItem(fProjectList->IndexOf(groupItem)); fProject->Save(); break; } case M_SORT_GROUP: { int32 selection = fProjectList->FullListCurrentSelection(); SourceGroupItem *groupItem = NULL; if (selection < 0) { // Don't need a selection if there is only one group in the project if (fProject->CountGroups() == 1) groupItem = fProjectList->ItemForGroup(fProject->GroupAt(0)); } else { BStringItem *strItem = (BStringItem*)fProjectList->FullListItemAt(selection); groupItem = fProjectList->GroupForItem(strItem); } if (!groupItem) break; fProjectList->SortItemsUnder(groupItem,true,compare_source_file_items); groupItem->GetData()->Sort(); fProject->Save(); break; } case M_TOGGLE_ERROR_WINDOW: { ToggleErrorWindow(fProject->GetErrorList()); break; } case M_SHOW_ERROR_WINDOW: { ShowErrorWindow(fProject->GetErrorList()); break; } case M_SHOW_PROJECT_SETTINGS: { BRect r(0,0,350,300); BRect screen(BScreen().Frame()); r.OffsetTo((screen.Width() - r.Width()) / 2.0, (screen.Height() - r.Height()) / 2.0); ProjectSettingsWindow *win = new ProjectSettingsWindow(r,fProject); win->Show(); break; } case M_SHOW_RUN_ARGS: { RunArgsWindow *argwin = new RunArgsWindow(fProject); argwin->Show(); break; } case M_JUMP_TO_MSG: { entry_ref ref; if (msg->FindRef("refs",&ref) == B_OK) { msg->what = B_REFS_RECEIVED; be_app->PostMessage(msg); } break; } case B_ABOUT_REQUESTED: { be_app->PostMessage(B_ABOUT_REQUESTED); break; } case M_SHOW_OPEN_PROJECT: { be_app->PostMessage(msg); break; } case M_NEW_WINDOW: { be_app->PostMessage(M_NEW_PROJECT); break; } case M_SHOW_PROGRAM_SETTINGS: { PrefsWindow *prefwin = new PrefsWindow(BRect(0,0,500,400)); prefwin->Show(); break; } case M_SHOW_FIND_AND_OPEN_PANEL: { BString text; msg->FindString("name",&text); // Passing a NULL string to this is OK FindOpenFileWindow *findwin = new FindOpenFileWindow(text.String()); findwin->Show(); break; } case M_FILE_NEEDS_BUILD: { SourceFile *file; if (msg->FindPointer("file",(void**)&file) == B_OK) { SourceFileItem *item = fProjectList->ItemForFile(file); if (item) { item->SetDisplayState(SFITEM_NEEDS_BUILD); fProjectList->InvalidateItem(fProjectList->IndexOf(item)); } } break; } case M_EDIT_FILE: { int32 i = 0; int32 selection = fProjectList->FullListCurrentSelection(i); i++; BMessage refmsg(B_REFS_RECEIVED); while (selection >= 0) { SourceFileItem *item = dynamic_cast<SourceFileItem*> (fProjectList->FullListItemAt(selection)); if (item && item->GetData()) { BString abspath = item->GetData()->GetPath().GetFullPath(); if (abspath[0] != '/') { abspath.Prepend("/"); abspath.Prepend(fProject->GetPath().GetFolder()); } BEntry entry(abspath.String()); if (entry.InitCheck() == B_OK) { entry_ref ref; entry.GetRef(&ref); refmsg.AddRef("refs",&ref); } else { if (!entry.Exists()) { BString errmsg = TR("Couldn't find XXXXX. It may have been moved or renamed."); errmsg.ReplaceFirst("XXXXX",abspath.String()); ShowAlert(errmsg.String()); } } } else { SourceGroupItem *groupItem = dynamic_cast<SourceGroupItem*> (fProjectList->FullListItemAt(selection)); if (groupItem) { if (groupItem->IsExpanded()) fProjectList->Collapse(groupItem); else fProjectList->Expand(groupItem); groupItem->GetData()->expanded = groupItem->IsExpanded(); } } selection = fProjectList->CurrentSelection(i); i++; } be_app->PostMessage(&refmsg); break; } case M_LIBWIN_CLOSED: { fShowingLibs = false; break; } case M_SHOW_LIBRARIES: { fShowingLibs = true; LibraryWindow *libwin = new LibraryWindow(Frame().OffsetByCopy(15,15), BMessenger(this), fProject); libwin->Show(); break; } case M_SHOW_ADD_NEW_PANEL: { AddNewFileWindow *anfwin = new AddNewFileWindow(BMessage(M_ADD_NEW_FILE), BMessenger(this)); anfwin->Show(); break; } case M_SHOW_FIND_IN_PROJECT_FILES: { if (!gLuaAvailable) { ShowAlert("Paladin's multi-file Find window depends on Lua. It will " "need to be installed if you wish to use this feature.", "OK", NULL, NULL, B_STOP_ALERT); break; } FindWindow *findwin = new FindWindow(); findwin->Show(); break; } case M_ADD_NEW_FILE: { BString name; bool makepair; if (msg->FindString("name",&name) == B_OK && msg->FindBool("makepair",&makepair) == B_OK) AddNewFile(name,makepair); break; } case M_SHOW_ADD_PANEL: { if (!fFilePanel) { BMessenger msgr(this); BEntry entry(fProject->GetPath().GetFolder()); entry_ref ref; entry.GetRef(&ref); fFilePanel = new BFilePanel(B_OPEN_PANEL,&msgr,&ref,B_FILE_NODE,true, new BMessage(M_ADD_FILES)); } fFilePanel->Show(); break; } case M_REMOVE_FILES: { bool save = false; for (int32 i = 0; i < fProjectList->CountItems(); i++) { SourceFileItem *item = dynamic_cast<SourceFileItem*>(fProjectList->ItemAt(i)); if (item && item->IsSelected()) { fProjectList->RemoveItem(item); fProject->RemoveFile(item->GetData()); delete item; save = true; i--; } } CullEmptyGroups(); if (save) fProject->Save(); break; } case M_EMPTY_CCACHE: { // We don't do this when forcing a rebuild of the sources because sometimes it // can take quite a while if (gUseCCache && gCCacheAvailable) { fStatusBar->SetText(TR("Emptying build cache")); UpdateIfNeeded(); system("ccache -c > /dev/null"); fStatusBar->SetText(""); UpdateIfNeeded(); } break; } case M_FORCE_REBUILD: { fProject->ForceRebuild(); for (int32 i = 0; i < fProjectList->FullListCountItems(); i++) { SourceFileItem *item = dynamic_cast<SourceFileItem*>(fProjectList->FullListItemAt(i)); if (!item) continue; SourceFile *file = item->GetData(); if (file->UsesBuild()) { item->SetDisplayState(SFITEM_NEEDS_BUILD); fProjectList->InvalidateItem(i); } } // This is necessary because InvalidateItem() uses indices from ItemAt(), // not FullListItemAt fProjectList->Invalidate(); break; } case M_UPDATE_DEPENDENCIES: { UpdateDependencies(); break; } case M_MAKE_PROJECT: case M_BUILD_PROJECT: { fBuildingFile = 0; DoBuild(POSTBUILD_NOTHING); break; } case M_RUN_PROJECT: { DoBuild(POSTBUILD_RUN); break; } case M_RUN_IN_TERMINAL: { DoBuild(POSTBUILD_RUN_IN_TERMINAL); break; } case M_DEBUG_PROJECT: { if (!fProject->Debug()) { BString errmsg = TR("Your project does not have debugging information compiled "); errmsg << TR("in and will need to be rebuilt to debug. Do you wish to rebuild and ") << TR("run the debugger?"); int32 result = ShowAlert("Debugging information needs to compiled into " "your project. This may take some time for large " "projects. Do you wish to rebuild and run " "the debugger?", "Rebuild","Cancel"); if (result == 1) break; fProject->SetDebug(true); fProject->Save(); fProject->ForceRebuild(); } DoBuild(POSTBUILD_DEBUG); break; } case M_EXAMINING_FILE: { SourceFile *file; if (msg->FindPointer("file",(void**)&file) == B_OK) { BString out; out << TR("Examining ") << file->GetPath().GetFileName(); fStatusBar->SetText(out.String()); } break; } case M_BUILDING_FILE: { SourceFile *file; if (msg->FindPointer("sourcefile",(void**)&file) == B_OK) { SourceFileItem *item = fProjectList->ItemForFile(file); if (item) { item->SetDisplayState(SFITEM_BUILDING); fProjectList->InvalidateItem(fProjectList->IndexOf(item)); BString out; int32 count,total; if (msg->FindInt32("count",&count) == B_OK && msg->FindInt32("total",&total) == B_OK) { fBuildingFile = MAX(fBuildingFile, count); out << "(" << fBuildingFile << "/" << total << ") "; } out << TR("Building ") << item->Text(); fStatusBar->SetText(out.String()); } } break; } case M_BUILDING_DONE: { SourceFile *file; if (msg->FindPointer("sourcefile",(void**)&file) == B_OK) { SourceFileItem *item = fProjectList->ItemForFile(file); if (item) { item->SetDisplayState(SFITEM_NORMAL); fProjectList->InvalidateItem(fProjectList->IndexOf(item)); } } break; } case M_LINKING_PROJECT: { fStatusBar->SetText(TR("Linking")); break; } case M_UPDATING_RESOURCES: { fStatusBar->SetText(TR("Updating Resources")); break; } case M_DOING_POSTBUILD: { fStatusBar->SetText(TR("Performing Post-build tasks")); break; } case M_BUILD_FAILURE: { SetMenuLock(false); // fall through } case M_BUILD_MESSAGES: case M_BUILD_WARNINGS: { if (!fErrorWindow) { BRect screen(BScreen().Frame()); BRect r(screen); r.left = r.right / 4.0; r.right *= .75; r.top = r.bottom - 200; BDeskbar deskbar; if (deskbar.Location() == B_DESKBAR_BOTTOM) r.OffsetBy(0,-deskbar.Frame().Height()); fErrorWindow = new ErrorWindow(r,this); fErrorWindow->Show(); } else { if (!fErrorWindow->IsFront()) fErrorWindow->Activate(); } fStatusBar->SetText(""); // Should this be an Unflatten or an Append? ErrorList *errorList = fProject->GetErrorList(); errorList->Unflatten(*msg); fErrorWindow->PostMessage(msg); break; } case M_BUILD_SUCCESS: { SetMenuLock(false); fStatusBar->SetText(""); break; } case M_ERRORWIN_CLOSED: { fErrorWindow = NULL; break; } case M_SYNC_MODULES: { #ifdef BUILD_CODE_LIBRARY thread_id syncID = spawn_thread(SyncThread,"module update thread", B_NORMAL_PRIORITY, this); if (syncID >= 0) resume_thread(syncID); #endif break; } case M_TOGGLE_DEBUG_MENU: { ToggleDebugMenu(); break; } case M_DEBUG_DUMP_DEPENDENCIES: { DumpDependencies(fProject); break; } case M_DEBUG_DUMP_INCLUDES: { DumpIncludes(fProject); break; } default: { DWindow::MessageReceived(msg); break; } } }
void NotificationWindow::SetPosition() { Layout(true); BRect bounds = DecoratorFrame(); float width = Bounds().Width() + 1; float height = Bounds().Height() + 1; float leftOffset = Frame().left - bounds.left; float topOffset = Frame().top - bounds.top + 1; float rightOffset = bounds.right - Frame().right; float bottomOffset = bounds.bottom - Frame().bottom; // Size of the borders around the window float x = Frame().left; float y = Frame().top; // If we cant guess, don't move... BPoint location(x, y); BDeskbar deskbar; // If notification and deskbar position are same // then follow deskbar position uint32 position = (is_overlapping(deskbar.Location(), fPosition)) ? B_FOLLOW_DESKBAR : fPosition; if (position == B_FOLLOW_DESKBAR) { BRect frame = deskbar.Frame(); switch (deskbar.Location()) { case B_DESKBAR_TOP: // In case of overlapping here or for bottom // use user's notification position y = frame.bottom + topOffset; x = (fPosition == (B_FOLLOW_LEFT | B_FOLLOW_TOP)) ? frame.left + rightOffset : frame.right - width + rightOffset; break; case B_DESKBAR_BOTTOM: y = frame.top - height - bottomOffset; x = (fPosition == (B_FOLLOW_LEFT | B_FOLLOW_BOTTOM)) ? frame.left + rightOffset : frame.right - width + rightOffset; break; case B_DESKBAR_RIGHT_TOP: y = frame.top - topOffset + 1; x = frame.left - width - rightOffset; break; case B_DESKBAR_LEFT_TOP: y = frame.top - topOffset + 1; x = frame.right + leftOffset; break; case B_DESKBAR_RIGHT_BOTTOM: y = frame.bottom - height + bottomOffset; x = frame.left - width - rightOffset; break; case B_DESKBAR_LEFT_BOTTOM: y = frame.bottom - height + bottomOffset; x = frame.right + leftOffset; break; default: break; } location = BPoint(x, y); } else if (position == (B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM)) { location = BScreen().Frame().RightBottom(); location -= BPoint(width, height); } else if (position == (B_FOLLOW_LEFT | B_FOLLOW_BOTTOM)) { location = BScreen().Frame().LeftBottom(); location -= BPoint(0, height); } else if (position == (B_FOLLOW_RIGHT | B_FOLLOW_TOP)) { location = BScreen().Frame().RightTop(); location -= BPoint(width, 0); } else if (position == (B_FOLLOW_LEFT | B_FOLLOW_TOP)) { location = BScreen().Frame().LeftTop(); } MoveTo(location); }
void Win::Zoom( BPoint origin, float width, float height ) { bool IM = false; AppSettings->FindBool( kPrefsIntelligentZoom, &IM ); if( IM == true ) { if( fMaximized == false ) { fOldFrame = Frame(); BScreen screen; BDeskbar deskbar; BRect dbframe = deskbar.Frame(); switch( deskbar.Location() ) { case B_DESKBAR_TOP : { origin.y += dbframe.Height() + 2; break; } case B_DESKBAR_BOTTOM : { height -= dbframe.Height() + 2; break; } case B_DESKBAR_LEFT_BOTTOM : { origin.x += dbframe.Width() + 2; width -= dbframe.right + 2; break; } case B_DESKBAR_RIGHT_BOTTOM : { width = dbframe.left - origin.x - 7; break; } case B_DESKBAR_LEFT_TOP : { origin.x += dbframe.Width() + 2; width -= dbframe.right + 2; break; } case B_DESKBAR_RIGHT_TOP : { width = dbframe.left - origin.x - 7; break; } } fMaximized = true; BWindow::Zoom( origin, width, height ); } else { origin = fOldFrame.LeftTop(); width = fOldFrame.right - fOldFrame.left; height = fOldFrame.bottom - fOldFrame.top; fMaximized = false; BWindow::Zoom( origin, width, height ); } } else BWindow::Zoom( origin, width, height ); }