1/*
2 * Copyright 2016-2019 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT license
4 *
5 * Authors:
6 *		Alexander von Gluck IV <kallisti5@unixzen.com>
7 *		Brian Hill <supernova@tycho.email>
8 *		Jacob Secunda
9 */
10#ifndef _SOFTWARE_UPDATER_WINDOW_H
11#define _SOFTWARE_UPDATER_WINDOW_H
12
13
14#include <Button.h>
15#include <CheckBox.h>
16#include <GroupView.h>
17#include <MessageRunner.h>
18#include <NodeInfo.h>
19#include <OutlineListView.h>
20#include <Path.h>
21#include <Point.h>
22#include <ScrollView.h>
23#include <StatusBar.h>
24#include <StringView.h>
25#include <Window.h>
26
27#include "StripeView.h"
28
29using namespace BPrivate;
30
31enum {
32	PACKAGE_UPDATE,
33	PACKAGE_INSTALL,
34	PACKAGE_UNINSTALL
35};
36
37
38class SuperItem : public BListItem {
39public:
40								SuperItem(const char* label);
41								~SuperItem();
42	virtual void				DrawItem(BView*, BRect, bool);
43	float						GetPackageItemHeight();
44	float						GetPackageItemHeight(bool showMoreDetails);
45	BBitmap*					GetIcon(bool showMoreDetails);
46	float						GetIconSize(bool showMoreDetails);
47	void						SetDetailLevel(bool showMoreDetails);
48	bool						GetDetailLevel() { return fShowMoreDetails; };
49	void						SetItemCount(int32 count);
50	float						ZoomWidth(BView *owner);
51
52private:
53			BBitmap*			_GetPackageIcon(float listItemHeight);
54
55			BString				fLabel;
56			BString				fItemText;
57			BFont				fRegularFont;
58			BFont				fBoldFont;
59			bool				fShowMoreDetails;
60			font_height			fBoldFontHeight;
61			float				fPackageItemLineHeight;
62			BBitmap*			fPackageLessIcon;
63			BBitmap*			fPackageMoreIcon;
64			int32				fItemCount;
65};
66
67
68class PackageItem : public BListItem {
69public:
70								PackageItem(const char* name,
71									const char* simple_version,
72									const char* detailed_version,
73									const char* repository,
74									const char* summary,
75									const char* file_name,
76									SuperItem* super);
77	virtual void				DrawItem(BView*, BRect, bool);
78	virtual void				Update(BView *owner, const BFont *font);
79	void						CalculateZoomWidths(BView *owner);
80	int							NameCompare(PackageItem* item);
81	const char*					FileName() { return fFileName.String(); };
82	void						SetDownloadProgress(float percent);
83	void						ShowProgressBar() { fDrawBarFlag = true; };
84	float						MoreDetailsWidth()
85									{ return fMoreDetailsWidth; };
86	float						LessDetailsWidth()
87									{ return fLessDetailsWidth; };
88
89private:
90			void				_DrawBar(BPoint where, BView* view,
91									icon_size which);
92
93			BString				fName;
94			BString				fSimpleVersion;
95			BString				fDetailedVersion;
96			BString				fRepository;
97			BString				fSummary;
98			BFont				fSmallFont;
99			font_height			fSmallFontHeight;
100			float				fSmallTotalHeight;
101			float				fLabelOffset;
102			SuperItem*			fSuperItem;
103			BString				fFileName;
104			float				fDownloadProgress;
105			bool				fDrawBarFlag;
106			float				fMoreDetailsWidth;
107			float				fLessDetailsWidth;
108};
109
110
111class PackageListView : public BOutlineListView {
112public:
113								PackageListView();
114	virtual	void				FrameResized(float newWidth, float newHeight);
115			void				ExpandOrCollapse(BListItem *superItem,
116									bool expand);
117			void				AddPackage(uint32 install_type,
118									const char* name,
119									const char* cur_ver,
120									const char* new_ver,
121									const char* summary,
122									const char* repository,
123									const char* file_name);
124			void				UpdatePackageProgress(const char* packageName,
125									float percent);
126			void				SortItems();
127			float				ItemHeight();
128			void				SetMoreDetails(bool showMore);
129			BPoint				ZoomPoint();
130
131private:
132			void				_SetItemHeights();
133
134			SuperItem*			fSuperUpdateItem;
135			SuperItem*			fSuperInstallItem;
136			SuperItem*			fSuperUninstallItem;
137			bool				fShowMoreDetails;
138			PackageItem*		fLastProgressItem;
139			int16				fLastProgressValue;
140};
141
142
143class SoftwareUpdaterWindow : public BWindow {
144public:
145								SoftwareUpdaterWindow();
146			bool				QuitRequested();
147			void				FrameMoved(BPoint newPosition);
148			void				FrameResized(float newWidth, float newHeight);
149			void				Zoom(BPoint origin, float width, float height);
150			void				MessageReceived(BMessage* message);
151			bool				ConfirmUpdates();
152			void				UpdatesApplying(const char* header,
153									const char* detail);
154			bool				UserCancelRequested();
155			void				AddPackageInfo(uint32 install_type,
156									const char* package_name,
157									const char* cur_ver,
158									const char* new_ver,
159									const char* summary,
160									const char* repository,
161									const char* file_name);
162			void				ShowWarningAlert(const char* text);
163			BBitmap				GetIcon(int32 iconSize);
164			BRect				GetDefaultRect() { return fDefaultRect; };
165			BPoint				GetLocation() { return Frame().LeftTop(); };
166			BLayoutItem*		layout_item_for(BView* view);
167			void				FinalUpdate(const char* header,
168									const char* detail);
169
170private:
171			uint32				_WaitForButtonClick();
172			void				_SetState(uint32 state);
173			uint32				_GetState();
174			status_t			_WriteSettings();
175			status_t			_ReadSettings(BMessage& settings);
176
177			BRect				fDefaultRect;
178			BStripeView*		fStripeView;
179			BStringView*		fHeaderView;
180			BStringView*		fDetailView;
181			BButton*			fUpdateButton;
182			BButton*			fCancelButton;
183			BButton*			fRebootButton;
184			BStatusBar*			fStatusBar;
185			PackageListView*	fListView;
186			BScrollView*		fScrollView;
187			BCheckBox*			fDetailsCheckbox;
188			BLayoutItem*		fDetailsLayoutItem;
189			BLayoutItem*		fPackagesLayoutItem;
190			BLayoutItem*		fProgressLayoutItem;
191			BLayoutItem*		fCancelButtonLayoutItem;
192			BLayoutItem*		fUpdateButtonLayoutItem;
193			BLayoutItem*		fRebootButtonLayoutItem;
194			BLayoutItem*		fDetailsCheckboxLayoutItem;
195
196			uint32				fCurrentState;
197			sem_id				fWaitingSem;
198			bool				fWaitingForButton;
199			uint32				fButtonResult;
200			bool				fUpdateConfirmed;
201			bool				fUserCancelRequested;
202			BInvoker			fCancelAlertResponse;
203			int32				fWarningAlertCount;
204			BInvoker			fWarningAlertDismissed;
205			BPath				fSettingsPath;
206			status_t			fSettingsReadStatus;
207			BMessage			fInitialSettings;
208			bool				fSaveFrameChanges;
209			BMessageRunner*		fMessageRunner;
210			BMessage			fFrameChangeMessage;
211			float				fZoomHeightBaseline;
212			float				fZoomWidthBaseline;
213};
214
215
216int SortPackageItems(const BListItem* item1, const BListItem* item2);
217
218
219#endif // _SOFTWARE_UPDATER_WINDOW_H
220