/* * Copyright 2016-2019 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT license * * Authors: * Alexander von Gluck IV * Brian Hill * Jacob Secunda */ #ifndef _SOFTWARE_UPDATER_WINDOW_H #define _SOFTWARE_UPDATER_WINDOW_H #include #include #include #include #include #include #include #include #include #include #include #include #include "StripeView.h" using namespace BPrivate; enum { PACKAGE_UPDATE, PACKAGE_INSTALL, PACKAGE_UNINSTALL }; class SuperItem : public BListItem { public: SuperItem(const char* label); ~SuperItem(); virtual void DrawItem(BView*, BRect, bool); float GetPackageItemHeight(); float GetPackageItemHeight(bool showMoreDetails); BBitmap* GetIcon(bool showMoreDetails); float GetIconSize(bool showMoreDetails); void SetDetailLevel(bool showMoreDetails); bool GetDetailLevel() { return fShowMoreDetails; }; void SetItemCount(int32 count); float ZoomWidth(BView *owner); private: BBitmap* _GetPackageIcon(float listItemHeight); BString fLabel; BString fItemText; BFont fRegularFont; BFont fBoldFont; bool fShowMoreDetails; font_height fBoldFontHeight; float fPackageItemLineHeight; BBitmap* fPackageLessIcon; BBitmap* fPackageMoreIcon; int32 fItemCount; }; class PackageItem : public BListItem { public: PackageItem(const char* name, const char* simple_version, const char* detailed_version, const char* repository, const char* summary, const char* file_name, SuperItem* super); virtual void DrawItem(BView*, BRect, bool); virtual void Update(BView *owner, const BFont *font); void CalculateZoomWidths(BView *owner); int NameCompare(PackageItem* item); const char* FileName() { return fFileName.String(); }; void SetDownloadProgress(float percent); void ShowProgressBar() { fDrawBarFlag = true; }; float MoreDetailsWidth() { return fMoreDetailsWidth; }; float LessDetailsWidth() { return fLessDetailsWidth; }; private: void _DrawBar(BPoint where, BView* view, icon_size which); BString fName; BString fSimpleVersion; BString fDetailedVersion; BString fRepository; BString fSummary; BFont fSmallFont; font_height fSmallFontHeight; float fSmallTotalHeight; float fLabelOffset; SuperItem* fSuperItem; BString fFileName; float fDownloadProgress; bool fDrawBarFlag; float fMoreDetailsWidth; float fLessDetailsWidth; }; class PackageListView : public BOutlineListView { public: PackageListView(); virtual void FrameResized(float newWidth, float newHeight); void ExpandOrCollapse(BListItem *superItem, bool expand); void AddPackage(uint32 install_type, const char* name, const char* cur_ver, const char* new_ver, const char* summary, const char* repository, const char* file_name); void UpdatePackageProgress(const char* packageName, float percent); void SortItems(); float ItemHeight(); void SetMoreDetails(bool showMore); BPoint ZoomPoint(); private: void _SetItemHeights(); SuperItem* fSuperUpdateItem; SuperItem* fSuperInstallItem; SuperItem* fSuperUninstallItem; bool fShowMoreDetails; PackageItem* fLastProgressItem; int16 fLastProgressValue; }; class SoftwareUpdaterWindow : public BWindow { public: SoftwareUpdaterWindow(); bool QuitRequested(); void FrameMoved(BPoint newPosition); void FrameResized(float newWidth, float newHeight); void Zoom(BPoint origin, float width, float height); void MessageReceived(BMessage* message); bool ConfirmUpdates(); void UpdatesApplying(const char* header, const char* detail); bool UserCancelRequested(); void AddPackageInfo(uint32 install_type, const char* package_name, const char* cur_ver, const char* new_ver, const char* summary, const char* repository, const char* file_name); void ShowWarningAlert(const char* text); BBitmap GetIcon(int32 iconSize); BRect GetDefaultRect() { return fDefaultRect; }; BPoint GetLocation() { return Frame().LeftTop(); }; BLayoutItem* layout_item_for(BView* view); void FinalUpdate(const char* header, const char* detail); private: uint32 _WaitForButtonClick(); void _SetState(uint32 state); uint32 _GetState(); status_t _WriteSettings(); status_t _ReadSettings(BMessage& settings); BRect fDefaultRect; BStripeView* fStripeView; BStringView* fHeaderView; BStringView* fDetailView; BButton* fUpdateButton; BButton* fCancelButton; BButton* fRebootButton; BStatusBar* fStatusBar; PackageListView* fListView; BScrollView* fScrollView; BCheckBox* fDetailsCheckbox; BLayoutItem* fDetailsLayoutItem; BLayoutItem* fPackagesLayoutItem; BLayoutItem* fProgressLayoutItem; BLayoutItem* fCancelButtonLayoutItem; BLayoutItem* fUpdateButtonLayoutItem; BLayoutItem* fRebootButtonLayoutItem; BLayoutItem* fDetailsCheckboxLayoutItem; uint32 fCurrentState; sem_id fWaitingSem; bool fWaitingForButton; uint32 fButtonResult; bool fUpdateConfirmed; bool fUserCancelRequested; BInvoker fCancelAlertResponse; int32 fWarningAlertCount; BInvoker fWarningAlertDismissed; BPath fSettingsPath; status_t fSettingsReadStatus; BMessage fInitialSettings; bool fSaveFrameChanges; BMessageRunner* fMessageRunner; BMessage fFrameChangeMessage; float fZoomHeightBaseline; float fZoomWidthBaseline; }; int SortPackageItems(const BListItem* item1, const BListItem* item2); #endif // _SOFTWARE_UPDATER_WINDOW_H