Mercurial > hg > octave-lojdl
changeset 14499:f6eb8337d077 gui
periodic merge of default to gui
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 27 Mar 2012 16:15:51 -0400 |
parents | 86847bd1ccf0 (diff) 36cfbd23fe9f (current diff) |
children | f6b4236da9f8 |
files | |
diffstat | 66 files changed, 10953 insertions(+), 45 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgsub +++ b/.hgsub @@ -1,1 +1,3 @@ gnulib = [git]git://git.sv.gnu.org/gnulib +gui/qterminal = [git]https://code.google.com/p/qterminal/ +gui/qirc = [git]https://code.google.com/p/qirc
--- a/.hgsubstate +++ b/.hgsubstate @@ -1,1 +1,3 @@ f9813bce2c06a6130a68db4478d1b16ddadaf276 gnulib +34c2a274a1b607d2616d9903099a0905237c8f80 gui/qirc +75e8afc065a08cbf8400dcb3386c5dc030cf8719 gui/qterminal
--- a/NEWS +++ b/NEWS @@ -1,3 +1,8 @@ +Summary of important user-visible changes for version 4.0: +--------------------------------------------------------- + + ** A new GUI is now available with Octave. + Summary of important user-visible changes for version 3.8: ---------------------------------------------------------
--- a/configure.ac +++ b/configure.ac @@ -730,6 +730,520 @@ FFT_DIR="fftpack" AC_SUBST(FFT_DIR) +dnl @synopsis BNV_HAVE_QT [--with-Qt-dir=DIR] [--with-Qt-lib-dir=DIR] [--with-Qt-lib=LIB] +dnl @synopsis BNV_HAVE_QT [--with-Qt-include-dir=DIR] [--with-Qt-bin-dir=DIR] [--with-Qt-lib-dir=DIR] [--with-Qt-lib=LIB] +dnl +dnl @summary Search for Trolltech's Qt GUI framework. +dnl +dnl Searches common directories for Qt include files, libraries and Qt +dnl binary utilities. The macro supports several different versions of +dnl the Qt framework being installed on the same machine. Without +dnl options, the macro is designed to look for the latest library, +dnl i.e., the highest definition of QT_VERSION in qglobal.h. By use of +dnl one or more options a different library may be selected. There are +dnl two different sets of options. Both sets contain the option +dnl --with-Qt-lib=LIB which can be used to force the use of a +dnl particular version of the library file when more than one are +dnl available. LIB must be in the form as it would appear behind the +dnl "-l" option to the compiler. Examples for LIB would be "qt-mt" for +dnl the multi-threaded version and "qt" for the regular version. In +dnl addition to this, the first set consists of an option +dnl --with-Qt-dir=DIR which can be used when the installation conforms +dnl to Trolltech's standard installation, which means that header files +dnl are in DIR/include, binary utilities are in DIR/bin and the library +dnl is in DIR/lib. The second set of options can be used to indicate +dnl individual locations for the header files, the binary utilities and +dnl the library file, in addition to the specific version of the +dnl library file. +dnl +dnl The following shell variable is set to either "yes" or "no": +dnl +dnl have_qt +dnl +dnl Additionally, the following variables are exported: +dnl +dnl QT_CXXFLAGS +dnl QT_LIBS +dnl QT_MOC +dnl QT_UIC +dnl QT_DIR +dnl +dnl which respectively contain an "-I" flag pointing to the Qt include +dnl directory (and "-DQT_THREAD_SUPPORT" when LIB is "qt-mt"), link +dnl flags necessary to link with Qt and X, the name of the meta object +dnl compiler and the user interface compiler both with full path, and +dnl finaly the variable QTDIR as Trolltech likes to see it defined (if +dnl possible). +dnl +dnl Example lines for Makefile.in: +dnl +dnl CXXFLAGS = @QT_CXXFLAGS@ +dnl MOC = @QT_MOC@ +dnl +dnl After the variables have been set, a trial compile and link is +dnl performed to check the correct functioning of the meta object +dnl compiler. This test may fail when the different detected elements +dnl stem from different releases of the Qt framework. In that case, an +dnl error message is emitted and configure stops. +dnl +dnl No common variables such as $LIBS or $CFLAGS are polluted. +dnl +dnl Options: +dnl +dnl --with-Qt-dir=DIR: DIR is equal to $QTDIR if you have followed the +dnl installation instructions of Trolltech. Header files are in +dnl DIR/include, binary utilities are in DIR/bin and the library is in +dnl DIR/lib. +dnl +dnl --with-Qt-include-dir=DIR: Qt header files are in DIR. +dnl +dnl --with-Qt-bin-dir=DIR: Qt utilities such as moc and uic are in DIR. +dnl +dnl --with-Qt-lib-dir=DIR: The Qt library is in DIR. +dnl +dnl --with-Qt-lib=LIB: Use -lLIB to link with the Qt library. +dnl +dnl If some option "=no" or, equivalently, a --without-Qt-* version is +dnl given in stead of a --with-Qt-*, "have_qt" is set to "no" and the +dnl other variables are set to the empty string. +dnl +dnl @category InstalledPackages +dnl @author Bastiaan Veelo <Bastiaan@Veelo.net> +dnl @version 2006-03-12 +dnl @license AllPermissive + +dnl Copyright (C) 2001, 2002, 2003, 2005, 2006 Bastiaan Veelo + +dnl THANKS! This code includes bug fixes and contributions made by: +dnl Tim McClarren, +dnl Dennis R. Weilert, +dnl Qingning Huo, +dnl Brian Mingus, +dnl Jens Hannemann, +dnl Pavel Roskin, +dnl Scott J. Bertin. + +dnl ChangeLog +dnl 2006-03-12 * Hide output of ls and fix an m4 quoting problem (due to Scott J. Bertin). +dnl 2006-02-13 * Check compiler return value instead of parsing the error stream, +dnl which detected warnings as false negatives (due to Jens Hannemann). +dnl 2006-02-02 * Spelling of "Success". +dnl * Fixed unsave test for $bnv_qt_lib without quotes. +dnl * Put dnl in front of all comments. +dnl * Changed -l$bnv_qt_lib_dir into -L$bnv_qt_lib_dir (all due to Pavel Roskin). +dnl 2006-01-19 * Support for 64bit architectures. +dnl * Updated documentation. +dnl 2006-01-18: * Fix "cat: bnv_qt_test.c: No such file or directory" (due to Jens Hannemann). +dnl * Hide output of failing ls. +dnl 2006-01-11: * Check in /Developer on Mac OS X; Check in $QTDIR (due to Brian Mingus). + +dnl Calls BNV_PATH_QT_DIRECT (contained in this file) as a subroutine. +AC_DEFUN([BNV_HAVE_QT], +[ + AC_REQUIRE([AC_PROG_CXX]) + AC_REQUIRE([AC_PATH_X]) + AC_REQUIRE([AC_PATH_XTRA]) + + AC_MSG_CHECKING(for Qt) + + AC_ARG_WITH([Qt-dir], + [ --with-Qt-dir=DIR DIR is equal to $QTDIR if you have followed the + installation instructions of Trolltech. Header + files are in DIR/include, binary utilities are + in DIR/bin. The library is in DIR/lib, unless + --with-Qt-lib-dir is also set.]) + AC_ARG_WITH([Qt-include-dir], + [ --with-Qt-include-dir=DIR + Qt header files are in DIR]) + AC_ARG_WITH([Qt-bin-dir], + [ --with-Qt-bin-dir=DIR Qt utilities such as moc and uic are in DIR]) + AC_ARG_WITH([Qt-lib-dir], + [ --with-Qt-lib-dir=DIR The Qt library is in DIR]) + AC_ARG_WITH([Qt-lib], + [ --with-Qt-lib=LIB Use -lLIB to link with the Qt library]) + if test x"$with_Qt_dir" = x"no" || + test x"$with_Qt_include-dir" = x"no" || + test x"$with_Qt_bin_dir" = x"no" || + test x"$with_Qt_lib_dir" = x"no" || + test x"$with_Qt_lib" = x"no"; then + # user disabled Qt. Leave cache alone. + have_qt="User disabled Qt." + else + # "yes" is a bogus option + if test x"$with_Qt_dir" = xyes; then + with_Qt_dir= + fi + if test x"$with_Qt_include_dir" = xyes; then + with_Qt_include_dir= + fi + if test x"$with_Qt_bin_dir" = xyes; then + with_Qt_bin_dir= + fi + if test x"$with_Qt_lib_dir" = xyes; then + with_Qt_lib_dir= + fi + if test x"$with_Qt_lib" = xyes; then + with_Qt_lib= + fi + # No Qt unless we discover otherwise + have_qt=no + # Check whether we are requested to link with a specific version + if test x"$with_Qt_lib" != x; then + bnv_qt_lib="$with_Qt_lib" + fi + # Check whether we were supplied with an answer already + if test x"$with_Qt_dir" != x; then + have_qt=yes + bnv_qt_dir="$with_Qt_dir" + bnv_qt_include_dir="$with_Qt_dir/include" + bnv_qt_bin_dir="$with_Qt_dir/bin" + bnv_qt_lib_dir="$with_Qt_dir/lib" + # Only search for the lib if the user did not define one already + if test x"$bnv_qt_lib" = x; then + bnv_qt_lib="`ls $bnv_qt_lib_dir/libqt* | sed -n 1p | + sed s@$bnv_qt_lib_dir/lib@@ | [sed s@[.].*@@]`" + fi + bnv_qt_LIBS="-L$bnv_qt_lib_dir -l$bnv_qt_lib $X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu -lXt -lXi $X_EXTRA_LIBS" + else + # Use cached value or do search, starting with suggestions from + # the command line + AC_CACHE_VAL(bnv_cv_have_qt, + [ + # We are not given a solution and there is no cached value. + bnv_qt_dir=NO + bnv_qt_include_dir=NO + bnv_qt_lib_dir=NO + if test x"$bnv_qt_lib" = x; then + bnv_qt_lib=NO + fi + BNV_PATH_QT_DIRECT + if test "$bnv_qt_dir" = NO || + test "$bnv_qt_include_dir" = NO || + test "$bnv_qt_lib_dir" = NO || + test "$bnv_qt_lib" = NO; then + # Problem with finding complete Qt. Cache the known absence of Qt. + bnv_cv_have_qt="have_qt=no" + else + # Record where we found Qt for the cache. + bnv_cv_have_qt="have_qt=yes \ + bnv_qt_dir=$bnv_qt_dir \ + bnv_qt_include_dir=$bnv_qt_include_dir \ + bnv_qt_bin_dir=$bnv_qt_bin_dir \ + bnv_qt_LIBS=\"$bnv_qt_LIBS\"" + fi + ])dnl + eval "$bnv_cv_have_qt" + fi # all $bnv_qt_* are set + fi # $have_qt reflects the system status + if test x"$have_qt" = xyes; then + QT_CXXFLAGS="-I$bnv_qt_include_dir" + if test x"$bnv_qt_lib" = xqt-mt; then + QT_CXXFLAGS="$QT_CXXFLAGS -DQT_THREAD_SUPPORT" + fi + QT_DIR="$bnv_qt_dir" + QT_LIBS="$bnv_qt_LIBS" + # If bnv_qt_dir is defined, utilities are expected to be in the + # bin subdirectory + if test x"$bnv_qt_dir" != x; then + if test -x "$bnv_qt_dir/bin/uic"; then + QT_UIC="$bnv_qt_dir/bin/uic" + else + # Old versions of Qt don't have uic + QT_UIC= + fi + QT_MOC="$bnv_qt_dir/bin/moc" + else + # Or maybe we are told where to look for the utilities + if test x"$bnv_qt_bin_dir" != x; then + if test -x "$bnv_qt_bin_dir/uic"; then + QT_UIC="$bnv_qt_bin_dir/uic" + else + # Old versions of Qt don't have uic + QT_UIC= + fi + QT_MOC="$bnv_qt_bin_dir/moc" + else + # Last possibility is that they are in $PATH + QT_UIC="`which uic`" + QT_MOC="`which moc`" + fi + fi + # All variables are defined, report the result + AC_MSG_RESULT([$have_qt: + QT_CXXFLAGS=$QT_CXXFLAGS + QT_DIR=$QT_DIR + QT_LIBS=$QT_LIBS + QT_UIC=$QT_UIC + QT_MOC=$QT_MOC]) + else + # Qt was not found + QT_CXXFLAGS= + QT_DIR= + QT_LIBS= + QT_UIC= + QT_MOC= + AC_MSG_RESULT($have_qt) + fi + AC_SUBST(QT_CXXFLAGS) + AC_SUBST(QT_DIR) + AC_SUBST(QT_LIBS) + AC_SUBST(QT_UIC) + AC_SUBST(QT_MOC) + + #### Being paranoid: + if test x"$have_qt" = xyes; then + AC_MSG_CHECKING(correct functioning of Qt installation) + AC_CACHE_VAL(bnv_cv_qt_test_result, + [ + cat > bnv_qt_test.h << EOF +#include <qobject.h> +class Test : public QObject +{ +Q_OBJECT +public: + Test() {} + ~Test() {} +public slots: + void receive() {} +signals: + void send(); +}; +EOF + + cat > bnv_qt_main.$ac_ext << EOF +#include "bnv_qt_test.h" +#include <qapplication.h> +int main( int argc, char **argv ) +{ + QApplication app( argc, argv ); + Test t; + QObject::connect( &t, SIGNAL(send()), &t, SLOT(receive()) ); +} +EOF + + bnv_cv_qt_test_result="failure" + bnv_try_1="$QT_MOC bnv_qt_test.h -o moc_bnv_qt_test.$ac_ext >/dev/null 2>/dev/null" + AC_TRY_EVAL(bnv_try_1) + if test x"$ac_status" != x0; then + echo "$bnv_err_1" >&AC_FD_CC + echo "configure: could not run $QT_MOC on:" >&AC_FD_CC + cat bnv_qt_test.h >&AC_FD_CC + else + bnv_try_2="$CXX $QT_CXXFLAGS -c $CXXFLAGS -o moc_bnv_qt_test.o moc_bnv_qt_test.$ac_ext >/dev/null 2>/dev/null" + AC_TRY_EVAL(bnv_try_2) + if test x"$ac_status" != x0; then + echo "$bnv_err_2" >&AC_FD_CC + echo "configure: could not compile:" >&AC_FD_CC + cat moc_bnv_qt_test.$ac_ext >&AC_FD_CC + else + bnv_try_3="$CXX $QT_CXXFLAGS -c $CXXFLAGS -o bnv_qt_main.o bnv_qt_main.$ac_ext >/dev/null 2>/dev/null" + AC_TRY_EVAL(bnv_try_3) + if test x"$ac_status" != x0; then + echo "$bnv_err_3" >&AC_FD_CC + echo "configure: could not compile:" >&AC_FD_CC + cat bnv_qt_main.$ac_ext >&AC_FD_CC + else + bnv_try_4="$CXX $QT_LIBS $LIBS -o bnv_qt_main bnv_qt_main.o moc_bnv_qt_test.o >/dev/null 2>/dev/null" + AC_TRY_EVAL(bnv_try_4) + if test x"$ac_status" != x0; then + echo "$bnv_err_4" >&AC_FD_CC + else + bnv_cv_qt_test_result="success" + fi + fi + fi + fi + ])dnl AC_CACHE_VAL bnv_cv_qt_test_result + AC_MSG_RESULT([$bnv_cv_qt_test_result]); + if test x"$bnv_cv_qt_test_result" = "xfailure"; then + AC_MSG_ERROR([Failed to find matching components of a complete + Qt installation. Try using more options, + see ./configure --help.]) + fi + + rm -f bnv_qt_test.h moc_bnv_qt_test.$ac_ext moc_bnv_qt_test.o \ + bnv_qt_main.$ac_ext bnv_qt_main.o bnv_qt_main + fi +]) + +dnl Internal subroutine of BNV_HAVE_QT +dnl Set bnv_qt_dir bnv_qt_include_dir bnv_qt_bin_dir bnv_qt_lib_dir bnv_qt_lib +AC_DEFUN([BNV_PATH_QT_DIRECT], +[ + ## Binary utilities ## + if test x"$with_Qt_bin_dir" != x; then + bnv_qt_bin_dir=$with_Qt_bin_dir + fi + ## Look for header files ## + if test x"$with_Qt_include_dir" != x; then + bnv_qt_include_dir="$with_Qt_include_dir" + else + # The following header file is expected to define QT_VERSION. + qt_direct_test_header=qglobal.h + # Look for the header file in a standard set of common directories. + bnv_include_path_list=" + /usr/include + `ls -dr ${QTDIR}/include 2>/dev/null` + `ls -dr /usr/include/qt* 2>/dev/null` + `ls -dr /usr/lib/qt*/include 2>/dev/null` + `ls -dr /usr/local/qt*/include 2>/dev/null` + `ls -dr /opt/qt*/include 2>/dev/null` + `ls -dr /Developer/qt*/include 2>/dev/null` + " + for bnv_dir in $bnv_include_path_list; do + if test -r "$bnv_dir/$qt_direct_test_header"; then + bnv_dirs="$bnv_dirs $bnv_dir" + fi + done + # Now look for the newest in this list + bnv_prev_ver=0 + for bnv_dir in $bnv_dirs; do + bnv_this_ver=`egrep -w '#define QT_VERSION' $bnv_dir/$qt_direct_test_header | sed s/'#define QT_VERSION'//` + if expr $bnv_this_ver '>' $bnv_prev_ver > /dev/null; then + bnv_qt_include_dir=$bnv_dir + bnv_prev_ver=$bnv_this_ver + fi + done + fi dnl Found header files. + + # Are these headers located in a traditional Trolltech installation? + # That would be $bnv_qt_include_dir stripped from its last element: + bnv_possible_qt_dir=`dirname $bnv_qt_include_dir` + if (test -x $bnv_possible_qt_dir/bin/moc) && + ((ls $bnv_possible_qt_dir/lib/libqt* > /dev/null 2>/dev/null) || + (ls $bnv_possible_qt_dir/lib64/libqt* > /dev/null 2>/dev/null)); then + # Then the rest is a piece of cake + bnv_qt_dir=$bnv_possible_qt_dir + bnv_qt_bin_dir="$bnv_qt_dir/bin" + if test x"$with_Qt_lib_dir" != x; then + bnv_qt_lib_dir="$with_Qt_lib_dir" + else + if (test -d $bnv_qt_dir/lib64); then + bnv_qt_lib_dir="$bnv_qt_dir/lib64" + else + bnv_qt_lib_dir="$bnv_qt_dir/lib" + fi + fi + # Only look for lib if the user did not supply it already + if test x"$bnv_qt_lib" = xNO; then + bnv_qt_lib="`ls $bnv_qt_lib_dir/libqt* | sed -n 1p | + sed s@$bnv_qt_lib_dir/lib@@ | [sed s@[.].*@@]`" + fi + bnv_qt_LIBS="-L$bnv_qt_lib_dir -l$bnv_qt_lib $X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu -lXt -lXi $X_EXTRA_LIBS" + else + # There is no valid definition for $QTDIR as Trolltech likes to see it + bnv_qt_dir= + ## Look for Qt library ## + if test x"$with_Qt_lib_dir" != x; then + bnv_qt_lib_dir="$with_Qt_lib_dir" + # Only look for lib if the user did not supply it already + if test x"$bnv_qt_lib" = xNO; then + bnv_qt_lib="`ls $bnv_qt_lib_dir/libqt* | sed -n 1p | + sed s@$bnv_qt_lib_dir/lib@@ | [sed s@[.].*@@]`" + fi + bnv_qt_LIBS="-L$bnv_qt_lib_dir -l$bnv_qt_lib $X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu -lXt -lXi $X_EXTRA_LIBS" + else + # Normally, when there is no traditional Trolltech installation, + # the library is installed in a place where the linker finds it + # automatically. + # If the user did not define the library name, try with qt + if test x"$bnv_qt_lib" = xNO; then + bnv_qt_lib=qt + fi + qt_direct_test_header=qapplication.h + qt_direct_test_main=" + int argc; + char ** argv; + QApplication app(argc,argv); + " + # See if we find the library without any special options. + # Don't add top $LIBS permanently yet + bnv_save_LIBS="$LIBS" + LIBS="-l$bnv_qt_lib $X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu -lXt -lXi $X_EXTRA_LIBS" + bnv_qt_LIBS="$LIBS" + bnv_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="-I$bnv_qt_include_dir" + AC_TRY_LINK([#include <$qt_direct_test_header>], + $qt_direct_test_main, + [ + # Success. + # We can link with no special library directory. + bnv_qt_lib_dir= + ], [ + # That did not work. Try the multi-threaded version + echo "Non-critical error, please neglect the above." >&AC_FD_CC + bnv_qt_lib=qt-mt + LIBS="-l$bnv_qt_lib $X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu -lXt -lXi $X_EXTRA_LIBS" + AC_TRY_LINK([#include <$qt_direct_test_header>], + $qt_direct_test_main, + [ + # Success. + # We can link with no special library directory. + bnv_qt_lib_dir= + ], [ + # That did not work. Try the OpenGL version + echo "Non-critical error, please neglect the above." >&AC_FD_CC + bnv_qt_lib=qt-gl + LIBS="-l$bnv_qt_lib $X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu -lXt -lXi $X_EXTRA_LIBS" + AC_TRY_LINK([#include <$qt_direct_test_header>], + $qt_direct_test_main, + [ + # Success. + # We can link with no special library directory. + bnv_qt_lib_dir= + ], [ + # That did not work. Maybe a library version I don't know about? + echo "Non-critical error, please neglect the above." >&AC_FD_CC + # Look for some Qt lib in a standard set of common directories. + bnv_dir_list=" + `echo $bnv_qt_includes | sed ss/includess` + /lib + /usr/lib64 + /usr/lib + /usr/local/lib64 + /usr/local/lib + /opt/lib64 + /opt/lib + `ls -dr /usr/lib64/qt* 2>/dev/null` + `ls -dr /usr/lib64/qt*/lib64 2>/dev/null` + `ls -dr /usr/lib/qt* 2>/dev/null` + `ls -dr /usr/local/qt* 2>/dev/null` + `ls -dr /opt/qt* 2>/dev/null` + " + for bnv_dir in $bnv_dir_list; do + if ls $bnv_dir/libqt* >/dev/null 2>/dev/null; then + # Gamble that it's the first one... + bnv_qt_lib="`ls $bnv_dir/libqt* | sed -n 1p | + sed s@$bnv_dir/lib@@ | sed s/[[.]].*//`" + bnv_qt_lib_dir="$bnv_dir" + break + fi + done + # Try with that one + LIBS="-l$bnv_qt_lib $X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu -lXt -lXi $X_EXTRA_LIBS" + AC_TRY_LINK([#include <$qt_direct_test_header>], + $qt_direct_test_main, + [ + # Success. + # We can link with no special library directory. + bnv_qt_lib_dir= + ], [ + # Leave bnv_qt_lib_dir defined + ]) + ]) + ]) + ]) + if test x"$bnv_qt_lib_dir" != x; then + bnv_qt_LIBS="-L$bnv_qt_lib_dir $LIBS" + else + bnv_qt_LIBS="$LIBS" + fi + LIBS="$bnv_save_LIBS" + CXXFLAGS="$bnv_save_CXXFLAGS" + fi dnl $with_Qt_lib_dir was not given + fi dnl Done setting up for non-traditional Trolltech installation +]) + # Checks for FFTW header and library. OCTAVE_CHECK_LIBRARY(fftw3, FFTW3,
--- a/doc/interpreter/contributors.in +++ b/doc/interpreter/contributors.in @@ -290,3 +290,6 @@ Michael Zeising Federico Zenith Alex Zvoleff +Valentin Ortega-Clavero +Jacob Dawid +JĂșlio Hoffimann
new file mode 100644 --- /dev/null +++ b/gui/gui.pro @@ -0,0 +1,2 @@ +TEMPLATE = subdirs +SUBDIRS = qterminal qirc src
new file mode 100644 --- /dev/null +++ b/gui/kb-layouts/default.keytab @@ -0,0 +1,133 @@ +# [README.default.Keytab] Buildin Keyboard Table +# +# To customize your keyboard, copy this file to something +# ending with .keytab and change it to meet you needs. +# Please read the README.KeyTab and the README.keyboard +# in this case. +# +# -------------------------------------------------------------- + +keyboard "Default (XFree 4)" + +# -------------------------------------------------------------- +# +# Note that this particular table is a "risc" version made to +# ease customization without bothering with obsolete details. +# See VT100.keytab for the more hairy stuff. +# +# -------------------------------------------------------------- + +# common keys + +key Escape : "\E" + +key Tab -Shift : "\t" +key Tab +Shift+Ansi : "\E[Z" +key Tab +Shift-Ansi : "\t" +key Backtab +Ansi : "\E[Z" +key Backtab -Ansi : "\t" + +key Return-Shift-NewLine : "\r" +key Return-Shift+NewLine : "\r\n" + +key Return+Shift : "\EOM" + +# Backspace and Delete codes are preserving CTRL-H. + +key Backspace : "\x7f" + +# Arrow keys in VT52 mode +# shift up/down are reserved for scrolling. +# shift left/right are reserved for switching between tabs (this is hardcoded). + +key Up -Shift-Ansi : "\EA" +key Down -Shift-Ansi : "\EB" +key Right-Shift-Ansi : "\EC" +key Left -Shift-Ansi : "\ED" + +# Arrow keys in ANSI mode with Application - and Normal Cursor Mode) + +key Up -Shift-AnyMod+Ansi+AppCuKeys : "\EOA" +key Down -Shift-AnyMod+Ansi+AppCuKeys : "\EOB" +key Right -Shift-AnyMod+Ansi+AppCuKeys : "\EOC" +key Left -Shift-AnyMod+Ansi+AppCuKeys : "\EOD" + +key Up -Shift-AnyMod+Ansi-AppCuKeys : "\E[A" +key Down -Shift-AnyMod+Ansi-AppCuKeys : "\E[B" +key Right -Shift-AnyMod+Ansi-AppCuKeys : "\E[C" +key Left -Shift-AnyMod+Ansi-AppCuKeys : "\E[D" + +key Up -Shift+AnyMod+Ansi : "\E[1;*A" +key Down -Shift+AnyMod+Ansi : "\E[1;*B" +key Right -Shift+AnyMod+Ansi : "\E[1;*C" +key Left -Shift+AnyMod+Ansi : "\E[1;*D" + +# other grey PC keys + +key Enter+NewLine : "\r\n" +key Enter-NewLine : "\r" + +key Home -AnyMod -AppCuKeys : "\E[H" +key End -AnyMod -AppCuKeys : "\E[F" +key Home -AnyMod +AppCuKeys : "\EOH" +key End -AnyMod +AppCuKeys : "\EOF" +key Home +AnyMod : "\E[1;*H" +key End +AnyMod : "\E[1;*F" + +key Insert -AnyMod : "\E[2~" +key Delete -AnyMod : "\E[3~" +key Insert +AnyMod : "\E[2;*~" +key Delete +AnyMod : "\E[3;*~" + +key Prior -Shift-AnyMod : "\E[5~" +key Next -Shift-AnyMod : "\E[6~" +key Prior -Shift+AnyMod : "\E[5;*~" +key Next -Shift+AnyMod : "\E[6;*~" + +# Function keys +key F1 -AnyMod : "\EOP" +key F2 -AnyMod : "\EOQ" +key F3 -AnyMod : "\EOR" +key F4 -AnyMod : "\EOS" +key F5 -AnyMod : "\E[15~" +key F6 -AnyMod : "\E[17~" +key F7 -AnyMod : "\E[18~" +key F8 -AnyMod : "\E[19~" +key F9 -AnyMod : "\E[20~" +key F10 -AnyMod : "\E[21~" +key F11 -AnyMod : "\E[23~" +key F12 -AnyMod : "\E[24~" + +key F1 +AnyMod : "\EO*P" +key F2 +AnyMod : "\EO*Q" +key F3 +AnyMod : "\EO*R" +key F4 +AnyMod : "\EO*S" +key F5 +AnyMod : "\E[15;*~" +key F6 +AnyMod : "\E[17;*~" +key F7 +AnyMod : "\E[18;*~" +key F8 +AnyMod : "\E[19;*~" +key F9 +AnyMod : "\E[20;*~" +key F10 +AnyMod : "\E[21;*~" +key F11 +AnyMod : "\E[23;*~" +key F12 +AnyMod : "\E[24;*~" + +# Work around dead keys + +key Space +Control : "\x00" + +# Some keys are used by konsole to cause operations. +# The scroll* operations refer to the history buffer. + +key Up +Shift-AppScreen : scrollLineUp +key Prior +Shift-AppScreen : scrollPageUp +key Down +Shift-AppScreen : scrollLineDown +key Next +Shift-AppScreen : scrollPageDown + +#key Up +Shift : scrollLineUp +#key Prior +Shift : scrollPageUp +#key Down +Shift : scrollLineDown +#key Next +Shift : scrollPageDown + +key ScrollLock : scrollLock + +# keypad characters are not offered differently by Qt.
new file mode 100644 --- /dev/null +++ b/gui/kb-layouts/linux.keytab @@ -0,0 +1,133 @@ +# [linux.keytab] Konsole Keyboard Table (Linux console keys) +# +# -------------------------------------------------------------- + +# NOT TESTED, MAY NEED SOME CLEANUPS +keyboard "Linux console" + +# -------------------------------------------------------------- +# +# This configuration table allows to customize the +# meaning of the keys. +# +# The syntax is that each entry has the form : +# +# "key" Keyname { ("+"|"-") Modename } ":" (String|Operation) +# +# Keynames are those defined in <qnamespace.h> with the +# "Qt::Key_" removed. (We'd better insert the list here) +# +# Mode names are : +# +# - Shift +# - Alt +# - Control +# +# The VT100 emulation has two modes that can affect the +# sequences emitted by certain keys. These modes are +# under control of the client program. +# +# - Newline : effects Return and Enter key. +# - Application : effects Up and Down key. +# +# - Ansi : effects Up and Down key (This is for VT52, really). +# +# Operations are +# +# - scrollUpLine +# - scrollUpPage +# - scrollDownLine +# - scrollDownPage +# +# - emitSelection +# +# If the key is not found here, the text of the +# key event as provided by QT is emitted, possibly +# preceeded by ESC if the Alt key is pressed. +# +# -------------------------------------------------------------- + +key Escape : "\E" +key Tab : "\t" + +# VT100 can add an extra \n after return. +# The NewLine mode is set by an escape sequence. + +key Return-NewLine : "\r" +key Return+NewLine : "\r\n" + +# Some desperately try to save the ^H. + +key Backspace : "\x7f" +key Delete : "\E[3~" + +# These codes are for the VT52 mode of VT100 +# The Ansi mode (i.e. VT100 mode) is set by +# an escape sequence + +key Up -Shift-Ansi : "\EA" +key Down -Shift-Ansi : "\EB" +key Right-Shift-Ansi : "\EC" +key Left -Shift-Ansi : "\ED" + +# VT100 emits a mode bit together +# with the arrow keys.The AppCuKeys +# mode is set by an escape sequence. + +key Up -Shift+Ansi+AppCuKeys : "\EOA" +key Down -Shift+Ansi+AppCuKeys : "\EOB" +key Right-Shift+Ansi+AppCuKeys : "\EOC" +key Left -Shift+Ansi+AppCuKeys : "\EOD" + +key Up -Shift+Ansi-AppCuKeys : "\E[A" +key Down -Shift+Ansi-AppCuKeys : "\E[B" +key Right-Shift+Ansi-AppCuKeys : "\E[C" +key Left -Shift+Ansi-AppCuKeys : "\E[D" + +# linux functions keys F1-F5 differ from xterm + +key F1 : "\E[[A" +key F2 : "\E[[B" +key F3 : "\E[[C" +key F4 : "\E[[D" +key F5 : "\E[[E" + +key F6 : "\E[17~" +key F7 : "\E[18~" +key F8 : "\E[19~" +key F9 : "\E[20~" +key F10 : "\E[21~" +key F11 : "\E[23~" +key F12 : "\E[24~" + +key Home : "\E[1~" +key End : "\E[4~" + +key Prior -Shift : "\E[5~" +key Next -Shift : "\E[6~" +key Insert-Shift : "\E[2~" + +# Keypad-Enter. See comment on Return above. + +key Enter+NewLine : "\r\n" +key Enter-NewLine : "\r" + +key Space +Control : "\x00" + +# some of keys are used by konsole. + +key Up +Shift : scrollLineUp +key Prior +Shift : scrollPageUp +key Down +Shift : scrollLineDown +key Next +Shift : scrollPageDown + +key ScrollLock : scrollLock + +#---------------------------------------------------------- + +# keypad characters as offered by Qt +# cannot be recognized as such. + +#---------------------------------------------------------- + +# Following other strings as emitted by konsole.
new file mode 100644 --- /dev/null +++ b/gui/kb-layouts/vt420pc.keytab @@ -0,0 +1,163 @@ +# [vt420pc.keytab] Konsole Keyboard Table (VT420pc keys) +# adapted by ferdinand gassauer f.gassauer@aon.at +# Nov 2000 +# +################################################################ +# +# The escape sequences emmited by the +# keys Shift+F1 to Shift+F12 might not fit your needs +# +################# IMPORTANT NOTICE ############################# +# the key bindings (Kcontrol -> look and feel -> keybindgs) +# overrule the settings in this file. The key bindings might be +# changed by the user WITHOUT notification of the maintainer of +# the keytab file. Konsole will not work as expected by +# the maintainer of the keytab file. +################################################################ +# +# -------------------------------------------------------------- + +keyboard "DEC VT420 Terminal" + +# -------------------------------------------------------------- +# +# This configuration table allows to customize the +# meaning of the keys. +# +# The syntax is that each entry has the form : +# +# "key" Keyname { ("+"|"-") Modename } ":" (String|Operation) +# +# Keynames are those defined in <qnamespace.h> with the +# "Qt::Key_" removed. (We'd better insert the list here) +# +# Mode names are : +# +# - Shift +# - Alt +# - Control +# +# The VT100 emulation has two modes that can affect the +# sequences emitted by certain keys. These modes are +# under control of the client program. +# +# - Newline : effects Return and Enter key. +# - Application : effects Up and Down key. +# +# - Ansi : effects Up and Down key (This is for VT52, really). +# +# Operations are +# +# - scrollUpLine +# - scrollUpPage +# - scrollDownLine +# - scrollDownPage +# +# - emitSelection +# +# If the key is not found here, the text of the +# key event as provided by QT is emitted, possibly +# preceeded by ESC if the Alt key is pressed. +# +# -------------------------------------------------------------- + +key Escape : "\E" +key Tab : "\t" +key Backtab: "\E[Z" + +# VT100 can add an extra \n after return. +# The NewLine mode is set by an escape sequence. + +key Return-NewLine : "\r" +key Return+NewLine : "\r\n" + +# Some desperately try to save the ^H. +# may be not everyone wants this + +key Backspace : "\x08" # Control H +key Delete : "\x7f" + +# These codes are for the VT420pc +# The Ansi mode (i.e. VT100 mode) is set by +# an escape sequence + +key Up -Shift-Ansi : "\EA" +key Down -Shift-Ansi : "\EB" +key Right-Shift-Ansi : "\EC" +key Left -Shift-Ansi : "\ED" + +# VT100 emits a mode bit together +# with the arrow keys.The AppCuKeys +# mode is set by an escape sequence. + +key Up -Shift+Ansi+AppCuKeys : "\EOA" +key Down -Shift+Ansi+AppCuKeys : "\EOB" +key Right-Shift+Ansi+AppCuKeys : "\EOC" +key Left -Shift+Ansi+AppCuKeys : "\EOD" + +key Up -Shift+Ansi-AppCuKeys : "\E[A" +key Down -Shift+Ansi-AppCuKeys : "\E[B" +key Right-Shift+Ansi-AppCuKeys : "\E[C" +key Left -Shift+Ansi-AppCuKeys : "\E[D" + +# function keys + +key F1 -Shift : "\E[11~" +key F2 -Shift : "\E[12~" +key F3 -Shift : "\E[13~" +key F4 -Shift : "\E[14~" +key F5 -Shift : "\E[15~" +key F6 -Shift : "\E[17~" +key F7 -Shift : "\E[18~" +key F8 -Shift : "\E[19~" +key F9 -Shift : "\E[20~" +key F10-Shift : "\E[21~" +key F11-Shift : "\E[23~" +key F12-Shift : "\E[24~" +# +# Shift F1-F12 +# +key F1 +Shift : "\E[11;2~" +key F2 +Shift : "\E[12;2~" +key F3 +Shift : "\E[13;2~" +key F4 +Shift : "\E[14;2~" +key F5 +Shift : "\E[15;2~" +key F6 +Shift : "\E[17;2~" +key F7 +Shift : "\E[18;2~" +key F8 +Shift : "\E[19;2~" +key F9 +Shift : "\E[20;2~" +key F10+Shift : "\E[21;2~" +key F11+Shift : "\E[23;2~" +key F12+Shift : "\E[24;2~" + +key Home : "\E[H" +key End : "\E[F" + +key Prior -Shift : "\E[5~" +key Next -Shift : "\E[6~" +key Insert-Shift : "\E[2~" + +# Keypad-Enter. See comment on Return above. + +key Enter+NewLine : "\r\n" +key Enter-NewLine : "\r" + +key Space +Control : "\x00" + +# some of keys are used by konsole. + +key Up +Shift : scrollLineUp +key Prior +Shift : scrollPageUp +key Down +Shift : scrollLineDown +key Next +Shift : scrollPageDown + +key ScrollLock : scrollLock + +#---------------------------------------------------------- + +# keypad characters as offered by Qt +# cannot be recognized as such. + +#---------------------------------------------------------- + +# Following other strings as emitted by konsole.
new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a701c3df75595c1b14d890e84c3577aa8d342474 GIT binary patch literal 10151 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 R^zr)TNO51mA8KoA{tHnat`-0Q
new file mode 100644 --- /dev/null +++ b/gui/languages/de-de.ts @@ -0,0 +1,642 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="de_DE"> +<context> + <name>FileEditorMdiSubWindow</name> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="114"/> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="207"/> + <source>File Editor</source> + <translation>Dateieditor</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="115"/> + <source>Cannot read file %1: +%2.</source> + <translation>Konnte Datei %1 nicht lesen: +%2.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="127"/> + <source>File loaded.</source> + <translation>Datei geladen.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="153"/> + <source>Do you want to save the current file +%1 ?</source> + <translation>Möchten Sie die Datei %1 sichern ?</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="208"/> + <source>Cannot write file %1: +%2.</source> + <translation>Konnte Datei %1 nicht schreiben: +%2.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="220"/> + <source>File %1 saved</source> + <translation>Datei %1 gesichert</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="383"/> + <source>&Close File</source> + <translation>&Datei schlieĂen</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="386"/> + <source>&New File</source> + <translation>&Neue Datei</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="389"/> + <source>&Open File</source> + <translation>&Ăffne Datei</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="392"/> + <source>&Save File</source> + <translation>&Sichere Datei</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="395"/> + <source>Save File &As</source> + <translation>Sichere Datei &als</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="398"/> + <source>&Undo</source> + <translation>&RĂŒckgĂ€ngig</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="401"/> + <source>&Redo</source> + <translation>&Wiederholen</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="402"/> + <source>&Copy</source> + <translation>&Kopieren</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="403"/> + <source>Cu&t</source> + <translation>&Ausschneiden</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="404"/> + <source>&Paste</source> + <translation>&EinfĂŒgen</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="405"/> + <source>&Next Bookmark</source> + <translation>&NĂ€chstes Bookmark</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="406"/> + <source>Pre&vious Bookmark</source> + <translation>&Voriges Bookmark</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="407"/> + <source>Toggle &Bookmark</source> + <translation>&Bookmark setzen</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="410"/> + <source>&Run File</source> + <translation>&AusfĂŒhren</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="449"/> + <source>&File</source> + <translation>&Datei</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="457"/> + <source>&Edit</source> + <translation>&Editieren</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="469"/> + <source>&Run</source> + <translation>&AusfĂŒhren</translation> + </message> +</context> +<context> + <name>FilesDockWidget</name> + <message> + <source>Current Folder</source> + <translation type="obsolete">Aktuelles Verzeichnis</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="32"/> + <source>Current Directory</source> + <translation>Aktuelles Verzeichnis</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="46"/> + <source>Move up one directory.</source> + <translation>Ein Verzeichnis höher wechseln.</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="49"/> + <source>Enter the path or filename.</source> + <translation>Geben Sie einen Pfad oder Dateinamen ein.</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="78"/> + <source>Doubleclick a file to open it.</source> + <translation>FĂŒhren Sie einen Doppelklick aus, um eine Datei zu öffnen.</translation> + </message> +</context> +<context> + <name>HistoryDockWidget</name> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="36"/> + <source>Doubleclick a command to transfer it to the terminal.</source> + <translation>FĂŒhren Sie einen Doppelklick aus, um den Befehl in das Terminal zu ĂŒbertragen.</translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="38"/> + <source>Enter text to filter the command history.</source> + <translation>Geben Sie Text ein, um die Befehlshistorie zu filtern.</translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="41"/> + <source>Command History</source> + <translation>Befehlshistorie</translation> + </message> + <message> + <source>History updated.</source> + <translation type="obsolete">Befehlshistorie aktualisiert.</translation> + </message> +</context> +<context> + <name>LexerOctaveGui</name> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="111"/> + <source>Default</source> + <translation>Standard</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="113"/> + <source>Comment</source> + <translation>Kommentar</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="115"/> + <source>Command</source> + <translation>Befehl</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="117"/> + <source>Number</source> + <translation>Zahl</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="119"/> + <source>Keyword</source> + <translation>SchlĂŒsselwort</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="121"/> + <source>Single-quoted string</source> + <translation>Zeichenkette in einfachen Hochkommata</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="123"/> + <source>Operator</source> + <translation>Operator</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="125"/> + <source>Identifier</source> + <translation>Bezeichner</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="127"/> + <source>Double-quoted string</source> + <translation>Zeichenkette in doppelten Hochkommata</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.cpp" line="47"/> + <source>Opening file.</source> + <translation>Ăffne Datei.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="124"/> + <source>Save Workspace</source> + <translation>Speichere Arbeitsumgebung</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="134"/> + <source>Load Workspace</source> + <translation>Lade Arbeitsumgebung</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="226"/> + <location filename="../src/MainWindow.cpp" line="362"/> + <source>About Octave</source> + <translation>Ăber Octave</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="238"/> + <source>Saving data and shutting down.</source> + <translation>Speichere Daten und schlieĂe.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="276"/> + <source>View the variables in the active workspace.</source> + <translation>Sehen Sie die Variablen ein, die sich in der aktiven Arbeitsumgebung befinden.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="278"/> + <source>Browse and search the command history.</source> + <translation>Durchsuchen Sie die Befehlshistorie.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="280"/> + <source>Browse your files.</source> + <translation>Durchsuchen Sie Ihre Dateien.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="294"/> + <source>Terminal</source> + <translation>Terminal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="298"/> + <source>Enter your commands into the Octave terminal.</source> + <translation>Geben Sie Ihre Befehle in das Octave Terminal ein.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="311"/> + <source>Browse the Octave documentation for help.</source> + <translation>Durchsuchen Sie die Octave Dokumentation, um Hilfe zu erhalten.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="320"/> + <source>Chat</source> + <translation>Chat</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="323"/> + <source>Instantly chat with other Octave users for help.</source> + <translation>Tauschen Sie sich direkt mit anderen Octave Benutzern aus, um Hilfe zu erhalten.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="330"/> + <source>Octave</source> + <translation>Octave</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="331"/> + <source>Settings</source> + <translation>Einstellungen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="333"/> + <source>Exit</source> + <translation>Beenden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="335"/> + <source>Interface</source> + <translation>OberflĂ€che</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="337"/> + <source>Align Windows</source> + <translation>Fenster ausrichten</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="339"/> + <location filename="../src/MainWindow.cpp" line="351"/> + <source>Workspace</source> + <translation>Arbeitsumgebung</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="342"/> + <source>History</source> + <translation>Befehlshistorie</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="345"/> + <source>File Browser</source> + <translation>Dateibrowser</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="349"/> + <source>Open New Editor Window</source> + <translation>Neues Editorfenster öffnen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="352"/> + <source>Load</source> + <translation>Laden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="353"/> + <source>Save</source> + <translation>Sichern</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="355"/> + <source>Clear</source> + <translation>Löschen</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="357"/> + <source>Community</source> + <translation>Gemeinschaft</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="358"/> + <source>Report Bug</source> + <translation>Fehler melden</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="359"/> + <source>Agora</source> + <translation>Agora</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="360"/> + <source>Octave Forge</source> + <translation>Octave Forge</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="363"/> + <source>About Qt</source> + <translation>Ăber Qt</translation> + </message> + <message> + <source>Octave Toolbar</source> + <translation type="obsolete">Octave Werkzeugleiste</translation> + </message> + <message> + <source>Command Window</source> + <translation type="obsolete">Konsolenfenster</translation> + </message> + <message> + <source>File Editor</source> + <translation type="obsolete">Dateieditor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="307"/> + <source>Documentation</source> + <translation>Dokumentation</translation> + </message> + <message> + <source>Service</source> + <translation type="obsolete">Service</translation> + </message> + <message> + <source>Established link to Octave.</source> + <translation type="obsolete">Verbindung zu Octave hergestellt.</translation> + </message> +</context> +<context> + <name>NumberBar</name> + <message> + <source>Stop Here</source> + <translation type="obsolete">Stoppe hier</translation> + </message> + <message> + <source>Current Line</source> + <translation type="obsolete">Aktuelle Zeile</translation> + </message> + <message> + <source>Error Line</source> + <translation type="obsolete">Fehlerzeile</translation> + </message> +</context> +<context> + <name>NumberedCodeEdit</name> + <message> + <source>This file name is not valid.</source> + <translation type="obsolete">Dieser Dateiname ist nicht gĂŒltig.</translation> + </message> + <message> + <source>Octave doesn't understand this file name: +</source> + <translation type="obsolete">Octave versteht diesen Dateityp nicht:</translation> + </message> + <message> + <source> +Please, change it. + Do you want to save your changes?</source> + <translation type="obsolete">Bitte Ă€ndern Sie dies. Möchten Sie Ihre Ănderungen sichern?</translation> + </message> +</context> +<context> + <name>SettingsDialog</name> + <message> + <location filename="../src/SettingsDialog.ui" line="29"/> + <source>Settings</source> + <translation>Einstellungen</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="39"/> + <source>Chat</source> + <translation>Char</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="47"/> + <source>Connect to #octave on startup</source> + <translation>Beim Start mit #octave verbinden</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="57"/> + <source>Show message of the day</source> + <translation>Nachricht des Tages anzeigen (MOTD)</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="64"/> + <source>Show topic</source> + <translation>Thema des Chatkanals anzeigen</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="71"/> + <source>Automatically identify on NickServ</source> + <translation>Automatisch bei NickServ identifizieren</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="78"/> + <source>Warning: Your password will be stored in ~/.octavegui in human-readable format. Do not enter your password if you worry about security issues.</source> + <translation>Warnung: Ihre Passwort wird unter ~/.octave-gui in einem menschenlesbaren Format gesichert. Hinterlegen Sie nicht Ihr Password, wenn Sie Bedenken ĂŒber die Sicherheit haben.</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="103"/> + <location filename="../src/SettingsDialog.ui" line="311"/> + <source>Password:</source> + <translation>Passwort:</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="125"/> + <source>Editor</source> + <translation>Editor</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="133"/> + <source>Use custom file editor:</source> + <translation>Benutzerdefinierten Editor verwenden:</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="143"/> + <source>emacs</source> + <translation>emacs</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="166"/> + <source>File Browser</source> + <translation>Dateibrowser</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="172"/> + <source>Show filenames</source> + <translation>Dateinamen anzeigen</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="179"/> + <source>Show file size</source> + <translation>DateigröĂe anzeigen</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="186"/> + <source>Show file type</source> + <translation>Dateityp anzeigen</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="193"/> + <source>Show date of last modification</source> + <translation>Datum der letzten Ănderung anzeigen</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="200"/> + <source>Show hidden files</source> + <translation>Versteckte Dateien anzeigen</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="207"/> + <source>Alternating row colors</source> + <translation>Alternierende Farben verwenden</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="215"/> + <source>Network</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="221"/> + <source>Use proxy server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="233"/> + <source>Proxy Type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="244"/> + <source>HttpProxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="249"/> + <source>Socks5Proxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="260"/> + <source>Hostname:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="277"/> + <source>Port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="294"/> + <source>Username:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="339"/> + <source>Reset to defaults</source> + <translation>Standardeinstellungen wiederherstellen</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="362"/> + <source>Export</source> + <translation>Exportieren</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="372"/> + <source>Import</source> + <translation>Importieren</translation> + </message> +</context> +<context> + <name>VariablesDockWidget</name> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Name</source> + <translation>Bezeichner</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Type</source> + <translation>Typ</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Value</source> + <translation>Wert</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="36"/> + <source>Workspace</source> + <translation>Arbeitsumgebung</translation> + </message> + <message> + <source>Save</source> + <translation type="obsolete">Sichern</translation> + </message> + <message> + <source>Load</source> + <translation type="obsolete">Laden</translation> + </message> + <message> + <source>Clear</source> + <translation type="obsolete">Löschen</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="52"/> + <source>Local</source> + <translation>Lokal</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="56"/> + <source>Global</source> + <translation>Global</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="60"/> + <source>Persistent</source> + <translation>Persistent</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="64"/> + <source>Hidden</source> + <translation>Versteckt</translation> + </message> +</context> +</TS>
new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7fbf74ee61166c382a369dbfe80f7d2796451295 GIT binary patch literal 9411 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 XrcTSc+nDUbOn;$FZ^RpIvDp6ra)cJ@
new file mode 100644 --- /dev/null +++ b/gui/languages/es-es.ts @@ -0,0 +1,576 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="es_MX"> +<context> + <name>FileEditorMdiSubWindow</name> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="114"/> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="207"/> + <source>File Editor</source> + <translation>Editor de archivos</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="115"/> + <source>Cannot read file %1: +%2.</source> + <translation>No se puede leer archivo %1: +%2.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="127"/> + <source>File loaded.</source> + <translation>Archivo cargado.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="153"/> + <source>Do you want to save the current file +%1 ?</source> + <translation>ÂżDesea guardar archivo actual +%1 ?</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="208"/> + <source>Cannot write file %1: +%2.</source> + <translation>No se puede escribir archivo %1: +%2.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="220"/> + <source>File %1 saved</source> + <translation>Archivo %1 guardado</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="383"/> + <source>&Close File</source> + <translation>&Cerrar archivo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="386"/> + <source>&New File</source> + <translation>Archivo &nuevo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="389"/> + <source>&Open File</source> + <translation>&Abrir archivo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="392"/> + <source>&Save File</source> + <translation>&Guardar archivo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="395"/> + <source>Save File &As</source> + <translatorcomment>Search for proper shortcut for this command</translatorcomment> + <translation>Guardar archivo &como</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="398"/> + <source>&Undo</source> + <translation>&Deshacer</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="401"/> + <source>&Redo</source> + <translation>&Rehacer</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="402"/> + <source>&Copy</source> + <translation>&Copiar</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="403"/> + <source>Cu&t</source> + <translation>Cor&tar</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="404"/> + <source>&Paste</source> + <translation>&Pegar</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="405"/> + <source>&Next Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="406"/> + <source>Pre&vious Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="407"/> + <source>Toggle &Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="410"/> + <source>&Run File</source> + <translation>&Ejecutar archivo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="449"/> + <source>&File</source> + <translation>&Archivo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="457"/> + <source>&Edit</source> + <translation>&Editar</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="469"/> + <source>&Run</source> + <translation>&Ejecutar</translation> + </message> +</context> +<context> + <name>FilesDockWidget</name> + <message> + <source>Current Folder</source> + <translation type="obsolete">Carpeta actual</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="32"/> + <source>Current Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="46"/> + <source>Move up one directory.</source> + <translation>Subir un directorio.</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="49"/> + <source>Enter the path or filename.</source> + <translation>Introduzca direcciĂłn o nombre de archivo.</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="78"/> + <source>Doubleclick a file to open it.</source> + <translation>Haga doble clic para abir archivo.</translation> + </message> +</context> +<context> + <name>HistoryDockWidget</name> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="36"/> + <source>Doubleclick a command to transfer it to the terminal.</source> + <translation>Haga doble clic para transferir el comando a la terminal.</translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="38"/> + <source>Enter text to filter the command history.</source> + <translation>Introduzca texto para filtrar el historial de comandos.</translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="41"/> + <source>Command History</source> + <translation>Historial de comandos</translation> + </message> +</context> +<context> + <name>LexerOctaveGui</name> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="111"/> + <source>Default</source> + <translation>Valores predeterminados</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="113"/> + <source>Comment</source> + <translation>Comentario</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="115"/> + <source>Command</source> + <translation>Comando</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="117"/> + <source>Number</source> + <translation>NĂșmero</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="119"/> + <source>Keyword</source> + <translation>Contraseña</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="121"/> + <source>Single-quoted string</source> + <translation>Cadena entre comillas simples</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="123"/> + <source>Operator</source> + <translation>Operador</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="125"/> + <source>Identifier</source> + <translation>Identificador</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="127"/> + <source>Double-quoted string</source> + <translation>Cadena entre comillas dobles</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.cpp" line="47"/> + <source>Opening file.</source> + <translation>Abriendo archivo.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="124"/> + <source>Save Workspace</source> + <translation>Guardar espacio de trabajo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="134"/> + <source>Load Workspace</source> + <translation>Cargar espacio de trabajo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="226"/> + <location filename="../src/MainWindow.cpp" line="362"/> + <source>About Octave</source> + <translation>Acerca de Octave</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="238"/> + <source>Saving data and shutting down.</source> + <translation>Guardando datos y cerrando el sistema.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="276"/> + <source>View the variables in the active workspace.</source> + <translation>Ver variables en el espacio de trabajo activo.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="278"/> + <source>Browse and search the command history.</source> + <translation>Navegar y buscar en el historial de comandos.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="280"/> + <source>Browse your files.</source> + <translation>Explorar sus archivos.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="294"/> + <source>Terminal</source> + <translation>Terminal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="298"/> + <source>Enter your commands into the Octave terminal.</source> + <translation>Introducir su comando a la terminal de Octave.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="307"/> + <source>Documentation</source> + <translation>DocumentaciĂłn</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="311"/> + <source>Browse the Octave documentation for help.</source> + <translation>Consultar la documentaciĂłn de Octave para obtener ayuda.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="320"/> + <source>Chat</source> + <translation>Chat/conversaciĂłn instantanea</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="323"/> + <source>Instantly chat with other Octave users for help.</source> + <translation>CoversaciĂłn instantanea con otros usuarios de octave para obtener ayuda.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="330"/> + <source>Octave</source> + <translation>Octave</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="331"/> + <source>Settings</source> + <translation>ConfiguraciĂłn</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="333"/> + <source>Exit</source> + <translation>Salir</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="335"/> + <source>Interface</source> + <translation>Interfase</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="337"/> + <source>Align Windows</source> + <translation>Alinear ventanas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="339"/> + <location filename="../src/MainWindow.cpp" line="351"/> + <source>Workspace</source> + <translation>Espacio de trabajo</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="342"/> + <source>History</source> + <translation>Historial</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="345"/> + <source>File Browser</source> + <translation>Explorador de archivos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="349"/> + <source>Open New Editor Window</source> + <translation>Abrir nueva ventana de editor</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="352"/> + <source>Load</source> + <translation>Cargar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="353"/> + <source>Save</source> + <translation>Guardar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="355"/> + <source>Clear</source> + <translation>Limpiar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="357"/> + <source>Community</source> + <translation>Comunidad</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="358"/> + <source>Report Bug</source> + <translation>Reportar error de software/Bug</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="359"/> + <source>Agora</source> + <translation>Ăgora</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="360"/> + <source>Octave Forge</source> + <translation>Octave Forge</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="363"/> + <source>About Qt</source> + <translation>Acerca de Qt</translation> + </message> +</context> +<context> + <name>SettingsDialog</name> + <message> + <location filename="../src/SettingsDialog.ui" line="29"/> + <source>Settings</source> + <translation>ConfiguraciĂłn</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="39"/> + <source>Chat</source> + <translation>Chat/conversaciĂłn instantanea</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="47"/> + <source>Connect to #octave on startup</source> + <translation>Conectar a #octave en el arranque</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="57"/> + <source>Show message of the day</source> + <translation>Mostrar mensaje del dĂa</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="64"/> + <source>Show topic</source> + <translation>Mostrar tema</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="71"/> + <source>Automatically identify on NickServ</source> + <translation>Identificar automĂĄticamente el NickServ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="78"/> + <source>Warning: Your password will be stored in ~/.octavegui in human-readable format. Do not enter your password if you worry about security issues.</source> + <translatorcomment>Advertencia: La contraseña se guarda en ~ / octavegui en formato legible. No introduzca su contraseña en caso de que le preocupen los aspectos de seguridad.</translatorcomment> + <translation></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="103"/> + <location filename="../src/SettingsDialog.ui" line="311"/> + <source>Password:</source> + <translation>Contraseña:</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="125"/> + <source>Editor</source> + <translation>Editor</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="133"/> + <source>Use custom file editor:</source> + <translation>Usar editor de archivos personalizados:</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="143"/> + <source>emacs</source> + <translation>emacs</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="166"/> + <source>File Browser</source> + <translation>Explorador de archivos</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="172"/> + <source>Show filenames</source> + <translation>Mostrar nombres de archivos</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="179"/> + <source>Show file size</source> + <translation>Mostrar tamaño de archivo</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="186"/> + <source>Show file type</source> + <translation>Mostrar tipo de archivo</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="193"/> + <source>Show date of last modification</source> + <translation>Mostrar fecha de la Ășltima modificaciĂłn</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="200"/> + <source>Show hidden files</source> + <translation>Mostrar archivos ocultos</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="207"/> + <source>Alternating row colors</source> + <translation>Colores alternos de filas</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="215"/> + <source>Network</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="221"/> + <source>Use proxy server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="233"/> + <source>Proxy Type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="244"/> + <source>HttpProxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="249"/> + <source>Socks5Proxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="260"/> + <source>Hostname:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="277"/> + <source>Port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="294"/> + <source>Username:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="339"/> + <source>Reset to defaults</source> + <translation>Restaurar los valores predeterminados</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="362"/> + <source>Export</source> + <translation>Exportar</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="372"/> + <source>Import</source> + <translation>Importar</translation> + </message> +</context> +<context> + <name>VariablesDockWidget</name> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="36"/> + <source>Workspace</source> + <translation>Espacio de trabajo</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Name</source> + <translation>Nombre</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Type</source> + <translation>Tipo</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Value</source> + <translation>Valor</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="52"/> + <source>Local</source> + <translation>Local</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="56"/> + <source>Global</source> + <translation>Global</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="60"/> + <source>Persistent</source> + <translation>Persistente</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="64"/> + <source>Hidden</source> + <translation>Oculto</translation> + </message> +</context> +</TS>
new file mode 100644 --- /dev/null +++ b/gui/languages/generic.qm @@ -0,0 +1,1 @@ +<ždÊïÍ!ż`ĄœĘ \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/gui/languages/generic.ts @@ -0,0 +1,567 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0"> +<context> + <name>FileEditorMdiSubWindow</name> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="114"/> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="207"/> + <source>File Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="115"/> + <source>Cannot read file %1: +%2.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="127"/> + <source>File loaded.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="153"/> + <source>Do you want to save the current file +%1 ?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="208"/> + <source>Cannot write file %1: +%2.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="220"/> + <source>File %1 saved</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="383"/> + <source>&Close File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="386"/> + <source>&New File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="389"/> + <source>&Open File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="392"/> + <source>&Save File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="395"/> + <source>Save File &As</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="398"/> + <source>&Undo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="401"/> + <source>&Redo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="402"/> + <source>&Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="403"/> + <source>Cu&t</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="404"/> + <source>&Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="405"/> + <source>&Next Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="406"/> + <source>Pre&vious Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="407"/> + <source>Toggle &Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="410"/> + <source>&Run File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="449"/> + <source>&File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="457"/> + <source>&Edit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="469"/> + <source>&Run</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FilesDockWidget</name> + <message> + <location filename="../src/FilesDockWidget.cpp" line="32"/> + <source>Current Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="46"/> + <source>Move up one directory.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="49"/> + <source>Enter the path or filename.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="78"/> + <source>Doubleclick a file to open it.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>HistoryDockWidget</name> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="36"/> + <source>Doubleclick a command to transfer it to the terminal.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="38"/> + <source>Enter text to filter the command history.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="41"/> + <source>Command History</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LexerOctaveGui</name> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="111"/> + <source>Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="113"/> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="115"/> + <source>Command</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="117"/> + <source>Number</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="119"/> + <source>Keyword</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="121"/> + <source>Single-quoted string</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="123"/> + <source>Operator</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="125"/> + <source>Identifier</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="127"/> + <source>Double-quoted string</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.cpp" line="47"/> + <source>Opening file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="124"/> + <source>Save Workspace</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="134"/> + <source>Load Workspace</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="226"/> + <location filename="../src/MainWindow.cpp" line="362"/> + <source>About Octave</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="238"/> + <source>Saving data and shutting down.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="276"/> + <source>View the variables in the active workspace.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="278"/> + <source>Browse and search the command history.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="280"/> + <source>Browse your files.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="294"/> + <source>Terminal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="298"/> + <source>Enter your commands into the Octave terminal.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="307"/> + <source>Documentation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="311"/> + <source>Browse the Octave documentation for help.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="320"/> + <source>Chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="323"/> + <source>Instantly chat with other Octave users for help.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="330"/> + <source>Octave</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="331"/> + <source>Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="333"/> + <source>Exit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="335"/> + <source>Interface</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="337"/> + <source>Align Windows</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="339"/> + <location filename="../src/MainWindow.cpp" line="351"/> + <source>Workspace</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="342"/> + <source>History</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="345"/> + <source>File Browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="349"/> + <source>Open New Editor Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="352"/> + <source>Load</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="353"/> + <source>Save</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="355"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="357"/> + <source>Community</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="358"/> + <source>Report Bug</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="359"/> + <source>Agora</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="360"/> + <source>Octave Forge</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="363"/> + <source>About Qt</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SettingsDialog</name> + <message> + <location filename="../src/SettingsDialog.ui" line="29"/> + <source>Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="39"/> + <source>Chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="47"/> + <source>Connect to #octave on startup</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="57"/> + <source>Show message of the day</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="64"/> + <source>Show topic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="71"/> + <source>Automatically identify on NickServ</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="78"/> + <source>Warning: Your password will be stored in ~/.octavegui in human-readable format. Do not enter your password if you worry about security issues.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="103"/> + <location filename="../src/SettingsDialog.ui" line="311"/> + <source>Password:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="125"/> + <source>Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="133"/> + <source>Use custom file editor:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="143"/> + <source>emacs</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="166"/> + <source>File Browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="172"/> + <source>Show filenames</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="179"/> + <source>Show file size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="186"/> + <source>Show file type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="193"/> + <source>Show date of last modification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="200"/> + <source>Show hidden files</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="207"/> + <source>Alternating row colors</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="215"/> + <source>Network</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="221"/> + <source>Use proxy server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="233"/> + <source>Proxy Type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="244"/> + <source>HttpProxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="249"/> + <source>Socks5Proxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="260"/> + <source>Hostname:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="277"/> + <source>Port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="294"/> + <source>Username:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="339"/> + <source>Reset to defaults</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="362"/> + <source>Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="372"/> + <source>Import</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>VariablesDockWidget</name> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="36"/> + <source>Workspace</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="52"/> + <source>Local</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="56"/> + <source>Global</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="60"/> + <source>Persistent</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="64"/> + <source>Hidden</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS>
new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..83d512baa96d8ad07afa2ef66532922ed0ddcb01 GIT binary patch literal 8860 zc$}?S4U8OR8Gi4&d%fH4-d&G!El0VIU@xV$2UH5!kdo_Ne`&9!SFX?y<lC8VcZbf- zEc0`J5JXfokq{M#28BebNN55^P*D(xDO!mF5u&1^k|Kzt!B`u9jOhEl-?uxndoz32 zXqxNn&dmGwy#L=``na*|*|)!T_b)%R{KwaQ{YS5C0%(02QulotAh%0id)Gng`4m9s zvyfiz19aaD>22!)`fr5vSDpdrIRxpaIevc!)_ndE05}0_j^MTBHrV?5Cjl1euw%`w z$Zrb9uD%K18-Z&+^<97!Yrwkr5WrdY!M*Q}0<^sbe|>Z#%HIzs%4Y!dJ=Jo~k#7QI zUTt~d^_KuTe%f+;Bg*OdRqN8HPX}0BYQ6tog8)k|Y(4Ueet@iz+S&Iq%6TyL#G*Xv z{YvWjiMs%n_N0zog>uh&A@%k{Poexw>fMeWfCb0XDSG~m^tpp~ApPId2OdOw7GIpc z=8~VF+)VoL`c{<tiS&z;*P{Ka(r=BQKzqK}cIPucLp}0sN56p2Gnci!RQdqm%#&@u zdkUZT9a#9;+fkp?)`f?!Jq@q-FZ}aYKaO^tXwSU(5WeTMKk)c{Xz$AQm*4p#K)SX4 zO+fiww|1=l*h#eKxAM9o-*IhuGvWyy7W*g4UDa{Rdv_xJK*wV(zrnkG9e>*QE!6jL zrt9btwCj;f-|G+Kd%w>Zm!QAe?Tm5h61+Z;d3fXdXy+@LCvQjpwZE1*`en4UTVJ&9 zhd)3)K9g;m5pwR&Uh*HLKW%+>ViIw0`Dk_~XXEu~_Lf7x1~~oB>|HH?z~}$Y-t`ys z1MJH_c*AvwGs`~F;^F-#<#pM?T>qQspEK^st;hs;U7tH}_&L1)?OfqGjDyaT^1Af$ z++*v|?+d@5d+Vkb@%ibw<EtOV_uuQhW~0#Wg--WT#3g-C=Zznr-V5&TJk*Z3XJ$GN z{ai<VR(1ZvLcio*>w@o~o;|%?neU<hyLOle-V+N@!+scmEx<vC5-@N<gCYF?1_;1} z32@p4xNZ2iXkgfKJg#jqExr)H_lggj4bykrU4}Up<oBDl;Y_v&o_)x36dXaH$gg8y zluyo!+j8VK1bO6QHqkFLu)D(Tc`@uphI`TE0vbGnSGUF_J+PM>&Rp~YvN5E!P=RKU zWd_FB#QYHJL6#$^iWjTYmG<09?L@?n5#9y--^6PLuO9w8j!JP<R>MC|>Wa5mRAv0W z5-xxZbX^C7HQCFCnQc41=5l6e1(dF>ykJ9S<+{PS)VXRN>IidnRD;tUp_qLNs-2-! zn{-W|pOS8)Fphk6_#5&xNDB_vqf`w)MZFrQ3j-g&G16b?rNL!2jm{l$v}q^MCYkMP zzN2}<`+kXQdf>Vo?+GO{D=*M4n@hunh^on|>KDdXZi_UWgc)=3{V;4si%qn_Aq$1| zjk3Hj<%zdsH8<x*jdj9Kc(;h347?ZmE=!y(hZ)?M(_O2YB^!PpfML9rqoCCCP8%5V z=Hfq&^cHdxJUM|P9PHsI5tcI)AR;salrcLXDs+d@6H%j%!&>APHMW1m3Gx=#EmJ?J zF&U{C9gZkhrcdT~3H7`YM?bjVG>Y6;89jnhisUY?!cl-)#yd7vYlrRy>WNJlNd0FA zZm7+fn{A)F6qXg{mo&#Ejciut$*PEY7od5v081bY`o>YY6I7a`LV9;O=zyT2IX2e} z)8#q>Kb_2fHEcr;UX7PdCdlZN&ShwzQ5T(E!%n%(Y(v{-dV;%PzF2*3U_W(A9@gsw zMm_A))ut-VBfb`BJM>)KmHrVC8v?SvJ_dB9I);JoGTSSlM@*_2!Y}BbvS~AGu!%{f zhTxE@i_cS(-BGm*_?D%Vuhz8^QO-uY-gqx!!nrDN_!KFMK~s&Rsx>94X*0Du>)lyn zzEC++kaq6mQ{3IH`<TRA1C!{MC_0XGKD;UeuAUkTY!Y=A_D~6OMN0~)MtFe*RwC6P z2E9*`Yy`RrjYg4EQSl=pse<6LNMJ6JzFvDn;P~9oJl{3#Vv>+P*iOg`vrO`ouBv4? z0A#isXq;Ivxtq*p4@Dfqh!$>Mi+Gjj8xQThoKH_WZX(86Y>e*{#%=_qw$Y%RPZrz_ zyAc3RLhH3|$9c?Us&&MXo<9$KJ$zawgn1O<F+_B}2rox54wdF=5#5cV{04BcLwP6g zHAyO1Wp**sj&zA7v)Eh#erT*Dzrv3r&0xzaQpaWCP&ZU`To(6sKfZ0L5-;<02c-*d z2(#RfWfpBsQhITmMldKuX_IZhBgO4n_QzM-<oqAl<f0s|iA?u6bM;bU^2aIS(#RDk z{A?;rhPqeHYX)zqq0wk`RJ0H&MTB(eFU@fDKokJxn~tp&u&0%{Rf*N*BeQf7zyuU+ z^*u9ce2<ce<DKl6UM%x=m3CoZq=ri@HYl>#-(_sG=&V0%A++)FCo5opNSTO_NVhP2 zJ46KxY}22Pqg{p`h($UKrjaOuaXiKw8cv8>W5`s4tg#z5_v%{NUI<_nQ=VqpswFBv z*LB9(;EOrYjG&p?JY~j$zZy%ORG>PW&OHswnN`L?tcQAL4>4iwjSMM`bYCLR+G+`s zX=>7x;S;L9N`F@K9*<N@F#-A%(H@Nf9{#ERs5(?5=F!nWlx{<fbqtrFfFdjO%K6)E z&&PGfn$~m-WNp$EBO`jmt-2&YG`!|1*MmLIR^cGlTRj@M+lAW;Oph(P-3U!|i-@>( zCoT_hBpVt@$g(mGuOWKU)p8`tQ*@Rh-s%+0wf&BJ(5ob9mW}NqZOQ#(S%VL@P|y{l zEl44{#c_+VEH0`$2C?aYML6;LNPnoBCf!<}<h^u4B92|;CZu{toG7g(%ARAN$O)#{ zeyJ+Px_=oRwp7SoUwLE`aw>)c&R$+|TwmK16yvduEP!DIj3pp_QNzA?%HF5#v8nfW zL_|~pGE^n;2z`yj=@j#B<SnL3r#J~YR=*~qSb?L#d?uT0De!%|<4oGI$o8qqQJ~5k zkf1l<WZkUPKE{bl?1az_`|68yNVZRv+BmWU*bPjoG>k@-8HKb&+{F4LV%&`Mf_eHN z0>_$h69ZM${t4!q3<qk_4(JBceG@%2S@lpXHmfj#PtETgO<lf@#xhyNY-O)bG0jz- zl@n_?x`jUI9TK~e&B&YBK(N7Cj!Pctth#5!WR_D@@W$-~E)MmwIWQ{uvg!KjX?$zY zu+NF-2QglS;uAHM&K?SUr;Hlu%);Vs$_-;07j|tFchoWNP9&+<WXOqo{ZbXAT$Mk! zwl1GTLrGW?<z15o93B6n*?!irW7}M()$<%j7E06=o0IDYl_c5O=y_LIrNbkwIHGPO znu^w|2;r2dQ%QvXm#HFNqwO>)#%Q#?+)Se^`CW$NhA`0gFwYa4;D#i+v#Dfzbh;Du zSS4nSUc8rkocv<QeL69&Pq|#hF&TkfRAj^B41>}jY<=%jo|=>%nm8Av5U8e6eM{^g zD`7ff$;D_YXcqH)t?U@MYU{N@I8KQRXDQ)R4zk+8Tujr9G#DY2&H+7hh9?Obj1gi| z6wI5wKV3;=fBr1?)gwf&2IX7=#HnGTr)CRi+^;mXl~|OZVGt}P0VUJGswB6q`C}vt zp*SeV*-9N$I_kJGT)&r+1XSK*MRL99D+ZfRlCwO<7bnmc^;3R^xcW}T)RP$Pgeyro zw>G2IpT*CHsG`;aN3Bt^-3p_^j9z-BCw^tX6{9R2&#A&C=J&f;k0z)=JM_!S7`1Xa znaFA(KfBn<qrZx13eub5JcK@4y^ExC^|?HaERbcgOF1Baek#^}{~4t2bgbr_=xQ0S zjYgQr-)(#)sY0tyo_Lp43$FG*Pw6G+uQ%!zn>+S1SB$M2w5!F&Sy2@c7aYsd@|c(i zA2-Crar1eDvfmT~Q+zK4xSOsOKZuE;L~K6TMhCSKM-#tB@o<Z+@iYtaXCcRRr!__g zMIP4!7q@lI^t?bFCd4@^qs-DH*^%aDrYB}Z7PiuvbiQt!Yujo$c{$9THeQ{l8qQ|r zN~5wdq})bn*pxDZVeL?L4JD>`I{F*}+v!K*a%2TcjbcG*O4CbcS}q+7dK3jT^@J(7 x2iH;Dwbf~G6WRM@F%4z!Q^m50nd6iR(ODur&a9w0+5b9;#xnjKK4@Lg@?TSErf~oO
new file mode 100644 --- /dev/null +++ b/gui/languages/pt-br.ts @@ -0,0 +1,571 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="pt_BR" sourcelanguage="en"> +<context> + <name>FileEditorMdiSubWindow</name> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="114"/> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="207"/> + <source>File Editor</source> + <translation>Editor de Arquivos</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="115"/> + <source>Cannot read file %1: +%2.</source> + <translation>NĂŁo foi possĂvel ler o arquivo %1: %2.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="127"/> + <source>File loaded.</source> + <translation>Arquivo carregado.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="153"/> + <source>Do you want to save the current file +%1 ?</source> + <translation>VocĂȘ deseja salvar o arquivo atual %1 ?</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="208"/> + <source>Cannot write file %1: +%2.</source> + <translation>NĂŁo foi possĂvel escrever no arquivo %1: %2.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="220"/> + <source>File %1 saved</source> + <translation>Arquivo %1 salvo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="383"/> + <source>&Close File</source> + <translation>&Fechar Arquivo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="386"/> + <source>&New File</source> + <translation>&Novo Arquivo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="389"/> + <source>&Open File</source> + <translation>&Abrir Arquivo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="392"/> + <source>&Save File</source> + <translation>&Salvar Arquivo</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="395"/> + <source>Save File &As</source> + <translation>Salvar Arquivo &Como</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="398"/> + <source>&Undo</source> + <translation>&Desfazer</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="401"/> + <source>&Redo</source> + <translation>&Refazer</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="402"/> + <source>&Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="403"/> + <source>Cu&t</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="404"/> + <source>&Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="405"/> + <source>&Next Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="406"/> + <source>Pre&vious Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="407"/> + <source>Toggle &Bookmark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="410"/> + <source>&Run File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="449"/> + <source>&File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="457"/> + <source>&Edit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="469"/> + <source>&Run</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FilesDockWidget</name> + <message> + <source>Current Folder</source> + <translation type="obsolete">DiretĂłrio Atual</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="32"/> + <source>Current Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="46"/> + <source>Move up one directory.</source> + <translation>Subir um diretĂłrio.</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="49"/> + <source>Enter the path or filename.</source> + <translation>Digite o caminho ou o nome do arquivo.</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="78"/> + <source>Doubleclick a file to open it.</source> + <translation>Clique duas vezes num arquivo para abrĂ-lo.</translation> + </message> +</context> +<context> + <name>HistoryDockWidget</name> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="36"/> + <source>Doubleclick a command to transfer it to the terminal.</source> + <translation>Clique duas vezes num comando para transferĂ-lo ao terminal.</translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="38"/> + <source>Enter text to filter the command history.</source> + <translation>Digite um texto para filtrar o hitĂłrico de comandos.</translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="41"/> + <source>Command History</source> + <translation>HistĂłrico de Comandos</translation> + </message> +</context> +<context> + <name>LexerOctaveGui</name> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="111"/> + <source>Default</source> + <translation>PadrĂŁo</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="113"/> + <source>Comment</source> + <translation>ComentĂĄrio</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="115"/> + <source>Command</source> + <translation>Comando</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="117"/> + <source>Number</source> + <translation>NĂșmero</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="119"/> + <source>Keyword</source> + <translation>Palavra-Chave</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="121"/> + <source>Single-quoted string</source> + <translation>String com aspas simples</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="123"/> + <source>Operator</source> + <translation>Operador</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="125"/> + <source>Identifier</source> + <translation>Identificador</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="127"/> + <source>Double-quoted string</source> + <translation>String com aspas duplas</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.cpp" line="47"/> + <source>Opening file.</source> + <translation>Abrindo arquivo.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="124"/> + <source>Save Workspace</source> + <translation>Salvar ambiente de trabalho</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="134"/> + <source>Load Workspace</source> + <translation>Carregar ambiente de trabalho</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="226"/> + <location filename="../src/MainWindow.cpp" line="362"/> + <source>About Octave</source> + <translation>Sobre o Octave</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="238"/> + <source>Saving data and shutting down.</source> + <translation>Salvando dados e encerrando a sessĂŁo.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="276"/> + <source>View the variables in the active workspace.</source> + <translation>Visualizar variĂĄveis no ambiente de trabalho.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="278"/> + <source>Browse and search the command history.</source> + <translation>Pesquise no histĂłrico de comandos.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="280"/> + <source>Browse your files.</source> + <translation>Procure seus arquivos.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="294"/> + <source>Terminal</source> + <translation>Terminal</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="298"/> + <source>Enter your commands into the Octave terminal.</source> + <translation>Digite seus comandos no terminal do Octave.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="307"/> + <source>Documentation</source> + <translation>Documentação</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="311"/> + <source>Browse the Octave documentation for help.</source> + <translation>Procure na documentação do Octave.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="320"/> + <source>Chat</source> + <translation>Chat</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="323"/> + <source>Instantly chat with other Octave users for help.</source> + <translation>Converse instantaneamente com outros usuĂĄrios do Octave para pedir ajuda.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="330"/> + <source>Octave</source> + <translation>Octave</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="331"/> + <source>Settings</source> + <translation>ConfiguraçÔes</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="333"/> + <source>Exit</source> + <translation>Sair</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="335"/> + <source>Interface</source> + <translation>Interface</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="337"/> + <source>Align Windows</source> + <translation>Alinhar Janelas</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="339"/> + <location filename="../src/MainWindow.cpp" line="351"/> + <source>Workspace</source> + <translation>Ambiente de trabalho</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="342"/> + <source>History</source> + <translation>HistĂłrico</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="345"/> + <source>File Browser</source> + <translation>Navegador de Arquivos</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="349"/> + <source>Open New Editor Window</source> + <translation>Abrir nova janela de edição</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="352"/> + <source>Load</source> + <translation>Carregar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="353"/> + <source>Save</source> + <translation>Salvar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="355"/> + <source>Clear</source> + <translation>Limpar</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="357"/> + <source>Community</source> + <translation>Comunidade</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="358"/> + <source>Report Bug</source> + <translation>Reportar Bug</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="359"/> + <source>Agora</source> + <translation>Agora</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="360"/> + <source>Octave Forge</source> + <translation>Octave Forge</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="363"/> + <source>About Qt</source> + <translation>Sobre o Qt</translation> + </message> +</context> +<context> + <name>SettingsDialog</name> + <message> + <location filename="../src/SettingsDialog.ui" line="29"/> + <source>Settings</source> + <translation>ConfiguraçÔes</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="39"/> + <source>Chat</source> + <translation>Chat</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="47"/> + <source>Connect to #octave on startup</source> + <translation>Conectar ao #octave ao iniciar</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="57"/> + <source>Show message of the day</source> + <translation>Mostrar mensagem do dia</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="64"/> + <source>Show topic</source> + <translation>Mostrar tĂłpico</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="71"/> + <source>Automatically identify on NickServ</source> + <translation>Identificar-se automaticamente com o NickServ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="78"/> + <source>Warning: Your password will be stored in ~/.octavegui in human-readable format. Do not enter your password if you worry about security issues.</source> + <translation>Aviso: Sua senha serĂĄ salva em ~/.octavegui em um formato legĂvel. NĂŁo digite sua senha se vocĂȘ tem problemas com segurança.</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="103"/> + <location filename="../src/SettingsDialog.ui" line="311"/> + <source>Password:</source> + <translation>Senha:</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="125"/> + <source>Editor</source> + <translation>Editor</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="133"/> + <source>Use custom file editor:</source> + <translation>Usar editor de arquivos personalizado:</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="143"/> + <source>emacs</source> + <translation>emacs</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="166"/> + <source>File Browser</source> + <translation>Navegador de Arquivos</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="172"/> + <source>Show filenames</source> + <translation>Mostrar nomes de arquivo</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="179"/> + <source>Show file size</source> + <translation>Mostrar tamanho do arquivo</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="186"/> + <source>Show file type</source> + <translation>Mostrar tipo do arquivo</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="193"/> + <source>Show date of last modification</source> + <translation>Mostrar data de Ășltima modificação</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="200"/> + <source>Show hidden files</source> + <translation>Mostrar arquivos ocultos</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="207"/> + <source>Alternating row colors</source> + <translation>Alternar cores das linhas</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="215"/> + <source>Network</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="221"/> + <source>Use proxy server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="233"/> + <source>Proxy Type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="244"/> + <source>HttpProxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="249"/> + <source>Socks5Proxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="260"/> + <source>Hostname:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="277"/> + <source>Port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="294"/> + <source>Username:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="339"/> + <source>Reset to defaults</source> + <translation>Resetar ao padrĂŁo</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="362"/> + <source>Export</source> + <translation>Exportar</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="372"/> + <source>Import</source> + <translation>Importar</translation> + </message> +</context> +<context> + <name>VariablesDockWidget</name> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="36"/> + <source>Workspace</source> + <translation>Ambiente de trabalho</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Type</source> + <translation>Tipo</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Value</source> + <translation>Valor</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="52"/> + <source>Local</source> + <translation>Local</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="56"/> + <source>Global</source> + <translation>Global</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="60"/> + <source>Persistent</source> + <translation>Persistente</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="64"/> + <source>Hidden</source> + <translation>Oculto</translation> + </message> +</context> +</TS>
new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..de3a769e3f6ba4f834ed1e7a6066bb9c0e6beeee GIT binary patch literal 9784 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
new file mode 100644 --- /dev/null +++ b/gui/languages/ru-ru.ts @@ -0,0 +1,574 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="ru_RU"> +<context> + <name>FileEditorMdiSubWindow</name> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="114"/> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="207"/> + <source>File Editor</source> + <translation>РДЎаĐșŃĐŸŃ ŃĐ°ĐčĐ»ĐŸĐČ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="115"/> + <source>Cannot read file %1: +%2.</source> + <translation>ĐĐ” ŃĐŽĐ°Đ»ĐŸŃŃ ĐżŃĐŸŃĐžŃĐ°ŃŃ ŃĐ°ĐčĐ» %1: +%2.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="127"/> + <source>File loaded.</source> + <translation>ЀаĐčĐ» Đ·Đ°ĐłŃŃĐ¶Đ”Đœ.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="153"/> + <source>Do you want to save the current file +%1 ?</source> + <translation>ĐĄĐŸŃ ŃĐ°ĐœĐžŃŃ ŃĐ”ĐșŃŃĐžĐč ŃĐ°ĐčĐ» +%1?</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="208"/> + <source>Cannot write file %1: +%2.</source> + <translation>ĐĐ” ŃĐŽĐ°Đ»ĐŸŃŃ ŃĐŸŃ ŃĐ°ĐœĐžŃŃ ŃĐ°ĐčĐ» %1: +%2.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="220"/> + <source>File %1 saved</source> + <translation>ЀаĐčĐ» %1 ŃĐŸŃ ŃĐ°ĐœŃĐœ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="383"/> + <source>&Close File</source> + <translation>&ĐĐ°ĐșŃŃŃŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="386"/> + <source>&New File</source> + <translation>ĐĄĐŸĐ·ĐŽ&Đ°ŃŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="389"/> + <source>&Open File</source> + <translation>&ĐŃĐșŃŃŃŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="392"/> + <source>&Save File</source> + <translation>&ĐĄĐŸŃ ŃĐ°ĐœĐžŃŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="395"/> + <source>Save File &As</source> + <translation>ĐĄĐŸŃ ŃĐ°ĐœĐžŃŃ &ĐșĐ°Đș</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="398"/> + <source>&Undo</source> + <translation>Đ&ŃĐŒĐ”ĐœĐžŃŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="401"/> + <source>&Redo</source> + <translation>&ĐĐŸĐČŃĐŸŃĐžŃŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="402"/> + <source>&Copy</source> + <translation>&ĐĐŸĐżĐžŃĐŸĐČĐ°ŃŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="403"/> + <source>Cu&t</source> + <translation>ĐŃ&ŃДзаŃŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="404"/> + <source>&Paste</source> + <translation>&ĐŃŃĐ°ĐČĐžŃŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="405"/> + <source>&Next Bookmark</source> + <translation>ĐĄ&лДЎŃŃŃĐ°Ń Đ·Đ°ĐșлаЎĐșĐ°</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="406"/> + <source>Pre&vious Bookmark</source> + <translation>ĐŃ&ДЎŃĐŽŃŃĐ°Ń Đ·Đ°ĐșлаЎĐșĐ°</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="407"/> + <source>Toggle &Bookmark</source> + <translation>&ĐŁŃŃĐ°ĐœĐŸĐČĐžŃŃ/ŃĐœŃŃŃ Đ·Đ°ĐșлаЎĐșŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="410"/> + <source>&Run File</source> + <translation>&ĐĐ°ĐżŃŃŃĐžŃŃ ŃĐ°ĐčĐ»</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="449"/> + <source>&File</source> + <translation>&ЀаĐčĐ»</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="457"/> + <source>&Edit</source> + <translation>&ĐŃĐ°ĐČĐșĐ°</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="469"/> + <source>&Run</source> + <translation>&ĐĐ°ĐżŃŃĐș</translation> + </message> +</context> +<context> + <name>FilesDockWidget</name> + <message> + <source>Current Folder</source> + <translation type="obsolete">йДĐșŃŃĐžĐč ĐșĐ°ŃĐ°Đ»ĐŸĐł</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="32"/> + <source>Current Directory</source> + <translation>йДĐșŃŃĐžĐč ĐșĐ°ŃĐ°Đ»ĐŸĐł</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="46"/> + <source>Move up one directory.</source> + <translation>ĐĐ”ŃĐ”ĐčŃĐž ĐœĐ° ŃŃĐŸĐČĐ”ĐœŃ ĐČŃŃĐ”.</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="49"/> + <source>Enter the path or filename.</source> + <translation>ĐĐČДЎОŃĐ” ĐżŃŃŃ ĐžĐ»Đž ĐžĐŒŃ ŃĐ°Đčла.</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="78"/> + <source>Doubleclick a file to open it.</source> + <translation>ĐĐČĐŸĐčĐœĐŸĐč ŃДлŃĐŸĐș ĐżĐŸ ŃĐ°ĐčĐ»Ń ĐŸŃĐșŃĐŸĐ”Ń Đ”ĐłĐŸ.</translation> + </message> +</context> +<context> + <name>HistoryDockWidget</name> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="36"/> + <source>Doubleclick a command to transfer it to the terminal.</source> + <translation>ĐĐČĐŸĐčĐœĐŸĐč ŃДлŃĐŸĐș ĐżĐŸ ĐșĐŸĐŒĐ°ĐœĐŽĐ” пДŃĐ”ĐœĐ”ŃŃŃ Đ”Ń ĐČ ĐșĐŸĐŒĐ°ĐœĐŽĐœŃŃ ŃŃŃĐŸĐșŃ.</translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="38"/> + <source>Enter text to filter the command history.</source> + <translation>ĐĐČДЎОŃĐ” ŃĐ”ĐșŃŃ ĐŽĐ»Ń ŃОлŃŃŃĐ°ŃОО ĐČŃĐżĐŸĐ»ĐœĐ”ĐœĐœŃŃ ĐșĐŸĐŒĐ°ĐœĐŽ.</translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="41"/> + <source>Command History</source> + <translation>ĐŃŃĐœĐ°Đ» ĐČŃĐżĐŸĐ»ĐœĐ”ĐœĐœŃŃ ĐșĐŸĐŒĐ°ĐœĐŽ</translation> + </message> +</context> +<context> + <name>LexerOctaveGui</name> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="111"/> + <source>Default</source> + <translation>ĐĐŸ ŃĐŒĐŸĐ»ŃĐ°ĐœĐžŃ</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="113"/> + <source>Comment</source> + <translation>ĐĐŸĐŒĐŒĐ”ĐœŃĐ°ŃĐžĐč</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="115"/> + <source>Command</source> + <translation>ĐĐŸĐŒĐ°ĐœĐŽĐ°</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="117"/> + <source>Number</source> + <translation>ЧОŃĐ»ĐŸ</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="119"/> + <source>Keyword</source> + <translation>ĐĐ°ŃДзДŃĐČĐžŃĐŸĐČĐ°ĐœĐœĐŸĐ” ŃĐ»ĐŸĐČĐŸ</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="121"/> + <source>Single-quoted string</source> + <translation>ĐĄŃŃĐŸĐșĐ° ĐČ ĐŸĐŽĐžĐœĐ°ŃĐœŃŃ ĐșĐ°ĐČŃŃĐșĐ°Ń </translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="123"/> + <source>Operator</source> + <translation>ĐпДŃĐ°ŃĐŸŃ</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="125"/> + <source>Identifier</source> + <translation>ĐĐŽĐ”ĐœŃĐžŃĐžĐșĐ°ŃĐŸŃ</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="127"/> + <source>Double-quoted string</source> + <translation>ĐĄŃŃĐŸĐșĐ° ĐČ ĐŽĐČĐŸĐčĐœŃŃ ĐșĐ°ĐČŃŃĐșĐ°Ń </translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.cpp" line="47"/> + <source>Opening file.</source> + <translation>ĐŃĐșŃŃĐČĐ°Đ”ŃŃŃ ŃĐ°ĐčĐ».</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="124"/> + <source>Save Workspace</source> + <translation>ĐĄĐŸŃ ŃĐ°ĐœĐžŃŃ ĐŸĐ±Đ»Đ°ŃŃŃ ĐżĐ”ŃĐ”ĐŒĐ”ĐœĐœŃŃ </translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="134"/> + <source>Load Workspace</source> + <translation>ĐĐ°ĐłŃŃĐ·ĐžŃŃ ĐŸĐ±Đ»Đ°ŃŃŃ ĐżĐ”ŃĐ”ĐŒĐ”ĐœĐœŃŃ </translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="226"/> + <location filename="../src/MainWindow.cpp" line="362"/> + <source>About Octave</source> + <translation>Đб Octave</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="238"/> + <source>Saving data and shutting down.</source> + <translation>ĐĄĐŸŃ ŃĐ°ĐœĐžŃŃ Đž Đ·Đ°ĐČĐ”ŃŃĐžŃŃ ŃĐ°Đ±ĐŸŃŃ.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="276"/> + <source>View the variables in the active workspace.</source> + <translation>ĐŃĐŸŃĐŒĐŸŃŃ ŃĐŸĐŽĐ”ŃĐ¶ĐžĐŒĐŸĐłĐŸ ŃĐ”ĐșŃŃĐ”Đč ĐŸĐ±Đ»Đ°ŃŃĐž пДŃĐ”ĐŒĐ”ĐœĐœŃŃ .</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="278"/> + <source>Browse and search the command history.</source> + <translation>ĐŃĐŸŃĐŒĐŸŃŃ Đž ĐżĐŸĐžŃĐș ĐČ Đ¶ŃŃĐœĐ°Đ»Đ” ĐČŃĐżĐŸĐ»ĐœĐ”ĐœĐœŃŃ ĐșĐŸĐŒĐ°ĐœĐŽ.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="280"/> + <source>Browse your files.</source> + <translation>ĐŃĐŸŃĐŒĐŸŃŃ ŃĐ°ĐčĐ»ĐŸĐČ.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="294"/> + <source>Terminal</source> + <translation>ĐĐŸĐŒĐ°ĐœĐŽĐœĐ°Ń ŃŃŃĐŸĐșĐ°</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="298"/> + <source>Enter your commands into the Octave terminal.</source> + <translation>ĐĐČДЎОŃĐ” ĐșĐŸĐŒĐ°ĐœĐŽŃ ĐČ ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐč ŃŃŃĐŸĐșĐ” Octave.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="307"/> + <source>Documentation</source> + <translation>ĐĐŸĐșŃĐŒĐ”ĐœŃĐ°ŃĐžŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="311"/> + <source>Browse the Octave documentation for help.</source> + <translation>ĐŃĐșŃŃŃŃ ĐŽĐŸĐșŃĐŒĐ”ĐœŃĐ°ŃĐžŃ ĐżĐŸ Octave.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="320"/> + <source>Chat</source> + <translation>ЧаŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="323"/> + <source>Instantly chat with other Octave users for help.</source> + <translation>Đ§Đ°Ń Ń ĐżĐŸĐ»ŃĐ·ĐŸĐČĐ°ŃДлŃĐŒĐž Octave.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="330"/> + <source>Octave</source> + <translation>Octave</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="331"/> + <source>Settings</source> + <translation>ĐĐ°ŃĐ°ĐŒĐ”ŃŃŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="333"/> + <source>Exit</source> + <translation>ĐŃŃ ĐŸĐŽ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="335"/> + <source>Interface</source> + <translation>ĐĐœŃĐ”ŃŃĐ”ĐčŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="337"/> + <source>Align Windows</source> + <translation>ĐŃŃĐŸĐČĐœŃŃŃ ĐŸĐșĐœĐ°</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="339"/> + <location filename="../src/MainWindow.cpp" line="351"/> + <source>Workspace</source> + <translation>ĐблаŃŃŃ ĐżĐ”ŃĐ”ĐŒĐ”ĐœĐœŃŃ </translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="342"/> + <source>History</source> + <translation>ĐŃŃĐœĐ°Đ» ĐČŃĐżĐŸĐ»ĐœĐ”ĐœĐœŃŃ ĐșĐŸĐŒĐ°ĐœĐŽ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="345"/> + <source>File Browser</source> + <translation>ЀаĐčĐ»ĐŸĐČŃĐč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="349"/> + <source>Open New Editor Window</source> + <translation>ĐŃĐșŃŃŃŃ ĐœĐŸĐČĐŸĐ” ĐŸĐșĐœĐŸ ŃДЎаĐșŃĐŸŃĐ°</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="352"/> + <source>Load</source> + <translation>ĐĐ°ĐłŃŃĐ·ĐžŃŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="353"/> + <source>Save</source> + <translation>ĐĄĐŸŃ ŃĐ°ĐœĐžŃŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="355"/> + <source>Clear</source> + <translation>ĐŃĐžŃŃĐžŃŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="357"/> + <source>Community</source> + <translation>ĐĄĐŸĐŸĐ±ŃĐ”ŃŃĐČĐŸ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="358"/> + <source>Report Bug</source> + <translation>ĐĄĐŸĐŸĐ±ŃĐžŃŃ ĐŸĐ± ĐŸŃОбĐșĐ”</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="359"/> + <source>Agora</source> + <translation>Agora</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="360"/> + <source>Octave Forge</source> + <translation>Octave Forge</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="363"/> + <source>About Qt</source> + <translation>Đ Qt</translation> + </message> +</context> +<context> + <name>SettingsDialog</name> + <message> + <location filename="../src/SettingsDialog.ui" line="29"/> + <source>Settings</source> + <translation>ĐĐ°ŃĐ°ĐŒĐ”ŃŃŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="39"/> + <source>Chat</source> + <translation>ЧаŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="47"/> + <source>Connect to #octave on startup</source> + <translation>ĐĐŸĐŽĐșĐ»ŃŃĐžŃŃŃŃ Đș #octave ĐżŃĐž Đ·Đ°ĐżŃŃĐșĐ”</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="57"/> + <source>Show message of the day</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃŃ ŃĐŸĐČĐ”Ń ĐŽĐœŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="64"/> + <source>Show topic</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃŃ ŃĐ”ĐŒŃ ĐŸĐ±ŃŃĐ¶ĐŽĐ”ĐœĐžŃ ĐżŃĐž ĐżĐŸĐŽĐșĐ»ŃŃĐ”ĐœĐžĐž</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="71"/> + <source>Automatically identify on NickServ</source> + <translation>ĐĐČŃĐŸĐŒĐ°ŃĐžŃĐ”ŃĐșĐž ĐžĐŽĐ”ĐœŃĐžŃĐžŃĐžŃĐŸĐČĐ°ŃŃŃŃ Ń NickServ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="78"/> + <source>Warning: Your password will be stored in ~/.octavegui in human-readable format. Do not enter your password if you worry about security issues.</source> + <translation>ĐŃДЎŃĐżŃĐ”Đ¶ĐŽĐ”ĐœĐžĐ”: паŃĐŸĐ»Ń Đ±ŃĐŽĐ”Ń ŃĐŸŃ ŃĐ°ĐœŃĐœ ĐČ ~/.octavegui ĐŸĐ±ŃŃĐœŃĐŒ ŃĐ”ĐșŃŃĐŸĐŒ. ĐĐ” ĐČĐČĐŸĐŽĐžŃĐ” паŃĐŸĐ»Ń, Đ”ŃлО пДŃДжОĐČĐ°Đ”ŃĐ” ĐŸ ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœŃŃ ŃŃĐ·ĐČĐžĐŒĐŸŃŃŃŃ ĐČ Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃĐž ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ.</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="103"/> + <location filename="../src/SettingsDialog.ui" line="311"/> + <source>Password:</source> + <translation>ĐĐ°ŃĐŸĐ»Ń:</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="125"/> + <source>Editor</source> + <translation>РДЎаĐșŃĐŸŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="133"/> + <source>Use custom file editor:</source> + <translation>ĐŃбŃĐ°ŃŃ ŃДЎаĐșŃĐŸŃ:</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="143"/> + <source>emacs</source> + <translation>emacs</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="166"/> + <source>File Browser</source> + <translation>ЀаĐčĐ»ĐŸĐČŃĐč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="172"/> + <source>Show filenames</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃŃ ĐžĐŒĐ”ĐœĐ° ŃĐ°ĐčĐ»ĐŸĐČ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="179"/> + <source>Show file size</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃŃ ŃĐ°Đ·ĐŒĐ”Ń ŃĐ°ĐčĐ»ĐŸĐČ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="186"/> + <source>Show file type</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃŃ ŃĐžĐżŃ ŃĐ°ĐčĐ»ĐŸĐČ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="193"/> + <source>Show date of last modification</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃŃ ĐŽĐ°ŃŃ ĐżĐŸŃĐ»Đ”ĐŽĐœĐ”ĐłĐŸ ĐžĐ·ĐŒĐ”ĐœĐ”ĐœĐžŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="200"/> + <source>Show hidden files</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃŃ ŃĐșŃŃŃŃĐ” ŃĐ°ĐčĐ»Ń</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="207"/> + <source>Alternating row colors</source> + <translation>ЧДŃДЎŃŃŃОДŃŃ ŃĐČĐ”ŃĐ° ŃŃŃĐŸĐș</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="215"/> + <source>Network</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="221"/> + <source>Use proxy server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="233"/> + <source>Proxy Type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="244"/> + <source>HttpProxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="249"/> + <source>Socks5Proxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="260"/> + <source>Hostname:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="277"/> + <source>Port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="294"/> + <source>Username:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="339"/> + <source>Reset to defaults</source> + <translation>ĐŁŃŃĐ°ĐœĐŸĐČĐžŃŃ ĐżĐ°ŃĐ°ĐŒĐ”ŃŃŃ ĐżĐŸ ŃĐŒĐŸĐ»ŃĐ°ĐœĐžŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="362"/> + <source>Export</source> + <translation>ĐĐșŃĐżĐŸŃŃĐžŃĐŸĐČĐ°ŃŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="372"/> + <source>Import</source> + <translation>ĐĐŒĐżĐŸŃŃĐžŃĐŸĐČĐ°ŃŃ</translation> + </message> +</context> +<context> + <name>VariablesDockWidget</name> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="36"/> + <source>Workspace</source> + <translation>ĐблаŃŃŃ ĐżĐ”ŃĐ”ĐŒĐ”ĐœĐœŃŃ </translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Name</source> + <translation>ĐĐŽĐ”ĐœŃĐžŃĐžĐșĐ°ŃĐŸŃ</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Type</source> + <translation>йОп</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Value</source> + <translation>ĐĐœĐ°ŃĐ”ĐœĐžĐ”</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="52"/> + <source>Local</source> + <translation>ĐĐŸĐșĐ°Đ»ŃĐœĐ°Ń</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="56"/> + <source>Global</source> + <translation>ĐĐ»ĐŸĐ±Đ°Đ»ŃĐœĐ°Ń</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="60"/> + <source>Persistent</source> + <translation>ĐĄŃĐ°ŃĐžŃĐ”ŃĐșĐ°Ń</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="64"/> + <source>Hidden</source> + <translation>ĐĄĐșŃŃŃĐ°Ń</translation> + </message> +</context> +</TS>
new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..106e473c4ee5a25399cf11bc5c2f5f0a50834565 GIT binary patch literal 9884 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
new file mode 100644 --- /dev/null +++ b/gui/languages/uk-ua.ts @@ -0,0 +1,574 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="uk_UA"> +<context> + <name>FileEditorMdiSubWindow</name> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="114"/> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="207"/> + <source>File Editor</source> + <translation>РДЎаĐșŃĐŸŃ ŃĐ°ĐčĐ»ŃĐČ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="115"/> + <source>Cannot read file %1: +%2.</source> + <translation>ĐĐ” ĐČĐŽĐ°Đ»ĐŸŃŃ ĐżŃĐŸŃĐžŃĐ°ŃĐž ŃĐ°ĐčĐ» %1:ïżŒ +%2.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="127"/> + <source>File loaded.</source> + <translation>ЀаĐčĐ» Đ·Đ°ĐČĐ°ĐœŃĐ°Đ¶Đ”ĐœĐŸ.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="153"/> + <source>Do you want to save the current file +%1 ?</source> + <translation>ĐĄĐżŃĐ°ĐČĐŽŃ Đ·Đ±Đ”ŃДгŃĐž ĐżĐŸŃĐŸŃĐœĐžĐč ŃĐ°ĐčĐ» +%1?</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="208"/> + <source>Cannot write file %1: +%2.</source> + <translation>ĐĐ” ĐČĐŽĐ°Đ»ĐŸŃŃ Đ·Đ±Đ”ŃДгŃĐž ŃĐ°ĐčĐ» %1: +%2.</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="220"/> + <source>File %1 saved</source> + <translation>ЀаĐčĐ» %1 збДŃĐ”Đ¶Đ”ĐœĐŸ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="383"/> + <source>&Close File</source> + <translation>ĐĐ°&ĐșŃĐžŃĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="386"/> + <source>&New File</source> + <translation>&ĐĄŃĐČĐŸŃĐžŃĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="389"/> + <source>&Open File</source> + <translation>&ĐŃĐŽĐșŃĐžŃĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="392"/> + <source>&Save File</source> + <translation>&ĐбДŃДгŃĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="395"/> + <source>Save File &As</source> + <translation>ĐбДŃДгŃĐž &ŃĐș</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="398"/> + <source>&Undo</source> + <translation>Đ&Đ”ŃĐœŃŃĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="401"/> + <source>&Redo</source> + <translation>Đ&ĐŸĐČŃĐŸŃĐžŃĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="402"/> + <source>&Copy</source> + <translation>&ĐĐŸĐżŃŃĐČĐ°ŃĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="403"/> + <source>Cu&t</source> + <translation>ĐĐžŃŃĐ·Đ°&ŃĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="404"/> + <source>&Paste</source> + <translation>&ĐŃŃĐ°ĐČĐžŃĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="405"/> + <source>&Next Bookmark</source> + <translation>ĐĐŸ &ĐœĐ°ŃŃŃĐżĐœĐŸŃ Đ·Đ°ĐșлаЎĐșĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="406"/> + <source>Pre&vious Bookmark</source> + <translation>ĐĐŸ &ĐżĐŸĐżĐ”ŃĐ”ĐŽĐœŃĐŸŃ Đ·Đ°ĐșлаЎĐșĐž</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="407"/> + <source>Toggle &Bookmark</source> + <translation>Đ&ŃŃĐ°ĐœĐŸĐČĐžŃĐž/ĐČОЎалОŃĐž Đ·Đ°ĐșлаЎĐșŃ</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="410"/> + <source>&Run File</source> + <translation>&ĐĐžĐșĐŸĐœĐ°ŃĐž ŃĐ°ĐčĐ»</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="449"/> + <source>&File</source> + <translation>&ЀаĐčĐ»</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="457"/> + <source>&Edit</source> + <translation>&ĐŃĐ°ĐČĐșĐ°</translation> + </message> + <message> + <location filename="../src/FileEditorMdiSubWindow.cpp" line="469"/> + <source>&Run</source> + <translation>&ĐĐžĐșĐŸĐœĐ°ĐœĐœŃ</translation> + </message> +</context> +<context> + <name>FilesDockWidget</name> + <message> + <source>Current Folder</source> + <translation type="obsolete">ĐĐŸŃĐŸŃĐœĐžĐč ĐșĐ°ŃĐ°Đ»ĐŸĐł</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="32"/> + <source>Current Directory</source> + <translation>ĐĐŸŃĐŸŃĐœĐžĐč ĐșĐ°ŃĐ°Đ»ĐŸĐł</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="46"/> + <source>Move up one directory.</source> + <translation>ĐĐ”ŃĐ”ĐčŃĐž ĐČĐłĐŸŃŃ ĐŽĐ”ŃĐ”ĐČĐŸĐŒ ĐșĐ°ŃĐ°Đ»ĐŸĐłŃĐČ.</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="49"/> + <source>Enter the path or filename.</source> + <translation>ĐĐČДЎŃŃŃ ĐżĐŸĐČĐœĐžĐč ŃĐ»ŃŃ ĐŽĐŸ ŃĐ°ĐčĐ»Ń Đ°Đ±ĐŸ ĐœĐ°Đ·ĐČŃ ŃĐ°ĐčĐ»Ń.</translation> + </message> + <message> + <location filename="../src/FilesDockWidget.cpp" line="78"/> + <source>Doubleclick a file to open it.</source> + <translation>ĐĐŸĐŽĐČŃĐčĐœĐ” ĐșлаŃĐ°ĐœĐœŃ ĐČŃĐŽĐșŃĐžŃ ŃĐ°ĐčĐ».</translation> + </message> +</context> +<context> + <name>HistoryDockWidget</name> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="36"/> + <source>Doubleclick a command to transfer it to the terminal.</source> + <translation>ĐĐŸĐŽĐČŃĐčĐœĐ” ĐșлаŃĐ°ĐœĐœŃ ĐżĐ”ŃĐ”ĐœĐ”ŃĐ” ĐșĐŸĐŒĐ°ĐœĐŽŃ ĐŽĐŸ ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐłĐŸ ŃŃĐŽĐșŃ.</translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="38"/> + <source>Enter text to filter the command history.</source> + <translation>ĐĐČДЎŃŃŃ ŃĐ”ĐșŃŃ ĐŽĐ»Ń ŃŃĐ»ŃŃŃŃĐČĐ°ĐœĐœŃ ŃŃŃĐŸŃŃŃ ĐČĐžĐșĐŸĐœĐ°ĐœĐžŃ ĐșĐŸĐŒĐ°ĐœĐŽ.</translation> + </message> + <message> + <location filename="../src/HistoryDockWidget.cpp" line="41"/> + <source>Command History</source> + <translation>ĐŃŃĐŸŃŃŃ ĐČĐžĐșĐŸĐœĐ°ĐœĐžŃ ĐșĐŸĐŒĐ°ĐœĐŽ</translation> + </message> +</context> +<context> + <name>LexerOctaveGui</name> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="111"/> + <source>Default</source> + <translation>ĐĄŃĐ°ĐœĐŽĐ°ŃŃĐœŃ ĐœĐ°Đ»Đ°ŃŃŃĐČĐ°ĐœĐœŃ</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="113"/> + <source>Comment</source> + <translation>ĐĐŸĐŒĐ”ĐœŃĐ°Ń</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="115"/> + <source>Command</source> + <translation>ĐĐŸĐŒĐ°ĐœĐŽĐ°</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="117"/> + <source>Number</source> + <translation>ЧОŃĐ»ĐŸ</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="119"/> + <source>Keyword</source> + <translation>ĐĐ°ŃДзДŃĐČĐŸĐČĐ°ĐœĐ” ŃĐ»ĐŸĐČĐŸ</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="121"/> + <source>Single-quoted string</source> + <translation>Đ ŃĐŽĐŸĐș ĐČ ĐŸĐŽĐžĐœĐ°ŃĐœĐžŃ Đ»Đ°ĐżĐșĐ°Ń </translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="123"/> + <source>Operator</source> + <translation>ĐпДŃĐ°ŃĐŸŃ</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="125"/> + <source>Identifier</source> + <translation>ĐĐŽĐ”ĐœŃĐžŃŃĐșĐ°ŃĐŸŃ</translation> + </message> + <message> + <location filename="../src/lexer/lexeroctavegui.cpp" line="127"/> + <source>Double-quoted string</source> + <translation>Đ ŃĐŽĐŸĐș Ń ĐżĐŸĐŽĐČŃĐčĐœĐžŃ Đ»Đ°ĐżĐșĐ°Ń </translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/MainWindow.cpp" line="47"/> + <source>Opening file.</source> + <translation>ĐŃĐŽĐșŃĐžĐČĐ°ŃŃŃŃŃ ŃĐ°ĐčĐ».</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="124"/> + <source>Save Workspace</source> + <translation>ĐбДŃДгŃĐž ĐŸĐ±Đ»Đ°ŃŃŃ Đ·ĐŒŃĐœĐœĐžŃ </translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="134"/> + <source>Load Workspace</source> + <translation>ĐĐ°ĐČĐ°ĐœŃажОŃĐž ĐŸĐ±Đ»Đ°ŃŃŃ Đ·ĐŒŃĐœĐœĐžŃ </translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="226"/> + <location filename="../src/MainWindow.cpp" line="362"/> + <source>About Octave</source> + <translation>ĐŃĐŸ Octave</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="238"/> + <source>Saving data and shutting down.</source> + <translation>ĐбДŃДгŃĐž ĐŽĐ°ĐœŃ Ń Đ·Đ°ĐČĐ”ŃŃĐžŃĐž ŃĐŸĐ±ĐŸŃŃ.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="276"/> + <source>View the variables in the active workspace.</source> + <translation>ĐĐ”ŃДглŃĐŽ Đ·ĐŒŃŃŃŃ ĐżĐŸŃĐŸŃĐœĐŸŃ ĐŸĐ±Đ»Đ°ŃŃŃ Đ·ĐŒŃĐœĐœĐžŃ .</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="278"/> + <source>Browse and search the command history.</source> + <translation>ĐĐ”ŃДглŃĐŽ Ń ĐżĐŸŃŃĐș ŃĐ”ŃДЎ ŃŃŃĐŸŃŃŃ ĐČĐžĐșĐŸĐœĐ°ĐœĐžŃ ĐșĐŸĐŒĐ°ĐœĐŽ.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="280"/> + <source>Browse your files.</source> + <translation>ĐĐ”ŃДглŃĐœŃŃĐž ŃĐ°ĐčлО.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="294"/> + <source>Terminal</source> + <translation>ĐĐŸĐŒĐ°ĐœĐŽĐœĐžĐč ŃŃĐŽĐŸĐș</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="298"/> + <source>Enter your commands into the Octave terminal.</source> + <translation>ĐĐČДЎŃŃŃ ĐșĐŸĐŒĐ°ĐœĐŽĐž ĐŽĐŸ ĐșĐŸĐŒĐ°ĐœĐŽĐœĐŸĐłĐŸ ŃŃĐŽĐșĐ° Octave.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="307"/> + <source>Documentation</source> + <translation>ĐĐŸĐșŃĐŒĐ”ĐœŃĐ°ŃŃŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="311"/> + <source>Browse the Octave documentation for help.</source> + <translation>ĐĐ”ŃДглŃĐœŃŃĐž ĐŽĐŸĐșŃĐŒĐ”ĐœŃĐ°ŃŃŃ ĐŽĐŸ Octave.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="320"/> + <source>Chat</source> + <translation>ЧаŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="323"/> + <source>Instantly chat with other Octave users for help.</source> + <translation>Đ§Đ°Ń Đ· ĐșĐŸŃĐžŃŃŃĐČĐ°ŃĐ°ĐŒĐž Octave.</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="330"/> + <source>Octave</source> + <translation>Octave</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="331"/> + <source>Settings</source> + <translation>ĐалаŃŃŃĐČĐ°ĐœĐœŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="333"/> + <source>Exit</source> + <translation>ĐĐžĐčŃĐž</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="335"/> + <source>Interface</source> + <translation>ĐĐœŃĐ”ŃŃĐ”ĐčŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="337"/> + <source>Align Windows</source> + <translation>ĐĐžŃŃĐČĐœŃŃĐž ĐČŃĐșĐœĐ°</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="339"/> + <location filename="../src/MainWindow.cpp" line="351"/> + <source>Workspace</source> + <translation>ĐблаŃŃŃ Đ·ĐŒŃĐœĐœĐžŃ </translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="342"/> + <source>History</source> + <translation>ĐŃŃĐŸŃŃŃ ĐČĐžĐșĐŸĐœĐ°ĐœĐžŃ ĐșĐŸĐŒĐ°ĐœĐŽ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="345"/> + <source>File Browser</source> + <translation>ЀаĐčĐ»ĐŸĐČĐžĐč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="349"/> + <source>Open New Editor Window</source> + <translation>ĐŃĐŽĐșŃĐžŃĐž ĐœĐŸĐČĐ” ĐČŃĐșĐœĐŸ ŃДЎаĐșŃĐŸŃĐ°</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="352"/> + <source>Load</source> + <translation>ĐĐ°ĐČĐ°ĐœŃажОŃĐž</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="353"/> + <source>Save</source> + <translation>ĐбДŃДгŃĐž</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="355"/> + <source>Clear</source> + <translation>ĐŃĐžŃŃĐžŃĐž</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="357"/> + <source>Community</source> + <translation>ĐĄĐżŃĐ»ŃĐœĐŸŃĐ°</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="358"/> + <source>Report Bug</source> + <translation>ĐĐŸĐČŃĐŽĐŸĐŒĐžŃĐž ĐżŃĐŸ ĐżĐŸĐŒĐžĐ»ĐșŃ</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="359"/> + <source>Agora</source> + <translation>Agora</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="360"/> + <source>Octave Forge</source> + <translation>Octave Forge</translation> + </message> + <message> + <location filename="../src/MainWindow.cpp" line="363"/> + <source>About Qt</source> + <translation>ĐŃĐŸ Qt</translation> + </message> +</context> +<context> + <name>SettingsDialog</name> + <message> + <location filename="../src/SettingsDialog.ui" line="29"/> + <source>Settings</source> + <translation>ĐалаŃŃŃĐČĐ°ĐœĐœŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="39"/> + <source>Chat</source> + <translation>ЧаŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="47"/> + <source>Connect to #octave on startup</source> + <translation>Đ'ŃĐŽĐœĐ°ŃĐžŃŃ Đ· #octave ĐżŃĐž Đ·Đ°ĐżŃŃĐșŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="57"/> + <source>Show message of the day</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃĐž ĐżĐŸŃĐ°ĐŽŃ ĐŽĐœŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="64"/> + <source>Show topic</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃĐž ŃĐ”ĐŒŃ ŃĐ°ŃŃ ĐżŃĐž Đ·'ŃĐŽĐœĐ°ĐœĐœŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="71"/> + <source>Automatically identify on NickServ</source> + <translation>ĐĐČŃĐŸĐŒĐ°ŃĐžŃĐœĐŸ ŃĐŽĐ”ĐœŃĐžŃŃĐșŃĐČĐ°ŃĐžŃŃ ĐČ NickServ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="78"/> + <source>Warning: Your password will be stored in ~/.octavegui in human-readable format. Do not enter your password if you worry about security issues.</source> + <translation>ĐĐŸĐżĐ”ŃĐ”ĐŽĐ¶Đ”ĐœĐœŃ: паŃĐŸĐ»Ń Đ±ŃĐŽĐ” збДŃĐ”Đ¶Đ”ĐœĐŸ ĐČ ~/.octavegui Đ·ĐČĐžŃĐ°ĐčĐœĐžĐŒ ŃĐ”ĐșŃŃĐŸĐŒ. ĐĐ” ĐČĐČĐŸĐŽŃŃĐ” паŃĐŸĐ»Ń, ŃĐșŃĐŸ пДŃĐ”ĐčĐŒĐ°ŃŃĐ”ŃŃ ĐżĐŸŃĐ”ĐœŃŃĐčĐœĐžĐŒĐž ĐżŃĐŸĐ±Đ»Đ”ĐŒĐ°ĐŒĐž ŃĐ· Đ·Đ°Ń ĐžŃŃĐŸĐŒ ĐŽĐ°ĐœĐžŃ ĐČ ĐżŃĐŸĐłŃĐ°ĐŒŃ.</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="103"/> + <location filename="../src/SettingsDialog.ui" line="311"/> + <source>Password:</source> + <translation>ĐĐ°ŃĐŸĐ»Ń:</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="125"/> + <source>Editor</source> + <translation>РДЎаĐșŃĐŸŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="133"/> + <source>Use custom file editor:</source> + <translation>ĐĐžĐșĐŸŃĐžŃŃĐŸĐČŃĐČĐ°ŃĐž ŃĐœŃĐžĐč ŃДЎаĐșŃĐŸŃ:</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="143"/> + <source>emacs</source> + <translation>emacs</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="166"/> + <source>File Browser</source> + <translation>ЀаĐčĐ»ĐŸĐČĐžĐč ĐŒĐ”ĐœĐ”ĐŽĐ¶Đ”Ń</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="172"/> + <source>Show filenames</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃĐž ĐœĐ°Đ·ĐČĐž ŃĐ°ĐčĐ»ŃĐČ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="179"/> + <source>Show file size</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃĐž ŃĐŸĐ·ĐŒŃŃ ŃĐ°ĐčĐ»ŃĐČ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="186"/> + <source>Show file type</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃĐž ŃОпО ŃĐ°ĐčĐ»ŃĐČ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="193"/> + <source>Show date of last modification</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃĐž ĐŽĐ°ŃŃ ĐŸŃŃĐ°ĐœĐœŃĐŸŃ Đ·ĐŒŃĐœĐž</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="200"/> + <source>Show hidden files</source> + <translation>ĐĐŸĐșĐ°Đ·ŃĐČĐ°ŃĐž ĐżŃĐžŃ ĐŸĐČĐ°ĐœŃ ŃĐ°ĐčлО</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="207"/> + <source>Alternating row colors</source> + <translation>ЧДŃĐłŃĐČĐ°ŃĐž ĐșĐŸĐ»ŃŃ ŃŃĐŽĐșŃĐČ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="215"/> + <source>Network</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="221"/> + <source>Use proxy server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="233"/> + <source>Proxy Type:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="244"/> + <source>HttpProxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="249"/> + <source>Socks5Proxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="260"/> + <source>Hostname:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="277"/> + <source>Port:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="294"/> + <source>Username:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="339"/> + <source>Reset to defaults</source> + <translation>ĐŃŃĐ°ĐœĐŸĐČĐžŃĐž ŃŃĐ°ĐœĐŽĐ°ŃŃĐœŃ ĐœĐ°Đ»Đ°ŃŃŃĐČĐ°ĐœĐœŃ</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="362"/> + <source>Export</source> + <translation>ĐĐșŃĐżĐŸŃŃŃĐČĐ°ŃĐž</translation> + </message> + <message> + <location filename="../src/SettingsDialog.ui" line="372"/> + <source>Import</source> + <translation>ĐĐŒĐżĐŸŃŃŃĐČĐ°ŃĐž</translation> + </message> +</context> +<context> + <name>VariablesDockWidget</name> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="36"/> + <source>Workspace</source> + <translation>ĐблаŃŃŃ Đ·ĐŒŃĐœĐœĐžŃ </translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Name</source> + <translation>ĐĐŽĐ”ĐœŃĐžŃŃĐșĐ°ŃĐŸŃ</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Type</source> + <translation>йОп</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="40"/> + <source>Value</source> + <translation>ĐĐœĐ°ŃĐ”ĐœĐœŃ</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="52"/> + <source>Local</source> + <translation>ĐĐŸĐșĐ°Đ»ŃĐœĐ°</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="56"/> + <source>Global</source> + <translation>ĐĐ»ĐŸĐ±Đ°Đ»ŃĐœĐ°</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="60"/> + <source>Persistent</source> + <translation>ĐĄŃĐ°ŃĐžŃĐœĐ°</translation> + </message> + <message> + <location filename="../src/VariablesDockWidget.cpp" line="64"/> + <source>Hidden</source> + <translation>ĐŃĐžŃ ĐŸĐČĐ°ĐœĐ°</translation> + </message> +</context> +</TS>
new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..40b19cb63b244d6e71de31875904fb934d0498a2 GIT binary patch literal 15258 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 A4FCWD
new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cf0fd38174d6901460943a4c7e66039eb95afaae GIT binary patch literal 22733 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 Y1F4`rfN3>^-~a#s07*qoM6N<$f@plx0{{R3
new file mode 100644 --- /dev/null +++ b/gui/media/icons_license @@ -0,0 +1,104 @@ +Icons license for: +chat.png +help_index.png +terminal.png +jabber_protocol.png + +by http://www.everaldo.com/ on 17.07.2011: + +The Crystal Project are released under LGPL. +GNU General Public License. + +This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +The modified work must itself be a software library. +You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. +You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. +If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. + +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + +Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) . +Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. +Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. +If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. +Verify that the user has already received a copy of these materials or that you have already sent this user a copy. +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + +Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. + +Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + +You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +No Warranty + +Because the library is licensed free of charge, there is no warranty for the library, to the extent permitted by applicable law. Except when otherwise stated in writing the copyright holders and/or other parties provide the library "as is" without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the library is with you. Should the library prove defective, you assume the cost of all necessary servicing, repair or correction. + +In no event unless required by applicable law or agreed to in writing will any copyright holder, or any other party who may modify and/or redistribute the library as permitted above, be liable to you for damages, including any general, special, incidental or consequential damages arising out of the use or inability to use the library (including but not limited to loss of data or data being rendered inaccurate or losses sustained by you or third parties or a failure of the library to operate with any other software), even if such holder or other party has been advised of the possibility of such damages.
new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e9fc4a5d7c42135d794836c183ac877465c485d7 GIT binary patch literal 11050 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
new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a10cf826f3342dae72ea3cae5496644da33f694a GIT binary patch literal 9205 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 LNkvXXu0mjf1IW{U
new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a7230e4fc22daeb0d5d71faedee86e1eafe65771 GIT binary patch literal 7757 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
new file mode 100644 --- /dev/null +++ b/gui/src/BrowserWidget.cpp @@ -0,0 +1,105 @@ +/* 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 "BrowserWidget.h" +#include <QVBoxLayout> +#include <QAction> +#include <QStyle> +#include <QApplication> + +BrowserWidget::BrowserWidget (QWidget * parent):QWidget (parent) +{ + construct (); +} + +void +BrowserWidget::construct () +{ + QStyle *style = QApplication::style (); + m_navigationToolBar = new QToolBar (this); + m_webView = new QWebView (this); + m_urlLineEdit = new QLineEdit (this); + m_statusBar = new QStatusBar (this); + m_progressBar = new QProgressBar (this); + m_progressBar->setMaximumWidth (150); + + m_webView->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding); + QAction *backAction = + new QAction (style->standardIcon (QStyle::SP_ArrowLeft), + "", m_navigationToolBar); + QAction *forwardAction = + new QAction (style->standardIcon (QStyle::SP_ArrowRight), + "", m_navigationToolBar); + + m_navigationToolBar->addAction (backAction); + m_navigationToolBar->addAction (forwardAction); + m_navigationToolBar->addWidget (m_urlLineEdit); + + QVBoxLayout *layout = new QVBoxLayout (); + layout->addWidget (m_navigationToolBar); + layout->addWidget (m_webView); + + QWidget *bottomWidget = new QWidget (this); + QHBoxLayout *bottomLineLayout = new QHBoxLayout (); + bottomLineLayout->addWidget (m_progressBar); + bottomLineLayout->addWidget (m_statusBar); + bottomLineLayout->setMargin (0); + bottomWidget->setLayout (bottomLineLayout); + + layout->addWidget (bottomWidget); + layout->setMargin (2); + setLayout (layout); + + connect (backAction, SIGNAL (triggered ()), m_webView, SLOT (back ())); + connect (forwardAction, SIGNAL (triggered ()), m_webView, + SLOT (forward ())); + connect (m_webView, SIGNAL (urlChanged (QUrl)), this, SLOT (setUrl (QUrl))); + connect (m_urlLineEdit, SIGNAL (returnPressed ()), this, + SLOT (jumpToWebsite ())); + + connect (m_webView, SIGNAL (statusBarMessage(QString)), + m_statusBar, SLOT (showMessage(QString))); + connect (m_webView, SIGNAL (loadProgress(int)), + m_progressBar, SLOT (setValue(int))); +} + +void +BrowserWidget::setUrl (QUrl url) +{ + m_urlLineEdit->setText (url.toString ()); +} + +void +BrowserWidget::jumpToWebsite () +{ + QString url = m_urlLineEdit->text (); + if (!url.startsWith ("http://") && !url.startsWith ("https://")) + url = "http://" + url; + load (url); +} + +void +BrowserWidget::showStatusMessage (QString message) +{ + m_statusBar->showMessage (message, 1000); +} + +void +BrowserWidget::load (QUrl url) +{ + m_webView->load (url); +}
new file mode 100644 --- /dev/null +++ b/gui/src/BrowserWidget.h @@ -0,0 +1,50 @@ +/* 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 BROWSERMDISUBWINDOW_H +#define BROWSERMDISUBWINDOW_H + +#include <QWidget> +#include <QToolBar> +#include <QLineEdit> +#include <QtWebKit/QWebView> +#include <QStatusBar> +#include <QProgressBar> + +class BrowserWidget:public QWidget +{ + Q_OBJECT +public: + BrowserWidget (QWidget * parent = 0); + void load (QUrl url); + +public slots: + void setUrl (QUrl url); + void jumpToWebsite (); + void showStatusMessage (QString message); + +private: + void construct (); + + QLineEdit *m_urlLineEdit; + QToolBar *m_navigationToolBar; + QWebView *m_webView; + QStatusBar *m_statusBar; + QProgressBar *m_progressBar; +}; + +#endif // BROWSERMDISUBWINDOW_H
new file mode 100644 --- /dev/null +++ b/gui/src/CommandLineParser.cpp @@ -0,0 +1,47 @@ +/* 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 "CommandLineParser.h" + +CommandLineParser::CommandLineParser () +{ +} + +void +CommandLineParser::registerOption (CommandLineOption commandLineOption) +{ + if (m_registeredCommandLineOptions.contains(commandLineOption)) + m_registeredCommandLineOptions.append(commandLineOption); +} + +void +CommandLineParser::registerOption (QString longOption, QString shortOption, QString description, bool withArgument) +{ + CommandLineOption commandLineOption; + commandLineOption.longOption = longOption; + commandLineOption.shortOption = shortOption; + commandLineOption.description = description; + commandLineOption.withArgument = withArgument; + registerOption (commandLineOption); +} + +void +CommandLineParser::parse (int argc, char** argv) +{ + Q_UNUSED(argc); + Q_UNUSED(argv); +}
new file mode 100644 --- /dev/null +++ b/gui/src/CommandLineParser.h @@ -0,0 +1,50 @@ +/* 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 COMMANDLINEPARSER_H +#define COMMANDLINEPARSER_H + +#include <QList> +#include <QString> + +class CommandLineParser +{ +public: + struct CommandLineOption + { + QString longOption; + QString shortOption; + QString description; + bool withArgument; + + bool operator== (CommandLineOption other) + { + return longOption == other.longOption + || shortOption == other.shortOption; + } + }; + + CommandLineParser (); + void registerOption (CommandLineOption commandLineOption); + void registerOption (QString longOption, QString shortOption, QString description, bool withArgument); + void parse (int argc, char** argv); + +private: + QList<CommandLineOption> m_registeredCommandLineOptions; +}; + +#endif // COMMANDLINEPARSER_H
new file mode 100644 --- /dev/null +++ b/gui/src/FileEditorMdiSubWindow.cpp @@ -0,0 +1,596 @@ +/* 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 "FileEditorMdiSubWindow.h" +#include <QVBoxLayout> +#include <QApplication> +#include <QFile> +#include <QFont> +#include <QFileDialog> +#include <QMessageBox> +#include <QStyle> +#include <QTextStream> + +FileEditorMdiSubWindow::FileEditorMdiSubWindow (QWidget * parent):QMdiSubWindow + (parent) +{ + construct (); +} + +FileEditorMdiSubWindow::~FileEditorMdiSubWindow () +{ +} + +void +FileEditorMdiSubWindow::closeEvent(QCloseEvent *event) +{ + if ( m_mainWindow->isCloseApplication() ) + { + // close wohle application: save file or not if modified + checkFileModified ("Close Octave GUI",0); // no cancel possible + } + else + { + // ignore close event if file is not saved and user cancels closing this window + if (checkFileModified ("Close File",QMessageBox::Cancel)==QMessageBox::Cancel) + event->ignore(); + else + event->accept(); + } +} + +void +FileEditorMdiSubWindow::handleMarginClicked(int margin, int line, Qt::KeyboardModifiers state) +{ + Q_UNUSED (state); + if ( margin == 1 ) // marker margin + { + unsigned int mask = m_editor->markersAtLine (line); + if (mask && (1 << MARKER_BOOKMARK)) + m_editor->markerDelete(line,MARKER_BOOKMARK); + else + m_editor->markerAdd(line,MARKER_BOOKMARK); + } +} + +void +FileEditorMdiSubWindow::newWindowTitle(bool modified) +{ + QString title(m_fileName); + if ( !m_longTitle ) + { + QFileInfo file(m_fileName); + title = file.fileName(); + } + if ( modified ) + { + setWindowTitle(title.prepend("* ")); + } + else + setWindowTitle (title); +} + +void +FileEditorMdiSubWindow::handleCopyAvailable(bool enableCopy) +{ + m_copyAction->setEnabled(enableCopy); + m_cutAction->setEnabled(enableCopy); +} + + +void +FileEditorMdiSubWindow::openFile () +{ + if (checkFileModified ("Open File",QMessageBox::Cancel)==QMessageBox::Cancel) + { + return; // existing file not saved and opening another file canceled by user + } + QString openFileName; + QFileDialog dlg(this); + dlg.setNameFilter(SAVE_FILE_FILTER); + dlg.setAcceptMode(QFileDialog::AcceptOpen); + dlg.setViewMode(QFileDialog::Detail); + if ( dlg.exec() ) + { + openFileName = dlg.selectedFiles().at(0); + if (openFileName.isEmpty ()) + return; + loadFile(openFileName); + } +} + +void +FileEditorMdiSubWindow::loadFile (QString fileName) +{ + QFile file (fileName); + if (!file.open (QFile::ReadOnly)) + { + QMessageBox::warning (this, tr ("File Editor"), + tr ("Cannot read file %1:\n%2.").arg (fileName). + arg (file.errorString ())); + return; + } + + QTextStream in (&file); + QApplication::setOverrideCursor (Qt::WaitCursor); + m_editor->setText (in.readAll ()); + QApplication::restoreOverrideCursor (); + + m_fileName = fileName; + newWindowTitle (false); // window title (no modification) + m_statusBar->showMessage (tr ("File loaded."), 2000); + m_editor->setModified (false); // loaded file is not modified yet +} + +void +FileEditorMdiSubWindow::newFile () +{ + if (checkFileModified ("Create New File",QMessageBox::Cancel)==QMessageBox::Cancel) + { + return; // existing file not saved and creating new file canceled by user + } + m_fileName = UNNAMED_FILE; + newWindowTitle (false); // window title (no modification) + m_editor->setText (""); + m_editor->setModified (false); // new file is not modified yet +} + +int +FileEditorMdiSubWindow::checkFileModified (QString msg, int cancelButton) +{ + int decision = QMessageBox::Yes; + if (m_editor->isModified ()) + { + // file is modified but not saved, aks user what to do + decision = QMessageBox::warning (this, + msg, + tr ("The file %1\n" + "has been modified. Do you want to save the changes?"). + arg (m_fileName), + QMessageBox::Save, QMessageBox::Discard, cancelButton ); + if (decision == QMessageBox::Save) + { + saveFile (); + if (m_editor->isModified ()) + { + // If the user attempted to save the file, but it's still + // modified, then probably something went wrong, so return cancel + // for cancel this operation or try to save files as if cancel not + // possible + if ( cancelButton ) + return (QMessageBox::Cancel); + else + saveFileAs (); + } + } + } + return (decision); +} + +void +FileEditorMdiSubWindow::saveFile () +{ + saveFile(m_fileName); +} + +void +FileEditorMdiSubWindow::saveFile (QString saveFileName) +{ + // it is a new file with the name "<unnamed>" -> call saveFielAs + if (saveFileName==UNNAMED_FILE || saveFileName.isEmpty ()) + { + saveFileAs(); + return; + } + + // open the file for writing + QFile file (saveFileName); + if (!file.open (QFile::WriteOnly)) + { + QMessageBox::warning (this, tr ("File Editor"), + tr ("Cannot write file %1:\n%2."). + arg (saveFileName).arg (file.errorString ())); + return; + } + + // save the contents into the file + QTextStream out (&file); + QApplication::setOverrideCursor (Qt::WaitCursor); + out << m_editor->text (); + QApplication::restoreOverrideCursor (); + m_fileName = saveFileName; // save file name for later use + newWindowTitle(false); // set the window title to actual file name (not modified) + m_statusBar->showMessage (tr ("File %1 saved").arg(m_fileName), 2000); + m_editor->setModified (false); // files is save -> not modified +} + +void +FileEditorMdiSubWindow::saveFileAs () +{ + QString saveFileName(m_fileName); + QFileDialog dlg(this); + if (saveFileName==UNNAMED_FILE || saveFileName.isEmpty ()) + { + saveFileName = QDir::homePath(); + dlg.setDirectory(saveFileName); + } + else + { + dlg.selectFile(saveFileName); + } + dlg.setNameFilter(SAVE_FILE_FILTER); + dlg.setDefaultSuffix("m"); + dlg.setAcceptMode(QFileDialog::AcceptSave); + dlg.setViewMode(QFileDialog::Detail); + if ( dlg.exec() ) + { + saveFileName = dlg.selectedFiles().at(0); + if (saveFileName.isEmpty ()) + return; + saveFile(saveFileName); + } +} + +// handle the run command +void +FileEditorMdiSubWindow::runFile () +{ + if (m_editor->isModified ()) + saveFile(m_fileName); + m_terminalView->sendText (QString ("run \'%1\'\n").arg (m_fileName)); + m_terminalView->setFocus (); +} + + +// (un)comment selected text +void +FileEditorMdiSubWindow::commentSelectedText () +{ + doCommentSelectedText (true); +} +void +FileEditorMdiSubWindow::uncommentSelectedText () +{ + doCommentSelectedText (false); +} +void +FileEditorMdiSubWindow::doCommentSelectedText (bool comment) +{ + if ( m_editor->hasSelectedText() ) + { + int lineFrom, lineTo, colFrom, colTo, i; + m_editor->getSelection (&lineFrom,&colFrom,&lineTo,&colTo); + if ( colTo == 0 ) // the beginning of last line is not selected + lineTo--; // stop at line above + m_editor->beginUndoAction (); + for ( i=lineFrom; i<=lineTo; i++ ) + { + if ( comment ) + m_editor->insertAt("%",i,0); + else + { + QString line(m_editor->text(i)); + if ( line.startsWith("%") ) + { + m_editor->setSelection(i,0,i,1); + m_editor->removeSelectedText(); + } + } + } + m_editor->endUndoAction (); + } +} + + +// remove bookmarks +void +FileEditorMdiSubWindow::removeBookmark () +{ + m_editor->markerDeleteAll(MARKER_BOOKMARK); +} +// toggle bookmark +void +FileEditorMdiSubWindow::toggleBookmark () +{ + int line,cur; + m_editor->getCursorPosition(&line,&cur); + if ( m_editor->markersAtLine (line) && (1 << MARKER_BOOKMARK) ) + m_editor->markerDelete(line,MARKER_BOOKMARK); + else + m_editor->markerAdd(line,MARKER_BOOKMARK); +} +// goto next bookmark +void +FileEditorMdiSubWindow::nextBookmark () +{ + int line,cur,nextline; + m_editor->getCursorPosition(&line,&cur); + if ( m_editor->markersAtLine(line) && (1 << MARKER_BOOKMARK) ) + line++; // we have a bookmark here, so start search from next line + nextline = m_editor->markerFindNext(line,(1 << MARKER_BOOKMARK)); + m_editor->setCursorPosition(nextline,0); +} +// goto previous bookmark +void +FileEditorMdiSubWindow::prevBookmark () +{ + int line,cur,prevline; + m_editor->getCursorPosition(&line,&cur); + if ( m_editor->markersAtLine(line) && (1 << MARKER_BOOKMARK) ) + line--; // we have a bookmark here, so start search from prev line + prevline = m_editor->markerFindPrevious(line,(1 << MARKER_BOOKMARK)); + m_editor->setCursorPosition(prevline,0); +} + +// function for setting the already existing lexer from MainWindow +void +FileEditorMdiSubWindow::initEditor (QTerminal* terminalView, + LexerOctaveGui* lexer, + MainWindow* mainWindow) +{ + m_editor->setLexer(lexer); + m_terminalView = terminalView; // for sending commands to octave + // TODO: make a global commandOctave function? + m_mainWindow = mainWindow; // get the MainWindow for chekcing state at subwindow close +} + +// TODO: Do we still need tool tips in the status bar? Tool tips are now +// shown directly at the theme icons +void +FileEditorMdiSubWindow::showToolTipNew () +{ + m_statusBar->showMessage ("Create a new file", 2000); +} + +void +FileEditorMdiSubWindow::showToolTipOpen () +{ + m_statusBar->showMessage ("Open a file", 2000); +} + +void +FileEditorMdiSubWindow::showToolTipSave () +{ + m_statusBar->showMessage ("Save the file", 2000); +} + +void +FileEditorMdiSubWindow::showToolTipSaveAs () +{ + m_statusBar->showMessage ("Save the file as", 2000); +} + +void +FileEditorMdiSubWindow::showToolTipUndo () +{ + m_statusBar->showMessage ("Revert previous changes", 2000); +} + +void +FileEditorMdiSubWindow::showToolTipRedo () +{ + m_statusBar->showMessage ("Append previous changes", 2000); +} + +void +FileEditorMdiSubWindow::registerModified (bool modified) +{ + m_modified = modified; +} + +void +FileEditorMdiSubWindow::construct () +{ + QSettings *settings = ResourceManager::instance ()->settings (); + QStyle *style = QApplication::style (); + setWidget (new QWidget ()); + + m_menuBar = new QMenuBar (this); + m_toolBar = new QToolBar (this); + m_statusBar = new QStatusBar (this); + m_editor = new QsciScintilla (this); + + // markers + m_editor->setMarginType (1, QsciScintilla::SymbolMargin); + m_editor->setMarginSensitivity(1,true); + m_editor->markerDefine(QsciScintilla::RightTriangle,MARKER_BOOKMARK); + connect(m_editor,SIGNAL(marginClicked(int,int,Qt::KeyboardModifiers)), + this,SLOT(handleMarginClicked(int,int,Qt::KeyboardModifiers))); + + // line numbers + m_editor->setMarginsForegroundColor(QColor(96,96,96)); + m_editor->setMarginsBackgroundColor(QColor(232,232,220)); + if ( settings->value ("editor/showLineNumbers",true).toBool () ) + { + QFont marginFont( settings->value ("editor/fontName","Courier").toString () , + settings->value ("editor/fontSize",10).toInt () ); + m_editor->setMarginsFont( marginFont ); + QFontMetrics metrics(marginFont); + m_editor->setMarginType (2, QsciScintilla::TextMargin); + m_editor->setMarginWidth(2, metrics.width("99999")); + m_editor->setMarginLineNumbers(2, true); + } + // code folding + m_editor->setMarginType (3, QsciScintilla::SymbolMargin); + m_editor->setFolding (QsciScintilla::BoxedTreeFoldStyle , 3); + // other features + if ( settings->value ("editor/highlightCurrentLine",true).toBool () ) + { + m_editor->setCaretLineVisible(true); + m_editor->setCaretLineBackgroundColor(QColor(245,245,245)); + } + m_editor->setBraceMatching (QsciScintilla::StrictBraceMatch); + m_editor->setAutoIndent (true); + m_editor->setIndentationWidth (2); + m_editor->setIndentationsUseTabs (false); + if ( settings->value ("editor/codeCompletion",true).toBool () ) + { + m_editor->autoCompleteFromAll (); + m_editor->setAutoCompletionSource(QsciScintilla::AcsAll); + m_editor->setAutoCompletionThreshold (1); + } + m_editor->setUtf8 (true); + m_longTitle = settings->value ("editor/longWindowTitle",true).toBool (); + + // The Actions + + // Theme icons with QStyle icons as fallback + QAction *closeAction = new QAction ( + QIcon::fromTheme("window-close",style->standardIcon (QStyle::SP_DialogCloseButton)), + tr("&Close File"), m_toolBar); + 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); + connect(m_editor,SIGNAL(copyAvailable(bool)),this,SLOT(handleCopyAvailable(bool))); + + // 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->setIconSize(QSize(16,16)); // smaller icons (make configurable in user settings?) + m_toolBar->addAction (closeAction); + 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(); + fileMenu->addAction (closeAction); + 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_editor); + layout->addWidget (m_statusBar); + layout->setMargin (2); + widget ()->setLayout (layout); + + connect (closeAction, SIGNAL (triggered()), this, SLOT (close())); + connect (newAction, SIGNAL (triggered ()), this, SLOT (newFile ())); + connect (openAction, SIGNAL (triggered ()), this, SLOT (openFile ())); + connect (undoAction, SIGNAL (triggered ()), m_editor, SLOT (undo ())); + connect (redoAction, SIGNAL (triggered ()), m_editor, SLOT (redo ())); + connect (m_copyAction, SIGNAL (triggered ()), m_editor, SLOT (copy ())); + connect (m_cutAction, SIGNAL (triggered ()), m_editor, SLOT (cut ())); + connect (pasteAction, SIGNAL (triggered ()), m_editor, SLOT (paste ())); + connect (saveAction, SIGNAL (triggered ()), this, SLOT (saveFile ())); + connect (saveAsAction, SIGNAL (triggered ()), this, SLOT (saveFileAs ())); + connect (runAction, SIGNAL (triggered ()), this, SLOT (runFile ())); + connect (toggleBookmarkAction, SIGNAL (triggered ()), this, SLOT (toggleBookmark ())); + connect (nextBookmarkAction, SIGNAL (triggered ()), this, SLOT (nextBookmark ())); + connect (prevBookmarkAction, SIGNAL (triggered ()), this, SLOT (prevBookmark ())); + connect (removeBookmarkAction, SIGNAL (triggered ()), this, SLOT (removeBookmark ())); + connect (commentSelectedAction, SIGNAL (triggered ()), this, SLOT (commentSelectedText ())); + connect (uncommentSelectedAction, SIGNAL (triggered ()), this, SLOT (uncommentSelectedText ())); + + // TODO: Do we still need tool tips in the status bar? Tool tips are now + // shown directly at the theme icons + connect (newAction, SIGNAL (hovered ()), this, SLOT (showToolTipNew ())); + connect (openAction, SIGNAL (hovered ()), this, SLOT (showToolTipOpen ())); + connect (undoAction, SIGNAL (hovered ()), this, SLOT (showToolTipUndo ())); + connect (redoAction, SIGNAL (hovered ()), this, SLOT (showToolTipRedo ())); + connect (saveAction, SIGNAL (hovered ()), this, SLOT (showToolTipSave ())); + connect (saveAsAction, SIGNAL (hovered ()), this,SLOT (showToolTipSaveAs ())); + + // connect modified signal + connect (m_editor, SIGNAL (modificationChanged(bool)), this, SLOT (newWindowTitle(bool)) ); + + m_fileName = ""; + newWindowTitle (false); + setWindowIcon(QIcon::fromTheme("accessories-text-editor",style->standardIcon (QStyle::SP_FileIcon))); + show (); +}
new file mode 100644 --- /dev/null +++ b/gui/src/FileEditorMdiSubWindow.h @@ -0,0 +1,105 @@ +/* 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 FILEEDITORMDISUBWINDOW_H +#define FILEEDITORMDISUBWINDOW_H + +#include "MainWindow.h" + +#include <QMdiSubWindow> +#include <QToolBar> +#include <QAction> +#include <QMenuBar> +#include <QStatusBar> +#include <QCloseEvent> +#include <Qsci/qsciscintilla.h> +// Not available in the Debian repos yet! +// #include <Qsci/qscilexeroctave.h> +#include "lexer/lexeroctavegui.h" + +const char UNNAMED_FILE[] = "<unnamed>"; +const char SAVE_FILE_FILTER[] = "Octave Files (*.m);;All Files (*.*)"; +enum MARKER + { + MARKER_BOOKMARK, + MARKER_BREAKPOINT + }; + +class FileEditorMdiSubWindow:public QMdiSubWindow +{ +Q_OBJECT + +public: + FileEditorMdiSubWindow (QWidget * parent = 0); + ~FileEditorMdiSubWindow (); + void loadFile (QString fileName); + void initEditor (QTerminal *terminalView, + LexerOctaveGui *lexer, + MainWindow *mainWindow); + +public slots: + + void newFile (); + void openFile (); + void saveFile (); + void saveFile (QString fileName); + void saveFileAs (); + + void showToolTipNew (); + void showToolTipOpen (); + void showToolTipSave (); + void showToolTipSaveAs (); + void showToolTipUndo (); + void showToolTipRedo (); + void registerModified (bool modified); + +protected: + void closeEvent(QCloseEvent *event); + +private: + int checkFileModified (QString msg, int cancelButton); + void construct (); + void doCommentSelectedText (bool comment); + QMenuBar *m_menuBar; + QToolBar *m_toolBar; + QsciScintilla *m_editor; + QStatusBar *m_statusBar; + QString m_fileName; + QString m_fileNameShort; + QTerminal* m_terminalView; + QAction* m_copyAction; + QAction* m_cutAction; + MainWindow* m_mainWindow; + int m_markerBookmark; + bool m_modified; + bool m_longTitle; + +private slots: + void newWindowTitle(bool modified); + void handleMarginClicked(int line, int margin, Qt::KeyboardModifiers state); + void handleCopyAvailable(bool enableCopy); + void runFile(); + void removeBookmark (); + void toggleBookmark (); + void nextBookmark(); + void prevBookmark(); + void commentSelectedText(); + void uncommentSelectedText(); + +}; + +#endif // FILEEDITORMDISUBWINDOW_H
new file mode 100644 --- /dev/null +++ b/gui/src/FilesDockWidget.cpp @@ -0,0 +1,198 @@ +/* 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 "ResourceManager.h" +#include "FilesDockWidget.h" + +#include <QApplication> +#include <QFileInfo> +#include <QCompleter> +#include <QSettings> +#include <QProcess> +#include <QDebug> + +FilesDockWidget::FilesDockWidget (QWidget * parent):QDockWidget (parent) +{ + setObjectName ("FilesDockWidget"); + setWindowTitle (tr ("Current Directory")); + setWidget (new QWidget (this)); + + // Create a toolbar + m_navigationToolBar = new QToolBar ("", widget ()); + m_navigationToolBar->setAllowedAreas (Qt::TopToolBarArea); + m_navigationToolBar->setMovable (false); + m_navigationToolBar->setIconSize (QSize (20, 20)); + + // Add a button to the toolbar with the QT standard icon for up-directory + // TODO: Maybe change this to be an up-directory icon that is OS specific??? + QStyle *style = QApplication::style (); + m_directoryIcon = style->standardIcon (QStyle::SP_FileDialogToParent); + m_directoryUpAction = new QAction (m_directoryIcon, "", m_navigationToolBar); + m_directoryUpAction->setStatusTip (tr ("Move up one directory.")); + + m_currentDirectory = new QLineEdit (m_navigationToolBar); + m_currentDirectory->setStatusTip (tr ("Enter the path or filename.")); + + m_navigationToolBar->addAction (m_directoryUpAction); + m_navigationToolBar->addWidget (m_currentDirectory); + connect (m_directoryUpAction, SIGNAL (triggered ()), this, + SLOT (onUpDirectory ())); + + // TODO: Add other buttons for creating directories + + // Create the QFileSystemModel starting in the home directory + QString + homePath = QDir::homePath (); + // TODO: This should occur after Octave has been initialized and the startup directory of Octave is established + + m_fileSystemModel = new QFileSystemModel (this); + m_fileSystemModel->setFilter (QDir::NoDotAndDotDot | QDir::AllEntries); + QModelIndex + rootPathIndex = m_fileSystemModel->setRootPath (homePath); + + // Attach the model to the QTreeView and set the root index + m_fileTreeView = new QTreeView (widget ()); + m_fileTreeView->setModel (m_fileSystemModel); + m_fileTreeView->setRootIndex (rootPathIndex); + m_fileTreeView->setSortingEnabled (true); + m_fileTreeView->setAlternatingRowColors (true); + m_fileTreeView->setAnimated (true); + m_fileTreeView->setColumnHidden (1, true); + m_fileTreeView->setColumnHidden (2, true); + m_fileTreeView->setColumnHidden (3, true); + m_fileTreeView->setStatusTip (tr ("Doubleclick a file to open it.")); + + setCurrentDirectory (m_fileSystemModel->fileInfo (rootPathIndex). + absoluteFilePath ()); + + connect (m_fileTreeView, SIGNAL (doubleClicked (const QModelIndex &)), this, + SLOT (itemDoubleClicked (const QModelIndex &))); + + // Layout the widgets vertically with the toolbar on top + QVBoxLayout * + layout = new QVBoxLayout (); + layout->setSpacing (0); + layout->addWidget (m_navigationToolBar); + layout->addWidget (m_fileTreeView); + layout->setMargin (1); + widget ()->setLayout (layout); + // TODO: Add right-click contextual menus for copying, pasting, deleting files (and others) + + connect (m_currentDirectory, SIGNAL (returnPressed ()), this, + SLOT (currentDirectoryEntered ())); + QCompleter * + completer = new QCompleter (m_fileSystemModel, this); + m_currentDirectory->setCompleter (completer); + + connect (this, SIGNAL (visibilityChanged(bool)), this, SLOT(handleVisibilityChanged(bool))); +} + +void +FilesDockWidget::itemDoubleClicked (const QModelIndex & index) +{ + // Retrieve the file info associated with the model index. + QFileInfo fileInfo = m_fileSystemModel->fileInfo (index); + + // If it is a directory, cd into it. + if (fileInfo.isDir ()) + { + m_fileSystemModel->setRootPath (fileInfo.absolutePath ()); + m_fileTreeView->setRootIndex (index); + setCurrentDirectory (m_fileSystemModel->fileInfo (index). + absoluteFilePath ()); + } + // Otherwise attempt to open it. + else + { + // Check if the user wants to use a custom file editor. + QSettings *settings = ResourceManager::instance ()->settings (); + if (settings->value ("useCustomFileEditor").toBool ()) + { + QString editor = settings->value ("customFileEditor").toString (); + QStringList arguments; + arguments << fileInfo.filePath (); + QProcess::execute (editor, arguments); + } + else + { + emit openFile (fileInfo.filePath ()); + } + } +} + +void +FilesDockWidget::setCurrentDirectory (QString currentDirectory) +{ + m_currentDirectory->setText (currentDirectory); +} + +void +FilesDockWidget::onUpDirectory (void) +{ + QDir dir = + QDir (m_fileSystemModel->filePath (m_fileTreeView->rootIndex ())); + dir.cdUp (); + m_fileSystemModel->setRootPath (dir.absolutePath ()); + m_fileTreeView->setRootIndex (m_fileSystemModel-> + index (dir.absolutePath ())); + setCurrentDirectory (dir.absolutePath ()); +} + +void +FilesDockWidget::currentDirectoryEntered () +{ + QFileInfo fileInfo (m_currentDirectory->text ()); + if (fileInfo.isDir ()) + { + m_fileTreeView->setRootIndex (m_fileSystemModel-> + index (fileInfo.absolutePath ())); + m_fileSystemModel->setRootPath (fileInfo.absolutePath ()); + setCurrentDirectory (fileInfo.absoluteFilePath ()); + } + else + { + if (QFile::exists (fileInfo.absoluteFilePath ())) + emit openFile (fileInfo.absoluteFilePath ()); + } +} + +void +FilesDockWidget::noticeSettings () +{ + QSettings *settings = ResourceManager::instance ()->settings (); + m_fileTreeView->setColumnHidden (0, !settings->value ("showFilenames").toBool ()); + m_fileTreeView->setColumnHidden (1, !settings->value ("showFileSize").toBool ()); + m_fileTreeView->setColumnHidden (2, !settings->value ("showFileType").toBool ()); + m_fileTreeView->setColumnHidden (3, !settings->value ("showLastModified").toBool ()); + m_fileTreeView->setAlternatingRowColors (settings->value ("useAlternatingRowColors").toBool ()); + //if (settings.value ("showHiddenFiles").toBool ()) + // TODO: React on option for hidden files. +} + +void +FilesDockWidget::handleVisibilityChanged (bool visible) +{ + if (visible) + emit activeChanged (true); +} + +void +FilesDockWidget::closeEvent (QCloseEvent *event) +{ + emit activeChanged (false); + QDockWidget::closeEvent (event); +}
new file mode 100644 --- /dev/null +++ b/gui/src/FilesDockWidget.h @@ -0,0 +1,85 @@ +/* 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 FILESDOCKWIDGET_H +#define FILESDOCKWIDGET_H + +#include <QListView> +#include <QDate> +#include <QObject> +#include <QWidget> +#include <QListWidget> +#include <QFileSystemModel> +#include <QToolBar> +#include <QToolButton> +#include <QVBoxLayout> +#include <QAction> +#include <QTreeView> + +#include <QDockWidget> +#include <QLineEdit> + +class FilesDockWidget:public QDockWidget +{ + Q_OBJECT +public: + FilesDockWidget (QWidget * parent = 0); + +public slots: + /** Slot for handling a change in directory via double click. */ + void itemDoubleClicked (const QModelIndex & index); + + /** Slot for handling the up-directory button in the toolbar. */ + void onUpDirectory (); + + void setCurrentDirectory (QString currentDirectory); + + void currentDirectoryEntered (); + + /** Tells the widget to notice settings that are probably new. */ + void noticeSettings (); + void handleVisibilityChanged (bool visible); + +signals: + void openFile (QString fileName); + + /** Custom signal that tells if a user has clicke away that dock widget. */ + void activeChanged (bool active); + +protected: + void closeEvent (QCloseEvent *event); + +private: + // TODO: Add toolbar with buttons for navigating the path, creating dirs, etc + + /** Toolbar for file and directory manipulation. */ + QToolBar * m_navigationToolBar; + + /** Variables for the up-directory action. */ + QIcon m_directoryIcon; + QAction *m_directoryUpAction; + QToolButton *upDirectoryButton; + + /** The file system model. */ + QFileSystemModel *m_fileSystemModel; + + /** The file system view. */ + QTreeView *m_fileTreeView; + QLineEdit *m_currentDirectory; +}; + +#endif // FILESDOCKWIDGET_H
new file mode 100644 --- /dev/null +++ b/gui/src/HistoryDockWidget.cpp @@ -0,0 +1,72 @@ +/* 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 "HistoryDockWidget.h" +#include <QVBoxLayout> + +HistoryDockWidget::HistoryDockWidget (QWidget * parent):QDockWidget (parent) +{ + setObjectName ("HistoryDockWidget"); + construct (); +} + +void +HistoryDockWidget::construct () +{ + m_sortFilterProxyModel.setSourceModel(OctaveLink::instance ()->historyModel()); + m_historyListView = new QListView (this); + m_historyListView->setModel (&m_sortFilterProxyModel); + m_historyListView->setAlternatingRowColors (true); + m_historyListView->setEditTriggers (QAbstractItemView::NoEditTriggers); + m_historyListView->setStatusTip (tr ("Doubleclick a command to transfer it to the terminal.")); + m_filterLineEdit = new QLineEdit (this); + m_filterLineEdit->setStatusTip (tr ("Enter text to filter the command history.")); + QVBoxLayout *layout = new QVBoxLayout (); + + setWindowTitle (tr ("Command History")); + setWidget (new QWidget ()); + + layout->addWidget (m_historyListView); + layout->addWidget (m_filterLineEdit); + layout->setMargin (2); + + widget ()->setLayout (layout); + + connect (m_filterLineEdit, SIGNAL (textEdited (QString)), &m_sortFilterProxyModel, SLOT (setFilterWildcard(QString))); + connect (m_historyListView, SIGNAL (doubleClicked (QModelIndex)), this, SLOT (handleDoubleClick (QModelIndex))); + connect (this, SIGNAL (visibilityChanged(bool)), this, SLOT(handleVisibilityChanged(bool))); +} + +void +HistoryDockWidget::handleDoubleClick (QModelIndex modelIndex) +{ + emit commandDoubleClicked (modelIndex.data().toString()); +} + +void +HistoryDockWidget::handleVisibilityChanged (bool visible) +{ + if (visible) + emit activeChanged (true); +} + +void +HistoryDockWidget::closeEvent (QCloseEvent *event) +{ + emit activeChanged (false); + QDockWidget::closeEvent (event); +}
new file mode 100644 --- /dev/null +++ b/gui/src/HistoryDockWidget.h @@ -0,0 +1,54 @@ +/* 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 HISTORYDOCKWIDGET_H +#define HISTORYDOCKWIDGET_H + +#include <QDockWidget> +#include <QLineEdit> +#include <QListView> +#include <QSortFilterProxyModel> +#include "OctaveLink.h" + +class HistoryDockWidget:public QDockWidget +{ +Q_OBJECT +public: + HistoryDockWidget (QWidget *parent = 0); + void updateHistory (QStringList history); + +public slots: + void handleVisibilityChanged (bool visible); + +signals: + void information (QString message); + void commandDoubleClicked (QString command); + /** Custom signal that tells if a user has clicked away that dock widget. */ + void activeChanged (bool active); +protected: + void closeEvent (QCloseEvent *event); +private slots: + void handleDoubleClick (QModelIndex modelIndex); + +private: + void construct (); + QListView *m_historyListView; + QLineEdit *m_filterLineEdit; + QSortFilterProxyModel m_sortFilterProxyModel; +}; + +#endif // HISTORYDOCKWIDGET_H
new file mode 100644 --- /dev/null +++ b/gui/src/MainWindow.cpp @@ -0,0 +1,396 @@ +/* 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 <QMenuBar> +#include <QMenu> +#include <QAction> +#include <QSettings> +#include <QDesktopServices> +#include <QFileDialog> +#include <QMessageBox> +#include "MainWindow.h" +#include "FileEditorMdiSubWindow.h" +#include "SettingsDialog.h" + +#define VERSION_STRING "Octave GUI (0.8.8)" + +MainWindow::MainWindow (QWidget * parent):QMainWindow (parent) +{ + construct (); + OctaveLink::instance ()->launchOctave(); +} + +MainWindow::~MainWindow () +{ +} + +void +MainWindow::handleOpenFileRequest (QString fileName) +{ + reportStatusMessage (tr ("Opening file.")); + QPixmap pixmap; + if (pixmap.load (fileName)) + { +// ImageViewerMdiSubWindow *subWindow = new ImageViewerMdiSubWindow(pixmap, this); +// subWindow->setAttribute(Qt::WA_DeleteOnClose); +// m_centralMdiArea->addSubWindow(subWindow); +// subWindow->setWindowTitle(fileName); + } + else + { + openEditorFile(fileName); + } +} + +void +MainWindow::openEditor () +{ + openEditorFile(QString()); +} +void +MainWindow::openEditorFile (QString fileName) +{ + FileEditorMdiSubWindow *subWindow = new FileEditorMdiSubWindow (m_centralMdiArea); + subWindow->setAttribute (Qt::WA_DeleteOnClose); + // check whether lexer is already prepared and prepare it if not + if ( m_lexer == NULL ) + { + // this has to be done only once, not for each editor + m_lexer = new LexerOctaveGui(); + // Editor font (default or from settings) + QSettings *settings = ResourceManager::instance ()->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 + } + subWindow->initEditor(m_terminalView, m_lexer, this); // init necessary informations for editor + + if ( fileName.isEmpty() ) + subWindow->newFile (); + else + subWindow->loadFile (fileName); +} + + +void +MainWindow::reportStatusMessage (QString statusMessage) +{ + m_statusBar->showMessage (statusMessage, 1000); +} + +void +MainWindow::openWebPage (QString url) +{ + m_documentationWidget->load (QUrl (url)); +} + +void +MainWindow::openChat () +{ + if (!m_ircWidget) + { + m_ircWidget = new QIRCWidget (); + m_ircWidget->setWindowTitle ("Chat"); + m_ircWidget->connectToServer ("irc.freenode.net", "Octave-GUI-User", "#octave"); + } + + if (!m_ircWidget->isVisible ()) + { + m_ircWidget->setVisible (true); + m_ircWidget->raise (); + } +} + +void +MainWindow::handleSaveWorkspaceRequest () +{ + QString selectedFile = + QFileDialog::getSaveFileName (this, tr ("Save Workspace"), + ResourceManager::instance ()->homePath ()); + m_terminalView->sendText (QString ("save \'%1\'\n").arg (selectedFile)); + m_terminalView->setFocus (); +} + +void +MainWindow::handleLoadWorkspaceRequest () +{ + QString selectedFile = + QFileDialog::getOpenFileName (this, tr ("Load Workspace"), + ResourceManager::instance ()->homePath ()); + m_terminalView->sendText (QString ("load \'%1\'\n").arg (selectedFile)); + m_terminalView->setFocus (); +} + +void +MainWindow::handleClearWorkspaceRequest () +{ + m_terminalView->sendText ("clear\n"); + m_terminalView->setFocus (); +} + +void +MainWindow::handleCommandDoubleClicked (QString command) +{ + m_terminalView->sendText(command); + m_terminalView->setFocus (); +} + +void +MainWindow::alignMdiWindows () +{ + m_centralMdiArea->tileSubWindows (); +} + +void +MainWindow::openBugTrackerPage () +{ + QDesktopServices::openUrl (QUrl ("http://savannah.gnu.org/bugs/?group=octave")); +} + +void +MainWindow::openAgoraPage () +{ + QDesktopServices::openUrl (QUrl ("http://agora.panocha.org.mx/")); +} + +void +MainWindow::openOctaveForgePage () +{ + QDesktopServices::openUrl (QUrl ("http://octave.sourceforge.net/")); +} + +void +MainWindow::processSettingsDialogRequest () +{ + SettingsDialog settingsDialog (this); + settingsDialog.exec (); + emit settingsChanged (); + ResourceManager::instance ()->updateNetworkSettings (); +} + +void +MainWindow::showAboutOctave () +{ + QString message = + "GNU Octave\n" + "Copyright (C) 2009 John W. Eaton and others.\n" + "This is free software; see the source code for copying conditions." + "There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or" + "FITNESS FOR A PARTICULAR PURPOSE. For details, type `warranty'.\n" + "\n" + "Octave was configured for \"x86_64-pc-linux-gnu\".\n" + "\n" + "Additional information about Octave is available at http://www.octave.org.\n" + "\n" + "Please contribute if you find this software useful." + "For more information, visit http://www.octave.org/help-wanted.html\n" + "\n" + "Report bugs to <bug@octave.org> (but first, please read" + "http://www.octave.org/bugs.html to learn how to write a helpful report).\n" + "\n" + "For information about changes from previous versions, type `news'.\n"; + + QMessageBox::about (this, tr ("About Octave"), message); +} + +void +MainWindow::showAboutQt () +{ + QMessageBox::aboutQt (this); +} + +void +MainWindow::closeEvent (QCloseEvent * closeEvent) +{ + reportStatusMessage (tr ("Saving data and shutting down.")); + writeSettings (); + m_closeApplication = true; // inform editor window that whole application is closed + OctaveLink::instance ()->terminateOctave(); + m_centralMdiArea->closeAllSubWindows(); // send close events to subwindows + // (editor files can be saved!) + QMainWindow::closeEvent (closeEvent); +} + +void +MainWindow::readSettings () +{ + QSettings *settings = ResourceManager::instance ()->settings (); + restoreGeometry (settings->value ("MainWindow/geometry").toByteArray ()); + restoreState (settings->value ("MainWindow/windowState").toByteArray ()); + m_centralMdiArea->restoreGeometry (settings->value ("MdiArea/geometry").toByteArray ()); + emit settingsChanged (); +} + +void +MainWindow::writeSettings () +{ + QSettings *settings = ResourceManager::instance ()->settings (); + settings->setValue ("MainWindow/geometry", saveGeometry ()); + settings->setValue ("MainWindow/windowState", saveState ()); + settings->setValue ("MdiArea/geometry", m_centralMdiArea->saveGeometry ()); +} + +void +MainWindow::construct () +{ + m_closeApplication = false; // flag for editor files when closed + setWindowIcon (ResourceManager::instance ()->icon (ResourceManager::Octave)); + + m_ircWidget = 0; + + // Initialize MDI area. + m_centralMdiArea = new QMdiArea (this); + m_centralMdiArea->setObjectName ("CentralMdiArea"); + m_centralMdiArea->setViewMode (QMdiArea::TabbedView); + + // Setup dockable widgets and the status bar. + m_workspaceView = new WorkspaceView (this); + m_workspaceView->setStatusTip (tr ("View the variables in the active workspace.")); + m_historyDockWidget = new HistoryDockWidget (this); + m_historyDockWidget->setStatusTip (tr ("Browse and search the command history.")); + m_filesDockWidget = new FilesDockWidget (this); + m_filesDockWidget->setStatusTip (tr ("Browse your files.")); + m_statusBar = new QStatusBar (this); + + // Documentation subwindow. + m_documentationWidget = new BrowserWidget (this); + m_documentationWidgetSubWindow = new NonClosableMdiSubWindow (this); + m_documentationWidgetSubWindow->setWidget (m_documentationWidget); + m_centralMdiArea->addSubWindow (m_documentationWidgetSubWindow, Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint); + + m_documentationWidgetSubWindow->setObjectName ("DocumentationWidgetSubWindow"); + m_documentationWidgetSubWindow->setWindowTitle (tr ("Documentation")); + m_documentationWidgetSubWindow + ->setWindowIcon (ResourceManager::instance ()->icon (ResourceManager::Documentation)); + m_documentationWidgetSubWindow->setFocusProxy (m_documentationWidget); + m_documentationWidgetSubWindow->setStatusTip (tr ("Browse the Octave documentation for help.")); + m_documentationWidgetSubWindow->setMinimumSize (300, 300); + + // Octave Terminal subwindow. + m_terminalView = new QTerminal(this); + m_terminalViewSubWindow = new NonClosableMdiSubWindow (this); + m_terminalViewSubWindow->setWidget (m_terminalView); + m_centralMdiArea->addSubWindow (m_terminalViewSubWindow, Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint); + + m_terminalViewSubWindow->setObjectName ("OctaveTerminalSubWindow"); + m_terminalViewSubWindow->setWindowTitle (tr ("Terminal")); + m_terminalViewSubWindow + ->setWindowIcon (ResourceManager::instance ()->icon (ResourceManager::Terminal)); + m_terminalViewSubWindow->setFocusProxy (m_terminalView); + m_terminalViewSubWindow->setStatusTip (tr ("Enter your commands into the Octave terminal.")); + m_terminalViewSubWindow->setMinimumSize (300, 300); + + m_lexer = NULL; // initialise the empty lexer for the edtiors + + QMenu *controlMenu = menuBar ()->addMenu (tr ("Octave")); + QAction *settingsAction = controlMenu->addAction (tr ("Settings")); + controlMenu->addSeparator (); + QAction *exitAction = controlMenu->addAction (tr ("Exit")); + + QMenu *interfaceMenu = menuBar ()->addMenu (tr ("Interface")); + + QAction *alignWindowsAction = interfaceMenu->addAction (tr ("Align Windows")); + interfaceMenu->addSeparator (); + QAction *showWorkspaceAction = interfaceMenu->addAction (tr ("Workspace")); + showWorkspaceAction->setCheckable (true); + + QAction *showHistoryAction = interfaceMenu->addAction (tr ("History")); + showHistoryAction->setCheckable (true); + + QAction *showFileBrowserAction = interfaceMenu->addAction (tr ("File Browser")); + showFileBrowserAction->setCheckable (true); + + interfaceMenu->addSeparator (); + QAction *openEditorAction = interfaceMenu->addAction (tr ("Open New Editor Window")); + + QMenu *workspaceMenu = menuBar ()->addMenu (tr ("Workspace")); + QAction *loadWorkspaceAction = workspaceMenu->addAction (tr ("Load")); + QAction *saveWorkspaceAction = workspaceMenu->addAction (tr ("Save")); + workspaceMenu->addSeparator (); + QAction *clearWorkspaceAction = workspaceMenu->addAction (tr ("Clear")); + + QMenu *communityMenu = menuBar ()->addMenu (tr ("Community")); + QAction *openChatAction = communityMenu->addAction (tr ("Chat")); + communityMenu->addSeparator(); + QAction *reportBugAction = communityMenu->addAction (tr ("Report Bug")); + QAction *agoraAction = communityMenu->addAction (tr ("Agora")); + QAction *octaveForgeAction = communityMenu->addAction (tr ("Octave Forge")); + communityMenu->addSeparator (); + QAction *aboutOctaveAction = communityMenu->addAction (tr ("About Octave")); + QAction *aboutQt = communityMenu->addAction (tr ("About Qt")); + + connect (settingsAction, SIGNAL (triggered ()), this, SLOT (processSettingsDialogRequest ())); + connect (exitAction, SIGNAL (triggered ()), this, SLOT (close ())); + connect (alignWindowsAction, SIGNAL (triggered ()), this, SLOT (alignMdiWindows ())); + connect (openEditorAction, SIGNAL (triggered ()), this, SLOT (openEditor ())); + connect (openChatAction, SIGNAL (triggered ()), this, SLOT (openChat ())); + connect (reportBugAction, SIGNAL (triggered ()), this, SLOT (openBugTrackerPage ())); + connect (agoraAction, SIGNAL (triggered ()), this, SLOT (openAgoraPage ())); + connect (octaveForgeAction, SIGNAL (triggered ()), this, SLOT (openOctaveForgePage ())); + connect (aboutOctaveAction, SIGNAL (triggered ()), this, SLOT (showAboutOctave ())); + connect (aboutQt, SIGNAL (triggered ()), this, SLOT (showAboutQt ())); + + connect (showWorkspaceAction, SIGNAL (toggled (bool)), m_workspaceView, SLOT (setShown (bool))); + connect (m_workspaceView, SIGNAL (activeChanged (bool)), showWorkspaceAction, SLOT (setChecked (bool))); + connect (showHistoryAction, SIGNAL (toggled (bool)), m_historyDockWidget, SLOT (setShown (bool))); + connect (m_historyDockWidget, SIGNAL (activeChanged (bool)), showHistoryAction, SLOT (setChecked (bool))); + connect (showFileBrowserAction, SIGNAL (toggled (bool)), m_filesDockWidget, SLOT (setShown (bool))); + connect (m_filesDockWidget, SIGNAL (activeChanged (bool)), showFileBrowserAction, SLOT (setChecked (bool))); + + //connect (this, SIGNAL (settingsChanged ()), m_workspaceView, SLOT (noticeSettings ())); + //connect (this, SIGNAL (settingsChanged ()), m_historyDockWidget, SLOT (noticeSettings ())); + connect (this, SIGNAL (settingsChanged ()), m_filesDockWidget, SLOT (noticeSettings ())); + + connect (m_filesDockWidget, SIGNAL (openFile (QString)), this, SLOT (handleOpenFileRequest (QString))); + connect (m_historyDockWidget, SIGNAL (information (QString)), this, SLOT (reportStatusMessage (QString))); + connect (m_historyDockWidget, SIGNAL (commandDoubleClicked (QString)), this, SLOT (handleCommandDoubleClicked (QString))); + connect (saveWorkspaceAction, SIGNAL (triggered ()), this, SLOT (handleSaveWorkspaceRequest ())); + connect (loadWorkspaceAction, SIGNAL (triggered ()), this, SLOT (handleLoadWorkspaceRequest ())); + connect (clearWorkspaceAction, SIGNAL (triggered ()), this, SLOT (handleClearWorkspaceRequest ())); + + setWindowTitle (QString (VERSION_STRING)); + + setCentralWidget (m_centralMdiArea); + addDockWidget (Qt::LeftDockWidgetArea, m_workspaceView); + addDockWidget (Qt::LeftDockWidgetArea, m_historyDockWidget); + addDockWidget (Qt::RightDockWidgetArea, m_filesDockWidget); + setStatusBar (m_statusBar); + + readSettings (); + openWebPage ("http://www.gnu.org/software/octave/doc/interpreter/"); +} +
new file mode 100644 --- /dev/null +++ b/gui/src/MainWindow.h @@ -0,0 +1,140 @@ +/* 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 <Qsci/qsciapis.h> +#include <QMdiSubWindow> +#include <QCloseEvent> +#include "ResourceManager.h" +#include "OctaveLink.h" +#include "WorkspaceView.h" +#include "HistoryDockWidget.h" +#include "FilesDockWidget.h" +#include "BrowserWidget.h" +#include "lexer/lexeroctavegui.h" +#include "QTerminal.h" +#include "QIRCWidget.h" + +class NonClosableMdiSubWindow : public QMdiSubWindow +{ + Q_OBJECT +public: + explicit NonClosableMdiSubWindow (QWidget *parent = 0) + : QMdiSubWindow (parent) { } + virtual ~NonClosableMdiSubWindow () { } +protected: + void closeEvent (QCloseEvent *closeEvent) + { + closeEvent->ignore (); + } +}; + +/** + * \class MainWindow + * + * Represents the main window. + */ +class MainWindow:public QMainWindow +{ +Q_OBJECT public: + MainWindow (QWidget * parent = 0); + ~MainWindow (); + + QTerminal *terminalView () + { + return m_terminalView; + } + + HistoryDockWidget *historyDockWidget () + { + return m_historyDockWidget; + } + FilesDockWidget *filesDockWidget () + { + return m_filesDockWidget; + } + bool isCloseApplication () + { + return m_closeApplication; + } + +signals: + void settingsChanged (); + +public slots: + void handleOpenFileRequest (QString fileName); + void reportStatusMessage (QString statusMessage); + void openWebPage (QString url); + void openChat (); + void handleSaveWorkspaceRequest (); + void handleLoadWorkspaceRequest (); + void handleClearWorkspaceRequest (); + void handleCommandDoubleClicked (QString command); + void alignMdiWindows (); + void openEditor (); + void openEditorFile (QString fileName); + void openBugTrackerPage (); + void openAgoraPage (); + void openOctaveForgePage (); + void processSettingsDialogRequest (); + void showAboutOctave (); + void showAboutQt (); + +protected: + void closeEvent (QCloseEvent * closeEvent); + void readSettings (); + void writeSettings (); + +private: + void construct (); + void establishOctaveLink (); + QMdiArea *m_centralMdiArea; + + // Mdi sub windows. + QTerminal *m_terminalView; + BrowserWidget *m_documentationWidget; + QIRCWidget *m_ircWidget; + + NonClosableMdiSubWindow *m_terminalViewSubWindow; + NonClosableMdiSubWindow *m_documentationWidgetSubWindow; + + // Dock widgets. + WorkspaceView *m_workspaceView; + HistoryDockWidget *m_historyDockWidget; + FilesDockWidget *m_filesDockWidget; + + // Editor's lexer + LexerOctaveGui *m_lexer; + QsciAPIs *m_lexerAPI; + + // Toolbars. + QStatusBar *m_statusBar; + + // Flag for closing whole application + bool m_closeApplication; +}; + +#endif // MAINWINDOW_H
new file mode 100644 --- /dev/null +++ b/gui/src/OctaveGUI.cpp @@ -0,0 +1,95 @@ +/* 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 <QtGui/QApplication> +#include <QTranslator> +#include <QSettings> +#include "CommandLineParser.h" +#include "WelcomeWizard.h" +#include "ResourceManager.h" +#include "MainWindow.h" + +int +main (int argc, char *argv[]) +{ + QApplication application (argc, argv); + while (true) + { + if (ResourceManager::instance ()->isFirstRun ()) + { + WelcomeWizard welcomeWizard; + int returnCode = welcomeWizard.exec (); + + QSettings *settings = ResourceManager::instance ()->settings (); + settings->setValue ("connectOnStartup", true); + settings->setValue ("showMessageOfTheDay", true); + settings->setValue ("showTopic", true); + settings->setValue ("autoIdentification", false); + settings->setValue ("nickServPassword", ""); + settings->setValue ("useCustomFileEditor", false); + settings->setValue ("customFileEditor", "emacs"); + settings->setValue ("editor/showLineNumbers", true); + settings->setValue ("editor/highlightCurrentLine", true); + settings->setValue ("editor/codeCompletion", true); + settings->setValue ("editor/fontName", "Monospace"); + settings->setValue ("editor/fontSize", 10); + settings->setValue ("editor/shortWindowTitle", true); + settings->setValue ("showFilenames", true); + settings->setValue ("showFileSize", false); + settings->setValue ("showFileType", false); + settings->setValue ("showLastModified", false); + settings->setValue ("showHiddenFiles", false); + settings->setValue ("useAlternatingRowColors", true); + settings->setValue ("useProxyServer", false); + settings->setValue ("proxyType", "Sock5Proxy"); + settings->setValue ("proxyHostName", "none"); + settings->setValue ("proxyPort", 8080); + settings->setValue ("proxyUserName", ""); + settings->setValue ("proxyPassword", ""); + settings->sync (); + ResourceManager::instance ()->reloadSettings (); + + application.quit (); + // We are in an infinite loop, so everything else than a return + // will cause the application to restart from the very beginning. + if (returnCode == QDialog::Rejected) + return 0; + } + else + { + CommandLineParser commandLineParser; + commandLineParser.registerOption ("--config", "-c", "Tells OctaveGUI to use that configuration file.", true); + commandLineParser.parse (argc, argv); + + QSettings *settings = ResourceManager::instance ()->settings (); + QString language = settings->value ("language").toString (); + + QString translatorFile = ResourceManager::instance ()->findTranslatorFile (language); + QTranslator translator; + translator.load (translatorFile); + application.installTranslator (&translator); + + ResourceManager::instance ()->updateNetworkSettings (); + ResourceManager::instance ()->loadIcons (); + + MainWindow w; + w.show (); + w.activateWindow(); + return application.exec (); + } + } +}
new file mode 100644 --- /dev/null +++ b/gui/src/ResourceManager.cpp @@ -0,0 +1,1687 @@ +/* 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 "ResourceManager.h" +#include <QFile> +#include <QNetworkProxy> + +ResourceManager ResourceManager::m_singleton; + +ResourceManager::ResourceManager () +{ + m_settings = 0; + reloadSettings (); +} + +ResourceManager::~ResourceManager () +{ + delete m_settings; +} + +QSettings * +ResourceManager::settings () +{ + return m_settings; +} + +QString +ResourceManager::homePath () +{ + return m_homePath; +} + +void +ResourceManager::reloadSettings () +{ + QDesktopServices desktopServices; + m_homePath = desktopServices.storageLocation (QDesktopServices::HomeLocation); + setSettings(m_homePath + "/.config/octave-gui/settings"); +} + +void +ResourceManager::setSettings (QString file) +{ + delete m_settings; + + m_firstRun = false; + if (!QFile::exists (file)) + m_firstRun = true; + + // If the settings file does not exist, QSettings automatically creates it. + // Therefore we have to check if it exists before instantiating the settings object. + // That way we can detect if the user ran this application before. + m_settings = new QSettings (file, QSettings::IniFormat); +} + +QString +ResourceManager::findTranslatorFile (QString language) +{ + // TODO: Quick hack to be able to test language files. + return QString("../languages/%1.qm").arg(language); +} + +QIcon +ResourceManager::icon (Icon icon) +{ + if (m_icons.contains (icon)) + { + return m_icons [icon]; + } + return QIcon (); +} + +bool +ResourceManager::isFirstRun () +{ + return m_firstRun; +} + +void +ResourceManager::updateNetworkSettings () +{ + QNetworkProxy::ProxyType proxyType = QNetworkProxy::NoProxy; + if (m_settings->value ("useProxyServer").toBool ()) + { + QString proxyTypeString = m_settings->value ("proxyType").toString (); + if (proxyTypeString == "Socks5Proxy") + { + proxyType = QNetworkProxy::Socks5Proxy; + } + else if (proxyTypeString == "HttpProxy") + { + proxyType = QNetworkProxy::HttpProxy; + } + } + + QNetworkProxy proxy; + proxy.setType (proxyType); + proxy.setHostName (m_settings->value ("proxyHostName").toString ()); + proxy.setPort (m_settings->value ("proxyPort").toInt ()); + proxy.setUser (m_settings->value ("proxyUserName").toString ()); + proxy.setPassword (m_settings->value ("proxyPassword").toString ()); + QNetworkProxy::setApplicationProxy (proxy); +} + +void +ResourceManager::loadIcons () +{ + m_icons [ResourceManager::Octave] = QIcon ("../media/logo.png"); + m_icons [ResourceManager::Terminal] = QIcon ("../media/terminal.png"); + m_icons [ResourceManager::Documentation] = QIcon ("../media/help_index.png"); + m_icons [ResourceManager::Chat] = QIcon ("../media/chat.png"); + m_icons [ResourceManager::ChatNewMessage] = QIcon ("../media/jabber_protocol.png"); +} + +const char* +ResourceManager::octaveKeywords () +{ + return + ".nargin. " + "EDITOR " + "EXEC_PATH " + "F_DUPFD " + "F_GETFD " + "F_GETFL " + "F_SETFD " + "F_SETFL " + "I " + "IMAGE_PATH " + "Inf " + "J " + "NA " + "NaN " + "OCTAVE_HOME " + "OCTAVE_VERSION " + "O_APPEND " + "O_ASYNC " + "O_CREAT " + "O_EXCL " + "O_NONBLOCK " + "O_RDONLY " + "O_RDWR " + "O_SYNC " + "O_TRUNC " + "O_WRONLY " + "PAGER " + "PAGER_FLAGS " + "PS1 " + "PS2 " + "PS4 " + "P_tmpdir " + "SEEK_CUR " + "SEEK_END " + "SEEK_SET " + "SIG " + "S_ISBLK " + "S_ISCHR " + "S_ISDIR " + "S_ISFIFO " + "S_ISLNK " + "S_ISREG " + "S_ISSOCK " + "WCONTINUE " + "WCOREDUMP " + "WEXITSTATUS " + "WIFCONTINUED " + "WIFEXITED " + "WIFSIGNALED " + "WIFSTOPPED " + "WNOHANG " + "WSTOPSIG " + "WTERMSIG " + "WUNTRACED " + "__accumarray_max__ " + "__accumarray_min__ " + "__accumarray_sum__ " + "__accumdim_sum__ " + "__all_opts__ " + "__builtins__ " + "__calc_dimensions__ " + "__contourc__ " + "__current_scope__ " + "__delaunayn__ " + "__dispatch__ " + "__display_tokens__ " + "__dsearchn__ " + "__dump_symtab_info__ " + "__end__ " + "__error_text__ " + "__finish__ " + "__fltk_ginput__ " + "__fltk_print__ " + "__fltk_uigetfile__ " + "__ftp__ " + "__ftp_ascii__ " + "__ftp_binary__ " + "__ftp_close__ " + "__ftp_cwd__ " + "__ftp_delete__ " + "__ftp_dir__ " + "__ftp_mget__ " + "__ftp_mkdir__ " + "__ftp_mode__ " + "__ftp_mput__ " + "__ftp_pwd__ " + "__ftp_rename__ " + "__ftp_rmdir__ " + "__get__ " + "__glpk__ " + "__gnuplot_drawnow__ " + "__gnuplot_get_var__ " + "__gnuplot_ginput__ " + "__gnuplot_has_feature__ " + "__gnuplot_open_stream__ " + "__gnuplot_print__ " + "__gnuplot_version__ " + "__go_axes__ " + "__go_axes_init__ " + "__go_close_all__ " + "__go_delete__ " + "__go_draw_axes__ " + "__go_draw_figure__ " + "__go_execute_callback__ " + "__go_figure__ " + "__go_figure_handles__ " + "__go_handles__ " + "__go_hggroup__ " + "__go_image__ " + "__go_line__ " + "__go_patch__ " + "__go_surface__ " + "__go_text__ " + "__go_uimenu__ " + "__gud_mode__ " + "__image_pixel_size__ " + "__init_fltk__ " + "__isa_parent__ " + "__keywords__ " + "__lexer_debug_flag__ " + "__lin_interpn__ " + "__list_functions__ " + "__magick_finfo__ " + "__magick_format_list__ " + "__magick_read__ " + "__magick_write__ " + "__makeinfo__ " + "__marching_cube__ " + "__next_line_color__ " + "__next_line_style__ " + "__operators__ " + "__parent_classes__ " + "__parser_debug_flag__ " + "__pathorig__ " + "__pchip_deriv__ " + "__plt_get_axis_arg__ " + "__print_parse_opts__ " + "__qp__ " + "__request_drawnow__ " + "__sort_rows_idx__ " + "__strip_html_tags__ " + "__token_count__ " + "__varval__ " + "__version_info__ " + "__voronoi__ " + "__which__ " + "abs " + "accumarray " + "accumdim " + "acos " + "acosd " + "acosh " + "acot " + "acotd " + "acoth " + "acsc " + "acscd " + "acsch " + "add_input_event_hook " + "addlistener " + "addpath " + "addproperty " + "addtodate " + "airy " + "all " + "allchild " + "allow_noninteger_range_as_index " + "amd " + "ancestor " + "and " + "angle " + "anova " + "ans " + "any " + "arch_fit " + "arch_rnd " + "arch_test " + "area " + "arg " + "argnames " + "argv " + "arma_rnd " + "arrayfun " + "asctime " + "asec " + "asecd " + "asech " + "asin " + "asind " + "asinh " + "assert " + "assignin " + "atan " + "atan2 " + "atand " + "atanh " + "atexit " + "autocor " + "autocov " + "autoload " + "autoreg_matrix " + "autumn " + "available_graphics_toolkits " + "axes " + "axis " + "balance " + "bar " + "barh " + "bartlett " + "bartlett_test " + "base2dec " + "beep " + "beep_on_error " + "bessel " + "besselh " + "besseli " + "besselj " + "besselk " + "bessely " + "beta " + "betacdf " + "betai " + "betainc " + "betainv " + "betaln " + "betapdf " + "betarnd " + "bicgstab " + "bicubic " + "bin2dec " + "bincoeff " + "binocdf " + "binoinv " + "binopdf " + "binornd " + "bitand " + "bitcmp " + "bitget " + "bitmax " + "bitor " + "bitpack " + "bitset " + "bitshift " + "bitunpack " + "bitxor " + "blackman " + "blanks " + "blkdiag " + "blkmm " + "bone " + "box " + "break " + "brighten " + "bsxfun " + "bug_report " + "builtin " + "bunzip2 " + "bzip2 " + "calendar " + "canonicalize_file_name " + "cart2pol " + "cart2sph " + "case " + "cast " + "cat " + "catch " + "cauchy_cdf " + "cauchy_inv " + "cauchy_pdf " + "cauchy_rnd " + "caxis " + "cbrt " + "ccolamd " + "cd " + "ceil " + "cell " + "cell2mat " + "cell2struct " + "celldisp " + "cellfun " + "cellidx " + "cellindexmat " + "cellslices " + "cellstr " + "center " + "cgs " + "char " + "chdir " + "chi2cdf " + "chi2inv " + "chi2pdf " + "chi2rnd " + "chisquare_test_homogeneity " + "chisquare_test_independence " + "chol " + "chol2inv " + "choldelete " + "cholinsert " + "cholinv " + "cholshift " + "cholupdate " + "chop " + "circshift " + "cla " + "clabel " + "class " + "clc " + "clear " + "clf " + "clg " + "clock " + "cloglog " + "close " + "closereq " + "colamd " + "colloc " + "colon " + "colorbar " + "colormap " + "colperm " + "colstyle " + "columns " + "comet " + "comet3 " + "comma " + "command_line_path " + "common_size " + "commutation_matrix " + "compan " + "compare_versions " + "compass " + "complement " + "completion_append_char " + "completion_matches " + "complex " + "computer " + "cond " + "condest " + "confirm_recursive_rmdir " + "conj " + "continue " + "contour " + "contour3 " + "contourc " + "contourf " + "contrast " + "conv " + "conv2 " + "convhull " + "convhulln " + "convn " + "cool " + "copper " + "copyfile " + "cor " + "cor_test " + "corrcoef " + "cos " + "cosd " + "cosh " + "cot " + "cotd " + "coth " + "cov " + "cplxpair " + "cputime " + "cquad " + "crash_dumps_octave_core " + "create_set " + "cross " + "csc " + "cscd " + "csch " + "cstrcat " + "csvread " + "csvwrite " + "csymamd " + "ctime " + "ctranspose " + "cummax " + "cummin " + "cumprod " + "cumsum " + "cumtrapz " + "curl " + "cut " + "cylinder " + "daspect " + "daspk " + "daspk_options " + "dasrt " + "dasrt_options " + "dassl " + "dassl_options " + "date " + "datenum " + "datestr " + "datetick " + "datevec " + "dbclear " + "dbcont " + "dbdown " + "dblquad " + "dbnext " + "dbquit " + "dbstack " + "dbstatus " + "dbstep " + "dbstop " + "dbtype " + "dbup " + "dbwhere " + "deal " + "deblank " + "debug " + "debug_on_error " + "debug_on_interrupt " + "debug_on_warning " + "dec2base " + "dec2bin " + "dec2hex " + "deconv " + "default_save_options " + "del2 " + "delaunay " + "delaunay3 " + "delaunayn " + "delete " + "dellistener " + "demo " + "det " + "detrend " + "diag " + "diary " + "diff " + "diffpara " + "diffuse " + "dir " + "discrete_cdf " + "discrete_inv " + "discrete_pdf " + "discrete_rnd " + "disp " + "dispatch " + "display " + "divergence " + "dlmread " + "dlmwrite " + "dmperm " + "dmult " + "do " + "do_braindead_shortcircuit_evaluation " + "do_string_escapes " + "doc " + "doc_cache_file " + "dos " + "dot " + "double " + "drawnow " + "dsearch " + "dsearchn " + "dump_prefs " + "dup2 " + "duplication_matrix " + "durbinlevinson " + "e " + "echo " + "echo_executing_commands " + "edit " + "edit_history " + "eig " + "eigs " + "ellipsoid " + "else " + "elseif " + "empirical_cdf " + "empirical_inv " + "empirical_pdf " + "empirical_rnd " + "end " + "end_try_catch " + "end_unwind_protect " + "endfor " + "endfunction " + "endgrent " + "endif " + "endpwent " + "endswitch " + "endwhile " + "eomday " + "eps " + "eq " + "erf " + "erfc " + "erfcx " + "erfinv " + "errno " + "errno_list " + "error " + "error_text " + "errorbar " + "etime " + "etree " + "etreeplot " + "eval " + "evalin " + "example " + "exec " + "exist " + "exit " + "exp " + "expcdf " + "expinv " + "expm " + "expm1 " + "exppdf " + "exprnd " + "eye " + "ezcontour " + "ezcontourf " + "ezmesh " + "ezmeshc " + "ezplot " + "ezplot3 " + "ezpolar " + "ezsurf " + "ezsurfc " + "f_test_regression " + "factor " + "factorial " + "fail " + "false " + "fcdf " + "fclear " + "fclose " + "fcntl " + "fdisp " + "feather " + "feof " + "ferror " + "feval " + "fflush " + "fft " + "fft2 " + "fftconv " + "fftfilt " + "fftn " + "fftshift " + "fftw " + "fgetl " + "fgets " + "fieldnames " + "figure " + "file_in_loadpath " + "file_in_path " + "fileattrib " + "filemarker " + "fileparts " + "fileread " + "filesep " + "fill " + "filter " + "filter2 " + "find " + "find_dir_in_path " + "findall " + "findobj " + "findstr " + "finite " + "finv " + "fix " + "fixed_point_format " + "flag " + "flipdim " + "fliplr " + "flipud " + "floor " + "fminbnd " + "fminunc " + "fmod " + "fnmatch " + "fopen " + "for " + "fork " + "format " + "formula " + "fpdf " + "fplot " + "fprintf " + "fputs " + "fractdiff " + "fread " + "freport " + "freqz " + "freqz_plot " + "frewind " + "frnd " + "fscanf " + "fseek " + "fskipl " + "fsolve " + "fstat " + "ftell " + "full " + "fullfile " + "func2str " + "function " + "functions " + "fwrite " + "fzero " + "gamcdf " + "gaminv " + "gamma " + "gammai " + "gammainc " + "gammaln " + "gampdf " + "gamrnd " + "gca " + "gcbf " + "gcbo " + "gcd " + "gcf " + "ge " + "gen_doc_cache " + "genpath " + "genvarname " + "geocdf " + "geoinv " + "geopdf " + "geornd " + "get " + "get_first_help_sentence " + "get_help_text " + "get_help_text_from_file " + "getappdata " + "getegid " + "getenv " + "geteuid " + "getfield " + "getgid " + "getgrent " + "getgrgid " + "getgrnam " + "gethostname " + "getpgrp " + "getpid " + "getppid " + "getpwent " + "getpwnam " + "getpwuid " + "getrusage " + "getuid " + "ginput " + "givens " + "glob " + "global " + "glpk " + "glpkmex " + "gls " + "gmap40 " + "gmres " + "gmtime " + "gnuplot_binary " + "gplot " + "gradient " + "graphics_toolkit " + "gray " + "gray2ind " + "grid " + "griddata " + "griddata3 " + "griddatan " + "gt " + "gtext " + "gunzip " + "gzip " + "hadamard " + "hamming " + "hankel " + "hanning " + "help " + "hess " + "hex2dec " + "hex2num " + "hggroup " + "hidden " + "hilb " + "hist " + "histc " + "history " + "history_control " + "history_file " + "history_size " + "history_timestamp_format_string " + "hold " + "home " + "horzcat " + "hot " + "hotelling_test " + "hotelling_test_2 " + "housh " + "hsv " + "hsv2rgb " + "hurst " + "hygecdf " + "hygeinv " + "hygepdf " + "hygernd " + "hypot " + "i " + "idivide " + "if " + "ifelse " + "ifft " + "ifft2 " + "ifftn " + "ifftshift " + "ignore_function_time_stamp " + "imag " + "image " + "imagesc " + "imfinfo " + "imread " + "imshow " + "imwrite " + "ind2gray " + "ind2rgb " + "ind2sub " + "index " + "inf " + "inferiorto " + "info " + "info_file " + "info_program " + "inline " + "inpolygon " + "input " + "inputname " + "int16 " + "int2str " + "int32 " + "int64 " + "int8 " + "interp1 " + "interp1q " + "interp2 " + "interp3 " + "interpft " + "interpn " + "intersect " + "intmax " + "intmin " + "intwarning " + "inv " + "inverse " + "invhilb " + "ipermute " + "iqr " + "is_absolute_filename " + "is_duplicate_entry " + "is_global " + "is_leap_year " + "is_rooted_relative_filename " + "is_valid_file_id " + "isa " + "isalnum " + "isalpha " + "isappdata " + "isargout " + "isascii " + "isbool " + "iscell " + "iscellstr " + "ischar " + "iscntrl " + "iscolumn " + "iscommand " + "iscomplex " + "isdebugmode " + "isdefinite " + "isdeployed " + "isdigit " + "isdir " + "isempty " + "isequal " + "isequalwithequalnans " + "isfield " + "isfigure " + "isfinite " + "isfloat " + "isglobal " + "isgraph " + "ishandle " + "ishermitian " + "ishghandle " + "ishold " + "isieee " + "isindex " + "isinf " + "isinteger " + "iskeyword " + "isletter " + "islogical " + "islower " + "ismac " + "ismatrix " + "ismember " + "ismethod " + "isna " + "isnan " + "isnull " + "isnumeric " + "isobject " + "isocolors " + "isonormals " + "isosurface " + "ispc " + "isprime " + "isprint " + "isprop " + "ispunct " + "israwcommand " + "isreal " + "isrow " + "isscalar " + "issorted " + "isspace " + "issparse " + "issquare " + "isstr " + "isstrprop " + "isstruct " + "issymmetric " + "isunix " + "isupper " + "isvarname " + "isvector " + "isxdigit " + "j " + "jet " + "kbhit " + "kendall " + "keyboard " + "kill " + "kolmogorov_smirnov_cdf " + "kolmogorov_smirnov_test " + "kolmogorov_smirnov_test_2 " + "kron " + "kruskal_wallis_test " + "krylov " + "krylovb " + "kurtosis " + "laplace_cdf " + "laplace_inv " + "laplace_pdf " + "laplace_rnd " + "lasterr " + "lasterror " + "lastwarn " + "lchol " + "lcm " + "ldivide " + "le " + "legend " + "legendre " + "length " + "lgamma " + "license " + "lin2mu " + "line " + "link " + "linkprop " + "linspace " + "list " + "list_in_columns " + "list_primes " + "load " + "loadaudio " + "loadimage " + "loadobj " + "localtime " + "log " + "log10 " + "log1p " + "log2 " + "logical " + "logistic_cdf " + "logistic_inv " + "logistic_pdf " + "logistic_regression " + "logistic_rnd " + "logit " + "loglog " + "loglogerr " + "logm " + "logncdf " + "logninv " + "lognpdf " + "lognrnd " + "logspace " + "lookfor " + "lookup " + "lower " + "ls " + "ls_command " + "lsode " + "lsode_options " + "lsqnonneg " + "lstat " + "lt " + "lu " + "luinc " + "luupdate " + "magic " + "mahalanobis " + "make_absolute_filename " + "makeinfo_program " + "manova " + "mark_as_command " + "mark_as_rawcommand " + "mat2cell " + "mat2str " + "matlabroot " + "matrix_type " + "max " + "max_recursion_depth " + "mcnemar_test " + "md5sum " + "mean " + "meansq " + "median " + "menu " + "merge " + "mesh " + "meshc " + "meshgrid " + "meshz " + "methods " + "mex " + "mexext " + "mfilename " + "mgorth " + "min " + "minus " + "mislocked " + "missing_function_hook " + "mist " + "mkdir " + "mkfifo " + "mkoctfile " + "mkpp " + "mkstemp " + "mktime " + "mldivide " + "mlock " + "mod " + "mode " + "moment " + "more " + "most " + "movefile " + "mpoles " + "mpower " + "mrdivide " + "mtimes " + "mu2lin " + "munlock " + "namelengthmax " + "nan " + "nargchk " + "nargin " + "nargout " + "nargoutchk " + "native_float_format " + "nbincdf " + "nbininv " + "nbinpdf " + "nbinrnd " + "nchoosek " + "ndgrid " + "ndims " + "ne " + "newplot " + "news " + "nextpow2 " + "nfields " + "nnz " + "nonzeros " + "norm " + "normcdf " + "normest " + "norminv " + "normpdf " + "normrnd " + "not " + "now " + "nproc " + "nth_element " + "nthroot " + "ntsc2rgb " + "null " + "num2cell " + "num2hex " + "num2str " + "numel " + "nzmax " + "ocean " + "octave_config_info " + "octave_core_file_limit " + "octave_core_file_name " + "octave_core_file_options " + "octave_tmp_file_name " + "ols " + "onCleanup " + "onenormest " + "ones " + "optimget " + "optimize_subsasgn_calls " + "optimset " + "or " + "orderfields " + "orient " + "orth " + "otherwise " + "output_max_field_width " + "output_precision " + "pack " + "page_output_immediately " + "page_screen_output " + "paren " + "pareto " + "parseparams " + "pascal " + "patch " + "path " + "pathdef " + "pathsep " + "pause " + "pbaspect " + "pcg " + "pchip " + "pclose " + "pcolor " + "pcr " + "peaks " + "periodogram " + "perl " + "perms " + "permute " + "perror " + "persistent " + "pi " + "pie " + "pie3 " + "pink " + "pinv " + "pipe " + "pkg " + "planerot " + "playaudio " + "plot " + "plot3 " + "plotmatrix " + "plotyy " + "plus " + "poisscdf " + "poissinv " + "poisspdf " + "poissrnd " + "pol2cart " + "polar " + "poly " + "polyaffine " + "polyarea " + "polyder " + "polyderiv " + "polyfit " + "polygcd " + "polyint " + "polyout " + "polyreduce " + "polyval " + "polyvalm " + "popen " + "popen2 " + "postpad " + "pow2 " + "power " + "powerset " + "ppder " + "ppint " + "ppjumps " + "ppplot " + "ppval " + "pqpnonneg " + "prctile " + "prepad " + "primes " + "print " + "print_empty_dimensions " + "print_struct_array_contents " + "print_usage " + "printf " + "prism " + "probit " + "prod " + "program_invocation_name " + "program_name " + "prop_test_2 " + "putenv " + "puts " + "pwd " + "qp " + "qqplot " + "qr " + "qrdelete " + "qrinsert " + "qrshift " + "qrupdate " + "quad " + "quad_options " + "quadcc " + "quadgk " + "quadl " + "quadv " + "quantile " + "quit " + "quiver " + "quiver3 " + "qz " + "qzhess " + "rainbow " + "rand " + "rande " + "randg " + "randi " + "randn " + "randp " + "randperm " + "range " + "rank " + "ranks " + "rat " + "rats " + "rcond " + "rdivide " + "re_read_readline_init_file " + "read_readline_init_file " + "readdir " + "readlink " + "real " + "reallog " + "realmax " + "realmin " + "realpow " + "realsqrt " + "record " + "rectangle " + "rectint " + "refresh " + "refreshdata " + "regexp " + "regexpi " + "regexprep " + "regexptranslate " + "rehash " + "rem " + "remove_input_event_hook " + "rename " + "repelems " + "replot " + "repmat " + "reset " + "reshape " + "residue " + "resize " + "restoredefaultpath " + "rethrow " + "return " + "rgb2hsv " + "rgb2ind " + "rgb2ntsc " + "ribbon " + "rindex " + "rmappdata " + "rmdir " + "rmfield " + "rmpath " + "roots " + "rose " + "rosser " + "rot90 " + "rotdim " + "round " + "roundb " + "rows " + "rref " + "rsf2csf " + "run " + "run_count " + "run_history " + "run_test " + "rundemos " + "runlength " + "runtests " + "save " + "save_header_format_string " + "save_precision " + "saveas " + "saveaudio " + "saveimage " + "saveobj " + "savepath " + "saving_history " + "scanf " + "scatter " + "scatter3 " + "schur " + "sec " + "secd " + "sech " + "semicolon " + "semilogx " + "semilogxerr " + "semilogy " + "semilogyerr " + "set " + "setappdata " + "setaudio " + "setdiff " + "setenv " + "setfield " + "setgrent " + "setpwent " + "setstr " + "setxor " + "shading " + "shell_cmd " + "shg " + "shift " + "shiftdim " + "sighup_dumps_octave_core " + "sign " + "sign_test " + "sigterm_dumps_octave_core " + "silent_functions " + "sin " + "sinc " + "sind " + "sinetone " + "sinewave " + "single " + "sinh " + "size " + "size_equal " + "sizemax " + "sizeof " + "skewness " + "sleep " + "slice " + "sombrero " + "sort " + "sortrows " + "source " + "spalloc " + "sparse " + "sparse_auto_mutate " + "spatan2 " + "spaugment " + "spchol " + "spchol2inv " + "spcholinv " + "spconvert " + "spcumprod " + "spcumsum " + "spdet " + "spdiag " + "spdiags " + "spearman " + "spectral_adf " + "spectral_xdf " + "specular " + "speed " + "spencer " + "speye " + "spfind " + "spfun " + "sph2cart " + "sphcat " + "sphere " + "spinmap " + "spinv " + "spkron " + "splchol " + "spline " + "split " + "split_long_rows " + "splu " + "spmax " + "spmin " + "spones " + "spparms " + "spprod " + "spqr " + "sprand " + "sprandn " + "sprandsym " + "sprank " + "spring " + "sprintf " + "spstats " + "spsum " + "spsumsq " + "spvcat " + "spy " + "sqp " + "sqrt " + "sqrtm " + "squeeze " + "sscanf " + "stairs " + "stat " + "static " + "statistics " + "std " + "stderr " + "stdin " + "stdnormal_cdf " + "stdnormal_inv " + "stdnormal_pdf " + "stdnormal_rnd " + "stdout " + "stem " + "stem3 " + "stft " + "str2double " + "str2func " + "str2mat " + "str2num " + "strcat " + "strchr " + "strcmp " + "strcmpi " + "strerror " + "strfind " + "strftime " + "string_fill_char " + "strjust " + "strmatch " + "strncmp " + "strncmpi " + "strptime " + "strread " + "strrep " + "strsplit " + "strtok " + "strtrim " + "strtrunc " + "struct " + "struct2cell " + "struct_levels_to_print " + "structfun " + "strvcat " + "studentize " + "sub2ind " + "subplot " + "subsasgn " + "subsindex " + "subspace " + "subsref " + "substr " + "substruct " + "sum " + "summer " + "sumsq " + "superiorto " + "suppress_verbose_help_message " + "surf " + "surface " + "surfc " + "surfl " + "surfnorm " + "svd " + "svd_driver " + "svds " + "swapbytes " + "switch " + "syl " + "sylvester_matrix " + "symamd " + "symbfact " + "symlink " + "symrcm " + "symvar " + "synthesis " + "system " + "t_test " + "t_test_2 " + "t_test_regression " + "table " + "tan " + "tand " + "tanh " + "tar " + "tcdf " + "tempdir " + "tempname " + "terminal_size " + "test " + "test2 " + "test3 " + "text " + "textread " + "textscan " + "tic " + "tilde_expand " + "time " + "times " + "tinv " + "title " + "tmpfile " + "tmpnam " + "toascii " + "toc " + "toeplitz " + "tolower " + "toupper " + "tpdf " + "trace " + "transpose " + "trapz " + "treelayout " + "treeplot " + "tril " + "trimesh " + "triplequad " + "triplot " + "trisurf " + "triu " + "trnd " + "true " + "try " + "tsearch " + "tsearchn " + "type " + "typecast " + "typeinfo " + "u_test " + "uigetdir " + "uigetfile " + "uimenu " + "uint16 " + "uint32 " + "uint64 " + "uint8 " + "uiputfile " + "umask " + "uminus " + "uname " + "undo_string_escapes " + "unidcdf " + "unidinv " + "unidpdf " + "unidrnd " + "unifcdf " + "unifinv " + "unifpdf " + "unifrnd " + "unimplemented " + "union " + "unique " + "unix " + "unlink " + "unmark_command " + "unmark_rawcommand " + "unmkpp " + "unpack " + "untabify " + "untar " + "until " + "unwind_protect " + "unwind_protect_cleanup " + "unwrap " + "unzip " + "uplus " + "upper " + "urlread " + "urlwrite " + "usage " + "usleep " + "validatestring " + "values " + "vander " + "var " + "var_test " + "varargin " + "varargout " + "vec " + "vech " + "vectorize " + "ver " + "version " + "vertcat " + "view " + "voronoi " + "voronoin " + "waitforbuttonpress " + "waitpid " + "warning " + "warning_ids " + "warranty " + "wavread " + "wavwrite " + "wblcdf " + "wblinv " + "wblpdf " + "wblrnd " + "weekday " + "weibcdf " + "weibinv " + "weibpdf " + "weibrnd " + "welch_test " + "what " + "which " + "while " + "white " + "whitebg " + "who " + "whos " + "whos_line_format " + "wienrnd " + "wilcoxon_test " + "wilkinson " + "winter " + "xlabel " + "xlim " + "xor " + "yes_or_no " + "ylabel " + "ylim " + "yulewalker " + "z_test " + "z_test_2 " + "zeros " + "zip " + "zlabel " + "zlim "; + /* "break case catch continue do else elseif end end_unwind_protect " + "endfor endfunction endif endswitch endwhile for function " + "global if otherwise persistent return switch try until " + "unwind_protect unwind_protect_cleanup while"; + */ +}
new file mode 100644 --- /dev/null +++ b/gui/src/ResourceManager.h @@ -0,0 +1,67 @@ +/* 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 RESOURCEMANAGER_H +#define RESOURCEMANAGER_H + +#include <QSettings> +#include <QDesktopServices> +#include <QMap> +#include <QIcon> + +class ResourceManager +{ +public: + enum Icon + { + Octave, + Terminal, + Documentation, + Chat, + ChatNewMessage + }; + + ~ResourceManager (); + + static ResourceManager * + instance () + { + return &m_singleton; + } + + QSettings *settings (); + QString homePath (); + void reloadSettings (); + void setSettings (QString file); + QString findTranslatorFile (QString language); + void updateNetworkSettings (); + void loadIcons (); + QIcon icon (Icon icon); + bool isFirstRun (); + + const char *octaveKeywords (); +private: + ResourceManager (); + + QSettings *m_settings; + QString m_homePath; + QMap <Icon, QIcon> m_icons; + static ResourceManager m_singleton; + bool m_firstRun; +}; + +#endif // RESOURCEMANAGER_H
new file mode 100644 --- /dev/null +++ b/gui/src/SettingsDialog.cpp @@ -0,0 +1,110 @@ +/* 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 "ResourceManager.h" +#include "SettingsDialog.h" +#include "ui_SettingsDialog.h" +#include <QSettings> + +SettingsDialog::SettingsDialog (QWidget * parent): +QDialog (parent), ui (new Ui::SettingsDialog) +{ + ui->setupUi (this); + + QSettings *settings = ResourceManager::instance ()->settings (); + ui->useCustomFileEditor->setChecked (settings->value ("useCustomFileEditor").toBool ()); + ui->customFileEditor->setText (settings->value ("customFileEditor").toString ()); + ui->editor_showLineNumbers->setChecked (settings->value ("editor/showLineNumbers",true).toBool () ); + ui->editor_highlightCurrentLine->setChecked (settings->value ("editor/highlightCurrentLine",true).toBool () ); + ui->editor_codeCompletion->setChecked (settings->value ("editor/codeCompletion",true).toBool () ); + ui->editor_fontName->setCurrentFont (QFont (settings->value ("editor/fontName","Courier").toString()) ); + ui->editor_fontSize->setValue (settings->value ("editor/fontSize",10).toInt ()); + ui->editor_longWindowTitle->setChecked (settings->value ("editor/longWindowTitle",true).toBool ()); + ui->showFilenames->setChecked (settings->value ("showFilenames").toBool()); + ui->showFileSize->setChecked (settings->value ("showFileSize").toBool()); + ui->showFileType->setChecked (settings->value ("showFileType").toBool()); + ui->showLastModified->setChecked (settings->value ("showLastModified").toBool()); + ui->showHiddenFiles->setChecked (settings->value ("showHiddenFiles").toBool()); + ui->useAlternatingRowColors->setChecked (settings->value ("useAlternatingRowColors").toBool()); + ui->useProxyServer->setChecked (settings->value ("useProxyServer").toBool ()); + ui->proxyHostName->setText (settings->value ("proxyHostName").toString ()); + + int currentIndex = 0; + QString proxyTypeString = settings->value ("proxyType").toString (); + while ( (currentIndex < ui->proxyType->count ()) && (ui->proxyType->currentText () != proxyTypeString)) + { + currentIndex++; + ui->proxyType->setCurrentIndex (currentIndex); + } + + ui->proxyPort->setText (settings->value ("proxyPort").toString ()); + ui->proxyUserName->setText (settings->value ("proxyUserName").toString ()); + ui->proxyPassword->setText (settings->value ("proxyPassword").toString ()); + + // Short cuts + QStringList headerLabels; + headerLabels << "Modifier" << "Key" << "Action"; + ui->shortcutTableWidget->setColumnCount (3); + ui->shortcutTableWidget->setRowCount (10); + ui->shortcutTableWidget->horizontalHeader ()->setStretchLastSection (true); + ui->shortcutTableWidget->setHorizontalHeaderLabels (headerLabels); + ui->shortcutTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->shortcutTableWidget->setSelectionMode(QAbstractItemView::SingleSelection); + + /* + 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);*/ +} + +SettingsDialog::~SettingsDialog () +{ + QSettings *settings = ResourceManager::instance ()->settings (); + settings->setValue ("useCustomFileEditor", ui->useCustomFileEditor->isChecked ()); + settings->setValue ("customFileEditor", ui->customFileEditor->text ()); + settings->setValue ("editor/showLineNumbers", ui->editor_showLineNumbers->isChecked ()); + settings->setValue ("editor/highlightCurrentLine", ui->editor_highlightCurrentLine->isChecked ()); + settings->setValue ("editor/codeCompletion", ui->editor_codeCompletion->isChecked ()); + settings->setValue ("editor/fontName", ui->editor_fontName->currentFont().family()); + settings->setValue ("editor/fontSize", ui->editor_fontSize->value()); + settings->setValue ("editor/longWindowTitle", ui->editor_longWindowTitle->isChecked()); + settings->setValue ("showFilenames", ui->showFilenames->isChecked ()); + settings->setValue ("showFileSize", ui->showFileSize->isChecked ()); + settings->setValue ("showFileType", ui->showFileType->isChecked ()); + settings->setValue ("showLastModified", ui->showLastModified->isChecked ()); + settings->setValue ("showHiddenFiles", ui->showHiddenFiles->isChecked ()); + settings->setValue ("useAlternatingRowColors", ui->useAlternatingRowColors->isChecked ()); + settings->setValue ("useProxyServer", ui->useProxyServer->isChecked ()); + settings->setValue ("proxyType", ui->proxyType->currentText ()); + settings->setValue ("proxyHostName", ui->proxyHostName->text ()); + settings->setValue ("proxyPort", ui->proxyPort->text ()); + settings->setValue ("proxyUserName", ui->proxyUserName->text ()); + settings->setValue ("proxyPassword", ui->proxyPassword->text ()); + delete ui; +}
new file mode 100644 --- /dev/null +++ b/gui/src/SettingsDialog.h @@ -0,0 +1,39 @@ +/* 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. + *md5 + + * 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 SETTINGSDIALOG_H +#define SETTINGSDIALOG_H + +#include <QDialog> + +namespace Ui +{ + class SettingsDialog; +} + +class SettingsDialog:public QDialog +{ +Q_OBJECT public: + explicit SettingsDialog (QWidget * parent); + ~SettingsDialog (); + +private: + Ui::SettingsDialog * ui; +}; + +#endif // SETTINGSDIALOG_H
new file mode 100644 --- /dev/null +++ b/gui/src/SettingsDialog.ui @@ -0,0 +1,649 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>SettingsDialog</class> + <widget class="QDialog" name="SettingsDialog"> + <property name="windowModality"> + <enum>Qt::ApplicationModal</enum> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>400</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>600</width> + <height>400</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>600</width> + <height>400</height> + </size> + </property> + <property name="windowTitle"> + <string>Settings</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QTabWidget" name="tabWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tab_4"> + <attribute name="title"> + <string>Interface</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Shortcuts:</string> + </property> + </widget> + </item> + <item> + <widget class="QTableWidget" name="shortcutTableWidget"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QPushButton" name="addShortcutButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="removeShortCutButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>Editor</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_7"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QCheckBox" name="useCustomFileEditor"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Use custom file editor:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="customFileEditor"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>emacs</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QCheckBox" name="editor_showLineNumbers"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show line numbers</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="editor_highlightCurrentLine"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Highlight current line</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="editor_codeCompletion"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Code completion</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="editor_longWindowTitle"> + <property name="text"> + <string>Show complete path in window title</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Font</string> + </property> + </widget> + </item> + <item> + <widget class="QFontComboBox" name="editor_fontName"> + <property name="editable"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>Font Size</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="editor_fontSize"> + <property name="minimum"> + <number>2</number> + </property> + <property name="maximum"> + <number>96</number> + </property> + <property name="value"> + <number>10</number> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_4"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_2"> + <attribute name="title"> + <string>File Browser</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QCheckBox" name="showFilenames"> + <property name="text"> + <string>Show filenames</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="showFileSize"> + <property name="text"> + <string>Show file size</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="showFileType"> + <property name="text"> + <string>Show file type</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="showLastModified"> + <property name="text"> + <string>Show date of last modification</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="showHiddenFiles"> + <property name="text"> + <string>Show hidden files</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="useAlternatingRowColors"> + <property name="text"> + <string>Alternating row colors</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>360</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_3"> + <attribute name="title"> + <string>Network</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="QCheckBox" name="useProxyServer"> + <property name="text"> + <string>Use proxy server</string> + </property> + </widget> + </item> + <item> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label_3"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Proxy Type:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="proxyType"> + <property name="enabled"> + <bool>false</bool> + </property> + <item> + <property name="text"> + <string>HttpProxy</string> + </property> + </item> + <item> + <property name="text"> + <string>Socks5Proxy</string> + </property> + </item> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_4"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Hostname:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="proxyHostName"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_5"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Port:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="proxyPort"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_6"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Username:</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLineEdit" name="proxyUserName"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_7"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Password:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLineEdit" name="proxyPassword"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>useProxyServer</sender> + <signal>toggled(bool)</signal> + <receiver>label_4</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>59</y> + </hint> + <hint type="destinationlabel"> + <x>69</x> + <y>122</y> + </hint> + </hints> + </connection> + <connection> + <sender>useProxyServer</sender> + <signal>toggled(bool)</signal> + <receiver>label_3</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>59</y> + </hint> + <hint type="destinationlabel"> + <x>59</x> + <y>91</y> + </hint> + </hints> + </connection> + <connection> + <sender>useProxyServer</sender> + <signal>toggled(bool)</signal> + <receiver>label_5</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>59</y> + </hint> + <hint type="destinationlabel"> + <x>44</x> + <y>152</y> + </hint> + </hints> + </connection> + <connection> + <sender>useProxyServer</sender> + <signal>toggled(bool)</signal> + <receiver>proxyType</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>59</y> + </hint> + <hint type="destinationlabel"> + <x>291</x> + <y>91</y> + </hint> + </hints> + </connection> + <connection> + <sender>useProxyServer</sender> + <signal>toggled(bool)</signal> + <receiver>proxyHostName</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>59</y> + </hint> + <hint type="destinationlabel"> + <x>291</x> + <y>124</y> + </hint> + </hints> + </connection> + <connection> + <sender>useProxyServer</sender> + <signal>toggled(bool)</signal> + <receiver>proxyPort</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>59</y> + </hint> + <hint type="destinationlabel"> + <x>364</x> + <y>154</y> + </hint> + </hints> + </connection> + <connection> + <sender>useCustomFileEditor</sender> + <signal>toggled(bool)</signal> + <receiver>customFileEditor</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>111</x> + <y>62</y> + </hint> + <hint type="destinationlabel"> + <x>343</x> + <y>63</y> + </hint> + </hints> + </connection> + <connection> + <sender>useProxyServer</sender> + <signal>toggled(bool)</signal> + <receiver>label_7</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>59</y> + </hint> + <hint type="destinationlabel"> + <x>67</x> + <y>212</y> + </hint> + </hints> + </connection> + <connection> + <sender>editor_showLineNumbers</sender> + <signal>toggled(bool)</signal> + <receiver>editor_showLineNumbers</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>87</y> + </hint> + <hint type="destinationlabel"> + <x>249</x> + <y>87</y> + </hint> + </hints> + </connection> + <connection> + <sender>editor_highlightCurrentLine</sender> + <signal>toggled(bool)</signal> + <receiver>editor_highlightCurrentLine</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>112</y> + </hint> + <hint type="destinationlabel"> + <x>249</x> + <y>112</y> + </hint> + </hints> + </connection> + <connection> + <sender>useProxyServer</sender> + <signal>toggled(bool)</signal> + <receiver>proxyUserName</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>59</y> + </hint> + <hint type="destinationlabel"> + <x>364</x> + <y>184</y> + </hint> + </hints> + </connection> + <connection> + <sender>useProxyServer</sender> + <signal>toggled(bool)</signal> + <receiver>proxyPassword</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>59</y> + </hint> + <hint type="destinationlabel"> + <x>364</x> + <y>214</y> + </hint> + </hints> + </connection> + <connection> + <sender>useProxyServer</sender> + <signal>toggled(bool)</signal> + <receiver>label_6</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>59</y> + </hint> + <hint type="destinationlabel"> + <x>68</x> + <y>182</y> + </hint> + </hints> + </connection> + <connection> + <sender>editor_codeCompletion</sender> + <signal>toggled(bool)</signal> + <receiver>editor_codeCompletion</receiver> + <slot>setEnabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>249</x> + <y>137</y> + </hint> + <hint type="destinationlabel"> + <x>249</x> + <y>137</y> + </hint> + </hints> + </connection> + </connections> +</ui>
new file mode 100644 --- /dev/null +++ b/gui/src/WelcomeWizard.cpp @@ -0,0 +1,53 @@ +/* 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 "WelcomeWizard.h" +#include "ui_WelcomeWizard.h" + +WelcomeWizard::WelcomeWizard (QWidget *parent) : + QDialog (parent), + ui (new Ui::WelcomeWizard) +{ + ui->setupUi (this); + connect (ui->nextButton1, SIGNAL (clicked ()), this, SLOT (next ())); + connect (ui->nextButton2, SIGNAL (clicked ()), this, SLOT (next ())); + connect (ui->nextButton3, SIGNAL (clicked ()), this, SLOT (next ())); + connect (ui->nextButton4, SIGNAL (clicked ()), this, SLOT (next ())); + + connect (ui->previousButton2, SIGNAL (clicked ()), this, SLOT (previous ())); + connect (ui->previousButton3, SIGNAL (clicked ()), this, SLOT (previous ())); + connect (ui->previousButton4, SIGNAL (clicked ()), this, SLOT (previous ())); + connect (ui->previousButton5, SIGNAL (clicked ()), this, SLOT (previous ())); +} + +WelcomeWizard::~WelcomeWizard() +{ + delete ui; +} + +void +WelcomeWizard::next () +{ + ui->stackedWidget->setCurrentIndex (ui->stackedWidget->currentIndex () + 1); +} + +void +WelcomeWizard::previous () +{ + ui->stackedWidget->setCurrentIndex (ui->stackedWidget->currentIndex () - 1); +} +
new file mode 100644 --- /dev/null +++ b/gui/src/WelcomeWizard.h @@ -0,0 +1,43 @@ +/* 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 WELCOMEWIZARD_H +#define WELCOMEWIZARD_H + +#include <QDialog> + +namespace Ui { +class WelcomeWizard; +} + +class WelcomeWizard : public QDialog +{ + Q_OBJECT + +public: + explicit WelcomeWizard(QWidget *parent = 0); + ~WelcomeWizard(); + +public slots: + void next (); + void previous (); + +private: + Ui::WelcomeWizard *ui; +}; + +#endif // WELCOMEWIZARD_H
new file mode 100644 --- /dev/null +++ b/gui/src/WelcomeWizard.ui @@ -0,0 +1,354 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>WelcomeWizard</class> + <widget class="QDialog" name="WelcomeWizard"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>647</width> + <height>400</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>647</width> + <height>400</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>647</width> + <height>400</height> + </size> + </property> + <property name="windowTitle"> + <string>Welcome to GNU Octave</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QStackedWidget" name="stackedWidget"> + <property name="currentIndex"> + <number>4</number> + </property> + <widget class="QWidget" name="page"> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>It appears that you have launched Octave GUI for the first time on this computer, since no configuration file could be found at '~/.octave-gui'. This wizard will guide you through the essential settings you should make before you can start using Octave GUI. If you want to transfer your settings you have previously made just close this dialog and copy over the settings file to your home folder. The presence of that file will automatically be detected and will skip this wizard. IMPORTANT: This wizard is not fully functional yet. Just click your way to the end and it will create a standard settings file.</string> + </property> + <property name="alignment"> + <set>Qt::AlignJustify|Qt::AlignVCenter</set> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>218</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="nextButton1"> + <property name="text"> + <string>Next</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="page_2"> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QPushButton" name="previousButton2"> + <property name="text"> + <string>Previous</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="nextButton2"> + <property name="text"> + <string>Next</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="page_3"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QPushButton" name="previousButton3"> + <property name="text"> + <string>Previous</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="nextButton3"> + <property name="text"> + <string>Next</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="page_4"> + <layout class="QHBoxLayout" name="horizontalLayout_6"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <spacer name="verticalSpacer_4"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <item> + <widget class="QPushButton" name="previousButton4"> + <property name="text"> + <string>Previous</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_4"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="nextButton4"> + <property name="text"> + <string>Next</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="page_5"> + <layout class="QHBoxLayout" name="horizontalLayout_8"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_7"> + <item> + <widget class="QLabel" name="label_2"> + <property name="font"> + <font> + <pointsize>20</pointsize> + </font> + </property> + <property name="text"> + <string>Welcome to Octave!</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>This is the development version of Octave with the first official GUI.</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>You seem to run Octave GUI for the first time on this computer. This assistant will help you to configure this software installation. Click 'Finish' to write a configuration file and launch Octave GUI.</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_5"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <widget class="QPushButton" name="previousButton5"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Previous</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_5"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="finishButton"> + <property name="text"> + <string>Finish</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>finishButton</sender> + <signal>clicked()</signal> + <receiver>WelcomeWizard</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>577</x> + <y>372</y> + </hint> + <hint type="destinationlabel"> + <x>323</x> + <y>199</y> + </hint> + </hints> + </connection> + </connections> +</ui>
new file mode 100644 --- /dev/null +++ b/gui/src/WorkspaceView.cpp @@ -0,0 +1,207 @@ +/* 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 "WorkspaceView.h" +#include <QHBoxLayout> +#include <QVBoxLayout> +#include <QPushButton> + +WorkspaceView::WorkspaceView (QWidget * parent) : QDockWidget + (parent) +{ + setObjectName ("WorkspaceView"); + setWindowTitle (tr ("Workspace")); + + m_updateSemaphore = new QSemaphore (1); + QStringList headerLabels; + headerLabels << tr ("Name") << tr ("Type") << tr ("Value"); + m_variablesTreeWidget = new QTreeWidget (this); + m_variablesTreeWidget->setHeaderHidden (false); + m_variablesTreeWidget->setHeaderLabels (headerLabels); + + setWidget (new QWidget (this)); + QVBoxLayout *layout = new QVBoxLayout (); + layout->addWidget (m_variablesTreeWidget); + layout->setMargin (2); + widget ()->setLayout (layout); + + QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem (); + treeWidgetItem->setData (0, 0, QString (tr ("Local"))); + m_variablesTreeWidget->insertTopLevelItem (0, treeWidgetItem); + + treeWidgetItem = new QTreeWidgetItem (); + treeWidgetItem->setData (0, 0, QString (tr ("Global"))); + m_variablesTreeWidget->insertTopLevelItem (1, treeWidgetItem); + + treeWidgetItem = new QTreeWidgetItem (); + treeWidgetItem->setData (0, 0, QString (tr ("Persistent"))); + m_variablesTreeWidget->insertTopLevelItem (2, treeWidgetItem); + + treeWidgetItem = new QTreeWidgetItem (); + treeWidgetItem->setData (0, 0, QString (tr ("Hidden"))); + m_variablesTreeWidget->insertTopLevelItem (3, treeWidgetItem); + + m_variablesTreeWidget->expandAll (); + m_variablesTreeWidget->setAlternatingRowColors (true); + m_variablesTreeWidget->setAnimated (true); + + connect (this, SIGNAL (visibilityChanged(bool)), this, SLOT(handleVisibilityChanged(bool))); + connect (OctaveLink::instance(), SIGNAL (symbolTableChanged()), this, SLOT (fetchSymbolTable())); +} + +void +WorkspaceView::updateTreeEntry (QTreeWidgetItem * treeItem, SymbolRecord symbolRecord) +{ + treeItem->setData (0, 0, QString (symbolRecord.name ().c_str ())); + treeItem->setData (1, 0, + QString (symbolRecord.varval ().type_name ().c_str ())); + treeItem->setData (2, 0, + OctaveLink::octaveValueAsQString (symbolRecord. + varval ())); +} + +void +WorkspaceView::updateFromSymbolTable (QList < SymbolRecord > symbolTable) +{ + m_updateSemaphore->acquire (); + // Split the symbol table into its different scopes. + QList < SymbolRecord > localSymbolTable; + QList < SymbolRecord > globalSymbolTable; + QList < SymbolRecord > persistentSymbolTable; + QList < SymbolRecord > hiddenSymbolTable; + + foreach (SymbolRecord symbolRecord, symbolTable) + { + // It's true that being global or hidden includes it's can mean it's also locally visible, + // but we want to distinguish that here. + if (symbolRecord.is_local () && !symbolRecord.is_global () + && !symbolRecord.is_hidden ()) + { + localSymbolTable.append (symbolRecord); + } + + if (symbolRecord.is_global ()) + { + globalSymbolTable.append (symbolRecord); + } + + if (symbolRecord.is_persistent ()) + { + persistentSymbolTable.append (symbolRecord); + } + + if (symbolRecord.is_hidden ()) + { + hiddenSymbolTable.append (symbolRecord); + } + } + + updateScope (0, localSymbolTable); + updateScope (1, globalSymbolTable); + updateScope (2, persistentSymbolTable); + updateScope (3, hiddenSymbolTable); + m_updateSemaphore->release (); +} + +void +WorkspaceView::updateScope (int topLevelItemIndex, QList < SymbolRecord > symbolTable) +{ + // This method may be a little bit confusing; variablesList is a complete list of all + // variables that are in the workspace currently. + QTreeWidgetItem *topLevelItem = + m_variablesTreeWidget->topLevelItem (topLevelItemIndex); + + // First we check, if any variables that exist in the model tree have to be updated + // or created. So we walk the variablesList check against the tree. + foreach (SymbolRecord symbolRecord, symbolTable) + { + int childCount = topLevelItem->childCount (); + bool alreadyExists = false; + QTreeWidgetItem *child; + + // Search for the corresponding item in the tree. If it has been found, child + // will contain the appropriate QTreeWidgetItem* pointing at it. + for (int i = 0; i < childCount; i++) + { + child = topLevelItem->child (i); + if (child->data (0, 0).toString () == + QString (symbolRecord.name ().c_str ())) + { + alreadyExists = true; + break; + } + } + + // If it already exists, just update it. + if (alreadyExists) + { + updateTreeEntry (child, symbolRecord); + } + else + { + // It does not exist, so create a new one and set the right values. + child = new QTreeWidgetItem (); + updateTreeEntry (child, symbolRecord); + topLevelItem->addChild (child); + } + } + + // Check the tree against the list for deleted variables. + for (int i = 0; i < topLevelItem->childCount (); i++) + { + bool existsInVariableList = false; + QTreeWidgetItem *child = topLevelItem->child (i); + foreach (SymbolRecord symbolRecord, symbolTable) + { + if (QString (symbolRecord.name ().c_str ()) == + child->data (0, 0).toString ()) + { + existsInVariableList = true; + } + } + + if (!existsInVariableList) + { + topLevelItem->removeChild (child); + delete child; + i--; + } + } +} + +void +WorkspaceView::fetchSymbolTable () +{ + OctaveLink::instance ()->acquireSymbolTable(); + QList < SymbolRecord > symbolTable = OctaveLink::instance ()->symbolTable(); + updateFromSymbolTable (symbolTable); + OctaveLink::instance ()->releaseSymbolTable(); +} + +void +WorkspaceView::handleVisibilityChanged (bool visible) +{ + if (visible) + emit activeChanged (true); +} + +void +WorkspaceView::closeEvent (QCloseEvent *event) +{ + emit activeChanged (false); + QDockWidget::closeEvent (event); +}
new file mode 100644 --- /dev/null +++ b/gui/src/WorkspaceView.h @@ -0,0 +1,52 @@ +/* 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 WORKSPACEVIEW_H +#define WORKSPACEVIEW_H + +#include <QDockWidget> +#include <QTreeWidget> +#include <QSemaphore> +#include "OctaveLink.h" + +class WorkspaceView:public QDockWidget +{ + Q_OBJECT +public: + WorkspaceView (QWidget * parent = 0); + +public slots: + void fetchSymbolTable (); + void handleVisibilityChanged (bool visible); + +signals: + /** Custom signal that tells if a user has clicke away that dock widget. */ + void activeChanged (bool active); + +protected: + void closeEvent (QCloseEvent *event); + +private: + void updateFromSymbolTable (QList < SymbolRecord > symbolTable); + void updateTreeEntry (QTreeWidgetItem * treeItem, SymbolRecord symbolRecord); + void updateScope (int topLevelItemIndex, QList < SymbolRecord > symbolTable); + + QTreeWidget *m_variablesTreeWidget; + QSemaphore *m_updateSemaphore; +}; + +#endif // WORKSPACEVIEW_H
new file mode 100644 --- /dev/null +++ b/gui/src/backend/OctaveCallbackThread.cpp @@ -0,0 +1,50 @@ +/* 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 "OctaveCallbackThread.h" +#include "MainWindow.h" + +OctaveCallbackThread::OctaveCallbackThread (QObject * parent) + : QThread (parent) +{ + m_runningSemaphore = new QSemaphore(1); + m_running = true; +} + +void +OctaveCallbackThread::halt () +{ + m_runningSemaphore->acquire (); + m_running = false; + m_runningSemaphore->release (); +} + +void +OctaveCallbackThread::run () +{ + bool running = true; + while (running) + { + OctaveLink::instance ()->emitSymbolTableChanged(); + OctaveLink::instance ()->updateHistoryModel (); + usleep (500000); + + m_runningSemaphore->acquire (); + running = m_running; + m_runningSemaphore->release (); + } +}
new file mode 100644 --- /dev/null +++ b/gui/src/backend/OctaveCallbackThread.h @@ -0,0 +1,37 @@ +/* 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 OCTAVECALLBACKTHREAD_H +#define OCTAVECALLBACKTHREAD_H + +#include <QThread> +#include <QSemaphore> + +class OctaveCallbackThread:public QThread +{ + Q_OBJECT +public: + void halt(); + OctaveCallbackThread (QObject * parent); +protected: + void run (); +private: + QSemaphore *m_runningSemaphore; + bool m_running; +}; + +#endif // OCTAVECALLBACKTHREAD_H
new file mode 100644 --- /dev/null +++ b/gui/src/backend/OctaveLink.cpp @@ -0,0 +1,152 @@ +/* OctaveGUI - A graphical user interface for Octave + * Copyright (C) 2011 John P. Swensen, 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 "OctaveLink.h" +#include "oct-mutex.h" + +OctaveLink OctaveLink::m_singleton; + +OctaveLink::OctaveLink ():QObject () +{ + m_symbolTableSemaphore = new QSemaphore (1); + m_historyModel = new QStringListModel (this); +} + +OctaveLink::~OctaveLink () +{ +} + +QString +OctaveLink::octaveValueAsQString (OctaveValue octaveValue) +{ + // Convert single qouted string. + if (octaveValue.is_sq_string ()) + { + return QString ("\'%1\'").arg (octaveValue.string_value ().c_str ()); + + // Convert double qouted string. + } + else if (octaveValue.is_dq_string ()) + { + return QString ("\"%1\"").arg (octaveValue.string_value ().c_str ()); + + // Convert real scalar. + } + else if (octaveValue.is_real_scalar ()) + { + return QString ("%1").arg (octaveValue.scalar_value ()); + + // Convert complex scalar. + } + else if (octaveValue.is_complex_scalar ()) + { + return QString ("%1 + %2i").arg (octaveValue.scalar_value ()). + arg (octaveValue.complex_value ().imag ()); + + // Convert range. + } + else if (octaveValue.is_range ()) + { + return QString ("%1 : %2 : %3").arg (octaveValue.range_value (). + base ()).arg (octaveValue. + range_value (). + inc ()). + arg (octaveValue.range_value ().limit ()); + + // Convert real matrix. + } + else if (octaveValue.is_real_matrix ()) + { + return QString ("%1x%2 matrix") + .arg (octaveValue.matrix_value ().rows ()) + .arg (octaveValue.matrix_value ().cols ()); + + // Convert complex matrix. + } + else if (octaveValue.is_complex_matrix ()) + { + return QString ("%1x%2 complex matrix") + .arg (octaveValue.matrix_value ().rows ()) + .arg (octaveValue.matrix_value ().cols ()); + + // If everything else does not fit, we could not recognize the type. + } + else + { + return QString ("<Type not recognized>"); + } +} + +void +OctaveLink::launchOctave () +{ + // Create both threads. + m_octaveMainThread = new OctaveMainThread (this); + m_octaveCallbackThread = new OctaveCallbackThread (this); + + // Launch the second as soon as the first ist ready. + connect (m_octaveMainThread, SIGNAL(ready()), m_octaveCallbackThread, SLOT(start())); + + // Start the first one. + m_octaveMainThread->start (); +} + +void +OctaveLink::terminateOctave () +{ + m_octaveCallbackThread->halt(); + m_octaveCallbackThread->wait (); + + m_octaveMainThread->terminate (); + //m_octaveMainThread->wait(); +} + +QList < SymbolRecord > OctaveLink::symbolTable () +{ + m_symbolTableBuffer.clear (); + std::list < SymbolRecord > allVariables = symbol_table::all_variables (); + + std::list < SymbolRecord >::iterator iterator; + for (iterator = allVariables.begin (); iterator != allVariables.end (); + iterator++) + m_symbolTableBuffer.append (iterator->dup()); + return m_symbolTableBuffer; +} + +void +OctaveLink::updateHistoryModel () +{ + // Determine the client's (our) history length and the one of the server. + int clientHistoryLength = m_historyModel->rowCount (); + int serverHistoryLength = command_history::length (); + + // If were behind the server, iterate through all new entries and add them to our history. + if (clientHistoryLength < serverHistoryLength) + { + for (int i = clientHistoryLength; i < serverHistoryLength; i++) + { + m_historyModel->insertRow (0); + m_historyModel->setData (m_historyModel->index (0), QString (command_history::get_entry (i).c_str ())); + } + } +} + +QStringListModel * +OctaveLink::historyModel () +{ + return m_historyModel; +}
new file mode 100644 --- /dev/null +++ b/gui/src/backend/OctaveLink.h @@ -0,0 +1,138 @@ +/* OctaveGUI - A graphical user interface for Octave + * Copyright (C) 2011 John P. Swensen, 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 OCTAVELINK_H +#define OCTAVELINK_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/cmd-edit.h" +#include "octave/error.h" +#include "octave/file-io.h" +#include "octave/input.h" +#include "octave/lex.h" +#include "octave/load-path.h" +#include "octave/octave.h" +#include "octave/oct-hist.h" +#include "octave/oct-map.h" +#include "octave/oct-obj.h" +#include "octave/ops.h" +#include "octave/ov.h" +#include "octave/ov-usr-fcn.h" +#include "octave/symtab.h" +#include "octave/pt.h" +#include "octave/pt-eval.h" +#include "octave/config.h" +#include "octave/Range.h" +#include "octave/toplev.h" +#include "octave/procstream.h" +#include "octave/sighandlers.h" +#include "octave/debug.h" +#include "octave/sysdep.h" +#include "octave/ov.h" +#include "octave/unwind-prot.h" +#include "octave/utils.h" +#include "octave/variables.h" + +// Standard includes +#include <iostream> +#include <string> +#include <vector> +#include <readline/readline.h> + +// Qt includes +#include <QMutexLocker> +#include <QMutex> +#include <QFileInfo> +#include <QList> +#include <QString> +#include <QStringList> +#include <QVector> +#include <QSemaphore> +#include <QObject> +#include <QStringListModel> + +#include "OctaveCallbackThread.h" +#include "OctaveMainThread.h" + +typedef symbol_table::symbol_record SymbolRecord; +typedef octave_value OctaveValue; + +/** + * \class OctaveLink + * Manages a link to an octave instance. + */ +class OctaveLink:public QObject +{ + Q_OBJECT +public: + static OctaveLink * + instance () + { + return &m_singleton; + } + static QString + octaveValueAsQString (OctaveValue octaveValue); + + void launchOctave (); + void terminateOctave (); + void acquireSymbolTable () { m_symbolTableSemaphore->acquire (); } + void releaseSymbolTable () { m_symbolTableSemaphore->release (); } + + /** + * For performance reasons this is not thread safe. Before you use this, + * acquire a lock with acquireSymbolTable and releaseSymbolTable. + */ + QList < SymbolRecord > symbolTable (); + + /** + * Returns a copy of the current symbol table buffer. + * \return Copy of the current symbol table buffer. + */ + QList < SymbolRecord > copyCurrentSymbolTable (); + + void updateHistoryModel (); + QStringListModel *historyModel (); + void emitSymbolTableChanged() { emit symbolTableChanged(); } + +signals: + void symbolTableChanged (); + +private: + OctaveLink (); + ~OctaveLink (); + + /** Variable related member variables. */ + QSemaphore * m_symbolTableSemaphore; + QList < SymbolRecord > m_symbolTableBuffer; + + /** History related member variables. */ + QStringListModel *m_historyModel; + + // Threads for running octave and managing the data interaction. + OctaveMainThread *m_octaveMainThread; + OctaveCallbackThread *m_octaveCallbackThread; + + static OctaveLink m_singleton; +}; +#endif // OCTAVELINK_H
new file mode 100644 --- /dev/null +++ b/gui/src/backend/OctaveMainThread.cpp @@ -0,0 +1,33 @@ +/* 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 "OctaveMainThread.h" +#include "OctaveLink.h" + +OctaveMainThread::OctaveMainThread (QObject * parent):QThread (parent) +{ +} + +void +OctaveMainThread::run () +{ + setlocale(LC_ALL, "en_US.UTF-8"); + int argc = 1; + const char *argv[] = { "OctaveGUI" }; + emit ready(); + octave_main (argc, (char **) argv, 0); +}
new file mode 100644 --- /dev/null +++ b/gui/src/backend/OctaveMainThread.h @@ -0,0 +1,35 @@ +/* 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 OCTAVEMAINTHREAD_H +#define OCTAVEMAINTHREAD_H + +#include <QThread> +class OctaveMainThread:public QThread +{ + Q_OBJECT +public: + OctaveMainThread (QObject * parent); + +signals: + void ready(); + +protected: + void run (); +}; + +#endif // OCTAVEMAINTHREAD_H
new file mode 100644 --- /dev/null +++ b/gui/src/backend/ReadlineAdapter.cpp @@ -0,0 +1,23 @@ +/* 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 "ReadlineAdapter.h" + +ReadlineAdapter::ReadlineAdapter (QObject *parent) : + QObject (parent), command_editor () +{ +}
new file mode 100644 --- /dev/null +++ b/gui/src/backend/ReadlineAdapter.h @@ -0,0 +1,37 @@ +/* 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 READLINEADAPTER_H +#define READLINEADAPTER_H + +#include "octave/config.h" +#include "octave/cmd-edit.h" +#include <QObject> + +class ReadlineAdapter : public QObject, public command_editor +{ + Q_OBJECT +public: + explicit ReadlineAdapter (QObject *parent = 0); + +signals: + +public slots: + +}; + +#endif // READLINEADAPTER_H
new file mode 100644 --- /dev/null +++ b/gui/src/lexer/lexeroctavegui.cpp @@ -0,0 +1,141 @@ +/* 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 "lexeroctavegui.h" +#include <qcolor.h> +#include <qfont.h> + +// ----------------------------------------------------- +// Some basic functions +// ----------------------------------------------------- +LexerOctaveGui::LexerOctaveGui(QObject *parent) + : QsciLexer(parent) // inherit from base lexer +{ +} + +LexerOctaveGui::~LexerOctaveGui() +{ +} + +const char *LexerOctaveGui::language() const +{ + return "Octave"; // return the name of the language +} + +const char *LexerOctaveGui::lexer() const +{ + return "octave"; // return the name of the lexer +} + +// ----------------------------------------------------- +// The colors for syntax highlighting +// ----------------------------------------------------- +QColor LexerOctaveGui::defaultColor(int style) const +{ + switch (style) + { + case Default: // black + return QColor(0x00,0x00,0x00); + case Operator: // red + return QColor(0xef,0x00,0x00); + case Comment: // gray + return QColor(0x7f,0x7f,0x7f); + case Command: // blue-green + return QColor(0x00,0x7f,0x7f); + case Number: // orange + return QColor(0x7f,0x7f,0x00); + case Keyword: // blue + return QColor(0x00,0x00,0xbf); + case SingleQuotedString: // green + return QColor(0x00,0x7f,0x00); + case DoubleQuotedString: // green-yellow + return QColor(0x4f,0x7f,0x00); + } + return QsciLexer::defaultColor(style); +} + + +// ----------------------------------------------------- +// The font decorations for highlighting +// ----------------------------------------------------- +QFont LexerOctaveGui::defaultFont(int style) const +{ + QFont f; + + switch (style) + { + case Comment: // default but italic + f = QsciLexer::defaultFont(style); + f.setItalic(true); + break; + case Keyword: // default + f = QsciLexer::defaultFont(style); + break; + case Operator: // default + f = QsciLexer::defaultFont(style); + break; + default: // default + f = QsciLexer::defaultFont(style); + break; + } + return f; // return the selected font +} + + +// ----------------------------------------------------- +// Style names +// ----------------------------------------------------- +QString LexerOctaveGui::description(int style) const +{ + switch (style) + { + case Default: + return tr("Default"); + case Comment: + return tr("Comment"); + case Command: + return tr("Command"); + case Number: + return tr("Number"); + case Keyword: + return tr("Keyword"); + case SingleQuotedString: + return tr("Single-quoted string"); + case Operator: + return tr("Operator"); + case Identifier: + return tr("Identifier"); + case DoubleQuotedString: + return tr("Double-quoted string"); + } + return QString(); +} + + +// ----------------------------------------------------- +// The set of keywords for highlighting +// TODO: How to define a second set? +// ----------------------------------------------------- +const char *LexerOctaveGui::keywords(int set) const +{ + if (set == 1) + { + return ResourceManager::instance ()->octaveKeywords (); + } + return 0; +} +
new file mode 100644 --- /dev/null +++ b/gui/src/lexer/lexeroctavegui.h @@ -0,0 +1,61 @@ +/* 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 LEXEROCTAVE_H +#define LEXEROCTAVE_H + +#include "ResourceManager.h" +#include <QObject> + +#include <Qsci/qsciglobal.h> +#include <Qsci/qscilexer.h> + + +class LexerOctaveGui : public QsciLexer +{ + Q_OBJECT + +public: + // the used styles + enum + { + Default = 0, + Comment = 1, + Command = 2, + Number = 3, + Keyword = 4, + SingleQuotedString = 5, + Operator = 6, + Identifier = 7, + DoubleQuotedString = 8 + }; + + LexerOctaveGui(QObject *parent = 0); + virtual ~LexerOctaveGui(); + const char *language() const; + const char *lexer() const; + QColor defaultColor(int style) const; + QFont defaultFont(int style) const; + const char *keywords(int set) const; + QString description(int style) const; + +private: + LexerOctaveGui(const LexerOctaveGui &); + LexerOctaveGui &operator=(const LexerOctaveGui &); +}; + +#endif
new file mode 100644 --- /dev/null +++ b/gui/src/msvc-debug.pri @@ -0,0 +1,24 @@ +# 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/>. + +win32-msvc* { + CONFIG += release warn_off + QMAKE_CXXFLAGS += -MP + QMAKE_CXXFLAGS_RELEASE += -Zi + QMAKE_CXXFLAGS_RELEASE -= -O2 + QMAKE_LFLAGS_RELEASE += -debug + QMAKE_CLEAN += $(DESTDIR)$(QMAKE_TARGET).pdb +}
new file mode 100644 --- /dev/null +++ b/gui/src/msvc.pri @@ -0,0 +1,11 @@ +CONFIG += release + +QMAKE_CXXFLAGS += -MP +LIBDIR_SUFFIX = release + +msvc-debug { + QMAKE_CXXFLAGS_RELEASE += -Zi + QMAKE_CXXFLAGS_RELEASE -= -O2 + QMAKE_LFLAGS_RELEASE += -debug + QMAKE_CLEAN += $(DESTDIR)$(QMAKE_TARGET).pdb +}
new file mode 100644 --- /dev/null +++ b/gui/src/src.pro @@ -0,0 +1,114 @@ +# 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/>. + +# Basic settings: +QT += core gui webkit network # Qt modules +TEMPLATE = app # Build as application +TARGET = octave-gui # Name of the target binary + +DESTDIR = ../bin # Destination of the output + +TRANSLATIONS += languages/generic.ts \ + languages/de-de.ts \ + languages/pt-br.ts \ + languages/es-es.ts \ + languages/ru-ru.ts \ + languages/uk-ua.ts # Available translations + +win32-msvc*: include(msvc.pri) + +LIBS += -lqscintilla2 \ + -L../qirc/libqirc/$$LIBDIR_SUFFIX -lqirc \ + -L../qterminal/libqterminal/$$LIBDIR_SUFFIX -lqterminal \ + $$system(mkoctfile -p LIBS) \ + $$system(mkoctfile -p OCTAVE_LIBS) + +mac { + CONFIG -= app_bundle +} + +# Includepaths and libraries to link against: +INCLUDEPATH += . backend ../qterminal/libqterminal ../qirc/libqirc \ + $$system(mkoctfile -p INCFLAGS) +INCFLAGS += $$system(mkoctfile -p INCFLAGS) +mac { + INCFLAGS += -I/opt/local/include +} + +QMAKE_LIBDIR += $$system(octave-config -p OCTLIBDIR) +unix { + QMAKE_RPATHDIR += $$system(octave-config -p OCTLIBDIR) +} + +mac { + LFLAGS += -L/opt/local/lib +} + +unix { + LIBS += -lutil +} + +win32-g++ { + QMAKE_LFLAGS += --enable-auto-import +} + +win32-msvc* { + DEFINES += QSCINTILLA_DLL + QMAKE_CXXFLAGS += -wd4244 +} + +QMAKE_LFLAGS += $$LFLAGS $$system(mkoctfile -p RLD_FLAG) +QMAKE_CXXFLAGS += $$INCFLAGS + +# Files associated with the project: +SOURCES +=\ + lexer/lexeroctavegui.cpp \ + MainWindow.cpp \ + WorkspaceView.cpp \ + HistoryDockWidget.cpp \ + FilesDockWidget.cpp \ + FileEditorMdiSubWindow.cpp \ + BrowserWidget.cpp \ + SettingsDialog.cpp \ + OctaveGUI.cpp \ + ResourceManager.cpp \ + CommandLineParser.cpp \ + backend/OctaveCallbackThread.cpp \ + backend/OctaveLink.cpp \ + backend/OctaveMainThread.cpp \ + backend/ReadlineAdapter.cpp \ + WelcomeWizard.cpp + +HEADERS += \ + lexer/lexeroctavegui.h \ + MainWindow.h \ + WorkspaceView.h \ + HistoryDockWidget.h \ + FilesDockWidget.h \ + FileEditorMdiSubWindow.h \ + BrowserWidget.h \ + SettingsDialog.h \ + ResourceManager.h \ + CommandLineParser.h \ + backend/OctaveCallbackThread.h \ + backend/OctaveLink.h \ + backend/OctaveMainThread.h \ + backend/ReadlineAdapter.h \ + WelcomeWizard.h + +FORMS += \ + SettingsDialog.ui \ + WelcomeWizard.ui
new file mode 100644 --- /dev/null +++ b/gui/translators @@ -0,0 +1,8 @@ +# Below Octave GUI translators are listed with their e-mails +# to be able inform them about generic translation file changes +en-en Jacob Dawid <jacob.dawid@googlemail.com> +es-es Valentin Ortega-Clavero <arcanos3030@gmail.com> +de-de Jacob Dawid <jacob.dawid@googlemail.com> +pt-br JĂșlio Hoffimann Mendes <julio.hoffimann@gmail.com> +ru-ru Andriy Shinkarchuck <adriano32.gnu@gmail.com> +uk-ua Andriy Shinkarchuck <adriano32.gnu@gmail.com>
--- a/src/symtab.h +++ b/src/symtab.h @@ -40,6 +40,8 @@ #include "oct-refcount.h" #include "ov.h" +#include "oct-mutex.h" + class OCTINTERP_API symbol_table @@ -208,27 +210,46 @@ symbol_record_rep (const std::string& nm, const octave_value& v, unsigned int sc) - : name (nm), value_stack (), storage_class (sc), finfo (), count (1) + : finfo(), name (nm), value_stack (), storage_class (sc), count (1) { + octave_autolock lock (value_stack_mutex); value_stack.push_back (v); } + ~symbol_record_rep (void) + { + // Lock all resources one after another to guarantee noone is still + // accessing them. + octave_autolock name_lock (name_mutex); + octave_autolock value_stack_lock (value_stack_mutex); + octave_autolock storage_class_lock (storage_class_mutex); + } + void force_variable (context_id context) { octave_value& val = varref (context); - + if (! val.is_defined ()) - mark_forced (); + { + mark_forced (); + } } octave_value& varref (context_id context) { if (is_global ()) - return symbol_table::global_varref (name); + { + octave_autolock lock (name_mutex); + return symbol_table::global_varref (name); + } else if (is_persistent ()) - return symbol_table::persistent_varref (name); + { + octave_autolock lock (name_mutex); + return symbol_table::persistent_varref (name); + } else { + octave_autolock lock (value_stack_mutex); context_id n = value_stack.size (); while (n++ <= context) value_stack.push_back (octave_value ()); @@ -240,11 +261,18 @@ octave_value varval (context_id context) const { if (is_global ()) - return symbol_table::global_varval (name); + { + octave_autolock lock (name_mutex); + return symbol_table::global_varval (name); + } else if (is_persistent ()) - return symbol_table::persistent_varval (name); + { + octave_autolock lock (name_mutex); + return symbol_table::persistent_varval (name); + } else { + octave_autolock lock (value_stack_mutex); if (context < value_stack.size ()) return value_stack[context]; else @@ -255,7 +283,10 @@ void push_context (void) { if (! (is_persistent () || is_global ())) + { + octave_autolock lock (value_stack_mutex); value_stack.push_back (octave_value ()); + } } // If pop_context returns 0, we are out of values and this element @@ -278,6 +309,7 @@ if (! (is_persistent () || is_global ())) { + octave_autolock lock (value_stack_mutex); value_stack.pop_back (); retval = value_stack.size (); } @@ -314,51 +346,166 @@ return (! is_local () || is_defined (context) || is_forced ()); } - bool is_local (void) const { return storage_class & local; } - bool is_automatic (void) const { return storage_class & automatic; } - bool is_formal (void) const { return storage_class & formal; } - bool is_hidden (void) const { return storage_class & hidden; } - bool is_inherited (void) const { return storage_class & inherited; } - bool is_global (void) const { return storage_class & global; } - bool is_persistent (void) const { return storage_class & persistent; } - bool is_forced (void) const { return storage_class & forced; } - - void mark_local (void) { storage_class |= local; } - void mark_automatic (void) { storage_class |= automatic; } - void mark_formal (void) { storage_class |= formal; } - void mark_hidden (void) { storage_class |= hidden; } - void mark_inherited (void) { storage_class |= inherited; } + bool is_local (void) const + { + octave_autolock lock (storage_class_mutex); + return storage_class & local; + } + + bool is_automatic (void) const + { + octave_autolock lock (storage_class_mutex); + return storage_class & automatic; + } + + bool is_formal (void) const + { + octave_autolock lock (storage_class_mutex); + return storage_class & formal; + } + + bool is_hidden (void) const + { + octave_autolock lock (storage_class_mutex); + return storage_class & hidden; + } + + bool is_inherited (void) const + { + octave_autolock lock (storage_class_mutex); + return storage_class & inherited; + } + + bool is_global (void) const + { + octave_autolock lock (storage_class_mutex); + return storage_class & global; + } + + bool is_persistent (void) const + { + octave_autolock lock (storage_class_mutex); + return storage_class & persistent; + } + + bool is_forced (void) const + { + octave_autolock lock (storage_class_mutex); + return storage_class & forced; + } + + void mark_local (void) + { + octave_autolock lock (storage_class_mutex); + storage_class |= local; + } + + void mark_automatic (void) + { + octave_autolock lock (storage_class_mutex); + storage_class |= automatic; + } + + void mark_formal (void) + { + octave_autolock lock (storage_class_mutex); + storage_class |= formal; + } + + void mark_hidden (void) + { + octave_autolock lock (storage_class_mutex); + storage_class |= hidden; + } + + void mark_inherited (void) + { + octave_autolock lock (storage_class_mutex); + storage_class |= inherited; + } + void mark_global (void) { if (is_persistent ()) error ("can't make persistent variable %s global", name.c_str ()); else - storage_class |= global; + { + octave_autolock lock (storage_class_mutex); + storage_class |= global; + } } + void mark_persistent (void) { if (is_global ()) error ("can't make global variable %s persistent", name.c_str ()); else - storage_class |= persistent; + { + octave_autolock lock (storage_class_mutex); + storage_class |= persistent; + } } - void mark_forced (void) { storage_class |= forced; } - - void unmark_local (void) { storage_class &= ~local; } - void unmark_automatic (void) { storage_class &= ~automatic; } - void unmark_formal (void) { storage_class &= ~formal; } - void unmark_hidden (void) { storage_class &= ~hidden; } - void unmark_inherited (void) { storage_class &= ~inherited; } - void unmark_global (void) { storage_class &= ~global; } - void unmark_persistent (void) { storage_class &= ~persistent; } - void unmark_forced (void) { storage_class &= ~forced; } + + void mark_forced (void) + { + octave_autolock lock (storage_class_mutex); + storage_class |= forced; + } + + void unmark_local (void) + { + octave_autolock lock (storage_class_mutex); + storage_class &= ~local; + } + + void unmark_automatic (void) + { + octave_autolock lock (storage_class_mutex); + storage_class &= ~automatic; + } + + void unmark_formal (void) + { + octave_autolock lock (storage_class_mutex); + storage_class &= ~formal; + } + + void unmark_hidden (void) + { + octave_autolock lock (storage_class_mutex); + storage_class &= ~hidden; + } + + void unmark_inherited (void) + { + octave_autolock lock (storage_class_mutex); + storage_class &= ~inherited; + } + + void unmark_global (void) + { + octave_autolock lock (storage_class_mutex); + storage_class &= ~global; + } + + void unmark_persistent (void) + { + octave_autolock lock (storage_class_mutex); + storage_class &= ~persistent; + } + + void unmark_forced (void) + { + octave_autolock lock (storage_class_mutex); + storage_class &= ~forced; + } void init_persistent (void) { if (! is_defined (xcurrent_context)) { mark_persistent (); - + octave_autolock lock (name_mutex); varref (xcurrent_context) = symbol_table::persistent_varval (name); } // FIXME -- this causes trouble with recursive calls. @@ -369,28 +516,74 @@ void erase_persistent (void) { unmark_persistent (); + octave_autolock lock (name_mutex); symbol_table::erase_persistent (name); } symbol_record_rep *dup (void) const { + octave_autolock name_lock (name_mutex); + octave_autolock storage_class_lock (storage_class_mutex); return new symbol_record_rep (name, varval (xcurrent_context), storage_class); } void dump (std::ostream& os, const std::string& prefix) const; + std::string get_name (void) + { + octave_autolock lock (name_mutex); + return name; + } + + void set_name (std::string _name) + { + octave_autolock lock (name_mutex); + name = _name; + } + + int get_reference_count (void) + { + octave_autolock lock (count_mutex); + return static_cast <int> (count); + } + + int increment_reference_count (void) + { + octave_autolock lock (count_mutex); + count++; + return static_cast <int> (count); + } + + int decrement_reference_count (void) + { + octave_autolock lock (count_mutex); + count--; + return static_cast <int> (count); + } + + unsigned int get_storage_class (void) + { + octave_autolock lock (storage_class_mutex); + return storage_class; + } + + fcn_info *finfo; + + private: std::string name; std::deque<octave_value> value_stack; unsigned int storage_class; - fcn_info *finfo; - octave_refcount<size_t> count; - private: + // Thread-safety: + octave_mutex name_mutex; + octave_mutex value_stack_mutex; + octave_mutex storage_class_mutex; + octave_mutex count_mutex; // No copying! @@ -409,18 +602,18 @@ symbol_record (const symbol_record& sr) : rep (sr.rep) { - rep->count++; + rep->increment_reference_count (); } symbol_record& operator = (const symbol_record& sr) { if (this != &sr) { - if (--rep->count == 0) + if (rep->decrement_reference_count () == 0) delete rep; rep = sr.rep; - rep->count++; + rep->increment_reference_count (); } return *this; @@ -428,13 +621,13 @@ ~symbol_record (void) { - if (--rep->count == 0) + if (rep->decrement_reference_count () == 0) delete rep; } symbol_record dup (void) const { return symbol_record (rep->dup ()); } - std::string name (void) const { return rep->name; } + std::string name (void) const { return rep->get_name (); } octave_value find (const octave_value_list& args = octave_value_list ()) const; @@ -500,7 +693,7 @@ void erase_persistent (void) { rep->erase_persistent (); } - unsigned int xstorage_class (void) const { return rep->storage_class; } + unsigned int xstorage_class (void) const { return rep->get_storage_class (); } void dump (std::ostream& os, const std::string& prefix = std::string ()) const @@ -509,7 +702,6 @@ } private: - symbol_record_rep *rep; symbol_record (symbol_record_rep *new_rep) : rep (new_rep) { } @@ -1961,6 +2153,9 @@ // Map from symbol names to symbol info. std::map<std::string, symbol_record> table; + // Mutex for symbol table access. + octave_mutex table_mutex; + // The associated user code (may be null). octave_user_function *curr_fcn; @@ -2003,7 +2198,10 @@ symbol_table (void) : table_name (), table (), curr_fcn (0), persistent_table () { } - ~symbol_table (void) { } + ~symbol_table (void) + { + octave_autolock lock (table_mutex); + } static symbol_table *get_instance (scope_id scope, bool create = true) { @@ -2065,12 +2263,14 @@ void insert_symbol_record (const symbol_record& sr) { + octave_autolock lock (table_mutex); table[sr.name ()] = sr; } void do_dup_scope (symbol_table& new_symbol_table) const { + octave_autolock lock (table_mutex); for (table_const_iterator p = table.begin (); p != table.end (); p++) new_symbol_table.insert_symbol_record (p->second.dup ()); } @@ -2087,6 +2287,7 @@ void do_inherit (symbol_table& donor_table, context_id donor_context) { + octave_autolock lock (table_mutex); for (table_iterator p = table.begin (); p != table.end (); p++) { symbol_record& sr = p->second; @@ -2124,6 +2325,7 @@ symbol_record& do_insert (const std::string& name) { + octave_autolock lock (table_mutex); table_iterator p = table.find (name); return p == table.end () @@ -2132,6 +2334,7 @@ void do_force_variable (const std::string& name, context_id context) { + octave_autolock lock (table_mutex); table_iterator p = table.find (name); if (p == table.end ()) @@ -2146,6 +2349,7 @@ octave_value& do_varref (const std::string& name, context_id context) { + octave_autolock lock (table_mutex); table_iterator p = table.find (name); if (p == table.end ()) @@ -2160,6 +2364,7 @@ octave_value do_varval (const std::string& name, context_id context) const { + octave_autolock lock (table_mutex); table_const_iterator p = table.find (name); return (p != table.end ()) ? p->second.varval (context) : octave_value (); @@ -2175,6 +2380,7 @@ octave_value do_persistent_varval (const std::string& name) { + octave_autolock lock (table_mutex); persistent_table_const_iterator p = persistent_table.find (name); return (p != persistent_table.end ()) ? p->second : octave_value (); @@ -2182,6 +2388,7 @@ void do_erase_persistent (const std::string& name) { + octave_autolock lock (table_mutex); persistent_table_iterator p = persistent_table.find (name); if (p != persistent_table.end ()) @@ -2190,6 +2397,7 @@ bool do_is_variable (const std::string& name) const { + octave_autolock lock (table_mutex); bool retval = false; table_const_iterator p = table.find (name); @@ -2206,12 +2414,14 @@ void do_push_context (void) { + octave_autolock lock (table_mutex); for (table_iterator p = table.begin (); p != table.end (); p++) p->second.push_context (); } void do_pop_context (void) { + octave_autolock lock (table_mutex); for (table_iterator p = table.begin (); p != table.end (); ) { if (p->second.pop_context () == 0) @@ -2223,12 +2433,14 @@ void do_clear_variables (void) { + octave_autolock lock (table_mutex); for (table_iterator p = table.begin (); p != table.end (); p++) p->second.clear (); } void do_clear_objects (void) { + octave_autolock lock (table_mutex); for (table_iterator p = table.begin (); p != table.end (); p++) { symbol_record& sr = p->second; @@ -2240,12 +2452,14 @@ void do_unmark_forced_variables (void) { + octave_autolock lock (table_mutex); for (table_iterator p = table.begin (); p != table.end (); p++) p->second.unmark_forced (); } void do_clear_global (const std::string& name) { + octave_autolock lock (table_mutex); table_iterator p = table.find (name); if (p != table.end ()) @@ -2265,6 +2479,7 @@ void do_clear_variable (const std::string& name) { + octave_autolock lock (table_mutex); table_iterator p = table.find (name); if (p != table.end ()) @@ -2273,6 +2488,7 @@ void do_clear_global_pattern (const std::string& pat) { + octave_autolock lock (table_mutex); glob_match pattern (pat); for (table_iterator p = table.begin (); p != table.end (); p++) @@ -2299,6 +2515,7 @@ void do_clear_variable_pattern (const std::string& pat) { + octave_autolock lock (table_mutex); glob_match pattern (pat); for (table_iterator p = table.begin (); p != table.end (); p++) @@ -2315,6 +2532,7 @@ void do_clear_variable_regexp (const std::string& pat) { + octave_autolock lock (table_mutex); ::regexp pattern (pat); for (table_iterator p = table.begin (); p != table.end (); p++) @@ -2347,6 +2565,7 @@ std::list<symbol_record> do_all_variables (context_id context, bool defined_only) const { + octave_autolock lock (table_mutex); std::list<symbol_record> retval; for (table_const_iterator p = table.begin (); p != table.end (); p++) @@ -2365,6 +2584,7 @@ std::list<symbol_record> do_glob (const std::string& pattern, bool vars_only = false) const { + octave_autolock lock (table_mutex); std::list<symbol_record> retval; glob_match pat (pattern); @@ -2388,6 +2608,7 @@ std::list<symbol_record> do_regexp (const std::string& pattern, bool vars_only = false) const { + octave_autolock lock (table_mutex); std::list<symbol_record> retval; ::regexp pat (pattern); @@ -2410,6 +2631,7 @@ std::list<std::string> do_variable_names (void) { + octave_autolock lock (table_mutex); std::list<std::string> retval; for (table_const_iterator p = table.begin (); p != table.end (); p++) @@ -2445,6 +2667,7 @@ bool do_is_local_variable (const std::string& name) const { + octave_autolock lock (table_mutex); table_const_iterator p = table.find (name); return (p != table.end () @@ -2454,6 +2677,7 @@ bool do_is_global (const std::string& name) const { + octave_autolock lock (table_mutex); table_const_iterator p = table.find (name); return p != table.end () && p->second.is_global ();