1 /**
2  * UGENE - Integrated Bioinformatics Tools.
3  * Copyright (C) 2008-2021 UniPro <ugene@unipro.ru>
4  * http://ugene.net
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  * MA 02110-1301, USA.
20  */
21 
22 #ifndef _U2_PROJECT_SUPPORT_H_
23 #define _U2_PROJECT_SUPPORT_H_
24 
25 #include <assert.h>
26 
27 #include <U2Core/ProjectModel.h>
28 #include <U2Core/ProjectService.h>
29 
30 #include <U2Gui/WelcomePageAction.h>
31 
32 #include "ui_CreateNewProjectWidget.h"
33 #include "ui_SaveProjectDialog.h"
34 
35 namespace U2 {
36 
37 #define SETTINGS_DIR QString("project_loader/")
38 #define RECENT_ITEMS_SETTINGS_NAME "recentItems"
39 #define RECENT_PROJECTS_SETTINGS_NAME "recentProjects"
40 
41 class DocumentProviderTask;
42 class FormatDetectionResult;
43 
44 class ProjectLoaderImpl : public ProjectLoader {
45     Q_OBJECT
46 public:
47     ProjectLoaderImpl();
48 
49     void runOpenRecentFileOrProjectTask(const GUrl &url) override;
50 
51     Task *openWithProjectTask(const QList<GUrl> &urls, const QVariantMap &hints = QVariantMap()) override;
52 
53     Task *createNewProjectTask(const GUrl &url = GUrl()) override;
54 
55     Task *createProjectLoadingTask(const GUrl &url, const QVariantMap &hints = QVariantMap()) override;
56 
57     Project *createProject(const QString &name, const QString &url, QList<Document *> &documents, QList<GObjectViewState *> &states) override;
58 
59     QAction *getAddExistingDocumentAction() override;
60 
61     static QString getLastProjectURL();
62     static int getMaxObjectsInSingleDocument();
63     static bool detectFormat(const GUrl &url, QList<FormatDetectionResult> &formats, const QVariantMap &hints, FormatDetectionResult &selectedResult);
64     static bool shouldFormatBeSelected(const QList<FormatDetectionResult> &formats, bool forceSelectFormat);
65     static bool processHints(FormatDetectionResult &dr);
66 
67 signals:
68     void si_recentListChanged();
69 
70 public slots:
71     void sl_newDocumentFromText();
72     void sl_openProject();
73 
74 private:
75     void updateState();
76     void updateRecentProjectsMenu();
77     void prependToRecentProjects(const QString &pFile);
78 
79     /** Remove URL from both recent projects & documents list. */
80     void removeUrlFromRecentItems(const GUrl &url);
81 
82     void updateRecentItemsMenu();
83     void prependToRecentItems(const QString &url);
84     void rememberProjectURL();
85 
86     /** Returns true if the url looks like a UGENE project file url. */
87     static bool isProjectFileUrl(const GUrl &url);
88 
89 private slots:
90     void sl_newProject();
91     void sl_openRecentFile();
92     void sl_openRecentProject();
93     void sl_serviceStateChanged(Service *s, ServiceState prevState);
94     void sl_documentAdded(Document *doc);
95     void sl_paste();
96     void sl_documentStateChanged();
97     void sl_projectURLChanged(const QString &oldURL);
98     void sl_onAddExistingDocument();
99 
100     void sl_downloadRemoteFile();
101     void sl_accessSharedDatabase();
102     void sl_searchGenbankEntry();
103 
104 private:
105     QAction *addExistingDocumentAction;
106     QAction *newProjectAction;
107     QAction *openProjectAction;
108     QAction *pasteAction;
109     QAction *downloadRemoteFileAction;
110     QAction *accessSharedDatabaseAction;
111     QAction *searchGenbankEntryAction;
112     QAction *newDocumentFromTextAction;
113 
114     QMenu *recentProjectsMenu;
115     QMenu *recentItemsMenu;
116 };
117 
118 //////////////////////////////////////////////////////////////////////////
119 /// WelcomePageActions
120 
121 class LoadDataWelcomePageAction : public WelcomePageAction {
122 public:
123     LoadDataWelcomePageAction(ProjectLoaderImpl *loader);
124     void perform();
125 
126 private:
127     QPointer<ProjectLoaderImpl> loader;
128 };
129 
130 class CreateSequenceWelcomePageAction : public WelcomePageAction {
131 public:
132     CreateSequenceWelcomePageAction(ProjectLoaderImpl *loader);
133     void perform() override;
134 
135 private:
136     QPointer<ProjectLoaderImpl> loader;
137 };
138 
139 //////////////////////////////////////////////////////////////////////////
140 /// Dialogs
141 
142 // TODO: merge project dir & project name fields
143 
144 class SaveProjectDialogController : public QDialog, public Ui_SaveProjectDialog {
145     Q_OBJECT
146 public:
147     SaveProjectDialogController(QWidget *p);
148 public slots:
149     void sl_clicked(QAbstractButton *button);
150 };
151 
152 class ProjectDialogController : public QDialog, public Ui_CreateNewProjectDialog {
153     Q_OBJECT
154 public:
155     enum Mode {
156         New_Project,
157         Save_Project,
158     };
159     ProjectDialogController(Mode m, QWidget *p);
160 
161     void accept() override;
162     void updateState();
163 
164 protected:
165     void keyPressEvent(QKeyEvent *event) override;
166 
167 private slots:
168     void sl_fileSelectClicked();
169     void sl_fileNameEdited(const QString &);
170     void sl_projectNameEdited(const QString &);
171 
172 private:
173     void setupDefaults();
174     bool fileEditIsEmpty;
175     QPushButton *createButton;
176 };
177 
178 class AD2P_DocumentInfo {
179 public:
AD2P_DocumentInfo()180     AD2P_DocumentInfo()
181         : iof(nullptr), openView(false), loadDocuments(false), markLoadedAsModified(false) {
182     }
183     GUrl url;
184     DocumentFormatId formatId;
185     IOAdapterFactory *iof;
186     QVariantMap hints;
187     bool openView;
188     bool loadDocuments;
189     bool markLoadedAsModified;
190 };
191 
192 class AD2P_ProviderInfo {
193 public:
AD2P_ProviderInfo()194     AD2P_ProviderInfo()
195         : dp(nullptr), openView(false) {
196     }
197     DocumentProviderTask *dp;
198     bool openView;
199 };
200 
201 class AddDocumentsToProjectTask : public Task {
202     Q_OBJECT
203 public:
204     AddDocumentsToProjectTask(const QList<AD2P_DocumentInfo> &docsInfo, const QList<AD2P_ProviderInfo> &providersInfo);
205     ~AddDocumentsToProjectTask();
206 
207     QList<Task *> onSubTaskFinished(Task *subTask) override;
208     QString generateReport() const override;
209 
210 private:
211     QList<Task *> prepareLoadTasks();
212     QList<Document *> docsToMarkAsModified;
213 
214     QList<AD2P_DocumentInfo> docsInfo;
215     QList<AD2P_ProviderInfo> providersInfo;
216     bool loadTasksAdded;
217 };
218 
219 class OpenWithProjectTask : public Task {
220     Q_OBJECT
221 public:
222     OpenWithProjectTask(const QStringList &urls);
223     void prepare() override;
224 
225 private:
226     QList<GUrl> urls;
227 };
228 
229 }  // namespace U2
230 #endif
231