1 /*
2     SPDX-FileCopyrightText: 2010 Miha Čančula <miha.cancula@gmail.com>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #ifndef OCTAVESESSION_H
8 #define OCTAVESESSION_H
9 
10 #include <session.h>
11 #include <QQueue>
12 #include <QTextStream>
13 #include <QRegularExpression>
14 #include <QPointer>
15 
16 namespace Cantor {
17 class DefaultVariableModel;
18 }
19 
20 class KDirWatch;
21 class OctaveExpression;
22 class KProcess;
23 
24 
25 class OctaveSession : public Cantor::Session
26 {
27     Q_OBJECT
28     public:
29         explicit OctaveSession(Cantor::Backend* backend);
30         ~OctaveSession() override;
31         void interrupt() override;
32         Cantor::Expression* evaluateExpression(const QString& command, Cantor::Expression::FinishingBehavior finishingBehavior = Cantor::Expression::FinishingBehavior::DoNotDelete, bool internal = false) override;
33         void logout() override;
34         void login() override;
35         Cantor::CompletionObject* completionFor(const QString& cmd, int index=-1) override;
36         Cantor::SyntaxHelpObject* syntaxHelpFor(const QString& cmd) override;
37         QSyntaxHighlighter* syntaxHighlighter(QObject* parent) override;
38         void runFirstExpression() override;
39         void setWorksheetPath(const QString& path) override;
40 
41         bool isIntegratedPlotsEnabled() const;
42         QString plotFilePrefixPath() const;
43 
44     private:
45         const static QRegularExpression PROMPT_UNCHANGEABLE_COMMAND;
46 
47     private:
48         KProcess* m_process;
49         QTextStream m_stream;
50         QRegularExpression m_prompt;
51         QRegularExpression m_subprompt;
52         int m_previousPromptNumber;
53 
54         bool m_syntaxError;
55 
56         QString m_output;
57         QString m_plotFilePrefixPath;
58         QString m_worksheetPath;
59         bool m_isIntegratedPlotsEnabled; // Better move it in worksheet, like isCompletion, etc.
60         bool m_isIntegratedPlotsSettingsEnabled;
61 
62     private:
63         void readFromOctave(QByteArray data);
64         bool isDoNothingCommand(const QString& command);
65         bool isSpecialOctaveCommand(const QString& command);
66         void updateGraphicPackagesFromSettings();
67         QString graphicPackageErrorMessage(QString packageId) const override;
68 
69     private Q_SLOTS:
70         void readOutput();
71         void readError();
72         void currentExpressionStatusChanged(Cantor::Expression::Status status);
73         void processError();
74         void runSpecificCommands();
75 };
76 
77 #endif // OCTAVESESSION_H
78