itom  4.1.0
scriptDockWidget.h
1 /* ********************************************************************
2  itom software
3  URL: http://www.uni-stuttgart.de/ito
4  Copyright (C) 2020, Institut fuer Technische Optik (ITO),
5  Universitaet Stuttgart, Germany
6 
7  This file is part of itom.
8 
9  itom is free software; you can redistribute it and/or modify it
10  under the terms of the GNU Library General Public Licence as published by
11  the Free Software Foundation; either version 2 of the Licence, or (at
12  your option) any later version.
13 
14  itom is distributed in the hope that it will be useful, but
15  WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
17  General Public Licence for more details.
18 
19  You should have received a copy of the GNU Library General Public License
20  along with itom. If not, see <http://www.gnu.org/licenses/>.
21 *********************************************************************** */
22 
23 #ifndef SCRIPTDOCKWIDGET_H
24 #define SCRIPTDOCKWIDGET_H
25 
26 #include "abstractDockWidget.h"
27 #include "itomQWidgets.h"
28 #include "scriptEditorWidget.h"
29 #include "tabSwitcherWidget.h"
30 #include "outlineSelectorWidget.h"
31 
32 #include <qaction.h>
33 #include <qstring.h>
34 #include <qtoolbar.h>
35 #include <qcombobox.h>
36 #include <qpointer.h>
37 #include <qsharedpointer.h>
38 
39 #include "../models/outlineItem.h"
40 #include "../models/bookmarkModel.h"
41 
42 #include <qevent.h>
43 
44 #include "../ui/widgetFindWord.h"
45 
46 class QSignalMapper; //forward declaration
47 
48 namespace ito {
49 
50 class DialogReplace; //forward declaration
51 
54 {
55  QAction *actNavigationForward;
56  QAction *actNavigationBackward;
57 };
58 
59 
61 {
62  Q_OBJECT
63 public:
64  ScriptDockWidget(const QString &title, const QString &objName, bool docked, bool isDockAvailable,
65  const ScriptEditorActions &commonActions, BookmarkModel *bookmarkModel,
66  QWidget *parent = 0, Qt::WindowFlags flags = 0);
68 
69  QStringList getModifiedFileNames(bool ignoreNewScripts = false, int excludeIndex = -1) const;
70  QStringList getAllFilenames() const;
71 
72  RetVal newScript();
74  RetVal openScript(QString filename, bool silent = false);
75  RetVal saveAllScripts(bool askFirst = true, bool ignoreNewScripts = false, int excludeIndex = -1);
76  RetVal closeAllScripts(bool saveFirst = true, bool askFirst = true, bool ignoreNewScripts = false, \
77  int excludeIndex = -1, bool closeScriptWidgetIfLastTabClosed = true);
78 
79  inline bool isTabIndexValid(int tabIndex) const { return (tabIndex >= 0 && tabIndex < m_tab->count()); }
80  inline int getTabCount() const { return m_tab->count(); }
81  inline int getCurrentIndex() const { return m_tab->currentIndex(); }
82  void setCurrentIndex(int index);
83 
84  bool containsNewScripts() const;
85 
86  RetVal appendEditor(ScriptEditorWidget* editorWidget);
87  ScriptEditorWidget* removeEditor(int index);
88  bool activateTabByFilename(const QString &filename, int currentDebugLine = -1, int UID = -1);
89  bool activeTabEnsureLineVisible(const int lineNr, bool errorMessageClick = false, bool showSelectedCallstackLine = false);
90  void activeTabShowLineAndHighlightWord(const int line, const QString &highlightedText, Qt::CaseSensitivity caseSensitivity = Qt::CaseInsensitive);
91  const QTabWidget* tabWidget() const { return m_tab; }
92 
93  QList<ito::ScriptEditorStorage> saveScriptState() const;
94  RetVal restoreScriptState(const QList<ito::ScriptEditorStorage> &states);
95 
97  QList<OutlineSelectorWidget::EditorOutline> getAllOutlines(int &activeIndex) const;
98 
99 protected:
100  ScriptEditorWidget* getEditorByIndex(int index) const;
101  ScriptEditorWidget* getCurrentEditor() const;
102 
103  int getIndexByEditor(const ScriptEditorWidget* sew) const;
104  void tabFilenameOrModificationChanged(int index);
105 
106  void createActions();
107  //void deleteActions();
108  void createMenus();
109  void createToolBars();
110  void createStatusBar();
111  void closeEvent(QCloseEvent *event);
112 
113  RetVal closeTab(int index, bool saveFirst = true, bool closeScriptWidgetIfLastTabClosed = true);
114  RetVal saveTab(int index, bool forceSaveAs = false, bool askFirst = true);
115 
116 private:
117  QWidget *m_pCenterWidget;
118  QVBoxLayout *m_pVBox;
120  WidgetFindWord *m_pWidgetFindWord;
121  DialogReplace *m_pDialogReplace;
122  BookmarkModel* m_pBookmarkModel;
123 
126  /*
128  This list is used to initialize the tabSwitcherWidget if Ctrl+Tab is pressed.
129  */
130  QList<int> m_stackHistory;
131 
132  QSharedPointer<TabSwitcherWidget> m_tabSwitcherWidget;
133  QSharedPointer<OutlineSelectorWidget> m_outlineSelectorWidget;
134 
135  // ACTIONS
136  ShortcutAction *m_tabMoveLeftAction;
137  ShortcutAction *m_tabMoveRightAction;
138  ShortcutAction *m_tabMoveFirstAction;
139  ShortcutAction *m_tabMoveLastAction;
140  ShortcutAction *m_tabCloseAction;
141  ShortcutAction *m_tabCloseOthersAction;
142  ShortcutAction *m_tabCloseAllAction;
143  ShortcutAction *m_tabDockAction;
144  ShortcutAction *m_tabUndockAction;
145  ShortcutAction *m_newScriptAction;
146  ShortcutAction *m_openScriptAction;
147  ShortcutAction *m_saveScriptAction;
148  ShortcutAction *m_saveScriptAsAction;
149  ShortcutAction *m_saveAllScriptsAction;
150  ShortcutAction *m_printAction;
151  ShortcutAction *m_cutAction;
152  ShortcutAction *m_copyAction;
153  ShortcutAction *m_pasteAction;
154  ShortcutAction *m_undoAction;
155  ShortcutAction *m_redoAction;
156  ShortcutAction *m_commentAction;
157  ShortcutAction *m_uncommentAction;
158  ShortcutAction *m_indentAction;
159  ShortcutAction *m_unindentAction;
160  ShortcutAction *m_autoCodeFormatAction;
161  ShortcutAction *m_pyDocstringGeneratorAction;
162  ShortcutAction *m_scriptRunAction;
163  ShortcutAction *m_scriptRunSelectionAction;
164  ShortcutAction *m_scriptDebugAction;
165  ShortcutAction *m_scriptStopAction;
166  ShortcutAction *m_scriptContinueAction;
167  ShortcutAction *m_scriptStepAction;
168  ShortcutAction *m_scriptStepOverAction;
169  ShortcutAction *m_scriptStepOutAction;
170  ShortcutAction *m_findTextExprAction;
171  ShortcutAction *m_findTextExprActionSC;
172  ShortcutAction *m_replaceTextExprAction;
173  ShortcutAction *m_gotoAction;
174  ShortcutAction *m_openIconBrowser;
175  ShortcutAction *m_bookmarkToggle;
176 
177  ShortcutAction *m_insertCodecAct;
178  ShortcutAction *m_copyFilename;
179  ShortcutAction *m_findSymbols;
180 
181  ScriptEditorActions m_commonActions;
182 
183  QMenu *m_tabContextMenu;
184  QMenu *m_fileMenu;
185  QMenu *m_lastFilesMenu;
186  QMenu *m_viewMenu;
187  QMenu *m_editMenu;
188  QMenu *m_scriptMenu;
189  QMenu *m_winMenu;
190  QMenu *m_bookmark;
191 
192  QSignalMapper *m_lastFilesMapper;
193 
194  QToolBar* m_fileToolBar;
195  QToolBar* m_editToolBar;
196  QToolBar* m_scriptToolBar;
197  QToolBar* m_bookmarkToolBar;
198 
199  QString m_autoCodeFormatCmd;
200 
201  // ClassNavigator
202  QWidget *m_classMenuBar;
203  QComboBox *m_classBox;
204  QComboBox *m_methodBox;
205  bool m_outlineShowNavigation;
206  void fillNavigationClassComboBox(const QSharedPointer<OutlineItem> &parent, const QString &prefix);
207  void fillNavigationMethodComboBox(const QSharedPointer<OutlineItem> &parent, const QString &prefix);
208  void showOutlineNavigationBar(bool show);
209 
210  static QPointer<ScriptEditorWidget> currentSelectedCallstackLineEditor; //this static variable holds the (weak) pointer to the script editor widget that received the last "selected callstack line" selector.
211 
212 signals:
215  void openScriptRequest(const QString &filename, ScriptDockWidget* scriptDockWidget);
217  void dockScriptTab(ScriptDockWidget* widget, int index, bool closeDockIfEmpty = false);
218  void undockScriptTab(ScriptDockWidget* widget, int index, bool undockToNewScriptWindow = false, bool closeDockIfEmpty = false);
220  void pythonRunFileRequest(QString filename);
221  void pythonDebugFileRequest(QString filename);
222  void pythonInterruptExecution();
223  void pythonDebugCommand(tPythonDbgCmd cmd);
224  void pythonRunSelection(QString selectionText);
226  void addGoBackNavigationItem(const GoBackNavigationItem &item);
227 
228 private slots:
229  void tabContextMenuEvent (QContextMenuEvent * event);
230 
231  void findTextExpr(QString expr, bool regExpr, bool caseSensitive, bool wholeWord, bool wrap, bool forward, bool isQuickSeach);
232  void replaceTextExpr(QString expr, QString replace);
233  void replaceAllExpr(QString expr, QString replace, bool regExpr, bool caseSensitive, bool wholeWord, bool findInSel);
234  void insertIconBrowserText(QString iconLink);
235 
236  void currentTabChanged(int index);
237  void tabCloseRequested(int index);
238  void tabCloseRequested(ScriptEditorWidget* sew, bool ignoreModifications);
239  void scriptModificationChanged(bool changed);
240 
241  void updateEditorActions();
242  void updatePythonActions();
244 
245  void mnuOpenIconBrowser();
246 
247  void mnuTabMoveLeft();
248  void mnuTabMoveRight();
249  void mnuTabMoveFirst();
250  void mnuTabMoveLast();
251  void mnuTabClose();
252  void mnuTabCloseOthers();
253  void mnuTabCloseAll();
254  void mnuTabDock();
255  void mnuTabUndock();
256  void mnuNewScript();
257  void mnuOpenScript();
258  void mnuSaveScript();
259  void mnuSaveScriptAs();
260  void mnuSaveAllScripts();
261  void mnuPrint();
262  void mnuCut();
263  void mnuCopy();
264  void mnuPaste();
265  void mnuUndo();
266  void mnuRedo();
267  void mnuComment();
268  void mnuUncomment();
269  void mnuIndent();
270  void mnuUnindent();
271  void mnuScriptRun();
272  void mnuScriptRunSelection();
273  void mnuScriptDebug();
274  void mnuScriptStop();
275  void mnuScriptContinue();
276  void mnuScriptStep();
277  void mnuScriptStepOver();
278  void mnuScriptStepOut();
279  void mnuFindTextExpr();
280  void mnuReplaceTextExpr();
281  void mnuGoto();
282  void mnuToggleBookmark();
283  void mnuInsertCodec();
284  void mnuCopyFilename();
285  void mnuPyCodeFormatting();
286  void mnuPyDocstringGenerator();
287 
288 
289  void menuLastFilesAboutToShow();
290  void lastFileOpen(const QString &path);
291 
292  // Class Navigator
293  void navigatorClassSelected(int row);
294  void navigatorMethodSelected(int row);
295 
296  void loadSettings();
297  void findWordWidgetFinished();
298 
299 public slots:
300  void editorMarginChanged();
301  void updateCodeNavigation(ScriptEditorWidget *editor, QSharedPointer<OutlineItem> rootItem);
302  void tabChangedRequest();
303  void mnuFindSymbolsShow();
304 };
305 
306 } //end namespace ito
307 
308 #endif
bool isTabIndexValid(int tabIndex) const
Definition: scriptDockWidget.h:79
void mnuSaveScript()
slot invoked by action to save active script
Definition: scriptDockWidget.cpp:2222
void updateEditorActions()
updates actions which deal with editor commands
Definition: scriptDockWidget.cpp:1456
void mnuTabDock()
dock the active tab and closes this ScriptDockWidget, if it is not docked and empty after docking ...
Definition: scriptDockWidget.cpp:2193
void updatePythonActions()
updates actions which deal with python commands
Definition: scriptDockWidget.cpp:1517
void mnuUncomment()
slot invoked to execute an uncomment command in active script editor
Definition: scriptDockWidget.cpp:2336
~ScriptDockWidget()
destructor
Definition: scriptDockWidget.cpp:191
void mnuTabUndock()
undock the active tab and closes this ScriptDockWidget, if it is not docked and empty after docking ...
Definition: scriptDockWidget.cpp:2200
widget containing one or multiple script editors (tabbed). This widget can either be a docking widget...
Definition: scriptDockWidget.h:60
void tabContextMenuEvent(QContextMenuEvent *event)
method is invoked, if a context menu is requested
Definition: scriptDockWidget.cpp:1432
this struct can hold common actions for all script editor and script dock widgets ...
Definition: scriptDockWidget.h:53
void createMenus()
create menus
Definition: scriptDockWidget.cpp:1835
void mnuScriptStepOver()
slot invoked to execute a python debugging step over
Definition: scriptDockWidget.cpp:2444
model for management of all bookmarks. This model will be displayed by a viewer-widget in the main wi...
void tabCloseRequested(int index)
slot invoked if close button of any tab of m_tab (QTabWidgetItom) has been pressed ...
Definition: scriptDockWidget.cpp:1274
void mnuTabClose()
closes active tab
Definition: scriptDockWidget.cpp:2169
Class for managing status values (like errors or warning)
Definition: retVal.h:54
void mnuSaveAllScripts()
slot invoked by action to save all opened scripts
Definition: scriptDockWidget.cpp:2249
Definition: dialogReplace.h:37
RetVal appendEditor(ScriptEditorWidget *editorWidget)
append given ScriptEditorWidget as new tab
Definition: scriptDockWidget.cpp:1016
QTabWidgetItom * m_tab
Definition: scriptDockWidget.h:119
void mnuTabMoveLast()
moves active tab to the last position
Definition: scriptDockWidget.cpp:2159
void pythonDebugFileRequest(QString filename)
QStringList getAllFilenames() const
returns a list of all filenames of all opened scripts (besides new scripts)
Definition: scriptDockWidget.cpp:780
void dockScriptTab(ScriptDockWidget *widget, int index, bool closeDockIfEmpty=false)
RetVal newScript()
creates new instance of ScriptEditorWidget and appends it to the tab-widget
Definition: scriptDockWidget.cpp:810
RetVal closeTab(int index, bool saveFirst=true, bool closeScriptWidgetIfLastTabClosed=true)
public method to close any specific tab with or without saving its script first
Definition: scriptDockWidget.cpp:1307
void currentTabChanged(int index)
slot invoked by tab-widget if current tab changed
Definition: scriptDockWidget.cpp:1221
ScriptEditorWidget * getEditorByIndex(int index) const
returns ScriptEditorWidget by given tab-index
Definition: scriptDockWidget.cpp:1376
void removeAndDeleteScriptDockWidget(ScriptDockWidget *widget)
RetVal openScript()
method to open an existing script which can be indicated by the user by a getOpenFileName-dialog.
Definition: scriptDockWidget.cpp:827
Definition: widgetFindWord.h:35
void pythonRunFileRequest(QString filename)
void scriptModificationChanged(bool changed)
slot connected to each ScriptEditorWidget instance. Invoked if any content in any script changed...
Definition: scriptDockWidget.cpp:1243
void mnuScriptStepOut()
slot invoked to execute a python debugging step out
Definition: scriptDockWidget.cpp:2451
void openScriptRequest(const QString &filename, ScriptDockWidget *scriptDockWidget)
void mnuCut()
slot invoked to execute a cut command in active script editor
Definition: scriptDockWidget.cpp:2275
void createToolBars()
create toolbars
Definition: scriptDockWidget.cpp:1937
void mnuScriptDebug()
slot invoked to debug the active script in python engine
Definition: scriptDockWidget.cpp:2399
Definition: apiFunctionsGraph.cpp:39
void mnuOpenIconBrowser()
Open the icon browser.
Definition: scriptDockWidget.cpp:2134
ScriptEditorWidget * getCurrentEditor() const
returns reference to current ScriptEditorWidget
Definition: scriptDockWidget.cpp:1417
int m_actTabIndex
borrowed reference to the bookmark model. This model is owned by the script editor organizer...
Definition: scriptDockWidget.h:124
void updateTabContextActions()
updates actions before context menu of tabs is shown
Definition: scriptDockWidget.cpp:1546
void mnuTabCloseAll()
closes every tab, asks for saving first
Definition: scriptDockWidget.cpp:2186
void mnuUndo()
slot invoked to execute an undo command in active script editor
Definition: scriptDockWidget.cpp:2309
RetVal saveAllScripts(bool askFirst=true, bool ignoreNewScripts=false, int excludeIndex=-1)
tries to save all opened scripts in this ScriptDockWidget
Definition: scriptDockWidget.cpp:927
RetVal closeAllScripts(bool saveFirst=true, bool askFirst=true, bool ignoreNewScripts=false, int excludeIndex=-1, bool closeScriptWidgetIfLastTabClosed=true)
closes all opened scripts in this ScriptDockWidget
Definition: scriptDockWidget.cpp:980
void mnuScriptStep()
slot invoked to execute a python debugging step
Definition: scriptDockWidget.cpp:2437
bool containsNewScripts() const
checks whether any editor in this ScriptDockWidget has no filename
Definition: scriptDockWidget.cpp:1137
Definition: shortcutAction.h:40
int getIndexByEditor(const ScriptEditorWidget *sew) const
returns tab-index by given reference to ScriptEditorWidget
Definition: scriptDockWidget.cpp:1395
QStringList getModifiedFileNames(bool ignoreNewScripts=false, int excludeIndex=-1) const
returns a list of filenames, which have been modified in this ScriptDockWidget
Definition: scriptDockWidget.cpp:748
abstract dock widget class which inherits QDockWidget. The content of QDockWidget consists of an inst...
Definition: abstractDockWidget.h:54
void pythonRunSelection(QString selectionText)
void mnuTabMoveFirst()
moves active tab to the first position
Definition: scriptDockWidget.cpp:2149
void mnuSaveScriptAs()
slot invoked by action to save active script with new filename (save as)
Definition: scriptDockWidget.cpp:2233
void mnuNewScript()
slot invoked by action to open a new script
Definition: scriptDockWidget.cpp:2208
void pythonDebugCommand(tPythonDbgCmd cmd)
Definition: itomQWidgets.h:41
void createStatusBar()
init status bar
Definition: scriptDockWidget.cpp:1989
void mnuScriptStop()
slot invoked to stop python script execution
Definition: scriptDockWidget.cpp:2419
void mnuScriptRun()
slot invoked to run the active script in python engine
Definition: scriptDockWidget.cpp:2369
void mnuRedo()
slot invoked to execute a redo command in active script editor
Definition: scriptDockWidget.cpp:2317
void mnuCopyFilename()
slot invoked by action to copy the filename to clipboard
Definition: scriptDockWidget.cpp:2815
void mnuScriptContinue()
slot invoked to continue debugging process if actually waiting at breakpoint
Definition: scriptDockWidget.cpp:2430
void mnuTabMoveLeft()
moves active tab by one position to the left
Definition: scriptDockWidget.cpp:2114
void showOutlineNavigationBar(bool show)
< displays or hides the entire outline navigation bar (class and method combo box) ...
Definition: scriptDockWidget.cpp:671
void createActions()
creates actions
Definition: scriptDockWidget.cpp:1576
void mnuPaste()
slot invoked to execute a paste command in active script editor
Definition: scriptDockWidget.cpp:2297
void closeEvent(QCloseEvent *event)
this method is invoked if this ScriptDockWidget should be closed.
Definition: scriptDockWidget.cpp:2629
Definition: scriptEditorWidget.h:74
void mnuIndent()
slot invoked to execute an indentation command in active script editor
Definition: scriptDockWidget.cpp:2347
ScriptDockWidget(const QString &title, const QString &objName, bool docked, bool isDockAvailable, const ScriptEditorActions &commonActions, BookmarkModel *bookmarkModel, QWidget *parent=0, Qt::WindowFlags flags=0)
constructor
Definition: scriptDockWidget.cpp:74
void mnuOpenScript()
slot invoked by action to open an existing script
Definition: scriptDockWidget.cpp:2215
void mnuTabMoveRight()
moves active tab by one position to the right
Definition: scriptDockWidget.cpp:2124
RetVal saveTab(int index, bool forceSaveAs=false, bool askFirst=true)
saves tab
Definition: scriptDockWidget.cpp:1345
void mnuComment()
slot invoked to execute a comment command in active script editor
Definition: scriptDockWidget.cpp:2325
bool docked() const
Definition: abstractDockWidget.h:128
int getTabCount() const
Definition: scriptDockWidget.h:80
void mnuUnindent()
slot invoked to execute an unindentation command in active script editor
Definition: scriptDockWidget.cpp:2358
void mnuTabCloseOthers()
closes every tab besides active one (asks for saving tabs, which should be closed) ...
Definition: scriptDockWidget.cpp:2179
RetVal restoreScriptState(const QList< ito::ScriptEditorStorage > &states)
return all outlines in the tabs of this script dock widget
Definition: scriptDockWidget.cpp:711
bool activateTabByFilename(const QString &filename, int currentDebugLine=-1, int UID=-1)
activates tab with script whose filename corresponds to the filename parameter (or the UID...
Definition: scriptDockWidget.cpp:2001
void undockScriptTab(ScriptDockWidget *widget, int index, bool undockToNewScriptWindow=false, bool closeDockIfEmpty=false)
void mnuCopy()
slot invoked to execute a copy command in active script editor
Definition: scriptDockWidget.cpp:2286
ScriptEditorWidget * removeEditor(int index)
removes ScriptEditorWidget at given tab position from tab-widget and returns its reference ...
Definition: scriptDockWidget.cpp:1076