view gui/src/MainWindow.h @ 13504:13e3d60aff2d

Replaced Quint with OctaveGUI.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Sun, 17 Jul 2011 20:27:03 +0200
parents 86d6c3b90ad7
children c70511cf64ee
line wrap: on
line source

/* OctaveGUI - A graphical user interface for Octave
 * Copyright (C) 2011 Jacob Dawid
 * jacob.dawid@googlemail.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QThread>
#include <QTabWidget>
#include <QMdiArea>
#include <QStatusBar>
#include <QToolBar>
#include <QQueue>
#include "OctaveTerminal.h"
#include "OctaveLink.h"
#include "VariablesDockWidget.h"
#include "HistoryDockWidget.h"
#include "FilesDockWidget.h"
#include "BrowserWidget.h"
#include "IRCWidget.h"

// Octave includes
#undef PACKAGE_BUGREPORT
#undef PACKAGE_NAME
#undef PACKAGE_STRING
#undef PACKAGE_TARNAME
#undef PACKAGE_VERSION
#undef PACKAGE_URL
#include "octave/config.h"

#include "octave/debug.h"
#include "octave/octave.h"
#include "octave/symtab.h"
#include "octave/parse.h"
#include "octave/unwind-prot.h"
#include "octave/toplev.h"
#include "octave/load-path.h"
#include "octave/error.h"
#include "octave/quit.h"
#include "octave/variables.h"
#include "octave/sighandlers.h"
#include "octave/sysdep.h"
#include "octave/str-vec.h"
#include "octave/cmd-hist.h"
#include "octave/cmd-edit.h"
#include "octave/oct-env.h"
#include "octave/symtab.h"
#include "cmd-edit.h"

typedef struct yy_buffer_state *YY_BUFFER_STATE;
extern OCTINTERP_API YY_BUFFER_STATE create_buffer (FILE *f);
extern OCTINTERP_API void switch_to_buffer (YY_BUFFER_STATE buf);
extern OCTINTERP_API FILE *get_input_from_stdin (void);

// System
#include <termios.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>
#include <vector>
#include "pty.h"

class OctaveMainThread;
class OctaveCallbackThread;

/**
  * \class MainWindow
  *
  * Represents the main window.
  */
class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

    bool isRunning() { return m_isRunning; }
    OctaveTerminal *octaveTerminal() { return m_octaveTerminal; }
    VariablesDockWidget *variablesDockWidget() { return m_variablesDockWidget; }
    HistoryDockWidget *historyDockWidget() { return m_historyDockWidget; }
    FilesDockWidget *filesDockWidget() { return m_filesDockWidget; }

public slots:
    void handleOpenFileRequest(QString fileName);
    void reportStatusMessage(QString statusMessage);
    void openWebPage(QString url);
    void handleSaveWorkspaceRequest();
    void handleLoadWorkspaceRequest();
    void handleClearWorkspaceRequest();
    void handleCommandDoubleClicked(QString command);
    void alignMdiWindows();
    void openBugTrackerPage();
    void processSettingsDialogRequest();

protected:
    void closeEvent(QCloseEvent *closeEvent);
    void readSettings();
    void writeSettings();

private:
    void construct();
    void establishOctaveLink();
    QMdiArea *m_centralMdiArea;

    // Mdi sub windows.
    OctaveTerminal *m_octaveTerminal;
    BrowserWidget *m_documentationWidget;
    IRCWidget *m_ircWidget;

    QMdiSubWindow *m_octaveTerminalSubWindow;
    QMdiSubWindow *m_documentationWidgetSubWindow;
    QMdiSubWindow *m_ircWidgetSubWindow;

    // Dock widgets.
    VariablesDockWidget *m_variablesDockWidget;
    HistoryDockWidget *m_historyDockWidget;
    FilesDockWidget *m_filesDockWidget;

    // Toolbars.
    QStatusBar *m_statusBar;

    QString m_settingsFile;

    // Threads for running octave and managing the data interaction.
    OctaveMainThread *m_octaveMainThread;
    OctaveCallbackThread *m_octaveCallbackThread;
    bool m_isRunning;
};

class OctaveMainThread : public QThread {
    Q_OBJECT
public:
    OctaveMainThread(QObject *parent)
        : QThread(parent) {
    }
protected:
    void run() {
        int argc = 3;
        const char* argv[] = {"octave", "--interactive", "--line-editing"};
        octave_main(argc, (char**)argv, 1);
        main_loop();
        clean_up_and_exit(0);
    }
};

class OctaveCallbackThread : public QThread {
    Q_OBJECT
public:
    OctaveCallbackThread(QObject *parent, MainWindow *mainWindow)
        : QThread(parent),
          m_mainWindow(mainWindow) {
    }

protected:
    void run() {
        while(m_mainWindow->isRunning()) {

        // Get a full variable list.
        QList<SymbolRecord> symbolTable = OctaveLink::instance()->currentSymbolTable();
        if(symbolTable.size()) {
            m_mainWindow->variablesDockWidget()->setVariablesList(symbolTable);
        }

        // Collect history list.
        string_vector historyList = OctaveLink::instance()->currentHistory();
        if(historyList.length()) {
            m_mainWindow->historyDockWidget()->updateHistory(historyList);
        }

            usleep(100000);
        }
    }
private:
    MainWindow *m_mainWindow;
};

#endif // MAINWINDOW_H