diff gui/src/editor/fileeditor.cc @ 14703:f86884be20fc gui

Renamed all source files of the gui to lowercase and .cc to be conform with the octave sources.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Thu, 31 May 2012 20:53:56 +0200
parents gui/src/editor/FileEditor.cpp@ca733a66be7a
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gui/src/editor/fileeditor.cc	Thu May 31 20:53:56 2012 +0200
@@ -0,0 +1,470 @@
+/* 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/>.
+ */
+
+#include "fileeditor.h"
+#include <QVBoxLayout>
+#include <QApplication>
+#include <QFile>
+#include <QFont>
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QStyle>
+#include <QTextStream>
+
+FileEditor::FileEditor (QTerminal *terminal, MainWindow *mainWindow)
+  : FileEditorInterface(terminal, mainWindow)
+{
+  construct ();
+
+  m_terminal = terminal;
+  m_mainWindow = mainWindow;
+  setVisible (false);
+}
+
+FileEditor::~FileEditor ()
+{
+}
+
+LexerOctaveGui *
+FileEditor::lexer ()
+{
+  return m_lexer;
+}
+
+QTerminal *
+FileEditor::terminal ()
+{
+  return m_terminal;
+}
+
+MainWindow *
+FileEditor::mainWindow ()
+{
+  return m_mainWindow;
+}
+
+void
+FileEditor::requestNewFile ()
+{
+  FileEditorTab *fileEditorTab = new FileEditorTab (this);
+  if (fileEditorTab)
+    {
+      addFileEditorTab (fileEditorTab);
+      fileEditorTab->newFile ();
+    }
+}
+
+void
+FileEditor::requestOpenFile ()
+{
+  FileEditorTab *fileEditorTab = new FileEditorTab (this);
+  if (fileEditorTab)
+    {
+      addFileEditorTab (fileEditorTab);
+      if (!fileEditorTab->openFile ())
+        {
+          // If no file was loaded, remove the tab again.
+          m_tabWidget->removeTab (m_tabWidget->indexOf (fileEditorTab));
+        }
+    }
+}
+
+void
+FileEditor::requestOpenFile (QString fileName)
+{
+  if (!isVisible ())
+    {
+      show ();
+    }
+
+  FileEditorTab *fileEditorTab = new FileEditorTab (this);
+  if (fileEditorTab)
+    {
+      addFileEditorTab (fileEditorTab);
+      fileEditorTab->loadFile (fileName);
+    }
+}
+
+void
+FileEditor::requestUndo ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->undo ();
+}
+
+void
+FileEditor::requestRedo ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->redo ();
+}
+
+void
+FileEditor::requestCopy ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->copy ();
+}
+
+void
+FileEditor::requestCut ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->cut ();
+}
+
+void
+FileEditor::requestPaste ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->paste ();
+}
+
+void
+FileEditor::requestSaveFile ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->saveFile ();
+}
+
+void
+FileEditor::requestSaveFileAs ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->saveFileAs ();
+}
+
+void
+FileEditor::requestRunFile ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->runFile ();
+}
+
+void
+FileEditor::requestToggleBookmark ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->toggleBookmark ();
+}
+
+void
+FileEditor::requestNextBookmark ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->nextBookmark ();
+}
+
+void
+FileEditor::requestPreviousBookmark ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->previousBookmark ();
+}
+
+void
+FileEditor::requestRemoveBookmark ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->removeBookmark ();
+}
+
+void
+FileEditor::requestCommentSelectedText ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->commentSelectedText ();
+}
+
+void
+FileEditor::requestUncommentSelectedText ()
+{
+  FileEditorTab *activeFileEditorTab = activeEditorTab ();
+  if (activeFileEditorTab)
+    activeFileEditorTab->uncommentSelectedText ();
+}
+
+void
+FileEditor::handleFileNameChanged (QString fileName)
+{
+  QObject *senderObject = sender ();
+  FileEditorTab *fileEditorTab = dynamic_cast<FileEditorTab*> (senderObject);
+  if (fileEditorTab)
+    {
+      for(int i = 0; i < m_tabWidget->count (); i++)
+        {
+          if (m_tabWidget->widget (i) == fileEditorTab)
+            {
+              m_tabWidget->setTabText (i, fileName);
+            }
+        }
+    }
+}
+
+void
+FileEditor::handleTabCloseRequest (int index)
+{
+  FileEditorTab *fileEditorTab = dynamic_cast <FileEditorTab*> (m_tabWidget->widget (index));
+  if (fileEditorTab)
+    if (fileEditorTab->close ())
+      {
+        m_tabWidget->removeTab (index);
+        delete fileEditorTab;
+      }
+}
+
+void
+FileEditor::handleTabCloseRequest ()
+{
+  FileEditorTab *fileEditorTab = dynamic_cast <FileEditorTab*> (sender ());
+  if (fileEditorTab)
+    if (fileEditorTab->close ())
+      {
+        m_tabWidget->removeTab (m_tabWidget->indexOf (fileEditorTab));
+        delete fileEditorTab;
+      }
+}
+
+void
+FileEditor::activeTabChanged (int index)
+{
+  Q_UNUSED (index);
+  handleEditorStateChanged ();
+}
+
+void
+FileEditor::handleEditorStateChanged ()
+{
+  FileEditorTab *fileEditorTab = activeEditorTab ();
+  if (fileEditorTab)
+    {
+      bool copyAvailable = fileEditorTab->copyAvailable ();
+      m_copyAction->setEnabled (copyAvailable);
+      m_cutAction->setEnabled (copyAvailable);
+    }
+}
+
+void
+FileEditor::construct ()
+{
+  QWidget *widget = new QWidget (this);
+  QSettings *settings = ResourceManager::instance ()->settings ();
+  QStyle *style = QApplication::style ();
+
+  m_menuBar = new QMenuBar (widget);
+  m_toolBar = new QToolBar (widget);
+  m_tabWidget = new QTabWidget (widget);
+  m_tabWidget->setTabsClosable (true);
+
+  // Theme icons with QStyle icons as fallback
+  QAction *newAction = new QAction (
+        QIcon::fromTheme("document-new",style->standardIcon (QStyle::SP_FileIcon)),
+        tr("&New File"), m_toolBar);
+
+  QAction *openAction = new QAction (
+        QIcon::fromTheme("document-open",style->standardIcon (QStyle::SP_DirOpenIcon)),
+        tr("&Open File"), m_toolBar);
+
+  QAction *saveAction = new QAction (
+        QIcon::fromTheme("document-save",style->standardIcon (QStyle::SP_DriveHDIcon)),
+        tr("&Save File"), m_toolBar);
+
+  QAction *saveAsAction = new QAction (
+        QIcon::fromTheme("document-save-as",style->standardIcon (QStyle::SP_DriveFDIcon)),
+        tr("Save File &As"), m_toolBar);
+
+  QAction *undoAction = new QAction (
+        QIcon::fromTheme("edit-undo",style->standardIcon (QStyle::SP_ArrowLeft)),
+        tr("&Undo"), m_toolBar);
+
+  QAction *redoAction = new QAction (
+        QIcon::fromTheme("edit-redo",style->standardIcon (QStyle::SP_ArrowRight)),
+        tr("&Redo"), m_toolBar);
+
+  m_copyAction = new QAction (QIcon::fromTheme ("edit-copy"), tr ("&Copy"), m_toolBar);
+  m_cutAction = new QAction (QIcon::fromTheme ("edit-cut"), tr ("Cu&t"), m_toolBar);
+
+  QAction *pasteAction              = new QAction (QIcon::fromTheme ("edit-paste"), tr ("&Paste"),m_toolBar);
+  QAction *nextBookmarkAction       = new QAction (tr ("&Next Bookmark"),m_toolBar);
+  QAction *prevBookmarkAction       = new QAction (tr ("Pre&vious Bookmark"),m_toolBar);
+  QAction *toggleBookmarkAction     = new QAction (tr ("Toggle &Bookmark"),m_toolBar);
+  QAction *removeBookmarkAction     = new QAction (tr ("&Remove All Bookmarks"),m_toolBar);
+  QAction *commentSelectedAction    = new QAction (tr ("&Comment Selected Text"),m_toolBar);
+  QAction *uncommentSelectedAction  = new QAction (tr ("&Uncomment Selected Text"),m_toolBar);
+
+  QAction *runAction = new QAction (
+        QIcon::fromTheme ("media-play", style->standardIcon (QStyle::SP_MediaPlay)),
+        tr("&Run File"), m_toolBar);
+
+  // some actions are disabled from the beginning
+  m_copyAction->setEnabled(false);
+  m_cutAction->setEnabled(false);
+
+  // short cuts
+  newAction->setShortcut              (QKeySequence::New);
+  openAction->setShortcut             (QKeySequence::Open);
+  saveAction->setShortcut             (QKeySequence::Save);
+  saveAsAction->setShortcut           (QKeySequence::SaveAs);
+  undoAction->setShortcut             (QKeySequence::Undo);
+  redoAction->setShortcut             (QKeySequence::Redo);
+  m_copyAction->setShortcut           (QKeySequence::Copy);
+  m_cutAction->setShortcut            (QKeySequence::Cut);
+  pasteAction->setShortcut            (QKeySequence::Paste);
+  runAction->setShortcut              (Qt::Key_F5);
+  nextBookmarkAction->setShortcut     (Qt::Key_F2);
+  prevBookmarkAction->setShortcut     (Qt::SHIFT + Qt::Key_F2);
+  toggleBookmarkAction->setShortcut   (Qt::Key_F7);
+  commentSelectedAction->setShortcut  (Qt::CTRL + Qt::Key_R);
+  uncommentSelectedAction->setShortcut(Qt::CTRL + Qt::Key_T);
+
+  // toolbar
+  m_toolBar->addAction (newAction);
+  m_toolBar->addAction (openAction);
+  m_toolBar->addAction (saveAction);
+  m_toolBar->addAction (saveAsAction);
+  m_toolBar->addSeparator ();
+  m_toolBar->addAction (undoAction);
+  m_toolBar->addAction (redoAction);
+  m_toolBar->addAction (m_copyAction);
+  m_toolBar->addAction (m_cutAction);
+  m_toolBar->addAction (pasteAction);
+  m_toolBar->addSeparator ();
+  m_toolBar->addAction (runAction);
+
+  // menu bar
+  QMenu *fileMenu = new QMenu (tr ("&File"), m_menuBar);
+  fileMenu->addAction (newAction);
+  fileMenu->addAction (openAction);
+  fileMenu->addAction (saveAction);
+  fileMenu->addAction (saveAsAction);
+  fileMenu->addSeparator ();
+  m_menuBar->addMenu (fileMenu);
+
+  QMenu *editMenu = new QMenu (tr ("&Edit"), m_menuBar);
+  editMenu->addAction (undoAction);
+  editMenu->addAction (redoAction);
+  editMenu->addSeparator ();
+  editMenu->addAction (m_copyAction);
+  editMenu->addAction (m_cutAction);
+  editMenu->addAction (pasteAction);
+  editMenu->addSeparator ();
+  editMenu->addAction (commentSelectedAction);
+  editMenu->addAction (uncommentSelectedAction);
+  editMenu->addSeparator ();
+  editMenu->addAction (toggleBookmarkAction);
+  editMenu->addAction (nextBookmarkAction);
+  editMenu->addAction (prevBookmarkAction);
+  editMenu->addAction (removeBookmarkAction);
+  m_menuBar->addMenu (editMenu);
+
+  QMenu *runMenu = new QMenu (tr ("&Run"), m_menuBar);
+  runMenu->addAction (runAction);
+  m_menuBar->addMenu (runMenu);
+
+  QVBoxLayout *layout = new QVBoxLayout ();
+  layout->addWidget (m_menuBar);
+  layout->addWidget (m_toolBar);
+  layout->addWidget (m_tabWidget);
+  layout->setMargin (0);
+  widget->setLayout (layout);
+  setWidget (widget);
+
+  connect (newAction,               SIGNAL (triggered ()), this, SLOT (requestNewFile ()));
+  connect (openAction,              SIGNAL (triggered ()), this, SLOT (requestOpenFile ()));
+  connect (undoAction,              SIGNAL (triggered ()), this, SLOT (requestUndo ()));
+  connect (redoAction,              SIGNAL (triggered ()), this, SLOT (requestRedo ()));
+  connect (m_copyAction,            SIGNAL (triggered ()), this, SLOT (requestCopy ()));
+  connect (m_cutAction,             SIGNAL (triggered ()), this, SLOT (requestCut ()));
+  connect (pasteAction,             SIGNAL (triggered ()), this, SLOT (requestPaste ()));
+  connect (saveAction,              SIGNAL (triggered ()), this, SLOT (requestSaveFile ()));
+  connect (saveAsAction,            SIGNAL (triggered ()), this, SLOT (requestSaveFileAs ()));
+  connect (runAction,               SIGNAL (triggered ()), this, SLOT (requestRunFile ()));
+  connect (toggleBookmarkAction,    SIGNAL (triggered ()), this, SLOT (requestToggleBookmark ()));
+  connect (nextBookmarkAction,      SIGNAL (triggered ()), this, SLOT (requestNextBookmark ()));
+  connect (prevBookmarkAction,      SIGNAL (triggered ()), this, SLOT (requestPreviousBookmark ()));
+  connect (removeBookmarkAction,    SIGNAL (triggered ()), this, SLOT (requestRemoveBookmark ()));
+  connect (commentSelectedAction,   SIGNAL (triggered ()), this, SLOT (requestCommentSelectedText ()));
+  connect (uncommentSelectedAction, SIGNAL (triggered ()), this, SLOT (requestUncommentSelectedText ()));
+  connect (m_tabWidget, SIGNAL (tabCloseRequested (int)), this, SLOT (handleTabCloseRequest (int)));
+  connect (m_tabWidget, SIGNAL (currentChanged(int)), this, SLOT (activeTabChanged (int)));
+
+  // this has to be done only once, not for each editor
+  m_lexer = new LexerOctaveGui ();
+
+  // Editor font (default or from settings)
+  m_lexer->setDefaultFont (QFont (
+                             settings->value ("editor/fontName","Courier").toString (),
+                             settings->value ("editor/fontSize",10).toInt ()));
+
+  // TODO: Autoindent not working as it should
+  m_lexer->setAutoIndentStyle (QsciScintilla::AiMaintain ||
+                               QsciScintilla::AiOpening  ||
+                               QsciScintilla::AiClosing);
+
+  // The API info that is used for auto completion
+  // TODO: Where to store a file with API info (raw or prepared?)?
+  // TODO: Also provide infos on octave-forge functions?
+  // TODO: Also provide infos on function parameters?
+  // By now, use the keywords-list from syntax highlighting
+  m_lexerAPI = new QsciAPIs (m_lexer);
+
+  QString keyword;
+  QStringList keywordList;
+  keyword = m_lexer->keywords (1);  // get whole string with all keywords
+  keywordList = keyword.split (QRegExp ("\\s+"));  // split into single strings
+  int i;
+  for (i = 0; i < keywordList.size (); i++)
+    {
+      m_lexerAPI->add (keywordList.at (i));  // add single strings to the API
+    }
+  m_lexerAPI->prepare ();           // prepare API info ... this make take some time
+  resize (500, 400);
+  setWindowIcon (QIcon::fromTheme ("accessories-text-editor", style->standardIcon (QStyle::SP_FileIcon)));
+  setWindowTitle ("Octave Editor");
+}
+
+void
+FileEditor::addFileEditorTab (FileEditorTab *fileEditorTab)
+{
+  m_tabWidget->addTab (fileEditorTab, "");
+  connect (fileEditorTab, SIGNAL (fileNameChanged(QString)),
+           this, SLOT(handleFileNameChanged(QString)));
+  connect (fileEditorTab, SIGNAL (editorStateChanged ()),
+           this, SLOT (handleEditorStateChanged ()));
+  connect (fileEditorTab, SIGNAL (closeRequest ()),
+           this, SLOT (handleTabCloseRequest ()));
+  m_tabWidget->setCurrentWidget (fileEditorTab);
+}
+
+FileEditorTab *
+FileEditor::activeEditorTab ()
+{
+  return dynamic_cast<FileEditorTab*> (m_tabWidget->currentWidget ());
+}