00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef MAINWINDOW_H
00022 #define MAINWINDOW_H
00023
00024 #include <QMainWindow>
00025 #include <QString>
00026 #include <QMessageBox>
00027 #include <QItemSelection>
00028 #include <QTableView>
00029 #include <QSplitter>
00030 #include <QTextEdit>
00031 #include <QMultiMap>
00032 #include <QTabWidget>
00033 #include <QCloseEvent>
00034 #include <QFuture>
00035 #include <QFutureWatcher>
00036 #include <QToolButton>
00037 #include <QToolBar>
00038 #include <QCompleter>
00039 #include <QSortFilterProxyModel>
00040 #include <QSignalMapper>
00041
00042 #include "AeslEditor.h"
00043 #include "CustomDelegate.h"
00044 #include "CustomWidgets.h"
00045 #include "ModelAggregator.h"
00046
00047 #include "../compiler/compiler.h"
00048 #include <fstream>
00049 #include <sstream>
00050 #include <vector>
00051 #include <string>
00052 #include "Target.h"
00053 #include "TargetModels.h"
00054 #include "Plugin.h"
00055 #include "HelpViewer.h"
00056 #include "ConfigDialog.h"
00057
00058 class QLabel;
00059 class QSpinBox;
00060 class QGroupBox;
00061 class QPushButton;
00062 class QListWidget;
00063 class QListWidgetItem;
00064 class QTreeView;
00065 class QTranslator;
00066
00067 class QToolBox;
00068 class QCheckBox;
00069
00070 namespace Aseba
00071 {
00074
00075 class TargetVariablesModel;
00076 class TargetFunctionsModel;
00077 class TargetMemoryModel;
00078 class MaskableNamedValuesVectorModel;
00079 class NamedValuesVectorModel;
00080 class AeslEditor;
00081 class AeslLineNumberSidebar;
00082 class AeslBreakpointSidebar;
00083 class AeslHighlighter;
00084 class EventViewer;
00085 class EditorsPlotsTabWidget;
00086 class DraggableListWidget;
00087 class FindDialog;
00088 class MainWindow;
00089
00090 class CompilationLogDialog: public QTextEdit
00091 {
00092 Q_OBJECT
00093
00094 public:
00095 CompilationLogDialog(QWidget *parent = 0);
00096 signals:
00097 void hidden();
00098 protected:
00099 virtual void hideEvent ( QHideEvent * event );
00100 };
00101
00102 class EditorsPlotsTabWidget: public QTabWidget
00103 {
00104 Q_OBJECT
00105
00106 public:
00107 EditorsPlotsTabWidget();
00108 virtual ~EditorsPlotsTabWidget();
00109 void addTab(QWidget* widget, const QString& label, bool closable = false);
00110 void highlightTab(int index, QColor color = Qt::red);
00111 void setExecutionMode(int index, Target::ExecutionMode state);
00112
00113 public slots:
00114 void removeAndDeleteTab(int index = -1);
00115
00116 protected slots:
00117 void vmMemoryResized(int, int, int);
00118 void tabChanged(int index);
00119
00120 protected:
00121 virtual void resetHighlight(int index);
00122 virtual void vmMemoryViewResize(NodeTab* tab);
00123 virtual void readSettings();
00124 virtual void writeSettings();
00125
00126 int vmMemorySize[2];
00127 };
00128
00129 class ScriptTab
00130 {
00131 public:
00132 typedef NodeToolInterface::SavedContent SavedContent;
00133 typedef QList<SavedContent> SavedPlugins;
00134
00135 ScriptTab(const unsigned id):id(id) {}
00136 virtual ~ScriptTab() {}
00137
00138 unsigned nodeId() const { return id; }
00139 virtual SavedPlugins savePlugins() const = 0;
00140
00141 protected:
00142 void createEditor();
00143
00144 unsigned id;
00145
00146 friend class MainWindow;
00147 AeslEditor* editor;
00148 AeslLineNumberSidebar* linenumbers;
00149 AeslBreakpointSidebar* breakpoints;
00150 AeslHighlighter *highlighter;
00151 };
00152
00153 class AbsentNodeTab : public QWidget, public ScriptTab
00154 {
00155 Q_OBJECT
00156
00157 public:
00158 AbsentNodeTab(const unsigned id, const QString& name, const QString& sourceCode, const SavedPlugins& savedPlugins);
00159
00160 virtual SavedPlugins savePlugins() const { return savedPlugins; }
00161
00162 const QString name;
00163 SavedPlugins savedPlugins;
00164 };
00165
00166 class NodeTab : public QSplitter, public ScriptTab, public VariableListener
00167 {
00168 Q_OBJECT
00169
00170 public:
00171 struct CompilationResult
00172 {
00173 bool dump;
00174 bool success;
00175 BytecodeVector bytecode;
00176 unsigned allocatedVariablesCount;
00177 Compiler::VariablesMap variablesMap;
00178 Error error;
00179 std::wostringstream compilationMessages;
00180
00181 CompilationResult(bool dump):dump(dump) {}
00182 };
00183
00184
00185 public:
00186 NodeTab(MainWindow* mainWindow, Target *target, const CommonDefinitions *commonDefinitions, int id, QWidget *parent = 0);
00187 ~NodeTab();
00188 unsigned productId() const { return pid; }
00189
00190 void variablesMemoryChanged(unsigned start, const VariablesDataVector &variables);
00191
00192 signals:
00193 void uploadReadynessChanged(bool);
00194
00195 protected:
00196 virtual void timerEvent ( QTimerEvent * event );
00197 virtual void variableValueUpdated(const QString& name, const VariablesDataVector& values);
00198 void setupWidgets();
00199 void setupConnections();
00200 virtual SavedPlugins savePlugins() const;
00201 void restorePlugins(const SavedPlugins& savedPlugins, bool fromFile);
00202 void updateToolList();
00203
00204 public slots:
00205 void clearExecutionErrors();
00206 void refreshCompleterModel(LocalContext context);
00207
00208
00209 protected slots:
00210 void resetClicked();
00211 void loadClicked();
00212 void runInterruptClicked();
00213 void nextClicked();
00214 void refreshMemoryClicked();
00215 void autoRefreshMemoryClicked(int state);
00216
00217 void writeBytecode();
00218 void reboot();
00219 void saveBytecode();
00220
00221 void setVariableValues(unsigned, const VariablesDataVector &);
00222 void insertVariableName(const QModelIndex &);
00223
00224 void editorContentChanged();
00225 void recompile();
00226 void markTargetUnsynced();
00227
00228
00229 void keywordClicked(QString);
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239 void showKeywords(bool show);
00240
00241 void showMemoryUsage(bool show);
00242
00243 void displayCode(QList<QString> code, int line);
00244
00245 void cursorMoved();
00246 void goToError();
00247
00248 void setBreakpoint(unsigned line);
00249 void clearBreakpoint(unsigned line);
00250 void breakpointClearedAll();
00251
00252 void executionPosChanged(unsigned line);
00253 void executionModeChanged(Target::ExecutionMode mode);
00254
00255 void breakpointSetResult(unsigned line, bool success);
00256
00257 void closePlugins();
00258
00259 void updateHidden();
00260
00261 void compilationCompleted();
00262
00263 protected:
00264 void processCompilationResult(CompilationResult* result);
00265 void rehighlight();
00266 void reSetBreakpoints();
00267
00268
00269 bool setEditorProperty(const QString &property, const QVariant &value, unsigned line, bool removeOld = false);
00270 bool clearEditorProperty(const QString &property, unsigned line);
00271 bool clearEditorProperty(const QString &property);
00272 void switchEditorProperty(const QString &oldProperty, const QString &newProperty);
00273
00274 protected:
00275 friend class MainWindow;
00276 friend class AeslEditor;
00277 friend class EditorsPlotsTabWidget;
00278
00279 unsigned pid;
00280 friend class InvasivePlugin;
00281 Target *target;
00282 const CommonDefinitions *commonDefinitions;
00283
00284 MainWindow* mainWindow;
00285 QLabel *cursorPosText;
00286 QLabel *compilationResultImage;
00287 QLabel *compilationResultText;
00288 QLabel *memoryUsageText;
00289
00290 QLabel *executionModeLabel;
00291 QPushButton *loadButton;
00292 QPushButton *resetButton;
00293 QPushButton *runInterruptButton;
00294 QPushButton *nextButton;
00295 QPushButton *refreshMemoryButton;
00296 QCheckBox *autoRefreshMemoryCheck;
00297
00298
00299
00300 QToolButton *varButton;
00301 QToolButton *ifButton;
00302 QToolButton *elseifButton;
00303 QToolButton *elseButton;
00304 QToolButton *oneventButton;
00305 QToolButton *whileButton;
00306 QToolButton *forButton;
00307 QToolButton *subroutineButton;
00308 QToolButton *callsubButton;
00309 QToolBar *keywordsToolbar;
00310 QSignalMapper *signalMapper;
00311
00312 TargetVariablesModel *vmMemoryModel;
00313 QTreeView *vmMemoryView;
00314 QLineEdit *vmMemoryFilter;
00315
00316 TargetFunctionsModel *vmFunctionsModel;
00317 QTreeView *vmFunctionsView;
00318
00319 DraggableListWidget* vmLocalEvents;
00320
00321 QCompleter *completer;
00322 QAbstractItemModel* eventAggregator;
00323 QAbstractItemModel* variableAggregator;
00324 QSortFilterProxyModel* sortingProxy;
00325 TreeChainsawFilter* functionsFlatModel;
00326
00327 QToolBox* toolBox;
00328 QVBoxLayout* toolListLayout;
00329 int toolListIndex;
00330 NodeToolInterfaces tools;
00331
00332 int refreshTimer;
00333
00334 bool rehighlighting;
00335 int errorPos;
00336 int currentPC;
00337 Target::ExecutionMode previousMode;
00338 bool firstCompilation;
00339 bool showHidden;
00340
00341 QFuture<CompilationResult*> compilationFuture;
00342 QFutureWatcher<CompilationResult*> compilationWatcher;
00343 bool compilationDirty;
00344 bool isSynchronized;
00345
00346 BytecodeVector bytecode;
00347 unsigned allocatedVariablesCount;
00348 };
00349
00350 class NewNamedValueDialog : public QDialog
00351 {
00352 Q_OBJECT
00353
00354 public:
00355 NewNamedValueDialog(QString* name, int* value, int min, int max);
00356 static bool getNamedValue(QString* name, int* value, int min, int max, QString title, QString valueName, QString valueDescription);
00357
00358 protected slots:
00359 void okSlot();
00360 void cancelSlot();
00361
00362 protected:
00363 QLabel* label1;
00364 QLineEdit* line1;
00365 QLabel* label2;
00366 QSpinBox* line2;
00367
00368 QString* name;
00369 int* value;
00370 };
00371
00372 class MainWindow : public QMainWindow
00373 {
00374 Q_OBJECT
00375
00376 public:
00377 MainWindow(QVector<QTranslator*> translators, const QString& commandLineTarget, bool autoRefresh, QWidget *parent = 0);
00378 ~MainWindow();
00379
00380 signals:
00381 void MainWindowClosed();
00382
00383 private slots:
00384 void about();
00385 bool newFile();
00386 void openFile(const QString &path = QString());
00387 void openRecentFile();
00388 bool save();
00389 bool saveFile(const QString &previousFileName = QString());
00390 void exportMemoriesContent();
00391 void importMemoriesContent();
00392 void copyAll();
00393 void findTriggered();
00394 void replaceTriggered();
00395 void commentTriggered();
00396 void uncommentTriggered();
00397 void showLineNumbersChanged(bool state);
00398 void goToLine();
00399 void showSettings();
00400 void showHidden(bool show);
00401 void showKeywords(bool show);
00402
00403 void toggleBreakpoint();
00404 void clearAllBreakpoints();
00405
00406 void loadAll();
00407 void resetAll();
00408 void runAll();
00409 void pauseAll();
00410 void stopAll();
00411
00412 void clearAllExecutionError();
00413
00414 void uploadReadynessChanged();
00415 void tabChanged(int);
00416 void sendEvent();
00417 void sendEventIf(const QModelIndex &);
00418 void toggleEventVisibleButton(const QModelIndex &);
00419 void plotEvent();
00420 void eventContextMenuRequested(const QPoint & pos);
00421 void plotEvent(const unsigned eventId);
00422 void logEntryDoubleClicked(QListWidgetItem *);
00423 void showCompilationMessages(bool doShown);
00424 void compilationMessagesWasHidden();
00425 void showMemoryUsage(bool show);
00426
00427 void addEventNameClicked();
00428 void removeEventNameClicked();
00429 void eventsUpdated(bool indexChanged = false);
00430 void eventsUpdatedDirty();
00431 void eventsDescriptionsSelectionChanged();
00432
00433 void resetStatusText();
00434
00435 void addConstantClicked();
00436 void removeConstantClicked();
00437 void constantsSelectionChanged();
00438
00439 void nodeConnected(unsigned node);
00440 void nodeDisconnected(unsigned node);
00441 void networkDisconnected();
00442
00443 void userEventsDropped(unsigned amount);
00444 void userEvent(unsigned id, const VariablesDataVector &data);
00445 void arrayAccessOutOfBounds(unsigned node, unsigned line, unsigned size, unsigned index);
00446 void divisionByZero(unsigned node, unsigned line);
00447 void eventExecutionKilled(unsigned node, unsigned line);
00448 void nodeSpecificError(unsigned node, unsigned line, const QString& message);
00449
00450 void executionPosChanged(unsigned node, unsigned line);
00451 void executionModeChanged(unsigned node, Target::ExecutionMode mode);
00452 void variablesMemoryEstimatedDirty(unsigned node);
00453
00454 void variablesMemoryChanged(unsigned node, unsigned start, const VariablesDataVector &variables);
00455
00456 void breakpointSetResult(unsigned node, unsigned line, bool success);
00457
00458 void recompileAll();
00459 void writeAllBytecodes();
00460 void rebootAllNodes();
00461
00462 void sourceChanged();
00463 void updateWindowTitle();
00464
00465 void showUserManual();
00466
00467 void openToUrlFromAction() const;
00468
00469 public slots:
00470 void applySettings();
00471
00472 private:
00473 virtual void timerEvent ( QTimerEvent * event );
00474
00475
00476 int getIndexFromId(unsigned node) const;
00477 NodeTab* getTabFromId(unsigned node) const;
00478 NodeTab* getTabFromName(const QString& name, unsigned preferedId = 0) const;
00479 int getAbsentIndexFromId(unsigned node) const;
00480 AbsentNodeTab* getAbsentTabFromId(unsigned node) const;
00481 void addErrorEvent(unsigned node, unsigned line, const QString& message);
00482 void clearDocumentSpecificTabs();
00483 bool askUserBeforeDiscarding();
00484
00485
00486 void regenerateOpenRecentMenu();
00487 void updateRecentFiles(const QString& fileName);
00488 void regenerateToolsMenus();
00489 void generateHelpMenu();
00490 void regenerateHelpMenu();
00491 void setupWidgets();
00492 void setupConnections();
00493 void setupMenu();
00494 void closeEvent ( QCloseEvent * event );
00495 bool readSettings();
00496 void writeSettings();
00497
00498
00499 friend class NodeTab;
00500 friend class AeslEditor;
00501 friend class InvasivePlugin;
00502 EditorsPlotsTabWidget* nodes;
00503 ScriptTab* currentScriptTab;
00504 int getDescriptionTimer;
00505
00506 #ifdef HAVE_QWT
00507
00508
00509 friend class EventViewer;
00510 typedef QMultiMap<unsigned, EventViewer*> EventViewers;
00511 EventViewers eventsViewers;
00512
00513 #endif // HAVE_QWT
00514
00515
00516 QPushButton* addEventNameButton;
00517 QPushButton* removeEventNameButton;
00518 QPushButton* sendEventButton;
00519 #ifdef HAVE_QWT
00520 QPushButton* plotEventButton;
00521 #endif // HAVE_QWT
00522 QListWidget* logger;
00523 QPushButton* clearLogger;
00524 QLabel* statusText;
00525 FixedWidthTableView* eventsDescriptionsView;
00526
00527
00528 QPushButton* addConstantButton;
00529 QPushButton* removeConstantButton;
00530 FixedWidthTableView* constantsView;
00531
00532
00533 MaskableNamedValuesVectorModel* eventsDescriptionsModel;
00534 NamedValuesVectorModel* constantsDefinitionsModel;
00535
00536
00537 QAction* loadAllAct;
00538 QAction* resetAllAct;
00539 QAction* runAllAct;
00540 QAction* pauseAllAct;
00541 QToolBar* globalToolBar;
00542
00543
00544 QMenu *openRecentMenu;
00545
00546
00547 QMenu *writeBytecodeMenu;
00548 QAction *writeAllBytecodesAct;
00549 QMenu *rebootMenu;
00550 QMenu *saveBytecodeMenu;
00551 QMenu *helpMenu;
00552 typedef QList<QAction*> ActionList;
00553 QAction* helpMenuTargetSpecificSeparator;
00554 ActionList targetSpecificHelp;
00555
00556
00557 QAction *cutAct;
00558 QAction *copyAct;
00559 QAction *pasteAct;
00560 QAction *undoAct;
00561 QAction *redoAct;
00562 QAction *findAct;
00563 QAction *replaceAct;
00564 QAction *commentAct;
00565 QAction *uncommentAct;
00566 QAction *showLineNumbers;
00567 QAction *goToLineAct;
00568 QAction *toggleBreakpointAct;
00569 QAction *clearAllBreakpointsAct;
00570 QAction *showHiddenAct;
00571 QAction *showKeywordsAct;
00572 QAction* showCompilationMsg;
00573 QAction* showMemoryUsageAct;
00574
00575
00576 CompilationLogDialog *compilationMessageBox;
00577 FindDialog* findDialog;
00578 QString actualFileName;
00579 bool sourceModified;
00580 bool autoMemoryRefresh;
00581 HelpViewer helpViewer;
00582
00583
00584 CommonDefinitions commonDefinitions;
00585 Target *target;
00586 };
00587
00589 };
00590
00591 #endif
00592