1/*
2 * Copyright 2013-2014, Stephan A��mus <superstippi@gmx.de>.
3 * Copyright 2013, Rene Gollent <rene@gollent.com>.
4 * Copyright 2017, Julian Harnath <julian.harnath@rwth-aachen.de>.
5 * Copyright 2017-2023, Andrew Lindesay <apl@lindesay.co.nz>.
6 * All rights reserved. Distributed under the terms of the MIT License.
7 */
8#ifndef MAIN_WINDOW_H
9#define MAIN_WINDOW_H
10
11#include <Window.h>
12
13#include <queue>
14
15#include "HaikuDepotConstants.h"
16#include "Model.h"
17#include "ProcessCoordinator.h"
18#include "PackageInfoListener.h"
19#include "TabView.h"
20#include "UserDetail.h"
21#include "UserDetailVerifierProcess.h"
22
23
24class BCardLayout;
25class BMenu;
26class BMenuItem;
27class BSplitView;
28class FeaturedPackagesView;
29class FilterView;
30class PackageActionsView;
31class PackageInfoView;
32class PackageListView;
33class ScreenshotWindow;
34class ShuttingDownWindow;
35class WorkStatusView;
36
37
38class MainWindow :
39	private ProcessCoordinatorConsumer, public ProcessCoordinatorListener,
40	public UserDetailVerifierListener, public BWindow {
41public:
42								MainWindow(const BMessage& settings);
43								MainWindow(const BMessage& settings,
44									PackageInfoRef& package);
45	virtual						~MainWindow();
46
47	// BWindow interface
48	virtual	bool				QuitRequested();
49	virtual	void				MessageReceived(BMessage* message);
50
51			void				StoreSettings(BMessage& message);
52
53	// ProcessCoordinatorConsumer
54	virtual	void				Consume(ProcessCoordinator *item);
55
56	// ProcessCoordinatorListener
57	virtual void				CoordinatorChanged(
58									ProcessCoordinatorState& coordinatorState);
59
60	// UserDetailVerifierProcessListener
61	virtual	void				UserCredentialsFailed();
62	virtual void				UserUsageConditionsNotLatest(
63									const UserDetail& userDetail);
64
65	// services PackageInfoListener via MainWindowPackageInfoListener
66			void				PackageChanged(
67									const PackageInfoEvent& event);
68
69private:
70			std::vector<DepotInfoRef>
71								_CreateSnapshotOfDepots();
72
73			void				_AddProcessCoordinator(
74									ProcessCoordinator* item);
75			void				_StopProcessCoordinators();
76			void				_SpinUntilProcessCoordinatorComplete();
77
78			bool				_SelectedPackageHasWebAppRepositoryCode();
79
80			void				_BuildMenu(BMenuBar* menuBar);
81			void				_BuildUserMenu(BMenuBar* menuBar);
82
83			const char*			_WindowFrameName() const;
84			void				_RestoreNickname(const BMessage& settings);
85			void				_RestoreWindowFrame(const BMessage& settings);
86			void				_RestoreModelSettings(const BMessage& settings);
87
88			void				_MaybePromptCanShareAnonymousUserData(
89									const BMessage& settings);
90			void				_PromptCanShareAnonymousUserData();
91
92			void				_InitWorkerThreads();
93			void				_AdoptModelControls();
94			void				_AdoptModel();
95			void				_AddRemovePackageFromLists(
96									const PackageInfoRef& package);
97
98			void				_AdoptPackage(const PackageInfoRef& package);
99			void				_ClearPackage();
100
101			void				_SetupDelayedIncrementViewCounter(
102									const PackageInfoRef package);
103			void				_HandleIncrementViewCounter(
104									const BMessage* message);
105			void				_IncrementViewCounter(
106									const PackageInfoRef package);
107
108			void				_PopulatePackageAsync(bool forcePopulate);
109			void				_StartBulkLoad(bool force = false);
110			void				_BulkLoadCompleteReceived(status_t errorStatus);
111
112			void				_NotifyWorkStatusClear();
113			void				_HandleWorkStatusClear();
114
115			void				_NotifyWorkStatusChange(const BString& text,
116									float progress);
117			void				_HandleWorkStatusChangeMessageReceived(
118									const BMessage* message);
119
120			void				_HandleExternalPackageUpdateMessageReceived(
121									const BMessage* message);
122
123			void				_HandleChangePackageListViewMode();
124
125			void				_HandleProcessCoordinatorChanged(
126									ProcessCoordinatorState& coordinatorState);
127
128	static	status_t			_RefreshModelThreadWorker(void* arg);
129	static	status_t			_PopulatePackageWorker(void* arg);
130	static	status_t			_PackagesToShowWorker(void* arg);
131
132			void				_OpenLoginWindow(
133									const BMessage& onSuccessMessage);
134			void				_OpenSettingsWindow();
135			void				_StartUserVerify();
136			void				_UpdateAuthorization();
137			void				_UpdateAvailableRepositories();
138			void				_RatePackage();
139			void				_ShowScreenshot();
140
141			void				_ViewUserUsageConditions(
142									UserUsageConditionsSelectionMode mode);
143
144			void				_HandleUserUsageConditionsNotLatest(
145									const UserDetail& userDetail);
146
147			void				_HandleScreenshotCached(const BMessage* message);
148
149private:
150			FilterView*			fFilterView;
151			TabView*			fListTabs;
152			FeaturedPackagesView* fFeaturedPackagesView;
153			PackageListView*	fPackageListView;
154			PackageInfoView*	fPackageInfoView;
155			BSplitView*			fSplitView;
156			WorkStatusView*		fWorkStatusView;
157
158			ScreenshotWindow*	fScreenshotWindow;
159			ShuttingDownWindow*	fShuttingDownWindow;
160
161			BMenu*				fUserMenu;
162			BMenu*				fRepositoryMenu;
163			BMenuItem*			fLogInItem;
164			BMenuItem*			fLogOutItem;
165			BMenuItem*			fUsersUserUsageConditionsMenuItem;
166
167			BMenuItem*			fShowAvailablePackagesItem;
168			BMenuItem*			fShowInstalledPackagesItem;
169			BMenuItem*			fShowDevelopPackagesItem;
170			BMenuItem*			fShowSourcePackagesItem;
171
172			BMenuItem*			fRefreshRepositoriesItem;
173
174			Model				fModel;
175			ModelListenerRef	fModelListener;
176
177			std::queue<ProcessCoordinator*>
178								fCoordinatorQueue;
179			ProcessCoordinator*	fCoordinator;
180			BLocker				fCoordinatorLock;
181			sem_id				fCoordinatorRunningSem;
182			bool				fShouldCloseWhenNoProcessesToCoordinate;
183
184			bool				fSinglePackageMode;
185
186			thread_id			fPopulatePackageWorker;
187			PackageInfoRef		fPackageToPopulate;
188			bool				fForcePopulatePackage;
189			BLocker				fPackageToPopulateLock;
190			sem_id				fPackageToPopulateSem;
191
192			PackageInfoListenerRef
193								fPackageInfoListener;
194
195			BMessageRunner*		fIncrementViewCounterDelayedRunner;
196};
197
198
199
200#endif // MAIN_WINDOW_H
201