Ticket #11563: bug#11563-patch-4.patch
File bug#11563-patch-4.patch, 32.3 KB (added by , 9 years ago) |
---|
-
src/apps/haikudepot/ui/PackageContentsView.cpp
From 832fc3670065280cb04606cce37c0e3e4b175369 Mon Sep 17 00:00:00 2001 From: "Sidhant Sharma [:TigerKid001]" <tigerkid001@gmail.com> Date: Thu, 12 Feb 2015 13:42:27 +0530 Subject: [PATCH] Contents tab patch 4 --- src/apps/haikudepot/ui/PackageContentsView.cpp | 866 ++++++++++++++++++++----- src/apps/haikudepot/ui/PackageContentsView.h | 38 +- src/apps/haikudepot/ui/PackageInfoView.cpp | 2 +- 3 files changed, 737 insertions(+), 169 deletions(-) diff --git a/src/apps/haikudepot/ui/PackageContentsView.cpp b/src/apps/haikudepot/ui/PackageContentsView.cpp index 4e900ab..97e5e43 100644
a b 1 1 /* 2 * Copyright 2015, TigerKid001. 2 * Copyright 2015, Stephan Aßmus <superstippi@gmx.de>. 3 * Copyright 2015, Sidhant Sharma <tigerkid001@gmail.com>. 3 4 * All rights reserved. Distributed under the terms of the MIT License. 4 5 */ 5 6 6 7 #include "PackageContentsView.h" 8 #include "MainWindow.h" 7 9 8 10 #include <algorithm> 9 11 #include <stdio.h> … … 11 13 #include <Autolock.h> 12 14 #include <Catalog.h> 13 15 #include <FindDirectory.h> 14 #include <MessageFormat.h>15 16 #include <LayoutBuilder.h> 16 17 #include <LayoutUtils.h> 17 #include <OutlineListView.h> 18 #include <MessageFormat.h> 19 #include <Mime.h> 20 #include <NodeInfo.h> 18 21 #include <Path.h> 19 22 #include <ScrollBar.h> 20 23 #include <ScrollView.h> 21 24 #include <StringItem.h> 25 #include <StringForSize.h> 22 26 23 27 #include <package/PackageDefs.h> 24 28 #include <package/hpkg/NoErrorOutput.h> 25 29 #include <package/hpkg/PackageContentHandler.h> 26 30 #include <package/hpkg/PackageEntry.h> 31 #include <package/hpkg/PackageEntryAttribute.h> 27 32 #include <package/hpkg/PackageReader.h> 28 33 29 34 using namespace BPackageKit; … … using BPackageKit::BHPKG::BPackageReader; 39 44 #define B_TRANSLATION_CONTEXT "PackageContentsView" 40 45 41 46 42 //! Layouts the scrollbar so it looks nice with no border and the document 43 // window look. 44 class CustomScrollView : public BScrollView { 47 class PackageEntry : public BPackageEntry { 45 48 public: 46 CustomScrollView(const char* name, BView* target) 47 : 48 BScrollView(name, target, 0, false, true, B_NO_BORDER) 49 { 50 } 49 PackageEntry(const BPackageEntry* entry, const BString path); 50 virtual ~PackageEntry(); 51 BString Path() const 52 {return fPath;} 53 private: 54 BString fPath; 55 }; 51 56 52 virtual void DoLayout() 53 { 54 BRect innerFrame = Bounds(); 55 innerFrame.right -= B_V_SCROLL_BAR_WIDTH + 1; 57 // A field type displaying both a bitmap and a string so that the 58 // tree display looks nicer (both text and bitmap are indented) 59 class BitmapStringField : public BStringField { 60 typedef BStringField Inherited; 61 public: 62 BitmapStringField(const PackageEntry* entry); 63 virtual ~BitmapStringField(); 56 64 57 BView* target = Target(); 58 if (target != NULL) { 59 Target()->MoveTo(innerFrame.left, innerFrame.top); 60 Target()->ResizeTo(innerFrame.Width(), innerFrame.Height()); 61 } 65 void SetBitmap(const BBitmap* bitmap); 66 const BBitmap* Bitmap() const 67 {return NULL/*fIcon*/;} 68 private: 69 const BBitmap* fIcon; 70 }; 62 71 63 BScrollBar* scrollBar = ScrollBar(B_VERTICAL);64 if (scrollBar != NULL) {65 BRect rect = innerFrame;66 rect.left = rect.right + 1;67 rect.right = rect.left + B_V_SCROLL_BAR_WIDTH;68 rect.bottom -= B_H_SCROLL_BAR_HEIGHT;69 72 70 scrollBar->MoveTo(rect.left, rect.top); 71 scrollBar->ResizeTo(rect.Width(), rect.Height()); 72 } 73 } 74 }; 73 // BColumn for PackageContentsView which knows how to render 74 // a BitmapStringField 75 class PackageEntryColumn : public BTitledColumn { 76 typedef BTitledColumn Inherited; 77 public: 78 PackageEntryColumn(const char* title, 79 float width, float minWidth, 80 float maxWidth, uint32 truncateMode, 81 alignment align = B_ALIGN_LEFT); 82 83 virtual void DrawField(BField* field, BRect rect, 84 BView* parent); 85 virtual int CompareFields(BField* field1, BField* field2); 86 virtual float GetPreferredWidth(BField* field, 87 BView* parent) const; 75 88 76 // #pragma mark - PackageEntryItem 89 virtual bool AcceptsField(const BField* field) const; 77 90 91 static void InitTextMargin(BView* parent); 78 92 79 class PackageEntryItem : public BStringItem { 93 private: 94 uint32 fTruncateMode; 95 static float sTextMargin; 96 }; 97 98 99 // BRow for the PartitionListView 100 class PackageEntryRow : public BRow { 101 typedef BRow Inherited; 80 102 public: 81 PackageEntryItem(const BPackageEntry* entry, const BString& path) 82 : 83 BStringItem(entry->Name()), 84 fPath(path) 85 { 86 if (fPath.Length() > 0) 87 fPath.Append("/"); 88 fPath.Append(entry->Name()); 89 } 90 91 inline const BString& EntryPath() const 92 { 93 return fPath; 94 } 103 PackageEntryRow(const PackageEntry* entry, 104 const BBitmap* bitmap =NULL); 105 PackageEntryRow(BString msg); 106 virtual ~PackageEntryRow(); 107 108 const PackageEntry* Entry() 109 { return fPackageEntry; } 110 111 void UpdateTitle(const BBitmap* bitmap = NULL); 112 void UpdateSize(); 113 void UpdatePermissions(); 114 void UpdateLinkTargets(); 115 void SetBitmap(const BBitmap* bitmap); 95 116 96 117 private: 97 BString fPath; 118 BitmapStringField* fTitle; 119 const PackageEntry* fPackageEntry; 98 120 }; 99 121 100 122 101 // #pragma mark - Package ContentOutliner123 // #pragma mark - PackageEntry 102 124 125 PackageEntry::PackageEntry(const BPackageEntry* entry, const BString path) 126 : 127 BPackageEntry(*entry), 128 fPath(path) 129 { 130 //TODO: Something! 131 } 132 133 134 PackageEntry::~PackageEntry() 135 { 136 } 103 137 104 class PackageContentOutliner : public BPackageContentHandler { 138 139 // #pragma mark - BitmapStringField 140 141 BitmapStringField::BitmapStringField( const PackageEntry* entry) 142 : 143 Inherited(entry->Name()) 144 { 145 //SetBitmap(entry); 146 } 147 148 149 BitmapStringField::~BitmapStringField() 150 { 151 } 152 153 154 void 155 BitmapStringField::SetBitmap(const BBitmap* icon) 156 { 157 /* 158 //Get mimetype of package entry and set icon 159 BMimeType mimeType; 160 BNode node(entry->Path().String()); 161 BNodeInfo nodeInfo(&node); 162 BBitmap* icon = new BBitmap(BRect(0,0,15,15), B_RGBA32); 163 // char mimeTypeString[B_MIME_TYPE_LENGTH]; 164 if (nodeInfo.GetIcon(icon, B_MINI_ICON) != B_OK) { 165 if(mimeType.GetIcon(icon, B_MINI_ICON) != B_OK) { 166 printf("Failed to get icon for %s,%s!", entry->Name(), 167 entry->Path().String()); 168 return; 169 } 170 nodeInfo.SetIcon(icon, B_MINI_ICON); 171 } else 172 mimeType.SetIcon(icon, B_MINI_ICON); 173 */ 174 175 fIcon = icon; 176 // TODO: cause a redraw? 177 } 178 179 180 // #pragma mark - PackageContentOutliner 181 182 class PackageContentOutliner 183 : public BPackageContentHandler { 105 184 public: 106 PackageContentOutliner( BOutlineListView* listView,107 const PackageInfo* packageInfo,108 B Locker& packageLock, PackageInfoRef& packageInfoRef)185 PackageContentOutliner(const PackageInfo* packageInfo, 186 BLocker& packageLock, PackageInfoRef& packageInfoRef , 187 BPath packagePath, PackageContentsView* view) 109 188 : 110 f ListView(listView),189 fView(view), 111 190 fLastParentEntry(NULL), 112 fLastParent Item(NULL),191 fLastParentRow(NULL), 113 192 fLastEntry(NULL), 114 fLastItem(NULL), 115 193 fLastRow(NULL), 116 194 fPackageInfoToPopulate(packageInfo), 117 195 fPackageLock(packageLock), 118 fPackageInfoRef(packageInfoRef) 196 fPackageInfoRef(packageInfoRef), 197 fPackagePath(packagePath) 119 198 { 120 199 } 121 200 122 201 virtual status_t HandleEntry(BPackageEntry* entry) 123 202 { 124 // printf("HandleEntry(%s/%s)\n",125 //entry->Parent() != NULL ? entry->Parent()->Name() : "NULL",126 //entry->Name());203 /* printf("\n**HandleEntry(%s/%s)\n", 204 entry->Parent() != NULL ? entry->Parent()->Name() : "NULL", 205 entry->Name()); 127 206 128 if (!fListView->LockLooper())207 if (!fView->LockLooper()) 129 208 return B_ERROR; 130 209 131 210 // Check if we are still supposed to popuplate the list 132 211 if (fPackageInfoRef.Get() != fPackageInfoToPopulate) { 133 //printf("stopping package content population\n");134 f ListView->UnlockLooper();212 printf("stopping package content population\n"); 213 fView->UnlockLooper(); 135 214 return B_ERROR; 136 215 } 137 216 138 217 BString path; 139 218 const BPackageEntry* parent = entry->Parent(); 219 140 220 while (parent != NULL) { 141 221 if (path.Length() > 0) 142 222 path.Prepend("/"); 143 223 path.Prepend(parent->Name()); 144 224 parent = parent->Parent(); 145 225 } 146 147 PackageEntryItem* item = new PackageEntryItem(entry, path); 148 149 if (entry->Parent() == NULL) { 150 // printf(" adding root entry\n"); 151 fListView->AddItem(item); 226 path.Prepend("/"); 227 path.Prepend(fPackagePath.Path()); 228 BPath entryPath(path.String()); 229 printf("\npath: %s\n",path.String()); 230 printf("\\m/%s,\\m/%s\n", fPackagePath.Path(), entryPath.Path()); 231 // create the row for this package 232 packageRow = new PackageEntryRow( 233 new PackageEntry(entry, path)); 234 // BitmapStringField* item = new BitmapStringField(entry); 235 236 if (entry->Parent() == NULL) { 237 // add the row, parent may be NULL (add at top level) 238 fView->AddRow(packageRow); 152 239 fLastParentEntry = NULL; 153 fLastParent Item= NULL;240 fLastParentRow = NULL; 154 241 } else if (entry->Parent() == fLastEntry) { 155 // printf(" adding to last entry %s\n", fLastEntry->Name()); 156 fListView->AddUnder(item, fLastItem); 242 fView->AddRow(packageRow, fLastRow); 157 243 fLastParentEntry = fLastEntry; 158 fLastParent Item = fLastItem;244 fLastParentRow = fLastRow; 159 245 } else if (entry->Parent() == fLastParentEntry) { 160 // printf(" adding to last parent %s\n", fLastParentEntry->Name()); 161 fListView->AddUnder(item, fLastParentItem); 246 fView->AddRow(packageRow, fLastParentRow); 162 247 } else { 163 248 // Not the last parent entry, need to search for the parent 164 249 // among the already added list items. 165 250 bool foundParent = false; 166 for (int32 i = 0; i < fListView->FullListCountItems(); i++) { 167 PackageEntryItem* listItem 168 = dynamic_cast<PackageEntryItem*>( 169 fListView->FullListItemAt(i)); 170 if (listItem == NULL) 171 continue; 172 if (listItem->EntryPath() == path) { 173 fLastParentEntry = entry->Parent(); 174 fLastParentItem = listItem; 175 // printf(" found parent %s\n", listItem->Text()); 176 fListView->AddUnder(item, listItem); 177 foundParent = true; 178 break; 179 } 251 PackageEntryRow* row = (PackageEntryRow*) fView->_FindRow( 252 entry->Parent()->Name()); 253 if(row == NULL) { 254 foundParent = false; 255 } else { 256 fLastParentEntry = entry->Parent(); 257 fLastParentRow = row; 258 fView->AddRow(packageRow, row); 259 foundParent = true; 180 260 } 261 181 262 if (!foundParent) { 182 263 // NOTE: Should not happen. Just add this entry at the 183 264 // root level. 184 //printf("Did not find parent entry for %s (%s)!\n",185 //entry->Name(), entry->Parent()->Name());186 f ListView->AddItem(item);265 printf("Did not find parent entry for %s (%s)!\n", 266 entry->Name(), entry->Parent()->Name()); 267 fView->AddRow(packageRow); 187 268 fLastParentEntry = NULL; 188 fLastParent Item= NULL;269 fLastParentRow = NULL; 189 270 } 190 271 } 191 272 // make sure the row is initially expanded 273 fView->ExpandOrCollapse(packageRow, true); 192 274 fLastEntry = entry; 193 fLast Item = item;275 fLastRow = packageRow; 194 276 195 fListView->UnlockLooper();196 197 277 fView->UnlockLooper();*/ 278 printf("\n\t\t******HandeEntry*******\n"); 279 return B_OK; 198 280 } 199 281 200 282 virtual status_t HandleEntryAttribute(BPackageEntry* entry, 201 283 BPackageEntryAttribute* attribute) 202 284 { 285 int32 attr = (int32) attribute->Data().InlineData(); 286 SharedBitmap shared(attr); 287 fPackageIcon = (BBitmap*) shared.Bitmap(SharedBitmap::SIZE_16); 288 printf("\n\t\t******HandeEntryAttribute*******\n"); 289 if(fPackageIcon != NULL) 290 printf("fPackageIcon not null"); 291 // return B_ERROR; 203 292 return B_OK; 204 293 } 205 294 206 295 virtual status_t HandleEntryDone(BPackageEntry* entry) 207 296 { 297 if (!fView->LockLooper()) 298 return B_ERROR; 299 300 // Check if we are still supposed to popuplate the list 301 if (fPackageInfoRef.Get() != fPackageInfoToPopulate) { 302 printf("stopping package content population\n"); 303 fView->UnlockLooper(); 304 return B_ERROR; 305 } 306 307 BString path; 308 const BPackageEntry* parent = entry->Parent(); 309 310 while (parent != NULL) { 311 if (path.Length() > 0) 312 path.Prepend("/"); 313 path.Prepend(parent->Name()); 314 parent = parent->Parent(); 315 } 316 path.Prepend("/"); 317 path.Prepend(fPackagePath.Path()); 318 BPath entryPath(path.String()); 319 printf("\npath: %s\n",path.String()); 320 printf("\\m/%s,\\m/%s\n", fPackagePath.Path(), entryPath.Path()); 321 // create the row for this package 322 PackageEntryRow* packageRow = new PackageEntryRow( 323 new PackageEntry(entry, path)); 324 if (entry->Parent() == NULL) { 325 // add the row, parent may be NULL (add at top level) 326 fView->AddRow(packageRow); 327 fLastParentEntry = NULL; 328 fLastParentRow = NULL; 329 } else if (entry->Parent() == fLastEntry) { 330 fView->AddRow(packageRow, fLastRow); 331 fLastParentEntry = fLastEntry; 332 fLastParentRow = fLastRow; 333 } else if (entry->Parent() == fLastParentEntry) { 334 fView->AddRow(packageRow, fLastParentRow); 335 } else { 336 // Not the last parent entry, need to search for the parent 337 // among the already added list items. 338 bool foundParent = false; 339 PackageEntryRow* row = (PackageEntryRow*) fView->_FindRow( 340 entry->Parent()->Name()); 341 if(row == NULL) { 342 foundParent = false; 343 } else { 344 fLastParentEntry = entry->Parent(); 345 fLastParentRow = row; 346 fView->AddRow(packageRow, row); 347 foundParent = true; 348 } 349 350 if (!foundParent) { 351 // NOTE: Should not happen. Just add this entry at the 352 // root level. 353 printf("Did not find parent entry for %s (%s)!\n", 354 entry->Name(), entry->Parent()->Name()); 355 fView->AddRow(packageRow); 356 fLastParentEntry = NULL; 357 fLastParentRow = NULL; 358 } 359 } 360 // make sure the row is initially expanded 361 fView->ExpandOrCollapse(packageRow, true); 362 fLastEntry = entry; 363 fLastRow = packageRow; 364 365 fView->UnlockLooper(); 366 printf("\n\t\t******HandeEntryDone*******\n"); 208 367 return B_OK; 209 368 } 210 369 … … public: 219 378 } 220 379 221 380 private: 222 BOutlineListView* fListView;223 381 382 PackageContentsView* fView; 383 224 384 const BPackageEntry* fLastParentEntry; 225 PackageEntry Item* fLastParentItem;385 PackageEntryRow* fLastParentRow; 226 386 227 387 const BPackageEntry* fLastEntry; 228 PackageEntry Item* fLastItem;388 PackageEntryRow* fLastRow; 229 389 230 390 const PackageInfo* fPackageInfoToPopulate; 231 391 BLocker& fPackageLock; 232 PackageInfoRef& fPackageInfoRef; 392 PackageInfoRef fPackageInfoRef; 393 BPath fPackagePath; 394 BBitmap* fPackageIcon; 233 395 }; 234 396 235 397 236 // #pragma mark - PackageContentView 398 // #pragma mark - PackageEntryColumn 399 237 400 401 float PackageEntryColumn::sTextMargin = 0.0; 238 402 239 PackageContentsView::PackageContentsView(const char* name) 403 PackageEntryColumn::PackageEntryColumn(const char* title, float width, float minWidth, 404 float maxWidth, uint32 truncateMode, alignment align) 240 405 : 241 BView("package_contents_view", B_WILL_DRAW),242 f PackageLock("package contents populator lock")406 Inherited(title, width, minWidth, maxWidth, align), 407 fTruncateMode(truncateMode) 243 408 { 244 fContentListView = new BOutlineListView("content list view", 245 B_SINGLE_SELECTION_LIST); 246 247 BScrollView* scrollView = new CustomScrollView("contents scroll view", 248 fContentListView); 249 250 BLayoutBuilder::Group<>(this) 251 .Add(scrollView, 1.0f) 252 .SetInsets(0.0f, -1.0f, -1.0f, -1.0f) 253 ; 409 SetWantsEvents(true); 410 } 254 411 255 _InitContentPopulator(); 412 413 void 414 PackageEntryColumn::DrawField(BField* field, BRect rect, BView* parent) 415 { 416 BitmapStringField* bitmapField 417 = dynamic_cast<BitmapStringField*>(field); 418 BStringField* stringField = dynamic_cast<BStringField*>(field); 419 420 if (bitmapField != NULL) { 421 const BBitmap* bitmap = bitmapField->Bitmap(); 422 423 // figure out the placement 424 float x = 0.0; 425 BRect r = bitmap ? bitmap->Bounds() : BRect(0, 0, 15, 15); 426 float y = rect.top + ((rect.Height() - r.Height()) / 2); 427 float width = 0.0; 428 429 switch (Alignment()) { 430 default: 431 case B_ALIGN_LEFT: 432 case B_ALIGN_CENTER: 433 x = rect.left + sTextMargin; 434 width = rect.right - (x + r.Width()) - (2 * sTextMargin); 435 r.Set(x + r.Width(), rect.top, rect.right - width, rect.bottom); 436 break; 437 438 case B_ALIGN_RIGHT: 439 x = rect.right - sTextMargin - r.Width(); 440 width = (x - rect.left - (2 * sTextMargin)); 441 r.Set(rect.left, rect.top, rect.left + width, rect.bottom); 442 break; 443 } 444 445 if (width != bitmapField->Width()) { 446 BString truncatedString(bitmapField->String()); 447 parent->TruncateString(&truncatedString, fTruncateMode, width + 2); 448 bitmapField->SetClippedString(truncatedString.String()); 449 bitmapField->SetWidth(width); 450 } 451 452 // draw the bitmap 453 if (bitmap != NULL) { 454 parent->SetDrawingMode(B_OP_ALPHA); 455 parent->DrawBitmap(bitmap, BPoint(x, y)); 456 parent->SetDrawingMode(B_OP_OVER); 457 } 458 459 // draw the string 460 DrawString(bitmapField->ClippedString(), parent, r); 461 462 } else if (stringField != NULL) { 463 464 float width = rect.Width() - (2 * sTextMargin); 465 466 if (width != stringField->Width()) { 467 BString truncatedString(stringField->String()); 468 469 parent->TruncateString(&truncatedString, fTruncateMode, width + 2); 470 stringField->SetClippedString(truncatedString.String()); 471 stringField->SetWidth(width); 472 } 473 474 DrawString(stringField->ClippedString(), parent, rect); 475 476 } 256 477 } 257 478 258 479 259 PackageContentsView::~PackageContentsView() 480 int 481 PackageEntryColumn::CompareFields(BField* field1, BField* field2) 260 482 { 261 Clear(); 483 BStringField* stringField1 = dynamic_cast<BStringField*>(field1); 484 BStringField* stringField2 = dynamic_cast<BStringField*>(field2); 485 if (stringField1 != NULL && stringField2 != NULL) { 486 // TODO: Locale aware string compare... not too important if 487 // package names are not translated. 488 return strcmp(stringField1->String(), stringField2->String()); 489 } 490 return Inherited::CompareFields(field1, field2); 491 } 262 492 263 delete_sem(fContentPopulatorSem); 264 if (fContentPopulator >= 0) 265 wait_for_thread(fContentPopulator, NULL); 493 494 float 495 PackageEntryColumn::GetPreferredWidth(BField *_field, BView* parent) const 496 { 497 BitmapStringField* bitmapField 498 = dynamic_cast<BitmapStringField*>(_field); 499 BStringField* stringField = dynamic_cast<BStringField*>(_field); 500 501 float parentWidth = Inherited::GetPreferredWidth(_field, parent); 502 float width = 0.0; 503 504 if (bitmapField) { 505 const BBitmap* bitmap = bitmapField->Bitmap(); 506 BFont font; 507 parent->GetFont(&font); 508 width = font.StringWidth(bitmapField->String()) + 3 * sTextMargin; 509 if (bitmap) 510 width += bitmap->Bounds().Width(); 511 else 512 width += 16; 513 } else if (stringField) { 514 BFont font; 515 parent->GetFont(&font); 516 width = font.StringWidth(stringField->String()) + 2 * sTextMargin; 517 } 518 return max_c(width, parentWidth); 519 } 520 521 522 bool 523 PackageEntryColumn::AcceptsField(const BField* field) const 524 { 525 return dynamic_cast<const BStringField*>(field) != NULL; 266 526 } 267 527 268 528 269 529 void 270 PackageContentsView::AttachedToWindow() 530 PackageEntryColumn::InitTextMargin(BView* parent) 531 { 532 BFont font; 533 parent->GetFont(&font); 534 sTextMargin = ceilf(font.Size() * 0.8); 535 } 536 537 538 // #pragma mark - PackageEntryRow 539 540 541 enum { 542 kTitleColumn, 543 kSizeColumn, 544 kPermissionsColumn, 545 kLinkTargetsColumn, 546 }; 547 548 PackageEntryRow::PackageEntryRow(const PackageEntry* entry, 549 const BBitmap* bitmap = NULL) 550 : 551 Inherited(ceilf(be_plain_font->Size() * 1.8f)), 552 fPackageEntry(entry) 271 553 { 272 BView::AttachedToWindow(); 554 // Package icon and title 555 UpdateTitle(bitmap); 556 557 // Size 558 UpdateSize(); 559 560 // Summary 561 UpdatePermissions(); 562 563 // Target Links 564 UpdateLinkTargets(); 565 } 566 567 PackageEntryRow::PackageEntryRow(BString msg) 568 { 569 SetField(new BStringField(msg), kTitleColumn); 273 570 } 274 571 572 PackageEntryRow::~PackageEntryRow() 573 { 574 } 275 575 576 /* 276 577 void 277 Package ContentsView::AllAttached()578 PackageEntryRow::UpdateTitle() 278 579 { 279 BView::AllAttached(); 580 fTitle = new BitmapStringField(Entry()); 581 SetField(fTitle, kTitleColumn); 582 }*/ 583 void 584 PackageEntryRow::UpdateTitle(const BBitmap* icon) 585 { 586 fTitle = new BitmapStringField(Entry()); 587 if(icon != NULL) 588 fTitle->SetBitmap(icon); 589 SetField(fTitle, kTitleColumn); 280 590 } 281 591 282 592 283 593 void 284 Package ContentsView::SetPackage(const PackageInfoRef& package)594 PackageEntryRow::UpdateSize() 285 595 { 286 if (fPackage == package) 596 PackageEntry* entry = (PackageEntry*) Entry(); 597 if(S_ISDIR(entry->Mode())) { 598 SetField(new BStringField("-"), kSizeColumn); 599 } else { 600 char sizeBuffer[128]; 601 SetField(new BStringField(string_for_size( 602 (double) (entry->Data().Size()), sizeBuffer, 603 sizeof(sizeBuffer))), kSizeColumn); 604 } 605 } 606 607 608 void 609 PackageEntryRow::UpdatePermissions() 610 { 611 PackageEntry* entry = (PackageEntry*) Entry(); 612 if (entry == NULL) 287 613 return; 614 mode_t mode = entry->Mode(); 615 BString perms; 616 617 perms += (S_ISDIR(mode) ? "d" : "-"); 618 perms += ((mode & S_IRUSR) ? "r" : "-"); 619 perms += ((mode & S_IWUSR) ? "w" : "-"); 620 perms += ((mode & S_IXUSR) ? "x" : "-"); 621 perms += ((mode & S_IRGRP) ? "r" : "-"); 622 perms += ((mode & S_IWGRP) ? "w" : "-"); 623 perms += ((mode & S_IXGRP) ? "x" : "-"); 624 perms += ((mode & S_IROTH) ? "r" : "-"); 625 perms += ((mode & S_IWOTH) ? "w" : "-"); 626 perms += ((mode & S_IXOTH) ? "x" : "-"); 627 628 SetField(new BStringField(perms.String()), kPermissionsColumn); 629 } 288 630 289 // printf("PackageContentsView::SetPackage(%s)\n",290 // package.Get() != NULL ? package->Title().String() : "NULL");291 631 292 Clear(); 632 void 633 PackageEntryRow::UpdateLinkTargets() 634 { 635 //TODO: Get link targets 636 BString targets(Entry()->SymlinkPath()); 637 SetField(new BStringField(targets), kLinkTargetsColumn); 638 } 293 639 294 { 295 BAutolock lock(&fPackageLock); 296 fPackage = package; 297 }298 release_sem_etc(fContentPopulatorSem, 1, 0);640 641 void PackageEntryRow::SetBitmap(const BBitmap* bitmap) 642 { 643 if(fTitle != NULL) 644 fTitle->SetBitmap(bitmap); 299 645 } 300 646 301 647 302 void 303 PackageContentsView::Clear() 648 // #pragma mark - private 649 650 PackageEntryRow* 651 PackageContentsView::_FindRow(const PackageEntry* entry, PackageEntryRow* parent) 304 652 { 305 { 306 BAutolock lock(&fPackageLock); 307 fPackage.Unset(); 653 for (int32 i = CountRows(parent) - 1; i >= 0; i--) { 654 PackageEntryRow* row = dynamic_cast<PackageEntryRow*>(RowAt(i, parent)); 655 if (row != NULL && row->Entry() == entry) 656 return row; 657 if (CountRows(row) > 0) { 658 // recurse into child rows 659 row = _FindRow(entry, row); 660 if (row != NULL) 661 return row; 662 } 308 663 } 309 664 310 fContentListView->MakeEmpty();665 return NULL; 311 666 } 312 667 313 668 314 // #pragma mark - private 669 PackageEntryRow* 670 PackageContentsView::_FindRow(const BString& packageTitle, PackageEntryRow* parent) 671 { 672 for (int32 i = CountRows(parent) - 1; i >= 0; i--) { 673 PackageEntryRow* row = dynamic_cast<PackageEntryRow*>(RowAt(i, parent)); 674 if (row != NULL && row->Entry() != NULL 675 && row->Entry()->Name() == packageTitle) { 676 return row; 677 } 678 if (CountRows(row) > 0) { 679 // recurse into child rows 680 row = _FindRow(packageTitle, row); 681 if (row != NULL) 682 return row; 683 } 684 } 315 685 686 return NULL; 687 } 316 688 317 689 void 318 690 PackageContentsView::_InitContentPopulator() 319 691 { 692 printf("In _InitContentPopulator\n"); 320 693 fContentPopulatorSem = create_sem(0, "PopulatePackageContents"); 321 694 if (fContentPopulatorSem >= 0) { 322 695 fContentPopulator = spawn_thread(&_ContentPopulatorThread, 323 696 "Package Contents Populator", B_NORMAL_PRIORITY, this); 324 if (fContentPopulator >= 0) 697 if (fContentPopulator >= 0) { 325 698 resume_thread(fContentPopulator); 699 printf("fContentPopulator resumed!"); 700 } 326 701 } else 327 702 fContentPopulator = -1; 328 703 } … … PackageContentsView::_InitContentPopulator() 332 707 PackageContentsView::_ContentPopulatorThread(void* arg) 333 708 { 334 709 PackageContentsView* view = reinterpret_cast<PackageContentsView*>(arg); 335 710 printf("In _ContentPopulatorThread\n"); 711 if(view == NULL) { 712 printf("_ContentPopulatorThread:: View null!\n"); 713 return 1; 714 } else printf("_ContentPopulatorThread:: View not null\n"); 336 715 while (acquire_sem(view->fContentPopulatorSem) == B_OK) { 716 printf("_ContentPopulatorThread: Acquiring sem"); 337 717 PackageInfoRef package; 338 718 { 339 719 BAutolock lock(&view->fPackageLock); 340 720 package = view->fPackage; 341 721 } 342 343 722 if (package.Get() != NULL) { 344 if (!view->_PopuplatePackageContens(*package.Get())) { 723 printf("In _ContentPopulatorThread: Package not null\n"); 724 if (!view->_PopulatePackageContents(view, *package.Get())) { 345 725 if (view->LockLooper()) { 346 view->fContentListView->AddItem( 347 new BStringItem(B_TRANSLATE("<Package contents not " 348 "available for remote packages>"))); 726 printf("In _ContentPopulatorThread:Remote package\n"); 727 PackageEntryRow* notAvailable = new PackageEntryRow( 728 "<Package contents not available for remote packages>"); 729 view->AddRow(notAvailable); 730 view->ExpandOrCollapse(notAvailable, true); 349 731 view->UnlockLooper(); 350 732 } 351 733 } 352 } 734 }else printf("In _ContentPopulatorThread: package null\n"); 353 735 } 354 355 736 return 0; 356 737 } 357 738 358 739 359 740 bool 360 PackageContentsView::_PopuplatePackageContens(const PackageInfo& package) 741 PackageContentsView::_PopulatePackageContents(PackageContentsView* view, 742 const PackageInfo& package) 361 743 { 362 744 BPath packagePath; 363 745 printf("In _PopulatePackageContents\n"); 364 746 // Obtain path to the package file 365 747 if (package.IsLocalFile()) { 366 748 BString pathString = package.LocalFilePath(); … … PackageContentsView::_PopuplatePackageContens(const PackageInfo& package) 378 760 return false; 379 761 } 380 762 } else { 381 printf("PackageContentsView::_Popu platePackageContens(): "763 printf("PackageContentsView::_PopulatePackageContents(): " 382 764 "unknown install location"); 383 765 return false; 384 766 } … … PackageContentsView::_PopuplatePackageContens(const PackageInfo& package) 399 781 } 400 782 401 783 // Scan package contents and populate list 402 PackageContentOutliner contentHandler( fContentListView,&package,403 fPackageLock, fPackage );784 PackageContentOutliner contentHandler( &package, 785 fPackageLock, fPackage, packagePath, view); 404 786 status = reader.ParseContent(&contentHandler); 405 787 if (status != B_OK) { 406 788 printf("PackageContentsView::SetPackage(): " … … PackageContentsView::_InstallLocation(const PackageInfo& package) const 424 806 425 807 return B_PACKAGE_INSTALLATION_LOCATION_SYSTEM; 426 808 } 809 810 811 // #pragma mark - PackageContentsView 812 813 814 PackageContentsView::PackageContentsView() 815 : 816 BColumnListView("package contents view", 0, B_FANCY_BORDER, true), 817 fPackageLock("package contents populator lock") 818 { 819 AddColumn(new PackageEntryColumn(B_TRANSLATE("Name"), 375, 50, 400, 820 B_TRUNCATE_MIDDLE), kTitleColumn); 821 AddColumn(new PackageEntryColumn(B_TRANSLATE("Size"), 150, 50, 150, 822 B_TRUNCATE_MIDDLE), kSizeColumn); 823 AddColumn(new PackageEntryColumn(B_TRANSLATE("Permissions"), 100, 80, 100, 824 B_TRUNCATE_MIDDLE), kPermissionsColumn); 825 AddColumn(new PackageEntryColumn(B_TRANSLATE("Link Targets"), 300, 60, 400, 826 B_TRUNCATE_END), kLinkTargetsColumn); 827 // fItemCountView = new ItemCountView(); 828 // AddStatusView(fItemCountView); 829 printf("Initializing population\n"); 830 _InitContentPopulator(); 831 } 832 833 834 PackageContentsView::~PackageContentsView() 835 { 836 Clear(); 837 delete_sem(fContentPopulatorSem); 838 if (fContentPopulator >= 0) 839 wait_for_thread(fContentPopulator, NULL); 840 } 841 842 843 void 844 PackageContentsView::AttachedToWindow() 845 { 846 BColumnListView::AttachedToWindow(); 847 PackageEntryColumn::InitTextMargin(ScrollView()); 848 } 849 850 851 void 852 PackageContentsView::AllAttached() 853 { 854 BColumnListView::AllAttached(); 855 856 SetSortingEnabled(true); 857 SetSortColumn(ColumnAt(0), false, true); 858 } 859 860 861 void 862 PackageContentsView::MessageReceived(BMessage* message) 863 { 864 switch (message->what) { 865 /* case MSG_UPDATE_PACKAGE: 866 { 867 BString title; 868 uint32 changes; 869 if (message->FindString("title", &title) != B_OK 870 || message->FindUInt32("changes", &changes) != B_OK) { 871 break; 872 } 873 874 PackageEntryRow* row = _FindRow(title); 875 if (row != NULL) { 876 if ((changes & PKG_CHANGED_SUMMARY) != 0) 877 row->UpdateTitle(row->PackageEntry()); 878 if ((changes & PKG_CHANGED_RATINGS) != 0) 879 row->UpdateSize(row->PackageEntry()); 880 if ((changes & PKG_CHANGED_STATE) != 0) 881 row->UpdatePermissions(row->PackageEntry()); 882 if ((changes & PKG_CHANGED_ICON) != 0) 883 row->UpdateLinkTargets(row->PackageEntry()); 884 } 885 break; 886 } 887 */ 888 default: 889 BColumnListView::MessageReceived(message); 890 break; 891 } 892 } 893 894 895 void 896 PackageContentsView::SelectionChanged() 897 { 898 BColumnListView::SelectionChanged(); 899 900 BMessage message(MSG_PACKAGE_SELECTED); 901 902 PackageEntryRow* selected = dynamic_cast<PackageEntryRow*>(CurrentSelection()); 903 if (selected != NULL) 904 message.AddString("title", selected->Entry()->Name()); 905 906 Window()->PostMessage(&message); 907 } 908 909 910 void 911 PackageContentsView::Clear() 912 { 913 // fItemCountView->SetItemCount(0); 914 BColumnListView::Clear(); 915 BAutolock lock(&fPackageLock); 916 fPackage.Unset(); 917 } 918 919 920 void 921 PackageContentsView::AddPackageEntry(const PackageEntry& package) 922 { 923 PackageEntryRow* packageRow =(PackageEntryRow*) _FindRow(&package); 924 printf("In AddPackageEntry: %s\n", package.Name()); 925 // forget about it if this package is already in the listview 926 if (packageRow != NULL) 927 return; 928 929 BAutolock _(fPackageLock); 930 931 // create the row for this package 932 packageRow = new PackageEntryRow(&package); 933 934 // add the row, parent may be NULL (add at top level) 935 AddRow(packageRow); 936 937 // make sure the row is initially expanded 938 ExpandOrCollapse(packageRow, true); 939 940 // fItemCountView->SetItemCount(CountRows()); 941 } 942 943 944 void 945 PackageContentsView::SelectPackageEntry(const PackageEntry* entry) 946 { 947 PackageEntryRow* row = (PackageEntryRow*) _FindRow(entry); 948 BRow* selected = CurrentSelection(); 949 if (row != selected) 950 DeselectAll(); 951 if (row != NULL) { 952 AddToSelection(row); 953 SetFocusRow(row, false); 954 ScrollTo(row); 955 } 956 } 957 958 959 void 960 PackageContentsView::SetPackage(const PackageInfoRef& package) 961 { 962 if (fPackage == package) 963 return; 964 965 // printf("PackageContentsView::SetPackage(%s)\n", 966 // package.Get() != NULL ? package->Title().String() : "NULL"); 967 968 Clear(); 969 970 { 971 BAutolock lock(&fPackageLock); 972 fPackage = package; 973 } 974 release_sem_etc(fContentPopulatorSem, 1, 0); 975 } 976 -
src/apps/haikudepot/ui/PackageContentsView.h
diff --git a/src/apps/haikudepot/ui/PackageContentsView.h b/src/apps/haikudepot/ui/PackageContentsView.h index 2cd58a2..a83a26b 100644
a b 1 1 /* 2 * Copyright 2015, TigerKid001. 2 * Copyright 2015, Stephan Aßmus <superstippi@gmx.de>. 3 * Copyright 2015, Sidhant Sharma <tigerkid001@gmail.com>. 3 4 * All rights reserved. Distributed under the terms of the MIT License. 4 5 */ 6 5 7 #ifndef PACKAGE_CONTENTS_VIEW_H 6 8 #define PACKAGE_CONTENTS_VIEW_H 7 9 10 #include <ColumnListView.h> 11 #include <ColumnTypes.h> 8 12 #include <Locker.h> 9 #include < View.h>13 #include <package/hpkg/PackageEntry.h> 10 14 11 15 #include "PackageInfo.h" 12 16 13 class BOutlineListView;17 using BPackageKit::BHPKG::BPackageEntry; 14 18 19 class PackageEntryRow; 20 class PackageEntry; 15 21 16 class PackageContentsView : public B View {22 class PackageContentsView : public BColumnListView { 17 23 public: 18 PackageContentsView( const char* name);24 PackageContentsView(); 19 25 virtual ~PackageContentsView(); 20 26 21 27 virtual void AttachedToWindow(); 22 28 virtual void AllAttached(); 23 29 30 void MessageReceived(BMessage*); 31 virtual void SelectionChanged(); 32 33 virtual void Clear(); 34 35 void AddPackageEntry(const PackageEntry& package); 24 36 void SetPackage(const PackageInfoRef& package); 25 void Clear(); 37 38 void SelectPackageEntry(const PackageEntry* entry); 26 39 27 40 private: 41 PackageEntryRow* _FindRow(const PackageEntry* entry, 42 PackageEntryRow* parent = NULL); 43 PackageEntryRow* _FindRow(const BString& packageTitle, 44 PackageEntryRow* parent = NULL); 28 45 void _InitContentPopulator(); 29 46 static int32 _ContentPopulatorThread(void* arg); 30 bool _PopuplatePackageContens(31 const PackageInfo& package);47 bool _PopulatePackageContents(PackageContentsView* view, 48 const PackageInfo& package); 32 49 int32 _InstallLocation( 33 50 const PackageInfo& package) const; 34 51 35 52 private: 36 BOutlineListView* fContentListView;37 53 // class ItemCountView; 54 friend class PackageContentOutliner; 38 55 thread_id fContentPopulator; 39 56 sem_id fContentPopulatorSem; 40 57 BLocker fPackageLock; 41 58 PackageInfoRef fPackage; 59 // ItemCountView* fItemCountView; 42 60 }; 43 61 44 62 #endif // PACKAGE_CONTENTS_VIEW_H -
src/apps/haikudepot/ui/PackageInfoView.cpp
diff --git a/src/apps/haikudepot/ui/PackageInfoView.cpp b/src/apps/haikudepot/ui/PackageInfoView.cpp index 821406a..6b1dd24 100644
a b public: 1178 1178 SetViewColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 1179 1179 kContentTint)); 1180 1180 1181 fPackageContents = new PackageContentsView( "contents_list");1181 fPackageContents = new PackageContentsView(); 1182 1182 AddChild(fPackageContents); 1183 1183 1184 1184 }