1 /**************************************************************************
2 ** This file is part of LiteIDE
3 **
4 ** Copyright (c) 2011-2019 LiteIDE. All rights reserved.
5 **
6 ** This library is free software; you can redistribute it and/or
7 ** modify it under the terms of the GNU Lesser General Public
8 ** License as published by the Free Software Foundation; either
9 ** version 2.1 of the License, or (at your option) any later version.
10 **
11 ** This library 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 GNU
14 ** Lesser General Public License for more details.
15 **
16 ** In addition, as a special exception,  that plugins developed for LiteIDE,
17 ** are allowed to remain closed sourced and can be distributed under any license .
18 ** These rights are included in the file LGPL_EXCEPTION.txt in this package.
19 **
20 **************************************************************************/
21 // Module: liteapi.h
22 // Creator: visualfc <visualfc@gmail.com>
23 
24 #ifndef LITEAPI_H
25 #define LITEAPI_H
26 
27 #include "liteobj.h"
28 #include "litehtml.h"
29 
30 #include <QWidget>
31 #include <QMenu>
32 #include <QToolBar>
33 #include <QPlainTextEdit>
34 #include <QSettings>
35 #include <QMainWindow>
36 #include <QDockWidget>
37 #include <QFlags>
38 #include <QUrl>
39 #include <QDir>
40 #include <QFileInfo>
41 #include <QDesktopServices>
42 #include <QTextCursor>
43 #include <QAbstractItemModel>
44 
45 class ColorStyle;
46 class ColorStyleScheme;
47 
48 namespace LiteApi {
49 
50 class IApplication;
51 class IManager;
52 class IFile;
53 class IProject;
54 class IEditor;
55 /*
56 valueForKey
57 
58 EDITORPATH
59 EDITORNAME
60 EDITORDIR
61 
62 PROJECTPATH
63 PROJECTNAME
64 PROJECTDIR
65 
66 WORKDIR
67 
68 TARGETPATH
69 TARGETNAME
70 TARGETDIR
71 */
72 
73 struct TargetInfo1
74 {
75     QString workDir;
76     QString targetPath;
77     QString targetName;
78     QString targetDir;
79 };
80 
81 struct ProjectInfo
82 {
83     QString projectPath;
84     QString projectName;
85     QString projectDir;
86 };
87 
88 struct EditorInfo
89 {
90     QString editorPath;
91     QString editorName;
92     QString editorDir;
93 };
94 
95 class IManager : public QObject
96 {
97     Q_OBJECT
98 public:
QObject(parent)99     IManager(QObject *parent = 0) : QObject(parent) {}
~IManager()100     virtual ~IManager() {}
initWithApp(IApplication * app)101     virtual bool initWithApp(IApplication *app) {
102         m_liteApp = app;
103         return true;
104     }
application()105     virtual IApplication* application() {
106         return m_liteApp;
107     }
108 
109 protected:
110     IApplication *m_liteApp;
111 };
112 
113 class IMimeType
114 {
115 public:
~IMimeType()116     virtual ~IMimeType() {}
117 
118     virtual QString package() const = 0;
119     virtual QString type() const = 0;
120     virtual QString scheme() const = 0;
121     virtual QString comment() const = 0;
122     virtual QString codec() const = 0;
123     virtual bool tabToSpace() const = 0;
124     virtual int tabWidth() const = 0;
125     virtual QStringList globPatterns() const = 0;
126     virtual QStringList subClassesOf() const = 0;
127     virtual void merge(const IMimeType *mimeType) = 0;
128     virtual void setCustomPatterns(const QStringList &custom) = 0;
129     virtual QStringList customPatterns() const = 0;
130     virtual QStringList allPatterns() const = 0;
131 };
132 
133 class IMimeTypeManager : public IManager
134 {
135     Q_OBJECT
136 public:
IManager(parent)137     IMimeTypeManager(QObject *parent = 0) : IManager(parent) {}
138     virtual bool addMimeType(IMimeType *mimeType) = 0;
139     virtual void removeMimeType(IMimeType *mimeType) = 0;
140     virtual QList<IMimeType*> mimeTypeList() const= 0;
141     virtual IMimeType *findMimeType(const QString &type) const = 0;
142     virtual QString findPackageByMimeType(const QString &type) const = 0;
143     virtual QString findMimeTypeByFile(const QString &fileName) const = 0;
144     virtual QString findMimeTypeBySuffix(const QString &suffix) const = 0;
145     virtual QString findMimeTypeByScheme(const QString &scheme) const = 0;
146     virtual QStringList findAllFilesByMimeType(const QString &dir, const QString &type, int deep = 0) const = 0;
147 };
148 
mimeHead(const QString & mimeType)149 inline QString mimeHead(const QString &mimeType)
150 {
151     int find = mimeType.indexOf('/');
152     if (find == -1) {
153         return mimeType;
154     }
155     return mimeType.left(find);
156 }
157 
mimeIsText(const QString & mimeType)158 inline bool mimeIsText(const QString &mimeType)
159 {
160     return mimeHead(mimeType) == "text";
161 }
162 
mimeIsFolder(const QString & mimeType)163 inline bool mimeIsFolder(const QString &mimeType)
164 {
165     return mimeHead(mimeType) == "folder";
166 }
167 
168 class IFile : public QObject
169 {
170     Q_OBJECT
171 public:
QObject(parent)172     IFile(QObject *parent = 0) : QObject(parent) {}
~IFile()173     virtual ~IFile() { }
174     virtual bool loadText(const QString &filePath, const QString &mimeType, QString &outText) = 0;
175     virtual bool reloadText(QString &outText) = 0;
176     virtual bool saveText(const QString &filePath, const QString &text) = 0;
177     virtual bool isReadOnly() const = 0;
178     virtual bool isBinary() const = 0;
179     virtual QString filePath() const = 0;
180     virtual QString mimeType() const = 0;
181 };
182 
183 class IEditorFactory : public QObject
184 {
185     Q_OBJECT
186 public:
QObject(parent)187     IEditorFactory(QObject *parent = 0) : QObject(parent) {}
188     virtual QStringList mimeTypes() const = 0;
189     virtual IEditor *open(const QString &fileName, const QString &mimeType) = 0;
190     virtual IEditor *create(const QString &contents, const QString &mimeType) = 0;
191     virtual QString id() const = 0;
192     virtual QString displayName() const = 0;
193     virtual bool testMimeType(const QString &mimeType) = 0;
194 };
195 
196 class IProjectFactory : public QObject
197 {
198     Q_OBJECT
199 public:
QObject(parent)200     IProjectFactory(QObject *parent = 0) : QObject(parent) {}
201     virtual QStringList mimeTypes() const = 0;
202     virtual IProject *open(const QString &fileName, const QString &mimeType) = 0;
203     virtual bool findTargetInfo(const QString &fileName, const QString &mimetype, QMap<QString,QString>& targetInfo) const = 0;
204 };
205 
206 enum FILESYSTEM_CONTEXT_FLAG {
207     FILESYSTEM_ROOT = 0,
208     FILESYSTEM_ROOTFOLDER,
209     FILESYSTEM_FOLDER,
210     FILESYSTEM_FILES
211 };
212 
213 class IRecent : public QObject
214 {
215     Q_OBJECT
216 public:
QObject(parent)217     IRecent(QObject *parent = 0) : QObject(parent) {}
218     virtual QString type() const = 0;
219     virtual QString displyType() const = 0;
220     virtual void addRecent(const QString &name, int maxRecent) = 0;
221     virtual void removeRecent(const QString &name) = 0;
222     virtual QStringList recentNameList() = 0;
223     virtual void clearRecentNameList() = 0;
224     virtual void openRecent(const QString &name) = 0;
225 };
226 
227 class ISettingRecent : public IRecent
228 {
229     Q_OBJECT
230 public:
ISettingRecent(QSettings * setting,QObject * parent)231     ISettingRecent(QSettings *setting, QObject *parent) : IRecent(parent), m_settings(setting)
232     {
233     }
234 
addRecent(const QString & name,int maxRecent)235     virtual void addRecent(const QString &name, int maxRecent)
236     {
237         QString key = recentKey();
238         QStringList files = m_settings->value(key).toStringList();
239         files.removeAll(name);
240         files.prepend(name);
241         while (files.size() > maxRecent) {
242             files.removeLast();
243         }
244         m_settings->setValue(key, files);
245     }
246 
removeRecent(const QString & name)247     virtual void removeRecent(const QString &name)
248     {
249         QString key = recentKey();
250         QStringList values = m_settings->value(key).toStringList();
251         values.removeAll(name);
252         m_settings->setValue(key, values);
253     }
254 
recentNameList()255     virtual QStringList recentNameList()
256     {
257         QString key = recentKey();
258         return m_settings->value(key).toStringList();
259     }
260 
clearRecentNameList()261     virtual void clearRecentNameList()
262     {
263         QString key = recentKey();
264         m_settings->remove(key);
265     }
266 protected:
recentKey()267     virtual QString recentKey() const
268     {
269         return QString("Recent1/%1").arg(type());
270     }
271 protected:
272     QSettings   *m_settings;
273 };
274 
275 class IRecentManager : public IManager
276 {
277     Q_OBJECT
278 public:
IManager(parent)279     IRecentManager(QObject *parent = 0) : IManager(parent) {}
280 
281     virtual void registerRecent(IRecent *recent) = 0;
282     virtual QList<IRecent*> recentList() const = 0;
283     virtual IRecent *findRecent(const QString &type) const = 0;
284     virtual QStringList recentTypeList() const = 0;
285 
286     virtual void addRecent(const QString &name, const QString &type) = 0;
287     virtual void removeRecent(const QString &name, const QString &type) = 0;
288     virtual QStringList recentNameList(const QString &type) = 0;
289     virtual void clearRecentNameList(const QString &type) = 0;
290     virtual void openRecent(const QString &name, const QString &type) = 0;
291     virtual void updateRecentMenu(const QString &type) = 0;
292 signals:
293     void recentNameListChanged(const QString &type);
294 };
295 
296 class IFileManager : public IManager
297 {
298     Q_OBJECT
299 public:
IManager(parent)300     IFileManager(QObject *parent = 0) : IManager(parent) {}
301 
302     virtual void execFileWizard(const QString &projPath, const QString &filePath, const QString &gopath = QString()) = 0;
303     virtual bool openFile(const QString &fileName) = 0;
304     virtual IEditor *openEditor(const QString &fileName, bool bActive = true, bool ignoreNavigationHistory = false) = 0;
305     virtual IEditor *openEditorByFactory(const QString &fileName, const QString &factoryId, bool bActive = true, bool ignoreNavigationHistory = false) = 0;
306     virtual IEditor *createEditor(const QString &contents, const QString &_mimeType) = 0;
307     virtual IEditor *createEditor(const QString &fileName) = 0;
308     virtual IProject *openProject(const QString &fileName) = 0;
309     virtual IProject *openProjectScheme(const QString &fileName, const QString &scheme) = 0;
310     virtual bool findProjectTargetInfo(const QString &fileName, QMap<QString,QString>& targetInfo) const = 0;
311     //virtual IApplication* openFolderEx(const QString &folder) = 0;
312     virtual QStringList folderList() const = 0;
313     virtual void setFolderList(const QStringList &folders) = 0;
314     virtual void addFolderList(const QString &folders) = 0;
315     virtual IApplication* openFolderInNewWindow(const QString &folder) = 0;
316     virtual void emitAboutToShowFolderContextMenu(QMenu *menu, LiteApi::FILESYSTEM_CONTEXT_FLAG flag, const QFileInfo &info, const QString &context) = 0;
317 signals:
318     void fileListChanged();
319     void fileWizardFinished(const QString &type, const QString &scheme, const QString &location);
320     void aboutToShowFolderContextMenu(QMenu *menu, LiteApi::FILESYSTEM_CONTEXT_FLAG flag, const QFileInfo &info,const QString &context);
321 public slots:
322     virtual void newFile() = 0;
323     virtual void openFiles() = 0;
324     virtual void openFolder() = 0;
325     virtual void openEditors() = 0;
326     virtual void openProjects() = 0;
327 };
328 
329 class IEditContext : public QObject
330 {
331     Q_OBJECT
332 public:
IEditContext(QObject * parent)333     IEditContext(QObject *parent) : QObject(parent) {}
334     virtual QWidget *focusWidget() const = 0;
335     virtual QMenu   *focusMenu() const = 0;
336     virtual QToolBar *focusToolBar() const = 0;
337 };
338 
339 class IView : public IObject
340 {
341     Q_OBJECT
342 public:
IObject(parent)343     IView(QObject *parent = 0) : IObject(parent) {}
344     virtual QWidget *widget() = 0;
345     virtual QString name() const = 0;
icon()346     virtual QIcon icon() const { return QIcon(); }
347 };
348 
349 class IEditor : public IView
350 {
351     Q_OBJECT
352 public:
IView(parent)353     IEditor(QObject *parent = 0) : IView(parent) {}
354     virtual bool open(const QString &filePath,const QString &mimeType) = 0;
355     virtual bool reload() = 0;
356     virtual bool save() = 0;
357     virtual bool saveAs(const QString &filePath) = 0;
358     virtual void setReadOnly(bool b) = 0;
359     virtual bool isReadOnly() const = 0;
360     virtual bool isModified() const = 0;
361     virtual QString filePath() const = 0;
362     virtual QString mimeType() const = 0;
363     virtual QByteArray saveState() const = 0;
364     virtual bool restoreState(const QByteArray &array) = 0;
365     virtual void onActive() = 0;
366 signals:
367     void modificationChanged(bool);
368     void contentsChanged();
369     void reloaded();
370 };
371 
372 struct FindOption {
373     QString findText;
374     bool    useRegexp;
375     bool    matchWord;
376     bool    matchCase;
377     bool    wrapAround;
378     bool    backWard;
379 };
380 
381 class ITextEditor : public IEditor
382 {
383     Q_OBJECT
384 public:
385     enum PositionOperation {
386         Current = 1,
387         EndOfLine = 2,
388         StartOfLine = 3,
389         Anchor = 4,
390         EndOfDoc = 5
391     };
IEditor(parent)392     ITextEditor(QObject *parent = 0) : IEditor(parent) {}
393     virtual int line() const = 0;
394     virtual int column() const = 0;
395     virtual int utf8Position(bool realFile = false, int pos = -1) const = 0;
396     virtual QByteArray utf8Data() const = 0;
397     virtual void setLineWrap(bool wrap) = 0;
398     virtual bool isLineWrap() const = 0;
399     virtual void gotoLine(int blockNumber, int column, bool center = false, int selection = 0) = 0;
400     virtual void setFindOption(FindOption *opt) = 0;
401     virtual int position(PositionOperation posOp = Current, int at = -1) const = 0;
402     virtual QString textAt(int pos, int length) const = 0;
403     virtual QRect cursorRect(int pos = -1) const = 0;
404     virtual QTextCursor textCursor() const = 0;
405     virtual QTextDocument *document() const = 0;
406 };
407 
getTextEditor(IEditor * editor)408 inline ITextEditor *getTextEditor(IEditor *editor)
409 {
410     if (editor && editor->extension()) {
411         return findExtensionObject<ITextEditor*>(editor->extension(),"LiteApi.ITextEditor");
412     }
413     return 0;
414 }
415 
getMenu(IObject * obj,const QString & id)416 inline QMenu *getMenu(IObject *obj, const QString &id)
417 {
418     if (obj && obj->extension()) {
419         return findExtensionObject<QMenu*>(obj->extension(),QString("LiteApi.Menu.%1").arg(id));
420     }
421     return 0;
422 }
423 
getEditContext(IObject * obj)424 inline IEditContext *getEditContext(IObject *obj)
425 {
426     if (obj && obj->extension()) {
427         return findExtensionObject<IEditContext*>(obj->extension(),"LiteApi.IEditContext");
428     }
429     return 0;
430 }
431 
getEditMenu(IObject * obj)432 inline QMenu *getEditMenu(IObject *obj)
433 {
434     return getMenu(obj,"Edit");
435 }
436 
getContextMenu(IObject * obj)437 inline QMenu *getContextMenu(IObject *obj)
438 {
439     if (obj && obj->extension()) {
440         return findExtensionObject<QMenu*>(obj->extension(),"LiteApi.ContextMenu");
441     }
442     return 0;
443 }
444 
getPlainTextEdit(IEditor * editor)445 inline QPlainTextEdit *getPlainTextEdit(IEditor *editor) {
446     if (editor && editor->extension()) {
447         return findExtensionObject<QPlainTextEdit*>(editor->extension(),"LiteApi.QPlainTextEdit");
448     }
449     return 0;
450 }
451 
getEditToolBar(IEditor * editor)452 inline QToolBar *getEditToolBar(IEditor *editor) {
453     if (editor && editor->extension()) {
454         return findExtensionObject<QToolBar*>(editor->extension(),"LiteApi.QToolBar.Edit");
455     }
456     return 0;
457 }
458 
getBuildToolBar(IEditor * editor)459 inline QToolBar *getBuildToolBar(IEditor *editor) {
460     if (editor && editor->extension()) {
461         return findExtensionObject<QToolBar*>(editor->extension(),"LiteApi.QToolBar.Build");
462     }
463     return 0;
464 }
465 
466 
467 class IEditorManager : public IManager
468 {
469     Q_OBJECT
470 public:
IManager(parent)471     IEditorManager(QObject *parent = 0) : IManager(parent) {}
472     virtual IEditor *openEditor(const QString &fileName, const QString &mimeType) = 0;
473     virtual IEditor *openEditorByFactory(const QString &fileName, const QString &mimeType, const QString &factoryId) = 0;
474     virtual void addFactory(IEditorFactory *factory) = 0;
475     virtual void removeFactory(IEditorFactory *factory) = 0;
476     virtual QList<IEditorFactory*> factoryList() const = 0;
477     virtual QStringList mimeTypeList() const = 0;
478     virtual QWidget *widget() = 0;
479     virtual IEditor *currentEditor() const = 0;
480     virtual void setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory = false) = 0;
481     virtual IEditor *findEditor(const QString &fileName, bool canonical) const = 0;
482     virtual QList<IEditor*> editorList() const = 0;
483     virtual QAction *registerBrowser(IEditor *editor) = 0;
484     virtual void activeBrowser(IEditor *editor) = 0;
485     virtual void addNavigationHistory(IEditor *editor = 0,const QByteArray &saveState = QByteArray()) = 0;
486     virtual void cutForwardNavigationHistory() = 0;
487     virtual void loadColorStyleScheme(const QString &fileName) = 0;
488     virtual const ColorStyleScheme *colorStyleScheme() const = 0;
489     virtual void addEditContext(IEditContext *context) = 0;
490     virtual void removeEditContext(IEditContext *context) = 0;
491     virtual void updateEditInfo(const QString &info) = 0;
492 public slots:
493     virtual bool saveEditor(IEditor *editor = 0, bool emitAboutSave = true) = 0;
494     virtual bool saveEditorAs(IEditor *editor = 0) = 0;
495     virtual bool saveAllEditors(bool emitAboutSave = true) = 0;
496     virtual bool closeEditor(IEditor *editor = 0) = 0;
497     virtual bool closeAllEditors() = 0;
498 signals:
499     void currentEditorChanged(LiteApi::IEditor *editor);
500     void editorCreated(LiteApi::IEditor *editor);
501     void editorAboutToClose(LiteApi::IEditor *editor);
502     void editorAboutToSave(LiteApi::IEditor *editor);
503     void editorSaved(LiteApi::IEditor *editor);
504     void editorModifyChanged(LiteApi::IEditor *editor, bool b);
505     void colorStyleSchemeChanged();
506 };
507 
508 class IBrowserEditor : public IEditor
509 {
510     Q_OBJECT
511 public:
IEditor(parent)512     IBrowserEditor(QObject *parent = 0)  : IEditor(parent) {}
open(const QString &,const QString &)513     virtual bool open(const QString &/*fileName*/,const QString &/*mimeType*/) { return false; }
reload()514     virtual bool reload() { return false; }
save()515     virtual bool save() { return false; }
saveAs(const QString &)516     virtual bool saveAs(const QString &/*fileName*/){ return false; }
setReadOnly(bool)517     virtual void setReadOnly(bool /*b*/) {}
isReadOnly()518     virtual bool isReadOnly() const { return true; }
isModified()519     virtual bool isModified() const { return false; }
filePath()520     virtual QString filePath() const { return QString(); }
editorInfo()521     virtual QMap<QString,QString> editorInfo() const { return QMap<QString,QString>(); }
targetInfo()522     virtual QMap<QString,QString> targetInfo() const { return QMap<QString,QString>(); }
saveState()523     virtual QByteArray saveState() const {return QByteArray(); }
restoreState(const QByteArray &)524     virtual bool restoreState(const QByteArray &) { return false; }
onActive()525     virtual void onActive(){}
526 };
527 
528 class IWebKitBrowser : public IBrowserEditor
529 {
530     Q_OBJECT
531 public:
IBrowserEditor(parent)532     IWebKitBrowser(QObject *parent = 0)  : IBrowserEditor(parent) {}
533     virtual void openUrl(const QUrl &url) = 0;
534 signals:
535     void loadFinished(bool);
536 };
537 
538 class IProject : public IView
539 {
540     Q_OBJECT
541 public:
542     virtual QString filePath() const = 0;
543     virtual QString mimeType() const = 0;
544     virtual QStringList folderList() const = 0;
545     virtual QStringList fileNameList() const = 0;
546     virtual QStringList filePathList() const = 0;
547     virtual QString fileNameToFullPath(const QString &filePath) = 0;
548     virtual QMap<QString,QString> targetInfo() const = 0;
549     virtual void load() = 0;
550 signals:
551     void reloaded();
552 };
553 
554 class IFileProject : public IProject
555 {
556     Q_OBJECT
557 public:
isFolder()558     virtual bool isFolder() const { return false; }
559 };
560 
561 class IFolderProject : public IProject
562 {
563     Q_OBJECT
564 public:
isFolder()565     virtual bool isFolder() const { return true; }
566     virtual QStringList folderList() const = 0;
567 };
568 
569 class IOption : public IView
570 {
571     Q_OBJECT
572 public:
IView(parent)573     IOption(QObject *parent = 0) : IView(parent) {}
574     virtual QString mimeType() const = 0;
575     virtual void save() = 0;
576     virtual void load() = 0;
577 };
578 
579 class IOptionFactory : public QObject
580 {
581     Q_OBJECT
582 public:
QObject(parent)583     IOptionFactory(QObject *parent = 0) : QObject(parent) {}
584     virtual QStringList mimeTypes() const = 0;
585     virtual IOption *create(const QString &mimeType) = 0;
586 };
587 
588 class IOptionManager : public IManager
589 {
590     Q_OBJECT
591 public:
IManager(parent)592     IOptionManager(QObject *parent = 0) : IManager(parent) {}
593     virtual void addFactory(IOptionFactory *factory) = 0;
594     virtual void removeFactory(IOptionFactory *factory) = 0;
595     virtual QList<IOptionFactory*> factoryList() const = 0;
596     virtual void emitApplyOption(const QString &mimetype) = 0;
597 public slots:
598     virtual void exec(const QString &mimeType) = 0;
599 signals:
600     void applyOption(QString);
601 };
602 
603 class IProjectManager : public IManager
604 {
605     Q_OBJECT
606 public:
IManager(parent)607     IProjectManager(QObject *parent = 0) : IManager(parent) {}
608     virtual IFolderProject *openFolder(const QString &folderPath) = 0;
609     virtual IProject *openProject(const QString &fileName, const QString &mimeType) = 0;
610     virtual void addFactory(IProjectFactory *factory) = 0;
611     virtual void removeFactory(IProjectFactory *factory) = 0;
612     virtual QList<IProjectFactory*> factoryList() const = 0;
613     virtual QStringList mimeTypeList() const = 0;
614     virtual void setCurrentProject(IProject *project) = 0;
615     virtual IProject *currentProject() const = 0;
616     virtual QList<IEditor*> editorList(IProject *project) const = 0;
617     virtual void addImportAction(QAction *act) = 0;
618     virtual QWidget *widget() = 0;
619 public slots:
620     virtual void saveProject(IProject *project = 0) = 0;
621     virtual void closeProject(IProject *project = 0) = 0;
622     virtual void openSchemeDialog(const QString &scheme) = 0;
623 signals:
624     void currentProjectChanged(LiteApi::IProject *project);
625     void projectAboutToClose(LiteApi::IProject *project);
626 };
627 
628 class IToolWindowManager : public IManager
629 {
630     Q_OBJECT
631 public:
IManager(parent)632     IToolWindowManager(QObject *parent = 0) : IManager(parent) {}
633     virtual QAction *addToolWindow(Qt::DockWidgetArea area, QWidget *widget, const QString &id, const QString &title, bool split,
634                                    QList<QAction*> widgetActions = QList<QAction*>(),
635                                    QList<QWidget*> widgetList = QList<QWidget*>() ) = 0;
636     virtual void moveToolWindow(Qt::DockWidgetArea from, Qt::DockWidgetArea to,QAction *action, bool split) = 0;
637     virtual QAction *findToolWindow(QWidget *widget) = 0;
638     virtual void removeToolWindow(QAction *action) = 0;
639     virtual void removeToolWindow(QWidget *widget) = 0;
640 };
641 
642 class IDockManager : public IManager
643 {
644     Q_OBJECT
645 public:
IManager(parent)646     IDockManager(QObject *parent = 0) : IManager(parent) {}
647     virtual QWidget *widget() = 0;
648     virtual QDockWidget *addDock(QWidget *widget,
649                          const QString &title,
650                          Qt::DockWidgetArea ares = Qt::LeftDockWidgetArea,
651                          Qt::DockWidgetAreas alowedAreas = Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea,
652                          QDockWidget::DockWidgetFeatures  features = QDockWidget::AllDockWidgetFeatures) = 0;
653     virtual void removeDock(QWidget *widget) = 0;
654     virtual void showDock(QWidget *widget) = 0;
655     virtual void hideDock(QWidget *widget) = 0;
656     virtual QDockWidget *dockWidget(QWidget *widget) = 0;
657 };
658 
659 enum VIEWMENU_ACTION_POS
660 {
661     ViewMenuToolBarPos = 1,
662     ViewMenuToolWindowPos,
663     ViewMenuBrowserPos,
664     ViewMenuLastPos
665 };
666 
667 struct ActionInfo {
668     QString label;
669     QString defks;
670     QString ks;
671     bool    standard;
672     QList<QKeySequence> keys;
673     QAction *action;
674 };
675 
676 class IActionContext {
677 public:
~IActionContext()678     virtual ~IActionContext() {}
679     virtual QString contextName() const = 0;
680     virtual void regAction(QAction *act, const QString &id, const QString &defks, bool standard = false) = 0;
681     virtual void regAction(QAction *act, const QString &id, const QKeySequence::StandardKey &def) = 0;
682     virtual QStringList actionKeys() const = 0;
683     virtual ActionInfo *actionInfo(const QString &id) const = 0;
684     virtual void setActionShortcuts(const QString &id, const QString &shortcuts) = 0;
685 };
686 
687 class IActionManager : public IManager
688 {
689     Q_OBJECT
690 public:
IManager(parent)691     IActionManager(QObject *parent = 0) : IManager(parent) {}
692     virtual QMenu *insertMenu(const QString &id, const QString &title, const QString &idBefore = QString()) = 0;
693     virtual QMenu *loadMenu(const QString &id) = 0;
694     virtual void removeMenu(QMenu *menu) = 0;
695     virtual QList<QString>  menuList() const = 0;
696     virtual QToolBar *insertToolBar(const QString &id, const QString &title, const QString &before = QString()) = 0;
697     virtual void insertToolBar(QToolBar *toolBar,const QString &before = QString()) = 0;
698     virtual QToolBar *loadToolBar(const QString &id) = 0;
699     virtual void removeToolBar(QToolBar* toolBar) = 0;
700     virtual QList<QString> toolBarList() const = 0;
701     virtual void insertViewMenu(VIEWMENU_ACTION_POS pos, QAction *act) = 0;
702     virtual void setViewMenuSeparator(const QString &sepid, bool group = false) = 0;
703     virtual void insertViewMenuAction(QAction *act, const QString &sepid) = 0;
704     virtual bool insertMenuActions(const QString &idMenu, const QString &idBeforeSep, bool newGroup,  QList<QAction*> &actions) = 0;
705     virtual IActionContext *getActionContext(QObject *obj, const QString &name) = 0;
706     virtual QStringList actionKeys() const = 0;
707     virtual ActionInfo *actionInfo(const QString &id) const = 0;
708     virtual void setActionShourtcuts(const QString &id, const QString &shortcuts) = 0;
709     virtual QStringList actionContextNameList() const = 0;
710     virtual IActionContext *actionContextForName(const QString &name) = 0;
711 };
712 
713 class IGoProxy : public QObject
714 {
715     Q_OBJECT
716 public:
IGoProxy(QObject * parent)717     IGoProxy(QObject *parent) : QObject(parent) {}
718     virtual bool isValid() const = 0;
719     virtual bool isRunning() const = 0;
720     virtual QByteArray commandId() const = 0;
721     virtual void writeStdin(const QByteArray &data) = 0;
722 signals:
723     void started();
724     void stdoutput(const QByteArray &data);
725     void stderror(const QByteArray &data);
726     void finished(int code, const QByteArray &msg);
727 public slots:
728     virtual void call(const QByteArray &id, const QByteArray &args = QByteArray()) = 0;
729 };
730 
731 class IPlugin;
732 class IApplication : public IObject
733 {
734     Q_OBJECT
735 public:
~IApplication()736     virtual ~IApplication() {}
737     virtual IApplication    *newInstance(const QString &session) = 0;
738     virtual QList<IApplication*> instanceList() const = 0;
739     virtual bool hasGoProxy() const = 0;
740     virtual IGoProxy *createGoProxy(QObject *parent) = 0;
741     virtual IProjectManager *projectManager() = 0;
742     virtual IEditorManager  *editorManager() = 0;
743     virtual IFileManager    *fileManager() = 0;
744     virtual IActionManager  *actionManager() = 0;
745     virtual IMimeTypeManager *mimeTypeManager() = 0;
746     virtual IOptionManager  *optionManager() = 0;
747     virtual IToolWindowManager *toolWindowManager() = 0;
748     virtual IHtmlWidgetManager *htmlWidgetManager() = 0;
749     virtual IRecentManager *recentManager() = 0;
750 
751     virtual QMainWindow *mainWindow() const = 0;
752     virtual QSettings *settings() = 0;
753     virtual QMap<QString,QVariant> &globalCookie() = 0; //global cookie
754 
755     virtual QString rootPath() const = 0;
756     virtual QString applicationPath() const = 0;
757     virtual QString toolPath() const = 0;
758     virtual QString resourcePath() const = 0;
759     virtual QString pluginPath() const = 0;
760     virtual QString storagePath() const = 0;
761 
762     virtual QString ideVersion() const = 0;
763     virtual QString ideFullName() const = 0;
764     virtual QString ideName() const = 0;
765     virtual QString ideCopyright() const = 0;
766 
767     virtual QList<IPlugin*> pluginList() const = 0;
768 
769     virtual void loadSession(const QString &sessioin) = 0;
770     virtual void saveSession(const QString &sessioin) = 0;
771     virtual QStringList sessionList() const = 0;
772     virtual QString currentSession() const = 0;
773 
774     virtual void loadState() = 0;
775     virtual void saveState() = 0;
776 
777     virtual void appendLog(const QString &model, const QString &log, bool error = false) = 0;
778     virtual void sendBroadcast(const QString &module, const QString &id, const QVariant &param = QVariant()) = 0;
779 signals:
780     void loaded();
781     void aboutToQuit();
782     void key_escape();
783     void broadcast(QString,QString,QVariant);
784     void sessionListChanged();
785 };
786 
787 class PluginInfo
788 {
789 public:
PluginInfo()790     PluginInfo() : m_mustLoad(false)
791     {}
~PluginInfo()792     virtual ~PluginInfo() {}
author()793     QString author() const { return m_author; }
info()794     QString info() const { return m_info; }
id()795     QString id() const { return m_id; }
name()796     QString name() const { return m_name; }
ver()797     QString ver() const { return m_ver; }
dependList()798     QStringList dependList() const { return m_dependList; }
filePath()799     QString filePath() const { return m_filePath; }
isMustLoad()800     bool isMustLoad() const { return m_mustLoad; }
setAuthor(const QString & author)801     void setAuthor(const QString &author) { m_author = author; }
setInfo(const QString & info)802     void setInfo(const QString &info) { m_info = info; }
setId(const QString & id)803     void setId(const QString &id) { m_id = id.toLower(); }
setName(const QString & name)804     void setName(const QString &name) { m_name = name; }
setVer(const QString & ver)805     void setVer(const QString &ver) { m_ver = ver; }
setFilePath(const QString & path)806     void setFilePath(const QString &path) { m_filePath = path; }
setDependList(const QStringList & dependList)807     void setDependList(const QStringList &dependList) { m_dependList = dependList; }
appendDepend(const QString & depend)808     void appendDepend(const QString &depend) { m_dependList.append(depend); }
setMustLoad(bool b)809     void setMustLoad(bool b) { m_mustLoad = b; }
810 protected:
811     bool m_mustLoad;
812     QString m_author;
813     QString m_info;
814     QString m_id;
815     QString m_name;
816     QString m_filePath;
817     QString m_ver;
818     QStringList m_dependList;
819 };
820 
821 class IPlugin : public IObject
822 {
823     Q_OBJECT
824 public:
825     virtual bool load(LiteApi::IApplication *app) = 0;
826 };
827 
828 class IPluginFactory : public QObject
829 {
830     Q_OBJECT
831 public:
~IPluginFactory()832     virtual ~IPluginFactory() {}
833     virtual QString id() const = 0;
834     virtual PluginInfo *info() const = 0;
835     virtual QStringList dependPluginList() const = 0;
836     virtual void setFilePath(const QString &path) = 0;
837     virtual QString filePath() const = 0;
838     virtual IPlugin *createPlugin() = 0;
839 };
840 
841 class IPluginFactoryImpl : public IPluginFactory
842 {
843     Q_OBJECT
844 public:
IPluginFactoryImpl()845     IPluginFactoryImpl() : m_info(new PluginInfo)
846     {
847     }
~IPluginFactoryImpl()848     virtual ~IPluginFactoryImpl()
849     {
850         delete m_info;
851     }
id()852     virtual QString id() const
853     {
854         return m_info->id();
855     }
info()856     virtual PluginInfo *info() const
857     {
858         return m_info;
859     }
dependPluginList()860     virtual QStringList dependPluginList() const{
861         return m_info->dependList();
862     }
setFilePath(const QString & path)863     virtual void setFilePath(const QString &path)
864     {
865         m_info->setFilePath(path);
866     }
filePath()867     virtual QString filePath() const
868     {
869         return m_info->filePath();
870     }
871 protected:
872     PluginInfo *m_info;
873 };
874 
875 template <typename T>
876 class PluginFactoryT : public IPluginFactoryImpl
877 {
878 public:
createPlugin()879     virtual IPlugin *createPlugin()
880     {
881         return new T;
882     }
883 };
884 
885 class IAppIdleTimer : public QObject
886 {
887     Q_OBJECT
888 signals:
889     void appIdle(int sec);
890 public:
891     virtual void resetTimer() = 0;
892 };
893 
GetAppIdleTimer(LiteApi::IApplication * app)894 inline IAppIdleTimer *GetAppIdleTimer(LiteApi::IApplication *app)
895 {
896     return static_cast<IAppIdleTimer*>(app->extension()->findObject("LiteApi.IAppIdleTimer"));
897 }
898 
gotoLine(IApplication * app,const QString & fileName,int line,int col,bool forceCenter,bool saveHistory)899 inline bool gotoLine(IApplication *app, const QString &fileName, int line, int col, bool forceCenter, bool saveHistory) {
900     if (saveHistory) {
901         app->editorManager()->addNavigationHistory();
902     }
903     IEditor *cur = app->editorManager()->currentEditor();
904     IEditor *edit = app->fileManager()->openEditor(fileName);
905     ITextEditor *textEdit = getTextEditor(edit);
906     if (textEdit) {
907         if (cur == edit) {
908             textEdit->gotoLine(line,col,forceCenter);
909         } else {
910             textEdit->gotoLine(line,col,true);
911         }
912         return true;
913     }
914     return false;
915 }
916 
getToolBarIconSize(LiteApi::IApplication * app)917 inline QSize getToolBarIconSize(LiteApi::IApplication *app) {
918     int v = app->settings()->value("General/ToolBarIconSize",0).toInt();
919     switch (v) {
920     case 0:
921         return QSize(16,16);
922     case 1:
923         return QSize(18,18);
924     case 2:
925         return QSize(20,20);
926     case 3:
927         return QSize(22,22);
928     case 4:
929         return QSize(24,24);
930     }
931     return QSize(16,16);
932 }
933 
getWebKitBrowser(LiteApi::IApplication * app)934 inline IWebKitBrowser *getWebKitBrowser(LiteApi::IApplication *app)
935 {
936     return static_cast<IWebKitBrowser*>(app->extension()->findObject("LiteApp.IWebKitBrowser"));
937 }
938 
getGotools(LiteApi::IApplication * app)939 inline QString getGotools(LiteApi::IApplication *app)
940 {
941 #ifdef Q_OS_WIN
942     return app->toolPath()+"/gotools.exe";
943 #else
944     return app->toolPath()+"/gotools";
945 #endif
946 }
947 
findPackageByMimeType(LiteApi::IApplication * app,const QString mimeType)948 inline QString findPackageByMimeType(LiteApi::IApplication *app, const QString mimeType)
949 {
950     return app->mimeTypeManager()->findPackageByMimeType(mimeType);
951 }
952 
953 } //namespace LiteApi
954 
955 Q_DECLARE_INTERFACE(LiteApi::IPluginFactory,"LiteApi.IPluginFactory.X37")
956 
957 
958 #endif //LITEAPI_H
959 
960