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 ¶m = 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