void PProjectWindow::OpenItem() { PEntryItem *gi; gi = dynamic_cast<PEntryItem*>(fList->ItemAt(fList->CurrentSelection())); if (gi) { try { BNode node; FailOSErr(node.SetTo(&gi->Ref())); BNodeInfo info; FailOSErr(info.SetTo(&node)); char mime[B_MIME_TYPE_LENGTH]; CProjectFile* subProject = dynamic_cast<CProjectFile*>(gi->ModelItem()); if (subProject) { if (!subProject->HasBeenParsed()) { subProject->Read(); if (subProject->HasBeenParsed()) { list<CProjectItem*>::const_iterator iter; for( iter = subProject->begin(); iter != subProject->end(); ++iter) { AddItemsToList( *iter, gi); } } } } else if (info.GetType(mime) || strncmp(mime, "text/", 5)) OpenInTracker(gi->Ref()); else gApp->OpenWindow(gi->Ref()); } catch (HErr& e) { e.DoError(); gApp->OpenWindow(gi->Ref()); } } } /* PProjectWindow::OpenItem */
void PStatus::MouseDown(BPoint where) { bigtime_t longEnough = system_time() + 250000; do { BPoint p; unsigned long btns; GetMouse(&p, &btns); if (!btns) { Window()->PostMessage(msg_GoToLine, fText); return; } if (fabs(where.x - p.x) > 2 || fabs(where.y - p.y) > 2) break; } while (system_time() < longEnough); if (fPath) { BPopUpMenu popup("no title"); popup.SetFont(be_plain_font); char *s = strdup(fPath), *d; d = strrchr(s, '/'); if (d) *d = 0; d = strtok(s, "/"); while (d) { popup.AddItem(new BMenuItem(d, NULL), 0); d = strtok(NULL, "/"); } where.y = Bounds().bottom + 1; BMenuItem *i = popup.Go(ConvertToScreen(where), true, false, ConvertToScreen(Bounds())); if (i) { free(s); s = strdup(fPath); d = strchr(s, '/'); FailNil(d); int ix = popup.CountItems() - popup.IndexOf(i); while (ix--) d = strchr(d + 1, '/'); FailNil(d); *d = 0; entry_ref ref; FailOSErr(get_ref_for_path(s, &ref)); OpenInTracker(ref); } free(s); } else beep(); } /* PStatus::MouseDown */