diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 1f6e024b1..c77d30ab5 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -31,7 +31,7 @@ below with an "x", then click the "Submit new issue" button at the bottom #### I'm using DB4S version: -- [ ] 3.11.0-alpha* +- [ ] 3.11.0-alpha1 or 3.11.0-beta* - [ ] 3.10.1 - [ ] Other: ___ diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index 847a92b2f..185afb795 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -37,7 +37,7 @@ The info below often helps, please fill it out if you're able to. :) #### What is your DB4S version? -- [ ] 3.11.0-alpha* +- [ ] 3.11.0-alpha1 or 3.11.0-beta* - [ ] 3.10.1 - [ ] Other: ___ diff --git a/CMakeLists.txt b/CMakeLists.txt index 20f07fd5a..df062a25f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,33 +34,30 @@ endif () if(WIN32 AND MSVC) if(CMAKE_CL_64) # Paths for 64-bit windows builds - set(OPENSSL_PATH "C:/dev/OpenSSL-Win64") - set(QT5_PATH "C:/dev/Qt/5.10.1/msvc2013_64") - set(VSREDIST "vcredist_x64.exe") + set(OPENSSL_PATH "C:/dev/OpenSSL-Win64" CACHE PATH "OpenSSL Path") + set(QT5_PATH "C:/dev/Qt/5.11.2/msvc2017_64" CACHE PATH "Qt5 Path") # Choose between SQLCipher or SQLite, depending whether # -Dsqlcipher=1 is passed on the command line if(sqlcipher) - set(SQLITE3_PATH "C:/git_repos/SQLCipher-Win64") + set(SQLITE3_PATH "C:/git_repos/SQLCipher-Win64" CACHE PATH "SQLCipher Path") else() - set(SQLITE3_PATH "C:/dev/SQLite-Win64") + set(SQLITE3_PATH "C:/dev/SQLite-Win64" CACHE PATH "SQLite Path") endif() else() # Paths for 32-bit windows builds - set(OPENSSL_PATH "C:/dev/OpenSSL-Win32") - set(QT5_PATH "C:/dev/Qt/5.7/msvc2013") - set(VSREDIST "vcredist_x86.exe") + set(OPENSSL_PATH "C:/dev/OpenSSL-Win32" CACHE PATH "OpenSSL Path") + set(QT5_PATH "C:/dev/Qt/5.7/msvc2013" CACHE PATH "Qt5 Path") # Choose between SQLCipher or SQLite, depending whether # -Dsqlcipher=1 is passed on the command line if(sqlcipher) - set(SQLITE3_PATH "C:/git_repos/SQLCipher-Win32") + set(SQLITE3_PATH "C:/git_repos/SQLCipher-Win32" CACHE PATH "SQLCipher Path") else() - set(SQLITE3_PATH "C:/dev/SQLite-Win32") + set(SQLITE3_PATH "C:/dev/SQLite-Win32" CACHE PATH "SQLite Path") endif() endif() set(CMAKE_PREFIX_PATH "${QT5_PATH};${SQLITE3_PATH}") - set(VSREDIST_DIR "C:/dev/dependencies") endif() if(NOT FORCE_INTERNAL_ANTLR) @@ -147,6 +144,7 @@ set(SQLB_MOC_HDR src/DotenvFormat.h src/Palette.h src/CondFormat.h + src/RunSql.h ) set(SQLB_SRC @@ -197,6 +195,7 @@ set(SQLB_SRC src/DotenvFormat.cpp src/Palette.cpp src/CondFormat.cpp + src/RunSql.cpp ) set(SQLB_FORMS @@ -248,6 +247,7 @@ set(SQLB_TSS "${CMAKE_SOURCE_DIR}/src/translations/sqlb_ko_KR.ts" "${CMAKE_SOURCE_DIR}/src/translations/sqlb_tr.ts" "${CMAKE_SOURCE_DIR}/src/translations/sqlb_uk_UA.ts" + "${CMAKE_SOURCE_DIR}/src/translations/sqlb_it.ts" ) # Windows image format plugin files @@ -478,7 +478,6 @@ if(WIN32 AND MSVC) install(FILES ${QT5_PATH}/plugins/platforms/qwindows.dll DESTINATION platforms) - install(PROGRAMS "${VSREDIST_DIR}/${VSREDIST}" DESTINATION redist) # The XML dll install(FILES @@ -510,40 +509,3 @@ if(WIN32 AND MSVC) distri/winlaunch.bat DESTINATION "/") endif() - -#cpack -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "DB Browser for SQLite") -set(CPACK_PACKAGE_VENDOR "DB Browser for SQLite Team") -set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md") -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") -set(CPACK_PACKAGE_VERSION_MAJOR "3") -set(CPACK_PACKAGE_VERSION_MINOR "11") -set(CPACK_PACKAGE_VERSION_PATCH "99") -set(CPACK_PACKAGE_INSTALL_DIRECTORY "DB Browser for SQLite") -if(WIN32 AND NOT UNIX) - # There is a bug in NSIS that does not handle full unix paths properly. Make - # sure there is at least one set of four (4) backlasshes. - set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\src\\\\iconwin.ico") - set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\src\\\\iconwin.ico") - set(CPACK_NSIS_EXECUTABLES_DIRECTORY "/") - set(CPACK_NSIS_INSTALLED_ICON_NAME "DB Browser for SQLite.exe") - set(CPACK_NSIS_DISPLAY_NAME "DB Browser for SQLite") - set(CPACK_NSIS_HELP_LINK "https:\\\\\\\\github.com\\\\sqlitebrowser\\\\sqlitebrowser") - set(CPACK_NSIS_URL_INFO_ABOUT "https:\\\\\\\\github.com\\\\sqlitebrowser\\\\sqlitebrowser") - set(CPACK_NSIS_CONTACT "justin@postgresql.org") - set(CPACK_NSIS_MODIFY_PATH OFF) - set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) - set(CPACK_NSIS_MUI_FINISHPAGE_RUN "winlaunch.bat") - set(CPACK_NSIS_COMPRESSOR "/SOLID lzma") - - # VS redist - list(APPEND CPACK_NSIS_EXTRA_INSTALL_COMMANDS " - ExecWait '\\\"$INSTDIR\\\\redist\\\\${VSREDIST}\\\" /install /passive /norestart /quiet' - Delete '\\\"$INSTDIR\\\\redist\\\\${VSREDIST}\\\"' - ") -else(WIN32 AND NOT UNIX) - set(CPACK_STRIP_FILES "DB Browser for SQLite") - set(CPACK_SOURCE_STRIP_FILES "") -endif(WIN32 AND NOT UNIX) -set(CPACK_PACKAGE_EXECUTABLES "DB Browser for SQLite" "DB Browser for SQLite") -include(CPack) diff --git a/distri/winlaunch.bat b/distri/winlaunch.bat deleted file mode 100644 index 91cb36127..000000000 --- a/distri/winlaunch.bat +++ /dev/null @@ -1 +0,0 @@ -%WINDIR%\explorer.exe "DB Browser for SQLite.exe" diff --git a/installer/macos/.db4s_secure b/installer/macos/.db4s_secure new file mode 100644 index 000000000..e865b0f2e --- /dev/null +++ b/installer/macos/.db4s_secure @@ -0,0 +1,3 @@ +DEV_ID="Developer ID Application: Your name (AABBCCDDEE)" +KEYCHAIN_PASSWORD="yourpassword" +UPLOAD_SERVER="user@example.org" diff --git a/installer/macos/build_sqlitebrowser_nightly.sh b/installer/macos/build_sqlitebrowser_nightly.sh new file mode 100755 index 000000000..7ec5fb0cb --- /dev/null +++ b/installer/macos/build_sqlitebrowser_nightly.sh @@ -0,0 +1,228 @@ +#!/bin/bash + +# Builds and uploads DB Browser for SQLite nightlies, +# after updating the Homebrew dependencies + +QTVER="5.11.2" +BRANCH="master" +BREW="/usr/local/bin/brew" +BUILD_TYPE="release" +DATE=`date "+%Y%m%d"` +LOG="$HOME/db4s_nightlies/nightly.log-$DATE" +LRELEASE="$HOME/Qt/${QTVER}/clang_64/bin/lrelease" +LUPDATE="$HOME/Qt/${QTVER}/clang_64/bin/lupdate" +MACDEPLOYQT="$HOME/Qt/${QTVER}/clang_64/bin/macdeployqt" +PATH="$PATH:/usr/local/bin:/usr/sbin" +QMAKE="$HOME/Qt/${QTVER}/clang_64/bin/qmake" + +# Add the sensitive values we don't want to store in this script file +source ~/.db4s_secure + +# Update the branch to build, if specified on the command line with "-b [branch name]" +if [ "$1" = "-b" ]; then + if [ ! -z "$2" ]; then + BRANCH="$2" + echo "New branch = ${BRANCH}" >>$LOG 2>&1 + else + # Warn on missing branch name override + echo "Missing branch name after the '-b'" + exit 1 + fi +fi + +# Determine if a Release or Debug build is to be built +if [ "$3" = "-t" ]; then + if [ ! -z "$4" ]; then + BUILD_TYPE="$4" + echo "Build type = ${BUILD_TYPE}" >>$LOG 2>&1 + else + # Warn on missing build type override + echo "Missing build type after the '-t'" + exit 2 + fi +fi + +# Verify the build type is valid +if [ "${BUILD_TYPE}" != "debug" -a "${BUILD_TYPE}" != "release" ]; then + echo "Unknown build type" + exit 3 +fi + +# Ensure Homebrew is owned by my user +echo Ensure Homebrew is owned by my user >>$LOG 2>&1 +sudo chown -Rh jc:staff /usr/local >$LOG 2>&1 + +# Update Homebrew +echo Update Homebrew >>$LOG 2>&1 +$BREW update >>$LOG 2>&1 + +### Build standard version + +# Remove any existing Homebrew installed packages +echo Remove any existing Homebrew installed packages >>$LOG 2>&1 +$BREW remove `$BREW list` --force >>$LOG 2>&1 + +# Install SQLite3 +echo Install SQLite3 >>$LOG 2>&1 +$BREW install sqlite --with-functions --with-json1 --without-readline --with-fts --with-fts5 >>$LOG 2>&1 +$BREW link sqlite3 --force >>$LOG 2>&1 + +# Update the sqlitebrowser source +echo Update the sqlitebrowser source >>$LOG 2>&1 +cd $HOME/git_repos/sqlitebrowser >>$LOG 2>&1 +git reset --hard HEAD >>$LOG 2>&1 +git clean -dffx >>$LOG 2>&1 +git pull >>$LOG 2>&1 +git checkout $BRANCH >>$LOG 2>&1 + +# Update the translation files +echo Updating the translations >>$LOG 2>&1 +$LUPDATE src/src.pro >>$LOG 2>&1 +$LRELEASE src/src.pro >>$LOG 2>&1 + +# Build and package standard sqlitebrowser nightly +echo Build and package standard sqlitebrowser nightly >>$LOG 2>&1 +if [ "${BUILD_TYPE}" = "debug" ]; then + $QMAKE sqlitebrowser.pro -r -spec macx-clang CONFIG+=debug CONFIG+=x86_64 >>$LOG 2>&1 +else + $QMAKE sqlitebrowser.pro -r -spec macx-clang CONFIG+=x86_64 >>$LOG 2>&1 +fi +make -j3 >>$LOG 2>&1 +make -j3 >>$LOG 2>&1 # Seems to need a 2nd time now, due to language files needing initialisation or something + +# Include the depencencies in the .app bundle +$MACDEPLOYQT src/DB\ Browser\ for\ SQLite.app -verbose=2 >>$LOG 2>&1 + +# Copy the license files to the .dmg +echo Copying the license files to the .dmg >>$LOG 2>&1 +cp LICENSE LICENSE-PLUGINS src/DB\ Browser\ for\ SQLite.app/Contents/Resources/ >>$LOG 2>&1 + +# Copy the translation files to the .dmg +mkdir -p src/DB\ Browser\ for\ SQLite.app/Contents/translations >>$LOG 2>&1 +for i in ar zh_CN zh_TW cs en fr de it ko pl pt ru es uk; do + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qt_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtbase_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtmultimedia_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtquick1_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtscript_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtxmlpatterns_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 +done + +# Unlock the local security keychain, so signing can be done +security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${HOME}/Library/Keychains/login.keychain" + +# Sign the .app +codesign --sign "${DEV_ID}" --verbose --deep --keychain "/Library/Keychains/System.keychain" src/DB\ Browser\ for\ SQLite.app >>$LOG 2>&1 + +# Make a .dmg file from the .app +mv src/DB\ Browser\ for\ SQLite.app $HOME/appdmg/ >>$LOG 2>&1 +cd $HOME/appdmg >>$LOG 2>&1 +$BREW install npm >>$LOG 2>&1 +npm -g update >>$LOG 2>&1 +npm -g upgrade >>$LOG 2>&1 +npm -g uninstall appdmg >>$LOG 2>&1 +npm -g install appdmg >>$LOG 2>&1 +appdmg --quiet nightly.json DB\ Browser\ for\ SQLite_${DATE}.dmg >>$LOG 2>&1 +mv DB\ Browser\ for\ SQLite_${DATE}.dmg $HOME/db4s_nightlies/ >>$LOG 2>&1 +$BREW unlink sqlite3 >>$LOG 2>&1 +rm -rf $HOME/appdmg/DB\ Browser\ for\ SQLite.app >>$LOG 2>&1 + +# Upload standard sqlitebrowser nightly +echo Upload standard sqlitebrowser nightly >>$LOG 2>&1 +rsync -a $HOME/db4s_nightlies/DB\ Browser\ for\ SQLite_${DATE}.dmg nightlies@nightlies.sqlitebrowser.org:/nightlies/osx/ >>$LOG 2>&1 + +### Build SQLCipher version +# Remove any existing Homebrew installed packages +echo Remove any existing Homebrew installed packages >>$LOG 2>&1 +$BREW remove `$BREW list` --force >>$LOG 2>&1 + +# Install sqlcipher +echo Install sqlcipher >>$LOG 2>&1 +$BREW install sqlcipher --with-fts >>$LOG 2>&1 + +# Clean the sqlitebrowser source +echo Clean the sqlitebrowser source >>$LOG 2>&1 +cd $HOME/git_repos/sqlitebrowser >>$LOG 2>&1 +git reset --hard HEAD >>$LOG 2>&1 +git clean -dffx >>$LOG 2>&1 +git checkout $BRANCH >>$LOG 2>&1 + +# Update the translation files +echo Updating the translations >>$LOG 2>&1 +$LUPDATE src/src.pro >>$LOG 2>&1 +$LRELEASE src/src.pro >>$LOG 2>&1 + +# Build and package sqlitebrowser with SQLCipher support +echo Build and package sqlitebrowser with SQLCipher support >>$LOG 2>&1 +if [ "${BUILD_TYPE}" = "debug" ]; then + $QMAKE sqlitebrowser.pro -r -spec macx-clang CONFIG+=debug CONFIG+=x86_64 CONFIG+=sqlcipher >>$LOG 2>&1 +else + $QMAKE sqlitebrowser.pro -r -spec macx-clang CONFIG+=x86_64 CONFIG+=sqlcipher >>$LOG 2>&1 +fi +make -j3 >>$LOG 2>&1 +make -j3 >>$LOG 2>&1 # Seems to need a 2nd time now, due to language files needing initialisation or something + +# Include the depencencies in the .app bundle +$MACDEPLOYQT src/DB\ Browser\ for\ SQLite.app -verbose=2 >>$LOG 2>&1 + +# Copy the license files to the .dmg +echo Copying the license files to the .dmg >>$LOG 2>&1 +cp LICENSE LICENSE-PLUGINS src/DB\ Browser\ for\ SQLite.app/Contents/Resources/ >>$LOG 2>&1 + +# Copy the translation files to the .dmg +mkdir -p src/DB\ Browser\ for\ SQLite.app/Contents/translations >>$LOG 2>&1 +for i in ar zh_CN zh_TW cs en fr de it ko pl pt ru es uk; do + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qt_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtbase_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtmultimedia_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtquick1_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtscript_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtxmlpatterns_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 +done + +# Unlock the local security keychain, so signing can be done +security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${HOME}/Library/Keychains/login.keychain" + +# Sign the .app +codesign --sign "${DEV_ID}" --verbose --deep --keychain "/Library/Keychains/System.keychain" src/DB\ Browser\ for\ SQLite.app >>$LOG 2>&1 + +# Make a .dmg file from the .app +mv src/DB\ Browser\ for\ SQLite.app $HOME/appdmg/ >>$LOG 2>&1 +cd $HOME/appdmg >>$LOG 2>&1 +$BREW install npm >>$LOG 2>&1 +npm -g update >>$LOG 2>&1 +npm -g upgrade >>$LOG 2>&1 +npm -g uninstall appdmg >>$LOG 2>&1 +npm -g install appdmg >>$LOG 2>&1 +appdmg --quiet nightly.json DB\ Browser\ for\ SQLite-sqlcipher_${DATE}.dmg >>$LOG 2>&1 +mv DB\ Browser\ for\ SQLite-sqlcipher_${DATE}.dmg $HOME/db4s_nightlies/ >>$LOG 2>&1 +rm -rf $HOME/appdmg/DB\ Browser\ for\ SQLite.app >>$LOG 2>&1 + +# If building a non-master branch, remove it now that we're finished +if [ "${BRANCH}" != "master" ]; then + echo "Removing non-master branch, now we're finihed" >>$LOG 2>&1 + cd $HOME/git_repos/sqlitebrowser >>$LOG 2>&1 + git reset --hard HEAD >>$LOG 2>&1 + git clean -dffx >>$LOG 2>&1 + git checkout master >>$LOG 2>&1 + git branch -D "${BRANCH}" >>$LOG 2>&1 +fi + +# Upload sqlitebrowser nightly with SQLCipher support +echo Upload sqlitebrowser nightly with SQLCipher support >>$LOG 2>&1 +rsync -a $HOME/db4s_nightlies/DB\ Browser\ for\ SQLite-sqlcipher_${DATE}.dmg nightlies@nightlies.sqlitebrowser.org:/nightlies/osx/ >>$LOG 2>&1 + +# Upload the nightlies build log +echo Upload the build log >>$LOG 2>&1 +rsync -a $HOME/db4s_nightlies/nightly.log-${DATE} nightlies@nightlies.sqlitebrowser.org:/nightlies/osx/ >>$LOG 2>&1 + +# Add the new builds to the "latest" directory +ssh ${UPLOAD_SERVER} "cd /nightlies/latest; rm -f *dmg" >>$LOG 2>&1 +ssh ${UPLOAD_SERVER} "cd /nightlies/latest; cp /nightlies/osx/DB\ Browser\ for\ SQLite_${DATE}.dmg /nightlies/latest/DB.Browser.for.SQLite.dmg" >>$LOG 2>&1 +ssh ${UPLOAD_SERVER} "cd /nightlies/latest; cp /nightlies/osx/DB\ Browser\ for\ SQLite-sqlcipher_${DATE}.dmg /nightlies/latest/DB.Browser.for.SQLite-sqlcipher.dmg" >>$LOG 2>&1 + +# Remove the nightlies from the local filesystem as we no longer need them +#echo Remove the nightlies from the local filesystem as we no longer need them >>$LOG 2>&1 +#rm -f $HOME/db4s_nightlies/sqlitebrowser_${DATE}.dmg $HOME/db4s_nightlies/sqlitebrowser-sqlcipher_${DATE}.dmg >>$LOG 2>&1 + +echo Done! >>$LOG 2>&1 diff --git a/installer/windows/build.cmd b/installer/windows/build.cmd index 3485582d1..af86b2b67 100644 --- a/installer/windows/build.cmd +++ b/installer/windows/build.cmd @@ -1,7 +1,7 @@ @echo off :: Output file name -set MSI=DB.Browser.for.SQLite +set MSI=DB.Browser.for.SQLite-%1 :: Set the ARCH based on the first parameter if "%1"=="" ( @@ -16,18 +16,6 @@ if "%1"=="" ( goto :eof ) -:: Choose between building the application with SQLite (default) or SQLCipher library -if "%2"=="" ( - set SQLCIPHER= - set MSI=%MSI%-%1 -) else if "%2"=="sqlcipher" ( - set MSI=%MSI%-sqlcipher-%1 - set SQLCIPHER=-dSQLCipher=1 -) else ( - echo ERROR: Second parameter can only be "sqlcipher" or nothing - goto :eof -) - :: Suppress some ICE checks :: - 61 (major upgrade) :: - 03 & 82 (merge module) @@ -39,9 +27,11 @@ set ICE=-sice:ICE03 -sice:ICE82 -sice:ICE61 -sice:ICE38 -sice:ICE43 -sice:ICE57 set LIGHT=-sw1104 :: Compile & Link -"%WIX%\bin\candle.exe" -nologo -pedantic -arch %ARCH% %SQLCIPHER% product.wxs -"%WIX%\bin\light.exe" -sval -nologo -pedantic %LIGHT% %ICE% -ext WixUIExtension -ext WixUtilExtension -cultures:en-us -loc strings.wxl product.wixobj -out %MSI%.msi +"%WIX%\bin\candle.exe" -nologo -pedantic -arch %ARCH% product.wxs translations.wxs ui.wxs +"%WIX%\bin\light.exe" -sval -nologo -pedantic %LIGHT% %ICE% -ext WixUIExtension -ext WixUtilExtension -cultures:en-us -loc strings.wxl product.wixobj translations.wixobj ui.wixobj -out %MSI%.msi :: Cleanup del product.wixobj +del translations.wixobj +del ui.wixobj del %MSI%.wixpdb diff --git a/installer/windows/nightly_build_script/winbuild.bat b/installer/windows/nightly_build_script/winbuild.bat deleted file mode 100644 index 4bbf55799..000000000 --- a/installer/windows/nightly_build_script/winbuild.bat +++ /dev/null @@ -1,180 +0,0 @@ -:: Destination path - specify where to move package after build -set DEST_PATH=C:\\builds -MKDIR "%DEST_PATH%" -MKDIR "%DEST_PATH%\tmp\" - -set SQLITE_DIR=C:\\dev\\SQLite- -set SQLCIPHER_DIR=C:\\git_repos\\SQLCipher- - -:: You need to change the date format in Windows settings to YYYY-MM-DD -:: before this will work properly. ;) -set RUN_DATE=%DATE% - -:: If no branch given on the command line, use master -IF "%1"=="" (SET BRANCH="master") ELSE (SET BRANCH="%1") - -cd /d "C:\" -if exist "git_repos" rd /q /s "git_repos" -if exist "%SQLITE_DIR%Win32" rd /q /s "%SQLITE_DIR%Win32" -if exist "%SQLITE_DIR%Win64" rd /q /s "%SQLITE_DIR%Win64" -if exist "%SQLCIPHER_DIR%Win32" rd /q /s "%SQLCIPHER_DIR%Win32" -if exist "%SQLCIPHER_DIR%Win64" rd /q /s "%SQLCIPHER_DIR%Win64" - -:: Unpack SQLite -cd C:\dev -"C:\Program Files\7-Zip\7z.exe" e sqlite*zip "-o%SQLITE_DIR%Win32" -"C:\Program Files\7-Zip\7z.exe" e sqlite*zip "-o%SQLITE_DIR%Win64" - -:: Clone repositories -MKDIR "C:\\git_repos" -cd C:\\git_repos -git clone -b msvc2013_win32 --depth 1 https://github.com/justinclift/sqlcipher.git SQLCipher-Win32 -git clone -b msvc2013_win64 --depth 1 https://github.com/justinclift/sqlcipher.git SQLCipher-Win64 -git clone -b %BRANCH% https://github.com/sqlitebrowser/sqlitebrowser.git - - -:: WIN32 SQLITE BUILD PROCEDURE - -:: Set path variables -call "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\vcvars32.bat" - -:: Build SQLite x86 -cd %SQLITE_DIR%Win32 -cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_JSON1 -DSQLITE_API=_declspec(dllexport) -link -dll -out:sqlite3.dll - -:: Run CMake for SQLite x86 -cd C:\\git_repos\\sqlitebrowser -MKDIR "release-sqlite-win32" -cd "release-sqlite-win32" -cmake -G "Visual Studio 12 2013" -Wno-dev .. - -:: Build package -FOR %%I IN (*.sln) DO devenv /Build Release "%%I" /project "PACKAGE" - -:: Copy .exe to destination. Weirdly, this needs to be done in two steps as doing -:: it with a single MOVE always results in a broken .exe 4k in size -COPY /Y C:\\git_repos\\sqlitebrowser\\release-sqlite-win32\\DB*.exe "%DEST_PATH%\\tmp\\" -MOVE /Y %DEST_PATH%\\tmp\\DB*.exe "%DEST_PATH%\\DB Browser for SQLite-%RUN_DATE%-win32.exe" - -:: Build MSI -MKDIR C:\\git_repos\\sqlitebrowser\\Release -MOVE C:\\git_repos\\sqlitebrowser\\release-sqlite-win32\\Release\\*.exe C:\\git_repos\\sqlitebrowser\\Release -cd C:\\git_repos\\sqlitebrowser\\installer\\windows -CALL build.cmd win32 - -:: Move package to DEST_PATH -MOVE /Y *msi "%DEST_PATH%\DB Browser for SQLite-%RUN_DATE%-win32.msi" - - -:: WIN32 SQLCIPHER BUILD PROCEDURE - -:: Build SQLCipher x86 -cd %SQLCIPHER_DIR%Win32 -nmake /f Makefile.msc - -:: Run CMake for SQLCipher x86 -cd C:\\git_repos\\sqlitebrowser -MKDIR "release-sqlcipher-win32" -cd "release-sqlcipher-win32" -cmake -G "Visual Studio 12 2013" -Wno-dev -Dsqlcipher=1 .. - -:: Build package -FOR %%I IN (*.sln) DO devenv /Build Release "%%I" /project "PACKAGE" - -:: Copy .exe to destination. Weirdly, this needs to be done in two steps as doing -:: it with a single MOVE always results in a broken .exe 4k in size -COPY /Y C:\\git_repos\\sqlitebrowser\\release-sqlcipher-win32\\DB*.exe "%DEST_PATH%\\tmp\\" -MOVE /Y %DEST_PATH%\\tmp\\DB*.exe "%DEST_PATH%\\DB Browser for SQLite-sqlcipher-%RUN_DATE%-win32.exe" - -:: Build MSI -MKDIR C:\\git_repos\\sqlitebrowser\\Release -MOVE C:\\git_repos\\sqlitebrowser\\release-sqlcipher-win32\\Release\\*.exe C:\\git_repos\\sqlitebrowser\\Release -cd C:\\git_repos\\sqlitebrowser\\installer\\windows -CALL build.cmd win32 sqlcipher - -:: Move package to DEST_PATH -MOVE /Y *msi "%DEST_PATH%\DB Browser for SQLite-sqlcipher-%RUN_DATE%-win32.msi" - - -:: WIN64 SQLITE BUILD PROCEDURE - -:: Set path variables -call "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\amd64\\vcvars64.bat" - -:: Build SQLite x64 -cd %SQLITE_DIR%Win64 -cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_JSON1 -DSQLITE_API=_declspec(dllexport) -link -dll -out:sqlite3.dll - -:: Run CMake for SQLite x64 -cd C:\\git_repos\\sqlitebrowser -MKDIR "release-sqlite-win64" -cd "release-sqlite-win64" -cmake -G "Visual Studio 12 2013 Win64" -Wno-dev .. - -:: Build package -FOR %%I IN (*.sln) DO devenv /Build Release "%%I" /project "PACKAGE" - -:: Copy .exe to destination. Weirdly, this needs to be done in two steps as doing -:: it with a single MOVE always results in a broken .exe 4k in size -COPY /Y C:\\git_repos\\sqlitebrowser\\release-sqlite-win64\\DB*.exe "%DEST_PATH%\\tmp\\" -MOVE /Y %DEST_PATH%\\tmp\\DB*.exe "%DEST_PATH%\DB Browser for SQLite-%RUN_DATE%-win64.exe" - -:: Build MSI -MKDIR C:\\git_repos\\sqlitebrowser\\Release -MOVE C:\\git_repos\\sqlitebrowser\\release-sqlite-win64\\Release\\*.exe C:\\git_repos\\sqlitebrowser\\Release -cd C:\\git_repos\\sqlitebrowser\\installer\\windows -CALL build.cmd win64 - -:: Move package to DEST_PATH -MOVE /Y *msi "%DEST_PATH%\DB Browser for SQLite-%RUN_DATE%-win64.msi" - - -:: WIN64 SQLCIPHER BUILD PROCEDURE - -:: Build SQLCipher x64 -cd %SQLCIPHER_DIR%Win64 -nmake /f Makefile.msc - -:: Run CMake for SQLCipher x64 -cd C:\\git_repos\\sqlitebrowser -MKDIR "release-sqlcipher-win64" -cd "release-sqlcipher-win64" -cmake -G "Visual Studio 12 2013 Win64" -Wno-dev -Dsqlcipher=1 .. - -:: Build package -FOR %%I IN (*.sln) DO devenv /Build Release "%%I" /project "PACKAGE" - -:: Copy .exe to destination. Weirdly, this needs to be done in two steps as doing -:: it with a single MOVE always results in a broken .exe 4k in size -COPY /Y C:\\git_repos\\sqlitebrowser\\release-sqlcipher-win64\\DB*.exe "%DEST_PATH%\\tmp\\" -MOVE /Y %DEST_PATH%\\tmp\\DB*.exe "%DEST_PATH%\DB Browser for SQLite-sqlcipher-%RUN_DATE%-win64.exe" - -:: Build MSI -MKDIR C:\\git_repos\\sqlitebrowser\\Release -MOVE C:\\git_repos\\sqlitebrowser\\release-sqlcipher-win64\\Release\\*.exe C:\\git_repos\\sqlitebrowser\\Release -cd C:\\git_repos\\sqlitebrowser\\installer\\windows -CALL build.cmd win64 sqlcipher - -:: Move package to DEST_PATH -MOVE /Y *msi "%DEST_PATH%\DB Browser for SQLite-sqlcipher-%RUN_DATE%-win64.msi" - -:: Upload the packages to the nightlies server -pscp -q -p -i C:\dev\puttygen_private.ppk "%DEST_PATH%\DB*%RUN_DATE%*win32.exe" nightlies@nightlies.sqlitebrowser.org:/nightlies/win32 -pscp -q -p -i C:\dev\puttygen_private.ppk "%DEST_PATH%\DB*%RUN_DATE%*win32.msi" nightlies@nightlies.sqlitebrowser.org:/nightlies/win32 -pscp -q -p -i C:\dev\puttygen_private.ppk "%DEST_PATH%\DB*%RUN_DATE%*win64.exe" nightlies@nightlies.sqlitebrowser.org:/nightlies/win64 -pscp -q -p -i C:\dev\puttygen_private.ppk "%DEST_PATH%\DB*%RUN_DATE%*win64.msi" nightlies@nightlies.sqlitebrowser.org:/nightlies/win64 - -:: Copy the new binaries to /latest directory on the nightlies server -plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cd /nightlies/latest; rm -f *.exe *.msi" -plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win32/DB*SQLite-%RUN_DATE%-win32.exe /nightlies/latest/DB.Browser.for.SQLite-win32.exe" -plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win32/DB*SQLite-%RUN_DATE%-win32.msi /nightlies/latest/DB.Browser.for.SQLite-win32.msi" -plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win32/DB*sqlcipher-%RUN_DATE%-win32.exe /nightlies/latest/DB.Browser.for.SQLite-sqlcipher-win32.exe" -plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win32/DB*sqlcipher-%RUN_DATE%-win32.msi /nightlies/latest/DB.Browser.for.SQLite-sqlcipher-win32.msi" -plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win64/DB*SQLite-%RUN_DATE%-win64.exe /nightlies/latest/DB.Browser.for.SQLite-win64.exe" -plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win64/DB*SQLite-%RUN_DATE%-win64.msi /nightlies/latest/DB.Browser.for.SQLite-win64.msi" -plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win64/DB*sqlcipher-%RUN_DATE%-win64.exe /nightlies/latest/DB.Browser.for.SQLite-sqlcipher-win64.exe" -plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win64/DB*sqlcipher-%RUN_DATE%-win64.msi /nightlies/latest/DB.Browser.for.SQLite-sqlcipher-win64.msi" - -:: Wipe working dir -cd /d C:\ -rd /q /s "C:\\git_repos" diff --git a/installer/windows/nightly_build_scripts/win32build.bat b/installer/windows/nightly_build_scripts/win32build.bat new file mode 100755 index 000000000..8ff175954 --- /dev/null +++ b/installer/windows/nightly_build_scripts/win32build.bat @@ -0,0 +1,114 @@ +:: Destination path - specify where to move package after build +SET DEST_PATH=C:\\builds +MKDIR "%DEST_PATH%" + +SET ZIP_EXE="C:\Program Files\7-Zip\7z.exe" +SET SQLITE_DIR=C:\\dev\\SQLite-Win32 +SET SQLCIPHER_DIR=C:\\git_repos\\SQLCipher-Win32 +SET SQLCIPHER_TAG=v3.4.2 + +:: You need to change the date format in Windows settings to YYYY-MM-DD +:: before this will work properly. ;) +set RUN_DATE=%DATE% + +:: If no branch given on the command line, use master +IF "%1"=="" (SET BRANCH="master") ELSE (SET BRANCH="%1") + +CD /d "C:\" +if exist "%SQLITE_DIR%" rd /q /s "%SQLITE_DIR%" +if exist "C:\\builds\\release-sqlite-win32" rd /q /s "C:\\builds\\release-sqlite-win32" +if exist "C:\\builds\\release-sqlcipher-win32" rd /q /s "C:\\builds\\release-sqlcipher-win32" + +:: Unpack SQLite +CD C:\dev +%ZIP_EXE% e sqlite*zip "-o%SQLITE_DIR%" + +:: Update repositories +::git clone -b v3.4.2 https://github.com/sqlcipher/sqlcipher.git SQLCipher-Win32 +CD C:\\git_repos\\SQLCipher-Win32 +git clean -dffx +git checkout -f HEAD +git checkout master +git pull +git checkout "%SQLCIPHER_TAG%" +git clean -dffx +git pull +git clean -dffx + +::git clone -b %BRANCH% https://github.com/sqlitebrowser/sqlitebrowser.git "%DB4S_DIR%Win32" +CD C:\\git_repos\\sqlitebrowser +git clean -dffx +git checkout -f HEAD +git checkout master +git pull +git checkout %BRANCH% +git clean -dffx +git pull +git clean -dffx + + +:: WIN32 SQLITE BUILD PROCEDURE + +:: Set path variables +CALL "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\vcvars32.bat" + +:: Build SQLite x86 +CD %SQLITE_DIR% +cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_JSON1 -DSQLITE_API=__declspec(dllexport) -link -dll -out:sqlite3.dll + +:: Build Math extension x86 +COPY C:\git_repos\sqlitebrowser\src\extensions\extension-functions.c +COPY C:\git_repos\sqlitebrowser\src\extensions\extension-functions.def +cl /MD extension-functions.c -link -dll -def:extension-functions.def -out:math.dll + +:: Run CMake for SQLite x86 +CD C:\\builds +MKDIR "release-sqlite-win32" +CD "release-sqlite-win32" +cmake -G "Visual Studio 12 2013" -Wno-dev C:\\git_repos\\sqlitebrowser + +:: Build package +devenv /Build Release sqlitebrowser.sln /project "ALL_BUILD" + + +:: WIN32 SQLCIPHER BUILD PROCEDURE + +:: Build SQLCipher x86 +CD %SQLCIPHER_DIR% +nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL-Win32\lib\libeay32.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_JSON1=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -IC:\dev\OpenSSL-Win32\include" + +:: Run CMake for SQLCipher x86 +CD C:\\builds +MKDIR "release-sqlcipher-win32" +CD "release-sqlcipher-win32" +cmake -G "Visual Studio 12 2013" -Wno-dev -Dsqlcipher=1 C:\\git_repos\\sqlitebrowser + +:: Build package +devenv /Build Release sqlitebrowser.sln /project "ALL_BUILD" + +:: Rename SQLCipher +CD "Release" +MOVE "DB Browser for SQLite.exe" "DB Browser for SQLCipher.exe" + +:: Build MSI +CD C:\\git_repos\\sqlitebrowser\\installer\\windows +CALL build.cmd win32 + +:: Move package to DEST_PATH +MOVE /Y *.msi "%DEST_PATH%\DB.Browser.for.SQLite-%RUN_DATE%-win32.msi" + +:: Create ZIP +CD %DEST_PATH% +msiexec /a "DB.Browser.for.SQLite-%RUN_DATE%-win32.msi" /q TARGETDIR=%CD%\zip +MOVE %CD%\zip\System\* "%CD%\zip\DB Browser for SQLite" +%ZIP_EXE% a "DB.Browser.for.SQLite-%RUN_DATE%-win32.zip" "%CD%\zip\DB Browser for SQLite" +RMDIR /S /Q %CD%\zip + + +:: Upload the packages to the nightlies server +pscp -q -p -i C:\dev\puttygen_private.ppk "%DEST_PATH%\DB*%RUN_DATE%*win32.*" nightlies@nightlies.sqlitebrowser.org:/nightlies/win32 + +:: Copy the new binaries to /latest directory on the nightlies server +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cd /nightlies/latest; rm -f *-win32.*" +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win32/DB*SQLite-%RUN_DATE%-win32.msi /nightlies/latest/DB.Browser.for.SQLite-win32.msi" +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win32/DB*SQLite-%RUN_DATE%-win32.zip /nightlies/latest/DB.Browser.for.SQLite-win32.zip" diff --git a/installer/windows/nightly_build_scripts/win64build.bat b/installer/windows/nightly_build_scripts/win64build.bat new file mode 100755 index 000000000..7710b2e58 --- /dev/null +++ b/installer/windows/nightly_build_scripts/win64build.bat @@ -0,0 +1,114 @@ +:: Destination path - specify where to move package after build +SET DEST_PATH=C:\\builds +MKDIR "%DEST_PATH%" + +SET ZIP_EXE="C:\Program Files\7-Zip\7z.exe" +SET SQLITE_DIR=C:\\dev\\SQLite-Win64 +SET SQLCIPHER_DIR=C:\\git_repos\\SQLCipher-Win64 +SET SQLCIPHER_TAG=v3.4.2 + +:: You need to change the date format in Windows settings to YYYY-MM-DD +:: before this will work properly. ;) +set RUN_DATE=%DATE% + +:: If no branch given on the command line, use master +IF "%1"=="" (SET BRANCH="master") ELSE (SET BRANCH="%1") + +CD /d "C:\" +if exist "%SQLITE_DIR%" rd /q /s "%SQLITE_DIR%" +if exist "C:\\builds\\release-sqlite-win64" rd /q /s "C:\\builds\\release-sqlite-win64" +if exist "C:\\builds\\release-sqlcipher-win64" rd /q /s "C:\\builds\\release-sqlcipher-win64" + +:: Unpack SQLite +CD C:\dev +%ZIP_EXE% e sqlite*zip "-o%SQLITE_DIR%" + +:: Update repositories +::git clone -b v3.4.2 https://github.com/sqlcipher/sqlcipher.git SQLCipher-Win64 +CD C:\\git_repos\\SQLCipher-Win64 +git clean -dffx +git checkout -f HEAD +git checkout master +git pull +git checkout "%SQLCIPHER_TAG%" +git clean -dffx +git pull +git clean -dffx + +::git clone -b %BRANCH% https://github.com/sqlitebrowser/sqlitebrowser.git "%DB4S_DIR%Win64" +CD C:\\git_repos\\sqlitebrowser +git clean -dffx +git checkout -f HEAD +git checkout master +git pull +git checkout %BRANCH% +git clean -dffx +git pull +git clean -dffx + + +:: WIN64 SQLITE BUILD PROCEDURE + +:: Set path variables +CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" + +:: Build SQLite x64 +CD %SQLITE_DIR% +cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_JSON1 -DSQLITE_API=__declspec(dllexport) -link -dll -out:sqlite3.dll + +:: Build Math extension x64 +COPY C:\git_repos\sqlitebrowser\src\extensions\extension-functions.c +COPY C:\git_repos\sqlitebrowser\src\extensions\extension-functions.def +cl /MD extension-functions.c -link -dll -def:extension-functions.def -out:math.dll + +:: Run CMake for SQLite x64 +CD C:\\builds +MKDIR "release-sqlite-win64" +CD "release-sqlite-win64" +cmake -G "Visual Studio 15 2017 Win64" -Wno-dev C:\\git_repos\\sqlitebrowser + +:: Build package +devenv /Build Release sqlitebrowser.sln /project "ALL_BUILD" + + +:: WIN64 SQLCIPHER BUILD PROCEDURE + +:: Build SQLCipher x64 +CD %SQLCIPHER_DIR% +nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL-Win64\lib\libeay32.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_JSON1=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -IC:\dev\OpenSSL-Win64\include" + +:: Run CMake for SQLCipher x64 +CD C:\\builds +MKDIR "release-sqlcipher-win64" +CD "release-sqlcipher-win64" +cmake -G "Visual Studio 15 2017 Win64" -Wno-dev -Dsqlcipher=1 C:\\git_repos\\sqlitebrowser + +:: Build package +devenv /Build Release sqlitebrowser.sln /project "ALL_BUILD" + +:: Rename SQLCipher +CD "Release" +MOVE "DB Browser for SQLite.exe" "DB Browser for SQLCipher.exe" + +:: Build MSI +CD C:\\git_repos\\sqlitebrowser\\installer\\windows +CALL build.cmd win64 + +:: Move package to DEST_PATH +MOVE /Y *.msi "%DEST_PATH%\DB.Browser.for.SQLite-%RUN_DATE%-win64.msi" + +:: Create ZIP +CD %DEST_PATH% +msiexec /a "DB.Browser.for.SQLite-%RUN_DATE%-win64.msi" /q TARGETDIR=%CD%\zip +MOVE %CD%\zip\System64\* "%CD%\zip\DB Browser for SQLite" +%ZIP_EXE% a "DB.Browser.for.SQLite-%RUN_DATE%-win64.zip" "%CD%\zip\DB Browser for SQLite" +RMDIR /S /Q %CD%\zip + + +:: Upload the packages to the nightlies server +pscp -q -p -i C:\dev\puttygen_private.ppk "%DEST_PATH%\DB*%RUN_DATE%*win64.*" nightlies@nightlies.sqlitebrowser.org:/nightlies/win64 + +:: Copy the new binaries to /latest directory on the nightlies server +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cd /nightlies/latest; rm -f *-win64.*" +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win64/DB*SQLite-%RUN_DATE%-win64.msi /nightlies/latest/DB.Browser.for.SQLite-win64.msi" +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win64/DB*SQLite-%RUN_DATE%-win64.zip /nightlies/latest/DB.Browser.for.SQLite-win64.zip" diff --git a/installer/windows/product.wxs b/installer/windows/product.wxs index 9139619d7..30d3970ac 100644 --- a/installer/windows/product.wxs +++ b/installer/windows/product.wxs @@ -5,7 +5,7 @@ - + @@ -62,6 +62,15 @@ + + + + + + + + + @@ -92,24 +101,34 @@ - - - - - - + + + + - - - + + SHORTCUT_SQLITE_DESKTOP + + + + + SHORTCUT_SQLCIPHER_DESKTOP + + - - - + + SHORTCUT_SQLITE_PROGRAMMENU + + + + + SHORTCUT_SQLCIPHER_PROGRAMMENU + + @@ -122,15 +141,25 @@ - - - - - - + + + + + + + + + + + + + + + + @@ -163,32 +192,51 @@ - - - - - - + + + + - - - - - - - + + + + + + + + + LicenseAccepted = "1" + NOT Installed + + + + + + + + + + + + + + + + + + @@ -209,6 +257,39 @@ + + + + + + + + + + NSIS_INSTALLDIR + + + + + + + NSIS_INSTALLDIR + + diff --git a/installer/windows/strings.wxl b/installer/windows/strings.wxl index 0ab05b167..f5af817de 100644 --- a/installer/windows/strings.wxl +++ b/installer/windows/strings.wxl @@ -1,6 +1,14 @@ - This Setup Wizard will install [ProductName] on your computer. + This Setup Wizard will install [ProductName] on your computer. If you have a previous version already installed, this installation process will update it. -If you have a previous version already installed, this will update it. + + [ProductName] Setup + {\WixUI_Font_Title}Shortcuts + Select the shortcuts for the application. + [ProductName] uses the latest version of SQLite, so you can enjoy all of its new features and bug fixes, but it does not have encryption support. It is also built with SQLCipher as a separate application. SQLCipher is an open source extension to SQLite providing transparent 256-bit AES encryption of database files, but uses a slightly older version of SQLite. Both applications (with and without SQLCipher) are installed and can run concurrently. This page allows you to choose the shortcuts for each application and where to place them. + DB Browser (SQLite) + DB Browser (SQLCipher) + Desktop + Program Menu diff --git a/installer/windows/translations.wxs b/installer/windows/translations.wxs new file mode 100644 index 000000000..6c85bec3e --- /dev/null +++ b/installer/windows/translations.wxs @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installer/windows/ui.wxs b/installer/windows/ui.wxs new file mode 100644 index 000000000..1d397bf0b --- /dev/null +++ b/installer/windows/ui.wxs @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + 1 + + + + + diff --git a/installer/windows/variables.wxi b/installer/windows/variables.wxi index cbcdc2935..34f6e0a20 100644 --- a/installer/windows/variables.wxi +++ b/installer/windows/variables.wxi @@ -40,8 +40,13 @@ Visual Studio 2013. The build "ARCH" will be set automatically. --> - - + + + + + + + - + + + + + diff --git a/libs/DB4S_PATCH_02 b/libs/DB4S_PATCH_02 deleted file mode 100644 index c71750828..000000000 --- a/libs/DB4S_PATCH_02 +++ /dev/null @@ -1,18 +0,0 @@ -diff --git a/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp b/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -index d40b742..4c9fe75 100644 ---- a/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -+++ b/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -@@ -386,7 +386,12 @@ void QsciScintilla::callTip() - ct = ct_entries.join("\n"); - } - -- QByteArray ct_ba = ct.toLatin1(); -+ QByteArray ct_ba; -+ if (isUtf8()) -+ ct_ba = ct.toUtf8(); -+ else -+ ct_ba = ct.toLatin1(); -+ - const char *cts = ct_ba.data(); - - SendScintilla(SCI_CALLTIPSHOW, adjustedCallTipPosition(shift), cts); diff --git a/libs/DB4S_PATCH_03 b/libs/DB4S_PATCH_03 deleted file mode 100644 index d4008aed8..000000000 --- a/libs/DB4S_PATCH_03 +++ /dev/null @@ -1,70 +0,0 @@ -diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h b/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h -index 3b5f185..49ca5cc 100644 ---- a/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h -+++ b/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h -@@ -2009,6 +2009,34 @@ public slots: - //! \sa zoomIn(), zoomOut() - virtual void zoomTo(int size); - -+ //! For performance, Scintilla does not measure the display width -+ //! of the document to determine the properties of the horizontal -+ //! scroll bar. Instead, an assumed width is used. This sets the -+ //! document width in pixels assumed by Scintilla to \a -+ //! pixelWidth. The default value is 2000. -+ //! -+ //! \sa getScrollWidth(), setScrollWidthTracking() -+ virtual void setScrollWidth(int pixelWidth); -+ -+ //! Gets the document width in pixels assumed by Scintilla. -+ //! -+ //! \sa setScrollWidth(), setScrollWidthTracking() -+ virtual int getScrollWidth() const; -+ -+ //! If scroll width tracking is enabled then the scroll width is -+ //! adjusted to ensure that all of the lines currently displayed -+ //! can be completely scrolled. This mode never adjusts the scroll -+ //! width to be narrower. -+ //! Sets the scroll width tracking to \a enabled. -+ //! -+ //! \sa setScrollWidth(), getScrollWidthTracking() -+ virtual void setScrollWidthTracking(bool enabled); -+ -+ //! Gets the current scroll width tracking mode. -+ //! -+ //! \sa getScrollWidth(), setScrollWidthTracking() -+ virtual bool getScrollWidthTracking() const; -+ - signals: - //! This signal is emitted whenever the cursor position changes. \a line - //! contains the line number and \a index contains the character index -diff --git a/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp b/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -index 4c9fe75..31dc579 100644 ---- a/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -+++ b/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -@@ -4481,3 +4481,26 @@ static QColor asQColor(long sci_colour) - ((int)(sci_colour >> 8)) & 0x00ff, - ((int)(sci_colour >> 16)) & 0x00ff); - } -+ -+void QsciScintilla::setScrollWidth(int pixelWidth) -+{ -+ SendScintilla(SCI_SETSCROLLWIDTH, pixelWidth); -+} -+ -+int QsciScintilla::getScrollWidth() const -+{ -+ return SendScintilla(SCI_GETSCROLLWIDTH); -+} -+ -+void QsciScintilla::setScrollWidthTracking(bool enabled) -+{ -+ SendScintilla(SCI_SETSCROLLWIDTHTRACKING, enabled); -+} -+ -+bool QsciScintilla::getScrollWidthTracking() const -+{ -+ return SendScintilla(SCI_GETSCROLLWIDTHTRACKING); -+} -+ -+ -+ diff --git a/libs/DB4S_PATCH_04 b/libs/DB4S_PATCH_04 deleted file mode 100644 index ed3fa9d21..000000000 --- a/libs/DB4S_PATCH_04 +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/libs/qscintilla/lexers/LexJSON.cpp b/libs/qscintilla/lexers/LexJSON.cpp -index 9c044e5..6c06061 100644 ---- a/libs/qscintilla/lexers/LexJSON.cpp -+++ b/libs/qscintilla/lexers/LexJSON.cpp -@@ -457,7 +457,9 @@ void SCI_METHOD LexerJSON::Fold(Sci_PositionU startPos, - LexAccessor styler(pAccess); - Sci_PositionU currLine = styler.GetLine(startPos); - Sci_PositionU endPos = startPos + length; -- int currLevel = styler.LevelAt(currLine) & SC_FOLDLEVELNUMBERMASK; -+ int currLevel = SC_FOLDLEVELBASE; -+ if (currLine > 0) -+ currLevel = styler.LevelAt(currLine - 1) >> 16; - int nextLevel = currLevel; - int visibleChars = 0; - for (Sci_PositionU i = startPos; i < endPos; i++) { -@@ -472,7 +474,7 @@ void SCI_METHOD LexerJSON::Fold(Sci_PositionU startPos, - } - } - if (atEOL || i == (endPos-1)) { -- int level = currLevel; -+ int level = currLevel | nextLevel << 16; - if (!visibleChars && options.foldCompact) { - level |= SC_FOLDLEVELWHITEFLAG; - } else if (nextLevel > currLevel) { diff --git a/libs/DB4S_PATCH_05 b/libs/DB4S_PATCH_05 new file mode 100644 index 000000000..0b956432b --- /dev/null +++ b/libs/DB4S_PATCH_05 @@ -0,0 +1,363 @@ +--- QScintilla_gpl-2.10.8/Qt4Qt5/qscintilla.pro 2018-10-01 15:46:06.000000000 +0200 ++++ qscintilla/Qt4Qt5/qscintilla.pro 2018-11-21 19:51:25.870248673 +0100 +@@ -23,24 +23,12 @@ + !win32:VERSION = 13.2.1 + + TEMPLATE = lib +-CONFIG += qt warn_off thread exceptions hide_symbols +- +-CONFIG(debug, debug|release) { +- mac: { +- TARGET = qscintilla2_qt$${QT_MAJOR_VERSION}_debug +- } else { +- win32: { +- TARGET = qscintilla2_qt$${QT_MAJOR_VERSION}d +- } else { +- TARGET = qscintilla2_qt$${QT_MAJOR_VERSION} +- } +- } +-} else { +- TARGET = qscintilla2_qt$${QT_MAJOR_VERSION} +-} +- ++TARGET = qscintilla2 ++CONFIG += qt warn_off thread exceptions hide_symbols staticlib debug_and_release + INCLUDEPATH += . ../include ../lexlib ../src + ++QMAKE_CXXFLAGS += -std=c++11 ++ + !CONFIG(staticlib) { + DEFINES += QSCINTILLA_MAKE_DLL + } +@@ -59,11 +47,6 @@ + DEFINES += QT_NO_ACCESSIBILITY + } + +-# For old versions of GCC. +-unix:!macx { +- CONFIG += c++11 +-} +- + # Comment this in if you want the internal Scintilla classes to be placed in a + # Scintilla namespace rather than pollute the global namespace. + #DEFINES += SCI_NAMESPACE +@@ -97,69 +80,20 @@ + + HEADERS = \ + ./Qsci/qsciglobal.h \ +- ./Qsci/qsciscintilla.h \ +- ./Qsci/qsciscintillabase.h \ +- ./Qsci/qsciabstractapis.h \ +- ./Qsci/qsciapis.h \ + ./Qsci/qscicommand.h \ + ./Qsci/qscicommandset.h \ + ./Qsci/qscidocument.h \ +- ./Qsci/qscilexer.h \ +- ./Qsci/qscilexeravs.h \ +- ./Qsci/qscilexerbash.h \ +- ./Qsci/qscilexerbatch.h \ +- ./Qsci/qscilexercmake.h \ +- ./Qsci/qscilexercoffeescript.h \ +- ./Qsci/qscilexercpp.h \ +- ./Qsci/qscilexercsharp.h \ +- ./Qsci/qscilexercss.h \ +- ./Qsci/qscilexercustom.h \ +- ./Qsci/qscilexerd.h \ +- ./Qsci/qscilexerdiff.h \ +- ./Qsci/qscilexeredifact.h \ +- ./Qsci/qscilexerfortran.h \ +- ./Qsci/qscilexerfortran77.h \ +- ./Qsci/qscilexerhtml.h \ +- ./Qsci/qscilexeridl.h \ +- ./Qsci/qscilexerjava.h \ +- ./Qsci/qscilexerjavascript.h \ +- ./Qsci/qscilexerjson.h \ +- ./Qsci/qscilexerlua.h \ +- ./Qsci/qscilexermakefile.h \ +- ./Qsci/qscilexermarkdown.h \ +- ./Qsci/qscilexermatlab.h \ +- ./Qsci/qscilexeroctave.h \ +- ./Qsci/qscilexerpascal.h \ +- ./Qsci/qscilexerperl.h \ +- ./Qsci/qscilexerpostscript.h \ +- ./Qsci/qscilexerpo.h \ +- ./Qsci/qscilexerpov.h \ +- ./Qsci/qscilexerproperties.h \ +- ./Qsci/qscilexerpython.h \ +- ./Qsci/qscilexerruby.h \ +- ./Qsci/qscilexerspice.h \ +- ./Qsci/qscilexersql.h \ +- ./Qsci/qscilexertcl.h \ +- ./Qsci/qscilexertex.h \ +- ./Qsci/qscilexerverilog.h \ +- ./Qsci/qscilexervhdl.h \ +- ./Qsci/qscilexerxml.h \ +- ./Qsci/qscilexeryaml.h \ +- ./Qsci/qscimacro.h \ + ./Qsci/qsciprinter.h \ + ./Qsci/qscistyle.h \ + ./Qsci/qscistyledtext.h \ + ListBoxQt.h \ +- SciAccessibility.h \ +- SciClasses.h \ + SciNamespace.h \ +- ScintillaQt.h \ + ../include/ILexer.h \ + ../include/Platform.h \ +- ../include/Sci_Position.h \ + ../include/SciLexer.h \ + ../include/Scintilla.h \ + ../include/ScintillaWidget.h \ ++ ../include/Sci_Position.h \ + ../lexlib/Accessor.h \ + ../lexlib/CharacterCategory.h \ + ../lexlib/CharacterSet.h \ +@@ -170,7 +104,6 @@ + ../lexlib/LexerSimple.h \ + ../lexlib/OptionSet.h \ + ../lexlib/PropSetSimple.h \ +- ../lexlib/StringCopy.h \ + ../lexlib/StyleContext.h \ + ../lexlib/SubStyles.h \ + ../lexlib/WordList.h \ +@@ -184,15 +117,12 @@ + ../src/ContractionState.h \ + ../src/Decoration.h \ + ../src/Document.h \ +- ../src/EditModel.h \ + ../src/Editor.h \ +- ../src/EditView.h \ + ../src/ExternalLexer.h \ + ../src/FontQuality.h \ + ../src/Indicator.h \ + ../src/KeyMap.h \ + ../src/LineMarker.h \ +- ../src/MarginView.h \ + ../src/Partitioning.h \ + ../src/PerLine.h \ + ../src/PositionCache.h \ +@@ -205,7 +135,26 @@ + ../src/UnicodeFromUTF8.h \ + ../src/UniConversion.h \ + ../src/ViewStyle.h \ +- ../src/XPM.h ++ ../src/XPM.h \ ++ ../src/Position.h \ ++ ../src/SparseVector.h \ ++ ./Qsci/qsciscintilla.h \ ++ ./Qsci/qsciscintillabase.h \ ++ ./Qsci/qsciabstractapis.h \ ++ ./Qsci/qsciapis.h \ ++ ./Qsci/qscilexer.h \ ++ ./Qsci/qscilexercustom.h \ ++ ./Qsci/qscilexersql.h \ ++ ./Qsci/qscilexerjson.h \ ++ ./Qsci/qscilexerhtml.h \ ++ ./Qsci/qscilexerxml.h \ ++ ./Qsci/qscilexerjavascript.h \ ++ ./Qsci/qscilexercpp.h \ ++ ./Qsci/qscilexerpython.h \ ++ ./Qsci/qscimacro.h \ ++ SciClasses.h \ ++ ScintillaQt.h \ ++ SciAccessibility.h + + SOURCES = \ + qsciscintilla.cpp \ +@@ -216,161 +165,28 @@ + qscicommandset.cpp \ + qscidocument.cpp \ + qscilexer.cpp \ +- qscilexeravs.cpp \ +- qscilexerbash.cpp \ +- qscilexerbatch.cpp \ +- qscilexercmake.cpp \ +- qscilexercoffeescript.cpp \ +- qscilexercpp.cpp \ +- qscilexercsharp.cpp \ +- qscilexercss.cpp \ + qscilexercustom.cpp \ +- qscilexerd.cpp \ +- qscilexerdiff.cpp \ +- qscilexeredifact.cpp \ +- qscilexerfortran.cpp \ +- qscilexerfortran77.cpp \ ++ qscilexersql.cpp \ ++ qscilexerjson.cpp \ + qscilexerhtml.cpp \ +- qscilexeridl.cpp \ +- qscilexerjava.cpp \ ++ qscilexerxml.cpp \ + qscilexerjavascript.cpp \ +- qscilexerjson.cpp \ +- qscilexerlua.cpp \ +- qscilexermakefile.cpp \ +- qscilexermarkdown.cpp \ +- qscilexermatlab.cpp \ +- qscilexeroctave.cpp \ +- qscilexerpascal.cpp \ +- qscilexerperl.cpp \ +- qscilexerpostscript.cpp \ +- qscilexerpo.cpp \ +- qscilexerpov.cpp \ +- qscilexerproperties.cpp \ ++ qscilexercpp.cpp \ + qscilexerpython.cpp \ +- qscilexerruby.cpp \ +- qscilexerspice.cpp \ +- qscilexersql.cpp \ +- qscilexertcl.cpp \ +- qscilexertex.cpp \ +- qscilexerverilog.cpp \ +- qscilexervhdl.cpp \ +- qscilexerxml.cpp \ +- qscilexeryaml.cpp \ + qscimacro.cpp \ + qsciprinter.cpp \ + qscistyle.cpp \ + qscistyledtext.cpp \ +- MacPasteboardMime.cpp \ +- InputMethod.cpp \ +- SciAccessibility.cpp \ ++ MacPasteboardMime.cpp \ ++ InputMethod.cpp \ + SciClasses.cpp \ + ListBoxQt.cpp \ + PlatQt.cpp \ + ScintillaQt.cpp \ +- ../lexers/LexA68k.cpp \ +- ../lexers/LexAbaqus.cpp \ +- ../lexers/LexAda.cpp \ +- ../lexers/LexAPDL.cpp \ +- ../lexers/LexAsm.cpp \ +- ../lexers/LexAsn1.cpp \ +- ../lexers/LexASY.cpp \ +- ../lexers/LexAU3.cpp \ +- ../lexers/LexAVE.cpp \ +- ../lexers/LexAVS.cpp \ +- ../lexers/LexBaan.cpp \ +- ../lexers/LexBash.cpp \ +- ../lexers/LexBasic.cpp \ +- ../lexers/LexBatch.cpp \ +- ../lexers/LexBibTeX.cpp \ +- ../lexers/LexBullant.cpp \ +- ../lexers/LexCaml.cpp \ +- ../lexers/LexCLW.cpp \ +- ../lexers/LexCmake.cpp \ +- ../lexers/LexCOBOL.cpp \ +- ../lexers/LexCoffeeScript.cpp \ +- ../lexers/LexConf.cpp \ +- ../lexers/LexCPP.cpp \ +- ../lexers/LexCrontab.cpp \ +- ../lexers/LexCsound.cpp \ +- ../lexers/LexCSS.cpp \ +- ../lexers/LexD.cpp \ +- ../lexers/LexDiff.cpp \ +- ../lexers/LexDMAP.cpp \ +- ../lexers/LexDMIS.cpp \ +- ../lexers/LexECL.cpp \ +- ../lexers/LexEDIFACT.cpp \ +- ../lexers/LexEiffel.cpp \ +- ../lexers/LexErlang.cpp \ +- ../lexers/LexErrorList.cpp \ +- ../lexers/LexEScript.cpp \ +- ../lexers/LexFlagship.cpp \ +- ../lexers/LexForth.cpp \ +- ../lexers/LexFortran.cpp \ +- ../lexers/LexGAP.cpp \ +- ../lexers/LexGui4Cli.cpp \ +- ../lexers/LexHaskell.cpp \ +- ../lexers/LexHex.cpp \ +- ../lexers/LexHTML.cpp \ +- ../lexers/LexInno.cpp \ +- ../lexers/LexJSON.cpp \ +- ../lexers/LexKix.cpp \ +- ../lexers/LexKVIrc.cpp \ +- ../lexers/LexLaTeX.cpp \ +- ../lexers/LexLisp.cpp \ +- ../lexers/LexLout.cpp \ +- ../lexers/LexLua.cpp \ +- ../lexers/LexMagik.cpp \ +- ../lexers/LexMake.cpp \ +- ../lexers/LexMarkdown.cpp \ +- ../lexers/LexMatlab.cpp \ +- ../lexers/LexMetapost.cpp \ +- ../lexers/LexMMIXAL.cpp \ +- ../lexers/LexModula.cpp \ +- ../lexers/LexMPT.cpp \ +- ../lexers/LexMSSQL.cpp \ +- ../lexers/LexMySQL.cpp \ +- ../lexers/LexNimrod.cpp \ +- ../lexers/LexNsis.cpp \ +- ../lexers/LexNull.cpp \ +- ../lexers/LexOpal.cpp \ +- ../lexers/LexOScript.cpp \ +- ../lexers/LexPascal.cpp \ +- ../lexers/LexPB.cpp \ +- ../lexers/LexPerl.cpp \ +- ../lexers/LexPLM.cpp \ +- ../lexers/LexPO.cpp \ +- ../lexers/LexPOV.cpp \ +- ../lexers/LexPowerPro.cpp \ +- ../lexers/LexPowerShell.cpp \ +- ../lexers/LexProgress.cpp \ +- ../lexers/LexProps.cpp \ +- ../lexers/LexPS.cpp \ +- ../lexers/LexPython.cpp \ +- ../lexers/LexR.cpp \ +- ../lexers/LexRebol.cpp \ +- ../lexers/LexRegistry.cpp \ +- ../lexers/LexRuby.cpp \ +- ../lexers/LexRust.cpp \ +- ../lexers/LexScriptol.cpp \ +- ../lexers/LexSmalltalk.cpp \ +- ../lexers/LexSML.cpp \ +- ../lexers/LexSorcus.cpp \ +- ../lexers/LexSpecman.cpp \ +- ../lexers/LexSpice.cpp \ ++ SciAccessibility.cpp \ + ../lexers/LexSQL.cpp \ +- ../lexers/LexSTTXT.cpp \ +- ../lexers/LexTACL.cpp \ +- ../lexers/LexTADS3.cpp \ +- ../lexers/LexTAL.cpp \ +- ../lexers/LexTCL.cpp \ +- ../lexers/LexTCMD.cpp \ +- ../lexers/LexTeX.cpp \ +- ../lexers/LexTxt2tags.cpp \ +- ../lexers/LexVB.cpp \ +- ../lexers/LexVerilog.cpp \ +- ../lexers/LexVHDL.cpp \ +- ../lexers/LexVisualProlog.cpp \ +- ../lexers/LexYAML.cpp \ ++ ../lexers/LexJSON.cpp \ ++ ../lexers/LexHTML.cpp \ + ../lexlib/Accessor.cpp \ + ../lexlib/CharacterCategory.cpp \ + ../lexlib/CharacterSet.cpp \ +@@ -391,20 +207,20 @@ + ../src/ContractionState.cpp \ + ../src/Decoration.cpp \ + ../src/Document.cpp \ +- ../src/EditModel.cpp \ + ../src/Editor.cpp \ ++ ../src/EditModel.cpp \ + ../src/EditView.cpp \ + ../src/ExternalLexer.cpp \ + ../src/Indicator.cpp \ +- ../src/KeyMap.cpp \ ++ ../src/KeyMap.cpp \ + ../src/LineMarker.cpp \ + ../src/MarginView.cpp \ + ../src/PerLine.cpp \ + ../src/PositionCache.cpp \ +- ../src/RESearch.cpp \ ++ ../src/RESearch.cpp \ + ../src/RunStyles.cpp \ +- ../src/ScintillaBase.cpp \ +- ../src/Selection.cpp \ ++ ../src/ScintillaBase.cpp \ ++ ../src/Selection.cpp \ + ../src/Style.cpp \ + ../src/UniConversion.cpp \ + ../src/ViewStyle.cpp \ diff --git a/libs/DB4S_PATCH_06 b/libs/DB4S_PATCH_06 new file mode 100644 index 000000000..eff21c8b6 --- /dev/null +++ b/libs/DB4S_PATCH_06 @@ -0,0 +1,131 @@ +--- QScintilla_gpl-2.10.8/src/Catalogue.cpp 2018-10-01 15:41:57.000000000 +0200 ++++ qscintilla/src/Catalogue.cpp 2018-11-18 16:09:52.796704316 +0100 +@@ -77,124 +77,10 @@ + + //++Autogenerated -- run scripts/LexGen.py to regenerate + //**\(\tLINK_LEXER(\*);\n\) +- LINK_LEXER(lmA68k); +- LINK_LEXER(lmAbaqus); +- LINK_LEXER(lmAda); +- LINK_LEXER(lmAPDL); +- LINK_LEXER(lmAs); +- LINK_LEXER(lmAsm); +- LINK_LEXER(lmAsn1); +- LINK_LEXER(lmASY); +- LINK_LEXER(lmAU3); +- LINK_LEXER(lmAVE); +- LINK_LEXER(lmAVS); +- LINK_LEXER(lmBaan); +- LINK_LEXER(lmBash); +- LINK_LEXER(lmBatch); +- LINK_LEXER(lmBibTeX); +- LINK_LEXER(lmBlitzBasic); +- LINK_LEXER(lmBullant); +- LINK_LEXER(lmCaml); +- LINK_LEXER(lmClw); +- LINK_LEXER(lmClwNoCase); +- LINK_LEXER(lmCmake); +- LINK_LEXER(lmCOBOL); +- LINK_LEXER(lmCoffeeScript); +- LINK_LEXER(lmConf); +- LINK_LEXER(lmCPP); +- LINK_LEXER(lmCPPNoCase); +- LINK_LEXER(lmCsound); +- LINK_LEXER(lmCss); +- LINK_LEXER(lmD); +- LINK_LEXER(lmDiff); +- LINK_LEXER(lmDMAP); +- LINK_LEXER(lmDMIS); +- LINK_LEXER(lmECL); +- LINK_LEXER(lmEDIFACT); +- LINK_LEXER(lmEiffel); +- LINK_LEXER(lmEiffelkw); +- LINK_LEXER(lmErlang); +- LINK_LEXER(lmErrorList); +- LINK_LEXER(lmESCRIPT); +- LINK_LEXER(lmF77); +- LINK_LEXER(lmFlagShip); +- LINK_LEXER(lmForth); +- LINK_LEXER(lmFortran); +- LINK_LEXER(lmFreeBasic); +- LINK_LEXER(lmGAP); +- LINK_LEXER(lmGui4Cli); +- LINK_LEXER(lmHaskell); +- LINK_LEXER(lmHTML); +- LINK_LEXER(lmIHex); +- LINK_LEXER(lmInno); +- LINK_LEXER(lmJSON); +- LINK_LEXER(lmKix); +- LINK_LEXER(lmKVIrc); +- LINK_LEXER(lmLatex); +- LINK_LEXER(lmLISP); +- LINK_LEXER(lmLiterateHaskell); +- LINK_LEXER(lmLot); +- LINK_LEXER(lmLout); +- LINK_LEXER(lmLua); +- LINK_LEXER(lmMagikSF); +- LINK_LEXER(lmMake); +- LINK_LEXER(lmMarkdown); +- LINK_LEXER(lmMatlab); +- LINK_LEXER(lmMETAPOST); +- LINK_LEXER(lmMMIXAL); +- LINK_LEXER(lmModula); +- LINK_LEXER(lmMSSQL); +- LINK_LEXER(lmMySQL); +- LINK_LEXER(lmNimrod); +- LINK_LEXER(lmNncrontab); +- LINK_LEXER(lmNsis); +- LINK_LEXER(lmNull); +- LINK_LEXER(lmOctave); +- LINK_LEXER(lmOpal); +- LINK_LEXER(lmOScript); +- LINK_LEXER(lmPascal); +- LINK_LEXER(lmPB); +- LINK_LEXER(lmPerl); +- LINK_LEXER(lmPHPSCRIPT); +- LINK_LEXER(lmPLM); +- LINK_LEXER(lmPO); +- LINK_LEXER(lmPOV); +- LINK_LEXER(lmPowerPro); +- LINK_LEXER(lmPowerShell); +- LINK_LEXER(lmProgress); +- LINK_LEXER(lmProps); +- LINK_LEXER(lmPS); +- LINK_LEXER(lmPureBasic); +- LINK_LEXER(lmPython); +- LINK_LEXER(lmR); +- LINK_LEXER(lmREBOL); +- LINK_LEXER(lmRegistry); +- LINK_LEXER(lmRuby); +- LINK_LEXER(lmRust); +- LINK_LEXER(lmScriptol); +- LINK_LEXER(lmSmalltalk); +- LINK_LEXER(lmSML); +- LINK_LEXER(lmSorc); +- LINK_LEXER(lmSpecman); +- LINK_LEXER(lmSpice); +- LINK_LEXER(lmSQL); +- LINK_LEXER(lmSrec); +- LINK_LEXER(lmSTTXT); +- LINK_LEXER(lmTACL); +- LINK_LEXER(lmTADS3); +- LINK_LEXER(lmTAL); +- LINK_LEXER(lmTCL); +- LINK_LEXER(lmTCMD); +- LINK_LEXER(lmTEHex); +- LINK_LEXER(lmTeX); +- LINK_LEXER(lmTxt2tags); +- LINK_LEXER(lmVB); +- LINK_LEXER(lmVBScript); +- LINK_LEXER(lmVerilog); +- LINK_LEXER(lmVHDL); +- LINK_LEXER(lmVisualProlog); +- LINK_LEXER(lmXML); +- LINK_LEXER(lmYAML); ++ LINK_LEXER(lmSQL); ++ LINK_LEXER(lmJSON); ++ LINK_LEXER(lmHTML); ++ LINK_LEXER(lmXML); + + //--Autogenerated -- end of automatically generated section + diff --git a/libs/qscintilla/ChangeLog b/libs/qscintilla/ChangeLog index f80f57433..89f4563ea 100644 --- a/libs/qscintilla/ChangeLog +++ b/libs/qscintilla/ChangeLog @@ -1,5 +1,396 @@ +2018-10-01 Phil Thompson + + * NEWS: + Released as v2.10.8. + [57c8b6076899] [2.10.8] <2.10-maint> + +2018-09-30 Phil Thompson + + * NEWS: + Updated the NEWS file. + [345f597a4a90] <2.10-maint> + +2018-08-02 Phil Thompson + + * qt/SciAccessibility.cpp: + More accessibility fixes. + [2cc2d6865762] <2.10-maint> + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h, qt/qscintilla.pro: + Refactored the accessibility support to use less of the Qt stuff + which doesn't handle CR-LF end-of-lines. + [8b2d6e3e73d8] <2.10-maint> + +2018-07-15 Phil Thompson + + * NEWS: + Updated the NEWS file. + [fc1deaccc716] <2.10-maint> + +2018-06-29 Phil Thompson + + * .hgtags: + Added tag 2.10.7 for changeset 60598a703fd4 + [8828f9ad7dc6] <2.10-maint> + + * NEWS: + Released as v2.10.7. + [60598a703fd4] [2.10.7] <2.10-maint> + + * NEWS: + Updated the NEWS file. + [92edf18019ec] <2.10-maint> + +2018-06-25 Phil Thompson + + * NEWS, Python/sip/qsciscintillabase.sip: + Tweaked the signature of the QscoScintillaBase::SCN_MACRORECORD() + signal so that it matches what Qt uses so that the signal test + passes. + [bfcd9319329a] <2.10-maint> + +2018-06-23 Phil Thompson + + * .hgtags: + Added tag 2.10.6 for changeset dc0993c72a05 + [9c774d0a9694] <2.10-maint> + + * NEWS: + Released as v2.10.6. + [dc0993c72a05] [2.10.6] <2.10-maint> + +2018-06-22 Phil Thompson + + * .hgtags: + Added tag 2.10.5 for changeset f35b3a43a241 + [8cf5694ca328] <2.10-maint> + + * NEWS: + Released as v2.10.5. + [f35b3a43a241] [2.10.5] <2.10-maint> + +2018-06-21 Phil Thompson + + * NEWS: + Updated the NEWS file. + [12cb1a2f5ec6] <2.10-maint> + +2018-06-19 Phil Thompson + + * NEWS, Python/sip/qscistyle.sip, qt/qscistyle.cpp, qt/qscistyle.h: + Added setStyle() to QsciStyle. + [cf5281041224] <2.10-maint> + +2018-06-16 Phil Thompson + + * qt/qscintilla_es.qm, qt/qscintilla_es.ts: + Updated Spanish translations from Jaime Seuma. + [a479b9f5436f] <2.10-maint> + +2018-06-09 Phil Thompson + + * qt/qscintilla_cs.qm, qt/qscintilla_de.qm, qt/qscintilla_de.ts, + qt/qscintilla_es.qm, qt/qscintilla_fr.qm, qt/qscintilla_pt_br.qm: + Updated German translations from Detlev. + [f69379899fb3] <2.10-maint> + +2018-06-04 Phil Thompson + + * NEWS, Python/configure.py: + Implemented support for the .dist-info directory. + [387aa9bf6ad8] <2.10-maint> + +2018-06-03 Phil Thompson + + * NEWS, Python/sip/qsciscintillabase.sip, qt/PlatQt.cpp, + qt/ScintillaQt.cpp, qt/qsciscintillabase.cpp, + qt/qsciscintillabase.h: + Fixes for font changes caused by dragging to a different display. + [27b1f435e27a] <2.10-maint> + +2018-05-29 Phil Thompson + + * qt/PlatQt.cpp: + Disable to macOS use of integer font metrics for Qt5 as it is + (probably) specific to Qt4. + [c32fe0c4e55d] <2.10-maint> + + * qt/PlatQt.cpp: + Fixed cursor positioning when using a secondary display with + different scaling to the primary. + [20420b7c4a4d] <2.10-maint> + +2018-05-22 Phil Thompson + + * qt/qscilexerverilog.cpp: + Fix the handling of the 'fold.verilog.flags' property in the Verilog + lexer. + [9b698ba38c2b] <2.10-maint> + +2018-05-16 Phil Thompson + + * qt/qscilexerverilog.cpp, qt/qscintilla_cs.ts, qt/qscintilla_de.ts, + qt/qscintilla_es.ts, qt/qscintilla_fr.ts, qt/qscintilla_pt_br.ts: + Added the missing descriptions of inactive styles in the Verilog + lexer. + [4be691232e03] <2.10-maint> + +2018-05-15 Phil Thompson + + * qt/qscilexer.h: + Updated the QsciLexer::keywords() documentation to point out that + sets are numbered from 1. + [5954b91e7ec1] <2.10-maint> + +2018-04-26 Phil Thompson + + * Python/sip/qscilexeredifact.sip, qt/qscilexeredifact.cpp, + qt/qscilexeredifact.h: + Added some default colours to the EDIFACT lexer. + [175598286833] <2.10-maint> + +2018-04-20 Phil Thompson + + * NEWS, Python/sip/qscilexeredifact.sip, qt/qscilexeredifact.cpp, + qt/qscilexeredifact.h, qt/qscintilla.pro, qt/qscintilla_cs.ts, + qt/qscintilla_de.ts, qt/qscintilla_es.ts, qt/qscintilla_fr.ts, + qt/qscintilla_pt_br.ts: + Added the QsciLexerEDIFACT class. + [c1e31857f3e7] <2.10-maint> + + * qt/qsciscintilla.cpp, qt/qsciscintillabase.cpp, + qt/qsciscintillabase.h: + If the context menu is invoked when the cursor is outside the + selection then the selection is cleared and the cursor moved to + where the mouse was clicked. + [7d230dad9379] <2.10-maint> + +2018-04-19 Phil Thompson + + * Python/sip/qsciscintilla.sip, qt/qscintilla.pro, + qt/qsciscintilla.cpp, qt/qsciscintilla.h: + Control-wheel up/down will now zoom in and out. + [ba0049fe03b6] <2.10-maint> + +2018-04-11 Phil Thompson + + * qt/PlatQt.cpp, qt/qsciabstractapis.cpp, qt/qscilexerpython.cpp, + qt/qscilexerxml.cpp, qt/qsciscintilla.cpp: + Removed warning messages about unused variables. + [c2008ef93ee0] <2.10-maint> + + * qt/qscicommandset.cpp: + Fixed the saving of alternative keys in the settings. + [687470e937c1] <2.10-maint> + + * qt/ScintillaQt.cpp, qt/qsciapis.cpp, qt/qsciscintilla.cpp: + Various stylistic changes to eliminate some warning messages. + [dc753169870e] <2.10-maint> + +2018-04-10 Phil Thompson + + * .hgtags: + Added tag 2.10.4 for changeset 24cb0edc89a9 + [05ada666e2cf] <2.10-maint> + + * NEWS: + Released as v2.10.4. + [24cb0edc89a9] [2.10.4] <2.10-maint> + + * qt/SciAccessibility.cpp: + Fixed the retrieval of accessibility attributes. + [e430a7dd7818] <2.10-maint> + +2018-04-07 Phil Thompson + + * qt/qscilexer.cpp: + Use STYLE_MAX to define the maximum number of styles. + [23ca0cad0227] <2.10-maint> + +2018-03-11 Phil Thompson + + * qt/qscintilla.pro: + Force QT_NO_ACCESSIBILITY when building against Qt4. + [b65f48ec1852] <2.10-maint> + +2018-02-27 Phil Thompson + + * .hgtags: + Added tag 2.10.3 for changeset bc769d6fcf53 + [279625f1d8c9] <2.10-maint> + + * NEWS: + Released as v2.10.3. + [bc769d6fcf53] [2.10.3] <2.10-maint> + + * rb-product: + Updated the PyQt5 wheel dependency. + [7cef6e297ddf] <2.10-maint> + + * NEWS: + Updated the NEWS file. + [1e073e29eca4] <2.10-maint> + +2018-02-10 Phil Thompson + + * qsci/api/python/Python-3.7.api: + Added the API file for Python v3.70b1. + [6d0032674462] <2.10-maint> + +2018-02-07 Phil Thompson + + * qt/qsciscintilla.cpp: + Fix the hotspot active background colour. + [45cfd8c68394] <2.10-maint> + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h: + Completed the accessibility support. + [2af3a5b045fa] <2.10-maint> + +2018-02-06 Phil Thompson + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h: + Implemented all of the accessible interface except for attributes(). + [434539a243dc] <2.10-maint> + + * qt/SciAccessibility.cpp: + Implemented more of the accessible interface. + [e8f3df5442cc] <2.10-maint> + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h, qt/ScintillaQt.cpp: + Implemented more of the accessible interface. + [fb26d9fdba27] <2.10-maint> + +2018-02-05 Phil Thompson + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h, qt/ScintillaQt.cpp, + qt/qsciscintillabase.cpp: + More accessibility progress. + [ea2432348b49] <2.10-maint> + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h, qt/ScintillaQt.cpp: + Some progress on accessibility. + [055345b62d7b] <2.10-maint> + + * qt/qscintilla.pro: + Updated the version of the shared library. + [fb50133f8770] <2.10-maint> + +2018-02-04 Phil Thompson + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h, qt/qscintilla.pro, + qt/qsciscintillabase.cpp: + Added the stubs for accessibility support. + [61e00a4f944f] <2.10-maint> + +2017-11-23 Phil Thompson + + * .hgtags: + Added tag 2.10.2 for changeset bdfb9584af36 + [d127fc44d4c4] <2.10-maint> + + * NEWS: + Released as v2.10.2. + [bdfb9584af36] [2.10.2] <2.10-maint> + + * qt/qscintilla.pro: + Bumed the .so minor version. + [4bb28057d3c2] <2.10-maint> + +2017-11-13 Phil Thompson + + * NEWS, Python/sip/qsciscintilla.sip, qt/qsciscintilla.cpp, + qt/qsciscintilla.h: + Added setScrollWidth() , scrollWidth, setScrollWidthTracking() and + scrollWidthTracking() to QsciScintilla. + [c6e64e99cb12] <2.10-maint> + +2017-11-01 Phil Thompson + + * qt/qsciscintilla.cpp: + Fixed the handling of UTF8 call tips. + [7aa9b863f330] <2.10-maint> + +2017-07-04 Phil Thompson + + * qt/qscintilla.pro: + Fixed case sensitivity of a couple of file names. + [e9d9b80fd61b] <2.10-maint> + + * .hgignore: + Ignore the new-style build directory. + [6c20c6b41705] <2.10-maint> + +2017-07-03 Phil Thompson + + * .hgtags: + Added tag 2.10.1 for changeset 20e0e2d419ba + [d6eba6c9e5ce] <2.10-maint> + + * NEWS: + Released as v2.10.1. + [20e0e2d419ba] [2.10.1] <2.10-maint> + + * rb-product: + Updated the PyQt5 dependency to v5.9. + [83200ee6b295] <2.10-maint> + +2017-05-24 Phil Thompson + + * lib/README.doc: + Updated the docs regarding use of build options supported by + Scintilla. + [fe6e73057d9e] <2.10-maint> + +2017-05-15 Phil Thompson + + * Python/sip/qscilexer.sip, Python/sip/qscilexeravs.sip, + Python/sip/qscilexerbash.sip, Python/sip/qscilexerbatch.sip, + Python/sip/qscilexercoffeescript.sip, Python/sip/qscilexercpp.sip, + Python/sip/qscilexercss.sip, Python/sip/qscilexerd.sip, + Python/sip/qscilexerfortran77.sip, Python/sip/qscilexerhtml.sip, + Python/sip/qscilexerlua.sip, Python/sip/qscilexerpascal.sip, + Python/sip/qscilexerperl.sip, Python/sip/qscilexerpostscript.sip, + Python/sip/qscilexerpov.sip, Python/sip/qscilexerpython.sip, + Python/sip/qscilexerruby.sip, Python/sip/qscilexerspice.sip, + Python/sip/qscilexersql.sip, Python/sip/qscilexertcl.sip, + Python/sip/qscilexerverilog.sip, Python/sip/qscilexervhdl.sip: + Added the lexer-specific re-implementations of previously internal + methods to the Python bindings. + [e8402392cedc] <2.10-maint> + +2017-03-22 Phil Thompson + + * qt/qscintilla.pro: + Enabled explicit C++11 support for Linux for old versions of GCC. + [e0e0b344ccf1] <2.10-maint> + +2017-03-16 Phil Thompson + + * qt/qscilexer.cpp: + Changed the default macOS font to Menlo 12pt as it has bold etc. + [39d69e37d352] <2.10-maint> + + * qt/qscilexer.cpp: + Changed the default font on macOS to Monaco 12pt. + [9030535e2457] <2.10-maint> + + * Python/configure.py: + Fixed the rpath change of the Python bindings on macOS. + [dd45e695812a] <2.10-maint> + +2017-02-22 Phil Thompson + + * qt/qscintilla.pro: + Fixed the .pro file so that debug builds match the features file. + [1aedd0c6eeda] <2.10-maint> + 2017-02-20 Phil Thompson + * .hgtags: + Added tag 2.10 for changeset 6c07847b2835 + [2442f8d2df34] + * NEWS: Released as v2.10. [6c07847b2835] [2.10] diff --git a/libs/qscintilla/NEWS b/libs/qscintilla/NEWS index d2025143c..8ea4093fd 100644 --- a/libs/qscintilla/NEWS +++ b/libs/qscintilla/NEWS @@ -1,3 +1,39 @@ +v2.10.8 1st October 2018 + - Bug fixes. + +v2.10.7 2nd July 2018 + - Bug fixes. + +v2.10.6 24th June 2018 + - A pseudo-release to create a version number for updated Python wheels. + +v2.10.5 23rd June 2018 + - Added the QsciLexerEDIFACT class. + - Added setStyle() to QsciStyle. + - Control-wheel scroll will now zoom in and out of the document. + - Buffered drawing is now disabled by default. + - The Python bindings create a PEP 376 .dist-info directory on installation + that provides version information for dependent packages and allows pip to + uninstall. + - Added the --no-dist-info option to the Python bindings' configure.py. + - Bug fixes. + +v2.10.4 10th April 2018 + - Bug fixes. + +v2.10.3 26th February 2018 + - Added accessibility support. + - Added the API file for Python v3.7. + +v2.10.2 23rd November 2017 + - Added setScrollWidth() , scrollWidth, setScrollWidthTracking() and + scrollWidthTracking() to QsciScintilla. + - Bug fixes. + +v2.10.1 3rd July 2017 + - Changed the default font on macOS to Menlo 12pt. + - Added previously internal lexer methods to the Python bindings. + v2.10 20th February 2017 - Based on Scintilla v3.7.2. - Added the QsciLexerJSON class. diff --git a/libs/qscintilla/Qt4Qt5/CMakeLists.txt b/libs/qscintilla/Qt4Qt5/CMakeLists.txt index fbdeb4fbc..6929dd8f5 100644 --- a/libs/qscintilla/Qt4Qt5/CMakeLists.txt +++ b/libs/qscintilla/Qt4Qt5/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 2.8.12.2) -set(CMAKE_AUTOMOC ON) +# Disable AUTOMOC because it cannot be made to work with QScintilla +set(CMAKE_AUTOMOC OFF) set(CMAKE_INCLUDE_CURRENT_DIR ON) find_package(Qt5 REQUIRED COMPONENTS PrintSupport Widgets) @@ -39,6 +40,7 @@ set(QSCINTILLA_SRC ListBoxQt.cpp PlatQt.cpp ScintillaQt.cpp + SciAccessibility.cpp ../lexers/LexSQL.cpp ../lexers/LexJSON.cpp ../lexers/LexHTML.cpp @@ -161,11 +163,14 @@ set(QSCINTILLA_MOC_HDR ./Qsci/qscimacro.h SciClasses.h ScintillaQt.h + SciAccessibility.h ) +QT5_WRAP_CPP(QSCINTILLA_WRAP_MOC_HDR ${QSCINTILLA_MOC_HDR}) + include_directories(. ../include ../lexlib ../src) -add_library(qscintilla2 ${QSCINTILLA_SRC} ${QSCINTILLA_HDR} ${QSCINTILLA_MOC_HDR} ${QSCINTILLA_MOC}) +add_library(qscintilla2 ${QSCINTILLA_SRC} ${QSCINTILLA_HDR} ${QSCINTILLA_MOC_HDR} ${QSCINTILLA_MOC} ${QSCINTILLA_WRAP_MOC_HDR}) target_link_libraries(qscintilla2 Qt5::Widgets Qt5::PrintSupport) diff --git a/libs/qscintilla/Qt4Qt5/ListBoxQt.cpp b/libs/qscintilla/Qt4Qt5/ListBoxQt.cpp index 04741c121..427529ccc 100644 --- a/libs/qscintilla/Qt4Qt5/ListBoxQt.cpp +++ b/libs/qscintilla/Qt4Qt5/ListBoxQt.cpp @@ -1,7 +1,7 @@ // This module implements the specialisation of QListBox that handles the // Scintilla double-click callback. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/ListBoxQt.h b/libs/qscintilla/Qt4Qt5/ListBoxQt.h index 31df4f0c9..ef9744027 100644 --- a/libs/qscintilla/Qt4Qt5/ListBoxQt.h +++ b/libs/qscintilla/Qt4Qt5/ListBoxQt.h @@ -1,7 +1,7 @@ // This defines the specialisation of QListBox that handles the Scintilla // double-click callback. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/MacPasteboardMime.cpp b/libs/qscintilla/Qt4Qt5/MacPasteboardMime.cpp index cbaf034ab..c2d8f9e1a 100644 --- a/libs/qscintilla/Qt4Qt5/MacPasteboardMime.cpp +++ b/libs/qscintilla/Qt4Qt5/MacPasteboardMime.cpp @@ -2,7 +2,7 @@ // OS/X. It is a separate file to avoid clashes between OS/X and Scintilla // data types. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/PlatQt.cpp b/libs/qscintilla/Qt4Qt5/PlatQt.cpp index 0fad368e0..b8d5240c7 100644 --- a/libs/qscintilla/Qt4Qt5/PlatQt.cpp +++ b/libs/qscintilla/Qt4Qt5/PlatQt.cpp @@ -1,6 +1,6 @@ // This module implements the portability layer for the Qt port of Scintilla. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -105,7 +105,7 @@ void Font::Create(const FontParameters &fp) strategy = QFont::PreferDefault; } -#if defined(Q_OS_MAC) +#if defined(Q_OS_MAC) && QT_VERSION < 0x050000 #if QT_VERSION >= 0x040700 strategy = static_cast(strategy | QFont::ForceIntegerMetrics); #else @@ -171,7 +171,7 @@ class SurfaceImpl : public Surface void Init(WindowID wid); void Init(SurfaceID sid, WindowID); void Init(QPainter *p); - void InitPixMap(int width, int height, Surface *, WindowID wid); + void InitPixMap(int width, int height, Surface *sid, WindowID wid); void Release(); bool Initialised() {return painter;} @@ -207,7 +207,7 @@ class SurfaceImpl : public Surface XYPOSITION WidthChar(Font &font_, char ch); XYPOSITION Ascent(Font &font_); XYPOSITION Descent(Font &font_); - XYPOSITION InternalLeading(Font &font_) {return 0;} + XYPOSITION InternalLeading(Font &font_) {Q_UNUSED(font_); return 0;} XYPOSITION ExternalLeading(Font &font_); XYPOSITION Height(Font &font_); XYPOSITION AverageCharWidth(Font &font_); @@ -216,7 +216,7 @@ class SurfaceImpl : public Surface void FlushCachedState(); void SetUnicodeMode(bool unicodeMode_) {unicodeMode = unicodeMode_;} - void SetDBCSMode(int codePage) {} + void SetDBCSMode(int codePage) {Q_UNUSED(codePage);} void DrawXPM(PRectangle rc, const XPM *xpm); @@ -281,7 +281,7 @@ void SurfaceImpl::Init(QPainter *p) painter = p; } -void SurfaceImpl::InitPixMap(int width, int height, Surface *, WindowID wid) +void SurfaceImpl::InitPixMap(int width, int height, Surface *sid, WindowID wid) { Release(); @@ -298,6 +298,8 @@ void SurfaceImpl::InitPixMap(int width, int height, Surface *, WindowID wid) painter = new QPainter(pd); my_resources = true; + + SetUnicodeMode(static_cast(sid)->unicodeMode); } void SurfaceImpl::Release() @@ -539,6 +541,8 @@ void SurfaceImpl::DrawXPM(PRectangle rc, const XPM *xpm) void SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage) { + Q_UNUSED(width); + Q_UNUSED(height); Q_ASSERT(painter); const QImage *qim = reinterpret_cast(pixelsImage); @@ -1004,15 +1008,14 @@ bool Platform::IsKeyDown(int) return false; } -long Platform::SendScintilla(WindowID w, unsigned int msg, - unsigned long wParam, long lParam) +long Platform::SendScintilla(WindowID, unsigned int, unsigned long, long) { // This is never called. return 0; } -long Platform::SendScintillaPointer(WindowID w, unsigned int msg, - unsigned long wParam, void *lParam) +long Platform::SendScintillaPointer(WindowID, unsigned int, unsigned long, + void *) { // This is never called. return 0; diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qsciabstractapis.h b/libs/qscintilla/Qt4Qt5/Qsci/qsciabstractapis.h index bf57f409f..78c4d33f6 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qsciabstractapis.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qsciabstractapis.h @@ -1,6 +1,6 @@ // This module defines interface to the QsciAbstractAPIs class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qsciapis.h b/libs/qscintilla/Qt4Qt5/Qsci/qsciapis.h index 8216b31a7..a67a90291 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qsciapis.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qsciapis.h @@ -1,6 +1,6 @@ // This module defines interface to the QsciAPIs class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscicommand.h b/libs/qscintilla/Qt4Qt5/Qsci/qscicommand.h index 366bc68c9..7c5269460 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscicommand.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscicommand.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciCommand class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscicommandset.h b/libs/qscintilla/Qt4Qt5/Qsci/qscicommandset.h index a8f8cd102..f9ff82df3 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscicommandset.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscicommandset.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciCommandSet class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscidocument.h b/libs/qscintilla/Qt4Qt5/Qsci/qscidocument.h index 0c23cb48f..df64c72a1 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscidocument.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscidocument.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciDocument class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qsciglobal.h b/libs/qscintilla/Qt4Qt5/Qsci/qsciglobal.h index 8f2f0e751..a73093e41 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qsciglobal.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qsciglobal.h @@ -1,6 +1,6 @@ // This module defines various things common to all of the Scintilla Qt port. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -24,8 +24,8 @@ #include -#define QSCINTILLA_VERSION 0x020a00 -#define QSCINTILLA_VERSION_STR "2.10" +#define QSCINTILLA_VERSION 0x020a08 +#define QSCINTILLA_VERSION_STR "2.10.8" // Define QSCINTILLA_MAKE_DLL to create a QScintilla shared library, or diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscilexer.h b/libs/qscintilla/Qt4Qt5/Qsci/qscilexer.h index e5b5168f7..5cab7bc51 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscilexer.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscilexer.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexer class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -153,8 +153,8 @@ class QSCINTILLA_EXPORT QsciLexer : public QObject virtual int indentationGuideView() const; //! Returns the set of keywords for the keyword set \a set recognised - //! by the lexer as a space separated string. 0 is returned if there - //! is no such set. + //! by the lexer as a space separated string. Keyword sets are numbered + //! from 1. 0 is returned if there is no such set. virtual const char *keywords(int set) const; //! Returns the number of the style used for whitespace. The default diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscilexercpp.h b/libs/qscintilla/Qt4Qt5/Qsci/qscilexercpp.h index e823d072f..1f163e130 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscilexercpp.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscilexercpp.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerCPP class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscilexercustom.h b/libs/qscintilla/Qt4Qt5/Qsci/qscilexercustom.h index e993ba36e..9f85a0d4f 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscilexercustom.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscilexercustom.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerCustom class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscilexerhtml.h b/libs/qscintilla/Qt4Qt5/Qsci/qscilexerhtml.h index 33d24fa9d..80537e3cc 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscilexerhtml.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscilexerhtml.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerHTML class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjavascript.h b/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjavascript.h index 081030a5b..07b83014c 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjavascript.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjavascript.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerJavaScript class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjson.h b/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjson.h index c94fc68c2..e15e8840a 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjson.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjson.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerJSON class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscilexerpython.h b/libs/qscintilla/Qt4Qt5/Qsci/qscilexerpython.h index 350785ca7..827f5492d 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscilexerpython.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscilexerpython.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerPython class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscilexersql.h b/libs/qscintilla/Qt4Qt5/Qsci/qscilexersql.h index 7999e20b5..3c9a56acd 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscilexersql.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscilexersql.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerSQL class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscilexerxml.h b/libs/qscintilla/Qt4Qt5/Qsci/qscilexerxml.h index 2fc7f2093..235aed6bc 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscilexerxml.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscilexerxml.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerXML class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscimacro.h b/libs/qscintilla/Qt4Qt5/Qsci/qscimacro.h index 19465b723..28c176caf 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscimacro.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscimacro.h @@ -1,6 +1,6 @@ // This defines the interface to the QsciMacro class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qsciprinter.h b/libs/qscintilla/Qt4Qt5/Qsci/qsciprinter.h index 2cf276fd9..a3c33953c 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qsciprinter.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qsciprinter.h @@ -1,6 +1,6 @@ // This module defines interface to the QsciPrinter class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h b/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h index a59a21e9d..1aca86e81 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h @@ -1,7 +1,7 @@ // This module defines the "official" high-level API of the Qt port of // Scintilla. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -1155,6 +1155,16 @@ class QSCINTILLA_EXPORT QsciScintilla : public QsciScintillaBase //! \sa setHotspotForegroundColor(), resetHotspotBackgroundColor() void resetHotspotForegroundColor(); + //! Gets the assumed document width in pixels. + //! + //! \sa setScrollWidth(), setScrollWidthTracking() + int scrollWidth() const; + + //! Returns true if scroll width tracking is enabled. + //! + //! \sa scrollWidth(), setScrollWidthTracking() + bool scrollWidthTracking() const; + //! The fold margin may be drawn as a one pixel sized checkerboard pattern //! of two colours, \a fore and \a back. //! @@ -1370,6 +1380,23 @@ class QSCINTILLA_EXPORT QsciScintilla : public QsciScintillaBase //! \sa setMatchedBraceIndicator() void resetMatchedBraceIndicator(); + //! For performance, QScintilla does not measure the display width of the + //! document to determine the properties of the horizontal scroll bar. + //! Instead, an assumed width is used. This sets the document width in + //! pixels assumed by QScintilla to \a pixelWidth. The default value is + //! 2000. + //! + //! \sa scrollWidth(), setScrollWidthTracking() + void setScrollWidth(int pixelWidth); + + //! If scroll width tracking is enabled then the scroll width is adjusted + //! to ensure that all of the lines currently displayed can be completely + //! scrolled. This mode never adjusts the scroll width to be narrower. + //! This sets the scroll width tracking to \a enabled. + //! + //! \sa setScrollWidth(), scrollWidthTracking() + void setScrollWidthTracking(bool enabled); + //! Sets the mode used to draw tab characters when whitespace is visible to //! \a mode. The default is to use an arrow. //! @@ -2009,34 +2036,6 @@ public slots: //! \sa zoomIn(), zoomOut() virtual void zoomTo(int size); - //! For performance, Scintilla does not measure the display width - //! of the document to determine the properties of the horizontal - //! scroll bar. Instead, an assumed width is used. This sets the - //! document width in pixels assumed by Scintilla to \a - //! pixelWidth. The default value is 2000. - //! - //! \sa getScrollWidth(), setScrollWidthTracking() - virtual void setScrollWidth(int pixelWidth); - - //! Gets the document width in pixels assumed by Scintilla. - //! - //! \sa setScrollWidth(), setScrollWidthTracking() - virtual int getScrollWidth() const; - - //! If scroll width tracking is enabled then the scroll width is - //! adjusted to ensure that all of the lines currently displayed - //! can be completely scrolled. This mode never adjusts the scroll - //! width to be narrower. - //! Sets the scroll width tracking to \a enabled. - //! - //! \sa setScrollWidth(), getScrollWidthTracking() - virtual void setScrollWidthTracking(bool enabled); - - //! Gets the current scroll width tracking mode. - //! - //! \sa getScrollWidth(), setScrollWidthTracking() - virtual bool getScrollWidthTracking() const; - signals: //! This signal is emitted whenever the cursor position changes. \a line //! contains the line number and \a index contains the character index @@ -2128,6 +2127,9 @@ public slots: //! \reimp virtual void contextMenuEvent(QContextMenuEvent *e); + //! \reimp + virtual void wheelEvent(QWheelEvent *e); + private slots: void handleCallTipClick(int dir); void handleCharAdded(int charadded); diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qsciscintillabase.h b/libs/qscintilla/Qt4Qt5/Qsci/qsciscintillabase.h index eedb843df..dfb8a0bc6 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qsciscintillabase.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qsciscintillabase.h @@ -1,6 +1,6 @@ // This class defines the "official" low-level API. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -3662,6 +3662,9 @@ class QSCINTILLA_EXPORT QsciScintillaBase : public QAbstractScrollArea //! \sa canInsertFromMimeData(), fromMimeData() virtual QMimeData *toMimeData(const QByteArray &text, bool rectangular) const; + //! \reimp + virtual void changeEvent(QEvent *e); + //! Re-implemented to handle the context menu. virtual void contextMenuEvent(QContextMenuEvent *e); @@ -3728,6 +3731,9 @@ class QSCINTILLA_EXPORT QsciScintillaBase : public QAbstractScrollArea //! \internal Convert encoded bytes to a QString. QString bytesAsText(const char *bytes) const; + //! \internal A helper for QsciScintilla::contextMenuEvent(). + bool contextMenuNeeded(int x, int y) const; + private slots: void handleVSb(int value); void handleHSb(int value); diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscistyle.h b/libs/qscintilla/Qt4Qt5/Qsci/qscistyle.h index 4558c9a32..44ef5b256 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscistyle.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscistyle.h @@ -1,6 +1,6 @@ // This module defines interface to the QsciStyle class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -55,21 +55,36 @@ class QSCINTILLA_EXPORT QsciStyle }; //! Constructs a QsciStyle instance for style number \a style. If \a style - //! is negative then a new style number is automatically allocated. + //! is negative then a new style number is automatically allocated if + //! possible. If it is not possible then style() will return a negative + //! value. + //! + //! \sa style() QsciStyle(int style = -1); //! Constructs a QsciStyle instance for style number \a style. If \a style - //! is negative then a new style number is automatically allocated. The - //! styles description, color, paper color, font and end-of-line fill are - //! set to \a description, \a color, \a paper, \a font and \a eolFill - //! respectively. + //! is negative then a new style number is automatically allocated if + //! possible. If it is not possible then style() will return a negative + //! value. The styles description, color, paper color, font and + //! end-of-line fill are set to \a description, \a color, \a paper, \a font + //! and \a eolFill respectively. + //! + //! \sa style() QsciStyle(int style, const QString &description, const QColor &color, const QColor &paper, const QFont &font, bool eolFill = false); //! \internal Apply the style to a particular editor. void apply(QsciScintillaBase *sci) const; - //! Returns the number of the style. + //! The style's number is set to \a style. + //! + //! \sa style() + void setStyle(int style) {style_nr = style;} + + //! Returns the number of the style. This will be negative if the style is + //! invalid. + //! + //! \sa setStyle() int style() const {return style_nr;} //! The style's description is set to \a description. diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qscistyledtext.h b/libs/qscintilla/Qt4Qt5/Qsci/qscistyledtext.h index d6a9e8d66..1103d2a21 100644 --- a/libs/qscintilla/Qt4Qt5/Qsci/qscistyledtext.h +++ b/libs/qscintilla/Qt4Qt5/Qsci/qscistyledtext.h @@ -1,6 +1,6 @@ // This module defines interface to the QsciStyledText class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/SciAccessibility.cpp b/libs/qscintilla/Qt4Qt5/SciAccessibility.cpp new file mode 100644 index 000000000..418b6dcbe --- /dev/null +++ b/libs/qscintilla/Qt4Qt5/SciAccessibility.cpp @@ -0,0 +1,760 @@ +// The implementation of the class that implements accessibility support. +// +// Copyright (c) 2018 Riverbank Computing Limited +// +// This file is part of QScintilla. +// +// This file may be used under the terms of the GNU General Public License +// version 3.0 as published by the Free Software Foundation and appearing in +// the file LICENSE included in the packaging of this file. Please review the +// following information to ensure the GNU General Public License version 3.0 +// requirements will be met: http://www.gnu.org/copyleft/gpl.html. +// +// If you do not wish to use this file under the terms of the GPL version 3.0 +// then you may purchase a commercial license. For more information contact +// info@riverbankcomputing.com. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + +#include + +#if !defined(QT_NO_ACCESSIBILITY) + +#include "SciAccessibility.h" + +#include +#include +#include +#include +#include + +#include "Qsci/qsciscintillabase.h" + + +// Set if the accessibility support needs initialising. +bool QsciAccessibleScintillaBase::needs_initialising = true; + +// The list of all accessibles. +QList QsciAccessibleScintillaBase::all_accessibles; + + +// Forward declarations. +static QAccessibleInterface *factory(const QString &classname, QObject *object); + + +// The ctor. +QsciAccessibleScintillaBase::QsciAccessibleScintillaBase(QWidget *widget) : + QAccessibleWidget(widget, QAccessible::EditableText), + current_cursor_offset(-1), is_selection(false) +{ + all_accessibles.append(this); +} + + +// The dtor. +QsciAccessibleScintillaBase::~QsciAccessibleScintillaBase() +{ + all_accessibles.removeOne(this); +} + + +// Initialise the accessibility support. +void QsciAccessibleScintillaBase::initialise() +{ + if (needs_initialising) + { + QAccessible::installFactory(factory); + needs_initialising = false; + } +} + + +// Find the accessible for a widget. +QsciAccessibleScintillaBase *QsciAccessibleScintillaBase::findAccessible( + QsciScintillaBase *sb) +{ + for (int i = 0; i < all_accessibles.size(); ++i) + { + QsciAccessibleScintillaBase *acc_sb = all_accessibles.at(i); + + if (acc_sb->sciWidget() == sb) + return acc_sb; + } + + return 0; +} + + +// Return the QsciScintillaBase instance. +QsciScintillaBase *QsciAccessibleScintillaBase::sciWidget() const +{ + return static_cast(widget()); +} + + +// Update the accessible when the selection has changed. +void QsciAccessibleScintillaBase::selectionChanged(QsciScintillaBase *sb, + bool selection) +{ + QsciAccessibleScintillaBase *acc_sb = findAccessible(sb); + + if (!acc_sb) + return; + + acc_sb->is_selection = selection; +} + + +// Update the accessibility when text has been inserted. +void QsciAccessibleScintillaBase::textInserted(QsciScintillaBase *sb, + int position, const char *text, int length) +{ + Q_ASSERT(text); + + QString new_text = bytesAsText(sb, text, length); + int offset = positionAsOffset(sb, position); + + QAccessibleTextInsertEvent ev(sb, offset, new_text); + QAccessible::updateAccessibility(&ev); +} + + +// Return the fragment of text before an offset. +QString QsciAccessibleScintillaBase::textBeforeOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const +{ + QsciScintillaBase *sb = sciWidget(); + + // Initialise in case of errors. + *startOffset = *endOffset = -1; + + int position = validPosition(offset); + + if (position < 0) + return QString(); + + int start_position, end_position; + + if (!boundaries(sb, position, boundaryType, &start_position, &end_position)) + return QString(); + + if (start_position == 0) + return QString(); + + if (!boundaries(sb, start_position - 1, boundaryType, &start_position, &end_position)) + return QString(); + + positionRangeAsOffsetRange(sb, start_position, end_position, startOffset, + endOffset); + + return textRange(sb, start_position, end_position); +} + + +// Return the fragment of text after an offset. +QString QsciAccessibleScintillaBase::textAfterOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const +{ + QsciScintillaBase *sb = sciWidget(); + + // Initialise in case of errors. + *startOffset = *endOffset = -1; + + int position = validPosition(offset); + + if (position < 0) + return QString(); + + int start_position, end_position; + + if (!boundaries(sb, position, boundaryType, &start_position, &end_position)) + return QString(); + + if (end_position >= sb->SendScintilla(QsciScintillaBase::SCI_GETTEXTLENGTH)) + return QString(); + + if (!boundaries(sb, end_position, boundaryType, &start_position, &end_position)) + return QString(); + + positionRangeAsOffsetRange(sb, start_position, end_position, startOffset, + endOffset); + + return textRange(sb, start_position, end_position); +} + + +// Return the fragment of text at an offset. +QString QsciAccessibleScintillaBase::textAtOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const +{ + QsciScintillaBase *sb = sciWidget(); + + // Initialise in case of errors. + *startOffset = *endOffset = -1; + + int position = validPosition(offset); + + if (position < 0) + return QString(); + + int start_position, end_position; + + if (!boundaries(sb, position, boundaryType, &start_position, &end_position)) + return QString(); + + positionRangeAsOffsetRange(sb, start_position, end_position, startOffset, + endOffset); + + return textRange(sb, start_position, end_position); +} + + +// Update the accessibility when text has been deleted. +void QsciAccessibleScintillaBase::textDeleted(QsciScintillaBase *sb, + int position, const char *text, int length) +{ + Q_ASSERT(text); + + QString old_text = bytesAsText(sb, text, length); + int offset = positionAsOffset(sb, position); + + QAccessibleTextRemoveEvent ev(sb, offset, old_text); + QAccessible::updateAccessibility(&ev); +} + + +// Update the accessibility when the UI has been updated. +void QsciAccessibleScintillaBase::updated(QsciScintillaBase *sb) +{ + QsciAccessibleScintillaBase *acc_sb = findAccessible(sb); + + if (!acc_sb) + return; + + int cursor_offset = positionAsOffset(sb, + sb->SendScintilla(QsciScintillaBase::SCI_GETCURRENTPOS)); + + if (acc_sb->current_cursor_offset != cursor_offset) + { + acc_sb->current_cursor_offset = cursor_offset; + + QAccessibleTextCursorEvent ev(sb, cursor_offset); + QAccessible::updateAccessibility(&ev); + } +} + + +// Return a valid position from an offset or -1 if it was invalid. +int QsciAccessibleScintillaBase::validPosition(int offset) const +{ + // An offset of -1 is interpreted as the length of the text. + int nr_chars = characterCount(); + + if (offset == -1) + offset = nr_chars; + + // Check there is some text and the offset is within range. + if (nr_chars == 0 || offset < 0 || offset > nr_chars) + return -1; + + return offsetAsPosition(sciWidget(), offset); +} + + +// Get the start and end boundary positions for a type of boundary. true is +// returned if the boundary positions are valid. +bool QsciAccessibleScintillaBase::boundaries(QsciScintillaBase *sb, + int position, QAccessible::TextBoundaryType boundaryType, + int *start_position, int *end_position) +{ + // This implementation is based on what Qt does although that may itself be + // wrong. The cursor is in a word if it is before or after any character + // in the word. If the cursor is not in a word (eg. is has a space each + // side) then the previous word is current. + + switch (boundaryType) + { + case QAccessible::CharBoundary: + *start_position = position; + *end_position = sb->SendScintilla( + QsciScintillaBase::SCI_POSITIONAFTER, position); + break; + + case QAccessible::WordBoundary: + *start_position = sb->SendScintilla( + QsciScintillaBase::SCI_WORDSTARTPOSITION, position, 1); + *end_position = sb->SendScintilla( + QsciScintillaBase::SCI_WORDENDPOSITION, position, 1); + + // If the start and end positions are the same then we are not in a + // word. + if (*start_position == *end_position) + { + // We need the immediately preceding word. Note that Qt behaves + // differently as it will not move before the current line. + + // Find the end of the preceding word. + *end_position = sb->SendScintilla( + QsciScintillaBase::SCI_WORDSTARTPOSITION, position, 0L); + + // If the end is 0 then there isn't a preceding word. + if (*end_position == 0) + return false; + + // Now find the start. + *start_position = sb->SendScintilla( + QsciScintillaBase::SCI_WORDSTARTPOSITION, *end_position, + 1); + } + + break; + + case QAccessible::SentenceBoundary: + return false; + + case QAccessible::ParagraphBoundary: + // Paragraph boundaries are supposed to be supported but it isn't clear + // what this means in a code editor. + return false; + + case QAccessible::LineBoundary: + { + int line = sb->SendScintilla( + QsciScintillaBase::SCI_LINEFROMPOSITION, position); + + *start_position = sb->SendScintilla( + QsciScintillaBase::SCI_POSITIONFROMLINE, line); + *end_position = sb->SendScintilla( + QsciScintillaBase::SCI_POSITIONFROMLINE, line + 1); + + // See if we are after the last end-of-line character. + if (*start_position == *end_position) + return false; + } + + break; + + case QAccessible::NoBoundary: + *start_position = 0; + *end_position = sb->SendScintilla( + QsciScintillaBase::SCI_GETTEXTLENGTH); + break; + } + + return true; +} + + +// Return the text between two positions. +QString QsciAccessibleScintillaBase::textRange(QsciScintillaBase *sb, + int start_position, int end_position) +{ + QByteArray bytes(end_position - start_position + 1, '\0'); + + sb->SendScintilla(QsciScintillaBase::SCI_GETTEXTRANGE, start_position, + end_position, bytes.data()); + + return bytesAsText(sb, bytes.constData(), bytes.size() - 1); +} + + +// Convert bytes to text. +QString QsciAccessibleScintillaBase::bytesAsText(QsciScintillaBase *sb, + const char *bytes, int length) +{ + if (sb->SendScintilla(QsciScintillaBase::SCI_GETCODEPAGE) == QsciScintillaBase::SC_CP_UTF8) + return QString::fromUtf8(bytes, length); + + return QString::fromLatin1(bytes, length); +} + + +// Convert text to bytes. +QByteArray QsciAccessibleScintillaBase::textAsBytes(QsciScintillaBase *sb, + const QString &text) +{ + if (sb->SendScintilla(QsciScintillaBase::SCI_GETCODEPAGE) == QsciScintillaBase::SC_CP_UTF8) + return text.toUtf8(); + + return text.toLatin1(); +} + + +// Convert a byte position to a character offset. +int QsciAccessibleScintillaBase::positionAsOffset(QsciScintillaBase *sb, + int position) +{ + return sb->SendScintilla(QsciScintillaBase::SCI_COUNTCHARACTERS, 0, + position); +} + + +// Convert a range of byte poisitions to character offsets. +void QsciAccessibleScintillaBase::positionRangeAsOffsetRange( + QsciScintillaBase *sb, int start_position, int end_position, + int *startOffset, int *endOffset) +{ + *startOffset = positionAsOffset(sb, start_position); + *endOffset = positionAsOffset(sb, end_position); +} + + +// Convert character offset position to a byte position. +int QsciAccessibleScintillaBase::offsetAsPosition(QsciScintillaBase *sb, + int offset) +{ + return sb->SendScintilla(QsciScintillaBase::SCI_POSITIONRELATIVE, 0, + offset); +} + + +// Get the current selection if any. +void QsciAccessibleScintillaBase::selection(int selectionIndex, + int *startOffset, int *endOffset) const +{ + int start, end; + + if (selectionIndex == 0 && is_selection) + { + QsciScintillaBase *sb = sciWidget(); + int start_position = sb->SendScintilla( + QsciScintillaBase::SCI_GETSELECTIONSTART); + int end_position = sb->SendScintilla( + QsciScintillaBase::SCI_GETSELECTIONEND); + + start = positionAsOffset(sb, start_position); + end = positionAsOffset(sb, end_position); + } + else + { + start = end = 0; + } + + *startOffset = start; + *endOffset = end; +} + + +// Return the number of selections. +int QsciAccessibleScintillaBase::selectionCount() const +{ + return (is_selection ? 1 : 0); +} + + +// Add a selection. +void QsciAccessibleScintillaBase::addSelection(int startOffset, int endOffset) +{ + setSelection(0, startOffset, endOffset); +} + + +// Remove a selection. +void QsciAccessibleScintillaBase::removeSelection(int selectionIndex) +{ + if (selectionIndex == 0) + sciWidget()->SendScintilla(QsciScintillaBase::SCI_CLEARSELECTIONS); +} + + +// Set the selection. +void QsciAccessibleScintillaBase::setSelection(int selectionIndex, + int startOffset, int endOffset) +{ + if (selectionIndex == 0) + { + QsciScintillaBase *sb = sciWidget(); + sb->SendScintilla(QsciScintillaBase::SCI_SETSELECTIONSTART, + offsetAsPosition(sb, startOffset)); + sb->SendScintilla(QsciScintillaBase::SCI_SETSELECTIONEND, + offsetAsPosition(sb, endOffset)); + } +} + + +// Return the current cursor offset. +int QsciAccessibleScintillaBase::cursorPosition() const +{ + return current_cursor_offset; +} + + +// Set the cursor offset. +void QsciAccessibleScintillaBase::setCursorPosition(int position) +{ + QsciScintillaBase *sb = sciWidget(); + + sb->SendScintilla(QsciScintillaBase::SCI_GOTOPOS, + offsetAsPosition(sb, position)); +} + + +// Return the text between two offsets. +QString QsciAccessibleScintillaBase::text(int startOffset, int endOffset) const +{ + QsciScintillaBase *sb = sciWidget(); + + return textRange(sb, offsetAsPosition(sb, startOffset), + offsetAsPosition(sb, endOffset)); +} + + +// Return the number of characters in the text. +int QsciAccessibleScintillaBase::characterCount() const +{ + QsciScintillaBase *sb = sciWidget(); + + return sb->SendScintilla(QsciScintillaBase::SCI_COUNTCHARACTERS, 0, + sb->SendScintilla(QsciScintillaBase::SCI_GETTEXTLENGTH)); +} + + +QRect QsciAccessibleScintillaBase::characterRect(int offset) const +{ + QsciScintillaBase *sb = sciWidget(); + int position = offsetAsPosition(sb, offset); + int x_vport = sb->SendScintilla(QsciScintillaBase::SCI_POINTXFROMPOSITION, + position); + int y_vport = sb->SendScintilla(QsciScintillaBase::SCI_POINTYFROMPOSITION, + position); + const QString ch = text(offset, offset + 1); + + // Get the character's font metrics. + int style = sb->SendScintilla(QsciScintillaBase::SCI_GETSTYLEAT, position); + QFontMetrics metrics(fontForStyle(style)); + + QRect rect(x_vport, y_vport, metrics.width(ch), metrics.height()); + rect.moveTo(sb->viewport()->mapToGlobal(rect.topLeft())); + + return rect; +} + + +// Return the offset of the character at the given screen coordinates. +int QsciAccessibleScintillaBase::offsetAtPoint(const QPoint &point) const +{ + QsciScintillaBase *sb = sciWidget(); + QPoint p = sb->viewport()->mapFromGlobal(point); + int position = sb->SendScintilla(QsciScintillaBase::SCI_POSITIONFROMPOINT, + p.x(), p.y()); + + return (position >= 0) ? positionAsOffset(sb, position) : -1; +} + + +// Scroll to make sure an area of text is visible. +void QsciAccessibleScintillaBase::scrollToSubstring(int startIndex, + int endIndex) +{ + QsciScintillaBase *sb = sciWidget(); + int start = offsetAsPosition(sb, startIndex); + int end = offsetAsPosition(sb, endIndex); + + sb->SendScintilla(QsciScintillaBase::SCI_SCROLLRANGE, end, start); +} + + +// Return the attributes of a character and surrounding text. +QString QsciAccessibleScintillaBase::attributes(int offset, int *startOffset, + int *endOffset) const +{ + QsciScintillaBase *sb = sciWidget(); + int position = offsetAsPosition(sb, offset); + int style = sb->SendScintilla(QsciScintillaBase::SCI_GETSTYLEAT, position); + + // Find the start of the text with this style. + int start_position = position; + int start_text_position = offset; + + while (start_position > 0) + { + int before = sb->SendScintilla(QsciScintillaBase::SCI_POSITIONBEFORE, + start_position); + int s = sb->SendScintilla(QsciScintillaBase::SCI_GETSTYLEAT, before); + + if (s != style) + break; + + start_position = before; + --start_text_position; + } + + *startOffset = start_text_position; + + // Find the end of the text with this style. + int end_position = sb->SendScintilla(QsciScintillaBase::SCI_POSITIONAFTER, + position); + int end_text_position = offset + 1; + int last_position = sb->SendScintilla( + QsciScintillaBase::SCI_GETTEXTLENGTH); + + while (end_position < last_position) + { + int s = sb->SendScintilla(QsciScintillaBase::SCI_GETSTYLEAT, + end_position); + + if (s != style) + break; + + end_position = sb->SendScintilla(QsciScintillaBase::SCI_POSITIONAFTER, + end_position); + ++end_text_position; + } + + *endOffset = end_text_position; + + // Convert the style to attributes. + QString attrs; + + int back = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETBACK, style); + addAttribute(attrs, "background-color", colourAsRGB(back)); + + int fore = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETFORE, style); + addAttribute(attrs, "color", colourAsRGB(fore)); + + QFont font = fontForStyle(style); + + QString family = font.family(); + family = family.replace('\\', QLatin1String("\\\\")); + family = family.replace(':', QLatin1String("\\:")); + family = family.replace(',', QLatin1String("\\,")); + family = family.replace('=', QLatin1String("\\=")); + family = family.replace(';', QLatin1String("\\;")); + family = family.replace('\"', QLatin1String("\\\"")); + addAttribute(attrs, "font-familly", + QLatin1Char('"') + family + QLatin1Char('"')); + + int font_size = int(font.pointSize()); + addAttribute(attrs, "font-size", + QString::fromLatin1("%1pt").arg(font_size)); + + QFont::Style font_style = font.style(); + addAttribute(attrs, "font-style", + QString::fromLatin1((font_style == QFont::StyleItalic) ? "italic" : ((font_style == QFont::StyleOblique) ? "oblique": "normal"))); + + int font_weight = font.weight(); + addAttribute(attrs, "font-weight", + QString::fromLatin1( + (font_weight > QFont::Normal) ? "bold" : "normal")); + + int underline = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETUNDERLINE, + style); + if (underline) + addAttribute(attrs, "text-underline-type", + QString::fromLatin1("single")); + + return attrs; +} + + +// Add an attribute name/value pair. +void QsciAccessibleScintillaBase::addAttribute(QString &attrs, + const char *name, const QString &value) +{ + attrs.append(QLatin1String(name)); + attrs.append(QChar(':')); + attrs.append(value); + attrs.append(QChar(';')); +} + + +// Convert a integer colour to an RGB string. +QString QsciAccessibleScintillaBase::colourAsRGB(int colour) +{ + return QString::fromLatin1("rgb(%1,%2,%3)").arg(colour & 0xff).arg((colour >> 8) & 0xff).arg((colour >> 16) & 0xff); +} + + +// Convert a integer colour to an RGB string. +QFont QsciAccessibleScintillaBase::fontForStyle(int style) const +{ + QsciScintillaBase *sb = sciWidget(); + char fontName[64]; + int len = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETFONT, style, + fontName); + int size = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETSIZE, style); + bool italic = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETITALIC, + style); + int weight = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETWEIGHT, + style); + + return QFont(QString::fromUtf8(fontName, len), size, weight, italic); +} + + +// Delete some text. +void QsciAccessibleScintillaBase::deleteText(int startOffset, int endOffset) +{ + addSelection(startOffset, endOffset); + sciWidget()->SendScintilla(QsciScintillaBase::SCI_REPLACESEL, ""); +} + + +// Insert some text. +void QsciAccessibleScintillaBase::insertText(int offset, const QString &text) +{ + QsciScintillaBase *sb = sciWidget(); + + sb->SendScintilla(QsciScintillaBase::SCI_INSERTTEXT, + offsetAsPosition(sb, offset), textAsBytes(sb, text).constData()); +} + + +// Replace some text. +void QsciAccessibleScintillaBase::replaceText(int startOffset, int endOffset, + const QString &text) +{ + QsciScintillaBase *sb = sciWidget(); + + addSelection(startOffset, endOffset); + sb->SendScintilla(QsciScintillaBase::SCI_REPLACESEL, + textAsBytes(sb, text).constData()); +} + + +// Return the state. +QAccessible::State QsciAccessibleScintillaBase::state() const +{ + QAccessible::State st = QAccessibleWidget::state(); + + st.selectableText = true; + st.multiLine = true; + + if (sciWidget()->SendScintilla(QsciScintillaBase::SCI_GETREADONLY)) + st.readOnly = true; + else + st.editable = true; + + return st; +} + + +// Provide access to the indivual interfaces. +void *QsciAccessibleScintillaBase::interface_cast(QAccessible::InterfaceType t) +{ + if (t == QAccessible::TextInterface) + return static_cast(this); + + if (t == QAccessible::EditableTextInterface) + return static_cast(this); + + return QAccessibleWidget::interface_cast(t); +} + + +// The accessibility interface factory. +static QAccessibleInterface *factory(const QString &classname, QObject *object) +{ + if (classname == QLatin1String("QsciScintillaBase") && object && object->isWidgetType()) + return new QsciAccessibleScintillaBase(static_cast(object)); + + return 0; +} + + +#endif diff --git a/libs/qscintilla/Qt4Qt5/SciAccessibility.h b/libs/qscintilla/Qt4Qt5/SciAccessibility.h new file mode 100644 index 000000000..67609ec87 --- /dev/null +++ b/libs/qscintilla/Qt4Qt5/SciAccessibility.h @@ -0,0 +1,122 @@ +// The definition of the class that implements accessibility support. +// +// Copyright (c) 2018 Riverbank Computing Limited +// +// This file is part of QScintilla. +// +// This file may be used under the terms of the GNU General Public License +// version 3.0 as published by the Free Software Foundation and appearing in +// the file LICENSE included in the packaging of this file. Please review the +// following information to ensure the GNU General Public License version 3.0 +// requirements will be met: http://www.gnu.org/copyleft/gpl.html. +// +// If you do not wish to use this file under the terms of the GPL version 3.0 +// then you may purchase a commercial license. For more information contact +// info@riverbankcomputing.com. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + +#ifndef _SCIACCESSIBILITY_H +#define _SCIACCESSIBILITY_H + +#include + +#if !defined(QT_NO_ACCESSIBILITY) + +#include +#include +#include +#include +#include +#include +#include +#include + + +class QsciScintillaBase; + + +// The implementation of accessibility support. +class QsciAccessibleScintillaBase : public QAccessibleWidget, + public QAccessibleTextInterface, + public QAccessibleEditableTextInterface +{ +public: + explicit QsciAccessibleScintillaBase(QWidget *widget); + ~QsciAccessibleScintillaBase(); + + static void initialise(); + + static void selectionChanged(QsciScintillaBase *sb, bool selection); + static void textInserted(QsciScintillaBase *sb, int position, + const char *text, int length); + static void textDeleted(QsciScintillaBase *sb, int position, + const char *text, int length); + static void updated(QsciScintillaBase *sb); + + void selection(int selectionIndex, int *startOffset, int *endOffset) const; + int selectionCount() const; + void addSelection(int startOffset, int endOffset); + void removeSelection(int selectionIndex); + void setSelection(int selectionIndex, int startOffset, int endOffset); + + int cursorPosition() const; + void setCursorPosition(int position); + + QString text(int startOffset, int endOffset) const; + QString textBeforeOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const; + QString textAfterOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const; + QString textAtOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const; + int characterCount() const; + QRect characterRect(int offset) const; + int offsetAtPoint(const QPoint &point) const; + void scrollToSubstring(int startIndex, int endIndex); + QString attributes(int offset, int *startOffset, int *endOffset) const; + + void deleteText(int startOffset, int endOffset); + void insertText(int offset, const QString &text); + void replaceText(int startOffset, int endOffset, const QString &text); + + QAccessible::State state() const; + void *interface_cast(QAccessible::InterfaceType t); + +private: + static bool needs_initialising; + static QList all_accessibles; + int current_cursor_offset; + bool is_selection; + + static QsciAccessibleScintillaBase *findAccessible(QsciScintillaBase *sb); + QsciScintillaBase *sciWidget() const; + int validPosition(int offset) const; + static bool boundaries(QsciScintillaBase *sb, int position, + QAccessible::TextBoundaryType boundaryType, int *start_position, + int *end_position); + static QString textRange(QsciScintillaBase *sb, int start_position, + int end_position); + static QString bytesAsText(QsciScintillaBase *sb, const char *bytes, + int length); + static QByteArray textAsBytes(QsciScintillaBase *sb, const QString &text); + static int positionAsOffset(QsciScintillaBase *sb, int position); + static void positionRangeAsOffsetRange(QsciScintillaBase *sb, + int start_position, int end_position, int *startOffset, + int *endOffset); + static int offsetAsPosition(QsciScintillaBase *sb, int offset); + static QString colourAsRGB(int colour); + static void addAttribute(QString &attrs, const char *name, + const QString &value); + QFont fontForStyle(int style) const; +}; + + +#endif + +#endif diff --git a/libs/qscintilla/Qt4Qt5/SciClasses.cpp b/libs/qscintilla/Qt4Qt5/SciClasses.cpp index c94c92854..4dc03cd52 100644 --- a/libs/qscintilla/Qt4Qt5/SciClasses.cpp +++ b/libs/qscintilla/Qt4Qt5/SciClasses.cpp @@ -1,7 +1,7 @@ // The implementation of various Qt version independent classes used by the // rest of the port. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/SciClasses.h b/libs/qscintilla/Qt4Qt5/SciClasses.h index 6b3ad324f..586b5fef6 100644 --- a/libs/qscintilla/Qt4Qt5/SciClasses.h +++ b/libs/qscintilla/Qt4Qt5/SciClasses.h @@ -1,7 +1,7 @@ // The definition of various Qt version independent classes used by the rest of // the port. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/SciNamespace.h b/libs/qscintilla/Qt4Qt5/SciNamespace.h index 4396edebb..7c9242b96 100644 --- a/libs/qscintilla/Qt4Qt5/SciNamespace.h +++ b/libs/qscintilla/Qt4Qt5/SciNamespace.h @@ -1,7 +1,7 @@ // Support for building the Scintilla code in the Scintilla namespace using the // -DSCI_NAMESPACE compiler flag. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/ScintillaQt.cpp b/libs/qscintilla/Qt4Qt5/ScintillaQt.cpp index dc344b514..76e14d3bd 100644 --- a/libs/qscintilla/Qt4Qt5/ScintillaQt.cpp +++ b/libs/qscintilla/Qt4Qt5/ScintillaQt.cpp @@ -1,6 +1,6 @@ // The implementation of the Qt specific subclass of ScintillaBase. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -31,6 +31,9 @@ #include "Qsci/qsciscintillabase.h" #include "ScintillaQt.h" +#if !defined(QT_NO_ACCESSIBILITY) +#include "SciAccessibility.h" +#endif #include "SciClasses.h" @@ -110,6 +113,11 @@ QsciScintillaQt::QsciScintillaQt(QsciScintillaBase *qsb_) // This is ignored. imeInteraction = imeInline; + // Using pixmaps screws things up when moving to a different display + // (although this could be because we haven't got the pixmap code right). + // However Qt shouldn't need buffered drawing anyway. + WndProc(SCI_SETBUFFEREDDRAW, 0, 0); + for (int i = 0; i <= static_cast(tickPlatform); ++i) timers[i] = 0; @@ -192,10 +200,12 @@ sptr_t QsciScintillaQt::DefWndProc(unsigned int, uptr_t, sptr_t) void QsciScintillaQt::SetMouseCapture(bool on) { if (mouseDownCaptures) + { if (on) qsb->viewport()->grabMouse(); else qsb->viewport()->releaseMouse(); + } capturedMouse = on; } @@ -383,8 +393,17 @@ void QsciScintillaQt::NotifyParent(SCNotification scn) { char *text; +#if !defined(QT_NO_ACCESSIBILITY) + if ((scn.modificationType & SC_MOD_INSERTTEXT) != 0) + QsciAccessibleScintillaBase::textInserted(qsb, scn.position, + scn.text, scn.length); + else if ((scn.modificationType & SC_MOD_DELETETEXT) != 0) + QsciAccessibleScintillaBase::textDeleted(qsb, scn.position, + scn.text, scn.length); +#endif + // Give some protection to the Python bindings. - if (scn.text && (scn.modificationType & (SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT) != 0)) + if (scn.text && (scn.modificationType & (SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT)) != 0) { text = new char[scn.length + 1]; memcpy(text, scn.text, scn.length); @@ -430,6 +449,9 @@ void QsciScintillaQt::NotifyParent(SCNotification scn) break; case SCN_UPDATEUI: +#if !defined(QT_NO_ACCESSIBILITY) + QsciAccessibleScintillaBase::updated(qsb); +#endif emit qsb->SCN_UPDATEUI(scn.updated); break; @@ -567,6 +589,10 @@ void QsciScintillaQt::ClaimSelection() else primarySelection = false; +#if !defined(QT_NO_ACCESSIBILITY) + QsciAccessibleScintillaBase::selectionChanged(qsb, isSel); +#endif + emit qsb->QSCN_SELCHANGED(isSel); } diff --git a/libs/qscintilla/Qt4Qt5/ScintillaQt.h b/libs/qscintilla/Qt4Qt5/ScintillaQt.h index 3f39245b6..f36875c9c 100644 --- a/libs/qscintilla/Qt4Qt5/ScintillaQt.h +++ b/libs/qscintilla/Qt4Qt5/ScintillaQt.h @@ -1,6 +1,6 @@ // The definition of the Qt specific subclass of ScintillaBase. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qsciabstractapis.cpp b/libs/qscintilla/Qt4Qt5/qsciabstractapis.cpp index f5db37567..6658fcb35 100644 --- a/libs/qscintilla/Qt4Qt5/qsciabstractapis.cpp +++ b/libs/qscintilla/Qt4Qt5/qsciabstractapis.cpp @@ -1,6 +1,6 @@ // This module implements the QsciAbstractAPIs class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -47,4 +47,5 @@ QsciLexer *QsciAbstractAPIs::lexer() const // Called when the user has made a selection from the auto-completion list. void QsciAbstractAPIs::autoCompletionSelected(const QString &selection) { + Q_UNUSED(selection); } diff --git a/libs/qscintilla/Qt4Qt5/qsciapis.cpp b/libs/qscintilla/Qt4Qt5/qsciapis.cpp index 8de9f0e66..8b74c3d4c 100644 --- a/libs/qscintilla/Qt4Qt5/qsciapis.cpp +++ b/libs/qscintilla/Qt4Qt5/qsciapis.cpp @@ -1,6 +1,6 @@ // This module implements the QsciAPIs class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -128,7 +128,7 @@ class QsciAPIsWorker : public QThread // The worker thread ctor. QsciAPIsWorker::QsciAPIsWorker(QsciAPIs *apis) - : proxy(apis), prepared(0), abort(false) + : prepared(0), proxy(apis), abort(false) { } @@ -250,6 +250,9 @@ bool QsciAPIs::event(QEvent *e) emit apiPreparationFinished(); return true; + + default: + break; } return QObject::event(e); diff --git a/libs/qscintilla/Qt4Qt5/qscicommand.cpp b/libs/qscintilla/Qt4Qt5/qscicommand.cpp index 4d7fb9481..8405c205c 100644 --- a/libs/qscintilla/Qt4Qt5/qscicommand.cpp +++ b/libs/qscintilla/Qt4Qt5/qscicommand.cpp @@ -1,6 +1,6 @@ // This module implements the QsciCommand class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qscicommandset.cpp b/libs/qscintilla/Qt4Qt5/qscicommandset.cpp index 2378a87cc..4defadfd4 100644 --- a/libs/qscintilla/Qt4Qt5/qscicommandset.cpp +++ b/libs/qscintilla/Qt4Qt5/qscicommandset.cpp @@ -1,6 +1,6 @@ // This module implements the QsciCommandSet class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -937,7 +937,7 @@ bool QsciCommandSet::writeSettings(QSettings &qs, const char *prefix) qs.setValue(skey + "key", cmd->key()); // Write the alternate key. - qs.setValue(skey + "alt", cmd->key()); + qs.setValue(skey + "alt", cmd->alternateKey()); } return rc; diff --git a/libs/qscintilla/Qt4Qt5/qscidocument.cpp b/libs/qscintilla/Qt4Qt5/qscidocument.cpp index 1b0da26ed..70d19e471 100644 --- a/libs/qscintilla/Qt4Qt5/qscidocument.cpp +++ b/libs/qscintilla/Qt4Qt5/qscidocument.cpp @@ -1,6 +1,6 @@ // This module implements the QsciDocument class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qscilexer.cpp b/libs/qscintilla/Qt4Qt5/qscilexer.cpp index 257b98d50..43e5bbbed 100644 --- a/libs/qscintilla/Qt4Qt5/qscilexer.cpp +++ b/libs/qscintilla/Qt4Qt5/qscilexer.cpp @@ -1,6 +1,6 @@ // This module implements the QsciLexer class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -36,11 +36,11 @@ QsciLexer::QsciLexer(QObject *parent) autoIndStyle(-1), apiSet(0), attached_editor(0) { #if defined(Q_OS_WIN) - defFont = QFont("Verdana",10); + defFont = QFont("Verdana", 10); #elif defined(Q_OS_MAC) - defFont = QFont("Verdana", 12); + defFont = QFont("Menlo", 12); #else - defFont = QFont("Bitstream Vera Sans",9); + defFont = QFont("Bitstream Vera Sans", 9); #endif // Set the default fore and background colours. @@ -103,7 +103,7 @@ void QsciLexer::setStyleDefaults() const { if (!style_map->style_data_set) { - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) if (!description(i).isEmpty()) styleData(i); @@ -370,7 +370,7 @@ bool QsciLexer::readSettings(QSettings &qs,const char *prefix) setStyleDefaults(); // Read the styles. - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) { // Ignore invalid styles. if (description(i).isEmpty()) @@ -570,7 +570,7 @@ bool QsciLexer::writeSettings(QSettings &qs,const char *prefix) const setStyleDefaults(); // Write the styles. - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) { // Ignore invalid styles. if (description(i).isEmpty()) @@ -685,7 +685,7 @@ void QsciLexer::setColor(const QColor &c, int style) emit colorChanged(c, style); } else - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) if (!description(i).isEmpty()) setColor(c, i); } @@ -700,7 +700,7 @@ void QsciLexer::setEolFill(bool eolfill, int style) emit eolFillChanged(eolfill, style); } else - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) if (!description(i).isEmpty()) setEolFill(eolfill, i); } @@ -715,7 +715,7 @@ void QsciLexer::setFont(const QFont &f, int style) emit fontChanged(f, style); } else - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) if (!description(i).isEmpty()) setFont(f, i); } @@ -731,7 +731,7 @@ void QsciLexer::setPaper(const QColor &c, int style) } else { - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) if (!description(i).isEmpty()) setPaper(c, i); diff --git a/libs/qscintilla/Qt4Qt5/qscilexercpp.cpp b/libs/qscintilla/Qt4Qt5/qscilexercpp.cpp index 6316018e3..df37bc37a 100644 --- a/libs/qscintilla/Qt4Qt5/qscilexercpp.cpp +++ b/libs/qscintilla/Qt4Qt5/qscilexercpp.cpp @@ -1,6 +1,6 @@ // This module implements the QsciLexerCPP class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qscilexercustom.cpp b/libs/qscintilla/Qt4Qt5/qscilexercustom.cpp index 96269e2ef..336976036 100644 --- a/libs/qscintilla/Qt4Qt5/qscilexercustom.cpp +++ b/libs/qscintilla/Qt4Qt5/qscilexercustom.cpp @@ -1,6 +1,6 @@ // This module implements the QsciLexerCustom class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qscilexerhtml.cpp b/libs/qscintilla/Qt4Qt5/qscilexerhtml.cpp index 0df3a6c85..588affdd7 100644 --- a/libs/qscintilla/Qt4Qt5/qscilexerhtml.cpp +++ b/libs/qscintilla/Qt4Qt5/qscilexerhtml.cpp @@ -1,6 +1,6 @@ // This module implements the QsciLexerHTML class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qscilexerjavascript.cpp b/libs/qscintilla/Qt4Qt5/qscilexerjavascript.cpp index afa9c9bd9..ab5ef2107 100644 --- a/libs/qscintilla/Qt4Qt5/qscilexerjavascript.cpp +++ b/libs/qscintilla/Qt4Qt5/qscilexerjavascript.cpp @@ -1,6 +1,6 @@ // This module implements the QsciLexerJavaScript class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qscilexerjson.cpp b/libs/qscintilla/Qt4Qt5/qscilexerjson.cpp index 09385d302..22dbbe676 100644 --- a/libs/qscintilla/Qt4Qt5/qscilexerjson.cpp +++ b/libs/qscintilla/Qt4Qt5/qscilexerjson.cpp @@ -1,6 +1,6 @@ // This module implements the QsciLexerJSON class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qscilexerpython.cpp b/libs/qscintilla/Qt4Qt5/qscilexerpython.cpp index 817d75fdc..f9ef5121a 100644 --- a/libs/qscintilla/Qt4Qt5/qscilexerpython.cpp +++ b/libs/qscintilla/Qt4Qt5/qscilexerpython.cpp @@ -1,6 +1,6 @@ // This module implements the QsciLexerPython class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -309,7 +309,7 @@ void QsciLexerPython::refreshProperties() // Read properties from the settings. bool QsciLexerPython::readProperties(QSettings &qs,const QString &prefix) { - int rc = true, num; + int rc = true; fold_comments = qs.value(prefix + "foldcomments", false).toBool(); fold_compact = qs.value(prefix + "foldcompact", true).toBool(); diff --git a/libs/qscintilla/Qt4Qt5/qscilexersql.cpp b/libs/qscintilla/Qt4Qt5/qscilexersql.cpp index 5471a8cc8..ae566bd35 100644 --- a/libs/qscintilla/Qt4Qt5/qscilexersql.cpp +++ b/libs/qscintilla/Qt4Qt5/qscilexersql.cpp @@ -1,6 +1,6 @@ // This module implements the QsciLexerSQL class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qscilexerxml.cpp b/libs/qscintilla/Qt4Qt5/qscilexerxml.cpp index 4394ef3d5..ab5b9b4ff 100644 --- a/libs/qscintilla/Qt4Qt5/qscilexerxml.cpp +++ b/libs/qscintilla/Qt4Qt5/qscilexerxml.cpp @@ -1,6 +1,6 @@ // This module implements the QsciLexerXML class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -210,7 +210,7 @@ void QsciLexerXML::refreshProperties() // Read properties from the settings. bool QsciLexerXML::readProperties(QSettings &qs, const QString &prefix) { - int rc = QsciLexerHTML::readProperties(qs, prefix), num; + int rc = QsciLexerHTML::readProperties(qs, prefix); scripts = qs.value(prefix + "scriptsstyled", true).toBool(); diff --git a/libs/qscintilla/Qt4Qt5/qscimacro.cpp b/libs/qscintilla/Qt4Qt5/qscimacro.cpp index 1247c0b06..6ead8e956 100644 --- a/libs/qscintilla/Qt4Qt5/qscimacro.cpp +++ b/libs/qscintilla/Qt4Qt5/qscimacro.cpp @@ -1,6 +1,6 @@ // This module implements the QsciMacro class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qscintilla.pro b/libs/qscintilla/Qt4Qt5/qscintilla.pro index d642c1fdd..08cdcebdc 100644 --- a/libs/qscintilla/Qt4Qt5/qscintilla.pro +++ b/libs/qscintilla/Qt4Qt5/qscintilla.pro @@ -1,6 +1,6 @@ # The project file for the QScintilla library. # -# Copyright (c) 2017 Riverbank Computing Limited +# Copyright (c) 2018 Riverbank Computing Limited # # This file is part of QScintilla. # @@ -20,7 +20,7 @@ # This must be kept in sync with Python/configure.py, Python/configure-old.py, # example-Qt4Qt5/application.pro and designer-Qt4Qt5/designer.pro. -!win32:VERSION = 13.0.0 +!win32:VERSION = 13.2.1 TEMPLATE = lib TARGET = qscintilla2 @@ -43,6 +43,8 @@ greaterThan(QT_MAJOR_VERSION, 4) { # Work around QTBUG-39300. CONFIG -= android_install +} else { + DEFINES += QT_NO_ACCESSIBILITY } # Comment this in if you want the internal Scintilla classes to be placed in a @@ -78,36 +80,20 @@ INSTALLS += features HEADERS = \ ./Qsci/qsciglobal.h \ - ./Qsci/qsciscintilla.h \ - ./Qsci/qsciscintillabase.h \ - ./Qsci/qsciabstractapis.h \ - ./Qsci/qsciapis.h \ ./Qsci/qscicommand.h \ ./Qsci/qscicommandset.h \ ./Qsci/qscidocument.h \ - ./Qsci/qscilexer.h \ - ./Qsci/qscilexercustom.h \ - ./Qsci/qscilexersql.h \ - ./Qsci/qscilexerjson.h \ - ./Qsci/qscilexerhtml.h \ - ./Qsci/qscilexerxml.h \ - ./Qsci/qscilexerjavascript.h \ - ./Qsci/qscilexercpp.h \ - ./Qsci/qscilexerpython.h \ - ./Qsci/qscimacro.h \ ./Qsci/qsciprinter.h \ ./Qsci/qscistyle.h \ ./Qsci/qscistyledtext.h \ ListBoxQt.h \ - SciClasses.h \ SciNamespace.h \ - ScintillaQt.h \ ../include/ILexer.h \ ../include/Platform.h \ - ../include/Sci_Position.h \ ../include/SciLexer.h \ ../include/Scintilla.h \ ../include/ScintillaWidget.h \ + ../include/Sci_Position.h \ ../lexlib/Accessor.h \ ../lexlib/CharacterCategory.h \ ../lexlib/CharacterSet.h \ @@ -118,7 +104,6 @@ HEADERS = \ ../lexlib/LexerSimple.h \ ../lexlib/OptionSet.h \ ../lexlib/PropSetSimple.h \ - ../lexlib/StringCopy.h \ ../lexlib/StyleContext.h \ ../lexlib/SubStyles.h \ ../lexlib/WordList.h \ @@ -132,15 +117,12 @@ HEADERS = \ ../src/ContractionState.h \ ../src/Decoration.h \ ../src/Document.h \ - ../src/EditModel.h \ ../src/Editor.h \ - ../src/EditView.h \ ../src/ExternalLexer.h \ ../src/FontQuality.h \ ../src/Indicator.h \ ../src/KeyMap.h \ ../src/LineMarker.h \ - ../src/MarginView.h \ ../src/Partitioning.h \ ../src/PerLine.h \ ../src/PositionCache.h \ @@ -153,7 +135,26 @@ HEADERS = \ ../src/UnicodeFromUTF8.h \ ../src/UniConversion.h \ ../src/ViewStyle.h \ - ../src/XPM.h + ../src/XPM.h \ + ../src/Position.h \ + ../src/SparseVector.h \ + ./Qsci/qsciscintilla.h \ + ./Qsci/qsciscintillabase.h \ + ./Qsci/qsciabstractapis.h \ + ./Qsci/qsciapis.h \ + ./Qsci/qscilexer.h \ + ./Qsci/qscilexercustom.h \ + ./Qsci/qscilexersql.h \ + ./Qsci/qscilexerjson.h \ + ./Qsci/qscilexerhtml.h \ + ./Qsci/qscilexerxml.h \ + ./Qsci/qscilexerjavascript.h \ + ./Qsci/qscilexercpp.h \ + ./Qsci/qscilexerpython.h \ + ./Qsci/qscimacro.h \ + SciClasses.h \ + ScintillaQt.h \ + SciAccessibility.h SOURCES = \ qsciscintilla.cpp \ @@ -182,6 +183,7 @@ SOURCES = \ ListBoxQt.cpp \ PlatQt.cpp \ ScintillaQt.cpp \ + SciAccessibility.cpp \ ../lexers/LexSQL.cpp \ ../lexers/LexJSON.cpp \ ../lexers/LexHTML.cpp \ @@ -205,8 +207,8 @@ SOURCES = \ ../src/ContractionState.cpp \ ../src/Decoration.cpp \ ../src/Document.cpp \ - ../src/EditModel.cpp \ ../src/Editor.cpp \ + ../src/EditModel.cpp \ ../src/EditView.cpp \ ../src/ExternalLexer.cpp \ ../src/Indicator.cpp \ diff --git a/libs/qscintilla/Qt4Qt5/qscintilla_cs.qm b/libs/qscintilla/Qt4Qt5/qscintilla_cs.qm index 93cb6ee90..0ce0e4358 100644 Binary files a/libs/qscintilla/Qt4Qt5/qscintilla_cs.qm and b/libs/qscintilla/Qt4Qt5/qscintilla_cs.qm differ diff --git a/libs/qscintilla/Qt4Qt5/qscintilla_cs.ts b/libs/qscintilla/Qt4Qt5/qscintilla_cs.ts index 16ae24e35..886ec67cd 100644 --- a/libs/qscintilla/Qt4Qt5/qscintilla_cs.ts +++ b/libs/qscintilla/Qt4Qt5/qscintilla_cs.ts @@ -4,493 +4,493 @@ QsciCommand - + Move down one line Posun o jednu řádku dolů - + Extend selection down one line Rozšířit výběr o jednu řádku dolů - + Scroll view down one line Rolovat pohled o jednu řádku dolů - + Extend rectangular selection down one line Rozšířit obdélníkový výběr o jednu řádku dolů - + Move up one line Posun o jednu řádku nahoru - + Extend selection up one line Rozšířit výběr o jednu řádku nahoru - + Scroll view up one line Rolovat pohled o jednu řádku nahoru - + Extend rectangular selection up one line Rozšířit obdélníkový výběr o jednu řádku nahoru - + Move up one paragraph Posun o jeden odstavec nahoru - + Extend selection up one paragraph Rozšířit výběr o jeden odstavec nahoru - + Move down one paragraph Posun o jeden odstavec dolů - + Scroll to start of document - + Scroll to end of document - + Scroll vertically to centre current line - + Extend selection down one paragraph Rozšířit výběr o jeden odstavec dolů - + Move left one character Posun o jedno písmeno doleva - + Extend selection left one character Rozšířit výběr o jedno písmeno doleva - + Move left one word Posun o jedno slovo vlevo - + Extend selection left one word Rozšířit výběr o jedno slovo doleva - + Extend rectangular selection left one character Rozšířit obdélníkový výběr o jedno písmeno doleva - + Move right one character Posun o jedno písmeno doprava - + Extend selection right one character Rozšířit výběr o jedno písmeno doprava - + Move right one word Posun o jedno slovo doprava - + Extend selection right one word Rozšířit výběr o jedno slovo doprava - + Extend rectangular selection right one character Rozšířit obdélníkový výběr o jedno písmeno doprava - + Move to end of previous word - + Extend selection to end of previous word - + Move to end of next word - + Extend selection to end of next word - + Move left one word part Posun o část slova doleva - + Extend selection left one word part Rozšířit výběr o část slova doleva - + Move right one word part Posun o část slova doprava - + Extend selection right one word part Rozšířit výběr o část slova doprava - + Move up one page Posun na předchozí stranu - + Extend selection up one page Rozšířit výběr na předchozí stranu - + Extend rectangular selection up one page Rozšířit obdélníkový výběr na předchozí stranu - + Move down one page Posun na další stranu - + Extend selection down one page Rozšířit výběr na další stranu - + Extend rectangular selection down one page Rozšířit obdélníkový výběr na další stranu - + Delete current character Smazat aktuální znak - + Cut selection Vyjmout výběr - + Delete word to right Smazat slovo doprava - + Move to start of document line - + Extend selection to start of document line - + Extend rectangular selection to start of document line - + Move to start of display line - + Extend selection to start of display line - + Move to start of display or document line - + Extend selection to start of display or document line - + Move to first visible character in document line - + Extend selection to first visible character in document line - + Extend rectangular selection to first visible character in document line - + Move to first visible character of display in document line - + Extend selection to first visible character in display or document line - + Move to end of document line - + Extend selection to end of document line - + Extend rectangular selection to end of document line - + Move to end of display line - + Extend selection to end of display line - + Move to end of display or document line - + Extend selection to end of display or document line - + Move to start of document - + Extend selection to start of document - + Move to end of document - + Extend selection to end of document - + Stuttered move up one page - + Stuttered extend selection up one page - + Stuttered move down one page - + Stuttered extend selection down one page - + Delete previous character if not at start of line - + Delete right to end of next word - + Delete line to right Smazat řádku doprava - + Transpose current and previous lines - + Duplicate the current line - + Select all Select document - + Move selected lines up one line - + Move selected lines down one line - + Toggle insert/overtype Přepnout vkládání/přepisování - + Paste Vložit - + Copy selection Kopírovat výběr - + Insert newline - + De-indent one level - + Cancel Zrušit - + Delete previous character Smazat předchozí znak - + Delete word to left Smazat slovo doleva - + Delete line to left Smazat řádku doleva - + Undo last command - + Redo last command Znovu použít poslední příkaz - + Indent one level Odsadit o jednu úroveň - + Zoom in Zvětšit - + Zoom out Zmenšit - + Formfeed Vysunout - + Cut current line Vyjmout aktuální řádku - + Delete current line Smazat aktuální řádku - + Copy current line Kopírovat aktuální řádku - + Convert selection to lower case Vybraný text převést na malá písmena - + Convert selection to upper case Vybraný text převést na velká písmena - + Duplicate selection Duplikovat výběr @@ -498,77 +498,77 @@ QsciLexerAVS - + Default Default - + Block comment - + Nested block comment - + Line comment Jednořádkový komentář - + Number Číslo - + Operator Operátor - + Identifier Identifikátor - + Double-quoted string String ve dvojitých uvozovkách - + Triple double-quoted string String ve třech dvojitých uvozovkách - + Keyword Klíčové slovo - + Filter - + Plugin - + Function - + Clip property - + User defined @@ -576,72 +576,72 @@ QsciLexerBash - + Default Default - + Error Chyba - + Comment Komentář - + Number Číslo - + Keyword Klíčové slovo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + Operator Operátor - + Identifier Identifikátor - + Scalar Skalár - + Parameter expansion Rozklad parametru - + Backticks Zpětný chod - + Here document delimiter Zde je oddělovač dokumentu - + Single-quoted here document Jednoduché uvozovky zde v dokumentu @@ -649,42 +649,42 @@ QsciLexerBatch - + Default Default - + Comment Komentář - + Keyword Klíčové slovo - + Label Nadpis - + Hide command character Skrýt písmeno příkazu - + External command Externí příkaz - + Variable Proměnná - + Operator Operátor @@ -692,77 +692,77 @@ QsciLexerCMake - + Default Default - + Comment Komentář - + String - + Left quoted string - + Right quoted string - + Function - + Variable Proměnná - + Label Nadpis - + User defined - + WHILE block - + FOREACH block - + IF block - + MACRO block - + Variable within a string - + Number Číslo @@ -770,282 +770,282 @@ QsciLexerCPP - + Default Default - + Inactive default - + C comment C komentář - + Inactive C comment - + C++ comment C++ komentář - + Inactive C++ comment - + JavaDoc style C comment JavaDoc styl C komentáře - + Inactive JavaDoc style C comment - + Number Číslo - + Inactive number - + Keyword Klíčové slovo - + Inactive keyword - + Double-quoted string String ve dvojitých uvozovkách - + Inactive double-quoted string - + Single-quoted string String v jednoduchých uvozovkách - + Inactive single-quoted string - + IDL UUID - + Inactive IDL UUID - + Pre-processor block Pre-procesor blok - + Inactive pre-processor block - + Operator Operátor - + Inactive operator - + Identifier Identifikátor - + Inactive identifier - + Unclosed string Neuzavřený string - + Inactive unclosed string - + C# verbatim string - + Inactive C# verbatim string - + JavaScript regular expression JavaSript regulární výraz - + Inactive JavaScript regular expression - + JavaDoc style C++ comment JavaDoc styl C++ komentáře - + Inactive JavaDoc style C++ comment - + Secondary keywords and identifiers Sekundární klíčová slova a identifikátory - + Inactive secondary keywords and identifiers - + JavaDoc keyword JavaDoc klíčové slovo - + Inactive JavaDoc keyword - + JavaDoc keyword error JavaDoc klíčové slovo chyby - + Inactive JavaDoc keyword error - + Global classes and typedefs Globální třídy a definice typů - + Inactive global classes and typedefs - + C++ raw string - + Inactive C++ raw string - + Vala triple-quoted verbatim string - + Inactive Vala triple-quoted verbatim string - + Pike hash-quoted string - + Inactive Pike hash-quoted string - + Pre-processor C comment - + Inactive pre-processor C comment - + JavaDoc style pre-processor comment - + Inactive JavaDoc style pre-processor comment - + User-defined literal - + Inactive user-defined literal - + Task marker - + Inactive task marker - + Escape sequence - + Inactive escape sequence @@ -1053,117 +1053,117 @@ QsciLexerCSS - + Default Default - + Tag Tag - + Class selector Selektor třídy - + Pseudo-class Pseudotřída - + Unknown pseudo-class Nedefinovaná pseudotřída - + Operator Operátor - + CSS1 property CSS1 vlastnost - + Unknown property Nedefinovaná vlastnost - + Value Hodnota - + ID selector ID selektor - + Important Important - + @-rule @-pravidlo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + CSS2 property CSS2 vlastnost - + Attribute Atribut - + CSS3 property CSS2 vlastnost {3 ?} - + Pseudo-element - + Extended CSS property - + Extended pseudo-class - + Extended pseudo-element - + Media rule - + Variable Proměnná @@ -1171,7 +1171,7 @@ QsciLexerCSharp - + Verbatim string @@ -1179,122 +1179,122 @@ QsciLexerCoffeeScript - + Default Default - + C-style comment - + C++-style comment - + JavaDoc C-style comment - + Number Číslo - + Keyword Klíčové slovo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + IDL UUID - + Pre-processor block Pre-procesor blok - + Operator Operátor - + Identifier Identifikátor - + Unclosed string Neuzavřený string - + C# verbatim string - + Regular expression Regulární výraz - + JavaDoc C++-style comment - + Secondary keywords and identifiers Sekundární klíčová slova a identifikátory - + JavaDoc keyword JavaDoc klíčové slovo - + JavaDoc keyword error JavaDoc klíčové slovo chyby - + Global classes - + Block comment - + Block regular expression - + Block regular expression comment - + Instance property @@ -1302,117 +1302,117 @@ QsciLexerD - + Default Default - + Block comment - + Line comment Jednořádkový komentář - + DDoc style block comment - + Nesting comment - + Number Číslo - + Keyword Klíčové slovo - + Secondary keyword - + Documentation keyword - + Type definition - + String - + Unclosed string Neuzavřený string - + Character Znak - + Operator Operátor - + Identifier Identifikátor - + DDoc style line comment - + DDoc keyword - + DDoc keyword error - + Backquoted string - + Raw string - + User defined 1 Definováno uživatelem 1 - + User defined 2 Definováno uživatelem 2 - + User defined 3 Definováno uživatelem 3 @@ -1420,120 +1420,168 @@ QsciLexerDiff - + Default Default - + Comment Komentář - + Command Příkaz - + Header Hlavička - + Position Pozice - + Removed line Odebraná řádka - + Added line Přidaná řádka - + Changed line + + QsciLexerEDIFACT + + + Default + Default + + + + Segment start + + + + + Segment end + + + + + Element separator + + + + + Composite separator + + + + + Release separator + + + + + UNA segment header + + + + + UNH segment header + + + + + Badly formed segment + + + QsciLexerFortran77 - + Default Default - + Comment Komentář - + Number Číslo - + Single-quoted string String v jednoduchých uvozovkách - + Double-quoted string String ve dvojitých uvozovkách - + Unclosed string Neuzavřený string - + Operator Operátor - + Identifier Identifikátor - + Keyword Klíčové slovo - + Intrinsic function - + Extended function - + Pre-processor block Pre-procesor blok - + Dotted operator - + Label Nadpis - + Continuation @@ -1541,547 +1589,547 @@ QsciLexerHTML - + HTML default - + Tag - + Unknown tag Nedefinovaný tag - + Attribute Atribut - + Unknown attribute Nedefinovaný atribut - + HTML number HTML číslo - + HTML double-quoted string HTML string ve dojtých uvozovkách - + HTML single-quoted string HTML string v jednoduchých uvozovkách - + Other text in a tag Další text v tagu - + HTML comment HTML komentář - + Entity Entita - + End of a tag Konec tagu - + Start of an XML fragment Začátek XML části - + End of an XML fragment Konec XML části - + Script tag Tag skriptu - + Start of an ASP fragment with @ Začátek ASP kódu s @ - + Start of an ASP fragment Začátek ASP kódu - + CDATA - + Start of a PHP fragment Začátek PHP kódu - + Unquoted HTML value HTML hodnota bez uvozovek - + ASP X-Code comment ASP X-Code komentář - + SGML default - + SGML command SGML příkaz - + First parameter of an SGML command První parametr v SGML příkazu - + SGML double-quoted string SGML string ve dvojitých uvozovkách - + SGML single-quoted string SGML string v jednoduchých uvozovkách - + SGML error SGML chyba - + SGML special entity SGML speciální entita - + SGML comment SGML komentář - + First parameter comment of an SGML command Komentář prvního parametru SGML příkazu - + SGML block default SGML defaultní blok - + Start of a JavaScript fragment Začátek JavaScript kódu - + JavaScript default - + JavaScript comment JavaScript komentář - + JavaScript line comment JavaScript jednořádkový komentář - + JavaDoc style JavaScript comment JavaDoc styl JavaScript komentáře - + JavaScript number JavaScript číslo - + JavaScript word JavaSript slovo - + JavaScript keyword JavaSript klíčové slovo - + JavaScript double-quoted string JavaSript string ve dvojitých uvozovkách - + JavaScript single-quoted string JavaSript string v jednoduchých uvozovkách - + JavaScript symbol - + JavaScript unclosed string JavaSript neuzavřený string - + JavaScript regular expression JavaSript regulární výraz - + Start of an ASP JavaScript fragment Začátek ASP JavaScript kódu - + ASP JavaScript default - + ASP JavaScript comment ASP JavaScript komentář - + ASP JavaScript line comment ASP JavaScript jednořádkový komenář - + JavaDoc style ASP JavaScript comment JavaDoc styl ASP JavaScript komentář - + ASP JavaScript number ASP JavaScript číslo - + ASP JavaScript word ASP JavaScript slovo - + ASP JavaScript keyword ASP JavaScript klíčové slovo - + ASP JavaScript double-quoted string ASP JavaScript string ve dvojitých uvozovkách - + ASP JavaScript single-quoted string ASP JavaScript v jednoduchých uvozovkách - + ASP JavaScript symbol - + ASP JavaScript unclosed string ASP JavaScript neuzavřený string - + ASP JavaScript regular expression ASP JavaScript regulární výraz - + Start of a VBScript fragment Začátek VBScript kódu - + VBScript default - + VBScript comment VBScript komentář - + VBScript number VBScript číslo - + VBScript keyword VBScript klíčové slovo - + VBScript string - + VBScript identifier VBScript identifikátor - + VBScript unclosed string VBScript neuzavřený string - + Start of an ASP VBScript fragment Začátek ASP VBScript kódu - + ASP VBScript default - + ASP VBScript comment ASP VBScript komentář - + ASP VBScript number ASP VBScript číslo - + ASP VBScript keyword ASP VBScript klíčové slovo - + ASP VBScript string - + ASP VBScript identifier ASP VBScript identifikátor - + ASP VBScript unclosed string ASP VBScript neuzavřený string - + Start of a Python fragment Začátek Python kódu - + Python default - + Python comment Python komentář - + Python number Python číslo - + Python double-quoted string Python string ve dojtých uvozovkách - + Python single-quoted string Python string v jednoduchých uvozovkách - + Python keyword Python klíčové slovo - + Python triple double-quoted string Python string ve třech dvojitých uvozovkách - + Python triple single-quoted string Python ve třech jednoduchých uvozovkách - + Python class name Python jméno třídy - + Python function or method name Python jméno funkce nebo metody - + Python operator Python operátor - + Python identifier Python identifikátor - + Start of an ASP Python fragment Začátek ASP Python kódu - + ASP Python default - + ASP Python comment ASP Python komentář - + ASP Python number ASP Python číslo - + ASP Python double-quoted string ASP Python string ve dvojitých uvozovkách - + ASP Python single-quoted string ASP Python v jednoduchých uvozovkách - + ASP Python keyword ASP Python klíčové slovo - + ASP Python triple double-quoted string ASP Python ve třech dvojitých uvozovkách - + ASP Python triple single-quoted string ASP Python ve třech jednoduchých uvozovkách - + ASP Python class name ASP Python jméno třídy - + ASP Python function or method name ASP Python jméno funkce nebo metody - + ASP Python operator ASP Python operátor - + ASP Python identifier ASP Python identifikátor - + PHP default - + PHP double-quoted string PHP string ve dvojitých uvozovkách - + PHP single-quoted string PHP v jednoduchých uvozovkách - + PHP keyword PHP klíčové slovo - + PHP number PHP číslo - + PHP variable PHP proměnná - + PHP comment PHP komentář - + PHP line comment PHP jednořádkový komentář - + PHP double-quoted variable PHP proměnná ve dvojitých uvozovkách - + PHP operator PHP operátor @@ -2089,7 +2137,7 @@ QsciLexerIDL - + UUID @@ -2097,72 +2145,72 @@ QsciLexerJSON - + Default Default - + Number Číslo - + String - + Unclosed string Neuzavřený string - + Property - + Escape sequence - + Line comment Jednořádkový komentář - + Block comment - + Operator Operátor - + IRI - + JSON-LD compact IRI - + JSON keyword - + JSON-LD keyword - + Parsing error @@ -2170,7 +2218,7 @@ QsciLexerJavaScript - + Regular expression Regulární výraz @@ -2178,102 +2226,102 @@ QsciLexerLua - + Default - + Comment Komentář - + Line comment Jednořádkový komentář - + Number Číslo - + Keyword Klíčové slovo - + String - + Character Znak - + Literal string - + Preprocessor - + Operator Operátor - + Identifier Identifikátor - + Unclosed string Neuzavřený string - + Basic functions Základní funkce - + String, table and maths functions String, tabulka a matematické funkce - + Coroutines, i/o and system facilities - + User defined 1 Definováno uživatelem 1 - + User defined 2 Definováno uživatelem 2 - + User defined 3 Definováno uživatelem 3 - + User defined 4 Definováno uživatelem 4 - + Label Nadpis @@ -2281,37 +2329,37 @@ QsciLexerMakefile - + Default - + Comment Komentář - + Preprocessor - + Variable Proměnná - + Operator Operátor - + Target Cíl - + Error Chyba @@ -2319,112 +2367,112 @@ QsciLexerMarkdown - + Default Default - + Special - + Strong emphasis using double asterisks - + Strong emphasis using double underscores - + Emphasis using single asterisks - + Emphasis using single underscores - + Level 1 header - + Level 2 header - + Level 3 header - + Level 4 header - + Level 5 header - + Level 6 header - + Pre-char - + Unordered list item - + Ordered list item - + Block quote - + Strike out - + Horizontal rule - + Link - + Code between backticks - + Code between double backticks - + Code block @@ -2432,47 +2480,47 @@ QsciLexerMatlab - + Default Default - + Comment Komentář - + Command Příkaz - + Number Číslo - + Keyword Klíčové slovo - + Single-quoted string String v jednoduchých uvozovkách - + Operator Operátor - + Identifier Identifikátor - + Double-quoted string String ve dvojitých uvozovkách @@ -2480,77 +2528,77 @@ QsciLexerPO - + Default Default - + Comment Komentář - + Message identifier - + Message identifier text - + Message string - + Message string text - + Message context - + Message context text - + Fuzzy flag - + Programmer comment - + Reference - + Flags - + Message identifier text end-of-line - + Message string text end-of-line - + Message context text end-of-line @@ -2558,87 +2606,87 @@ QsciLexerPOV - + Default - + Comment Komentář - + Comment line Jednořádkový komentář - + Number Číslo - + Operator Operátor - + Identifier Identifikátor - + String - + Unclosed string Neuzavřený string - + Directive Direktiva - + Bad directive - + Objects, CSG and appearance - + Types, modifiers and items - + Predefined identifiers - + Predefined functions - + User defined 1 - + User defined 2 - + User defined 3 @@ -2646,77 +2694,77 @@ QsciLexerPascal - + Default Default - + Line comment Jednořádkový komentář - + Number Číslo - + Keyword Klíčové slovo - + Single-quoted string String v jednoduchých uvozovkách - + Operator Operátor - + Identifier Identifikátor - + '{ ... }' style comment - + '(* ... *)' style comment - + '{$ ... }' style pre-processor block - + '(*$ ... *)' style pre-processor block - + Hexadecimal number - + Unclosed string Neuzavřený string - + Character Znak - + Inline asm @@ -2724,207 +2772,207 @@ QsciLexerPerl - + Default - + Error Chyba - + Comment Komentář - + POD - + Number Číslo - + Keyword Klíčové slovo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + Operator Operátor - + Identifier Identifikátor - + Scalar Skalár - + Array Pole - + Hash - + Symbol table - + Regular expression Regulární výraz - + Substitution - + Backticks - + Data section - + Here document delimiter Zde je oddělovač dokumentu - + Single-quoted here document Zde je dokument v jednoduchých uvozovkách - + Double-quoted here document Zde je dokument ve dvojitých uvozovkách - + Backtick here document - + Quoted string (q) - + Quoted string (qq) - + Quoted string (qx) - + Quoted string (qr) - + Quoted string (qw) - + POD verbatim - + Subroutine prototype - + Format identifier - + Format body - + Double-quoted string (interpolated variable) - + Translation - + Regular expression (interpolated variable) - + Substitution (interpolated variable) - + Backticks (interpolated variable) - + Double-quoted here document (interpolated variable) - + Backtick here document (interpolated variable) - + Quoted string (qq, interpolated variable) - + Quoted string (qx, interpolated variable) - + Quoted string (qr, interpolated variable) @@ -2932,82 +2980,82 @@ QsciLexerPostScript - + Default Default - + Comment Komentář - + DSC comment - + DSC comment value - + Number Číslo - + Name - + Keyword Klíčové slovo - + Literal - + Immediately evaluated literal - + Array parenthesis - + Dictionary parenthesis - + Procedure parenthesis - + Text - + Hexadecimal string - + Base85 string - + Bad string character @@ -3015,32 +3063,32 @@ QsciLexerProperties - + Default - + Comment - + Section - + Assignment - + Default value - + Key @@ -3048,82 +3096,82 @@ QsciLexerPython - + Default - + Comment Komentář - + Number Číslo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + Keyword Klíčové slovo - + Triple single-quoted string String ve třech jednoduchých uvozovkách - + Triple double-quoted string String ve třech dvojitých uvozovkách - + Class name Jméno třídy - + Function or method name Jméno funkce nebo metody - + Operator Operátor - + Identifier Identifikátor - + Comment block Blok komentáře - + Unclosed string Neuzavřený string - + Highlighted identifier Zvýrazněný identifikátor - + Decorator Dekorátor @@ -3131,157 +3179,157 @@ QsciLexerRuby - + Default - + Comment Komentář - + Number Číslo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + Keyword Klíčové slovo - + Class name Jméno třídy - + Function or method name Jméno funkce nebo metody - + Operator Operátor - + Identifier Identifikátor - + Error Chyba - + POD POD - + Regular expression Regulární výraz - + Global - + Symbol - + Module name Jméno modulu - + Instance variable Proměnná instance - + Class variable Proměnná třídy - + Backticks - + Data section Datová sekce - + Here document delimiter Zde je oddělovač dokumentu - + Here document Zde je dokument - + %q string - + %Q string - + %x string - + %r string - + %w string - + Demoted keyword - + stdin - + stdout - + stderr @@ -3289,112 +3337,112 @@ QsciLexerSQL - + Default - + Comment Komentář - + Number Číslo - + Keyword Klíčové slovo - + Single-quoted string String v jednoduchých uvozovkách - + Operator Operátor - + Identifier Identifikátor - + Comment line Jednořádkový komentář - + JavaDoc style comment JavaDoc styl komentář - + Double-quoted string String ve dvojitých uvozovkách - + SQL*Plus keyword SQL*Plus klíčové slovo - + SQL*Plus prompt - + SQL*Plus comment SQL*Plus komentář - + # comment line # jednořádkový komentář - + JavaDoc keyword JavaDoc klíčové slovo - + JavaDoc keyword error JavaDoc klíčové slovo chyby - + User defined 1 Definováno uživatelem 1 - + User defined 2 Definováno uživatelem 2 - + User defined 3 Definováno uživatelem 3 - + User defined 4 Definováno uživatelem 4 - + Quoted identifier - + Quoted operator @@ -3402,47 +3450,47 @@ QsciLexerSpice - + Default Default - + Identifier Identifikátor - + Command Příkaz - + Function - + Parameter - + Number Číslo - + Delimiter - + Value Hodnota - + Comment Komentář @@ -3450,112 +3498,112 @@ QsciLexerTCL - + Default Default - + Comment Komentář - + Comment line Jednořádkový komentář - + Number Číslo - + Quoted keyword - + Quoted string - + Operator Operátor - + Identifier Identifikátor - + Substitution - + Brace substitution - + Modifier - + Expand keyword - + TCL keyword - + Tk keyword - + iTCL keyword - + Tk command - + User defined 1 Definováno uživatelem 1 - + User defined 2 Definováno uživatelem 2 - + User defined 3 Definováno uživatelem 3 - + User defined 4 Definováno uživatelem 4 - + Comment box - + Comment block Blok komentáře @@ -3563,32 +3611,32 @@ QsciLexerTeX - + Default - + Special - + Group Skupina - + Symbol - + Command Příkaz - + Text @@ -3596,82 +3644,82 @@ QsciLexerVHDL - + Default Default - + Comment Komentář - + Comment line Jednořádkový komentář - + Number Číslo - + String - + Operator Operátor - + Identifier Identifikátor - + Unclosed string Neuzavřený string - + Keyword Klíčové slovo - + Standard operator - + Attribute Atribut - + Standard function - + Standard package - + Standard type - + User defined - + Comment block Blok komentáře @@ -3679,122 +3727,172 @@ QsciLexerVerilog - + Default Default - + + Inactive default + + + + Comment Komentář - + Line comment Jednořádkový komentář - + + Inactive line comment + + + + Bang comment - + + Inactive bang comment + + + + Number Číslo - + + Inactive number + + + + Primary keywords and identifiers - + + Inactive primary keywords and identifiers + + + + String - + + Inactive string + + + + Secondary keywords and identifiers Sekundární klíčová slova a identifikátory - + System task - + + Inactive system task + + + + Preprocessor block - + Operator Operátor - + + Inactive operator + + + + Identifier Identifikátor - + Unclosed string Neuzavřený string - + + Inactive unclosed string + + + + User defined tasks and identifiers - + + Inactive user defined tasks and identifiers + + + + Keyword comment - + Inactive keyword comment - + Input port declaration - + Inactive input port declaration - + Output port declaration - + Inactive output port declaration - + Input/output port declaration - + Inactive input/output port declaration - + Port connection - + Inactive port connection @@ -3802,52 +3900,52 @@ QsciLexerYAML - + Default Default - + Comment Komentář - + Identifier Identifikátor - + Keyword Klíčové slovo - + Number Číslo - + Reference - + Document delimiter - + Text block marker - + Syntax error marker - + Operator Operátor @@ -3855,37 +3953,37 @@ QsciScintilla - + &Undo - + &Redo - + Cu&t - + &Copy - + &Paste - + Delete - + Select All diff --git a/libs/qscintilla/Qt4Qt5/qscintilla_de.qm b/libs/qscintilla/Qt4Qt5/qscintilla_de.qm index fee06eae9..d3e967111 100644 Binary files a/libs/qscintilla/Qt4Qt5/qscintilla_de.qm and b/libs/qscintilla/Qt4Qt5/qscintilla_de.qm differ diff --git a/libs/qscintilla/Qt4Qt5/qscintilla_de.ts b/libs/qscintilla/Qt4Qt5/qscintilla_de.ts index b9bf50cea..d601c1e9e 100644 --- a/libs/qscintilla/Qt4Qt5/qscintilla_de.ts +++ b/libs/qscintilla/Qt4Qt5/qscintilla_de.ts @@ -4,493 +4,493 @@ QsciCommand - + Move left one character Ein Zeichen nach links - + Move right one character Ein Zeichen nach rechts - + Move up one line Eine Zeile nach oben - + Move down one line Eine Zeile nach unten - + Move left one word part Ein Wortteil nach links - + Move right one word part Ein Wortteil nach rechts - + Move left one word Ein Wort nach links - + Move right one word Ein Wort nach rechts - + Scroll view down one line Eine Zeile nach unten rollen - + Scroll view up one line Eine Zeile nach oben rollen - + Move up one page Eine Seite hoch - + Move down one page Eine Seite nach unten - + Indent one level Eine Ebene einrücken - + Extend selection left one character Auswahl um ein Zeichen nach links erweitern - + Extend selection right one character Auswahl um ein Zeichen nach rechts erweitern - + Extend selection up one line Auswahl um eine Zeile nach oben erweitern - + Extend selection down one line Auswahl um eine Zeile nach unten erweitern - + Extend selection left one word part Auswahl um einen Wortteil nach links erweitern - + Extend selection right one word part Auswahl um einen Wortteil nach rechts erweitern - + Extend selection left one word Auswahl um ein Wort nach links erweitern - + Extend selection right one word Auswahl um ein Wort nach rechts erweitern - + Extend selection up one page Auswahl um eine Seite nach oben erweitern - + Extend selection down one page Auswahl um eine Seite nach unten erweitern - + Delete previous character Zeichen links löschen - + Delete current character Aktuelles Zeichen löschen - + Delete word to left Wort links löschen - + Delete word to right Wort rechts löschen - + Delete line to left Zeile links löschen - + Delete line to right Zeile rechts löschen - + Delete current line Aktuelle Zeile löschen - + Cut current line Aktuelle Zeile ausschneiden - + Cut selection Auswahl ausschneiden - + Copy selection Auswahl kopieren - + Paste Einfügen - + Redo last command Letzten Befehl wiederholen - + Cancel Abbrechen - + Toggle insert/overtype Einfügen/Überschreiben umschalten - + Scroll to start of document Zum Dokumentenanfang rollen - + Scroll to end of document Zum Dokumentenende rollen - + Scroll vertically to centre current line Vertical rollen, um aktuelle Zeile zu zentrieren - + Move to end of previous word Zum Ende des vorigen Wortes springen - + Extend selection to end of previous word Auswahl bis zum Ende des vorigen Wortes erweitern - + Move to end of next word Zum Ende des nächsten Wortes springen - + Extend selection to end of next word Auswahl bis zum Ende des nächsten Wortes erweitern - + Move to start of document line Zum Beginn der Dokumentenzeile springen - + Extend selection to start of document line Auswahl zum Beginn der Dokumentenzeile erweitern - + Extend rectangular selection to start of document line Rechteckige Auswahl zum Beginn der Dokumentenzeile erweitern - + Move to start of display line Zum Beginn der Anzeigezeile springen - + Extend selection to start of display line Auswahl zum Beginn der Anzeigezeile erweitern - + Move to start of display or document line Zum Beginn der Dokumenten- oder Anzeigezeile springen - + Extend selection to start of display or document line Rechteckige Auswahl zum Beginn der Dokumenten- oder Anzeigezeile erweitern - + Move to first visible character in document line Zum ersten sichtbaren Zeichen der Dokumentzeile springen - + Extend selection to first visible character in document line Auswahl zum ersten sichtbaren Zeichen der Dokumentzeile erweitern - + Extend rectangular selection to first visible character in document line Rechteckige Auswahl zum ersten sichtbaren Zeichen der Dokumentzeile erweitern - + Move to first visible character of display in document line Zum ersten angezeigten Zeichen der Dokumentzeile springen - + Extend selection to first visible character in display or document line Auswahl zum ersten sichtbaren Zeichen der Dokument- oder Anzeigezeile erweitern - + Move to end of document line Zum Ende der Dokumentzeile springen - + Extend selection to end of document line Auswahl zum Ende der Dokumentenzeile erweitern - + Extend rectangular selection to end of document line Rechteckige Auswahl zum Ende der Dokumentenzeile erweitern - + Move to end of display line Zum Ende der Anzeigezeile springen - + Extend selection to end of display line Auswahl zum Ende der Anzeigezeile erweitern - + Move to end of display or document line Zum Ende der Dokumenten- oder Anzeigezeile springen - + Extend selection to end of display or document line Rechteckige Auswahl zum Ende der Dokumenten- oder Anzeigezeile erweitern - + Move to start of document Zum Dokumentenanfang springen - + Extend selection to start of document Auswahl zum Dokumentenanfang erweitern - + Move to end of document Zum Dokumentenende springen - + Extend selection to end of document Auswahl zum Dokumentenende erweitern - + Stuttered move up one page "Stotternd" um eine Seite nach oben - + Stuttered extend selection up one page Auswahl "stotternd" um eine Seite nach oben erweitern - + Stuttered move down one page "Stotternd" um eine Seite nach unten - + Stuttered extend selection down one page Auswahl "stotternd" um eine Seite nach unten erweitern - + Delete previous character if not at start of line Zeichen links löschen, wenn nicht am Zeilenanfang - + Delete right to end of next word Rechts bis zum Ende des nächsten Wortes löschen - + Transpose current and previous lines Aktuelle und vorherige Zeile tauschen - + Duplicate the current line Aktuelle Zeile duplizieren - + Select all Select document Alle auswählen - + Move selected lines up one line Ausgewählte Zeilen um eine Zeile nach oben - + Move selected lines down one line Ausgewählte Zeilen um eine Zeile nach unten - + Convert selection to lower case Auswahl in Kleinbuchstaben umwandeln - + Convert selection to upper case Auswahl in Großbuchstaben umwandeln - + Insert newline Neue Zeile einfügen - + De-indent one level Eine Ebene ausrücken - + Undo last command Letzten Befehl rückgängig machen - + Zoom in Vergrößern - + Zoom out Verkleinern - + Move up one paragraph Einen Absatz nach oben - + Move down one paragraph Einen Absatz nach unten - + Extend selection up one paragraph Auswahl um einen Absatz nach oben erweitern - + Extend selection down one paragraph Auswahl um einen Absatz nach unten erweitern - + Copy current line Aktuelle Zeile kopieren - + Extend rectangular selection down one line Rechteckige Auswahl um eine Zeile nach unten erweitern - + Extend rectangular selection up one line Rechteckige Auswahl um eine Zeile nach oben erweitern - + Extend rectangular selection left one character Rechteckige Auswahl um ein Zeichen nach links erweitern - + Extend rectangular selection right one character Rechteckige Auswahl um ein Zeichen nach rechts erweitern - + Extend rectangular selection up one page Rechteckige Auswahl um eine Seite nach oben erweitern - + Extend rectangular selection down one page Rechteckige Auswahl um eine Seite nach unten erweitern - + Formfeed Seitenumbruch - + Duplicate selection Auswahl duplizieren @@ -498,77 +498,77 @@ QsciLexerAVS - + Default Standard - + Block comment Blockkommentar - + Nested block comment Verschachtelter Blockkommentar - + Line comment Zeilenkommentar - + Number Zahl - + Operator Operator - + Identifier Bezeichner - + Double-quoted string Zeichenkette in Anführungszeichen - + Triple double-quoted string Zeichenkette in dreifachen Anführungszeichen - + Keyword Schlüsselwort - + Filter Filter - + Plugin Plugin - + Function Funktion - + Clip property Clip Eigenschaft - + User defined Nutzer definiert @@ -576,72 +576,72 @@ QsciLexerBash - + Default Standard - + Error Fehler - + Comment Kommentar - + Number Zahl - + Keyword Schlüsselwort - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + Operator Operator - + Identifier Bezeichner - + Scalar Skalar - + Parameter expansion Parametererweiterung - + Backticks Backticks - + Here document delimiter Here Dokument-Begrenzer - + Single-quoted here document Here Dokument in Hochkommata @@ -649,42 +649,42 @@ QsciLexerBatch - + Default Standard - + Comment Kommentar - + Keyword Schlüsselwort - + Label Marke - + Variable Variable - + Operator Operator - + Hide command character "Befehl verbergen" Zeichen - + External command Externer Befehl @@ -692,77 +692,77 @@ QsciLexerCMake - + Default Standard - + Comment Kommentar - + String Zeichenkette - + Left quoted string Links quotierte Zeichenkette - + Right quoted string Rechts quotierte Zeichenkette - + Function Funktion - + Variable Variable - + Label Marke - + User defined Nutzer definiert - + WHILE block WHILE Block - + FOREACH block FOREACH Block - + IF block IF Block - + MACRO block MACRO Block - + Variable within a string Variable in einer Zeichenkette - + Number Zahl @@ -770,282 +770,282 @@ QsciLexerCPP - + Number Zahl - + Keyword Schlüsselwort - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + IDL UUID IDL UUID - + Pre-processor block Präprozessorblock - + Operator Operator - + Identifier Bezeichner - + Unclosed string Unbeendete Zeichenkette - + Default Standard - + Inactive default Inaktiver Standard - + C comment C Kommentar - + Inactive C comment Inaktiver C Kommentar - + C++ comment C++ Kommentar - + Inactive C++ comment Inaktiver C++ Kommentar - + JavaDoc style C comment JavaDoc C Kommentar - + Inactive JavaDoc style C comment Inaktiver JavaDoc C Kommentar - + Inactive number Inaktive Zahl - + Inactive keyword Inaktives Schlüsselwort - + Inactive double-quoted string Inaktive Zeichenkette in Anführungszeichen - + Inactive single-quoted string Inaktive Zeichenkette in Hochkommata - + Inactive IDL UUID Inaktive IDL UUID - + Inactive pre-processor block Inaktiver Präprozessorblock - + Inactive operator Inaktiver Operator - + Inactive identifier Inaktiver Bezeichner - + Inactive unclosed string Inaktive unbeendete Zeichenkette - + C# verbatim string Uninterpretierte C# Zeichenkette - + Inactive C# verbatim string Inaktive, Uninterpretierte C# Zeichenkette - + JavaScript regular expression JavaScript Regulärer Ausdruck - + Inactive JavaScript regular expression JavaScript Inaktiver Regulärer Ausdruck - + JavaDoc style C++ comment JavaDoc C++ Kommentar - + Inactive JavaDoc style C++ comment Inaktiver JavaDoc C++ Kommentar - + Inactive secondary keywords and identifiers Inaktive sekundäre Schlusselwörter und Bezeichner - + JavaDoc keyword JavaDoc Schlüsselwort - + Inactive JavaDoc keyword Inaktives JavaDoc Schlüsselwort - + JavaDoc keyword error JavaDoc Schlüsselwortfehler - + Inactive global classes and typedefs Inaktive globale Klassen und Typdefinitionen - + C++ raw string Rohe C++ Zeichenkette - + Inactive C++ raw string Inaktive rohe C++ Zeichenkette - + Vala triple-quoted verbatim string Vala Zeichenkette in dreifachen Hochkommata - + Inactive Vala triple-quoted verbatim string Inaktive Vala Zeichenkette in dreifachen Hochkommata - + Pike hash-quoted string Pike Zeichenkette in '#-Anführungszeichen' - + Inactive Pike hash-quoted string Inaktive Pike Zeichenkette in '#-Anführungszeichen' - + Pre-processor C comment C Präprozessorkommentar - + Inactive pre-processor C comment Inaktiver C Präprozessorkommentar - + JavaDoc style pre-processor comment JavaDoc Präprozessorkommentar - + Inactive JavaDoc style pre-processor comment Inaktiver JavaDoc Präprozessorkommentar - + User-defined literal Nutzer definiertes Literal - + Inactive user-defined literal Inaktives Nutzer definiertes Literal - + Task marker Aufgabenmarkierung - + Inactive task marker Inaktive Aufgabenmarkierung - + Escape sequence Escape-Sequenz - + Inactive escape sequence Inaktive Escape-Sequenz - + Secondary keywords and identifiers Sekundäre Schlusselwörter und Bezeichner - + Inactive JavaDoc keyword error Inaktiver JavaDoc Schlüsselwortfehler - + Global classes and typedefs Globale Klassen und Typdefinitionen @@ -1053,117 +1053,117 @@ QsciLexerCSS - + Default Standard - + Tag Tag - + Class selector Klassenselektor - + Pseudo-class Pseudoklasse - + Unknown pseudo-class Unbekannte Pseudoklasse - + Operator Operator - + CSS1 property CSS1 Eigenschaft - + Unknown property Unbekannte Eigenschaft - + Value Wert - + ID selector ID-Selektor - + Important Wichtig - + @-rule @-Regel - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + CSS2 property CSS2 Eigenschaft - + Attribute Attribut - + CSS3 property CSS3 Eigenschaft - + Pseudo-element Pseudoelement - + Extended CSS property Erweiterte CSS Eigenschaft - + Extended pseudo-class Erweiterte Pseudoklasse - + Extended pseudo-element Erweitertes Pseudoelement - + Media rule Medienregel - + Variable Variable @@ -1171,7 +1171,7 @@ QsciLexerCSharp - + Verbatim string Uninterpretierte Zeichenkette @@ -1179,122 +1179,122 @@ QsciLexerCoffeeScript - + Default Standard - + C-style comment C Kommentar - + C++-style comment C++ Kommentar - + JavaDoc C-style comment JavaDoc C Kommentar - + Number Zahl - + Keyword Schlüsselwort - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + IDL UUID IDL UUID - + Pre-processor block Präprozessorblock - + Operator Operator - + Identifier Bezeichner - + Unclosed string Unbeendete Zeichenkette - + C# verbatim string Uninterpretierte C# Zeichenkette - + Regular expression Regulärer Ausdruck - + JavaDoc C++-style comment JavaDoc C++ Kommentar - + Secondary keywords and identifiers Sekundäre Schlusselwörter und Bezeichner - + JavaDoc keyword JavaDoc Schlüsselwort - + JavaDoc keyword error JavaDoc Schlüsselwortfehler - + Global classes Globale Klassen - + Block comment Blockkommentar - + Block regular expression Regulärer Ausdrucksblock - + Block regular expression comment Regulärer Ausdrucksblockkommentar - + Instance property Instanz-Eigenschaft @@ -1302,117 +1302,117 @@ QsciLexerD - + Default Standard - + Block comment Blockkommentar - + Line comment Zeilenkommentar - + DDoc style block comment DDoc Blockkommentar - + Nesting comment schachtelbarer Kommentar - + Number Zahl - + Keyword Schlüsselwort - + Secondary keyword Sekundäres Schlüsselwort - + Documentation keyword Dokumentationsschlüsselwort - + Type definition Typdefinition - + String Zeichenkette - + Unclosed string Unbeendete Zeichenkette - + Character Zeichen - + Operator Operator - + Identifier Bezeichner - + DDoc style line comment DDoc Zeilenkommentar - + DDoc keyword DDoc Schlüsselwort - + DDoc keyword error DDoc Schlüsselwortfehler - + Backquoted string Zeichenkette in Rückwärtsstrichen - + Raw string Rohe Zeichenkette - + User defined 1 Nutzer definiert 1 - + User defined 2 Nutzer definiert 2 - + User defined 3 Nutzer definiert 3 @@ -1420,120 +1420,168 @@ QsciLexerDiff - + Default Standard - + Comment Kommentar - + Command Befehl - + Header Kopfzeilen - + Position Position - + Removed line Entfernte Zeile - + Added line Hinzugefügte Zeile - + Changed line Geänderte Zeile + + QsciLexerEDIFACT + + + Default + Standard + + + + Segment start + Segmentstart + + + + Segment end + Segmentende + + + + Element separator + Elementtrenner + + + + Composite separator + Zusammengesetzter Trenner + + + + Release separator + Freigabetrenner + + + + UNA segment header + UNA Segmentkopf + + + + UNH segment header + UNH Segmentkopf + + + + Badly formed segment + Schlecht geformtes Segment + + QsciLexerFortran77 - + Default Standard - + Comment Kommentar - + Number Zahl - + Single-quoted string Zeichenkette in Hochkommata - + Double-quoted string Zeichenkette in Anführungszeichen - + Unclosed string Unbeendete Zeichenkette - + Operator Operator - + Identifier Bezeichner - + Keyword Schlüsselwort - + Intrinsic function Intrinsic-Funktion - + Extended function Erweiterte Funktion - + Pre-processor block Präprozessorblock - + Dotted operator Dotted Operator - + Label Marke - + Continuation Fortsetzung @@ -1541,547 +1589,547 @@ QsciLexerHTML - + HTML default HTML Standard - + Tag Tag - + Unknown tag Unbekanntes Tag - + Attribute Attribut - + Unknown attribute Unbekanntes Attribut - + HTML number HTML Zahl - + HTML double-quoted string HTML Zeichenkette in Anführungszeichen - + HTML single-quoted string HTML Zeichenkette in Hochkommata - + Other text in a tag Anderer Text in einem Tag - + HTML comment HTML Kommentar - + Entity Entität - + End of a tag Tagende - + Start of an XML fragment Beginn eines XML Fragmentes - + End of an XML fragment Ende eines XML Fragmentes - + Script tag Skript Tag - + Start of an ASP fragment with @ Beginn eines ASP Fragmentes mit @ - + Start of an ASP fragment Beginn eines ASP Fragmentes - + CDATA CDATA - + Start of a PHP fragment Beginn eines PHP Fragmentes - + Unquoted HTML value HTML Wert ohne Anführungszeichen - + ASP X-Code comment ASP X-Code Kommentar - + SGML default SGML Standard - + SGML command SGML Befehl - + First parameter of an SGML command Erster Parameter eines SGML Befehls - + SGML double-quoted string SGML Zeichenkette in Anführungszeichen - + SGML single-quoted string SGML Zeichenkette in Hochkommata - + SGML error SGML Fehler - + SGML special entity SGML Spezielle Entität - + SGML comment SGML Kommentar - + First parameter comment of an SGML command Kommentar des ersten Parameters eines SGML Befehls - + SGML block default SGML Standardblock - + Start of a JavaScript fragment Beginn eines JavaScript Fragmentes - + JavaScript default JavaScript Standard - + JavaScript comment JavaScript Kommentar - + JavaScript line comment JavaScript Zeilenkommentar - + JavaDoc style JavaScript comment JavaDoc JavaScript Kommentar - + JavaScript number JavaScript Zahl - + JavaScript word JavaScript Wort - + JavaScript keyword JavaScript Schlüsselwort - + JavaScript double-quoted string JavaScript Zeichenkette in Anführungszeichen - + JavaScript single-quoted string JavaScript Zeichenkette in Hochkommata - + JavaScript symbol JavaScript Symbol - + JavaScript unclosed string JavaScript Unbeendete Zeichenkette - + JavaScript regular expression JavaScript Regulärer Ausdruck - + Start of an ASP JavaScript fragment Beginn eines ASP JavaScript Fragmentes - + ASP JavaScript default ASP JavaScript Standard - + ASP JavaScript comment ASP JavaScript Kommentar - + ASP JavaScript line comment ASP JavaScript Zeilenkommentar - + JavaDoc style ASP JavaScript comment JavaDoc ASP JavaScript Kommentar - + ASP JavaScript number ASP JavaScript Zahl - + ASP JavaScript word ASP JavaScript Wort - + ASP JavaScript keyword ASP JavaScript Schlüsselwort - + ASP JavaScript double-quoted string ASP JavaScript Zeichenkette in Anführungszeichen - + ASP JavaScript single-quoted string ASP JavaScript Zeichenkette in Hochkommata - + ASP JavaScript symbol ASP JavaScript Symbol - + ASP JavaScript unclosed string ASP JavaScript Unbeendete Zeichenkette - + ASP JavaScript regular expression ASP JavaScript Regulärer Ausdruck - + Start of a VBScript fragment Beginn eines VBScript Fragmentes - + VBScript default VBScript Standard - + VBScript comment VBScript Kommentar - + VBScript number VBScript Zahl - + VBScript keyword VBScript Schlüsselwort - + VBScript string VBScript Zeichenkette - + VBScript identifier VBScript Bezeichner - + VBScript unclosed string VBScript Unbeendete Zeichenkette - + Start of an ASP VBScript fragment Beginn eines ASP VBScript Fragmentes - + ASP VBScript default ASP VBScript Standard - + ASP VBScript comment ASP VBScript Kommentar - + ASP VBScript number ASP VBScript Zahl - + ASP VBScript keyword ASP VBScript Schlüsselwort - + ASP VBScript string ASP VBScript Zeichenkette - + ASP VBScript identifier ASP VBScript Bezeichner - + ASP VBScript unclosed string ASP VBScript Unbeendete Zeichenkette - + Start of a Python fragment Beginn eines Python Fragmentes - + Python default Python Standard - + Python comment Python Kommentar - + Python number Python Zahl - + Python double-quoted string Python Zeichenkette in Anführungszeichen - + Python single-quoted string Python Zeichenkette in Hochkommata - + Python keyword Python Schlüsselwort - + Python triple double-quoted string Python Zeichenkette in dreifachen Anführungszeichen - + Python triple single-quoted string Python Zeichenkette in dreifachen Hochkommata - + Python class name Python Klassenname - + Python function or method name Python Funktions- oder Methodenname - + Python operator Python Operator - + Python identifier Python Bezeichner - + Start of an ASP Python fragment Beginn eines ASP Python Fragmentes - + ASP Python default ASP Python Standard - + ASP Python comment ASP Python Kommentar - + ASP Python number ASP Python Zahl - + ASP Python double-quoted string ASP Python Zeichenkette in Anführungszeichen - + ASP Python single-quoted string ASP Python Zeichenkette in Hochkommata - + ASP Python keyword ASP Python Schlüsselwort - + ASP Python triple double-quoted string ASP Python Zeichenkette in dreifachen Anführungszeichen - + ASP Python triple single-quoted string ASP Python Zeichenkette in dreifachen Hochkommata - + ASP Python class name ASP Python Klassenname - + ASP Python function or method name ASP Python Funktions- oder Methodenname - + ASP Python operator ASP Python Operator - + ASP Python identifier ASP Python Bezeichner - + PHP default PHP Standard - + PHP double-quoted string PHP Zeichenkette in Anführungszeichen - + PHP single-quoted string PHP Zeichenkette in Hochkommata - + PHP keyword PHP Schlüsselwort - + PHP number PHP Zahl - + PHP comment PHP Kommentar - + PHP line comment PHP Zeilenkommentar - + PHP double-quoted variable PHP Variable in Anführungszeichen - + PHP operator PHP Operator - + PHP variable PHP Variable @@ -2089,7 +2137,7 @@ QsciLexerIDL - + UUID UUID @@ -2097,72 +2145,72 @@ QsciLexerJSON - + Default Standard - + Number Zahl - + String Zeichenkette - + Unclosed string Unbeendete Zeichenkette - + Property Eigenschaft - + Escape sequence Escape-Sequenz - + Line comment Zeilenkommentar - + Block comment Blockkommentar - + Operator Operator - + IRI IRI - + JSON-LD compact IRI JSON-LD kompaktes IRI - + JSON keyword JSON Schlüsselwort - + JSON-LD keyword JSON-LD Schlüsselwort - + Parsing error Analysefehler @@ -2170,7 +2218,7 @@ QsciLexerJavaScript - + Regular expression Regulärer Ausdruck @@ -2178,102 +2226,102 @@ QsciLexerLua - + Default Standard - + Comment Kommentar - + Line comment Zeilenkommentar - + Number Zahl - + Keyword Schlüsselwort - + String Zeichenkette - + Character Zeichen - + Literal string Uninterpretierte Zeichenkette - + Preprocessor Präprozessor - + Operator Operator - + Identifier Bezeichner - + Unclosed string Unbeendete Zeichenkette - + Basic functions Basisfunktionen - + String, table and maths functions Zeichenketten-, Tabelle- und mathematische Funktionen - + Coroutines, i/o and system facilities Koroutinen, I/O- und Systemfunktionen - + User defined 1 Nutzer definiert 1 - + User defined 2 Nutzer definiert 2 - + User defined 3 Nutzer definiert 3 - + User defined 4 Nutzer definiert 4 - + Label Marke @@ -2281,37 +2329,37 @@ QsciLexerMakefile - + Default Standard - + Comment Kommentar - + Preprocessor Präprozessor - + Variable Variable - + Operator Operator - + Target Ziel - + Error Fehler @@ -2319,112 +2367,112 @@ QsciLexerMarkdown - + Default Standard - + Special Spezial - + Strong emphasis using double asterisks Fettschrift mit doppelten Sternen - + Strong emphasis using double underscores Fettschrift mit doppelten Unterstrichen - + Emphasis using single asterisks Kursive Schrift mit einfachen Sternen - + Emphasis using single underscores Kursive Schrift mit einfachen Unterstrichen - + Level 1 header Überschrift Ebene 1 - + Level 2 header Überschrift Ebene 2 - + Level 3 header Überschrift Ebene 3 - + Level 4 header Überschrift Ebene 4 - + Level 5 header Überschrift Ebene 5 - + Level 6 header Überschrift Ebene 6 - + Pre-char Einleitungszeichen - + Unordered list item Nicht nummeriertes Listenelement - + Ordered list item Nummeriertes Listenelement - + Block quote Blockzitat - + Strike out Durchgestrichen - + Horizontal rule Horizontale Linie - + Link Hyperlink - + Code between backticks Code zwischen Backticks - + Code between double backticks Code zwischen doppelten Backticks - + Code block Codeblock @@ -2432,47 +2480,47 @@ QsciLexerMatlab - + Default Standard - + Comment Kommentar - + Command Befehl - + Number Zahl - + Keyword Schlüsselwort - + Single-quoted string Zeichenkette in Hochkommata - + Operator Operator - + Identifier Bezeichner - + Double-quoted string Zeichenkette in Anführungszeichen @@ -2480,77 +2528,77 @@ QsciLexerPO - + Default Standard - + Comment Kommentar - + Message identifier Meldungsbezeichner - + Message identifier text Meldungsbezeichnertext - + Message string Meldungszeichenkette - + Message string text Meldungszeichenkettentext - + Message context Meldungskontext - + Message context text Meldungskontexttext - + Fuzzy flag Unschrfmarkierung - + Programmer comment Programmiererkommentar - + Reference Referenz - + Flags Markierung - + Message identifier text end-of-line Meldungsbezeichnertext Zeilenende - + Message string text end-of-line Meldungszeichenkettentext Zeilenende - + Message context text end-of-line Meldungskontexttext Zeilenende @@ -2558,87 +2606,87 @@ QsciLexerPOV - + Default Standard - + Comment Kommentar - + Comment line Kommentarzeile - + Number Zahl - + Operator Operator - + Identifier Bezeichner - + String Zeichenkette - + Unclosed string Unbeendete Zeichenkette - + Directive Direktive - + Bad directive Ungültige Direktive - + Objects, CSG and appearance Objekte, CSG und Erscheinung - + Types, modifiers and items Typen, Modifizierer und Items - + Predefined identifiers Vordefinierter Bezeichner - + Predefined functions Vordefinierte Funktion - + User defined 1 Nutzer definiert 1 - + User defined 2 Nutzer definiert 2 - + User defined 3 Nutzer definiert 3 @@ -2646,77 +2694,77 @@ QsciLexerPascal - + Default Standard - + Line comment Zeilenkommentar - + Number Zahl - + Keyword Schlüsselwort - + Single-quoted string Zeichenkette in Hochkommata - + Operator Operator - + Identifier Bezeichner - + '{ ... }' style comment '{ ... }' Kommentar - + '(* ... *)' style comment '(* ... *)' Kommentar - + '{$ ... }' style pre-processor block '{$ ... }' Präprozessorblock - + '(*$ ... *)' style pre-processor block '(*$ ... *)' Präprozessorblock - + Hexadecimal number Hexadezimale Zahl - + Unclosed string Unbeendete Zeichenkette - + Character Zeichen - + Inline asm Inline Assembler @@ -2724,207 +2772,207 @@ QsciLexerPerl - + Default Standard - + Error Fehler - + Comment Kommentar - + POD POD - + Number Zahl - + Keyword Schlüsselwort - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + Operator Operator - + Identifier Bezeichner - + Scalar Skalar - + Array Feld - + Hash Hash - + Symbol table Symboltabelle - + Regular expression Regulärer Ausdruck - + Substitution Ersetzung - + Backticks Backticks - + Data section Datensektion - + Here document delimiter Here Dokument-Begrenzer - + Single-quoted here document Here Dokument in Hochkommata - + Double-quoted here document Here Dokument in Anführungszeichen - + Backtick here document Here Dokument in Backticks - + Quoted string (q) Zeichenkette (q) - + Quoted string (qq) Zeichenkette (qq) - + Quoted string (qx) Zeichenkette (qx) - + Quoted string (qr) Zeichenkette (qr) - + Quoted string (qw) Zeichenkette (qw) - + POD verbatim POD wörtlich - + Subroutine prototype Subroutinen Prototyp - + Format identifier Formatidentifikator - + Format body Formatzweig - + Double-quoted string (interpolated variable) Zeichenkette in Anführungszeichen (interpolierte Variable) - + Translation Übersetzung - + Regular expression (interpolated variable) Regulärer Ausdruck (interpolierte Variable) - + Substitution (interpolated variable) Ersetzung (interpolierte Variable) - + Backticks (interpolated variable) Backticks (interpolierte Variable) - + Double-quoted here document (interpolated variable) Here Dokument in Anführungszeichen (interpolierte Variable) - + Backtick here document (interpolated variable) Here Dokument in Backticks (interpolierte Variable) - + Quoted string (qq, interpolated variable) Zeichenkette (qq, interpolierte Variable) - + Quoted string (qx, interpolated variable) Zeichenkette (qx, interpolierte Variable) - + Quoted string (qr, interpolated variable) Zeichenkette (qr, interpolierte Variable) @@ -2932,82 +2980,82 @@ QsciLexerPostScript - + Default Standard - + Comment Kommentar - + DSC comment DSC Kommentar - + DSC comment value DSC Kommentarwert - + Number Zahl - + Name Name - + Keyword Schlüsselwort - + Literal Literal - + Immediately evaluated literal Direkt ausgeführtes Literal - + Array parenthesis Feldklammern - + Dictionary parenthesis Dictionary-Klammern - + Procedure parenthesis Prozedurklammern - + Text Text - + Hexadecimal string Hexadezimale Zeichenkette - + Base85 string Base85 Zeichenkette - + Bad string character Ungültiges Zeichen für Zeichenkette @@ -3015,32 +3063,32 @@ QsciLexerProperties - + Default Standard - + Comment Kommentar - + Section Abschnitt - + Assignment Zuweisung - + Default value Standardwert - + Key Schlüssel @@ -3048,82 +3096,82 @@ QsciLexerPython - + Comment Kommentar - + Number Zahl - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + Keyword Schlüsselwort - + Triple single-quoted string Zeichenkette in dreifachen Hochkommata - + Triple double-quoted string Zeichenkette in dreifachen Anführungszeichen - + Class name Klassenname - + Function or method name Funktions- oder Methodenname - + Operator Operator - + Identifier Bezeichner - + Comment block Kommentarblock - + Unclosed string Unbeendete Zeichenkette - + Default Standard - + Highlighted identifier Hervorgehobener Bezeichner - + Decorator Dekorator @@ -3131,157 +3179,157 @@ QsciLexerRuby - + Default Standard - + Comment Kommentar - + Number Zahl - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + Keyword Schlüsselwort - + Class name Klassenname - + Function or method name Funktions- oder Methodenname - + Operator Operator - + Identifier Bezeichner - + Error Fehler - + POD POD - + Regular expression Regulärer Ausdruck - + Global Global - + Symbol Symbol - + Module name Modulname - + Instance variable Instanzvariable - + Class variable Klassenvariable - + Backticks Backticks - + Data section Datensektion - + Here document delimiter Here Dokument-Begrenzer - + Here document Here Dokument - + %q string %q Zeichenkette - + %Q string %Q Zeichenkette - + %x string %x Zeichenkette - + %r string %r Zeichenkette - + %w string %w Zeichenkette - + Demoted keyword zurückgestuftes Schlüsselwort - + stdin Stdin - + stdout Stdout - + stderr Stderr @@ -3289,112 +3337,112 @@ QsciLexerSQL - + Default Standard - + Comment Kommentar - + Number Zahl - + Keyword Schlüsselwort - + Single-quoted string Zeichenkette in Hochkommata - + Operator Operator - + Identifier Bezeichner - + Comment line Kommentarzeile - + JavaDoc style comment JavaDoc Kommentar - + Double-quoted string Zeichenkette in Anführungszeichen - + SQL*Plus keyword SQL*Plus Schlüsselwort - + SQL*Plus prompt SQL*Plus Eingabe - + SQL*Plus comment SQL*Plus Kommentar - + # comment line # Kommentarzeile - + JavaDoc keyword JavaDoc Schlüsselwort - + JavaDoc keyword error JavaDoc Schlüsselwortfehler - + User defined 1 Nutzer definiert 1 - + User defined 2 Nutzer definiert 2 - + User defined 3 Nutzer definiert 3 - + User defined 4 Nutzer definiert 4 - + Quoted identifier Bezeichner in Anführungszeichen - + Quoted operator Operator in Anführungszeichen @@ -3402,47 +3450,47 @@ QsciLexerSpice - + Default Standard - + Identifier Bezeichner - + Command Befehl - + Function Funktion - + Parameter Parameter - + Number Zahl - + Delimiter Delimiter - + Value Wert - + Comment Kommentar @@ -3450,112 +3498,112 @@ QsciLexerTCL - + Default Standard - + Comment Kommentar - + Comment line Kommentarzeile - + Number Zahl - + Quoted keyword angeführtes Schlüsselwort - + Quoted string Zeichenkette - + Operator Operator - + Identifier Bezeichner - + Substitution Ersetzung - + Brace substitution Klammerersetzung - + Modifier Modifizierer - + Expand keyword Erweiterungsschlüsselwort - + TCL keyword TCL Schlüsselwort - + Tk keyword Tk Schlüsselwort - + iTCL keyword iTCL Schlüsselwort - + Tk command Tk Befehl - + User defined 1 Nutzer definiert 1 - + User defined 2 Nutzer definiert 2 - + User defined 3 Nutzer definiert 3 - + User defined 4 Nutzer definiert 4 - + Comment box Kommentarbox - + Comment block Kommentarblock @@ -3563,32 +3611,32 @@ QsciLexerTeX - + Default Standard - + Special Spezial - + Group Gruppe - + Symbol Symbol - + Command Befehl - + Text Text @@ -3596,82 +3644,82 @@ QsciLexerVHDL - + Default Standard - + Comment Kommentar - + Comment line Kommentarzeile - + Number Zahl - + String Zeichenkette - + Operator Operator - + Identifier Bezeichner - + Unclosed string Unbeendete Zeichenkette - + Keyword Schlüsselwort - + Standard operator Standardoperator - + Attribute Attribut - + Standard function Standardfunktion - + Standard package Standardpaket - + Standard type Standardtyp - + User defined Nutzer definiert - + Comment block Kommentarblock @@ -3679,122 +3727,172 @@ QsciLexerVerilog - + Default Standard - + + Inactive default + Inaktiver Standard + + + Comment Kommentar - + Line comment Zeilenkommentar - + + Inactive line comment + Inaktiver Zeilenkommentar + + + Bang comment Bang Kommentar - + + Inactive bang comment + Inaktiver Bang Kommentar + + + Number Zahl - + + Inactive number + Inaktive Zahl + + + Primary keywords and identifiers Primäre Schlusselwörter und Bezeichner - + + Inactive primary keywords and identifiers + Inaktive primäre Schlusselwörter und Bezeichner + + + String Zeichenkette - + + Inactive string + Inaktive Zeichenkette + + + Secondary keywords and identifiers Sekundäre Schlusselwörter und Bezeichner - + System task Systemtask - + + Inactive system task + Inaktiver Systemtask + + + Preprocessor block Präprozessorblock - + Operator Operator - + + Inactive operator + Inaktiver Operator + + + Identifier Bezeichner - + Unclosed string Unbeendete Zeichenkette - + + Inactive unclosed string + Inaktive unbeendete Zeichenkette + + + User defined tasks and identifiers Nutzerdefinierte Tasks und Bezeichner - + + Inactive user defined tasks and identifiers + Inaktive nutzerdefinierte Tasks und Bezeichner + + + Keyword comment Schlüsselwortkommentar - + Inactive keyword comment Inaktiver Schlüsselwortkommentar - + Input port declaration Eingabeportdefinition - + Inactive input port declaration Inaktive Eingabeportdefinition - + Output port declaration Ausgabeportdefinition - + Inactive output port declaration Inaktive Ausgabeportdefinition - + Input/output port declaration Ein-/Ausgabeportdefinition - + Inactive input/output port declaration Inaktive Ein-/Ausgabeportdefinition - + Port connection Portverbindung - + Inactive port connection Inaktive Portverbindung @@ -3802,52 +3900,52 @@ QsciLexerYAML - + Default Standard - + Comment Kommentar - + Identifier Bezeichner - + Keyword Schlüsselwort - + Number Zahl - + Reference Referenz - + Document delimiter Dokumentbegrenzer - + Text block marker Textblock Markierung - + Syntax error marker Syntaxfehler Markierung - + Operator Operator @@ -3855,37 +3953,37 @@ QsciScintilla - + &Undo &Rückgängig - + &Redo Wieder&herstellen - + Cu&t &Ausschneiden - + &Copy &Kopieren - + &Paste Ein&fügen - + Delete Löschen - + Select All Alle auswählen diff --git a/libs/qscintilla/Qt4Qt5/qscintilla_es.qm b/libs/qscintilla/Qt4Qt5/qscintilla_es.qm index f9633c601..0313a27b8 100644 Binary files a/libs/qscintilla/Qt4Qt5/qscintilla_es.qm and b/libs/qscintilla/Qt4Qt5/qscintilla_es.qm differ diff --git a/libs/qscintilla/Qt4Qt5/qscintilla_es.ts b/libs/qscintilla/Qt4Qt5/qscintilla_es.ts index 1a9697441..de2b4a5ce 100644 --- a/libs/qscintilla/Qt4Qt5/qscintilla_es.ts +++ b/libs/qscintilla/Qt4Qt5/qscintilla_es.ts @@ -4,493 +4,493 @@ QsciCommand - + Move down one line Desplazar una línea hacia abajo - + Extend selection down one line Extender la selección una línea hacia abajo - + Scroll view down one line Desplazar la vista una línea hacia abajo - + Extend rectangular selection down one line Extender la selección rectangular una línea hacia abajo - + Move up one line Desplazar una línea hacia arriba - + Extend selection up one line Extender la selección una línea hacia arriba - + Scroll view up one line Desplazar la vista una línea hacia arriba - + Extend rectangular selection up one line Extender la selección rectangular una línea hacia arriba - + Move up one paragraph Desplazar un párrafo hacia arriba - + Extend selection up one paragraph Extender la selección un párrafo hacia arriba - + Move down one paragraph Desplazar un párrafo hacia abajo - + Scroll to start of document Desplazar al principio del documento - + Scroll to end of document Desplazar al final del documento - + Scroll vertically to centre current line Desplazar verticalmente al centro de la línea actual - + Extend selection down one paragraph Extender la selección un párrafo hacia abajo - + Move left one character Mover un carácter hacia la izquierda - + Extend selection left one character Extender la selección un carácter hacia la izquierda - + Move left one word Mover una palabra hacia la izquierda - + Extend selection left one word Extender la selección una palabra a la izquierda - + Extend rectangular selection left one character Extender la selección rectangular un carácter hacia la izquierda - + Move right one character Mover un carácter hacia la derecha - + Extend selection right one character Extender la selección un carácter hacia la derecha - + Move right one word Mover una palabra hacia la derecha - + Extend selection right one word Extender la selección una palabra a la derecha - + Extend rectangular selection right one character Extender la selección rectangular un carácter hacia la derecha - + Move to end of previous word Mover al final de palabra anterior - + Extend selection to end of previous word Extender selección al final de la palabra anterior - + Move to end of next word Mover al final de la palabra siguiente - + Extend selection to end of next word Extender la selección hasta el final de la palabra siguiente - + Move left one word part Mover parte de una palabra hacia la izquierda - + Extend selection left one word part Extender la selección parte de una palabra a la izquierda - + Move right one word part Mover parte de una palabra hacia la derecha - + Extend selection right one word part Extender la selección parte de una palabra a la derecha - + Move up one page Mover hacia arriba una página - + Extend selection up one page Extender la selección hacia arriba una página - + Extend rectangular selection up one page Extender la selección rectangular hacia arriba una página - + Move down one page Mover hacia abajo una página - + Extend selection down one page Extender la selección hacia abajo una página - + Extend rectangular selection down one page Extender la selección rectangular una página hacia abajo - + Delete current character Borrar el carácter actual - + Cut selection Cortar selección - + Delete word to right Borrar palabra hacia la derecha - + Move to start of document line Mover al principio de la línea del documento - + Extend selection to start of document line Extender selección al principio de la línea del documento - + Extend rectangular selection to start of document line Extender selección rectangular al principio de la línea del documento - + Move to start of display line Mover al principio de la línea visualizada - + Extend selection to start of display line Extender selección al principio de la línea visualizada - + Move to start of display or document line Mover al principio de la línea visualizada o del documento - + Extend selection to start of display or document line Extender selección al principio de la línea visualizada o del documento - + Move to first visible character in document line Mover al primer carácter visible en la línea del documento - + Extend selection to first visible character in document line Extender selección al primer carácter visible en la línea del documento - + Extend rectangular selection to first visible character in document line Extender selección rectangular al primer carácter visible en la línea del documento - + Move to first visible character of display in document line Extender selección al primer carácter visualizado en la línea del documento - + Extend selection to first visible character in display or document line Extender selección al primer carácter de línea visualizada o del documento - + Move to end of document line Mover al final de la línea del documento - + Extend selection to end of document line Extender selección al final de la línea del documento - + Extend rectangular selection to end of document line Extender selección rectangular al final de la línea del documento - + Move to end of display line Mover al final de la línea visualizada - + Extend selection to end of display line Extender selección al final de la línea visualizada - + Move to end of display or document line Mover al final de la línea visualizada o del documento - + Extend selection to end of display or document line Extender selección al final de la línea visualizada o del documento - + Move to start of document Mover al principio del documento - + Extend selection to start of document Extender selección al principio del documento - + Move to end of document Mover al final del documento - + Extend selection to end of document Extender selección al final del documento - + Stuttered move up one page Mover progresivamente una página hacia arriba - + Stuttered extend selection up one page Extender progresivamente selección hacia arriba una página - + Stuttered move down one page Mover progresivamente una página hacia abajo - + Stuttered extend selection down one page Extender progresivamente selección hacia abajo una página - + Delete previous character if not at start of line Borrar carácter anterior si no está al principio de una línea - + Delete right to end of next word Borrar a la derecha hasta el final de la siguiente palabra - + Delete line to right Borrar línea hacia la derecha - + Transpose current and previous lines Transponer líneas actual y anterior - + Duplicate the current line Duplicar línea actual - + Select all Select document Seleccionar todo - + Move selected lines up one line Mover las líneas seleccionadas una línea hacia arriba - + Move selected lines down one line Mover las líneas seleccionadas una línea hacia abajo - + Toggle insert/overtype Conmutar insertar/sobreescribir - + Paste Pegar - + Copy selection Copiar selección - + Insert newline Insertar carácter de nueva línea - + De-indent one level Deshacer un nivel de indentado - + Cancel Cancelar - + Delete previous character Borrar carácter anterior - + Delete word to left Borrar palabra hacia la izquierda - + Delete line to left Borrar línea hacia la izquierda - + Undo last command Deshacer último comando - + Redo last command Rehacer último comando - + Indent one level Indentar un nivel - + Zoom in Aumentar zoom - + Zoom out Disminuir zoom - + Formfeed Carga de la página - + Cut current line Cortar línea actual - + Delete current line Borrar línea actual - + Copy current line Copiar línea actual - + Convert selection to lower case Convertir selección a minúsculas - + Convert selection to upper case Convertir selección a mayúsculas - + Duplicate selection Duplicar selección @@ -498,77 +498,77 @@ QsciLexerAVS - + Default Por defecto - + Block comment Comentario de bloque - + Nested block comment Comentario de bloque anidado - + Line comment Comentario de línea - + Number Número - + Operator Operador - + Identifier Identificador - + Double-quoted string Cadena con comillas dobles - + Triple double-quoted string Cadena con triple comilla doble - + Keyword Palabra clave - + Filter Filtro - + Plugin Plugin - + Function Función - + Clip property Propiedad de recorte - + User defined Definido por el usuario @@ -576,72 +576,72 @@ QsciLexerBash - + Default Por defecto - + Error Error - + Comment Comentario - + Number Número - + Keyword Palabra clave - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comillas simples - + Operator Operador - + Identifier Identificador - + Scalar Escalar - + Parameter expansion Expansión de parámetros - + Backticks Comilla inversa - + Here document delimiter Delimitador de documento integrado (here document) - + Single-quoted here document Documento integrado (here document) con comilla simple @@ -649,42 +649,42 @@ QsciLexerBatch - + Default Por defecto - + Comment Comentario - + Keyword Palabra clave - + Label Etiqueta - + Hide command character Ocultar caracteres de comando - + External command Comando externo - + Variable Variable - + Operator Operador @@ -692,77 +692,77 @@ QsciLexerCMake - + Default Por defecto - + Comment Comentario - + String Cadena de caracteres - + Left quoted string Cadena con comillas a la izquierda - + Right quoted string Cadena con comillas a la derecha - + Function Función - + Variable Variable - + Label Etiqueta - + User defined Definido por el usuario - + WHILE block Bloque WHILE - + FOREACH block Bloque FOREACH - + IF block Bloque IF - + MACRO block Bloque MACRO - + Variable within a string Variable en una cadena - + Number Número @@ -770,282 +770,282 @@ QsciLexerCPP - + Default Por defecto - + Inactive default Por defecto inactivo - + C comment Comentario C - + Inactive C comment Comentario C inactivo - + C++ comment Comentario C++ - + Inactive C++ comment Comentario C++ inactivo - + JavaDoc style C comment Comentario C de estilo JavaDoc - + Inactive JavaDoc style C comment Comentario C estilo JavaDoc inactivo - + Number Número - + Inactive number Número inactivo - + Keyword Palabra clave - + Inactive keyword Palabra clave inactiva - + Double-quoted string Cadena con comillas dobles - + Inactive double-quoted string Cadena con doble comilla inactiva - + Single-quoted string Cadena con comillas simples - + Inactive single-quoted string Cadena con comilla simple inactiva - + IDL UUID IDL UUID - + Inactive IDL UUID IDL UUID inactivo - + Pre-processor block Bloque de preprocesador - + Inactive pre-processor block Bloque de preprocesador inactivo - + Operator Operador - + Inactive operator Operador inactivo - + Identifier Identificador - + Inactive identifier Identificador inactivo - + Unclosed string Cadena sin cerrar - + Inactive unclosed string Cadena sin cerrar inactiva - + C# verbatim string Cadena C# textual - + Inactive C# verbatim string Cadena C# textual inactiva - + JavaScript regular expression Expresión regular JavaScript - + Inactive JavaScript regular expression Expresión regular JavaScript inactiva - + JavaDoc style C++ comment Comentario C++ de estilo JavaDoc - + Inactive JavaDoc style C++ comment Comentario C++ estilo JavaDoc inactivo - + Secondary keywords and identifiers Identificadores y palabras clave secundarios - + Inactive secondary keywords and identifiers Identificadores y palabras clave secundarios inactivos - + JavaDoc keyword Palabra clave de Javadoc - + Inactive JavaDoc keyword Palabra clave de JavaDoc inactiva - + JavaDoc keyword error Error en palabra clave de Javadoc - + Inactive JavaDoc keyword error Error en palabra clave de Javadoc inactivo - + Global classes and typedefs Clases globales y typedefs - + Inactive global classes and typedefs Clases globales y typedefs inactivos - + C++ raw string Cadena en bruto C++ - + Inactive C++ raw string Cadena inactiva C++ - + Vala triple-quoted verbatim string Cadena Vala con triple comilla textual - + Inactive Vala triple-quoted verbatim string Cadena Vala con triple comilla textual inactiva - + Pike hash-quoted string Cadena Pike con hash entrecomillado - + Inactive Pike hash-quoted string Cadena Pike con hash entrecomillado inactiva - + Pre-processor C comment Comentario C de preprocesador - + Inactive pre-processor C comment Comentario C de preprocesador inactivo - + JavaDoc style pre-processor comment Comentario de preprocesador estilo JavaDoc - + Inactive JavaDoc style pre-processor comment Comentario de preprocesador estilo JavaDoc inactivo - + User-defined literal Literal definido por el usuario - + Inactive user-defined literal Literal inactivo definido por el usuario - + Task marker Marcador de tarea - + Inactive task marker Marcador de tarea inactivo - + Escape sequence Secuencia de escape - + Inactive escape sequence Secuencia de escape inactiva @@ -1053,117 +1053,117 @@ QsciLexerCSS - + Default Por defecto - + Tag Etiqueta - + Class selector Selector de clase - + Pseudo-class Pseudoclase - + Unknown pseudo-class Pseudoclase desconocida - + Operator Operador - + CSS1 property Propiedad CSS1 - + Unknown property Propiedad desconocida - + Value Valor - + ID selector Selector de ID - + Important Importante - + @-rule Regla-@ - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comillas simples - + CSS2 property Propiedad CSS2 - + Attribute Atributo - + CSS3 property Propiedad CSS3 - + Pseudo-element Pseudoelemento - + Extended CSS property Propiedad CSS extendida - + Extended pseudo-class Pseudoclase extendida - + Extended pseudo-element Pseudoelemento extendido - + Media rule Regla de '@media' - + Variable Variable @@ -1171,7 +1171,7 @@ QsciLexerCSharp - + Verbatim string Cadena textual @@ -1179,122 +1179,122 @@ QsciLexerCoffeeScript - + Default Por defecto - + C-style comment Comentario de estilo C - + C++-style comment Comentario de estilo C++ - + JavaDoc C-style comment Comentario de estilo JavaDoc C - + Number Número - + Keyword Palabra clave - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comilla simple - + IDL UUID IDL UUID - + Pre-processor block Bloque de preprocesador - + Operator Operador - + Identifier Identificador - + Unclosed string Cadena sin cerrar - + C# verbatim string Cadena C# textual - + Regular expression Expresión regular - + JavaDoc C++-style comment Comentario de estilo JavaDoc C++ - + Secondary keywords and identifiers Identificadores y palabras clave secundarios - + JavaDoc keyword Palabra clave de JavaDoc - + JavaDoc keyword error Error en palabra clave de JavaDoc - + Global classes Clases globales - + Block comment Comentario de bloque - + Block regular expression Expresión regular de bloque - + Block regular expression comment Comentario de expresión regular de bloque - + Instance property Propiedad de instancia @@ -1302,117 +1302,117 @@ QsciLexerD - + Default Por defecto - + Block comment Comentario de bloque - + Line comment Comentario de línea - + DDoc style block comment Comentario de bloque estilo DDoc - + Nesting comment Comentario anidado - + Number Número - + Keyword Palabra clave - + Secondary keyword Palabra clave secundaria - + Documentation keyword Palabra clave de documentación - + Type definition Definición de tipo - + String Cadena de caracteres - + Unclosed string Cadena sin cerrar - + Character Carácter - + Operator Operador - + Identifier Identificador - + DDoc style line comment Comentario de línea estilo DDoc - + DDoc keyword Palabra clave DDoc - + DDoc keyword error Error en palabra clave DDOC - + Backquoted string Cadena con comillas hacia atrás - + Raw string Cadena en bruto - + User defined 1 Definido por el usuario 1 - + User defined 2 Definido por el usuario 2 - + User defined 3 Definido por el usuario 3 @@ -1420,120 +1420,168 @@ QsciLexerDiff - + Default Por defecto - + Comment Comentario - + Command Comando - + Header Encabezado - + Position Posición - + Removed line Línea eliminada - + Added line Línea añadida - + Changed line Línea modificada + + QsciLexerEDIFACT + + + Default + Por defecto + + + + Segment start + Inicio de Segmento + + + + Segment end + Final de Segmento + + + + Element separator + Separador de elemento + + + + Composite separator + Separador compuesto + + + + Release separator + Separador de release + + + + UNA segment header + Encabezamiento de segmento UNA + + + + UNH segment header + Encabezamiento de segmento UNH + + + + Badly formed segment + Segmento mal formado + + QsciLexerFortran77 - + Default Por defecto - + Comment Comentario - + Number Número - + Single-quoted string Cadena con comillas simples - + Double-quoted string Cadena con comillas dobles - + Unclosed string Cadena sin cerrar - + Operator Operador - + Identifier Identificador - + Keyword Palabra clave - + Intrinsic function Función intrínseca - + Extended function Función extendida - + Pre-processor block Bloque de preprocesador - + Dotted operator Operador punteado - + Label Etiqueta - + Continuation Continuación @@ -1541,547 +1589,547 @@ QsciLexerHTML - + HTML default HTML por defecto - + Tag Etiqueta - + Unknown tag Etiqueta desconocida - + Attribute Atributo - + Unknown attribute Atributo desconocido - + HTML number Número HTML - + HTML double-quoted string Cadena HTML con comillas dobles - + HTML single-quoted string Cadena HTML con comillas simples - + Other text in a tag Otro texto en una etiqueta - + HTML comment Comentario HTML - + Entity Entidad - + End of a tag Final de una etiqueta - + Start of an XML fragment Inicio de un fragmento XML - + End of an XML fragment Fin de un fragmento XML - + Script tag Etiqueta de script - + Start of an ASP fragment with @ Inicio de un fragmento ASP con @ - + Start of an ASP fragment Inicio de un fragmento ASP - + CDATA CDATA - + Start of a PHP fragment Inicio de un fragmento PHP - + Unquoted HTML value Valor HTML sin comillas - + ASP X-Code comment Comentario ASP X-Code - + SGML default SGML por defecto - + SGML command Comando SGML - + First parameter of an SGML command Primer parametro de un comando SGML - + SGML double-quoted string Cadena SGML con comillas dobles - + SGML single-quoted string Cadena SGML con comillas simples - + SGML error Error SGML - + SGML special entity Entidad SGML especial - + SGML comment Comentario SGML - + First parameter comment of an SGML command Comentario de primer parametro de un comando SGML - + SGML block default Bloque SGML por defecto - + Start of a JavaScript fragment Inicio de un fragmento JavaScript - + JavaScript default JavaScript por defecto - + JavaScript comment Comentario JavaScript - + JavaScript line comment Comentario de línea de JavaScript - + JavaDoc style JavaScript comment Comentario JavaScript de estilo JavaDoc - + JavaScript number Número JavaScript - + JavaScript word Palabra JavaScript - + JavaScript keyword Palabra clave JavaScript - + JavaScript double-quoted string Cadena JavaScript con comillas dobles - + JavaScript single-quoted string Cadena JavaScript con comillas simples - + JavaScript symbol Símbolo JavaScript - + JavaScript unclosed string Cadena JavaScript sin cerrar - + JavaScript regular expression Expresión regular JavaScript - + Start of an ASP JavaScript fragment Inicio de un fragmento de ASP JavaScript - + ASP JavaScript default ASP JavaScript por defecto - + ASP JavaScript comment Comentario de ASP JavaScript - + ASP JavaScript line comment Comentario de línea de ASP JavaScript - + JavaDoc style ASP JavaScript comment Comentario ASP JavaScript de estilo JavaDoc - + ASP JavaScript number Número ASP JavaScript - + ASP JavaScript word Palabra ASP JavaScript - + ASP JavaScript keyword Palabra clave ASP JavaScript - + ASP JavaScript double-quoted string Cadena ASP JavaScript con comillas dobles - + ASP JavaScript single-quoted string Cadena ASP JavaScript con comillas simples - + ASP JavaScript symbol Símbolo ASP JavaScript - + ASP JavaScript unclosed string Cadena ASP JavaScript sin cerrar - + ASP JavaScript regular expression Expresión regular ASP JavaScript - + Start of a VBScript fragment Inicio de un fragmento VBScript - + VBScript default VBScript por defecto - + VBScript comment Comentario VBScript - + VBScript number Número VBScript - + VBScript keyword Palabra clave VBScript - + VBScript string Cadena de caracteres VBScript - + VBScript identifier Identificador VBScript - + VBScript unclosed string Cadena VBScript sin cerrar - + Start of an ASP VBScript fragment Inicio de un fragmento de ASP VBScript - + ASP VBScript default ASP VBScript por defecto - + ASP VBScript comment Comentario de ASP VBScript - + ASP VBScript number Número ASP VBScript - + ASP VBScript keyword Palabra clave ASP VBScript - + ASP VBScript string Cadena de caracteres ASP VBScript - + ASP VBScript identifier Identificador ASP VBScript - + ASP VBScript unclosed string Cadena ASP VBScript sin cerrar - + Start of a Python fragment Inicio de un fragmento Python - + Python default Python por defecto - + Python comment Comentario Python - + Python number Número Python - + Python double-quoted string Cadena Python con comillas dobles - + Python single-quoted string Cadena Python con comillas simples - + Python keyword Palabra clave de Python - + Python triple double-quoted string Cadena Python con triple comilla doble - + Python triple single-quoted string Cadena Python con triple comilla simple - + Python class name Nombre de clase Python - + Python function or method name Nombre de método o función Python - + Python operator Operador Python - + Python identifier Identificador Python - + Start of an ASP Python fragment Inicio de un fragmento ASP Python - + ASP Python default ASP Python por defecto - + ASP Python comment Comentario ASP Python - + ASP Python number Número ASP Python - + ASP Python double-quoted string Cadena ASP Python con comillas dobles - + ASP Python single-quoted string Cadena ASP Python con comillas simples - + ASP Python keyword Palabra clave de ASP Python - + ASP Python triple double-quoted string Cadena ASP Python con triple comilla doble - + ASP Python triple single-quoted string Cadena ASP Python con triple comilla simple - + ASP Python class name Nombre de clase ASP Python - + ASP Python function or method name Nombre de método o función ASP Python - + ASP Python operator Operador ASP Python - + ASP Python identifier Identificador ASP Python - + PHP default PHP por defecto - + PHP double-quoted string Cadena PHP con comillas dobles - + PHP single-quoted string Cadena PHP con comillas simples - + PHP keyword Palabra clave PHP - + PHP number Número PHP - + PHP variable Variable PHP - + PHP comment Comentario PHP - + PHP line comment Comentario de línea PHP - + PHP double-quoted variable Variable PHP con comillas dobles - + PHP operator Operador PHP @@ -2089,7 +2137,7 @@ QsciLexerIDL - + UUID UUID @@ -2097,72 +2145,72 @@ QsciLexerJSON - + Default Por defecto - + Number Número - + String Cadena - + Unclosed string Cadena sin cerrar - + Property Propiedad - + Escape sequence Secuencia de escape - + Line comment Comentario de línea - + Block comment Comentario de bloque - + Operator Operador - + IRI IRI - + JSON-LD compact IRI JSON-LD compact IRI - + JSON keyword Palabra clave JSON - + JSON-LD keyword Palabra clave JSON-LD - + Parsing error Error de intérprete @@ -2170,7 +2218,7 @@ QsciLexerJavaScript - + Regular expression Expresión regular @@ -2178,102 +2226,102 @@ QsciLexerLua - + Default Por defecto - + Comment Comentario - + Line comment Comentario de línea - + Number Número - + Keyword Palabra clave - + String Cadena de caracteres - + Character Carácter - + Literal string Cadena literal - + Preprocessor Preprocesador - + Operator Operador - + Identifier Identificador - + Unclosed string Cadena sin cerrar - + Basic functions Funciones basicas - + String, table and maths functions Funcines de cadena, tabla y matemáticas - + Coroutines, i/o and system facilities Co-rutinas, e/s y funciones del sistema - + User defined 1 Definido por el usuario 1 - + User defined 2 Definido por el usuario 2 - + User defined 3 Definido por el usuario 3 - + User defined 4 Definido por el usuario 4 - + Label Etiqueta @@ -2281,37 +2329,37 @@ QsciLexerMakefile - + Default Por defecto - + Comment Comentario - + Preprocessor Preprocesador - + Variable Variable - + Operator Operador - + Target Objetivo - + Error Error @@ -2319,112 +2367,112 @@ QsciLexerMarkdown - + Default Por defecto - + Special Especial - + Strong emphasis using double asterisks Énfasis fuerte usando doble asterisco - + Strong emphasis using double underscores Énfasis fuerte usando doble guión bajo - + Emphasis using single asterisks Énfasis usando asterisco sencillo - + Emphasis using single underscores Énfasis usando guión bajo sencillo - + Level 1 header Encabezado de nivel 1 - + Level 2 header Encabezado de nivel 2 - + Level 3 header Encabezado de nivel 3 - + Level 4 header Encabezado de nivel 4 - + Level 5 header Encabezado de nivel 5 - + Level 6 header Encabezado de nivel 6 - + Pre-char Pre-char - + Unordered list item Elemento de lista sin ordenar - + Ordered list item Elemento de lista ordenada - + Block quote Bloque de cita - + Strike out Tachar - + Horizontal rule Regla horizontal - + Link Enlace - + Code between backticks Código entre comillas hacia atrás - + Code between double backticks Código entre comillas hacia atrás dobles - + Code block Bloque de código @@ -2432,47 +2480,47 @@ QsciLexerMatlab - + Default Por defecto - + Comment Comentario - + Command Comando - + Number Número - + Keyword Palabra clave - + Single-quoted string Cadena con comillas simples - + Operator Operador - + Identifier Identificador - + Double-quoted string Cadena con comillas dobles @@ -2480,77 +2528,77 @@ QsciLexerPO - + Default Por defecto - + Comment Comentario - + Message identifier Identificador de mensaje - + Message identifier text Texto identificador de mensaje - + Message string Cadena de mensaje - + Message string text Texto de cadena de mensaje - + Message context Contexto de mensaje - + Message context text Texto de contexto de mensaje - + Fuzzy flag Señalador difuso - + Programmer comment Comentario de programador - + Reference Referencia - + Flags Señaladores - + Message identifier text end-of-line Fin de línea de texto identificador de mensaje - + Message string text end-of-line Fin de línea de texto de cadena de mensaje - + Message context text end-of-line Fin de línea de texto de contexto de mensaje @@ -2558,87 +2606,87 @@ QsciLexerPOV - + Default Por defecto - + Comment Comentario - + Comment line Línea de comentario - + Number Número - + Operator Operador - + Identifier Identificador - + String Cadena de caracteres - + Unclosed string Cadena sin cerrar - + Directive Directiva - + Bad directive Mala directiva - + Objects, CSG and appearance Objetos, CSG y apariencia - + Types, modifiers and items Tipos, modificadores y elementos - + Predefined identifiers Identificadores predefinidos - + Predefined functions Funciones predefinidas - + User defined 1 Definido por el usuario 1 - + User defined 2 Definido por el usuario 2 - + User defined 3 Definido por el usuario 3 @@ -2646,77 +2694,77 @@ QsciLexerPascal - + Default Por defecto - + Line comment Comentario de línea - + Number Número - + Keyword Palabra clave - + Single-quoted string Cadena con comillas simples - + Operator Operador - + Identifier Identificador - + '{ ... }' style comment Comentario de estilo '{ ... }' - + '(* ... *)' style comment Comentario de estilo '(* ... *)' - + '{$ ... }' style pre-processor block Bloque de preprocesador de estilo '{$ ... }' - + '(*$ ... *)' style pre-processor block Bloque de preprocesador de estilo '(*$ ... *)' - + Hexadecimal number Número hexadecimal - + Unclosed string Cadena sin cerrar - + Character Carácter - + Inline asm asm inline @@ -2724,207 +2772,207 @@ QsciLexerPerl - + Default Por defecto - + Error Error - + Comment Comentario - + POD POD - + Number Número - + Keyword Palabra clave - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comillas simples - + Operator Operador - + Identifier Identificador - + Scalar Escalar - + Array Array - + Hash Hash - + Symbol table Tabla de símbolos - + Regular expression Expresión regular - + Substitution Sustitución - + Backticks Comilla inversa - + Data section Sección de datos - + Here document delimiter Delimitador de documento integrado (here document) - + Single-quoted here document Documento integrado (here document) con comilla simple - + Double-quoted here document Documento integrado (here document) con comilla doble - + Backtick here document Documento integrado (here document) con comilla inversa - + Quoted string (q) Cadena con comillas (q) - + Quoted string (qq) Cadena con comillas (qq) - + Quoted string (qx) Cadena con comillas (qx) - + Quoted string (qr) Cadena con comillas (qr) - + Quoted string (qw) Cadena con comillas (qw) - + POD verbatim POD textual - + Subroutine prototype Prototipo de subrutina - + Format identifier Identificador de formato - + Format body Cuerpo de formato - + Double-quoted string (interpolated variable) Cadena con doble comilla (variable interpolada) - + Translation Traducción - + Regular expression (interpolated variable) Expresión regular (variable interpolada) - + Substitution (interpolated variable) Substitución (variable interpolada) - + Backticks (interpolated variable) Comilla hacia atrás (variable interpolada) - + Double-quoted here document (interpolated variable) Here document con comilla doble (variable interpolada) - + Backtick here document (interpolated variable) Here document con comilla hacia atrás (variable interpolada) - + Quoted string (qq, interpolated variable) Cadena entrecomillada (qq, variable interpolada) - + Quoted string (qx, interpolated variable) Cadena entrecomillada (qx, variable interpolada) - + Quoted string (qr, interpolated variable) Cadena entrecomillada (qr, variable interpolada) @@ -2932,82 +2980,82 @@ QsciLexerPostScript - + Default Por defecto - + Comment Comentario - + DSC comment Comentario DSC - + DSC comment value Valor de comentario DSC - + Number Número - + Name Nombre - + Keyword Palabra clave - + Literal Literal - + Immediately evaluated literal Literal de evaluación inmediata - + Array parenthesis Paréntesis de array - + Dictionary parenthesis Paréntesis de diccionario - + Procedure parenthesis Paréntesis de procedimiento - + Text Texto - + Hexadecimal string Cadena hexadecimal - + Base85 string Cadena Base85 - + Bad string character Carácter de cadena mala @@ -3015,32 +3063,32 @@ QsciLexerProperties - + Default Por defecto - + Comment Comentario - + Section Sección - + Assignment Asignación - + Default value Valor por defecto - + Key Clave @@ -3048,82 +3096,82 @@ QsciLexerPython - + Default Por defecto - + Comment Comentario - + Number Número - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comillas simples - + Keyword Palabra clave - + Triple single-quoted string Cadena con triple comilla simple - + Triple double-quoted string Cadena con triple comilla doble - + Class name Nombre de clase - + Function or method name Nombre de método o función - + Operator Operador - + Identifier Identificador - + Comment block Bloque de comentario - + Unclosed string Cadena sin cerrar - + Highlighted identifier Identificador resaltado - + Decorator Decorador @@ -3131,157 +3179,157 @@ QsciLexerRuby - + Default Por defecto - + Comment Comentario - + Number Número - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comillas simples - + Keyword Palabra clave - + Class name Nombre de clase - + Function or method name Nombre de método o función - + Operator Operador - + Identifier Identificador - + Error Error - + POD POD - + Regular expression Expresión regular - + Global Global - + Symbol Símbolo - + Module name Nombre de módulo - + Instance variable Variable de instancia - + Class variable Variable de clase - + Backticks Comilla inversa - + Data section Sección de datos - + Here document delimiter Delimitador de documento integrado (here document) - + Here document Documento integrado (here document) - + %q string Cadena %q - + %Q string Cadena %Q - + %x string Cadena %x - + %r string Cadena %r - + %w string Cadena %w - + Demoted keyword Palabra clave degradada - + stdin stdin - + stdout stdout - + stderr stderr @@ -3289,112 +3337,112 @@ QsciLexerSQL - + Default Por defecto - + Comment Comentario - + Number Número - + Keyword Palabra clave - + Single-quoted string Cadena con comillas simples - + Operator Operador - + Identifier Identificador - + Comment line Línea de comentario - + JavaDoc style comment Comentario de estilo JavaDoc - + Double-quoted string Cadena con comillas dobles - + SQL*Plus keyword Palabra clave SQL*Plus - + SQL*Plus prompt Prompt SQL*Plus - + SQL*Plus comment Comentario SQL*Plus - + # comment line # línea de comentario - + JavaDoc keyword Palabra clave de Javadoc - + JavaDoc keyword error Error en palabra clave de Javadoc - + User defined 1 Definido por el usuario 1 - + User defined 2 Definido por el usuario 2 - + User defined 3 Definido por el usuario 3 - + User defined 4 Definido por el usuario 4 - + Quoted identifier Identificador entrecomillado - + Quoted operator Operador entrecomillado @@ -3402,47 +3450,47 @@ QsciLexerSpice - + Default Por defecto - + Identifier Identificador - + Command Comando - + Function Función - + Parameter Parámetro - + Number Número - + Delimiter Delimitador - + Value Valor - + Comment Comentario @@ -3450,112 +3498,112 @@ QsciLexerTCL - + Default Por defecto - + Comment Comentario - + Comment line Línea de comentario - + Number Número - + Quoted keyword Palabra clave entrecomillada - + Quoted string Cadena entrecomillada - + Operator Operador - + Identifier Identificador - + Substitution Sustitución - + Brace substitution Sustitución de corchetes - + Modifier Modificador - + Expand keyword Expandir palabra clave - + TCL keyword Palabra clave TCL - + Tk keyword Palabra clave Tk - + iTCL keyword Palabra clave iTCL - + Tk command Comando Tk - + User defined 1 Definido por el usuario 1 - + User defined 2 Definido por el usuario 2 - + User defined 3 Definido por el usuario 3 - + User defined 4 Definido por el usuario 4 - + Comment box Caja de comentario - + Comment block Bloque de comentario @@ -3563,32 +3611,32 @@ QsciLexerTeX - + Default Por defecto - + Special Especial - + Group Grupo - + Symbol Símbolo - + Command Comando - + Text Texto @@ -3596,82 +3644,82 @@ QsciLexerVHDL - + Default Por defecto - + Comment Comentario - + Comment line Línea de comentario - + Number Número - + String Cadena de caracteres - + Operator Operador - + Identifier Identificador - + Unclosed string Cadena sin cerrar - + Keyword Palabra clave - + Standard operator Operador estándar - + Attribute Atributo - + Standard function Función estándar - + Standard package Paquete estándar - + Standard type Tipo estándar - + User defined Definido por el usuario - + Comment block Bloque de comentario @@ -3679,122 +3727,172 @@ QsciLexerVerilog - + Default Por defecto - + + Inactive default + Inactivo por defecto + + + Comment Comentario - + Line comment Comentario de línea - + + Inactive line comment + Línea de comentario inactiva + + + Bang comment - Comentario'Bang + Comentario Bang + + + + Inactive bang comment + Comentario Bang inactivo - + Number - + + Inactive number + Número inactivo + + + Primary keywords and identifiers Identificadores y palabras clave primarios - + + Inactive primary keywords and identifiers + Palabras clave primarias e identificadores inactivos + + + String Cadena - + + Inactive string + Cadena inactiva + + + Secondary keywords and identifiers Palabras clave e identificadores secundarios - + System task Tarea de sistema - + + Inactive system task + Tarea de sistema inactiva + + + Preprocessor block Bloque de preprocesador - + Operator Operador - + + Inactive operator + Operador inactivo + + + Identifier Identificador - + Unclosed string Cadena sin cerrar - + + Inactive unclosed string + Cadena sin cerrar inactiva + + + User defined tasks and identifiers Tareas definidas por el usuario e identificadores - + + Inactive user defined tasks and identifiers + Tareas definidas por el usuario e identificadores inactivos + + + Keyword comment Comentario de palabra clave - + Inactive keyword comment Comentario de palabra clave inactiva - + Input port declaration Declaración de puerto de input - + Inactive input port declaration Declaración de puerto de input inactivo - + Output port declaration Declaración de puerto de output - + Inactive output port declaration Declaración de puerto de output inactivo - + Input/output port declaration Declaración de puerto de input/output inactivo - + Inactive input/output port declaration Declaración de puerto de input/output inactivo - + Port connection Conexión de puerto - + Inactive port connection Conexión inactiva de puerto @@ -3802,52 +3900,52 @@ QsciLexerYAML - + Default Por defecto - + Comment Comentario - + Identifier Identificador - + Keyword Palabra clave - + Number Número - + Reference Referencia - + Document delimiter Delimitador de documento - + Text block marker Marcador de bloque de texto - + Syntax error marker Marcador de error de sintaxis - + Operator Operador @@ -3855,37 +3953,37 @@ QsciScintilla - + &Undo &Deshacer - + &Redo &Rehacer - + Cu&t Cor&tar - + &Copy &Copiar - + &Paste &Pegar - + Delete Borrar - + Select All Seleccionar todo diff --git a/libs/qscintilla/Qt4Qt5/qscintilla_fr.qm b/libs/qscintilla/Qt4Qt5/qscintilla_fr.qm index ca7f973e5..80f7293cc 100644 Binary files a/libs/qscintilla/Qt4Qt5/qscintilla_fr.qm and b/libs/qscintilla/Qt4Qt5/qscintilla_fr.qm differ diff --git a/libs/qscintilla/Qt4Qt5/qscintilla_fr.ts b/libs/qscintilla/Qt4Qt5/qscintilla_fr.ts index 9153b9a64..aa8c0968a 100644 --- a/libs/qscintilla/Qt4Qt5/qscintilla_fr.ts +++ b/libs/qscintilla/Qt4Qt5/qscintilla_fr.ts @@ -4,493 +4,493 @@ QsciCommand - + Move down one line Déplacement d'une ligne vers le bas - + Extend selection down one line Extension de la sélection d'une ligne vers le bas - + Scroll view down one line Decendre la vue d'une ligne - + Extend rectangular selection down one line Extension de la sélection rectangulaire d'une ligne vers le bas - + Move up one line Déplacement d'une ligne vers le haut - + Extend selection up one line Extension de la sélection d'une ligne vers le haut - + Scroll view up one line Remonter la vue d'une ligne - + Extend rectangular selection up one line Extension de la sélection rectangulaire d'une ligne vers le haut - + Move up one paragraph Déplacement d'un paragraphe vers le haut - + Extend selection up one paragraph Extension de la sélection d'un paragraphe vers le haut - + Move down one paragraph Déplacement d'un paragraphe vers le bas - + Scroll to start of document Remonter au début du document - + Scroll to end of document Descendre à la fin du document - + Scroll vertically to centre current line Défiler verticalement pour centrer la ligne courante - + Extend selection down one paragraph Extension de la sélection d'un paragraphe vers le bas - + Move left one character Déplacement d'un caractère vers la gauche - + Extend selection left one character Extension de la sélection d'un caractère vers la gauche - + Move left one word Déplacement d'un mot vers la gauche - + Extend selection left one word Extension de la sélection d'un mot vers la gauche - + Extend rectangular selection left one character Extension de la sélection rectangulaire d'un caractère vers la gauche - + Move right one character Déplacement d'un caractère vers la droite - + Extend selection right one character Extension de la sélection d'un caractère vers la droite - + Move right one word Déplacement d'un mot vers la droite - + Extend selection right one word Extension de la sélection d'un mot vers la droite - + Extend rectangular selection right one character Extension de la sélection rectangulaire d'un caractère vers la droite - + Move to end of previous word Déplacement vers fin du mot précédent - + Extend selection to end of previous word Extension de la sélection vers fin du mot précédent - + Move to end of next word Déplacement vers fin du mot suivant - + Extend selection to end of next word Extension de la sélection vers fin du mot suivant - + Move left one word part Déplacement d'une part de mot vers la gauche - + Extend selection left one word part Extension de la sélection d'une part de mot vers la gauche - + Move right one word part Déplacement d'une part de mot vers la droite - + Extend selection right one word part Extension de la sélection d'une part de mot vers la droite - + Move up one page Déplacement d'une page vers le haut - + Extend selection up one page Extension de la sélection d'une page vers le haut - + Extend rectangular selection up one page Extension de la sélection rectangulaire d'une page vers le haut - + Move down one page Déplacement d'une page vers le bas - + Extend selection down one page Extension de la sélection d'une page vers le bas - + Extend rectangular selection down one page Extension de la sélection rectangulaire d'une page vers le bas - + Delete current character Effacement du caractère courant - + Cut selection Couper la sélection - + Delete word to right Suppression du mot de droite - + Move to start of document line Déplacement vers début de ligne du document - + Extend selection to start of document line Extension de la sélection vers début de ligne du document - + Extend rectangular selection to start of document line - + Move to start of display line - + Extend selection to start of display line - + Move to start of display or document line - + Extend selection to start of display or document line - + Move to first visible character in document line - + Extend selection to first visible character in document line - + Extend rectangular selection to first visible character in document line - + Move to first visible character of display in document line - + Extend selection to first visible character in display or document line - + Move to end of document line - + Extend selection to end of document line - + Extend rectangular selection to end of document line - + Move to end of display line - + Extend selection to end of display line - + Move to end of display or document line - + Extend selection to end of display or document line - + Move to start of document - + Extend selection to start of document - + Move to end of document - + Extend selection to end of document - + Stuttered move up one page - + Stuttered extend selection up one page - + Stuttered move down one page - + Stuttered extend selection down one page - + Delete previous character if not at start of line - + Delete right to end of next word - + Delete line to right Suppression de la partie droite de la ligne - + Transpose current and previous lines - + Duplicate the current line - + Select all Select document - + Move selected lines up one line - + Move selected lines down one line - + Toggle insert/overtype Basculement Insertion /Ecrasement - + Paste Coller - + Copy selection Copier la sélection - + Insert newline - + De-indent one level - + Cancel Annuler - + Delete previous character Suppression du dernier caractère - + Delete word to left Suppression du mot de gauche - + Delete line to left Effacer la partie gauche de la ligne - + Undo last command - + Redo last command Refaire la dernière commande - + Indent one level Indentation d'un niveau - + Zoom in Zoom avant - + Zoom out Zoom arrière - + Formfeed Chargement de la page - + Cut current line Couper la ligne courante - + Delete current line Suppression de la ligne courante - + Copy current line Copier la ligne courante - + Convert selection to lower case Conversion de la ligne courante en minuscules - + Convert selection to upper case Conversion de la ligne courante en majuscules - + Duplicate selection @@ -498,150 +498,150 @@ QsciLexerAVS - + Default Par défaut - + Block comment - + Block de commentaires - + Nested block comment - + Line comment Commentaire de ligne - + Number Nombre - + Operator Opérateur - + Identifier Identificateur - + Double-quoted string Chaine de caractères (guillemets doubles) - + Triple double-quoted string Chaine de caractères HTML (guillemets simples) - + Keyword Mot-clé - + Filter Filtre - + Plugin Extension - + Function Fonction - + Clip property - + User defined - + Définition utilisateur QsciLexerBash - + Default Par défaut - + Error Erreur - + Comment Commentaire - + Number Nombre - + Keyword Mot-clé - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + Operator Opérateur - + Identifier Identificateur - + Scalar Scalaire - + Parameter expansion Extension de paramètre - + Backticks Quotes inverses - + Here document delimiter Ici délimiteur de document - + Single-quoted here document Document intégré guillemets simples @@ -649,42 +649,42 @@ QsciLexerBatch - + Default Par défaut - + Comment Commentaire - + Keyword Mot-clé - + Label Titre - + Hide command character Cacher le caratère de commande - + External command Commande externe - + Variable Variable - + Operator Opérateur @@ -692,77 +692,77 @@ QsciLexerCMake - + Default Par défaut - + Comment Commentaire - + String Chaîne de caractères - + Left quoted string - + Right quoted string - + Function - + Fonction - + Variable Variable - + Label Titre - + User defined - + Définition utilisateur - + WHILE block - + FOREACH block - + IF block - + MACRO block - + Variable within a string - + Number Nombre @@ -770,282 +770,282 @@ QsciLexerCPP - + Default Par défaut - + Inactive default - + C comment Commentaire C - + Inactive C comment - + C++ comment Commentaire C++ - + Inactive C++ comment - + JavaDoc style C comment Commentaire C de style JavaDoc - + Inactive JavaDoc style C comment - + Number Nombre - + Inactive number - + Keyword Mot-clé - + Inactive keyword - + Double-quoted string Chaine de caractères (guillemets doubles) - + Inactive double-quoted string - + Single-quoted string Chaine de caractères (guillemets simples) - + Inactive single-quoted string - + IDL UUID - + Inactive IDL UUID - + Pre-processor block Instructions de pré-processing - + Inactive pre-processor block - + Operator Opérateur - + Inactive operator - + Identifier Identificateur - + Inactive identifier - + Unclosed string Chaine de caractères non refermée - + Inactive unclosed string - + C# verbatim string - + Inactive C# verbatim string - + JavaScript regular expression Expression régulière JavaScript - + Inactive JavaScript regular expression - + JavaDoc style C++ comment Commentaire C++ de style JavaDoc - + Inactive JavaDoc style C++ comment - + Secondary keywords and identifiers Seconds mots-clés et identificateurs - + Inactive secondary keywords and identifiers - + JavaDoc keyword Mot-clé JavaDoc - + Inactive JavaDoc keyword - + JavaDoc keyword error Erreur de mot-clé JavaDoc - + Inactive JavaDoc keyword error - + Global classes and typedefs Classes globales et définitions de types - + Inactive global classes and typedefs - + C++ raw string - + Inactive C++ raw string - + Vala triple-quoted verbatim string - + Inactive Vala triple-quoted verbatim string - + Pike hash-quoted string - + Inactive Pike hash-quoted string - + Pre-processor C comment - + Inactive pre-processor C comment - + JavaDoc style pre-processor comment - + Inactive JavaDoc style pre-processor comment - + User-defined literal - + Inactive user-defined literal - + Task marker - + Inactive task marker - + Escape sequence - + Séquence d'échappement - + Inactive escape sequence @@ -1053,117 +1053,117 @@ QsciLexerCSS - + Default Par défaut - + Tag Balise - + Class selector Classe - + Pseudo-class Pseudo-classe - + Unknown pseudo-class Peudo-classe inconnue - + Operator Opérateur - + CSS1 property Propriété CSS1 - + Unknown property Propriété inconnue - + Value Valeur - + ID selector ID - + Important Important - + @-rule règle-@ - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + CSS2 property Propriété CSS2 - + Attribute Attribut - + CSS3 property Propriété CSS3 - + Pseudo-element - + Extended CSS property - + Extended pseudo-class - + Extended pseudo-element - + Media rule - + Variable Variable @@ -1171,7 +1171,7 @@ QsciLexerCSharp - + Verbatim string Chaine verbatim @@ -1179,122 +1179,122 @@ QsciLexerCoffeeScript - + Default Par défaut - + C-style comment - + C++-style comment - + JavaDoc C-style comment - + Number Nombre - + Keyword Mot-clé - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + IDL UUID - + Pre-processor block Instructions de pré-processing - + Operator Opérateur - + Identifier Identificateur - + Unclosed string Chaine de caractères non refermée - + C# verbatim string - + Regular expression Expression régulière - + JavaDoc C++-style comment - + Secondary keywords and identifiers Seconds mots-clés et identificateurs - + JavaDoc keyword Mot-clé JavaDoc - + JavaDoc keyword error Erreur de mot-clé JavaDoc - + Global classes - + Block comment - + Block de commentaires - + Block regular expression - + Block regular expression comment - + Instance property @@ -1302,117 +1302,117 @@ QsciLexerD - + Default Par défaut - + Block comment - + Block de commentaires - + Line comment Commentaire de ligne - + DDoc style block comment - + Nesting comment - + Number Nombre - + Keyword Mot-clé - + Secondary keyword - + Documentation keyword - + Type definition - + String Chaîne de caractères - + Unclosed string Chaine de caractères non refermée - + Character Caractère - + Operator Opérateur - + Identifier Identificateur - + DDoc style line comment - + DDoc keyword Mot-clé DDoc - + DDoc keyword error Erreur de mot-clé DDoc - + Backquoted string - + Raw string - + User defined 1 Définition utilisateur 1 - + User defined 2 Définition utilisateur 2 - + User defined 3 Définition utilisateur 3 @@ -1420,120 +1420,168 @@ QsciLexerDiff - + Default Par défaut - + Comment Commentaire - + Command Commande - + Header En-tête - + Position Position - + Removed line Ligne supprimée - + Added line Ligne ajoutée - + Changed line Ligne changée + + QsciLexerEDIFACT + + + Default + Par défaut + + + + Segment start + + + + + Segment end + + + + + Element separator + + + + + Composite separator + + + + + Release separator + + + + + UNA segment header + + + + + UNH segment header + + + + + Badly formed segment + + + QsciLexerFortran77 - + Default Par défaut - + Comment Commentaire - + Number Nombre - + Single-quoted string Chaine de caractères (guillemets simples) - + Double-quoted string Chaine de caractères (guillemets doubles) - + Unclosed string Chaine de caractères non refermée - + Operator Opérateur - + Identifier Identificateur - + Keyword Mot-clé - + Intrinsic function Fonction intrinsèque - + Extended function Fonction étendue - + Pre-processor block Instructions de pré-processing - + Dotted operator - + Label Titre - + Continuation @@ -1541,547 +1589,547 @@ QsciLexerHTML - + HTML default HTML par défaut - + Tag Balise - + Unknown tag Balise inconnue - + Attribute Attribut - + Unknown attribute Attribut inconnu - + HTML number Nombre HTML - + HTML double-quoted string Chaine de caractères HTML (guillemets doubles) - + HTML single-quoted string Chaine de caractères HTML (guillemets simples) - + Other text in a tag Autre texte dans les balises - + HTML comment Commentaire HTML - + Entity Entité - + End of a tag Balise fermante - + Start of an XML fragment Début de block XML - + End of an XML fragment Fin de block XML - + Script tag Balise de script - + Start of an ASP fragment with @ Début de block ASP avec @ - + Start of an ASP fragment Début de block ASP - + CDATA CDATA - + Start of a PHP fragment Début de block PHP - + Unquoted HTML value Valeur HTML sans guillemets - + ASP X-Code comment Commentaire X-Code ASP - + SGML default SGML par défaut - + SGML command Commande SGML - + First parameter of an SGML command Premier paramètre de commande SGML - + SGML double-quoted string Chaine de caractères SGML (guillemets doubles) - + SGML single-quoted string Chaine de caractères SGML (guillemets simples) - + SGML error Erreur SGML - + SGML special entity Entité SGML spéciale - + SGML comment Commentaire SGML - + First parameter comment of an SGML command Premier paramètre de commentaire de commande SGML - + SGML block default Block SGML par défaut - + Start of a JavaScript fragment Début de block JavaScript - + JavaScript default JavaScript par défaut - + JavaScript comment Commentaire JavaScript - + JavaScript line comment Commentaire de ligne JavaScript - + JavaDoc style JavaScript comment Commentaire JavaScript de style JavaDoc - + JavaScript number Nombre JavaScript - + JavaScript word Mot JavaScript - + JavaScript keyword Mot-clé JavaScript - + JavaScript double-quoted string Chaine de caractères JavaScript (guillemets doubles) - + JavaScript single-quoted string Chaine de caractères JavaScript (guillemets simples) - + JavaScript symbol Symbole JavaScript - + JavaScript unclosed string Chaine de caractères JavaScript non refermée - + JavaScript regular expression Expression régulière JavaScript - + Start of an ASP JavaScript fragment Début de block JavaScript ASP - + ASP JavaScript default JavaScript ASP par défaut - + ASP JavaScript comment Commentaire JavaScript ASP - + ASP JavaScript line comment Commentaire de ligne JavaScript ASP - + JavaDoc style ASP JavaScript comment Commentaire JavaScript ASP de style JavaDoc - + ASP JavaScript number Nombre JavaScript ASP - + ASP JavaScript word Mot JavaScript ASP - + ASP JavaScript keyword Mot-clé JavaScript ASP - + ASP JavaScript double-quoted string Chaine de caractères JavaScript ASP (guillemets doubles) - + ASP JavaScript single-quoted string Chaine de caractères JavaScript ASP (guillemets simples) - + ASP JavaScript symbol Symbole JavaScript ASP - + ASP JavaScript unclosed string Chaine de caractères JavaScript ASP non refermée - + ASP JavaScript regular expression Expression régulière JavaScript ASP - + Start of a VBScript fragment Début de block VBScript - + VBScript default VBScript par défaut - + VBScript comment Commentaire VBScript - + VBScript number Nombre VBScript - + VBScript keyword Mot-clé VBScript - + VBScript string Chaine de caractères VBScript - + VBScript identifier Identificateur VBScript - + VBScript unclosed string Chaine de caractères VBScript non refermée - + Start of an ASP VBScript fragment Début de block VBScript ASP - + ASP VBScript default VBScript ASP par défaut - + ASP VBScript comment Commentaire VBScript ASP - + ASP VBScript number Nombre VBScript ASP - + ASP VBScript keyword Mot-clé VBScript ASP - + ASP VBScript string Chaine de caractères VBScript ASP - + ASP VBScript identifier Identificateur VBScript ASP - + ASP VBScript unclosed string Chaine de caractères VBScript ASP non refermée - + Start of a Python fragment Début de block Python - + Python default Python par défaut - + Python comment Commentaire Python - + Python number Nombre Python - + Python double-quoted string Chaine de caractères Python (guillemets doubles) - + Python single-quoted string Chaine de caractères Python (guillemets simples) - + Python keyword Mot-clé Python - + Python triple double-quoted string Chaine de caractères Python (triples guillemets doubles) - + Python triple single-quoted string Chaine de caractères Python (triples guillemets simples) - + Python class name Nom de classe Python - + Python function or method name Méthode ou fonction Python - + Python operator Opérateur Python - + Python identifier Identificateur Python - + Start of an ASP Python fragment Début de block Python ASP - + ASP Python default Python ASP par défaut - + ASP Python comment Commentaire Python ASP - + ASP Python number Nombre Python ASP - + ASP Python double-quoted string Chaine de caractères Python ASP (guillemets doubles) - + ASP Python single-quoted string Chaine de caractères Python ASP (guillemets simples) - + ASP Python keyword Mot-clé Python ASP - + ASP Python triple double-quoted string Chaine de caractères Python ASP (triples guillemets doubles) - + ASP Python triple single-quoted string Chaine de caractères Python ASP (triples guillemets simples) - + ASP Python class name Nom de classe Python ASP - + ASP Python function or method name Méthode ou fonction Python ASP - + ASP Python operator Opérateur Python ASP - + ASP Python identifier Identificateur Python ASP - + PHP default PHP par défaut - + PHP double-quoted string Chaine de caractères PHP (guillemets doubles) - + PHP single-quoted string Chaine de caractères PHP (guillemets simples) - + PHP keyword Mot-clé PHP - + PHP number Nombre PHP - + PHP variable Variable PHP - + PHP comment Commentaire PHP - + PHP line comment Commentaire de ligne PHP - + PHP double-quoted variable Variable PHP (guillemets doubles) - + PHP operator Opérateur PHP @@ -2089,7 +2137,7 @@ QsciLexerIDL - + UUID UUID @@ -2097,72 +2145,72 @@ QsciLexerJSON - + Default Par défaut - + Number Nombre - + String Chaîne de caractères - + Unclosed string Chaine de caractères non refermée - + Property Propriété - + Escape sequence Séquence d'échappement - + Line comment Commentaire de ligne - + Block comment Block de commentaires - + Operator Opérateur - + IRI - + JSON-LD compact IRI - + JSON keyword Mot-clé JSON - + JSON-LD keyword Mot-clé JSON-LD - + Parsing error Erreur d'analyse @@ -2170,7 +2218,7 @@ QsciLexerJavaScript - + Regular expression Expression régulière @@ -2178,102 +2226,102 @@ QsciLexerLua - + Default Par défaut - + Comment Commentaire - + Line comment Commentaire de ligne - + Number Nombre - + Keyword Mot-clé - + String Chaîne de caractères - + Character Caractère - + Literal string Chaîne littérale - + Preprocessor Préprocessing - + Operator Opérateur - + Identifier Identificateur - + Unclosed string Chaine de caractères non refermée - + Basic functions Fonctions de base - + String, table and maths functions Fonctions sur les chaines, tables et fonctions math - + Coroutines, i/o and system facilities Coroutines, i/o et fonctions système - + User defined 1 Définition utilisateur 1 - + User defined 2 Définition utilisateur 2 - + User defined 3 Définition utilisateur 3 - + User defined 4 Définition utilisateur 4 - + Label Titre @@ -2281,37 +2329,37 @@ QsciLexerMakefile - + Default Par défaut - + Comment Commentaire - + Preprocessor Préprocessing - + Variable Variable - + Operator Opérateur - + Target Cible - + Error Erreur @@ -2319,112 +2367,112 @@ QsciLexerMarkdown - + Default Par défaut - + Special Spécial - + Strong emphasis using double asterisks - + Strong emphasis using double underscores - + Emphasis using single asterisks - + Emphasis using single underscores - + Level 1 header - + Level 2 header - + Level 3 header - + Level 4 header - + Level 5 header - + Level 6 header - + Pre-char - + Unordered list item - + Ordered list item - + Block quote - + Strike out - + Horizontal rule - + Link - + Code between backticks - + Code between double backticks - + Code block @@ -2432,47 +2480,47 @@ QsciLexerMatlab - + Default Par défaut - + Comment Commentaire - + Command Commande - + Number Nombre - + Keyword Mot-clé - + Single-quoted string Chaine de caractères (guillemets simples) - + Operator Opérateur - + Identifier Identificateur - + Double-quoted string Chaine de caractères (guillemets doubles) @@ -2480,77 +2528,77 @@ QsciLexerPO - + Default Par défaut - + Comment Commentaire - + Message identifier - + Message identifier text - + Message string - + Message string text - + Message context - + Message context text - + Fuzzy flag - + Programmer comment - + Reference - + Référence - + Flags - + Message identifier text end-of-line - + Message string text end-of-line - + Message context text end-of-line @@ -2558,87 +2606,87 @@ QsciLexerPOV - + Default Par défaut - + Comment Commentaire - + Comment line Ligne commentée - + Number Nombre - + Operator Opérateur - + Identifier Identificateur - + String Chaîne de caractères - + Unclosed string Chaine de caractères non refermée - + Directive Directive - + Bad directive Mauvaise directive - + Objects, CSG and appearance Objets, CSG et apparence - + Types, modifiers and items Types, modifieurs et éléments - + Predefined identifiers Identifiants prédéfinis - + Predefined functions Fonctions prédéfinies - + User defined 1 Définition utilisateur 1 - + User defined 2 Définition utilisateur 2 - + User defined 3 Définition utilisateur 3 @@ -2646,77 +2694,77 @@ QsciLexerPascal - + Default Par défaut - + Line comment Commentaire de ligne - + Number Nombre - + Keyword Mot-clé - + Single-quoted string Chaine de caractères (guillemets simples) - + Operator Opérateur - + Identifier Identificateur - + '{ ... }' style comment - + '(* ... *)' style comment - + '{$ ... }' style pre-processor block - + '(*$ ... *)' style pre-processor block - + Hexadecimal number Nombre hexadécimal - + Unclosed string Chaine de caractères non refermée - + Character Caractère - + Inline asm Asm en ligne @@ -2724,207 +2772,207 @@ QsciLexerPerl - + Default Par défaut - + Error Erreur - + Comment Commentaire - + POD POD - + Number Nombre - + Keyword Mot-clé - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + Operator Opérateur - + Identifier Identificateur - + Scalar Scalaire - + Array Tableau - + Hash Hashage - + Symbol table Table de symboles - + Regular expression Expression régulière - + Substitution Substitution - + Backticks Quotes inverses - + Data section Section de données - + Here document delimiter Ici délimiteur de document - + Single-quoted here document Document intégré guillemets simples - + Double-quoted here document Document intégré guillemets doubles - + Backtick here document Document intégré quotes inverses - + Quoted string (q) Chaine quotée (q) - + Quoted string (qq) Chaine quotée (qq) - + Quoted string (qx) Chaine quotée (qx) - + Quoted string (qr) Chaine quotée (qr) - + Quoted string (qw) Chaine quotée (qw) - + POD verbatim POD verbatim - + Subroutine prototype - + Format identifier - + Format body - + Double-quoted string (interpolated variable) - + Translation Traduction - + Regular expression (interpolated variable) - + Substitution (interpolated variable) - + Backticks (interpolated variable) - + Double-quoted here document (interpolated variable) - + Backtick here document (interpolated variable) - + Quoted string (qq, interpolated variable) - + Quoted string (qx, interpolated variable) - + Quoted string (qr, interpolated variable) @@ -2932,82 +2980,82 @@ QsciLexerPostScript - + Default Par défaut - + Comment Commentaire - + DSC comment Commentaire DSC - + DSC comment value - + Number Nombre - + Name Nom - + Keyword Mot-clé - + Literal - + Immediately evaluated literal - + Array parenthesis - + Dictionary parenthesis - + Procedure parenthesis - + Text Texte - + Hexadecimal string - + Base85 string - + Bad string character @@ -3015,32 +3063,32 @@ QsciLexerProperties - + Default Par défaut - + Comment Commentaire - + Section Section - + Assignment Affectation - + Default value Valeur par défaut - + Key Clé @@ -3048,82 +3096,82 @@ QsciLexerPython - + Default Par défaut - + Comment Commentaire - + Number Nombre - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + Keyword Mot-clé - + Triple single-quoted string Chaine de caractères HTML (guillemets simples) - + Triple double-quoted string Chaine de caractères HTML (guillemets simples) - + Class name Nom de classe - + Function or method name Nom de méthode ou de fonction - + Operator Opérateur - + Identifier Identificateur - + Comment block Block de commentaires - + Unclosed string Chaine de caractères non refermée - + Highlighted identifier - + Decorator @@ -3131,157 +3179,157 @@ QsciLexerRuby - + Default Par défaut - + Comment Commentaire - + Number Nombre - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + Keyword Mot-clé - + Class name Nom de classe - + Function or method name Nom de méthode ou de fonction - + Operator Opérateur - + Identifier Identificateur - + Error Erreur - + POD POD - + Regular expression Expression régulière - + Global Global - + Symbol Symbole - + Module name Nom de module - + Instance variable - + Class variable - + Backticks Quotes inverses - + Data section Section de données - + Here document delimiter Ici délimiteur de document - + Here document Ici document - + %q string - + %Q string - + %x string - + %r string - + %w string - + Demoted keyword - + stdin - + stdout - + stderr @@ -3289,112 +3337,112 @@ QsciLexerSQL - + Default Par défaut - + Comment Commentaire - + Number Nombre - + Keyword Mot-clé - + Single-quoted string Chaine de caractères (guillemets simples) - + Operator Opérateur - + Identifier Identificateur - + Comment line Ligne commentée - + JavaDoc style comment Commentaire style JavaDoc - + Double-quoted string Chaine de caractères (guillemets doubles) - + SQL*Plus keyword Mot-clé SQL*Plus - + SQL*Plus prompt Prompt SQL*Plus - + SQL*Plus comment Commentaire SQL*Plus - + # comment line # Ligne commentée - + JavaDoc keyword Mot-clé JavaDoc - + JavaDoc keyword error Erreur de mot-clé JavaDoc - + User defined 1 Définition utilisateur 1 - + User defined 2 Définition utilisateur 2 - + User defined 3 Définition utilisateur 3 - + User defined 4 Définition utilisateur 4 - + Quoted identifier - + Quoted operator @@ -3402,47 +3450,47 @@ QsciLexerSpice - + Default Par défaut - + Identifier Identificateur - + Command Commande - + Function Fonction - + Parameter Paramètre - + Number Nombre - + Delimiter Délimiteur - + Value Valeur - + Comment Commentaire @@ -3450,112 +3498,112 @@ QsciLexerTCL - + Default Par défaut - + Comment Commentaire - + Comment line Ligne commentée - + Number Nombre - + Quoted keyword - + Quoted string - + Operator Opérateur - + Identifier Identificateur - + Substitution Substitution - + Brace substitution - + Modifier - + Expand keyword - + TCL keyword - + Tk keyword - + iTCL keyword - + Tk command - + User defined 1 Définition utilisateur 1 - + User defined 2 Définition utilisateur 2 - + User defined 3 Définition utilisateur 3 - + User defined 4 Définition utilisateur 4 - + Comment box - + Comment block Block de commentaires @@ -3563,32 +3611,32 @@ QsciLexerTeX - + Default Par défaut - + Special Spécial - + Group Groupe - + Symbol Symbole - + Command Commande - + Text Texte @@ -3596,82 +3644,82 @@ QsciLexerVHDL - + Default Par défaut - + Comment Commentaire - + Comment line Ligne commentée - + Number Nombre - + String Chaîne de caractères - + Operator Opérateur - + Identifier Identificateur - + Unclosed string Chaine de caractères non refermée - + Keyword Mot-clé - + Standard operator - + Attribute Attribut - + Standard function - + Standard package - + Standard type - + User defined Définition utilisateur - + Comment block Block de commentaires @@ -3679,122 +3727,172 @@ QsciLexerVerilog - + Default Par défaut - + + Inactive default + + + + Comment Commentaire - + Line comment Commentaire de ligne - + + Inactive line comment + + + + Bang comment - + + Inactive bang comment + + + + Number Nombre - + + Inactive number + + + + Primary keywords and identifiers - + + Inactive primary keywords and identifiers + + + + String Chaîne de caractères - + + Inactive string + + + + Secondary keywords and identifiers Seconds mots-clés et identificateurs - + System task - + + Inactive system task + + + + Preprocessor block - + Operator Opérateur - + + Inactive operator + + + + Identifier Identificateur - + Unclosed string Chaine de caractères non refermée - + + Inactive unclosed string + + + + User defined tasks and identifiers - + + Inactive user defined tasks and identifiers + + + + Keyword comment - + Inactive keyword comment - + Input port declaration - + Inactive input port declaration - + Output port declaration - + Inactive output port declaration - + Input/output port declaration - + Inactive input/output port declaration - + Port connection - + Inactive port connection @@ -3802,52 +3900,52 @@ QsciLexerYAML - + Default Par défaut - + Comment Commentaire - + Identifier Identificateur - + Keyword Mot-clé - + Number Nombre - + Reference Référence - + Document delimiter Délimiteur de document - + Text block marker - + Syntax error marker - + Operator Opérateur @@ -3855,37 +3953,37 @@ QsciScintilla - + &Undo - + &Redo - + Cu&t - + &Copy - + &Paste - + Delete - + Select All diff --git a/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.qm b/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.qm index 60fb61e06..3a03def8d 100644 Binary files a/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.qm and b/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.qm differ diff --git a/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.ts b/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.ts index 93e12dc0e..ee5c479b0 100644 --- a/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.ts +++ b/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.ts @@ -4,493 +4,493 @@ QsciCommand - + Move down one line Mover uma linha para baixo - + Extend selection down one line Extender a seleção uma linha para baixo - + Scroll view down one line Descer a visão uma linha para baixo - + Extend rectangular selection down one line Extender a seleção retangular uma linha para baixo - + Move up one line Mover uma linha para cima - + Extend selection up one line Extender a seleção uma linha para cima - + Scroll view up one line Subir a visão uma linha para cima - + Extend rectangular selection up one line Extender a seleção retangular uma linha para cima - + Move up one paragraph Mover um paragrafo para cima - + Extend selection up one paragraph Extender a seleção um paragrafo para cima - + Move down one paragraph Mover um paragrafo para baixo - + Scroll to start of document - + Scroll to end of document - + Scroll vertically to centre current line - + Extend selection down one paragraph Extender a seleção um paragrafo para baixo - + Move left one character Mover um caractere para a esquerda - + Extend selection left one character Extender a seleção um caractere para esquerda - + Move left one word Mover uma palavra para esquerda - + Extend selection left one word Extender a seleção uma palavra para esquerda - + Extend rectangular selection left one character Extender a seleção retangular um caractere para esquerda - + Move right one character Mover um caractere para direita - + Extend selection right one character Extender a seleção um caractere para direita - + Move right one word Mover uma palavra para direita - + Extend selection right one word Extender a seleção uma palavra para direita - + Extend rectangular selection right one character Extender a seleção retangular um caractere para direita - + Move to end of previous word - + Extend selection to end of previous word - + Move to end of next word - + Extend selection to end of next word - + Move left one word part Mover uma parte da palavra para esquerda - + Extend selection left one word part Extender a seleção uma parte de palavra para esquerda - + Move right one word part Mover uma parte da palavra para direita - + Extend selection right one word part Extender a seleção uma parte de palavra para direita - + Move up one page Mover uma página para cima - + Extend selection up one page Extender a seleção uma página para cima - + Extend rectangular selection up one page Extender a seleção retangular uma página para cima - + Move down one page Mover uma página para baixo - + Extend selection down one page Extender a seleção uma página para baixo - + Extend rectangular selection down one page Extender a seleção retangular uma página para baixo - + Delete current character Excluir caractere atual - + Cut selection Recortar seleção - + Delete word to right Excluir palavra para direita - + Move to start of document line - + Extend selection to start of document line - + Extend rectangular selection to start of document line - + Move to start of display line - + Extend selection to start of display line - + Move to start of display or document line - + Extend selection to start of display or document line - + Move to first visible character in document line - + Extend selection to first visible character in document line - + Extend rectangular selection to first visible character in document line - + Move to first visible character of display in document line - + Extend selection to first visible character in display or document line - + Move to end of document line - + Extend selection to end of document line - + Extend rectangular selection to end of document line - + Move to end of display line - + Extend selection to end of display line - + Move to end of display or document line - + Extend selection to end of display or document line - + Move to start of document - + Extend selection to start of document - + Move to end of document - + Extend selection to end of document - + Stuttered move up one page - + Stuttered extend selection up one page - + Stuttered move down one page - + Stuttered extend selection down one page - + Delete previous character if not at start of line - + Delete right to end of next word - + Delete line to right Excluir linha para direita - + Transpose current and previous lines - + Duplicate the current line - + Select all Select document - + Move selected lines up one line - + Move selected lines down one line - + Toggle insert/overtype Alternar entre modo de inserir/sobreescrever - + Paste Copiar - + Copy selection Copiar seleção - + Insert newline - + De-indent one level - + Cancel Cancelar - + Delete previous character Excluir caractere anterior - + Delete word to left Excluir palavra a esquerda - + Delete line to left Excluir linha a esquerda - + Undo last command - + Redo last command Refazer último comando - + Indent one level Indentar um nível - + Zoom in Aumentar zoom - + Zoom out Diminuir zoom - + Formfeed Alimentação da Página - + Cut current line Configurar linha atual - + Delete current line Excluir linha atual - + Copy current line Copiar linha atual - + Convert selection to lower case Converter a seleção para minúscula - + Convert selection to upper case Converter a seleção para maiúscula - + Duplicate selection @@ -498,77 +498,77 @@ QsciLexerAVS - + Default Padrão - + Block comment - + Nested block comment - + Line comment Comentar Linha - + Number Número - + Operator Operador - + Identifier Identificador - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Triple double-quoted string Cadeia de caracteres envolvida por três aspas duplas - + Keyword Palavra Chave - + Filter - + Plugin - + Function - + Clip property - + User defined @@ -576,72 +576,72 @@ QsciLexerBash - + Default Padrão - + Error Número - + Comment Comentário - + Number Número - + Keyword Palavra Chave - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Operator Operador - + Identifier Identificador - + Scalar Escalar - + Parameter expansion Parâmetro de Expansão - + Backticks Aspas Invertidas - + Here document delimiter Delimitador de "here documents" - + Single-quoted here document "here document" envolvido por aspas simples @@ -649,42 +649,42 @@ QsciLexerBatch - + Default Padrão - + Comment Comentário - + Keyword Palavra Chave - + Label Rótulo - + Hide command character Esconder caractere de comando - + External command Comando externo - + Variable Variável - + Operator Operador @@ -692,77 +692,77 @@ QsciLexerCMake - + Default Padrão - + Comment Comentário - + String Cadeia de Caracteres - + Left quoted string - + Right quoted string - + Function - + Variable Variável - + Label Rótulo - + User defined - + WHILE block - + FOREACH block - + IF block - + MACRO block - + Variable within a string - + Number Número @@ -770,282 +770,282 @@ QsciLexerCPP - + Default Padrão - + Inactive default - + C comment Comentário C - + Inactive C comment - + C++ comment Comentário C++ - + Inactive C++ comment - + JavaDoc style C comment Comentário JavaDoc estilo C - + Inactive JavaDoc style C comment - + Number Número - + Inactive number - + Keyword Palavra Chave - + Inactive keyword - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Inactive double-quoted string - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Inactive single-quoted string - + IDL UUID - + Inactive IDL UUID - + Pre-processor block Instruções de pré-processamento - + Inactive pre-processor block - + Operator Operador - + Inactive operator - + Identifier Identificador - + Inactive identifier - + Unclosed string Cadeia de caracteres não fechada - + Inactive unclosed string - + C# verbatim string - + Inactive C# verbatim string - + JavaScript regular expression Expressão regular JavaScript - + Inactive JavaScript regular expression - + JavaDoc style C++ comment Comentário JavaDoc estilo C++ - + Inactive JavaDoc style C++ comment - + Secondary keywords and identifiers Identificadores e palavras chave secundárias - + Inactive secondary keywords and identifiers - + JavaDoc keyword Palavra chave JavaDoc - + Inactive JavaDoc keyword - + JavaDoc keyword error Erro de palavra chave do JavaDoc - + Inactive JavaDoc keyword error - + Global classes and typedefs Classes e definições de tipo globais - + Inactive global classes and typedefs - + C++ raw string - + Inactive C++ raw string - + Vala triple-quoted verbatim string - + Inactive Vala triple-quoted verbatim string - + Pike hash-quoted string - + Inactive Pike hash-quoted string - + Pre-processor C comment - + Inactive pre-processor C comment - + JavaDoc style pre-processor comment - + Inactive JavaDoc style pre-processor comment - + User-defined literal - + Inactive user-defined literal - + Task marker - + Inactive task marker - + Escape sequence - + Inactive escape sequence @@ -1053,117 +1053,117 @@ QsciLexerCSS - + Default Padrão - + Tag Marcador - + Class selector Seletor de classe - + Pseudo-class Pseudo-classe - + Unknown pseudo-class Pseudo-classe desconhecida - + Operator Operador - + CSS1 property Propriedade CSS1 - + Unknown property Propriedade desconhecida - + Value Valor - + ID selector Seletor de ID - + Important Importante - + @-rule regra-@ - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + CSS2 property Propriedade CSS2 - + Attribute Atributo - + CSS3 property Propriedade CSS2 {3 ?} - + Pseudo-element - + Extended CSS property - + Extended pseudo-class - + Extended pseudo-element - + Media rule - + Variable Variável @@ -1171,7 +1171,7 @@ QsciLexerCSharp - + Verbatim string Cadeia de caracteres no formato verbatim @@ -1179,122 +1179,122 @@ QsciLexerCoffeeScript - + Default Padrão - + C-style comment - + C++-style comment - + JavaDoc C-style comment - + Number Número - + Keyword Palavra Chave - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + IDL UUID - + Pre-processor block Instruções de pré-processamento - + Operator Operador - + Identifier Identificador - + Unclosed string Cadeia de caracteres não fechada - + C# verbatim string - + Regular expression Expressão Regular - + JavaDoc C++-style comment - + Secondary keywords and identifiers Identificadores e palavras chave secundárias - + JavaDoc keyword Palavra chave JavaDoc - + JavaDoc keyword error Erro de palavra chave do JavaDoc - + Global classes - + Block comment - + Block regular expression - + Block regular expression comment - + Instance property @@ -1302,117 +1302,117 @@ QsciLexerD - + Default Padrão - + Block comment - + Line comment Comentar Linha - + DDoc style block comment - + Nesting comment - + Number Número - + Keyword Palavra Chave - + Secondary keyword - + Documentation keyword - + Type definition - + String Cadeia de Caracteres - + Unclosed string Cadeia de caracteres não fechada - + Character Caractere - + Operator Operador - + Identifier Identificador - + DDoc style line comment - + DDoc keyword Palavra chave JavaDoc - + DDoc keyword error Erro de palavra chave do JavaDoc - + Backquoted string - + Raw string - + User defined 1 Definição de usuário 1 - + User defined 2 Definição de usuário 2 - + User defined 3 Definição de usuário 3 @@ -1420,120 +1420,168 @@ QsciLexerDiff - + Default Padrão - + Comment Comentário - + Command Comando - + Header Cabeçalho - + Position Posição - + Removed line Linha Removida - + Added line Linha Adicionada - + Changed line + + QsciLexerEDIFACT + + + Default + Padrão + + + + Segment start + + + + + Segment end + + + + + Element separator + + + + + Composite separator + + + + + Release separator + + + + + UNA segment header + + + + + UNH segment header + + + + + Badly formed segment + + + QsciLexerFortran77 - + Default Padrão - + Comment Comentário - + Number Número - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Unclosed string Cadeia de caracteres não fechada - + Operator Operador - + Identifier Identificador - + Keyword Palavra Chave - + Intrinsic function - + Extended function - + Pre-processor block Instruções de pré-processamento - + Dotted operator - + Label Rótulo - + Continuation @@ -1541,547 +1589,547 @@ QsciLexerHTML - + HTML default HTML por padrão - + Tag Marcador - + Unknown tag Marcador desconhecido - + Attribute Atributo - + Unknown attribute Atributo desconhecido - + HTML number Número HTML - + HTML double-quoted string Cadeia de caracteres HTML envolvida por aspas duplas - + HTML single-quoted string Cadeia de caracteres HTML envolvida por aspas simples - + Other text in a tag Outro texto em um marcador - + HTML comment Comentário HTML - + Entity Entidade - + End of a tag Final de um marcador - + Start of an XML fragment Início de um bloco XML - + End of an XML fragment Final de um bloco XML - + Script tag Marcador de script - + Start of an ASP fragment with @ Início de um bloco ASP com @ - + Start of an ASP fragment Início de um bloco ASP - + CDATA CDATA - + Start of a PHP fragment Início de um bloco PHP - + Unquoted HTML value Valor HTML não envolvido por aspas - + ASP X-Code comment Comentário ASP X-Code - + SGML default SGML por padrão - + SGML command Comando SGML - + First parameter of an SGML command Primeiro parâmetro em um comando SGML - + SGML double-quoted string Cadeia de caracteres SGML envolvida por aspas duplas - + SGML single-quoted string Cadeia de caracteres SGML envolvida por aspas simples - + SGML error Erro SGML - + SGML special entity Entidade especial SGML - + SGML comment Comando SGML - + First parameter comment of an SGML command Primeiro comentário de parâmetro de uma comando SGML - + SGML block default Bloco SGML por padrão - + Start of a JavaScript fragment Início de um bloco Javascript - + JavaScript default JavaScript por padrão - + JavaScript comment Comentário JavaScript - + JavaScript line comment Comentário de linha JavaScript - + JavaDoc style JavaScript comment Comentário JavaScript no estilo JavaDoc - + JavaScript number Número JavaScript - + JavaScript word Palavra JavaScript - + JavaScript keyword Palavra chave JavaScript - + JavaScript double-quoted string Cadeia de caracteres JavaScript envolvida por aspas duplas - + JavaScript single-quoted string Cadeia de caracteres JavaScript envolvida por aspas simples - + JavaScript symbol Símbolo JavaScript - + JavaScript unclosed string Cadeia de caracteres JavaScript não fechada - + JavaScript regular expression Expressão regular JavaScript - + Start of an ASP JavaScript fragment Início de um bloco Javascript ASP - + ASP JavaScript default JavaScript ASP por padrão - + ASP JavaScript comment Comentário JavaScript ASP - + ASP JavaScript line comment Comentário de linha JavaScript ASP - + JavaDoc style ASP JavaScript comment Comentário JavaScript ASP no estilo JavaDoc - + ASP JavaScript number Número JavaScript ASP - + ASP JavaScript word Palavra chave JavaScript ASP - + ASP JavaScript keyword Palavra chave JavaScript ASP - + ASP JavaScript double-quoted string Cadeia de caracteres JavaScript ASP envolvida por aspas duplas - + ASP JavaScript single-quoted string Cadeia de caracteres JavaScript ASP envolvida por aspas simples - + ASP JavaScript symbol Símbolo JavaScript ASP - + ASP JavaScript unclosed string Cadeia de caracteres JavaScript ASP não fechada - + ASP JavaScript regular expression Expressão regular JavaScript ASP - + Start of a VBScript fragment Início de um bloco VBScript - + VBScript default VBScript por padrão - + VBScript comment Comentário VBScript - + VBScript number Número VBScript - + VBScript keyword Palavra chave VBScript - + VBScript string Cadeia de caracteres VBScript - + VBScript identifier Identificador VBScript - + VBScript unclosed string Cadeia de caracteres VBScript não fechada - + Start of an ASP VBScript fragment Início de um bloco VBScript ASP - + ASP VBScript default VBScript ASP por padrão - + ASP VBScript comment Comentário VBScript ASP - + ASP VBScript number Número VBScript ASP - + ASP VBScript keyword Palavra chave VBScript ASP - + ASP VBScript string Cadeia de caracteres VBScript ASP - + ASP VBScript identifier Identificador VBScript ASP - + ASP VBScript unclosed string Cadeia de caracteres VBScript ASP não fechada - + Start of a Python fragment Início de um bloco Python - + Python default Python por padrão - + Python comment Comentário Python - + Python number Número Python - + Python double-quoted string Cadeia de caracteres Python envolvida por aspas duplas - + Python single-quoted string Cadeia de caracteres Python envolvida por aspas simples - + Python keyword Palavra chave Python - + Python triple double-quoted string Cadeia de caracteres Python envolvida por aspas triplas duplas - + Python triple single-quoted string Cadeia de caracteres Python envolvida por aspas triplas simples - + Python class name Nome de classe Python - + Python function or method name Nome de método ou função Python - + Python operator Operador Python - + Python identifier Identificador Python - + Start of an ASP Python fragment Início de um bloco Python ASP - + ASP Python default Python ASP por padrão - + ASP Python comment Comentário Python ASP - + ASP Python number Número Python ASP - + ASP Python double-quoted string Cadeia de caracteres Python ASP envolvida por aspas duplas - + ASP Python single-quoted string Cadeia de caracteres Python ASP envolvida por aspas simples - + ASP Python keyword Palavra chave Python ASP - + ASP Python triple double-quoted string Cadeia de caracteres Python ASP envolvida por aspas triplas duplas - + ASP Python triple single-quoted string Cadeia de caracteres Python ASP envolvida por aspas triplas simples - + ASP Python class name Nome de classe Python ASP - + ASP Python function or method name Nome de método ou função Python ASP - + ASP Python operator Operador Python ASP - + ASP Python identifier Identificador Python ASP - + PHP default PHP por padrão - + PHP double-quoted string Cadeia de caracteres PHP envolvida por aspas duplas - + PHP single-quoted string Cadeia de caracteres PHP envolvida por aspas simples - + PHP keyword Palavra chave PHP - + PHP number Número PHP - + PHP variable Variável PHP - + PHP comment Comentário PHP - + PHP line comment Comentário de linha PHP - + PHP double-quoted variable Variável PHP envolvida por aspas duplas - + PHP operator Operador PHP @@ -2089,7 +2137,7 @@ QsciLexerIDL - + UUID UUID @@ -2097,72 +2145,72 @@ QsciLexerJSON - + Default Padrão - + Number Número - + String Cadeia de Caracteres - + Unclosed string Cadeia de caracteres não fechada - + Property - + Escape sequence - + Line comment Comentar Linha - + Block comment - + Operator Operador - + IRI - + JSON-LD compact IRI - + JSON keyword - + JSON-LD keyword - + Parsing error @@ -2170,7 +2218,7 @@ QsciLexerJavaScript - + Regular expression Expressão Regular @@ -2178,102 +2226,102 @@ QsciLexerLua - + Default Padrão - + Comment Comentário - + Line comment Comentar Linha - + Number Número - + Keyword Palavra Chave - + String Cadeia de Caracteres - + Character Caractere - + Literal string Cadeia de caracteres literal - + Preprocessor Preprocessador - + Operator Operador - + Identifier Identificador - + Unclosed string Cadeia de caracteres não fechada - + Basic functions Funções básicas - + String, table and maths functions Funções de cadeia de caracteres e de tabelas matemáticas - + Coroutines, i/o and system facilities Funções auxiiares, e/s e funções de sistema - + User defined 1 Definição de usuário 1 - + User defined 2 Definição de usuário 2 - + User defined 3 Definição de usuário 3 - + User defined 4 Definição de usuário 4 - + Label Rótulo @@ -2281,37 +2329,37 @@ QsciLexerMakefile - + Default Padrão - + Comment Comentário - + Preprocessor Preprocessador - + Variable Variável - + Operator Operador - + Target Destino - + Error Erro @@ -2319,112 +2367,112 @@ QsciLexerMarkdown - + Default Padrão - + Special Especial - + Strong emphasis using double asterisks - + Strong emphasis using double underscores - + Emphasis using single asterisks - + Emphasis using single underscores - + Level 1 header - + Level 2 header - + Level 3 header - + Level 4 header - + Level 5 header - + Level 6 header - + Pre-char - + Unordered list item - + Ordered list item - + Block quote - + Strike out - + Horizontal rule - + Link - + Code between backticks - + Code between double backticks - + Code block @@ -2432,47 +2480,47 @@ QsciLexerMatlab - + Default Padrão - + Comment Comentário - + Command Comando - + Number Número - + Keyword Palavra Chave - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Operator Operador - + Identifier Identificador - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas @@ -2480,77 +2528,77 @@ QsciLexerPO - + Default Padrão - + Comment Comentário - + Message identifier - + Message identifier text - + Message string - + Message string text - + Message context - + Message context text - + Fuzzy flag - + Programmer comment - + Reference - + Flags - + Message identifier text end-of-line - + Message string text end-of-line - + Message context text end-of-line @@ -2558,87 +2606,87 @@ QsciLexerPOV - + Default Padrão - + Comment Comentário - + Comment line Comentar Linha - + Number Número - + Operator Operador - + Identifier Identificador - + String Cadeia de Caracteres - + Unclosed string Cadeia de caracteres não fechada - + Directive Diretiva - + Bad directive Diretiva ruim - + Objects, CSG and appearance Objetos, CSG e aparência - + Types, modifiers and items Tipos, modificadores e itens - + Predefined identifiers Identificadores predefinidos - + Predefined functions Funções predefinidas - + User defined 1 Definição de usuário 1 - + User defined 2 Definição de usuário 2 - + User defined 3 Definição de usuário 3 @@ -2646,77 +2694,77 @@ QsciLexerPascal - + Default Padrão - + Line comment Comentar Linha - + Number Número - + Keyword Palavra Chave - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Operator Operador - + Identifier Identificador - + '{ ... }' style comment - + '(* ... *)' style comment - + '{$ ... }' style pre-processor block - + '(*$ ... *)' style pre-processor block - + Hexadecimal number - + Unclosed string Cadeia de caracteres não fechada - + Character Caractere - + Inline asm @@ -2724,207 +2772,207 @@ QsciLexerPerl - + Default Padrão - + Error Erro - + Comment Comentário - + POD POD - + Number Número - + Keyword Palavra Chave - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Operator Operador - + Identifier Identificador - + Scalar Escalar - + Array Vetor - + Hash Hash - + Symbol table Tabela de Símbolos - + Regular expression Expressão Regular - + Substitution Substituição - + Backticks Aspas Invertidas - + Data section Seção de dados - + Here document delimiter Delimitador de documentos criados através de redicionadores (>> e >) - + Single-quoted here document "here document" envolvido por aspas simples - + Double-quoted here document "here document" envolvido por aspas duplas - + Backtick here document "here document" envolvido por aspas invertidas - + Quoted string (q) Cadeia de caracteres envolvida por aspas (q) - + Quoted string (qq) Cadeia de caracteres envolvida por aspas (qq) - + Quoted string (qx) Cadeia de caracteres envolvida por aspas (qx) - + Quoted string (qr) Cadeia de caracteres envolvida por aspas (qr) - + Quoted string (qw) Cadeia de caracteres envolvida por aspas (qw) - + POD verbatim POD em formato verbatim - + Subroutine prototype - + Format identifier - + Format body - + Double-quoted string (interpolated variable) - + Translation - + Regular expression (interpolated variable) - + Substitution (interpolated variable) - + Backticks (interpolated variable) - + Double-quoted here document (interpolated variable) - + Backtick here document (interpolated variable) - + Quoted string (qq, interpolated variable) - + Quoted string (qx, interpolated variable) - + Quoted string (qr, interpolated variable) @@ -2932,82 +2980,82 @@ QsciLexerPostScript - + Default Padrão - + Comment Comentário - + DSC comment - + DSC comment value - + Number Número - + Name - + Keyword Palavra Chave - + Literal - + Immediately evaluated literal - + Array parenthesis - + Dictionary parenthesis - + Procedure parenthesis - + Text Texto - + Hexadecimal string - + Base85 string - + Bad string character @@ -3015,32 +3063,32 @@ QsciLexerProperties - + Default Padrão - + Comment Comentário - + Section Seção - + Assignment Atribuição - + Default value Valor Padrão - + Key @@ -3048,82 +3096,82 @@ QsciLexerPython - + Default Padrão - + Comment Comentário - + Number Número - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Keyword Palavra Chave - + Triple single-quoted string Cadeia de caracteres envolvida por três aspas simples - + Triple double-quoted string Cadeia de caracteres envolvida por três aspas duplas - + Class name Nome da classe - + Function or method name Nome da função ou método - + Operator Operador - + Identifier Identificador - + Comment block Bloco de comentários - + Unclosed string Cadeia de caracteres não fechada - + Highlighted identifier - + Decorator @@ -3131,157 +3179,157 @@ QsciLexerRuby - + Default Padrão - + Comment Comentário - + Number Número - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Keyword Palavra Chave - + Class name Nome da classe - + Function or method name Nome da função ou método - + Operator Operador - + Identifier Identificador - + Error - + POD POD - + Regular expression Expressão Regular - + Global - + Symbol Símbolo - + Module name - + Instance variable - + Class variable - + Backticks Aspas Invertidas - + Data section Seção de dados - + Here document delimiter - + Here document - + %q string - + %Q string - + %x string - + %r string - + %w string - + Demoted keyword - + stdin - + stdout - + stderr @@ -3289,112 +3337,112 @@ QsciLexerSQL - + Default Padrão - + Comment Comentário - + Number Número - + Keyword Palavra Chave - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Operator Operador - + Identifier Identificador - + Comment line Comentário de Linha - + JavaDoc style comment Comentário estilo JavaDoc - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + SQL*Plus keyword Palavra chave do SQL*Plus - + SQL*Plus prompt Prompt do SQL*Plus - + SQL*Plus comment Comentário do SQL*Plus - + # comment line Comentário de linha usando # - + JavaDoc keyword Palavra chave JavaDoc - + JavaDoc keyword error Erro de palavra chave do JavaDoc - + User defined 1 Definição de usuário 1 - + User defined 2 Definição de usuário 2 - + User defined 3 Definição de usuário 3 - + User defined 4 Definição de usuário 4 - + Quoted identifier - + Quoted operator @@ -3402,47 +3450,47 @@ QsciLexerSpice - + Default Padrão - + Identifier Identificador - + Command Comando - + Function - + Parameter - + Number Número - + Delimiter - + Value Valor - + Comment Comentário @@ -3450,112 +3498,112 @@ QsciLexerTCL - + Default Padrão - + Comment Comentário - + Comment line - + Number Número - + Quoted keyword - + Quoted string - + Operator Operador - + Identifier Identificador - + Substitution Substituição - + Brace substitution - + Modifier - + Expand keyword - + TCL keyword - + Tk keyword - + iTCL keyword - + Tk command - + User defined 1 Definição de usuário 1 - + User defined 2 Definição de usuário 2 - + User defined 3 Definição de usuário 3 - + User defined 4 Definição de usuário 4 - + Comment box - + Comment block Bloco de comentários @@ -3563,32 +3611,32 @@ QsciLexerTeX - + Default Padrão - + Special Especial - + Group Grupo - + Symbol Símbolo - + Command Comando - + Text Texto @@ -3596,82 +3644,82 @@ QsciLexerVHDL - + Default Padrão - + Comment Comentário - + Comment line - + Number Número - + String Cadeia de Caracteres - + Operator Operador - + Identifier Identificador - + Unclosed string Cadeia de caracteres não fechada - + Keyword Palavra Chave - + Standard operator - + Attribute Atributo - + Standard function - + Standard package - + Standard type - + User defined - + Comment block Bloco de comentários @@ -3679,122 +3727,172 @@ QsciLexerVerilog - + Default Padrão - + + Inactive default + + + + Comment Comentário - + Line comment Comentar Linha - + + Inactive line comment + + + + Bang comment - + + Inactive bang comment + + + + Number Número - + + Inactive number + + + + Primary keywords and identifiers - + + Inactive primary keywords and identifiers + + + + String Cadeia de Caracteres - + + Inactive string + + + + Secondary keywords and identifiers Identificadores e palavras chave secundárias - + System task - + + Inactive system task + + + + Preprocessor block - + Operator Operador - + + Inactive operator + + + + Identifier Identificador - + Unclosed string Cadeia de caracteres não fechada - + + Inactive unclosed string + + + + User defined tasks and identifiers - + + Inactive user defined tasks and identifiers + + + + Keyword comment - + Inactive keyword comment - + Input port declaration - + Inactive input port declaration - + Output port declaration - + Inactive output port declaration - + Input/output port declaration - + Inactive input/output port declaration - + Port connection - + Inactive port connection @@ -3802,52 +3900,52 @@ QsciLexerYAML - + Default Padrão - + Comment Comentário - + Identifier Identificador - + Keyword Palavra Chave - + Number Número - + Reference - + Document delimiter - + Text block marker - + Syntax error marker - + Operator Operador @@ -3855,37 +3953,37 @@ QsciScintilla - + &Undo - + &Redo - + Cu&t - + &Copy - + &Paste - + Delete - + Select All diff --git a/libs/qscintilla/Qt4Qt5/qsciprinter.cpp b/libs/qscintilla/Qt4Qt5/qsciprinter.cpp index aec2f1ab9..aecfe7837 100644 --- a/libs/qscintilla/Qt4Qt5/qsciprinter.cpp +++ b/libs/qscintilla/Qt4Qt5/qsciprinter.cpp @@ -1,6 +1,6 @@ // This module implements the QsciPrinter class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp b/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp index 22d55d669..40421fb1c 100644 --- a/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp +++ b/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp @@ -2,7 +2,7 @@ // Scintilla. It is modelled on QTextEdit - a method of the same name should // behave in the same way. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -264,17 +264,21 @@ void QsciScintilla::handleCharAdded(int ch) // Handle auto-indentation. if (autoInd) + { if (lex.isNull() || (lex->autoIndentStyle() & AiMaintain)) maintainIndentation(ch, pos); else autoIndentation(ch, pos); + } // See if we might want to start auto-completion. if (!isCallTipActive() && acSource != AcsNone) + { if (isStartChar(ch)) startAutoCompletion(acSource, false, use_single == AcusAlways); else if (acThresh >= 1 && isWordCharacter(ch)) startAutoCompletion(acSource, true, use_single == AcusAlways); + } } @@ -386,13 +390,8 @@ void QsciScintilla::callTip() ct = ct_entries.join("\n"); } - QByteArray ct_ba; - if (isUtf8()) - ct_ba = ct.toUtf8(); - else - ct_ba = ct.toLatin1(); - - const char *cts = ct_ba.data(); + ScintillaBytes ct_bytes = textAsBytes(ct); + const char *cts = ScintillaBytesConstData(ct_bytes); SendScintilla(SCI_CALLTIPSHOW, adjustedCallTipPosition(shift), cts); @@ -856,12 +855,16 @@ void QsciScintilla::autoIndentLine(long pos, int line, int indent) long new_pos = -1; if (pos_after > pos_before) + { new_pos = pos + (pos_after - pos_before); + } else if (pos_after < pos_before && pos >= pos_after) + { if (pos >= pos_before) new_pos = pos + (pos_after - pos_before); else new_pos = pos_after; + } if (new_pos >= 0) SendScintilla(SCI_SETSEL, new_pos, new_pos); @@ -1276,6 +1279,9 @@ void QsciScintilla::setWrapVisualFlags(WrapVisualFlag endFlag, switch (endFlag) { + case WrapFlagNone: + break; + case WrapFlagByText: flags |= SC_WRAPVISUALFLAG_END; loc |= SC_WRAPVISUALFLAGLOC_END_BY_TEXT; @@ -1292,6 +1298,9 @@ void QsciScintilla::setWrapVisualFlags(WrapVisualFlag endFlag, switch (startFlag) { + case WrapFlagNone: + break; + case WrapFlagByText: flags |= SC_WRAPVISUALFLAG_START; loc |= SC_WRAPVISUALFLAGLOC_START_BY_TEXT; @@ -1336,6 +1345,9 @@ void QsciScintilla::setFolding(FoldStyle folding, int margin) // Set the marker symbols to use. switch (folding) { + case NoFoldStyle: + break; + case PlainFoldStyle: setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_MINUS); setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_PLUS); @@ -1636,6 +1648,12 @@ void QsciScintilla::handleModified(int pos, int mtype, const char *text, int len, int added, int line, int foldNow, int foldPrev, int token, int annotationLinesAdded) { + Q_UNUSED(pos); + Q_UNUSED(text); + Q_UNUSED(len); + Q_UNUSED(token); + Q_UNUSED(annotationLinesAdded); + if (mtype & SC_MOD_CHANGEFOLD) { if (fold) @@ -2086,7 +2104,7 @@ void QsciScintilla::setCaretLineVisible(bool enable) // Set the background colour of a hotspot area. void QsciScintilla::setHotspotBackgroundColor(const QColor &col) { - SendScintilla(SCI_SETSELBACK, 1, col); + SendScintilla(SCI_SETHOTSPOTACTIVEBACK, 1, col); } @@ -2100,7 +2118,7 @@ void QsciScintilla::setHotspotForegroundColor(const QColor &col) // Reset the background colour of a hotspot area to the default. void QsciScintilla::resetHotspotBackgroundColor() { - SendScintilla(SCI_SETSELBACK, 0UL); + SendScintilla(SCI_SETHOTSPOTACTIVEBACK, 0UL); } @@ -4334,6 +4352,29 @@ bool QsciScintilla::event(QEvent *e) } +// Re-implemented to zoom when the Control modifier is pressed. +void QsciScintilla::wheelEvent(QWheelEvent *e) +{ +#if defined(Q_OS_MAC) + const Qt::KeyboardModifier zoom_modifier = Qt::MetaModifier; +#else + const Qt::KeyboardModifier zoom_modifier = Qt::ControlModifier; +#endif + + if ((e->modifiers() & zoom_modifier) != 0) + { + if (e->delta() > 0) + zoomIn(); + else + zoomOut(); + } + else + { + QsciScintillaBase::wheelEvent(e); + } +} + + // Re-implemented to handle chenges to the enabled state. void QsciScintilla::changeEvent(QEvent *e) { @@ -4396,12 +4437,15 @@ void QsciScintilla::setEnabledColors(int style, QColor &fore, QColor &back) // Re-implemented to implement a more Qt-like context menu. void QsciScintilla::contextMenuEvent(QContextMenuEvent *e) { - QMenu *menu = createStandardContextMenu(); - - if (menu) + if (contextMenuNeeded(e->x(), e->y())) { - menu->setAttribute(Qt::WA_DeleteOnClose); - menu->popup(e->globalPos()); + QMenu *menu = createStandardContextMenu(); + + if (menu) + { + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->popup(e->globalPos()); + } } } @@ -4482,22 +4526,29 @@ static QColor asQColor(long sci_colour) ((int)(sci_colour >> 16)) & 0x00ff); } + +// Set the scroll width. void QsciScintilla::setScrollWidth(int pixelWidth) { SendScintilla(SCI_SETSCROLLWIDTH, pixelWidth); } -int QsciScintilla::getScrollWidth() const +// Get the scroll width. +int QsciScintilla::scrollWidth() const { return SendScintilla(SCI_GETSCROLLWIDTH); } + +// Set scroll width tracking. void QsciScintilla::setScrollWidthTracking(bool enabled) { SendScintilla(SCI_SETSCROLLWIDTHTRACKING, enabled); } -bool QsciScintilla::getScrollWidthTracking() const + +// Get scroll width tracking. +bool QsciScintilla::scrollWidthTracking() const { return SendScintilla(SCI_GETSCROLLWIDTHTRACKING); } diff --git a/libs/qscintilla/Qt4Qt5/qsciscintillabase.cpp b/libs/qscintilla/Qt4Qt5/qsciscintillabase.cpp index 75431fa4f..568039cf3 100644 --- a/libs/qscintilla/Qt4Qt5/qsciscintillabase.cpp +++ b/libs/qscintilla/Qt4Qt5/qsciscintillabase.cpp @@ -1,6 +1,6 @@ // This module implements the "official" low-level API. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -38,6 +38,7 @@ #include #include +#include "SciAccessibility.h" #include "ScintillaQt.h" @@ -89,6 +90,10 @@ QsciScintillaBase::QsciScintillaBase(QWidget *parent) , clickCausedFocus(false) #endif { +#if !defined(QT_NO_ACCESSIBILITY) + QsciAccessibleScintillaBase::initialise(); +#endif + connectVerticalScrollBar(); connectHorizontalScrollBar(); @@ -298,6 +303,16 @@ void *QsciScintillaBase::SendScintillaPtrResult(unsigned int msg) const } +// Re-implemented to handle font changes +void QsciScintillaBase::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::FontChange || e->type() == QEvent::ApplicationFontChange) + sci->InvalidateStyleRedraw(); + + QAbstractScrollArea::changeEvent(e); +} + + // Re-implemented to handle the context menu. void QsciScintillaBase::contextMenuEvent(QContextMenuEvent *e) { @@ -827,3 +842,19 @@ void QsciScintillaBase::replaceHorizontalScrollBar(QScrollBar *scrollBar) setHorizontalScrollBar(scrollBar); connectHorizontalScrollBar(); } + + +// Return true if a context menu should be displayed. This is provided as a +// helper to QsciScintilla::contextMenuEvent(). A proper design would break +// backwards compatibility. +bool QsciScintillaBase::contextMenuNeeded(int x, int y) const +{ + QSCI_SCI_NAMESPACE(Point) pt(x, y); + + // Clear any selection if the mouse is outside. + if (!sci->PointInSelection(pt)) + sci->SetEmptySelection(sci->PositionFromLocation(pt)); + + // Respect SC_POPUP_*. + return sci->ShouldDisplayPopup(pt); +} diff --git a/libs/qscintilla/Qt4Qt5/qscistyle.cpp b/libs/qscintilla/Qt4Qt5/qscistyle.cpp index bff425343..10f7ae3d8 100644 --- a/libs/qscintilla/Qt4Qt5/qscistyle.cpp +++ b/libs/qscintilla/Qt4Qt5/qscistyle.cpp @@ -1,6 +1,6 @@ // This module implements the QsciStyle class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -87,6 +87,10 @@ void QsciStyle::init(int style) // Apply the style to a particular editor. void QsciStyle::apply(QsciScintillaBase *sci) const { + // Don't do anything if the style is invalid. + if (style_nr < 0) + return; + sci->SendScintilla(QsciScintillaBase::SCI_STYLESETFORE, style_nr, style_color); sci->SendScintilla(QsciScintillaBase::SCI_STYLESETBACK, style_nr, diff --git a/libs/qscintilla/Qt4Qt5/qscistyledtext.cpp b/libs/qscintilla/Qt4Qt5/qscistyledtext.cpp index 10ce75ab4..5e02cbf6c 100644 --- a/libs/qscintilla/Qt4Qt5/qscistyledtext.cpp +++ b/libs/qscintilla/Qt4Qt5/qscistyledtext.cpp @@ -1,6 +1,6 @@ // This module implements the QsciStyledText class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff --git a/src/EditDialog.cpp b/src/EditDialog.cpp index 8c670c11f..f0b6891d7 100644 --- a/src/EditDialog.cpp +++ b/src/EditDialog.cpp @@ -33,6 +33,7 @@ EditDialog::EditDialog(QWidget* parent) // Add Ctrl-Enter (Cmd-Enter on OSX) as a shortcut for the Apply button ui->buttonApply->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Return)); + ui->buttonApply->setToolTip(ui->buttonApply->toolTip() + " [" + ui->buttonApply->shortcut().toString(QKeySequence::NativeText) + "]"); QHBoxLayout* hexLayout = new QHBoxLayout(ui->editorBinary); hexEdit = new QHexEdit(this); diff --git a/src/EditDialog.ui b/src/EditDialog.ui index 6a4910bc7..4bfe74603 100644 --- a/src/EditDialog.ui +++ b/src/EditDialog.ui @@ -293,7 +293,7 @@ Errors are indicated with a red squiggle underline. - Apply data to cell [Ctrl+Return] + Apply data to cell This button saves the changes performed in the cell editor to the database cell. diff --git a/src/EditTableDialog.cpp b/src/EditTableDialog.cpp index bab5878ab..9f5f05cc1 100644 --- a/src/EditTableDialog.cpp +++ b/src/EditTableDialog.cpp @@ -323,7 +323,7 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column) // Update the field name in the map of old column names to new column names if(!m_bNewTable) { - for(const auto& key : trackColumns) + for(const auto& key : trackColumns.keys()) { if(trackColumns[key] == oldFieldName) trackColumns[key] = field.name(); @@ -588,7 +588,7 @@ void EditTableDialog::removeField() // Update the map of tracked columns to indicate the column is deleted QString name = ui->treeWidget->currentItem()->text(0); - for(const auto& key : trackColumns) + for(const auto& key : trackColumns.keys()) { if(trackColumns[key] == name) trackColumns[key] = QString(); diff --git a/src/ExtendedScintilla.cpp b/src/ExtendedScintilla.cpp index c615008cc..ec3fc086a 100644 --- a/src/ExtendedScintilla.cpp +++ b/src/ExtendedScintilla.cpp @@ -211,7 +211,8 @@ bool ExtendedScintilla::findText(QString text, bool regexp, bool caseSensitive, setCursorPosition(lineFrom, indexFrom); } - return findFirst(text, regexp, caseSensitive, words, wrap, forward); + return findFirst(text, regexp, caseSensitive, words, wrap, forward, + /* line */ -1, /* index */ -1, /* show */ true, /* posix */ true); } void ExtendedScintilla::clearSelection() diff --git a/src/FindReplaceDialog.cpp b/src/FindReplaceDialog.cpp index 300805dcb..7fe762e09 100644 --- a/src/FindReplaceDialog.cpp +++ b/src/FindReplaceDialog.cpp @@ -1,11 +1,13 @@ #include "FindReplaceDialog.h" #include "ui_FindReplaceDialog.h" +#include "ExtendedScintilla.h" #include FindReplaceDialog::FindReplaceDialog(QWidget* parent) : QDialog(parent), - ui(new Ui::FindReplaceDialog) + ui(new Ui::FindReplaceDialog), + findInProgress(false) { // Create UI ui->setupUi(this); @@ -33,29 +35,73 @@ void FindReplaceDialog::setExtendedScintilla(ExtendedScintilla* scintilla) connect(m_scintilla, SIGNAL(destroyed()), this, SLOT(hide())); connect(ui->findText, SIGNAL(editingFinished()), this, SLOT(cancelFind())); + connect(ui->regexpCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->caseCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->wholeWordsCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->wrapCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->backwardsCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->selectionCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->selectionCheckBox, &QCheckBox::toggled, ui->wrapCheckBox, &QCheckBox::setDisabled); } -bool FindReplaceDialog::findNext() +bool FindReplaceDialog::findFirst(bool wrap, bool forward) { - clearIndicators(); - - bool found = m_scintilla->findText + if (ui->selectionCheckBox->isChecked()) + return m_scintilla->findFirstInSelection + (ui->findText->text(), + ui->regexpCheckBox->isChecked(), + ui->caseCheckBox->isChecked(), + ui->wholeWordsCheckBox->isChecked(), + forward, + /* show */ true, + /* posix */ true); + else + return m_scintilla->findFirst (ui->findText->text(), ui->regexpCheckBox->isChecked(), ui->caseCheckBox->isChecked(), ui->wholeWordsCheckBox->isChecked(), - ui->wrapCheckBox->isChecked(), - !ui->backwardsCheckBox->isChecked()); - if (!found) + wrap, + forward, + /* line */ -1, + /* index */ -1, + /* show */ true, + /* posix */ true); +} + +bool FindReplaceDialog::findNext() +{ + clearIndicators(); + + if (findInProgress) + findInProgress = m_scintilla->findNext(); + else + findInProgress = findFirst(ui->wrapCheckBox->isChecked(), + !ui->backwardsCheckBox->isChecked()); + + if (!findInProgress) ui->messageLabel->setText(tr("The searched text was not found")); - return found; + return findInProgress; } void FindReplaceDialog::show() { ui->findText->setFocus(); + + // If there is multi-line selected text set automatically the selection + // check box. If it's only part of a line, use it as text to find. + if (m_scintilla->hasSelectedText()) + if (m_scintilla->selectedText().contains("\n")) + ui->selectionCheckBox->setChecked(true); + else { + ui->findText->setText(m_scintilla->selectedText()); + ui->selectionCheckBox->setChecked(false); + } + else + ui->selectionCheckBox->setChecked(false); + ui->findText->selectAll(); QDialog::show(); } @@ -72,24 +118,27 @@ void FindReplaceDialog::indicateSelection() int fromRow, fromIndex, toRow, toIndex; m_scintilla->getSelection(&fromRow, &fromIndex, &toRow, &toIndex); m_scintilla->fillIndicatorRange(fromRow, fromIndex, toRow, toIndex, foundIndicatorNumber); - } -void FindReplaceDialog::findAll() + +void FindReplaceDialog::searchAll(bool replace) { clearIndicators(); + if (!ui->selectionCheckBox->isChecked()) + m_scintilla->setCursorPosition(0, 0); + + bool found = findFirst(/* wrap */ false, /* fordward */ true); + int occurrences = 0; - m_scintilla->setCursorPosition(0, 0); - while (m_scintilla->findText - (ui->findText->text(), - ui->regexpCheckBox->isChecked(), - ui->caseCheckBox->isChecked(), - ui->wholeWordsCheckBox->isChecked(), - false, - true)) { + while (found) { + if (replace) + m_scintilla->replace(ui->replaceWithText->text()); indicateSelection(); ++occurrences; + found = m_scintilla->findNext(); } - m_scintilla->clearSelection(); + + if (!ui->selectionCheckBox->isChecked()) + m_scintilla->clearSelection(); QString message; switch (occurrences) { @@ -97,55 +146,39 @@ void FindReplaceDialog::findAll() message = tr("The searched text was not found."); break; case 1: - message = tr("The searched text was found one time."); + if (replace) + message = tr("The searched text was replaced one time."); + else + message = tr("The searched text was found one time."); break; default: - message = tr("The searched text was found %1 times.").arg(occurrences); + if (replace) + message = tr("The searched text was replaced %1 times.").arg(occurrences); + else + message = tr("The searched text was found %1 times.").arg(occurrences); + break; } ui->messageLabel->setText(message); } -void FindReplaceDialog::replaceAll() +void FindReplaceDialog::findAll() { - clearIndicators(); - int occurrences = 0; - m_scintilla->setCursorPosition(0, 0); - while (m_scintilla->findText - (ui->findText->text(), - ui->regexpCheckBox->isChecked(), - ui->caseCheckBox->isChecked(), - ui->wholeWordsCheckBox->isChecked(), - false, - true)) { - m_scintilla->replace(ui->replaceWithText->text()); - indicateSelection(); - ++occurrences; - } - m_scintilla->clearSelection(); - - QString message; - switch (occurrences) { - case 0: - message = tr("The searched text was not found."); - break; - case 1: - message = tr("The searched text was replaced one time."); - break; - default: - message = tr("The searched text was replaced %1 times.").arg(occurrences); - break; - } - - ui->messageLabel->setText(message); + searchAll(/* replace */ false); +} +void FindReplaceDialog::replaceAll() +{ + searchAll(/* replace */ true); } void FindReplaceDialog::cancelFind() { m_scintilla->findFirst(QString(), false, false, false, false); clearIndicators(); + findInProgress = false; + ui->messageLabel->setText(""); } void FindReplaceDialog::help() { diff --git a/src/FindReplaceDialog.h b/src/FindReplaceDialog.h index 97d9b53dc..6bc05a9a3 100644 --- a/src/FindReplaceDialog.h +++ b/src/FindReplaceDialog.h @@ -1,11 +1,11 @@ #ifndef FindReplaceDialog_H #define FindReplaceDialog_H -#include - #include #include +class ExtendedScintilla; + namespace Ui { class FindReplaceDialog; } @@ -33,11 +33,14 @@ private slots: void buttonBox_clicked(QAbstractButton* button); private: + bool findFirst(bool wrap, bool forward); + void searchAll(bool replace); void indicateSelection(); void clearIndicators(); Ui::FindReplaceDialog* ui; ExtendedScintilla* m_scintilla; int foundIndicatorNumber; + bool findInProgress; }; #endif diff --git a/src/FindReplaceDialog.ui b/src/FindReplaceDialog.ui index 689e6e6ac..6d947f9f8 100644 --- a/src/FindReplaceDialog.ui +++ b/src/FindReplaceDialog.ui @@ -101,6 +101,16 @@ + + + <html><head/><body><p>When checked, the pattern to find is searched only in the current selection.</p></body></html> + + + &Selection only + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> @@ -210,6 +220,7 @@ wholeWordsCheckBox wrapCheckBox backwardsCheckBox + selectionCheckBox regexpCheckBox findNextButton replaceButton diff --git a/src/ImportCsvDialog.h b/src/ImportCsvDialog.h index 546bdafb6..cc402634f 100644 --- a/src/ImportCsvDialog.h +++ b/src/ImportCsvDialog.h @@ -9,7 +9,6 @@ class DBBrowserDB; class QCompleter; -class QListWidgetItem; namespace Ui { class ImportCsvDialog; diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 0e6543a99..36d4ac2de 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -28,7 +28,9 @@ #include "FindReplaceDialog.h" #include "Data.h" #include "CondFormat.h" +#include "RunSql.h" +#include #include #include #include @@ -39,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -112,7 +113,8 @@ MainWindow::MainWindow(QWidget* parent) plotDock(new PlotDock(this)), remoteDock(new RemoteDock(this)), findReplaceDialog(new FindReplaceDialog(this)), - gotoValidator(new QIntValidator(0, 0, this)) + gotoValidator(new QIntValidator(0, 0, this)), + execute_sql_worker(nullptr) { ui->setupUi(this); init(); @@ -128,6 +130,35 @@ MainWindow::~MainWindow() delete ui; } +// Functions for documenting the shortcuts in the user interface using native names +static QString shortcutsTip(const QList& keys) +{ + QString tip(""); + + if (!keys.isEmpty()) { + tip = " ["; + + for (auto shortcut : keys) + tip.append(shortcut.toString(QKeySequence::NativeText) + ", "); + tip.chop(2); + + tip.append("]"); + } + return tip; +} + +static void addShortcutsTooltip(QWidget* widget, const QList& keys) +{ + if (!keys.isEmpty()) + widget->setToolTip(widget->toolTip() + shortcutsTip(keys)); +} + +static void addShortcutsTooltip(QAction* action, const QList& extraKeys = QList()) +{ + if (!action->shortcuts().isEmpty() || !extraKeys.isEmpty()) + action->setToolTip(action->toolTip() + shortcutsTip(action->shortcuts() + extraKeys)); +} + void MainWindow::init() { // Load window settings @@ -143,8 +174,8 @@ void MainWindow::init() #endif // Connect SQL logging and database state setting to main window - connect(&db, SIGNAL(dbChanged(bool)), this, SLOT(dbState(bool))); - connect(&db, SIGNAL(sqlExecuted(QString, int)), this, SLOT(logSql(QString,int))); + connect(&db, &DBBrowserDB::dbChanged, this, &MainWindow::dbState, Qt::QueuedConnection); + connect(&db, &DBBrowserDB::sqlExecuted, this, &MainWindow::logSql, Qt::QueuedConnection); connect(&db, &DBBrowserDB::requestCollation, this, &MainWindow::requestCollation); // Set the validator for the goto line edit @@ -161,11 +192,11 @@ void MainWindow::init() // Set up DB structure tab dbStructureModel = new DbStructureModel(db, this); - connect(&db, &DBBrowserDB::structureUpdated, [this]() { + connect(&db, &DBBrowserDB::structureUpdated, this, [this]() { QString old_table = ui->comboBrowseTable->currentText(); dbStructureModel->reloadData(); populateStructure(old_table); - }); + }, Qt::QueuedConnection); ui->dbTreeWidget->setModel(dbStructureModel); ui->dbTreeWidget->setColumnWidth(DbStructureModel::ColumnName, 300); ui->dbTreeWidget->setColumnHidden(DbStructureModel::ColumnObjectType, true); @@ -195,9 +226,6 @@ void MainWindow::init() ui->comboLogSubmittedBy->setCurrentIndex(ui->comboLogSubmittedBy->findText(Settings::getValue("SQLLogDock", "Log").toString())); // Add keyboard shortcuts - QList shortcuts = ui->actionExecuteSql->shortcuts(); - shortcuts.push_back(QKeySequence(tr("Ctrl+Return"))); - ui->actionExecuteSql->setShortcuts(shortcuts); QShortcut* shortcutBrowseRefreshF5 = new QShortcut(QKeySequence("F5"), this); connect(shortcutBrowseRefreshF5, SIGNAL(activated()), this, SLOT(refresh())); @@ -388,6 +416,11 @@ void MainWindow::init() plotDock->updatePlot(m_browseTableModel, &settings, true, false); }); + connect(ui->actionSqlStop, &QAction::triggered, [this]() { + if(execute_sql_worker && execute_sql_worker->isRunning()) + execute_sql_worker->stop(); + }); + // Lambda function for keyboard shortcuts for selecting next/previous table in Browse Data tab connect(ui->dataTable, &ExtendedTableWidget::switchTable, [this](bool next) { int index = ui->comboBrowseTable->currentIndex(); @@ -422,6 +455,20 @@ void MainWindow::init() setAcceptDrops(true); setWindowTitle(QApplication::applicationName()); + // Add the documentation of shortcuts, which aren't otherwise visible in the user interface, to some buttons. + + addShortcutsTooltip(ui->actionDbPrint); + + addShortcutsTooltip(ui->buttonRefresh, {shortcutBrowseRefreshF5->key(), shortcutBrowseRefreshCtrlR->key()}); + addShortcutsTooltip(ui->buttonPrintTable, {shortcutPrint->key()}); + + addShortcutsTooltip(ui->actionSqlPrint); + addShortcutsTooltip(ui->actionExecuteSql, {shortcutBrowseRefreshF5->key(), shortcutBrowseRefreshCtrlR->key()}); + addShortcutsTooltip(ui->actionSqlExecuteLine); + addShortcutsTooltip(ui->actionSqlFind); + addShortcutsTooltip(ui->actionSqlFindReplace); + addShortcutsTooltip(ui->actionSqlToggleComment); + // Load all settings reloadSettings(); @@ -713,6 +760,9 @@ void MainWindow::populateTable() if(only_defaults) query.selectedColumns().clear(); + // Unlock view editing + query.setRowIdColumn(storedData.unlockViewPk.toStdString()); + // Apply query m_browseTableModel->setQuery(query); @@ -793,6 +843,19 @@ void MainWindow::applyBrowseTableSettings(BrowseDataTableSettings storedData, bo bool MainWindow::fileClose() { + // Stop any running SQL statements before closing the database + if(execute_sql_worker && execute_sql_worker->isRunning()) + { + if(QMessageBox::warning(this, qApp->applicationName(), + tr("You are still executing SQL statements. When closing the database now the execution will be stopped. maybe " + "leaving the database in an incosistent state. Are you sure you want to close the database?"), + QMessageBox::Yes, QMessageBox::Cancel | QMessageBox::Default | QMessageBox::Escape) == QMessageBox::Cancel) + return false; + + execute_sql_worker->stop(); + execute_sql_worker->wait(); + } + // Close the database but stop the closing process here if the user pressed the cancel button in there if(!db.close()) return false; @@ -1220,33 +1283,11 @@ void MainWindow::dataTableSelectionChanged(const QModelIndex& index) } } -MainWindow::StatementType MainWindow::getQueryType(const QString& query) const -{ - // Helper function for getting the type of a given query - - if(query.startsWith("SELECT", Qt::CaseInsensitive)) return SelectStatement; - if(query.startsWith("ALTER", Qt::CaseInsensitive)) return AlterStatement; - if(query.startsWith("DROP", Qt::CaseInsensitive)) return DropStatement; - if(query.startsWith("ROLLBACK", Qt::CaseInsensitive)) return RollbackStatement; - if(query.startsWith("PRAGMA", Qt::CaseInsensitive)) return PragmaStatement; - if(query.startsWith("VACUUM", Qt::CaseInsensitive)) return VacuumStatement; - if(query.startsWith("INSERT", Qt::CaseInsensitive)) return InsertStatement; - if(query.startsWith("UPDATE", Qt::CaseInsensitive)) return UpdateStatement; - if(query.startsWith("DELETE", Qt::CaseInsensitive)) return DeleteStatement; - if(query.startsWith("CREATE", Qt::CaseInsensitive)) return CreateStatement; - if(query.startsWith("ATTACH", Qt::CaseInsensitive)) return AttachStatement; - if(query.startsWith("DETACH", Qt::CaseInsensitive)) return DetachStatement; - - return OtherStatement; -} - /* * I'm still not happy how the results are represented to the user * right now you only see the result of the last executed statement. * A better experience would be tabs on the bottom with query results * for all the executed statements. - * Or at least a some way the use could see results/status message - * per executed statement. */ void MainWindow::executeQuery() { @@ -1255,19 +1296,37 @@ void MainWindow::executeQuery() if(!db.isOpen()) return; + // Check if other task is still running and stop it if necessary + if(execute_sql_worker && execute_sql_worker->isRunning()) + { + // Ask the user and do nothing if he/she doesn't want to interrupt the running query + if(QMessageBox::warning(this, qApp->applicationName(), + tr("You are already executing SQL statements. Do you want to stop them in order to execute the current " + "statements instead? Note that this might leave the database in an inconsistent state."), + QMessageBox::Yes, QMessageBox::Cancel | QMessageBox::Default | QMessageBox::Escape) == QMessageBox::Cancel) + return; + + // Stop the running query + execute_sql_worker->stop(); + execute_sql_worker->wait(); + } + // Get current SQL tab and editor SqlExecutionArea* sqlWidget = qobject_cast(ui->tabSqlAreas->currentWidget()); SqlTextEdit* editor = sqlWidget->getEditor(); + auto* current_tab = ui->tabSqlAreas->currentWidget(); const QString tabName = ui->tabSqlAreas->tabText(ui->tabSqlAreas->currentIndex()).remove('&'); + // Remove any error indicators + editor->clearErrorIndicators(); + // Determine execution mode: execute all, execute selection or execute current line enum executionMode { All, Selection, Line - }; - executionMode mode; + } mode; if(sender() && sender()->objectName() == "actionSqlExecuteLine") mode = Line; else if(!sqlWidget->getSelectedSql().isEmpty()) @@ -1276,22 +1335,19 @@ void MainWindow::executeQuery() mode = All; // Get SQL code to execute. This depends on the execution mode. - QString query = sqlWidget->getSql(); - int execute_from_line = 0; // These three variables hold the start position - int execute_from_index = 0; // of the executed statements in the entire - int execute_from_position = 0; // SQL code of the current SQL tab. - int execute_to_line = 0; // These three variables hold the end position - int execute_to_index = 0; // of the executed statements in the entire - int execute_to_position = 0; // SQL code of the current SQL tab. + int execute_from_position = 0; // Where we want to start the execution in the query string + int execute_to_position = 0; // Where we roughly want to end the execution in the query string switch(mode) { case Selection: { // Start and end positions are start and end positions from the selection + int execute_from_line, execute_from_index, execute_to_line, execute_to_index; editor->getSelection(&execute_from_line, &execute_from_index, &execute_to_line, &execute_to_index); execute_from_position = editor->positionFromLineIndex(execute_from_line, execute_from_index); execute_to_position = editor->positionFromLineIndex(execute_to_line, execute_to_index); + db.logSQL(tr("-- EXECUTING SELECTION IN '%1'\n--").arg(tabName), kLogMsg_User); } break; case Line: @@ -1300,21 +1356,19 @@ void MainWindow::executeQuery() // statement which started on one the previous line. In that case the start position is actually a bit earlier. For // the end position we set the last character of the current line. If the statement(s) continue(s) into the next line, // SQLite will execute it/them anyway and we'll stop afterwards. - int dummy; + int execute_from_line, dummy; editor->getCursorPosition(&execute_from_line, &dummy); execute_from_position = editor->positionFromLineIndex(execute_from_line, 0); // Need to set the end position here before adjusting the start line - execute_to_line = execute_from_line; - execute_to_index = editor->text(execute_to_line).length() - 1; // The -1 compensates for the line break at the end of the line + int execute_to_line = execute_from_line; + int execute_to_index = editor->text(execute_to_line).length() - 1; // The -1 compensates for the line break at the end of the line execute_to_position = editor->positionFromLineIndex(execute_to_line, execute_to_index); - QByteArray firstPartEntireSQL = query.toUtf8().left(execute_from_position); + QByteArray firstPartEntireSQL = sqlWidget->getSql().toUtf8().left(execute_from_position); if(firstPartEntireSQL.lastIndexOf(';') != -1) - { execute_from_position -= firstPartEntireSQL.length() - firstPartEntireSQL.lastIndexOf(';') - 1; - editor->lineIndexFromPosition(execute_from_position, &execute_from_line, &execute_from_index); - } + db.logSQL(tr("-- EXECUTING LINE IN '%1'\n--").arg(tabName), kLogMsg_User); } break; case All: @@ -1322,183 +1376,15 @@ void MainWindow::executeQuery() // Start position is the first byte, end position the last. // Note that we use byte positions that might differ from character positions. execute_to_position = editor->length(); - editor->lineIndexFromPosition(execute_to_position, &execute_to_line, &execute_to_index); + db.logSQL(tr("-- EXECUTING ALL IN '%1'\n--").arg(tabName), kLogMsg_User); } break; } - // Cancel if there is nothing to execute - if(query.trimmed().isEmpty() || query.trimmed() == ";" || execute_from_position == execute_to_position || - query.mid(execute_from_position, execute_to_position-execute_from_position).trimmed().isEmpty() || - query.mid(execute_from_position, execute_to_position-execute_from_position).trimmed() == ";") - return; - - // All replacements in the query should be made by the same amount of characters, so the positions in the file - // for error indicators and line and column logs are not displaced. - // Whitespace and comments are discarded by SQLite, so it is better to just let it ignore them. - query = query.replace(QRegExp("^(\\s*)BEGIN TRANSACTION;", Qt::CaseInsensitive), "\\1 "); - query = query.replace(QRegExp("COMMIT;(\\s*)$", Qt::CaseInsensitive), " \\1"); - - // Convert query to C string which we will use from now on, starting from the determined start position and - // until the end of the SQL code. By doing so we go further than the determined end position because in Line - // mode the last statement might go beyond that point. - QByteArray utf8Query = query.toUtf8().mid(execute_from_position); - - // Remove any error indicators - editor->clearErrorIndicators(); - - // Set cursor and start execution timer - QApplication::setOverrideCursor(Qt::BusyCursor); - QElapsedTimer timer; - timer.start(); - - // Prepare execution - sqlite3_stmt* vm; - const char* tail = utf8Query.data(); - int sql3status = SQLITE_OK; - int tail_length = utf8Query.length(); - QString statusMessage; - bool ok = false; - bool modified = false; - const bool wasdirty = db.getDirty(); - bool structure_updated = false; - bool savepoint_created = false; - - // Accept multi-line queries, by looping until the tail is empty - while(tail && *tail != 0 && (sql3status == SQLITE_OK || sql3status == SQLITE_DONE)) - { - // What type of query is this? - QString qtail = QString(tail).trimmed(); - // Remove trailing comments so we don't get fooled by some trailing text at the end of the stream. - // Otherwise we'll pass them to SQLite and its execution will trigger a savepoint that wouldn't be - // reverted. - SqliteTableModel::removeCommentsFromQuery(qtail); - if (qtail.isEmpty()) - break; - - StatementType query_type = getQueryType(qtail); - - // Check whether the DB structure is changed by this statement - if(!structure_updated && (query_type == AlterStatement || - query_type == CreateStatement || - query_type == DropStatement || - query_type == RollbackStatement)) - structure_updated = true; - - // Check whether this is trying to set a pragma or to vacuum the database - if((query_type == PragmaStatement && qtail.contains('=') && !qtail.contains("defer_foreign_keys", Qt::CaseInsensitive)) || query_type == VacuumStatement) - { - // We're trying to set a pragma. If the database has been modified it needs to be committed first. We'll need to ask the - // user about that - if(db.getDirty()) - { - if(QMessageBox::question(this, - QApplication::applicationName(), - tr("Setting PRAGMA values or vacuuming will commit your current transaction.\nAre you sure?"), - QMessageBox::Yes | QMessageBox::Default, - QMessageBox::No | QMessageBox::Escape) == QMessageBox::Yes) - { - // Commit all changes - db.releaseAllSavepoints(); - } else { - // Abort - statusMessage = tr("Execution aborted by user"); - break; - } - } - } else { - // We're not trying to set a pragma or to vacuum the database. In this case make sure a savepoint has been created in order to avoid committing - // all changes to the database immediately. Don't set more than one savepoint. - - if(!savepoint_created) - { - // We have to start a transaction before we create the prepared statement otherwise every executed - // statement will get committed after the prepared statement gets finalized - db.setSavepoint(); - savepoint_created = true; - } - } - - // Execute next statement - int tail_length_before = tail_length; - const char* qbegin = tail; - auto pDb = db.get(tr("executing query")); - sql3status = sqlite3_prepare_v2(pDb.get(), tail, tail_length, &vm, &tail); - QString queryPart = QString::fromUtf8(qbegin, tail - qbegin); - tail_length -= (tail - qbegin); - int end_of_current_statement_position = execute_from_position + tail_length_before - tail_length; - - if (sql3status == SQLITE_OK) - { - sql3status = sqlite3_step(vm); - sqlite3_finalize(vm); - - // Get type - StatementType query_part_type = getQueryType(queryPart.trimmed()); - - // SQLite returns SQLITE_DONE when a valid SELECT statement was executed but returned no results. To run into the branch that updates - // the status message and the table view anyway manipulate the status value here. This is also done for PRAGMA statements as they (sometimes) - // return rows just like SELECT statements, too. - if((query_part_type == SelectStatement || query_part_type == PragmaStatement) && sql3status == SQLITE_DONE) - sql3status = SQLITE_ROW; - - switch(sql3status) - { - case SQLITE_ROW: - { - // If we get here, the SQL statement returns some sort of data. So hand it over to the model for display. Don't set the modified flag - // because statements that display data don't change data as well. - pDb = nullptr; - - auto * model = sqlWidget->getModel(); - model->setQuery(queryPart); - - // Wait until the initial loading of data (= first chunk and row count) has been performed. I have the - // feeling that a lot of stuff would need rewriting if we wanted to become more asynchronous here: - // essentially the entire loop over the commands would need to be signal-driven. - model->waitUntilIdle(); - qApp->processEvents(); // to make row count available - - statusMessage = tr("%1 rows returned in %2ms").arg(model->rowCount()).arg(timer.elapsed()); - ok = true; - ui->actionSqlResultsSave->setEnabled(true); - ui->actionSqlResultsSaveAsView->setEnabled(!db.readOnly()); - - sql3status = SQLITE_OK; - break; - } - case SQLITE_DONE: - case SQLITE_OK: - { - // If we get here, the SQL statement doesn't return data and just executes. Don't run it again because it has already been executed. - // But do set the modified flag because statements that don't return data, often modify the database. - - sqlWidget->getModel()->reset(); - - QString stmtHasChangedDatabase; - if(query_part_type == InsertStatement || query_part_type == UpdateStatement || query_part_type == DeleteStatement) - stmtHasChangedDatabase = tr(", %1 rows affected").arg(sqlite3_changes(pDb.get())); - - // Attach/Detach statements don't modify the original database - if(query_part_type != StatementType::AttachStatement && query_part_type != StatementType::DetachStatement) - modified = true; - - statusMessage = tr("query executed successfully. Took %1ms%2").arg(timer.elapsed()).arg(stmtHasChangedDatabase); - ok = true; - break; - } - case SQLITE_MISUSE: - continue; - default: - ok = false; - break; - } - timer.restart(); - } else { - ok = false; - - } - editor->lineIndexFromPosition(execute_from_position, &execute_from_line, &execute_from_index); + // Prepare a lambda function for logging the results of a query + auto query_logger = [this, sqlWidget, editor](bool ok, const QString& status_message, int from_position, int to_position) { + int execute_from_line, execute_from_index; + editor->lineIndexFromPosition(from_position, &execute_from_line, &execute_from_index); // Special case: if the start position is at the end of a line, then move to the beggining of next line. // Otherwise for the typical case, the line reference is one less than expected. @@ -1508,13 +1394,11 @@ void MainWindow::executeQuery() execute_from_index = 0; } - // If there was an error, save the error message for later and highlight the erroneous SQL statement - if (!ok) + // If there was an error highlight the erroneous SQL statement + if(!ok) { - statusMessage = QString::fromUtf8(sqlite3_errmsg(pDb.get())); - int end_of_current_statement_line, end_of_current_statement_index; - editor->lineIndexFromPosition(end_of_current_statement_position, &end_of_current_statement_line, &end_of_current_statement_index); + editor->lineIndexFromPosition(to_position, &end_of_current_statement_line, &end_of_current_statement_index); editor->setErrorIndicator(execute_from_line, execute_from_index, end_of_current_statement_line, end_of_current_statement_index); editor->setCursorPosition(execute_from_line, execute_from_index); @@ -1522,44 +1406,101 @@ void MainWindow::executeQuery() // Log the query and the result message. // The query takes the last placeholder as it may itself contain the sequence '%' + number. - statusMessage = tr("-- At line %1:\n%4\n-- Result: %3").arg(execute_from_line+1).arg(statusMessage).arg(queryPart.trimmed()); - db.logSQL(statusMessage, kLogMsg_User); - - // Release the database - pDb = nullptr; - - // Revert to save point now if it wasn't needed. We need to do this here because there are some rare cases where the next statement might - // be affected by what is only a temporary and unnecessary savepoint. For example in this case: - // ATTACH 'xxx' AS 'db2' - // SELECT * FROM db2.xy; -- Savepoint created here - // DETACH db2; -- Savepoint makes this statement fail - if(!modified && !wasdirty && savepoint_created) - { - db.revertToSavepoint(); // better rollback, if the logic is not enough we can tune it. - savepoint_created = false; - } + QString query = editor->text(from_position, to_position); + QString log_message = tr("-- At line %1:\n%3\n-- Result: %2").arg(execute_from_line+1).arg(status_message).arg(query.trimmed()); + db.logSQL(log_message, kLogMsg_User); - // Update the start position for the next statement and check if we are at - // the end of the part we want to execute. If so, stop the execution now. - execute_from_position = end_of_current_statement_position; - if(execute_from_position >= execute_to_position) - break; + // Update the execution area + sqlWidget->finishExecution(log_message, ok); + }; - // Process events to keep the UI responsive - qApp->processEvents(); - } + // Prepare the SQL worker to run the query. We set the context of each signal-slot connection to the current SQL execution area. + // This means that if the tab is closed all these signals are automatically disconnected so the lambdas won't be called for a not + // existing execution area. + execute_sql_worker.reset(new RunSql(db, sqlWidget->getSql(), execute_from_position, execute_to_position, true)); + + connect(execute_sql_worker.get(), &RunSql::statementErrored, sqlWidget, [query_logger, this, sqlWidget](const QString& status_message, int from_position, int to_position) { + sqlWidget->getModel()->reset(); + ui->actionSqlResultsSave->setEnabled(false); + ui->actionSqlResultsSaveAsView->setEnabled(false); + attachPlot(sqlWidget->getTableResult(), sqlWidget->getModel()); + + query_logger(false, status_message, from_position, to_position); + }, Qt::QueuedConnection); + connect(execute_sql_worker.get(), &RunSql::statementExecuted, sqlWidget, [query_logger, this, sqlWidget](const QString& status_message, int from_position, int to_position) { + sqlWidget->getModel()->reset(); + ui->actionSqlResultsSave->setEnabled(false); + ui->actionSqlResultsSaveAsView->setEnabled(false); + attachPlot(sqlWidget->getTableResult(), sqlWidget->getModel()); + + query_logger(true, status_message, from_position, to_position); + execute_sql_worker->startNextStatement(); + }, Qt::QueuedConnection); + connect(execute_sql_worker.get(), &RunSql::statementReturnsRows, sqlWidget, [query_logger, this, sqlWidget](const QString& query, int from_position, int to_position, qint64 time_in_ms_so_far) { + auto time_start = std::chrono::high_resolution_clock::now(); + + ui->actionSqlResultsSave->setEnabled(true); + ui->actionSqlResultsSaveAsView->setEnabled(!db.readOnly()); + + auto * model = sqlWidget->getModel(); + model->setQuery(query); + + // Wait until the initial loading of data (= first chunk and row count) has been performed + auto conn = std::make_shared(); + *conn = connect(model, &SqliteTableModel::finishedFetch, [=]() { + // Disconnect this connection right now. This avoids calling this slot multiple times + disconnect(*conn); + + attachPlot(sqlWidget->getTableResult(), sqlWidget->getModel()); + connect(sqlWidget->getTableResult(), &ExtendedTableWidget::activated, this, &MainWindow::dataTableSelectionChanged); + connect(sqlWidget->getTableResult(), &QTableView::doubleClicked, this, &MainWindow::doubleClickTable); + + auto time_end = std::chrono::high_resolution_clock::now(); + auto time_in_ms = std::chrono::duration_cast(time_end-time_start); + query_logger(true, tr("%1 rows returned in %2ms").arg(model->rowCount()).arg(time_in_ms.count()+time_in_ms_so_far), from_position, to_position); + execute_sql_worker->startNextStatement(); + }); + }, Qt::QueuedConnection); + connect(execute_sql_worker.get(), &RunSql::confirmSaveBeforePragmaOrVacuum, sqlWidget, [this]() { + if(QMessageBox::question(nullptr, QApplication::applicationName(), + tr("Setting PRAGMA values or vacuuming will commit your current transaction.\nAre you sure?"), + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::No | QMessageBox::Escape) == QMessageBox::No) + execute_sql_worker->stop(); + + }, Qt::BlockingQueuedConnection); + connect(execute_sql_worker.get(), &RunSql::finished, sqlWidget, [this, current_tab, sqlWidget]() { + // We work with a pointer to the current tab here instead of its index because the user might reorder the tabs in the meantime + ui->tabSqlAreas->setTabIcon(ui->tabSqlAreas->indexOf(current_tab), QIcon()); + + // We don't need to check for the current SQL tab here because two concurrently running queries are not allowed + ui->actionSqlExecuteLine->setEnabled(true); + ui->actionExecuteSql->setEnabled(true); + ui->actionSqlStop->setEnabled(false); + sqlWidget->getEditor()->setReadOnly(false); + + // Show Done message + if(sqlWidget->inErrorState()) + sqlWidget->getStatusEdit()->setPlainText(tr("Execution finished with errors.") + "\n\n" + sqlWidget->getStatusEdit()->toPlainText()); + else + sqlWidget->getStatusEdit()->setPlainText(tr("Execution finished without errors.") + "\n\n" + sqlWidget->getStatusEdit()->toPlainText()); + }); - sqlWidget->finishExecution(statusMessage, ok); - attachPlot(sqlWidget->getTableResult(), sqlWidget->getModel()); + // Add an hourglass icon to the current tab to indicate that there's a running execution in there. + // NOTE It's a bit hack-ish but we don't use this icon just as a signal to the user but also check for it in various places to check whether a + // specific SQL tab is currently running a query or not. + ui->tabSqlAreas->setTabIcon(ui->tabSqlAreas->currentIndex(), QIcon(":icons/hourglass")); - connect(sqlWidget->getTableResult(), &ExtendedTableWidget::activated, this, &MainWindow::dataTableSelectionChanged); - connect(sqlWidget->getTableResult(), SIGNAL(doubleClicked(QModelIndex)), this, SLOT(doubleClickTable(QModelIndex))); + // Deactivate the buttons to start a query and activate the button to stop the query + ui->actionSqlExecuteLine->setEnabled(false); + ui->actionExecuteSql->setEnabled(false); + ui->actionSqlStop->setEnabled(true); - // If the DB structure was changed by some command in this SQL script, update our schema representations - if(structure_updated) - db.updateSchema(); + // Make the SQL editor widget read-only. We do this because the error indicators would be misplaced if the user changed the SQL text during execution + sqlWidget->getEditor()->setReadOnly(true); - QApplication::restoreOverrideCursor(); + // Start the execution + execute_sql_worker->start(); } void MainWindow::mainTabSelected(int tabindex) @@ -2159,6 +2100,20 @@ void MainWindow::closeSqlTab(int index, bool force) if(ui->tabSqlAreas->count() == 1 && !force) return; + // Check if we're still executing statements from this tab and stop them before proceeding + if(!ui->tabSqlAreas->tabIcon(index).isNull()) + { + if(QMessageBox::warning(this, qApp->applicationName(), tr("The statements in this tab are still executing. Closing the tab will stop the " + "execution. This might leave the database in an inconsistent state. Are you sure " + "you want to close the tab?"), + QMessageBox::Yes, + QMessageBox::Cancel | QMessageBox::Default | QMessageBox::Escape) == QMessageBox::Cancel) + return; + + execute_sql_worker->stop(); + execute_sql_worker->wait(); + } + // Remove the tab and delete the widget QWidget* w = ui->tabSqlAreas->widget(index); ui->tabSqlAreas->removeTab(index); @@ -2183,11 +2138,27 @@ unsigned int MainWindow::openSqlTab(bool resetCounter) return index; } -void MainWindow::changeSqlTab(int /*index*/) +void MainWindow::changeSqlTab(int index) { // Instead of figuring out if there are some execution results in the new tab and which statement was used to generate them, // we just disable the export buttons in the toolbar. ui->actionSqlResultsSave->setEnabled(false); + + // Check if the new tab is currently running a query or not + if(ui->tabSqlAreas->tabIcon(index).isNull()) + { + // Not running a query + + ui->actionSqlExecuteLine->setEnabled(true); + ui->actionExecuteSql->setEnabled(true); + ui->actionSqlStop->setEnabled(false); + } else { + // Running a query + + ui->actionSqlExecuteLine->setEnabled(false); + ui->actionExecuteSql->setEnabled(false); + ui->actionSqlStop->setEnabled(true); + } } void MainWindow::openSqlFile() @@ -3514,6 +3485,15 @@ void MainWindow::openFindReplaceDialog() sqlWidget->getEditor()->openFindReplaceDialog(); } +void MainWindow::toggleSqlBlockComment() +{ + // The slot for the shortcut must discover which sqltexedit widget has the focus + SqlExecutionArea* sqlWidget = qobject_cast(ui->tabSqlAreas->currentWidget()); + + if (sqlWidget) + sqlWidget->getEditor()->toggleBlockComment(); +} + void MainWindow::openSqlPrintDialog() { // The slot for the shortcut must discover which sqltexedit widget has the focus and then open its dialog. @@ -3591,7 +3571,7 @@ void MainWindow::updateInsertDeleteRecordButton() // at least one row to be selected. For the insert button there is an extra rule to disable it when we are browsing a view because inserting // into a view isn't supported yet. bool isEditable = m_browseTableModel->isEditable() && !db.readOnly(); - ui->buttonNewRecord->setEnabled(isEditable && m_browseTableModel->pseudoPk().isEmpty()); + ui->buttonNewRecord->setEnabled(isEditable && !m_browseTableModel->hasPseudoPk()); ui->buttonDeleteRecord->setEnabled(isEditable && rows != 0); if(rows > 1) diff --git a/src/MainWindow.h b/src/MainWindow.h index eb6aae18f..295c9abeb 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -6,7 +6,9 @@ #include "Palette.h" #include "CondFormat.h" #include "sql/Query.h" +#include "RunSql.h" +#include #include #include @@ -120,23 +122,6 @@ class MainWindow : public QMainWindow int case_sensitive_like; } pragmaValues; - enum StatementType - { - SelectStatement, - AlterStatement, - DropStatement, - RollbackStatement, - PragmaStatement, - VacuumStatement, - InsertStatement, - UpdateStatement, - DeleteStatement, - CreateStatement, - AttachStatement, - DetachStatement, - OtherStatement, - }; - Ui::MainWindow* ui; DBBrowserDB db; @@ -184,6 +169,8 @@ class MainWindow : public QMainWindow Palette m_condFormatPalette; + std::unique_ptr execute_sql_worker; + void init(); void clearCompleterModelsFields(); @@ -199,8 +186,6 @@ class MainWindow : public QMainWindow sqlb::ObjectIdentifier currentlyBrowsedTableName() const; - StatementType getQueryType(const QString& query) const; - void applyBrowseTableSettings(BrowseDataTableSettings storedData, bool skipFilters = false); protected: @@ -218,6 +203,7 @@ public slots: void jumpToRow(const sqlb::ObjectIdentifier& table, QString column, const QByteArray& value); void switchToBrowseDataTab(QString tableToBrowse = QString()); void populateStructure(const QString& old_table = QString()); + void openPreferences(); private slots: void createTreeContextMenu(const QPoint & qPoint); @@ -256,7 +242,6 @@ private slots: void fileRevert(); void exportDatabaseToSQL(); void importDatabaseFromSQL(); - void openPreferences(); void openRecentFile(); void loadPragmas(); void updatePragmaUi(); @@ -304,6 +289,7 @@ private slots: void renameSqlTab(int index); void setFindFrameVisibility(bool show); void openFindReplaceDialog(); + void toggleSqlBlockComment(); void openSqlPrintDialog(); void saveFilterAsView(); void exportFilteredTable(); diff --git a/src/MainWindow.ui b/src/MainWindow.ui index db61474a3..d20ac045e 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -143,7 +143,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] + Refresh the data in the selected table This button refreshes the data in the currently selected table. @@ -194,7 +194,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Print currently browsed table data [Ctrl+P] + Print currently browsed table data Print currently browsed table data. Print selection if more than one cell is selected. @@ -941,11 +941,14 @@ You can drag SQL statements from an object row and drop them into other applicat + + + @@ -1700,11 +1703,14 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed &Execute SQL - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + + Ctrl+Return + @@ -1751,7 +1757,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Execute current line - Execute current line [Shift+F5] + Execute current line This button executes the SQL statement present in the current editor line @@ -2082,7 +2088,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Find text in SQL editor - Find text in SQL editor [Ctrl+F] + Find text in SQL editor This button opens the search bar of the editor @@ -2103,11 +2109,17 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Find or replace text in SQL editor - Find or replace text in SQL editor [Ctrl+H] + Find or replace text in SQL editor This button opens the find/replace dialog for the current editor tab + + Ctrl+H + + + Qt::WidgetShortcut + @@ -2325,7 +2337,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Print - Print text from current SQL editor tab [Ctrl+P] + Print text from current SQL editor tab @@ -2333,6 +2345,9 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Open a dialog for printing the text in the current SQL editor tab + + Ctrl+P + Qt::WidgetShortcut @@ -2349,7 +2364,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Print - Print the structure of the opened database [Ctrl+P] + Print the structure of the opened database @@ -2364,6 +2379,36 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Qt::WidgetShortcut + + + + :/icons/comment_block:/icons/comment_block + + + Un/comment block of SQL code + + + Comment or uncomment current line or selected block of code + + + Comment or uncomment the selected lines or the current line, when there is no selection. All the block is toggled according to the first line. + + + Ctrl+/ + + + + + + :/icons/cancel:/icons/cancel + + + Stop SQL execution + + + Stop the currently running SQL script + + @@ -3777,6 +3822,22 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed + + actionSqlToggleComment + triggered() + MainWindow + toggleSqlBlockComment() + + + -1 + -1 + + + 518 + 314 + + + fileOpen() diff --git a/src/Palette.cpp b/src/Palette.cpp index 9235c23d7..61e838984 100644 --- a/src/Palette.cpp +++ b/src/Palette.cpp @@ -14,37 +14,26 @@ QColor Palette::nextSerialColor(bool dark) { case 0: return QColor(0, 69, 134); - break; case 1: return QColor(255, 66, 14); - break; case 2: return QColor(255, 211, 32); - break; case 3: return QColor(87, 157, 28); - break; case 4: return QColor(126, 0, 33); - break; case 5: return QColor(131, 202, 255); - break; case 6: return QColor(49, 64, 4); - break; case 7: return QColor(174, 207, 0); - break; case 8: return QColor(75, 31, 111); - break; case 9: return QColor(255, 149, 14); - break; case 10: return QColor(197, 00, 11); - break; case 11: // Since this is the last colour in our table, reset the counter back @@ -52,12 +41,10 @@ QColor Palette::nextSerialColor(bool dark) m_lastColourIndex = 0; return QColor(0, 132, 209); - break; default: // NOTE: This shouldn't happen! m_lastColourIndex = 0; return QColor(0, 0, 0); - break; } } else { // TODO: review the bright colours @@ -65,37 +52,26 @@ QColor Palette::nextSerialColor(bool dark) { case 0: return QColor(Qt::yellow); - break; case 1: return QColor(Qt::cyan); - break; case 2: return QColor(Qt::green); - break; case 3: return QColor(Qt::magenta); - break; case 4: return QColor(Qt::lightGray); - break; case 5: return QColor("beige"); - break; case 6: return QColor("lightblue"); - break; case 7: return QColor("turquoise"); - break; case 8: return QColor("mediumspringgreen"); - break; case 9: return QColor("lightskyblue"); - break; case 10: return QColor("moccasin"); - break; case 11: // Since this is the last colour in our table, reset the counter back @@ -103,11 +79,9 @@ QColor Palette::nextSerialColor(bool dark) m_lastColourIndex = 0; return QColor("pink"); - break; default: // NOTE: This shouldn't happen! return QColor(0, 0, 0); - break; } } } diff --git a/src/PreferencesDialog.h b/src/PreferencesDialog.h index 113afc5b7..9b18cb68e 100644 --- a/src/PreferencesDialog.h +++ b/src/PreferencesDialog.h @@ -7,7 +7,6 @@ class QTreeWidgetItem; class QFrame; -class QTableWidget; class QSslCertificate; class QAbstractButton; diff --git a/src/RemoteDock.cpp b/src/RemoteDock.cpp index ee1088082..1467f9318 100644 --- a/src/RemoteDock.cpp +++ b/src/RemoteDock.cpp @@ -1,5 +1,6 @@ -#include +#include #include +#include #include "RemoteDock.h" #include "ui_RemoteDock.h" @@ -27,6 +28,15 @@ RemoteDock::RemoteDock(MainWindow* parent) // Whenever a new directory listing has been parsed, check if it was a new root dir and, if so, open the user's directory connect(remoteModel, &RemoteModel::directoryListingParsed, this, &RemoteDock::newDirectoryNode); + // When the Preferences link is clicked in the no-certificates-label, open the preferences dialog. For other links than the ones we know, + // just open them in a web browser + connect(ui->labelNoCert, &QLabel::linkActivated, [this](const QString& link) { + if(link == "#preferences") + mainWindow->openPreferences(); + else + QDesktopServices::openUrl(QUrl(link)); + }); + // Initial setup reloadSettings(); } @@ -47,6 +57,9 @@ void RemoteDock::reloadSettings() for(const QSslCertificate& cert : certs) ui->comboUser->addItem(cert.subjectInfo(QSslCertificate::CommonName).at(0), file); } + + // If there are no client certs, just show a simple message instead of all the unusable widgets + ui->stack->setCurrentIndex(!ui->comboUser->count()); } void RemoteDock::setNewIdentity() diff --git a/src/RemoteDock.ui b/src/RemoteDock.ui index c1b5690ca..686b2e7cf 100644 --- a/src/RemoteDock.ui +++ b/src/RemoteDock.ui @@ -6,78 +6,159 @@ 0 0 - 575 - 310 + 534 + 298 Remote - + - - - - - Identity - - - comboUser - - - - - - - QComboBox::AdjustToContents - - - - - - - Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. - - - Go - - - - :/icons/cog_go.png:/icons/cog_go.png - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Push currently opened database to server - - - - :/icons/push_database:/icons/push_database - - - - - - - - - <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + + 0 + + + + + + + + Identity + + + comboUser + + + + + + + QComboBox::AdjustToContents + + + + + + + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + Go + + + + :/icons/cog_go.png:/icons/cog_go.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Push currently opened database to server + + + + :/icons/push_database:/icons/push_database + + + + + + + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + + + + + + + + + + Qt::Vertical + + + + 20 + 85 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + <html><head/><body><p>No DBHub.io account yet? <a href="https://dbhub.io/"><span style=" text-decoration: underline; color:#007af4;">Create one now</span></a> and import your certificate <a href="#preferences"><span style=" text-decoration: underline; color:#007af4;">here</span></a> to share your databases.</p><p>For online help visit <a href="https://dbhub.io/about"><span style=" text-decoration: underline; color:#007af4;">here</span></a>.</p></body></html> + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 85 + + + + + + diff --git a/src/RunSql.cpp b/src/RunSql.cpp new file mode 100644 index 000000000..b090a3974 --- /dev/null +++ b/src/RunSql.cpp @@ -0,0 +1,304 @@ +#include "RunSql.h" +#include "sqlite.h" +#include "sqlitedb.h" +#include "sqlitetablemodel.h" + +#include +#include +#include + +RunSql::RunSql(DBBrowserDB& _db, QString query, int execute_from_position, int _execute_to_position, bool _interrupt_after_statements) : + db(_db), + may_continue_with_execution(true), + interrupt_after_statements(_interrupt_after_statements), + execute_current_position(execute_from_position), + execute_to_position(_execute_to_position), + structure_updated(false), + savepoint_created(false), + was_dirty(db.getDirty()), + modified(false) +{ + // Get lock to set up everything + std::unique_lock lk(m); + + // Cancel if there is nothing to execute + if(query.trimmed().isEmpty() || query.trimmed() == ";" || execute_from_position == execute_to_position || + query.mid(execute_from_position, execute_to_position-execute_from_position).trimmed().isEmpty() || + query.mid(execute_from_position, execute_to_position-execute_from_position).trimmed() == ";") + return; + + // All replacements in the query should be made by the same amount of characters, so the positions in the file + // for error indicators and line and column logs are not displaced. + // Whitespace and comments are discarded by SQLite, so it is better to just let it ignore them. + query = query.replace(QRegExp("^(\\s*)BEGIN TRANSACTION;", Qt::CaseInsensitive), "\\1 "); + query = query.replace(QRegExp("COMMIT;(\\s*)$", Qt::CaseInsensitive), " \\1"); + + // Convert query to byte array which we will use from now on, starting from the determined start position and + // until the end of the SQL code. By doing so we go further than the determined end position because in Line + // mode the last statement might go beyond that point. + queries_left_to_execute = query.toUtf8().mid(execute_from_position); +} + +void RunSql::run() +{ + // Execute statement by statement + for(;;) + { + if(!executeNextStatement()) + break; + } + + // Execution finished + + // If the DB structure was changed by some command in this SQL script, update our schema representations + if(structure_updated) + db.updateSchema(); +} + +void RunSql::startNextStatement() +{ + std::unique_lock lk(m); + may_continue_with_execution = true; + cv.notify_one(); +} + +void RunSql::stop() +{ + std::unique_lock lk(m); + + stopExecution(); + if(pDb) + sqlite3_interrupt(pDb.get()); + may_continue_with_execution = true; + cv.notify_all(); +} + +bool RunSql::executeNextStatement() +{ + std::unique_lock lk(m); + + // Is there anything left to do? + if(queries_left_to_execute.isEmpty()) + return false; + + // What type of query is this? + QString qtail = QString(queries_left_to_execute).trimmed(); + // Remove trailing comments so we don't get fooled by some trailing text at the end of the stream. + // Otherwise we'll pass them to SQLite and its execution will trigger a savepoint that wouldn't be + // reverted. + SqliteTableModel::removeCommentsFromQuery(qtail); + if (qtail.isEmpty()) + return false; + + StatementType query_type = getQueryType(qtail); + + // Check whether the DB structure is changed by this statement + if(!structure_updated && (query_type == AlterStatement || + query_type == CreateStatement || + query_type == DropStatement || + query_type == RollbackStatement)) + structure_updated = true; + + // Check whether this is trying to set a pragma or to vacuum the database + // TODO This is wrong. The '=' or the 'defer_foreign_keys' might be in a completely different statement of the queries string. + if((query_type == PragmaStatement && qtail.contains('=') && !qtail.contains("defer_foreign_keys", Qt::CaseInsensitive)) || query_type == VacuumStatement) + { + // We're trying to set a pragma. If the database has been modified it needs to be committed first. We'll need to ask the + // user about that + if(db.getDirty()) + { + lk.unlock(); + // Ask user, then check if we should abort execution or continue with it. We depend on a BlockingQueueConnection here which makes sure to + // block this worker thread until the slot function in the main thread is completed and could tell us about its decision. + emit confirmSaveBeforePragmaOrVacuum(); + if(!queries_left_to_execute.isEmpty()) + { + // Commit all changes + db.releaseAllSavepoints(); + } else { + // Abort + emit statementErrored(tr("Execution aborted by user"), execute_current_position, execute_current_position + (query_type == PragmaStatement ? 5 : 6)); + return false; + } + lk.lock(); + } + } else { + // We're not trying to set a pragma or to vacuum the database. In this case make sure a savepoint has been created in order to avoid committing + // all changes to the database immediately. Don't set more than one savepoint. + + if(!savepoint_created) + { + // We have to start a transaction before we create the prepared statement otherwise every executed + // statement will get committed after the prepared statement gets finalized + db.setSavepoint(); + savepoint_created = true; + } + } + + // Start execution timer. We do that after opening any message boxes and after creating savepoints because both are not part of the actual + // query execution. + auto time_start = std::chrono::high_resolution_clock::now(); + + // Execute next statement + const char* tail = queries_left_to_execute.data(); + int tail_length = queries_left_to_execute.length(); + lk.unlock(); + const char* qbegin = tail; + acquireDbAccess(); + sqlite3_stmt* vm; + int sql3status = sqlite3_prepare_v2(pDb.get(), tail, tail_length, &vm, &tail); + QString queryPart = QString::fromUtf8(qbegin, tail - qbegin); + int tail_length_before = tail_length; + tail_length -= (tail - qbegin); + int end_of_current_statement_position = execute_current_position + tail_length_before - tail_length; + + // Save remaining statements + lk.lock(); + queries_left_to_execute = QByteArray(tail); + lk.unlock(); + + if (sql3status == SQLITE_OK) + { + sql3status = sqlite3_step(vm); + sqlite3_finalize(vm); + + // Get type + StatementType query_part_type = getQueryType(queryPart.trimmed()); + + // SQLite returns SQLITE_DONE when a valid SELECT statement was executed but returned no results. To run into the branch that updates + // the status message and the table view anyway manipulate the status value here. This is also done for PRAGMA statements as they (sometimes) + // return rows just like SELECT statements, too. + if((query_part_type == SelectStatement || query_part_type == PragmaStatement) && sql3status == SQLITE_DONE) + sql3status = SQLITE_ROW; + + switch(sql3status) + { + case SQLITE_ROW: + { + // If we get here, the SQL statement returns some sort of data. So hand it over to the model for display. Don't set the modified flag + // because statements that display data don't change data as well. + + releaseDbAccess(); + + lk.lock(); + may_continue_with_execution = false; + + auto time_end = std::chrono::high_resolution_clock::now(); + auto time_in_ms = std::chrono::duration_cast(time_end - time_start); + emit statementReturnsRows(queryPart, execute_current_position, end_of_current_statement_position, time_in_ms.count()); + + // Make sure the next statement isn't executed until we're told to do so + if(interrupt_after_statements) + cv.wait(lk, [this](){ return may_continue_with_execution; }); + lk.unlock(); + break; + } + case SQLITE_DONE: + case SQLITE_OK: + { + // If we get here, the SQL statement doesn't return data and just executes. Don't run it again because it has already been executed. + // But do set the modified flag because statements that don't return data, often modify the database. + + QString stmtHasChangedDatabase; + if(query_part_type == InsertStatement || query_part_type == UpdateStatement || query_part_type == DeleteStatement) + stmtHasChangedDatabase = tr(", %1 rows affected").arg(sqlite3_changes(pDb.get())); + + releaseDbAccess(); + + lk.lock(); + + // Attach/Detach statements don't modify the original database + if(query_part_type != StatementType::AttachStatement && query_part_type != StatementType::DetachStatement) + modified = true; + + may_continue_with_execution = false; + + auto time_end = std::chrono::high_resolution_clock::now(); + auto time_in_ms = std::chrono::duration_cast(time_end - time_start); + emit statementExecuted(tr("query executed successfully. Took %1ms%2").arg(time_in_ms.count()).arg(stmtHasChangedDatabase), + execute_current_position, end_of_current_statement_position); + + // Make sure the next statement isn't executed until we're told to do so + if(interrupt_after_statements) + cv.wait(lk, [this](){ return may_continue_with_execution; }); + lk.unlock(); + break; + } + case SQLITE_MISUSE: + break; + default: + QString error = QString::fromUtf8(sqlite3_errmsg(pDb.get())); + releaseDbAccess(); + emit statementErrored(error, execute_current_position, end_of_current_statement_position); + stopExecution(); + return false; + } + } else { + QString error = QString::fromUtf8(sqlite3_errmsg(pDb.get())); + releaseDbAccess(); + emit statementErrored(error, execute_current_position, end_of_current_statement_position); + stopExecution(); + return false; + } + + // Release the database + lk.lock(); + releaseDbAccess(); + + // Revert to save point now if it wasn't needed. We need to do this here because there are some rare cases where the next statement might + // be affected by what is only a temporary and unnecessary savepoint. For example in this case: + // ATTACH 'xxx' AS 'db2' + // SELECT * FROM db2.xy; -- Savepoint created here + // DETACH db2; -- Savepoint makes this statement fail + if(!modified && !was_dirty && savepoint_created) + { + db.revertToSavepoint(); + savepoint_created = false; + } + + // Update the start position for the next statement and check if we are at + // the end of the part we want to execute. If so, stop the execution now. + execute_current_position = end_of_current_statement_position; + if(execute_current_position >= execute_to_position) + { + stopExecution(); + return false; + } + + return true; +} + +void RunSql::stopExecution() +{ + queries_left_to_execute.clear(); +} + +RunSql::StatementType RunSql::getQueryType(const QString& query) +{ + // Helper function for getting the type of a given query + + if(query.startsWith("SELECT", Qt::CaseInsensitive)) return SelectStatement; + if(query.startsWith("ALTER", Qt::CaseInsensitive)) return AlterStatement; + if(query.startsWith("DROP", Qt::CaseInsensitive)) return DropStatement; + if(query.startsWith("ROLLBACK", Qt::CaseInsensitive)) return RollbackStatement; + if(query.startsWith("PRAGMA", Qt::CaseInsensitive)) return PragmaStatement; + if(query.startsWith("VACUUM", Qt::CaseInsensitive)) return VacuumStatement; + if(query.startsWith("INSERT", Qt::CaseInsensitive)) return InsertStatement; + if(query.startsWith("UPDATE", Qt::CaseInsensitive)) return UpdateStatement; + if(query.startsWith("DELETE", Qt::CaseInsensitive)) return DeleteStatement; + if(query.startsWith("CREATE", Qt::CaseInsensitive)) return CreateStatement; + if(query.startsWith("ATTACH", Qt::CaseInsensitive)) return AttachStatement; + if(query.startsWith("DETACH", Qt::CaseInsensitive)) return DetachStatement; + + return OtherStatement; +} + +void RunSql::acquireDbAccess() +{ + pDb = db.get(tr("executing query"), true); +} + +void RunSql::releaseDbAccess() +{ + pDb = nullptr; +} diff --git a/src/RunSql.h b/src/RunSql.h new file mode 100644 index 000000000..4f8e9ec4f --- /dev/null +++ b/src/RunSql.h @@ -0,0 +1,80 @@ +#ifndef RUNSQL_H +#define RUNSQL_H + +#include +#include +#include +#include + +class DBBrowserDB; +struct sqlite3; + +class RunSql : public QThread +{ + Q_OBJECT + + void run() override; + +public: + RunSql(DBBrowserDB& db, QString query, int execute_from_position, int execute_to_position, bool interrupt_after_statements = false); + ~RunSql() override = default; + + enum StatementType + { + SelectStatement, + AlterStatement, + DropStatement, + RollbackStatement, + PragmaStatement, + VacuumStatement, + InsertStatement, + UpdateStatement, + DeleteStatement, + CreateStatement, + AttachStatement, + DetachStatement, + OtherStatement, + }; + + static StatementType getQueryType(const QString& query); + + void startNextStatement(); + + void stop(); + +signals: + void statementErrored(QString message, int from_position, int to_position); + void statementExecuted(QString message, int from_position, int to_position); + void statementReturnsRows(QString query, int from_position, int to_position, qint64 time_in_ms); + + /** + * This signal must be connected with a Qt::BlockingQueuedConnection in order to work as expected! + */ + void confirmSaveBeforePragmaOrVacuum(); + +private: + DBBrowserDB& db; + std::shared_ptr pDb; + + mutable std::mutex m; + mutable std::condition_variable cv; + bool may_continue_with_execution; + + bool interrupt_after_statements; + + QByteArray queries_left_to_execute; + int execute_current_position; + int execute_to_position; + bool structure_updated; + bool savepoint_created; + bool was_dirty; + bool modified; + + void stopExecution(); + bool executeNextStatement(); + + void acquireDbAccess(); + void releaseDbAccess(); +}; + +#endif diff --git a/src/Settings.cpp b/src/Settings.cpp index 6b1ecf98f..1679cb9ce 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -1,5 +1,6 @@ #include "Settings.h" +#include #include #include #include diff --git a/src/Settings.h b/src/Settings.h index 579e5d8aa..0c7fad853 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -1,7 +1,6 @@ #ifndef SETTINGS_H #define SETTINGS_H -#include #include #include diff --git a/src/SqlExecutionArea.cpp b/src/SqlExecutionArea.cpp index 372a61c00..0a3ed7c76 100644 --- a/src/SqlExecutionArea.cpp +++ b/src/SqlExecutionArea.cpp @@ -14,7 +14,8 @@ SqlExecutionArea::SqlExecutionArea(DBBrowserDB& _db, QWidget* parent) : QWidget(parent), db(_db), ui(new Ui::SqlExecutionArea), - m_columnsResized(false) + m_columnsResized(false), + error_state(false) { // Create UI ui->setupUi(this); @@ -57,6 +58,7 @@ QString SqlExecutionArea::getSelectedSql() const void SqlExecutionArea::finishExecution(const QString& result, const bool ok) { + error_state = !ok; m_columnsResized = false; ui->editErrors->setPlainText(result); // Set reddish background when not ok @@ -97,6 +99,11 @@ ExtendedTableWidget *SqlExecutionArea::getTableResult() return ui->tableResult; } +QTextEdit* SqlExecutionArea::getStatusEdit() +{ + return ui->editErrors; +} + void SqlExecutionArea::saveAsCsv() { ExportDataDialog dialog(db, ExportDataDialog::ExportFormatCsv, this, model->query()); diff --git a/src/SqlExecutionArea.h b/src/SqlExecutionArea.h index c28b5cf21..a9fa6b3db 100644 --- a/src/SqlExecutionArea.h +++ b/src/SqlExecutionArea.h @@ -8,6 +8,8 @@ class SqliteTableModel; class DBBrowserDB; class ExtendedTableWidget; +class QTextEdit; + namespace Ui { class SqlExecutionArea; } @@ -29,6 +31,9 @@ class SqlExecutionArea : public QWidget SqliteTableModel* getModel() { return model; } SqlTextEdit* getEditor(); ExtendedTableWidget *getTableResult(); + QTextEdit* getStatusEdit(); + + bool inErrorState() const { return error_state; } public slots: void finishExecution(const QString& result, const bool ok); @@ -54,6 +59,7 @@ private slots: Ui::SqlExecutionArea* ui; bool m_columnsResized; // This is set to true if the columns of the table view were already adjusted to fit their contents bool showErrorIndicators; + bool error_state; }; #endif diff --git a/src/extensions/extension-functions.c b/src/extensions/extension-functions.c new file mode 100644 index 000000000..2bdd1948b --- /dev/null +++ b/src/extensions/extension-functions.c @@ -0,0 +1,1947 @@ +/* +This library will provide common mathematical and string functions in +SQL queries using the operating system libraries or provided +definitions. It includes the following functions: + +Math: acos, asin, atan, atn2, atan2, acosh, asinh, atanh, difference, +degrees, radians, cos, sin, tan, cot, cosh, sinh, tanh, coth, exp, +log, log10, power, sign, sqrt, square, ceil, floor, pi. + +String: replicate, charindex, leftstr, rightstr, ltrim, rtrim, trim, +replace, reverse, proper, padl, padr, padc, strfilter. + +Aggregate: stdev, variance, mode, median, lower_quartile, +upper_quartile. + +The string functions ltrim, rtrim, trim, replace are included in +recent versions of SQLite and so by default do not build. + +Compilation instructions: + Compile this C source file into a dynamic library as follows: + * Linux: + gcc -fPIC -lm -shared extension-functions.c -o libsqlitefunctions.so + * Mac OS X: + gcc -fno-common -dynamiclib extension-functions.c -o libsqlitefunctions.dylib + (You may need to add flags + -I /opt/local/include/ -L/opt/local/lib -lsqlite3 + if your sqlite3 is installed from Mac ports, or + -I /sw/include/ -L/sw/lib -lsqlite3 + if installed with Fink.) + * Windows: + 1. Install MinGW (http://www.mingw.org/) and you will get the gcc + (gnu compiler collection) + 2. add the path to your path variable (isn't done during the + installation!) + 3. compile: + gcc -shared -I "path" -o libsqlitefunctions.so extension-functions.c + (path = path of sqlite3ext.h; i.e. C:\programs\sqlite) + +Usage instructions for applications calling the sqlite3 API functions: + In your application, call sqlite3_enable_load_extension(db,1) to + allow loading external libraries. Then load the library libsqlitefunctions + using sqlite3_load_extension; the third argument should be 0. + See http://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions. + Select statements may now use these functions, as in + SELECT cos(radians(inclination)) FROM satsum WHERE satnum = 25544; + +Usage instructions for the sqlite3 program: + If the program is built so that loading extensions is permitted, + the following will work: + sqlite> SELECT load_extension('./libsqlitefunctions.so'); + sqlite> select cos(radians(45)); + 0.707106781186548 + Note: Loading extensions is by default prohibited as a + security measure; see "Security Considerations" in + http://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions. + If the sqlite3 program and library are built this + way, you cannot use these functions from the program, you + must write your own program using the sqlite3 API, and call + sqlite3_enable_load_extension as described above, or else + rebuilt the sqlite3 program to allow loadable extensions. + +Alterations: +The instructions are for Linux, Mac OS X, and Windows; users of other +OSes may need to modify this procedure. In particular, if your math +library lacks one or more of the needed trig or log functions, comment +out the appropriate HAVE_ #define at the top of file. If you do not +wish to make a loadable module, comment out the define for +COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE. If you are using a +version of SQLite without the trim functions and replace, comment out +the HAVE_TRIM #define. + +Liam Healy + +History: +2010-01-06 Correct check for argc in squareFunc, and add Windows +compilation instructions. +2009-06-24 Correct check for argc in properFunc. +2008-09-14 Add check that memory was actually allocated after +sqlite3_malloc or sqlite3StrDup, call sqlite3_result_error_nomem if +not. Thanks to Robert Simpson. +2008-06-13 Change to instructions to indicate use of the math library +and that program might work. +2007-10-01 Minor clarification to instructions. +2007-09-29 Compilation as loadable module is optional with +COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE. +2007-09-28 Use sqlite3_extension_init and macros +SQLITE_EXTENSION_INIT1, SQLITE_EXTENSION_INIT2, so that it works with +sqlite3_load_extension. Thanks to Eric Higashino and Joe Wilson. +New instructions for Mac compilation. +2007-09-17 With help from Joe Wilson and Nuno Luca, made use of +external interfaces so that compilation is no longer dependent on +SQLite source code. Merged source, header, and README into a single +file. Added casts so that Mac will compile without warnings (unsigned +and signed char). +2007-09-05 Included some definitions from sqlite 3.3.13 so that this +will continue to work in newer versions of sqlite. Completed +description of functions available. +2007-03-27 Revised description. +2007-03-23 Small cleanup and a bug fix on the code. This was mainly +letting errno flag errors encountered in the math library and checking +the result, rather than pre-checking. This fixes a bug in power that +would cause an error if any non-positive number was raised to any +power. +2007-02-07 posted by Mikey C to sqlite mailing list. +Original code 2006 June 05 by relicoder. + +*/ + +//#include "config.h" + +#define COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE 1 +#define HAVE_ACOSH 1 +#define HAVE_ASINH 1 +#define HAVE_ATANH 1 +#define HAVE_SINH 1 +#define HAVE_COSH 1 +#define HAVE_TANH 1 +#define HAVE_LOG10 1 +#define HAVE_ISBLANK 1 +#define SQLITE_SOUNDEX 1 +#define HAVE_TRIM 1 /* LMH 2007-03-25 if sqlite has trim functions */ + +#ifdef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 +#else +#include "sqlite3.h" +#endif + +#include +/* relicoder */ +#include +#include +#include +#include /* LMH 2007-03-25 */ + +#include +#include + +#ifndef _MAP_H_ +#define _MAP_H_ + +#include + +/* +** Simple binary tree implementation to use in median, mode and quartile calculations +** Tree is not necessarily balanced. That would require something like red&black trees of AVL +*/ + +typedef int(*cmp_func)(const void *, const void *); +typedef void(*map_iterator)(void*, int64_t, void*); + +typedef struct node{ + struct node *l; + struct node *r; + void* data; + int64_t count; +} node; + +typedef struct map{ + node *base; + cmp_func cmp; + short free; +} map; + +/* +** creates a map given a comparison function +*/ +map map_make(cmp_func cmp); + +/* +** inserts the element e into map m +*/ +void map_insert(map *m, void *e); + +/* +** executes function iter over all elements in the map, in key increasing order +*/ +void map_iterate(map *m, map_iterator iter, void* p); + +/* +** frees all memory used by a map +*/ +void map_destroy(map *m); + +/* +** compares 2 integers +** to use with map_make +*/ +int int_cmp(const void *a, const void *b); + +/* +** compares 2 doubles +** to use with map_make +*/ +int double_cmp(const void *a, const void *b); + +#endif /* _MAP_H_ */ + +typedef uint8_t u8; +typedef uint16_t u16; +typedef int64_t i64; + +static char *sqlite3StrDup( const char *z ) { + char *res = sqlite3_malloc( strlen(z)+1 ); + return strcpy( res, z ); +} + +/* +** These are copied verbatim from fun.c so as to not have the names exported +*/ + +/* LMH from sqlite3 3.3.13 */ +/* +** This table maps from the first byte of a UTF-8 character to the number +** of trailing bytes expected. A value '4' indicates that the table key +** is not a legal first byte for a UTF-8 character. +*/ +static const u8 xtra_utf8_bytes[256] = { +/* 0xxxxxxx */ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + +/* 10wwwwww */ +4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + +/* 110yyyyy */ +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + +/* 1110zzzz */ +2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + +/* 11110yyy */ +3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, +}; + + +/* +** This table maps from the number of trailing bytes in a UTF-8 character +** to an integer constant that is effectively calculated for each character +** read by a naive implementation of a UTF-8 character reader. The code +** in the READ_UTF8 macro explains things best. +*/ +static const int xtra_utf8_bits[] = { + 0, + 12416, /* (0xC0 << 6) + (0x80) */ + 925824, /* (0xE0 << 12) + (0x80 << 6) + (0x80) */ + 63447168 /* (0xF0 << 18) + (0x80 << 12) + (0x80 << 6) + 0x80 */ +}; + +/* +** If a UTF-8 character contains N bytes extra bytes (N bytes follow +** the initial byte so that the total character length is N+1) then +** masking the character with utf8_mask[N] must produce a non-zero +** result. Otherwise, we have an (illegal) overlong encoding. +*/ +static const int utf_mask[] = { + 0x00000000, + 0xffffff80, + 0xfffff800, + 0xffff0000, +}; + +/* LMH salvaged from sqlite3 3.3.13 source code src/utf.c */ +#define READ_UTF8(zIn, c) { \ + int xtra; \ + c = *(zIn)++; \ + xtra = xtra_utf8_bytes[c]; \ + switch( xtra ){ \ + case 4: c = (int)0xFFFD; break; \ + case 3: c = (c<<6) + *(zIn)++; \ + case 2: c = (c<<6) + *(zIn)++; \ + case 1: c = (c<<6) + *(zIn)++; \ + c -= xtra_utf8_bits[xtra]; \ + if( (utf_mask[xtra]&c)==0 \ + || (c&0xFFFFF800)==0xD800 \ + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \ + } \ +} + +static int sqlite3ReadUtf8(const unsigned char *z){ + int c; + READ_UTF8(z, c); + return c; +} + +#define SKIP_UTF8(zIn) { \ + zIn += (xtra_utf8_bytes[*(u8 *)zIn] + 1); \ +} + +/* +** pZ is a UTF-8 encoded unicode string. If nByte is less than zero, +** return the number of unicode characters in pZ up to (but not including) +** the first 0x00 byte. If nByte is not less than zero, return the +** number of unicode characters in the first nByte of pZ (or up to +** the first 0x00, whichever comes first). +*/ +static int sqlite3Utf8CharLen(const char *z, int nByte){ + int r = 0; + const char *zTerm; + if( nByte>=0 ){ + zTerm = &z[nByte]; + }else{ + zTerm = (const char *)(-1); + } + assert( z<=zTerm ); + while( *z!=0 && z 0) ? 1: ( iVal < 0 ) ? -1: 0; + sqlite3_result_int64(context, iVal); + break; + } + case SQLITE_NULL: { + sqlite3_result_null(context); + break; + } + default: { + /* 2nd change below. Line for abs was: if( rVal<0 ) rVal = rVal * -1.0; */ + + rVal = sqlite3_value_double(argv[0]); + rVal = ( rVal > 0) ? 1: ( rVal < 0 ) ? -1: 0; + sqlite3_result_double(context, rVal); + break; + } + } +} + + +/* +** smallest integer value not less than argument +*/ +static void ceilFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + double rVal=0.0; + i64 iVal=0; + assert( argc==1 ); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_INTEGER: { + i64 iVal = sqlite3_value_int64(argv[0]); + sqlite3_result_int64(context, iVal); + break; + } + case SQLITE_NULL: { + sqlite3_result_null(context); + break; + } + default: { + rVal = sqlite3_value_double(argv[0]); + sqlite3_result_int64(context, (i64) ceil(rVal)); + break; + } + } +} + +/* +** largest integer value not greater than argument +*/ +static void floorFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + double rVal=0.0; + i64 iVal=0; + assert( argc==1 ); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_INTEGER: { + i64 iVal = sqlite3_value_int64(argv[0]); + sqlite3_result_int64(context, iVal); + break; + } + case SQLITE_NULL: { + sqlite3_result_null(context); + break; + } + default: { + rVal = sqlite3_value_double(argv[0]); + sqlite3_result_int64(context, (i64) floor(rVal)); + break; + } + } +} + +/* +** Given a string (s) in the first argument and an integer (n) in the second returns the +** string that constains s contatenated n times +*/ +static void replicateFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + unsigned char *z; /* input string */ + unsigned char *zo; /* result string */ + i64 iCount; /* times to repeat */ + i64 nLen; /* length of the input string (no multibyte considerations) */ + i64 nTLen; /* length of the result string (no multibyte considerations) */ + i64 i=0; + + if( argc!=2 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) + return; + + iCount = sqlite3_value_int64(argv[1]); + + if( iCount<0 ){ + sqlite3_result_error(context, "domain error", -1); + }else{ + + nLen = sqlite3_value_bytes(argv[0]); + nTLen = nLen*iCount; + z=sqlite3_malloc(nTLen+1); + zo=sqlite3_malloc(nLen+1); + if (!z || !zo){ + sqlite3_result_error_nomem(context); + if (z) sqlite3_free(z); + if (zo) sqlite3_free(zo); + return; + } + strcpy((char*)zo, (char*)sqlite3_value_text(argv[0])); + + for(i=0; i=n it's a NOP +** padl(NULL) = NULL +*/ +static void padlFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + i64 ilen; /* length to pad to */ + i64 zl; /* length of the input string (UTF-8 chars) */ + int i = 0; + const char *zi; /* input string */ + char *zo; /* output string */ + char *zt; + + assert( argc==2 ); + + if( sqlite3_value_type(argv[0]) == SQLITE_NULL ){ + sqlite3_result_null(context); + }else{ + zi = (char *)sqlite3_value_text(argv[0]); + ilen = sqlite3_value_int64(argv[1]); + /* check domain */ + if(ilen<0){ + sqlite3_result_error(context, "domain error", -1); + return; + } + zl = sqlite3Utf8CharLen(zi, -1); + if( zl>=ilen ){ + /* string is longer than the requested pad length, return the same string (dup it) */ + zo = sqlite3StrDup(zi); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + }else{ + zo = sqlite3_malloc(strlen(zi)+ilen-zl+1); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + zt = zo; + for(i=1; i+zl<=ilen; ++i){ + *(zt++)=' '; + } + /* no need to take UTF-8 into consideration here */ + strcpy(zt,zi); + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + sqlite3_free(zo); + } +} + +/* +** given an input string (s) and an integer (n) appends spaces at the end of s +** until it has a length of n characters. +** When s has a length >=n it's a NOP +** padl(NULL) = NULL +*/ +static void padrFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + i64 ilen; /* length to pad to */ + i64 zl; /* length of the input string (UTF-8 chars) */ + i64 zll; /* length of the input string (bytes) */ + int i = 0; + const char *zi; /* input string */ + char *zo; /* output string */ + char *zt; + + assert( argc==2 ); + + if( sqlite3_value_type(argv[0]) == SQLITE_NULL ){ + sqlite3_result_null(context); + }else{ + zi = (char *)sqlite3_value_text(argv[0]); + ilen = sqlite3_value_int64(argv[1]); + /* check domain */ + if(ilen<0){ + sqlite3_result_error(context, "domain error", -1); + return; + } + zl = sqlite3Utf8CharLen(zi, -1); + if( zl>=ilen ){ + /* string is longer than the requested pad length, return the same string (dup it) */ + zo = sqlite3StrDup(zi); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + }else{ + zll = strlen(zi); + zo = sqlite3_malloc(zll+ilen-zl+1); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + zt = strcpy(zo,zi)+zll; + for(i=1; i+zl<=ilen; ++i){ + *(zt++) = ' '; + } + *zt = '\0'; + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + sqlite3_free(zo); + } +} + +/* +** given an input string (s) and an integer (n) appends spaces at the end of s +** and adds spaces at the begining of s until it has a length of n characters. +** Tries to add has many characters at the left as at the right. +** When s has a length >=n it's a NOP +** padl(NULL) = NULL +*/ +static void padcFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + i64 ilen; /* length to pad to */ + i64 zl; /* length of the input string (UTF-8 chars) */ + i64 zll; /* length of the input string (bytes) */ + int i = 0; + const char *zi; /* input string */ + char *zo; /* output string */ + char *zt; + + assert( argc==2 ); + + if( sqlite3_value_type(argv[0]) == SQLITE_NULL ){ + sqlite3_result_null(context); + }else{ + zi = (char *)sqlite3_value_text(argv[0]); + ilen = sqlite3_value_int64(argv[1]); + /* check domain */ + if(ilen<0){ + sqlite3_result_error(context, "domain error", -1); + return; + } + zl = sqlite3Utf8CharLen(zi, -1); + if( zl>=ilen ){ + /* string is longer than the requested pad length, return the same string (dup it) */ + zo = sqlite3StrDup(zi); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + }else{ + zll = strlen(zi); + zo = sqlite3_malloc(zll+ilen-zl+1); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + zt = zo; + for(i=1; 2*i+zl<=ilen; ++i){ + *(zt++) = ' '; + } + strcpy(zt, zi); + zt+=zll; + for(; i+zl<=ilen; ++i){ + *(zt++) = ' '; + } + *zt = '\0'; + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + sqlite3_free(zo); + } +} + +/* +** given 2 string (s1,s2) returns the string s1 with the characters NOT in s2 removed +** assumes strings are UTF-8 encoded +*/ +static void strfilterFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *zi1; /* first parameter string (searched string) */ + const char *zi2; /* second parameter string (vcontains valid characters) */ + const char *z1; + const char *z21; + const char *z22; + char *zo; /* output string */ + char *zot; + int c1 = 0; + int c2 = 0; + + assert( argc==2 ); + + if( sqlite3_value_type(argv[0]) == SQLITE_NULL || sqlite3_value_type(argv[1]) == SQLITE_NULL ){ + sqlite3_result_null(context); + }else{ + zi1 = (char *)sqlite3_value_text(argv[0]); + zi2 = (char *)sqlite3_value_text(argv[1]); + /* + ** maybe I could allocate less, but that would imply 2 passes, rather waste + ** (possibly) some memory + */ + zo = sqlite3_malloc(strlen(zi1)+1); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + zot = zo; + z1 = zi1; + while( (c1=sqliteCharVal((unsigned char *)z1))!=0 ){ + z21=zi2; + while( (c2=sqliteCharVal((unsigned char *)z21))!=0 && c2!=c1 ){ + sqliteNextChar(z21); + } + if( c2!=0){ + z22=z21; + sqliteNextChar(z22); + strncpy(zot, z21, z22-z21); + zot+=z22-z21; + } + sqliteNextChar(z1); + } + *zot = '\0'; + + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + sqlite3_free(zo); + } +} + +/* +** Given a string z1, retutns the (0 based) index of it's first occurence +** in z2 after the first s characters. +** Returns -1 when there isn't a match. +** updates p to point to the character where the match occured. +** This is an auxiliary function. +*/ +static int _substr(const char* z1, const char* z2, int s, const char** p){ + int c = 0; + int rVal=-1; + const char* zt1; + const char* zt2; + int c1,c2; + + if( '\0'==*z1 ){ + return -1; + } + + while( (sqliteCharVal((unsigned char *)z2) != 0) && (c++)=0 ? rVal+s : rVal; +} + +/* +** given 2 input strings (s1,s2) and an integer (n) searches from the nth character +** for the string s1. Returns the position where the match occured. +** Characters are counted from 1. +** 0 is returned when no match occurs. +*/ + +static void charindexFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const u8 *z1; /* s1 string */ + u8 *z2; /* s2 string */ + int s=0; + int rVal=0; + + assert( argc==3 ||argc==2); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) || SQLITE_NULL==sqlite3_value_type(argv[1])){ + sqlite3_result_null(context); + return; + } + + z1 = sqlite3_value_text(argv[0]); + if( z1==0 ) return; + z2 = (u8*) sqlite3_value_text(argv[1]); + if(argc==3){ + s = sqlite3_value_int(argv[2])-1; + if(s<0){ + s=0; + } + }else{ + s = 0; + } + + rVal = _substr((char *)z1,(char *)z2,s,NULL); + sqlite3_result_int(context, rVal+1); +} + +/* +** given a string (s) and an integer (n) returns the n leftmost (UTF-8) characters +** if the string has a length<=n or is NULL this function is NOP +*/ +static void leftFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + int c=0; + int cc=0; + int l=0; + const unsigned char *z; /* input string */ + const unsigned char *zt; + unsigned char *rz; /* output string */ + + assert( argc==2); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) || SQLITE_NULL==sqlite3_value_type(argv[1])){ + sqlite3_result_null(context); + return; + } + + z = sqlite3_value_text(argv[0]); + l = sqlite3_value_int(argv[1]); + zt = z; + + while( sqliteCharVal(zt) && c++ 0 ){ + sqliteNextChar(zt); + } + + rz = sqlite3_malloc(ze-zt+1); + if (!rz){ + sqlite3_result_error_nomem(context); + return; + } + strcpy((char*) rz, (char*) (zt)); + sqlite3_result_text(context, (char*)rz, -1, SQLITE_TRANSIENT); + sqlite3_free(rz); +} + +#ifndef HAVE_TRIM +/* +** removes the whitespaces at the begining of a string. +*/ +const char* ltrim(const char* s){ + while( *s==' ' ) + ++s; + return s; +} + +/* +** removes the whitespaces at the end of a string. +** !mutates the input string! +*/ +void rtrim(char* s){ + char* ss = s+strlen(s)-1; + while( ss>=s && *ss==' ' ) + --ss; + *(ss+1)='\0'; +} + +/* +** Removes the whitespace at the begining of a string +*/ +static void ltrimFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *z; + + assert( argc==1); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) ){ + sqlite3_result_null(context); + return; + } + z = sqlite3_value_text(argv[0]); + sqlite3_result_text(context, ltrim(z), -1, SQLITE_TRANSIENT); +} + +/* +** Removes the whitespace at the end of a string +*/ +static void rtrimFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *z; + char *rz; + /* try not to change data in argv */ + + assert( argc==1); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) ){ + sqlite3_result_null(context); + return; + } + z = sqlite3_value_text(argv[0]); + rz = sqlite3StrDup(z); + rtrim(rz); + sqlite3_result_text(context, rz, -1, SQLITE_TRANSIENT); + sqlite3_free(rz); +} + +/* +** Removes the whitespace at the begining and end of a string +*/ +static void trimFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *z; + char *rz; + /* try not to change data in argv */ + + assert( argc==1); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) ){ + sqlite3_result_null(context); + return; + } + z = sqlite3_value_text(argv[0]); + rz = sqlite3StrDup(z); + rtrim(rz); + sqlite3_result_text(context, ltrim(rz), -1, SQLITE_TRANSIENT); + sqlite3_free(rz); +} +#endif + +/* +** given a pointer to a string s1, the length of that string (l1), a new string (s2) +** and it's length (l2) appends s2 to s1. +** All lengths in bytes. +** This is just an auxiliary function +*/ +// static void _append(char **s1, int l1, const char *s2, int l2){ +// *s1 = realloc(*s1, (l1+l2+1)*sizeof(char)); +// strncpy((*s1)+l1, s2, l2); +// *(*(s1)+l1+l2) = '\0'; +// } + +#ifndef HAVE_TRIM + +/* +** given strings s, s1 and s2 replaces occurrences of s1 in s by s2 +*/ +static void replaceFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *z1; /* string s (first parameter) */ + const char *z2; /* string s1 (second parameter) string to look for */ + const char *z3; /* string s2 (third parameter) string to replace occurrences of s1 with */ + int lz1; + int lz2; + int lz3; + int lzo=0; + char *zo=0; + int ret=0; + const char *zt1; + const char *zt2; + + assert( 3==argc ); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) ){ + sqlite3_result_null(context); + return; + } + + z1 = sqlite3_value_text(argv[0]); + z2 = sqlite3_value_text(argv[1]); + z3 = sqlite3_value_text(argv[2]); + /* handle possible null values */ + if( 0==z2 ){ + z2=""; + } + if( 0==z3 ){ + z3=""; + } + + lz1 = strlen(z1); + lz2 = strlen(z2); + lz3 = strlen(z3); + +#if 0 + /* special case when z2 is empty (or null) nothing will be changed */ + if( 0==lz2 ){ + sqlite3_result_text(context, z1, -1, SQLITE_TRANSIENT); + return; + } +#endif + + zt1=z1; + zt2=z1; + + while(1){ + ret=_substr(z2,zt1 , 0, &zt2); + + if( ret<0 ) + break; + + _append(&zo, lzo, zt1, zt2-zt1); + lzo+=zt2-zt1; + _append(&zo, lzo, z3, lz3); + lzo+=lz3; + + zt1=zt2+lz2; + } + _append(&zo, lzo, zt1, lz1-(zt1-z1)); + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + sqlite3_free(zo); +} +#endif + +/* +** given a string returns the same string but with the characters in reverse order +*/ +static void reverseFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *z; + const char *zt; + char *rz; + char *rzt; + int l = 0; + int i = 0; + + assert( 1==argc ); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) ){ + sqlite3_result_null(context); + return; + } + z = (char *)sqlite3_value_text(argv[0]); + l = strlen(z); + rz = sqlite3_malloc(l+1); + if (!rz){ + sqlite3_result_error_nomem(context); + return; + } + rzt = rz+l; + *(rzt--) = '\0'; + + zt=z; + while( sqliteCharVal((unsigned char *)zt)!=0 ){ + z=zt; + sqliteNextChar(zt); + for(i=1; zt-i>=z; ++i){ + *(rzt--)=*(zt-i); + } + } + + sqlite3_result_text(context, rz, -1, SQLITE_TRANSIENT); + sqlite3_free(rz); +} + +/* +** An instance of the following structure holds the context of a +** stdev() or variance() aggregate computation. +** implementaion of http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Algorithm_II +** less prone to rounding errors +*/ +typedef struct StdevCtx StdevCtx; +struct StdevCtx { + double rM; + double rS; + i64 cnt; /* number of elements */ +}; + +/* +** An instance of the following structure holds the context of a +** mode() or median() aggregate computation. +** Depends on structures defined in map.c (see map & map) +** These aggregate functions only work for integers and floats although +** they could be made to work for strings. This is usually considered meaningless. +** Only usuall order (for median), no use of collation functions (would this even make sense?) +*/ +typedef struct ModeCtx ModeCtx; +struct ModeCtx { + i64 riM; /* integer value found so far */ + double rdM; /* double value found so far */ + i64 cnt; /* number of elements so far */ + double pcnt; /* number of elements smaller than a percentile */ + i64 mcnt; /* maximum number of occurrences (for mode) */ + i64 mn; /* number of occurrences (for mode and percentiles) */ + i64 is_double; /* whether the computation is being done for doubles (>0) or integers (=0) */ + map* m; /* map structure used for the computation */ + int done; /* whether the answer has been found */ +}; + +/* +** called for each value received during a calculation of stdev or variance +*/ +static void varianceStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + StdevCtx *p; + + double delta; + double x; + + assert( argc==1 ); + p = sqlite3_aggregate_context(context, sizeof(*p)); + /* only consider non-null values */ + if( SQLITE_NULL != sqlite3_value_numeric_type(argv[0]) ){ + p->cnt++; + x = sqlite3_value_double(argv[0]); + delta = (x-p->rM); + p->rM += delta/p->cnt; + p->rS += delta*(x-p->rM); + } +} + +/* +** called for each value received during a calculation of mode of median +*/ +static void modeStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + ModeCtx *p; + i64 xi=0; + double xd=0.0; + i64 *iptr; + double *dptr; + int type; + + assert( argc==1 ); + type = sqlite3_value_numeric_type(argv[0]); + + if( type == SQLITE_NULL) + return; + + p = sqlite3_aggregate_context(context, sizeof(*p)); + + if( 0==(p->m) ){ + p->m = calloc(1, sizeof(map)); + if( type==SQLITE_INTEGER ){ + /* map will be used for integers */ + *(p->m) = map_make(int_cmp); + p->is_double = 0; + }else{ + p->is_double = 1; + /* map will be used for doubles */ + *(p->m) = map_make(double_cmp); + } + } + + ++(p->cnt); + + if( 0==p->is_double ){ + xi = sqlite3_value_int64(argv[0]); + iptr = (i64*)calloc(1,sizeof(i64)); + *iptr = xi; + map_insert(p->m, iptr); + }else{ + xd = sqlite3_value_double(argv[0]); + dptr = (double*)calloc(1,sizeof(double)); + *dptr = xd; + map_insert(p->m, dptr); + } +} + +/* +** Auxiliary function that iterates all elements in a map and finds the mode +** (most frequent value) +*/ +static void modeIterate(void* e, i64 c, void* pp){ + i64 ei; + double ed; + ModeCtx *p = (ModeCtx*)pp; + + if( 0==p->is_double ){ + ei = *(int*)(e); + + if( p->mcnt==c ){ + ++p->mn; + }else if( p->mcntriM = ei; + p->mcnt = c; + p->mn=1; + } + }else{ + ed = *(double*)(e); + + if( p->mcnt==c ){ + ++p->mn; + }else if(p->mcntrdM = ed; + p->mcnt = c; + p->mn=1; + } + } +} + +/* +** Auxiliary function that iterates all elements in a map and finds the median +** (the value such that the number of elements smaller is equal the the number of +** elements larger) +*/ +static void medianIterate(void* e, i64 c, void* pp){ + i64 ei; + double ed; + double iL; + double iR; + int il; + int ir; + ModeCtx *p = (ModeCtx*)pp; + + if(p->done>0) + return; + + iL = p->pcnt; + iR = p->cnt - p->pcnt; + il = p->mcnt + c; + ir = p->cnt - p->mcnt; + + if( il >= iL ){ + if( ir >= iR ){ + ++p->mn; + if( 0==p->is_double ){ + ei = *(int*)(e); + p->riM += ei; + }else{ + ed = *(double*)(e); + p->rdM += ed; + } + }else{ + p->done=1; + } + } + p->mcnt+=c; +} + +/* +** Returns the mode value +*/ +static void modeFinalize(sqlite3_context *context){ + ModeCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->m ){ + map_iterate(p->m, modeIterate, p); + map_destroy(p->m); + free(p->m); + + if( 1==p->mn ){ + if( 0==p->is_double ) + sqlite3_result_int64(context, p->riM); + else + sqlite3_result_double(context, p->rdM); + } + } +} + +/* +** auxiliary function for percentiles +*/ +static void _medianFinalize(sqlite3_context *context){ + ModeCtx *p; + p = (ModeCtx*) sqlite3_aggregate_context(context, 0); + if( p && p->m ){ + p->done=0; + map_iterate(p->m, medianIterate, p); + map_destroy(p->m); + free(p->m); + + if( 0==p->is_double ) + if( 1==p->mn ) + sqlite3_result_int64(context, p->riM); + else + sqlite3_result_double(context, p->riM*1.0/p->mn); + else + sqlite3_result_double(context, p->rdM/p->mn); + } +} + +/* +** Returns the median value +*/ +static void medianFinalize(sqlite3_context *context){ + ModeCtx *p; + p = (ModeCtx*) sqlite3_aggregate_context(context, 0); + if( p!=0 ){ + p->pcnt = (p->cnt)/2.0; + _medianFinalize(context); + } +} + +/* +** Returns the lower_quartile value +*/ +static void lower_quartileFinalize(sqlite3_context *context){ + ModeCtx *p; + p = (ModeCtx*) sqlite3_aggregate_context(context, 0); + if( p!=0 ){ + p->pcnt = (p->cnt)/4.0; + _medianFinalize(context); + } +} + +/* +** Returns the upper_quartile value +*/ +static void upper_quartileFinalize(sqlite3_context *context){ + ModeCtx *p; + p = (ModeCtx*) sqlite3_aggregate_context(context, 0); + if( p!=0 ){ + p->pcnt = (p->cnt)*3/4.0; + _medianFinalize(context); + } +} + +/* +** Returns the stdev value +*/ +static void stdevFinalize(sqlite3_context *context){ + StdevCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>1 ){ + sqlite3_result_double(context, sqrt(p->rS/(p->cnt-1))); + }else{ + sqlite3_result_double(context, 0.0); + } +} + +/* +** Returns the variance value +*/ +static void varianceFinalize(sqlite3_context *context){ + StdevCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>1 ){ + sqlite3_result_double(context, p->rS/(p->cnt-1)); + }else{ + sqlite3_result_double(context, 0.0); + } +} + +#ifdef SQLITE_SOUNDEX + +/* relicoder factored code */ +/* +** Calculates the soundex value of a string +*/ + +static void soundex(const u8 *zIn, char *zResult){ + int i, j; + static const unsigned char iCode[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + }; + + for(i=0; zIn[i] && !isalpha(zIn[i]); i++){} + if( zIn[i] ){ + zResult[0] = toupper(zIn[i]); + for(j=1; j<4 && zIn[i]; i++){ + int code = iCode[zIn[i]&0x7f]; + if( code>0 ){ + zResult[j++] = code + '0'; + } + } + while( j<4 ){ + zResult[j++] = '0'; + } + zResult[j] = 0; + }else{ + strcpy(zResult, "?000"); + } +} + +/* +** computes the number of different characters between the soundex value fo 2 strings +*/ +static void differenceFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + char zResult1[8]; + char zResult2[8]; + char *zR1 = zResult1; + char *zR2 = zResult2; + int rVal = 0; + int i = 0; + const u8 *zIn1; + const u8 *zIn2; + + assert( argc==2 ); + + if( sqlite3_value_type(argv[0])==SQLITE_NULL || sqlite3_value_type(argv[1])==SQLITE_NULL ){ + sqlite3_result_null(context); + return; + } + + zIn1 = (u8*)sqlite3_value_text(argv[0]); + zIn2 = (u8*)sqlite3_value_text(argv[1]); + + soundex(zIn1, zR1); + soundex(zIn2, zR2); + + for(i=0; i<4; ++i){ + if( sqliteCharVal((unsigned char *)zR1)==sqliteCharVal((unsigned char *)zR2) ) + ++rVal; + sqliteNextChar(zR1); + sqliteNextChar(zR2); + } + sqlite3_result_int(context, rVal); +} +#endif + +/* +** This function registered all of the above C functions as SQL +** functions. This should be the only routine in this file with +** external linkage. +*/ +int RegisterExtensionFunctions(sqlite3 *db){ + static const struct FuncDef { + char *zName; + signed char nArg; + u8 argType; /* 0: none. 1: db 2: (-1) */ + u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */ + u8 needCollSeq; + void (*xFunc)(sqlite3_context*,int,sqlite3_value **); + } aFuncs[] = { + /* math.h */ + { "acos", 1, 0, SQLITE_UTF8, 0, acosFunc }, + { "asin", 1, 0, SQLITE_UTF8, 0, asinFunc }, + { "atan", 1, 0, SQLITE_UTF8, 0, atanFunc }, + { "atn2", 2, 0, SQLITE_UTF8, 0, atn2Func }, + /* XXX alias */ + { "atan2", 2, 0, SQLITE_UTF8, 0, atn2Func }, + { "acosh", 1, 0, SQLITE_UTF8, 0, acoshFunc }, + { "asinh", 1, 0, SQLITE_UTF8, 0, asinhFunc }, + { "atanh", 1, 0, SQLITE_UTF8, 0, atanhFunc }, + + { "difference", 2, 0, SQLITE_UTF8, 0, differenceFunc}, + { "degrees", 1, 0, SQLITE_UTF8, 0, rad2degFunc }, + { "radians", 1, 0, SQLITE_UTF8, 0, deg2radFunc }, + + { "cos", 1, 0, SQLITE_UTF8, 0, cosFunc }, + { "sin", 1, 0, SQLITE_UTF8, 0, sinFunc }, + { "tan", 1, 0, SQLITE_UTF8, 0, tanFunc }, + { "cot", 1, 0, SQLITE_UTF8, 0, cotFunc }, + { "cosh", 1, 0, SQLITE_UTF8, 0, coshFunc }, + { "sinh", 1, 0, SQLITE_UTF8, 0, sinhFunc }, + { "tanh", 1, 0, SQLITE_UTF8, 0, tanhFunc }, + { "coth", 1, 0, SQLITE_UTF8, 0, cothFunc }, + + { "exp", 1, 0, SQLITE_UTF8, 0, expFunc }, + { "log", 1, 0, SQLITE_UTF8, 0, logFunc }, + { "log10", 1, 0, SQLITE_UTF8, 0, log10Func }, + { "power", 2, 0, SQLITE_UTF8, 0, powerFunc }, + { "sign", 1, 0, SQLITE_UTF8, 0, signFunc }, + { "sqrt", 1, 0, SQLITE_UTF8, 0, sqrtFunc }, + { "square", 1, 0, SQLITE_UTF8, 0, squareFunc }, + + { "ceil", 1, 0, SQLITE_UTF8, 0, ceilFunc }, + { "floor", 1, 0, SQLITE_UTF8, 0, floorFunc }, + + { "pi", 0, 0, SQLITE_UTF8, 1, piFunc }, + + + /* string */ + { "replicate", 2, 0, SQLITE_UTF8, 0, replicateFunc }, + { "charindex", 2, 0, SQLITE_UTF8, 0, charindexFunc }, + { "charindex", 3, 0, SQLITE_UTF8, 0, charindexFunc }, + { "leftstr", 2, 0, SQLITE_UTF8, 0, leftFunc }, + { "rightstr", 2, 0, SQLITE_UTF8, 0, rightFunc }, +#ifndef HAVE_TRIM + { "ltrim", 1, 0, SQLITE_UTF8, 0, ltrimFunc }, + { "rtrim", 1, 0, SQLITE_UTF8, 0, rtrimFunc }, + { "trim", 1, 0, SQLITE_UTF8, 0, trimFunc }, + { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc }, +#endif + { "reverse", 1, 0, SQLITE_UTF8, 0, reverseFunc }, + { "proper", 1, 0, SQLITE_UTF8, 0, properFunc }, + { "padl", 2, 0, SQLITE_UTF8, 0, padlFunc }, + { "padr", 2, 0, SQLITE_UTF8, 0, padrFunc }, + { "padc", 2, 0, SQLITE_UTF8, 0, padcFunc }, + { "strfilter", 2, 0, SQLITE_UTF8, 0, strfilterFunc }, + + }; + /* Aggregate functions */ + static const struct FuncDefAgg { + char *zName; + signed char nArg; + u8 argType; + u8 needCollSeq; + void (*xStep)(sqlite3_context*,int,sqlite3_value**); + void (*xFinalize)(sqlite3_context*); + } aAggs[] = { + { "stdev", 1, 0, 0, varianceStep, stdevFinalize }, + { "variance", 1, 0, 0, varianceStep, varianceFinalize }, + { "mode", 1, 0, 0, modeStep, modeFinalize }, + { "median", 1, 0, 0, modeStep, medianFinalize }, + { "lower_quartile", 1, 0, 0, modeStep, lower_quartileFinalize }, + { "upper_quartile", 1, 0, 0, modeStep, upper_quartileFinalize }, + }; + int i; + + for(i=0; ineedCollSeq = 1; + } + } +#endif + } + + for(i=0; ineedCollSeq = 1; + } + } +#endif + } + return 0; +} + +#ifdef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE +int sqlite3_extension_init( + sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi){ + SQLITE_EXTENSION_INIT2(pApi); + RegisterExtensionFunctions(db); + return 0; +} +#endif /* COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE */ + +map map_make(cmp_func cmp){ + map r; + r.cmp=cmp; + r.base = 0; + + return r; +} + +void* xcalloc(size_t nmemb, size_t size, char* s){ + void* ret = calloc(nmemb, size); + return ret; +} + +void xfree(void* p){ + free(p); +} + +void node_insert(node** n, cmp_func cmp, void *e){ + int c; + node* nn; + if(*n==0){ + nn = (node*)xcalloc(1,sizeof(node), "for node"); + nn->data = e; + nn->count = 1; + *n=nn; + }else{ + c=cmp((*n)->data,e); + if(0==c){ + ++((*n)->count); + xfree(e); + }else if(c>0){ + /* put it right here */ + node_insert(&((*n)->l), cmp, e); + }else{ + node_insert(&((*n)->r), cmp, e); + } + } +} + +void map_insert(map *m, void *e){ + node_insert(&(m->base), m->cmp, e); +} + +void node_iterate(node *n, map_iterator iter, void* p){ + if(n){ + if(n->l) + node_iterate(n->l, iter, p); + iter(n->data, n->count, p); + if(n->r) + node_iterate(n->r, iter, p); + } +} + +void map_iterate(map *m, map_iterator iter, void* p){ + node_iterate(m->base, iter, p); +} + +void node_destroy(node *n){ + if(0!=n){ + xfree(n->data); + if(n->l) + node_destroy(n->l); + if(n->r) + node_destroy(n->r); + + xfree(n); + } +} + +void map_destroy(map *m){ + node_destroy(m->base); +} + +int int_cmp(const void *a, const void *b){ + int64_t aa = *(int64_t *)(a); + int64_t bb = *(int64_t *)(b); + /* printf("cmp %d <=> %d\n",aa,bb); */ + if(aa==bb) + return 0; + else if(aa %d\n",aa,bb); */ + if(aa==bb) + return 0; + else if(aa %lld\n", ee,c); +} + diff --git a/src/extensions/extension-functions.def b/src/extensions/extension-functions.def new file mode 100644 index 000000000..df979a4ad --- /dev/null +++ b/src/extensions/extension-functions.def @@ -0,0 +1,16 @@ +EXPORTS + RegisterExtensionFunctions + double_cmp + int_cmp + map_destroy + map_insert + map_iterate + map_make + node_destroy + node_insert + node_iterate + print_elem + sqlite3_api + sqlite3_extension_init + xcalloc + xfree diff --git a/src/icons/comment_block.png b/src/icons/comment_block.png new file mode 100644 index 000000000..3b3ee4c48 Binary files /dev/null and b/src/icons/comment_block.png differ diff --git a/src/icons/hourglass.png b/src/icons/hourglass.png new file mode 100644 index 000000000..57b03ce7a Binary files /dev/null and b/src/icons/hourglass.png differ diff --git a/src/icons/icons.qrc b/src/icons/icons.qrc index a253a6ac0..e024aba6f 100644 --- a/src/icons/icons.qrc +++ b/src/icons/icons.qrc @@ -69,5 +69,7 @@ printer.png package_save.png cancel.png + comment_block.png + hourglass.png diff --git a/src/sql/sqlitetypes.h b/src/sql/sqlitetypes.h index 2827b6d6e..f6b1e9b5b 100644 --- a/src/sql/sqlitetypes.h +++ b/src/sql/sqlitetypes.h @@ -188,7 +188,7 @@ class Object explicit Object(const QString& name): m_name(name), m_fullyParsed(false) {} virtual ~Object() {} - virtual bool operator==(const Object& rhs) const; + bool operator==(const Object& rhs) const; virtual Types type() const = 0; static QString typeToString(Types type); diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp index c7c347ad4..eb0cf1d0b 100644 --- a/src/sqlitedb.cpp +++ b/src/sqlitedb.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -599,12 +600,12 @@ bool DBBrowserDB::close() return true; } -DBBrowserDB::db_pointer_type DBBrowserDB::get(QString user) +DBBrowserDB::db_pointer_type DBBrowserDB::get(QString user, bool force_wait) { if(!_db) return nullptr; - waitForDbRelease(); + waitForDbRelease(force_wait ? Wait : Ask); db_user = user; db_used = true; @@ -618,6 +619,11 @@ void DBBrowserDB::waitForDbRelease(ChoiceOnUse choice) if(!_db) return; + // We can't show a message box from another thread than the main thread. So instead of crashing we + // just decide that we don't interrupt any running query in this case. + if(choice == Ask && QThread::currentThread() != QApplication::instance()->thread()) + choice = Wait; + std::unique_lock lk(m); while(db_used) { // notify user, give him the opportunity to cancel that @@ -1429,7 +1435,10 @@ bool DBBrowserDB::alterTable(const sqlb::ObjectIdentifier& tablename, const sqlb // Newer versions of SQLite add a better ALTER TABLE support which we can use #if SQLITE_VERSION_NUMBER >= 3025000 - // If the name of a field should be changed do that by using SQLite's ALTER TABLE feature + // If the name of a field should be changed do that by using SQLite's ALTER TABLE feature. We build a new + // map for tracking column names here which uses the update column names as the old names too. This is to + // make sure we are using the new table layout for later updates. + AlterTableTrackColumns new_track_columns; for(const auto& old_name : track_columns.keys()) { QString new_name = track_columns[old_name]; @@ -1447,8 +1456,12 @@ bool DBBrowserDB::alterTable(const sqlb::ObjectIdentifier& tablename, const sqlb } changed_something = true; + new_track_columns.insert(new_name, new_name); + } else { + new_track_columns.insert(old_name, new_name); } } + track_columns.swap(new_track_columns); #endif // Update our schema representation to get the new table and all the changed triggers, views and indices diff --git a/src/sqlitedb.h b/src/sqlitedb.h index 0e744fb45..a62de1cd3 100644 --- a/src/sqlitedb.h +++ b/src/sqlitedb.h @@ -82,10 +82,13 @@ class DBBrowserDB : public QObject \param user a string that identifies the new user, and which can be displayed in the dialog box. + \param force_wait if set to true we won't ask the user to cancel + the running query but just wait until it is done. + \returns a unique_ptr containing the SQLite database handle, or nullptr in case no database is open. **/ - db_pointer_type get (QString user); + db_pointer_type get (QString user, bool force_wait = false); bool setSavepoint(const QString& pointname = "RESTOREPOINT"); bool releaseSavepoint(const QString& pointname = "RESTOREPOINT"); diff --git a/src/sqlitetablemodel.cpp b/src/sqlitetablemodel.cpp index e377f16c1..187c586ed 100644 --- a/src/sqlitetablemodel.cpp +++ b/src/sqlitetablemodel.cpp @@ -91,6 +91,8 @@ void SqliteTableModel::handleRowCountComplete (int life_id, int num_rows) m_rowCountAvailable = RowCount::Complete; handleFinishedFetch(life_id, num_rows, num_rows); + + emit finishedRowCount(); } void SqliteTableModel::reset() @@ -101,7 +103,6 @@ void SqliteTableModel::reset() m_query.clear(); m_headers.clear(); m_vDataTypes.clear(); - m_pseudoPk.clear(); m_mCondFormats.clear(); endResetModel(); @@ -158,7 +159,8 @@ void SqliteTableModel::setQuery(const sqlb::Query& query) if(!allOk) { QString sColumnQuery = QString::fromUtf8("SELECT * FROM %1;").arg(query.table().toString()); - m_query.setRowIdColumn("rowid"); + if(m_query.rowIdColumn().empty()) + m_query.setRowIdColumn("rowid"); m_headers.push_back("rowid"); m_headers.append(getColumns(nullptr, sColumnQuery, m_vDataTypes)); } @@ -167,7 +169,6 @@ void SqliteTableModel::setQuery(const sqlb::Query& query) std::vector column_names; for(const auto& h : m_headers) column_names.push_back(h.toStdString()); - //column_names.erase(column_names.begin(), column_names.begin()+1); m_query.setColumNames(column_names); // Apply new query and update view @@ -407,7 +408,7 @@ bool SqliteTableModel::setTypedData(const QModelIndex& index, bool isBlob, const if(oldValue == newValue && oldValue.isNull() == newValue.isNull()) return true; - if(m_db.updateRecord(m_query.table(), m_headers.at(index.column()), cached_row.at(0), newValue, isBlob, m_pseudoPk)) + if(m_db.updateRecord(m_query.table(), m_headers.at(index.column()), cached_row.at(0), newValue, isBlob, QString::fromStdString(m_query.rowIdColumn()))) { cached_row.replace(index.column(), newValue); if(m_headers.at(index.column()).toStdString() == m_query.rowIdColumn()) { @@ -546,7 +547,7 @@ bool SqliteTableModel::removeRows(int row, int count, const QModelIndex& parent) } } - bool ok = m_db.deleteRecords(m_query.table(), rowids, m_pseudoPk); + bool ok = m_db.deleteRecords(m_query.table(), rowids, QString::fromStdString(m_query.rowIdColumn())); if (ok) { beginRemoveRows(parent, row, row + count - 1); @@ -783,16 +784,16 @@ bool SqliteTableModel::dropMimeData(const QMimeData* data, Qt::DropAction, int r void SqliteTableModel::setPseudoPk(const QString& pseudoPk) { // Do nothing if the value didn't change - if(m_pseudoPk == pseudoPk) + if(m_query.rowIdColumn() == pseudoPk.toStdString()) return; if(pseudoPk.isEmpty()) { - m_pseudoPk.clear(); + m_query.rowIdColumn().clear(); if(m_headers.size()) - m_headers[0] = QString::fromStdString(m_query.rowIdColumn()); + m_headers[0] = QString("rowid"); } else { - m_pseudoPk = pseudoPk; + m_query.setRowIdColumn(pseudoPk.toStdString()); if(m_headers.size()) m_headers[0] = pseudoPk; } @@ -800,11 +801,16 @@ void SqliteTableModel::setPseudoPk(const QString& pseudoPk) buildQuery(); } +bool SqliteTableModel::hasPseudoPk() const +{ + return !(m_query.rowIdColumn() == "rowid" || m_query.rowIdColumn() == "_rowid_"); +} + bool SqliteTableModel::isEditable() const { return !m_query.table().isEmpty() && m_db.isOpen() && - ((m_db.getObjectByName(m_query.table()) && m_db.getObjectByName(m_query.table())->type() == sqlb::Object::Types::Table) || !m_pseudoPk.isEmpty()); + ((m_db.getObjectByName(m_query.table()) && m_db.getObjectByName(m_query.table())->type() == sqlb::Object::Types::Table) || !m_query.rowIdColumn().empty()); } void SqliteTableModel::triggerCacheLoad (int row) const diff --git a/src/sqlitetablemodel.h b/src/sqlitetablemodel.h index db6e29a17..2a92262aa 100644 --- a/src/sqlitetablemodel.h +++ b/src/sqlitetablemodel.h @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include @@ -99,7 +98,8 @@ class SqliteTableModel : public QAbstractTableModel // The pseudo-primary key is exclusively for editing views void setPseudoPk(const QString& pseudoPk); - QString pseudoPk() const { return m_pseudoPk; } + bool hasPseudoPk() const; + QString pseudoPk() const { return QString::fromStdString(m_query.rowIdColumn()); } sqlb::ForeignKeyClause getForeignKeyClause(int column) const; @@ -119,6 +119,7 @@ public slots: signals: void finishedFetch(int fetched_row_begin, int fetched_row_end); + void finishedRowCount(); protected: Qt::DropActions supportedDropActions() const override; @@ -172,7 +173,6 @@ public slots: bool nosync_isBinary(const QModelIndex& index) const; QString m_sQuery; - QString m_pseudoPk; QVector m_vDataTypes; QMap> m_mCondFormats; sqlb::Query m_query; diff --git a/src/sqltextedit.cpp b/src/sqltextedit.cpp index f5b73565d..5bc978e06 100644 --- a/src/sqltextedit.cpp +++ b/src/sqltextedit.cpp @@ -89,27 +89,44 @@ void SqlTextEdit::reloadSettings() void SqlTextEdit::toggleBlockComment() { int lineFrom, indexFrom, lineTo, indexTo; + // If there is no selection, select the current line if (!hasSelectedText()) { getCursorPosition(&lineFrom, &indexFrom); - setSelection(lineFrom, 0, lineFrom, lineLength(lineFrom)); + + // Windows lines requires an adjustment, otherwise the selection would + // end in the next line. + indexTo = text(lineFrom).endsWith("\r\n") ? lineLength(lineFrom)-1 : lineLength(lineFrom); + + setSelection(lineFrom, 0, lineFrom, indexTo); } getSelection(&lineFrom, &indexFrom, &lineTo, &indexTo); bool uncomment = text(lineFrom).contains(QRegExp("^[ \t]*--")); + // If the selection ends before the first character of a line, don't + // take this line into account for un/commenting. + if (indexTo==0) + lineTo--; + + beginUndoAction(); + // Iterate over the selected lines, get line text, make // replacement depending on whether the first line was commented - // or uncommented, and replace the line text. - for (int line=lineFrom; linees.png us.png fr.png + it.png ru.png cn.png br.png diff --git a/src/translations/flags/it.png b/src/translations/flags/it.png new file mode 100644 index 000000000..6bd49964c Binary files /dev/null and b/src/translations/flags/it.png differ diff --git a/src/translations/sqlb_ar_SA.ts b/src/translations/sqlb_ar_SA.ts index 6333ccf37..b06483429 100644 --- a/src/translations/sqlb_ar_SA.ts +++ b/src/translations/sqlb_ar_SA.ts @@ -865,8 +865,8 @@ Errors are indicated with a red squiggle underline. - Apply data to cell [Ctrl+Return] - طبّق البيانات على الخليّة [Ctrl+Enter] + Apply data to cell + طبّق البيانات على الخليّة @@ -2275,8 +2275,8 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] - أنعشِ البيانات في الجدول المحدّد [F5, Ctrl+R] + Refresh the data in the selected table + أنعشِ البيانات في الجدول المحدّد @@ -2300,8 +2300,8 @@ You can drag SQL statements from an object row and drop them into other applicat - Print currently browsed table data [Ctrl+P] - اطبع بيانات الجدول المتصفّح حاليًا [Ctrl+P] + Print currently browsed table data + اطبع بيانات الجدول المتصفّح حاليًا @@ -2703,13 +2703,13 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed الب&عيد - Execute SQL [F5, Ctrl+Return, Ctrl+R] - نفّذ SQL ‏[F5, Ctrl+Enter, Ctrl+R] + Execute SQL + نفّذ SQL - Execute current line [Shift+F5] - نفّذ السطر الحالي [Shift+F5] + Execute current line + نفّذ السطر الحالي @@ -3225,8 +3225,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] - نفّذ كلّ إفادات SQL أو المحدّد [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL + نفّذ كلّ إفادات SQL أو المحدّد @@ -3341,8 +3341,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find text in SQL editor [Ctrl+F] - ابحث عن النصوص في محرّر SQL ‏[Ctrl+F] + Find text in SQL editor + ابحث عن النصوص في محرّر SQL @@ -3361,8 +3361,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find or replace text in SQL editor [Ctrl+H] - ابحث أو استبدل النصوص في محرّر SQL ‏[Ctrl+H] + Find or replace text in SQL editor + ابحث أو استبدل النصوص في محرّر SQL @@ -3540,8 +3540,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print text from current SQL editor tab [Ctrl+P] - اطبع النصّ من لسان محرّر SQL الحالي [Ctrl+P] + Print text from current SQL editor tab + اطبع النصّ من لسان محرّر SQL الحالي @@ -3550,8 +3550,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print the structure of the opened database [Ctrl+P] - اطبع بنية قاعدة البيانات المفتوحة [Ctrl+P] + Print the structure of the opened database + اطبع بنية قاعدة البيانات المفتوحة @@ -3611,8 +3611,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed ن&فّذ SQL - Execute SQL [F5, Ctrl+Return] - نفّذ SQL ‏[F5, Ctrl+Return] + Execute SQL + نفّذ SQL @@ -3641,8 +3641,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed نفّذ السطر الحالي - Execute current line [Ctrl+E] - نفّذ السّطر الحاليّ [Ctrl+E] + Execute current line + نفّذ السّطر الحاليّ diff --git a/src/translations/sqlb_cs.ts b/src/translations/sqlb_cs.ts index ad2760e59..2082bdce8 100644 --- a/src/translations/sqlb_cs.ts +++ b/src/translations/sqlb_cs.ts @@ -701,7 +701,7 @@ Aborting execution%3. - Apply data to cell [Ctrl+Return] + Apply data to cell @@ -2533,8 +2533,8 @@ x~y Range: values between x and y DB Schéma - Execute SQL [F5, Ctrl+Return, Ctrl+R] - Proveďte SQL [F5, Ctrl+Return, Ctrl+R] + Execute SQL + Proveďte SQL &Load extension @@ -2542,8 +2542,8 @@ x~y Range: values between x and y - Execute current line [Shift+F5] - Provést aktuální řádek [Shift+F5] + Execute current line + Provést aktuální řádek @@ -3025,7 +3025,7 @@ x~y Range: values between x and y - Find text in SQL editor [Ctrl+F] + Find text in SQL editor @@ -3045,7 +3045,7 @@ x~y Range: values between x and y - Find or replace text in SQL editor [Ctrl+H] + Find or replace text in SQL editor @@ -3224,7 +3224,7 @@ x~y Range: values between x and y - Print text from current SQL editor tab [Ctrl+P] + Print text from current SQL editor tab @@ -3234,7 +3234,7 @@ x~y Range: values between x and y - Print the structure of the opened database [Ctrl+P] + Print the structure of the opened database @@ -3271,7 +3271,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] + Refresh the data in the selected table @@ -3296,7 +3296,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Print currently browsed table data [Ctrl+P] + Print currently browsed table data @@ -3488,7 +3488,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL diff --git a/src/translations/sqlb_de.ts b/src/translations/sqlb_de.ts index 1e25aaa41..d4317904e 100644 --- a/src/translations/sqlb_de.ts +++ b/src/translations/sqlb_de.ts @@ -844,8 +844,8 @@ Fehler werden durch eine rote Wellenlinie gekennzeichnet. - Apply data to cell [Ctrl+Return] - Daten auf Zelle anwenden [Strg+Return] + Apply data to cell + Daten auf Zelle anwenden @@ -2459,8 +2459,8 @@ Sie können SQL-Statements aus einer Objektzeile fassen und in anderen Anwendung - Refresh the data in the selected table [F5, Ctrl+R] - Die Daten in der ausgewählten Tabelle aktualisieren [F5, Strg+R] + Refresh the data in the selected table + Die Daten in der ausgewählten Tabelle aktualisieren @@ -2489,8 +2489,8 @@ Sie können SQL-Statements aus einer Objektzeile fassen und in anderen Anwendung - Print currently browsed table data [Ctrl+P] - Aktuell angezeigte Tabellendaten drucken [Strg+P] + Print currently browsed table data + Aktuell angezeigte Tabellendaten drucken @@ -2546,8 +2546,8 @@ Sie können SQL-Statements aus einer Objektzeile fassen und in anderen Anwendung - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] - Komplettes/ausgewähltes SQL ausführen [F5, Strg+Enter, Strg+R] + Execute all/selected SQL + Komplettes/ausgewähltes SQL ausführen @@ -2667,8 +2667,8 @@ Sie können SQL-Statements aus einer Objektzeile fassen und in anderen Anwendung - Find text in SQL editor [Ctrl+F] - Text im SQL-Editor finden [Strg+F] + Find text in SQL editor + Text im SQL-Editor finden @@ -2687,8 +2687,8 @@ Sie können SQL-Statements aus einer Objektzeile fassen und in anderen Anwendung - Find or replace text in SQL editor [Ctrl+H] - Text im SQL-Editor suchen oder ersetzen [Strg+H] + Find or replace text in SQL editor + Text im SQL-Editor suchen oder ersetzen @@ -2866,8 +2866,8 @@ Sie können SQL-Statements aus einer Objektzeile fassen und in anderen Anwendung - Print text from current SQL editor tab [Ctrl+P] - Den Text aus dem aktuellen SQL-Editortab drucken [Strg+P] + Print text from current SQL editor tab + Den Text aus dem aktuellen SQL-Editortab drucken @@ -2876,8 +2876,8 @@ Sie können SQL-Statements aus einer Objektzeile fassen und in anderen Anwendung - Print the structure of the opened database [Ctrl+P] - Die Struktur der geöffneten Datenbank drucken [Strg+P] + Print the structure of the opened database + Die Struktur der geöffneten Datenbank drucken @@ -3158,13 +3158,13 @@ Sie können SQL-Statements aus der Schemaspalte nehmen und in den SQL-Editor ode Entfe&rnt - Execute SQL [F5, Ctrl+Return, Ctrl+R] - SQL ausführen [F5, Ctrl+Return, Ctrl+R] + Execute SQL + SQL ausführen - Execute current line [Shift+F5] - Aktuelle Zeile ausführen [Shift+F5] + Execute current line + Aktuelle Zeile ausführen @@ -3825,8 +3825,8 @@ Sie können SQL-Statements aus der Schemaspalte nehmen und in den SQL-Editor ode SQL &ausführen - Execute SQL [F5, Ctrl+Return] - SQL ausführen [F5, Strg+Return] + Execute SQL + SQL ausführen &Load extension @@ -3890,8 +3890,8 @@ Sie können SQL-Statements aus der Schemaspalte nehmen und in den SQL-Editor ode Aktuelle Zeile ausführen - Execute current line [Ctrl+E] - Aktuelle Zeile ausführen [Strg+E] + Execute current line + Aktuelle Zeile ausführen diff --git a/src/translations/sqlb_en_GB.ts b/src/translations/sqlb_en_GB.ts index 51175e33d..c3f24da18 100644 --- a/src/translations/sqlb_en_GB.ts +++ b/src/translations/sqlb_en_GB.ts @@ -652,7 +652,7 @@ Aborting execution%3. - Apply data to cell [Ctrl+Return] + Apply data to cell @@ -2251,7 +2251,7 @@ x~y Range: values between x and y - Execute current line [Shift+F5] + Execute current line @@ -2344,7 +2344,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] + Refresh the data in the selected table @@ -2369,7 +2369,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Print currently browsed table data [Ctrl+P] + Print currently browsed table data @@ -2791,7 +2791,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find text in SQL editor [Ctrl+F] + Find text in SQL editor @@ -2811,7 +2811,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find or replace text in SQL editor [Ctrl+H] + Find or replace text in SQL editor @@ -2990,7 +2990,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print text from current SQL editor tab [Ctrl+P] + Print text from current SQL editor tab @@ -3000,7 +3000,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print the structure of the opened database [Ctrl+P] + Print the structure of the opened database @@ -3111,7 +3111,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL diff --git a/src/translations/sqlb_es_ES.ts b/src/translations/sqlb_es_ES.ts index 4e37aaf96..18cdad963 100644 --- a/src/translations/sqlb_es_ES.ts +++ b/src/translations/sqlb_es_ES.ts @@ -806,7 +806,7 @@ Abortando ejecución%3. Ctrl+Shift+C - Ctrl+May+C + Ctrl+Shift+C Import text @@ -856,8 +856,8 @@ Los errores se indican con un subrayado ondulado rojo. - Apply data to cell [Ctrl+Return] - Aplicar los datos a la celda [Ctrl+Return] + Apply data to cell + Aplicar los datos a la celda @@ -1812,7 +1812,7 @@ Do you want to insert it anyway? Ctrl+Shift+C - Ctrl+May+C + Ctrl+Shift+C @@ -2519,7 +2519,7 @@ También puede arrastrar varias sentencias SQL desde la columna «Esquema» y so Compact &Database... - Compactar Base de &Datos... + Compactar base de &datos... @@ -2533,8 +2533,8 @@ También puede arrastrar varias sentencias SQL desde la columna «Esquema» y so - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] - Ejecuta todo el SQL (o la selección) [F5, Ctrl+Intro, Ctrl+R] + Execute all/selected SQL + Ejecuta todo el SQL (o la selección) @@ -2668,7 +2668,7 @@ También puede arrastrar varias sentencias SQL desde la columna «Esquema» y so Drag && Drop Enquoted Names - Arrastrar y Soltar Nombres Entrecomillados + Arrastrar y soltar nombres entrecomillados @@ -2734,8 +2734,8 @@ También puede arrastrar varias sentencias SQL desde la columna «Esquema» y so - Print text from current SQL editor tab [Ctrl+P] - Imprime el texto de la pestaña actual del editor SQL [Ctrl+P] + Print text from current SQL editor tab + Imprime el texto de la pestaña actual del editor SQL @@ -2744,8 +2744,8 @@ También puede arrastrar varias sentencias SQL desde la columna «Esquema» y so - Print the structure of the opened database [Ctrl+P] - Imprime la estructura de la base de datos abierta [Ctrl+P] + Print the structure of the opened database + Imprime la estructura de la base de datos abierta @@ -2835,8 +2835,8 @@ Usted puede arrastrar sentencias SQL desde una fila de objeto y soltarlas en otr - Refresh the data in the selected table [F5, Ctrl+R] - Refresca los datos en la tabla seleccionada [F5, Ctrl+R] + Refresh the data in the selected table + Refresca los datos en la tabla seleccionada @@ -2860,8 +2860,8 @@ Usted puede arrastrar sentencias SQL desde una fila de objeto y soltarlas en otr - Print currently browsed table data [Ctrl+P] - Imprime los datos de la tabla mostrada actualmente [Ctrl+P] + Print currently browsed table data + Imprime los datos de la tabla mostrada actualmente @@ -3133,8 +3133,8 @@ Usted puede arrastrar sentencias SQL desde una fila de objeto y soltarlas en otr - Find text in SQL editor [Ctrl+F] - Buscar texto en el editor SQL [Ctrl+F] + Find text in SQL editor + Buscar texto en el editor SQL @@ -3153,8 +3153,8 @@ Usted puede arrastrar sentencias SQL desde una fila de objeto y soltarlas en otr - Find or replace text in SQL editor [Ctrl+H] - Buscar o reemplazar texto en el editor SQL [Ctrl+H] + Find or replace text in SQL editor + Buscar o reemplazar texto en el editor SQL @@ -3292,8 +3292,8 @@ Puede arrastrar sentencias SQL desde la columna Esquema y soltarlas en el editor &Remoto - Execute SQL [F5, Ctrl+Return, Ctrl+R] - Ejecuta SQL [F5, Ctrl+Intro, Ctrl+R] + Execute SQL + Ejecuta SQL &Load extension @@ -3301,13 +3301,13 @@ Puede arrastrar sentencias SQL desde la columna Esquema y soltarlas en el editor - Execute current line [Shift+F5] - Ejecuta la línea actual [May+F5] + Execute current line + Ejecuta la línea actual Shift+F5 - May+F5 + Shift+F5 Sa&ve Project @@ -3764,7 +3764,7 @@ Puede arrastrar sentencias SQL desde la columna Esquema y soltarlas en el editor Shift+F1 - May+F1 + Shift+F1 &About... @@ -3900,8 +3900,8 @@ Puede arrastrar sentencias SQL desde la columna Esquema y soltarlas en el editor &Ejecutar SQL - Execute SQL [F5, Ctrl+Return] - Ejecuta SQL [F5, Ctrl+Return] + Execute SQL + Ejecuta SQL @@ -3925,8 +3925,8 @@ Puede arrastrar sentencias SQL desde la columna Esquema y soltarlas en el editor Ejecutar la línea actual - Execute current line [Ctrl+E] - Ejecuta la línea actual [Ctrl+E] + Execute current line + Ejecuta la línea actual @@ -5561,7 +5561,7 @@ usando una extensión. Necesitará reiniciar la aplicación.</p> Extensions(*.so *.dll);;All files(*) - Extensiones(*.so *.dll);;Todos los archivos + Extensiones(*.so *.dll);;Todos los archivos(*) @@ -5901,7 +5901,7 @@ p, li { white-space: pre-wrap; } Shift+F3 - May+F3 + Shift+F3 diff --git a/src/translations/sqlb_fr.ts b/src/translations/sqlb_fr.ts index fc78349a7..20ed15306 100644 --- a/src/translations/sqlb_fr.ts +++ b/src/translations/sqlb_fr.ts @@ -858,8 +858,8 @@ Les erreurs sont signalées par un tilde rouge souligné. - Apply data to cell [Ctrl+Return] - Appliquer les données à la cellule [Ctrl+Retour] + Apply data to cell + Appliquer les données à la cellule @@ -2867,8 +2867,8 @@ x~y Plage : valeurs comprises entre x et y - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] - Exécuter soit Tout soit le SQL sélectionné [F5, Ctrl+Entrée, Ctrl+R] + Execute all/selected SQL + Exécuter soit Tout soit le SQL sélectionné @@ -2983,8 +2983,8 @@ x~y Plage : valeurs comprises entre x et y - Find text in SQL editor [Ctrl+F] - Rechercher du texte dans l'éditeur SQL [Ctrl+F] + Find text in SQL editor + Rechercher du texte dans l'éditeur SQL @@ -3003,8 +3003,8 @@ x~y Plage : valeurs comprises entre x et y - Find or replace text in SQL editor [Ctrl+H] - Rechercher ou remplacer du texte dans l'éditeur SQL [Ctrl+F] + Find or replace text in SQL editor + Rechercher ou remplacer du texte dans l'éditeur SQL @@ -3182,7 +3182,7 @@ x~y Plage : valeurs comprises entre x et y - Print text from current SQL editor tab [Ctrl+P] + Print text from current SQL editor tab Imprime le contenu de l'onglet en cours de l'éditeur SQL [Ctrp+P] @@ -3192,8 +3192,8 @@ x~y Plage : valeurs comprises entre x et y - Print the structure of the opened database [Ctrl+P] - Imprime la structure de la base de données ouverte [Ctrl+P] + Print the structure of the opened database + Imprime la structure de la base de données ouverte @@ -3420,8 +3420,8 @@ Vous pouvez faire glisser les instructions SQL de la colonne Schéma et les dép &Exécuter le SQL - Execute SQL [F5, Ctrl+Return] - Exécuter le SQL [F5 ou Ctrl+Entrée] + Execute SQL + Exécuter le SQL &Load extension @@ -3489,8 +3489,8 @@ Vous pouvez faire glisser les instructions SQL d'une ligne d'objet et - Refresh the data in the selected table [F5, Ctrl+R] - Rafraîchir les données de la table sélectionnée [F5, Ctrl+R] + Refresh the data in the selected table + Rafraîchir les données de la table sélectionnée @@ -3514,8 +3514,8 @@ Vous pouvez faire glisser les instructions SQL d'une ligne d'objet et - Print currrently browsed table data [Ctrl+P] - Imprimer le données de la table actuellement parcourues [Ctrl+P] + Print currrently browsed table data + Imprimer le données de la table actuellement parcourues @@ -3821,8 +3821,8 @@ Vous pouvez faire glisser les instructions SQL d'une ligne d'objet et &Qu'est-ce que c'est ? - Execute SQL [F5, Ctrl+Return, Ctrl+R] - Exécuter le SQL [F5 ou Ctrl+Entrée; Ctrl+R] + Execute SQL + Exécuter le SQL @@ -3838,7 +3838,7 @@ Vous pouvez faire glisser les instructions SQL d'une ligne d'objet et - Execute current line [Shift+F5] + Execute current line Exécuter la ligne courante (Maj+F5) @@ -3968,7 +3968,7 @@ Vous pouvez faire glisser les instructions SQL d'une ligne d'objet et Exécuter la ligne courante - Execute current line [Ctrl+E] + Execute current line Exécuter la ligne courante (Ctrl+E) diff --git a/src/translations/sqlb_it.ts b/src/translations/sqlb_it.ts new file mode 100644 index 000000000..6a3f3c782 --- /dev/null +++ b/src/translations/sqlb_it.ts @@ -0,0 +1,5329 @@ + + + + + AboutDialog + + + About DB Browser for SQLite + Riguardo DB Browser per SQLite + + + + Version + Versione + + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB-Browser per SQLite è uno strumento grafico opensource e freeware usato per creare, struttutturare e modificare file database di SQLite</p><p>È rilasciato sotto la licenza Mozilla Public License Version 2, così come sotto la licenza GNU General Public License Version 3 o successive. È possibile modificarlo e redistribuirlo sotto le condizioni specificate da queste licenze.</p><p>Si veda <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> e <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> per ulteriori dettagli.</p><p>Per ulteriori dettagli riguardo questo programma visitate il nostro sito web a: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">Questo software usa GPL/LGPL QT Toolkit da </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Si veda </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> per termini di licenza e informazioni.</span></p><p><span style=" font-size:small;">Utilizza inoltre Silk-Iconset di Mark James, rilasciato sotto licenza Creative Commons Attribution 2.5 e 3.0.<br/>Si veda </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> per ulteriori dettagli.</span></p></body></html> + + + + SQLite Version + SQLite Version + + + + SQLCipher Version + SQLCipher Version + + + + (based on SQLite %1) + (basato su SQLite %1) + + + + Version + Version + + + + Qt Version + Qt Version + + + + AddRecordDialog + + + Add New Record + Aggiungi un nuovo record + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + Inserisci i valori per il nuovo record considerando i vincoli. I campi in grassetto sono obbligatori. + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + Nella colonna Valore puoi specificare il valore per il campo identificato dalla colonna Nome. La colonna Tipo indica il tipo di campo. I valori di default sono mostrati nello stesso stile come valori NULL. + + + + Name + Nome + + + + Type + Tipo + + + + Value + Valore + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + Valori da inserire. Sono preinseriti dei valori di default automaticamente a meno che essi non vengano cambiati. + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + Quando modifichi i valori nel riquadro superiore, la query SQL per inserire questo nuovo record è mostrata qui. Puoi modificare manualmente la query prima di salvare. + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Salva</span>invia la richiesta SQL mostrata al database per inserire un nuovo record.</p><p><span style=" font-weight:600;">Ripristina Defaults</span>ripristinerà i valori iniziali della colonna <span style=" font-weight:600;">Valore</span>.</p><p><span style=" font-weight:600;">Annulla</span>chiuderà questa finestra di dialogo senza eseguire la query.</p></body></html> + + + + Auto-increment + + Auto-increment + + + + Unique constraint + + Constraint unico + + + + Check constraint: %1 + + Controlla constraint: %1 + + + + Foreign key: %1 + + Foreign key: %1 + + + + Default value: %1 + + Valore di default: %1 + + + + Error adding record. Message from database engine: + +%1 + Errore nell'aggiungere il record. Messaggio dal database engine: + +%1 + + + + Are you sure you want to restore all the entered values to their defaults? + Sei sicuro di voler ripristinare tutti i valori inseriti ai loro valori di default? + + + + Application + + + Usage: %1 [options] [db] + + Utilizzo: %1 [opzioni] [db] + + + + Possible command line arguments: + Possibili argomenti da linea di comando: + + + + -h, --help Show command line options + -h, --help Mostra opzioni della linea di comando + + + + -q, --quit Exit application after running scripts + -q, --quit Esci dall'applicazione dopo aver eseguito gli script + + + + -s, --sql [file] Execute this SQL file after opening the DB + -s, --sql [file] Esegui questo file SQL dopo aver aperto il DB + + + + -t, --table [table] Browse this table after opening the DB + -t, --table [table] Esplora questa tabella dopo aver aperto il DB + + + + -R, --read-only Open database in read-only mode + -R, --read-only Apri il database in modalità sola lettura + + + + -v, --version Display the current version + -v, --version Mostra la versione corrente + + + + [file] Open this SQLite database + [file] Apri questo database SQLite + + + + This is DB Browser for SQLite version %1. + Questo è il DB Browser per SQLite versione %1. + + + + The -s/--sql option requires an argument + L'opzione -s/--sql richiede un argomento + + + + The file %1 does not exist + Il file %1 non esiste + + + + The -t/--table option requires an argument + L'opzione -t/--table richiede un argomento + + + + Invalid option/non-existant file: %1 + Opzione non valida/file inesistente: %1 + + + + CipherDialog + + + SQLCipher encryption + SQLCipher encryption + + + + &Password + &Password + + + + &Reenter password + &Reinserisci password + + + + Page si&ze + Di&mensioni pagina + + + + Passphrase + Passphrase + + + + Raw key + Raw key + + + + Please set a key to encrypt the database. +Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. +Leave the password fields empty to disable the encryption. +The encryption process might take some time and you should have a backup copy of your database! Unsaved changes are applied before modifying the encryption. + Perfavore inserisci una chiave per criptare il database. +Nota che se cambi una qualsiasi delle altre impostazioni opzionali, dovrai reinserirle ogni volta che apri il file del database. +Lascia i campi password vuoti per disabilitare la crittografia. +Il processo di crittazione può richiedere del tempo e dovresti avere una copia di backup del database! Modifiche non salvate sono applicate prima di modificare la crittografia. + + + + Please enter the key used to encrypt the database. +If any of the other settings were altered for this database file you need to provide this information as well. + Perfavore inserire una chiave da utilizzare per criptare il database. +Se una qualsiasi delle altre impostazioni sono state modificate per questo file database devi fornire anche questa informazione. + + + + ColumnDisplayFormatDialog + + + Choose display format + Seleziona il formato di visualizzazione + + + + Display format + Formato di visualizzazione + + + + Choose a display format for the column '%1' which is applied to each value prior to showing it. + Seleziona un formato di visualizzazione per la colonna '%1' che è applicato a ciascun valore prima di mostrarlo. + + + + Default + Default + + + + Decimal number + Numero decimale + + + + Exponent notation + Notazione esponenziale + + + + Hex blob + Hex blob + + + + Hex number + Hex number + + + + Octal number + Octal number + + + + Round number + Numero arrotondato + + + + Apple NSDate to date + Apple NSDate ad oggi + + + + Java epoch (milliseconds) to date + Java epoch (millisecondi) ad oggi + + + + Julian day to date + Giorno giuliano ad oggi + + + + Unix epoch to date + Unix epoch ad oggi + + + + Unix epoch to local time + Unix epoch in tempo locale + + + + Windows DATE to date + Windows DATE ad oggi + + + + Date as dd/mm/yyyy + Data come dd/mm/yyyy + + + + Lower case + Lower case + + + + Upper case + Upper case + + + + Custom + Custom + + + + DBBrowserDB + + + This database has already been attached. Its schema name is '%1'. + Questo database è già stato aggiunto. Il nome del suo schema è '%1'. + + + + Please specify the database name under which you want to access the attached database + Perfavore specifica il nome del database sotto il quale vuoi accedere al databse aggiunto + + + + Invalid file format + Formato file non valido + + + + Do you really want to close this temporary database? All data will be lost. + Vuoi davvero chiudere questo database temporaneo? Tutti i dati andranno persi. + + + + Do you want to save the changes made to the database file %1? + Vuoi salvare i cambiamenti fatti a questo file database %1? + + + + The database is currently busy: + Questo database è al momento occupato: + + + + Do you want to abort that other operation? + Vuoi abortire quell'altra operazione? + + + + Exporting database to SQL file... + Esportando il database in file SQL... + + + + + Cancel + Annulla + + + + + No database file opened + Nessun file database aperto + + + + Executing SQL... + Eseguendo SQL... + + + + Action cancelled. + Azione annullata. + + + + + Error in statement #%1: %2. +Aborting execution%3. + Errore nello statement #%1: %2. +Abortendo l'esecuzione%3. + + + + + and rolling back + e tornado indietro + + + + Cannot delete this object + Non posso cancellare questo oggetto + + + + Cannot set data on this object + Non posso impostare i dati in questo oggetto + + + + A table with the name '%1' already exists in schema '%2'. + Una tabella con il nome '%1' esiste già nello schema '%2'. + + + + renameColumn: cannot find column %1. + Rinomina Colonna: non posso trovare la colonna %1. + + + + renameColumn: creating savepoint failed. DB says: %1 + Rinomina Colonna: creazione di un punto di salvataggio fallito. DB dice: %1 + + + + renameColumn: creating new table failed. DB says: %1 + Rinomina Colonna: creazione di una nuova tabella fallita. DB dice: %1 + + + + renameColumn: copying data to new table failed. DB says: +%1 + Rinomina Colonna: copia dei dati in una nuova tabella fallita. DB dice: +%1 + + + + renameColumn: deleting old table failed. DB says: %1 + Rinomina Colonna: cancellazione della vecchia tabella fallita. DB dice: %1 + + + + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: + + + Ripristino di alcuni oggetti associati a questa tabella fallito. Questo è probabilmente dovuto al fatto che i nomi di alcune colonne sono cambiati . Qui c'è il SQL statement che potresti voler sistemare ed eseguire manualmente: + + + + + + renameColumn: releasing savepoint failed. DB says: %1 + Rinomina Colonna: rilascio del savepoint fallito. DB dice: %1 + + + + Error renaming table '%1' to '%2'.Message from database engine: +%3 + Errore nel rinominare la tabella '%1' in '%2'.Messaggio dal database engine: +%3 + + + + ... <string can not be logged, contains binary data> ... + ... <string non può essere loggato, continene dati binari> ... + + + + could not get list of db objects: %1, %2 + non è possibile ricavare la lista degli oggetti db: %1, %2 + + + + could not get list of databases: %1 + non è possibile ricavare la lista dei database: %1 + + + + didn't receive any output from pragma %1 + non ho ricevuto nessun output da pragma %1 + + + + could not execute pragma command: %1, %2 + non è possibile eseguire il comando pragma: %1, %2 + + + + Error setting pragma %1 to %2: %3 + Errore nell'impostare pragma %1 in %2: %3 + + + + File not found. + File non trovato. + + + + Error loading extension: %1 + Errore nel caricare l'estenzione: %1 + + + + could not get column information + non è possibile ricavare informazioni sulla colonna + + + + DbStructureModel + + + Name + Nome + + + + Object + Oggetto + + + + Type + Tipo + + + + Schema + Schema + + + + Database + Database + + + + Browsables + Navigabili + + + + All + Tutti + + + + Temporary + Temporaneo + + + + Tables (%1) + Tabelle (%1) + + + + Indices (%1) + Indici (%1) + + + + Views (%1) + Viste (%1) + + + + Triggers (%1) + Triggers (%1) + + + + EditDialog + + + Edit database cell + Modifica la cella del database + + + + Mode: + Modalità: + + + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + Questa è la lista delle modalità supportate dall'editor della cella. Scegli una modalità per vedere o modificare i dati della cella corrente. + + + + Text + Testo + + + + Binary + Binario + + + + Image + Immagine + + + + JSON + JSON + + + + XML + XML + + + + + Automatically adjust the editor mode to the loaded data type + Aggiusta automaticamente la modalità dell'editor in base al tipo di dato caricato + + + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + Questo bottone spuntabile permette di abilitare o disabilitare lo switching automatico della modalità dell'editor. Quando una nuova cella è selezionata o sono importati nuovi dati e la modalità di switching automaitca è abilitata, la modalità si aggiusta al tipo di dato rilevato. Puoi cambiare in seguito la modalità dell'editor in modo manuale. Se vuoi mantenere questa modalità cambiata manualmente mentre ti muovi tre le celle, togli la spunta a questo bottone. + + + + Auto-switch + Auto-switch + + + + + Auto-format: pretty print on loading, compact on saving. + Auto-formato: migliore stampa al caricamento, compatta in salvataggio. + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + Quando abilitato, la feature dell'auto-formato formatta i dati al caricamento, rompe il testo in righe e lo indenta per una maggiore leggibilità. Al salvataggio dei dati, la feature dell'auto-formato compatta i dati rimuovendo i fine riga, e spazi bianchi non necessari. + + + + Autoformat + Autoformato + + + + Import from file + Importa da file + + + + Opens a file dialog used to import any kind of data to this database cell. + Apri una finestra di dialogo per importare qualsiasi tipo di dato in questa cella del database. + + + + &Import + &Importa + + + + Export to file + Esporta in un file + + + + Opens a file dialog used to export the contents of this database cell to a file. + Apri una finestra di dialogo utilizzata per esportare i contenuti di questa cella del database in un file. + + + + &Export + &Esporta + + + + Set this cell to NULL + Imposta questa cella a NULL + + + + Erases the contents of the cell + Cancella i contenuti di questa cella + + + + Set as &NULL + Imposta come &NULL + + + + This area displays information about the data present in this database cell + Quest'area mostra informazioni riguardo i dati presenti in questa cella del database + + + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + Questa modalità editor ti permette di modificare dati JSON o XML con evidenziazione della sintassi, formattazione e validazione autmoatica prima del salvataggio. + +Gli errori sono indiacati con una riga rossa ondulata. + + + + Type of data currently in cell + Tipo di dato attualmente nella cella + + + + Size of data currently in table + Dimensione dei dati attualmente in tabella + + + + Apply data to cell [Ctrl+Return] + Applica i dati alla cella [Ctrl+Return] + + + + This button saves the changes performed in the cell editor to the database cell. + Questo bottone salva le modifiche fatte alla cella dell'editor alla cella del database. + + + + Apply + Applica + + + + + Print... + Stampa... + + + + Open preview dialog for printing displayed image + Apri la finestra di anteprima per stampare l'immagine mostrata + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + Apri la finestra di anteprima per stampare il testo mostrato + + + + Copy Hex and ASCII + Copia HEX e ASCII + + + + Copy selected hexadecimal and ASCII columns to the clipboard + Copia le colonne esadecimali e ASCII selezionate negli appunti + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + + Image data can't be viewed in this mode. + Dati immagine non possono essere visualizzati in questa modalità. + + + + + Try switching to Image or Binary mode. + Prova a cambiare in modalità binaria o immagine. + + + + + Binary data can't be viewed in this mode. + Dati binari non possono essere visualizzati in questa modalità. + + + + + Try switching to Binary mode. + Prova a cambiare nella modalità binaria. + + + + + + + Text files (*.txt) + File di testo (*.txt) + + + + + + JSON files (*.json) + File JSON (*.json) + + + + + + + XML files (*.xml) + File XML (*.xml) + + + + + Image files (%1) + file immagine(%1) + + + + + + Binary files (*.bin) + File binari(*.bin) + + + + + All files (*) + Tutti i file (*) + + + + Choose a file to import + Scegli un file da importare + + + + %1 Image + %1 Immagine + + + + SVG files (*.svg) + File SVG (*.svg) + + + + + Hex dump files (*.txt) + File Hex di dump (*.txt) + + + + Choose a filename to export data + Scegli un nome del file per esportare i dati + + + + Invalid data for this mode + Dati non validi per questa modalità + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + La cella continete dati %1 non validi. Ragione: %2. Sei davvero sicuro di applicare quello alla cella? + + + + + Type of data currently in cell: Text / Numeric + Tipo di dato attualmente nella cella: Testo / Numerico + + + + + + %n char(s) + + %n carattere + %n caratteri + + + + + Type of data currently in cell: %1 Image + Tipo di dato attualmente nella cella: %1 Immagine + + + + %1x%2 pixel(s) + %1x%2 pixel(s) + + + + Type of data currently in cell: NULL + Typo di dato attualmente nella cella: NULL + + + + + %n byte(s) + + %n byte + %n byte(s) + + + + + Type of data currently in cell: Valid JSON + Tipo di dato attualmente nella cella: Valid JSON + + + + Type of data currently in cell: Binary + TIpo di dato attualmente nella cella: Binario + + + + EditIndexDialog + + + Edit Index Schema + Modifica l'indice dello schema + + + + &Name + &Nome + + + + &Table + &Tabella + + + + &Unique + &Unico + + + + For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed + Per restringere l'indice a solo una pare della tabella puoi specificare una clausola WHERE qui che seleziona la parte della tabella che deve essere indicizzata + + + + Partial inde&x clause + Clausola di &indice parziale + + + + Colu&mns + &Colonne + + + + Table column + Colonna della tabella + + + + Type + Tipo + + + + Add a new expression column to the index. Expression columns contain SQL expression rather than column names. + Aggiungi una nuova espressione colonna all'indice. Le espressioni colonna contengono espressioni SQL piuttosto che i nomi delle colonne. + + + + Index column + Indice di colonna + + + + Order + Ordine + + + + Deleting the old index failed: +%1 + Cancellazione del vecchio indice fallita: +%1 + + + + Creating the index failed: +%1 + Creazione del vecchio indice fallita: +%1 + + + + EditTableDialog + + + Edit table definition + Modifica la definizione della tabella + + + + Table + Tabella + + + + Advanced + Avanzate + + + + Database schema + Schema database + + + + Without Rowid + Senza id riga + + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. + Fai una tabella 'WITHOUT rowid'. Impostare questa spunta richiede un campo di tipo INTEGER con la chiave primaria impostata e l'auto incremento non impostato. + + + + Fields + Campi + + + + Add field + Aggiungi campo + + + + Remove field + Rimuovi campo + + + + Move field up + Muovi campo in sù + + + + Move field down + Muovi campo in giù + + + + Name + Nome + + + + Type + Tipo + + + + NN + NN + + + + Not null + Non null + + + + PK + PK + + + + Primary key + Chiave primaria + + + + AI + AI + + + + Autoincrement + Autoincremento + + + + U + U + + + + Unique + Unico + + + + Default + Default + + + + Default value + Valore di default + + + + Check + Controlla + + + + Check constraint + Controlla i constraint + + + + Foreign Key + Chiave straniera + + + + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>C'è qualcosa con la definizione di questa tabella che il nostro parser non campisce totalmente. Modificare e salvare la tabella potrebbe creare dei problemi.</p></body></html> + + + + Error creating table. Message from database engine: +%1 + Error nella creazione della tabella. Messaggio dal database engine: +%1 + + + + There already is a field with that name. Please rename it first or choose a different name for this field. + Esiste già un campo con quel nome. Perfavore rinominalo o scegli un nome differente per questo campo. + + + + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. + Questa colonna è referenziata in una chiave straniera nella tabella %1 e quindi il suo nome non può essere cambiato. + + + + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. + C'è almeno una riga con questo campo impostato a NULL. Questo rende impossibile impostare questa opzione. Perfavore cambia la tabella dei dati prima. + + + + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. + C'è almeno una riga con un valore non intero in questo campo. Questo rende impossibile impostare l'AI. Perfavore cambia la tabella dei dati prima. + + + + Column '%1' has no unique data. + + La colonna '%1' non ha dati unici. + + + + This makes it impossible to set this flag. Please change the table data first. + Questo rende impossibile impostare questa opzione. Perfavore cambia la tabella dei dati prima. + + + + Modifying this column failed. Error returned from database: +%1 + La modifica di questa colonna è fallita. Errore restituito dal database: +%1 + + + + Are you sure you want to delete the field '%1'? +All data currently stored in this field will be lost. + Sei sicuro che vuoi modificare questo cmapo '%1'? +Tutti i dati che sono attualmente memorizzati in questo campo andranno persi. + + + + Please add a field which meets the following criteria before setting the without rowid flag: + - Primary key flag set + - Auto increment disabled + Perfavore agginugi un campo che rispetti i seguenti criteri prima di impostare l'opzione senza id di riga: + - Opzione Primary key impostata + - Auto incremento disabilitato + + + + Setting the rowid column for the table failed. Error message: +%1 + Impostazione della colonna rowid per la tabella fallita. Messaggo di errore: +%1 + + + + Changing the table schema failed. Error message: +%1 + Cambio dello schema della tabella fallito. Messaggio di errore: +%1 + + + + ExportDataDialog + + + Export data as CSV + Esporta i dati in un CSV + + + + Tab&le(s) + Tabe&lla/e + + + + Colu&mn names in first line + Nomi delle &Colonne sulla prima riga + + + + Fie&ld separator + Separatore di ca&mpo + + + + , + , + + + + ; + ; + + + + Tab + Tab + + + + | + | + + + + + + Other + Altro + + + + &Quote character + Carattere &virgolette + + + + " + " + + + + ' + ' + + + + New line characters + Carattere di nuova riga + + + + Windows: CR+LF (\r\n) + Windows: CR+LF (\r\n) + + + + Unix: LF (\n) + Unix: LF (\n) + + + + Pretty print + Stampa carina + + + + Export data as JSON + Esporta i dati come JSON + + + + exporting CSV + esportando in CSV + + + + + Could not open output file: %1 + impossibile aprire il file di output: %1 + + + + exporting JSON + esportando in JSON + + + + Text files(*.csv *.txt) + File di testo(*.csv *.txt) + + + + Text files(*.json *.js *.txt) + File di testo(*.json *.js *.txt) + + + + + Choose a filename to export data + Scegliere un nome del file per esportare i dati + + + + Please select at least 1 table. + Perfavore seleziona almeno una tabella. + + + + Choose a directory + Scegliere una cartella + + + + Export completed. + Esportazione completata. + + + + ExportSqlDialog + + + Export SQL... + Esporta SQL... + + + + Tab&le(s) + Tabe&lla/e + + + + Select All + Seleziona tutto + + + + Deselect All + Deseleziona tutto + + + + &Options + &Opzioni + + + + Keep column names in INSERT INTO + Tieni i nomid delle colonne in INSERT INTO + + + + Multiple rows (VALUES) per INSERT statement + Righe multiple (VALUES) per lo statement INSERT + + + + Export everything + Esporta tutto + + + + Export schema only + Esporta solo lo schema + + + + Export data only + Esporta solo i dati + + + + Keep old schema (CREATE TABLE IF NOT EXISTS) + Mantieni lo schema vecchio (CREA UNA TABELLA SE NON ESISTE) + + + + Overwrite old schema (DROP TABLE, then CREATE TABLE) + Sovrascrivi il vecchio schema (DROP TABLE, poi CREATE TABLE) + + + + Please select at least one table. + Perfavore seleziona almeno una tabella. + + + + Choose a filename to export + Scegli un nome del file per esportare + + + + Text files(*.sql *.txt) + File di testo(*.sql *.txt) + + + + Export completed. + Esportazione completata. + + + + Export cancelled or failed. + Esportazione annullata o fallita. + + + + ExtendedScintilla + + + + Ctrl+H + Ctrl+H + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + Trova e Sostituisci... + + + + Print... + Stampa... + + + + ExtendedTableWidget + + + Use as Exact Filter + Usa come filtro esatto + + + + Containing + Contiene + + + + Not equal to + Non uguale a + + + + Greater than + Maggiore di + + + + Less than + Minore di + + + + Greater or equal + Maggiore o uguale + + + + Less or equal + Minore o uguale + + + + Between this and... + Tra questo e... + + + + Set to NULL + Imposta a NULL + + + + Copy + Copia + + + + Copy with Headers + Copia con gli Headers + + + + Copy as SQL + Copia come SQL + + + + Paste + Incolla + + + + Print... + Stampa... + + + + Use in Filter Expression + Usa nell'espressione del filtro + + + + Alt+Del + Alt+Del + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + Ctrl+Alt+C + Ctrl+Alt+C + + + + The content of the clipboard is bigger than the range selected. +Do you want to insert it anyway? + Il contenuto degli appunti è più grande del range selezionato. Vuoi inserirlo comunque? + + + + FileExtensionManager + + + File Extension Manager + Manager dell'estensione dei file + + + + &Up + &Sù + + + + &Down + &Giù + + + + &Add + &Aggiungi + + + + &Remove + &Rimuovi + + + + + Description + Descrizione + + + + Extensions + Estensioni + + + + *.extension + *.estensione + + + + FilterLineEdit + + + Filter + Filtra + + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + Questi campi di input permettono di effettuae filtri rapidi nella tabella correntemente selezionata. +Di default, le righe che contengono il testo di input sono escluse. +Sono inoltre supportati i seguenti operatori: +% Wildcard +> Maggiore di +< Minore di +>= Uguale o maggiore +<= Uguale o minore += Uguale a: match esatto +<> Non uguale: match inverso esatto +x~y Intervallo: valori tra x e y + + + + Set Filter Expression + Imposta l'espressione del filtro + + + + What's This? + Cos'è questo? + + + + Is NULL + È NULL + + + + Is not NULL + Non è NULL + + + + Is empty + È vuoto + + + + Is not empty + Non è vuoto + + + + Equal to... + Uguale a... + + + + Not equal to... + non uguale a... + + + + Greater than... + Maggiore di... + + + + Less than... + Minore di... + + + + Greater or equal... + Maggiore o uguale... + + + + Less or equal... + Minore o uguale... + + + + In range... + Nel range... + + + + FindReplaceDialog + + + Find and Replace + Trova e sostituisci + + + + Fi&nd text: + Tr&ova testo: + + + + Re&place with: + So&stituisci con: + + + + Match &exact case + Matching &esatto + + + + Match &only whole words + Matching delle &sole parole complete + + + + When enabled, the search continues from the other end when it reaches one end of the page + Quando abilitato, la ricerca contninua dall'altro capo del documento quando si raggiunge una fine del documento + + + + &Wrap around + + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + Quando abilitato, la ricerca va all'indietro dalla corrente posizione del cursore, altrimenti va in avanti + + + + Search &backwards + Cerca &indietro + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>Quando spuntato, il pattern da trovare è interpretato come una espressione regolare UNIX. Vedi <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + Use regular e&xpressions + Usa &espressioni regolari + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + Trova la prossima occorrenza dalla corrente posizione del cursore nella direzione impostata da "Cerca indietro" + + + + &Find Next + &Trova successivo + + + + &Replace + &Sostituisci + + + + Highlight all the occurrences of the text in the page + Evidenzia tutte le occorrenze del testo nella pagina + + + + F&ind All + T&rova tutti + + + + Replace all the occurrences of the text in the page + Sostituisce tutte le occorrenze del testo nella pagina + + + + Replace &All + Sostituisci &Tutti + + + + The searched text was not found + Il testo cercato non è stato trovato + + + + + The searched text was not found. + Il testo cercato non è stato trovato. + + + + The searched text was found one time. + Il testo cercato è stato trovato una volta. + + + + The searched text was found %1 times. + Il testo cercato è stato trovato %1 volte. + + + + The searched text was replaced one time. + Il testo cercato è stato sostituito una volta. + + + + The searched text was replaced %1 times. + Il testo cercato è stato sostituito %1 volte. + + + + ForeignKeyEditor + + + &Reset + + + + + Foreign key clauses (ON UPDATE, ON DELETE etc.) + + + + + ImportCsvDialog + + + Import CSV file + + + + + Table na&me + + + + + &Column names in first line + + + + + Field &separator + + + + + , + + + + + ; + + + + + + Tab + + + + + | + + + + + + + Other + + + + + &Quote character + + + + + " + + + + + ' + + + + + &Encoding + + + + + UTF-8 + + + + + UTF-16 + + + + + ISO-8859-1 + + + + + Trim fields? + + + + + Separate tables + + + + + Advanced + + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + + + + + Ignore default &values + + + + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + + + + + Fail on missing values + + + + + Disable data type detection + + + + + Disable the automatic data type detection when creating a new table. + + + + + + Deselect All + + + + + Match Similar + + + + + Import completed + + + + + Select All + + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + + + + + There is already a table named '%1'. Do you want to import the data into it? + + + + + Creating restore point failed: %1 + + + + + Creating the table failed: %1 + + + + + importing CSV + + + + + Inserting row failed: %1 + + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + + + + + MainWindow + + + DB Browser for SQLite + + + + + Database Structure + + + + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + + + + + Browse Data + + + + + &Table: + + + + + Select a table to browse data + + + + + Use this list to select a table to be displayed in the database view + + + + + Refresh the data in the selected table [F5, Ctrl+R] + + + + + This button refreshes the data in the currently selected table. + + + + + Clear all filters + + + + + This button clears all the filters set in the header input fields for the currently browsed table. + + + + + Save the table as currently displayed + + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + + + + + ... + + + + + Print currrently browsed table data [Ctrl+P] + + + + + Print currrently browsed table data. Print selection if more than one cell is selected. + + + + + Insert a new record in the current table + + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + + + + + + New Record + + + + + Delete the current record + + + + + This button deletes the record or records currently selected in the table + + + + + + Delete Record + + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + + + + + <html><head/><body><p>Scroll to the beginning</p></body></html> + + + + + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> + + + + + |< + + + + + Scroll one page upwards + + + + + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + + + + + < + + + + + 0 - 0 of 0 + + + + + Scroll one page downwards + + + + + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + + + + + > + + + + + Scroll to the end + + + + + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + + + + >| + + + + + <html><head/><body><p>Click here to jump to the specified record</p></body></html> + + + + + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> + + + + + Go to: + + + + + Enter record number to browse + + + + + Type a record number in this area and click the Go to: button to display the record in the database view + + + + + 1 + + + + + Edit Pragmas + + + + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + + + + + Execute SQL + + + + + toolBar1 + + + + + &File + + + + + &Import + + + + + &Export + + + + + &Edit + + + + + &View + + + + + &Help + + + + + &Tools + + + + + DB Toolbar + + + + + Edit Database &Cell + + + + + SQL &Log + + + + + Show S&QL submitted by + + + + + User + + + + + Application + + + + + This button clears the contents of the SQL logs + + + + + &Clear + + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + + + + + &Plot + + + + + DB Sche&ma + + + + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + + + + + &Remote + + + + + + Project Toolbar + + + + + Extra DB toolbar + + + + + + + Close the current database file + + + + + &New Database... + + + + + + Create a new database file + + + + + This option is used to create a new database file. + + + + + Ctrl+N + + + + + + &Open Database... + + + + + + + + + Open an existing database file + + + + + + + This option is used to open an existing database file. + + + + + + Ctrl+O + + + + + &Close Database + + + + + This button closes the connection to the currently open database file + + + + + Ctrl+W + + + + + &Revert Changes + + + + + + Revert database to last saved state + + + + + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. + + + + + &Write Changes + + + + + + Write changes to the database file + + + + + This option is used to save changes to the database file. + + + + + Ctrl+S + + + + + Compact &Database... + + + + + Compact the database file, removing space wasted by deleted records + + + + + + Compact the database file, removing space wasted by deleted records. + + + + + E&xit + + + + + Ctrl+Q + + + + + &Database from SQL file... + + + + + Import data from an .sql dump text file into a new or existing database. + + + + + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. + + + + + &Table from CSV file... + + + + + Open a wizard that lets you import data from a comma separated text file into a database table. + + + + + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. + + + + + &Database to SQL file... + + + + + Export a database to a .sql dump text file. + + + + + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. + + + + + &Table(s) as CSV file... + + + + + Export a database table as a comma separated text file. + + + + + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. + + + + + &Create Table... + + + + + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database + + + + + &Delete Table... + + + + + + Delete Table + + + + + Open the Delete Table wizard, where you can select a database table to be dropped. + + + + + &Modify Table... + + + + + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. + + + + + Create &Index... + + + + + Open the Create Index wizard, where it is possible to define a new index on an existing database table. + + + + + &Preferences... + + + + + + Open the preferences window. + + + + + &DB Toolbar + + + + + Shows or hides the Database toolbar. + + + + + + Ctrl+T + + + + + W&hat's This? + + + + + Shift+F1 + + + + + &About + + + + + &Recently opened + + + + + Open &tab + + + + + This button opens a new tab for the SQL editor + + + + + &Execute SQL + + + + + Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] + + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + + + + + Open SQL file + + + + + This button opens a file containing SQL statements and loads it in a new editor tab + + + + + + + Save SQL file + + + + + &Load Extension... + + + + + Execute current line + + + + + Execute current line [Shift+F5] + + + + + This button executes the SQL statement present in the current editor line + + + + + Shift+F5 + + + + + Export as CSV file + + + + + Export table as comma separated values file + + + + + &Wiki + + + + + Bug &Report... + + + + + Feature Re&quest... + + + + + Web&site + + + + + &Donate on Patreon... + + + + + Sa&ve Project... + + + + + + Save the current session to a file + + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + + + + + Open &Project... + + + + + + Load a working session from a file + + + + + This button lets you open a DB4S project file + + + + + &Attach Database... + + + + + + Add another database file to the current database connection + + + + + This button lets you add another database file to the current database connection + + + + + &Set Encryption... + + + + + + Save SQL file as + + + + + This button saves the content of the current SQL editor tab to a file + + + + + &Browse Table + + + + + Copy Create statement + + + + + Copy the CREATE statement of the item to the clipboard + + + + + Edit display format + + + + + Edit the display format of the data in this column + + + + + Show rowid column + + + + + Toggle the visibility of the rowid column + + + + + + Set encoding + + + + + Change the encoding of the text in the table cells + + + + + Set encoding for all tables + + + + + Change the default encoding assumed for all tables in the database + + + + + SQLCipher &FAQ + + + + + Opens the SQLCipher FAQ in a browser window + + + + + Table(&s) to JSON... + + + + + Export one or more table(s) to a JSON file + + + + + Refresh + + + + + F5 + + + + + Open Data&base Read Only... + + + + + Open an existing database file in read only mode + + + + + Unlock view editing + + + + + This unlocks the current view for editing. However, you will need appropriate triggers for editing. + + + + + Save results + + + + + Save the results view + + + + + This button lets you save the results of the last executed query + + + + + Find text in SQL editor + + + + + Find text in SQL editor [Ctrl+F] + + + + + This button opens the search bar of the editor + + + + + Ctrl+F + + + + + Find or replace text in SQL editor + + + + + Find or replace text in SQL editor [Ctrl+H] + + + + + This button opens the find/replace dialog for the current editor tab + + + + + + Export to &CSV + + + + + + Save as &view + + + + + Save as view + + + + + Hide column(s) + + + + + Hide selected column(s) + + + + + Show all columns + + + + + Show all columns that were hidden + + + + + Shows or hides the Project toolbar. + + + + + Extra DB Toolbar + + + + + + Export the filtered data to CSV + + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + + + + + + Save the current filter, sort column and display formats as a view + + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + + + + + Insert Values... + + + + + + Open a dialog for inserting values in a new record + + + + + + Insert new record using default values in browsed table + + + + + New In-&Memory Database + + + + + Drag && Drop Qualified Names + + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + + + + + Drag && Drop Enquoted Names + + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + + + + + &Integrity Check + + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + + + + + &Foreign-Key Check + + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + + + + + &Quick Integrity Check + + + + + Run a quick integrity check over the open DB + + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + + + + + &Optimize + + + + + Attempt to optimize the database + + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + + + + + + Print + + + + + Print text from current SQL editor tab [Ctrl+P] + + + + + Open a dialog for printing the text in the current SQL editor tab + + + + + Print the structure of the opened database [Ctrl+P] + + + + + Open a dialog for printing the structure of the opened database + + + + + Ctrl+P + + + + + Ctrl+Return + + + + + Ctrl+L + + + + + Ctrl+D + + + + + Ctrl+I + + + + + Ctrl+E + + + + + Encrypted + + + + + Database is encrypted using SQLCipher + + + + + Read only + + + + + Database file is read only. Editing the database is disabled. + + + + + Database encoding + + + + + + Choose a database file + + + + + Could not open database file. +Reason: %1 + + + + + + + Choose a filename to save under + + + + + In-Memory database + + + + + Error deleting record: +%1 + + + + + Please select a record first + + + + + determining row count... + + + + + %1 - %2 of >= %3 + + + + + %1 - %2 of %3 + + + + + + There is no database opened. Please open or create a new database file. + + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + + + + + Are you sure you want to delete the view '%1'? + + + + + Are you sure you want to delete the trigger '%1'? + + + + + Are you sure you want to delete the index '%1'? + + + + + Error: could not delete the table. + + + + + Error: could not delete the view. + + + + + Error: could not delete the trigger. + + + + + Error: could not delete the index. + + + + + Message from database engine: +%1 + + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + + + + + Error checking foreign keys after table modification. The changes will be reverted. + + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + + + + + -- EXECUTING SELECTION IN '%1' +-- + + + + + -- EXECUTING LINE IN '%1' +-- + + + + + -- EXECUTING ALL IN '%1' +-- + + + + + Setting PRAGMA values or vacuuming will commit your current transaction. +Are you sure? + + + + + Execution aborted by user + + + + + executing query + + + + + %1 rows returned in %2ms + + + + + , %1 rows affected + + + + + query executed successfully. Took %1ms%2 + + + + + -- At line %1: +%4 +-- Result: %3 + + + + + Choose text files + + + + + Text files(*.csv *.txt);;All files(*) + + + + + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. + +%1 + + + + + Are you sure you want to undo all changes made to the database file '%1' since the last save? + + + + + Choose a file to import + + + + + + + Text files(*.sql *.txt);;All files(*) + + + + + Do you want to create a new database file to hold the imported data? +If you answer no we will attempt to import the data in the SQL file to the current database. + + + + + File %1 already exists. Please choose a different name. + + + + + Error importing data: %1 + + + + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + + + + + Import completed. + + + + + Delete View + + + + + Modify View + + + + + Delete Trigger + + + + + Modify Trigger + + + + + Delete Index + + + + + Modify Index + + + + + Modify Table + + + + + &%1 %2 + + + + + Setting PRAGMA values will commit your current transaction. +Are you sure? + + + + + Select SQL file to open + + + + + Couldn't read file: %1. + + + + + Couldn't save file: %1. + + + + + Select file name + + + + + Select extension file + + + + + Extensions(*.so *.dll);;All files(*) + + + + + Extension successfully loaded. + + + + + Error loading extension: %1 + + + + + + Don't show again + + + + + New version available. + + + + + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. + + + + + Choose a project file to open + + + + + + DB Browser for SQLite project file (*.sqbpro) + + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + + + + + Duplicate records + + + + + Duplicate record + + + + + Ctrl+" + + + + + Please choose a new encoding for all tables. + + + + + Please choose a new encoding for this table. + + + + + %1 +Leave the field empty for using the database encoding. + + + + + This encoding is either not valid or not supported. + + + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + + + + + Collation needed! Proceed? + + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + + + + + creating collation + + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + + + + + Please specify the view name + + + + + There is already an object with that name. Please choose a different name. + + + + + View successfully created. + + + + + Error creating view: %1 + + + + + There is no filter set for this table. View will not be created. + + + + + Delete Records + + + + + This action will open a new SQL tab for running: + + + + + Press Help for opening the corresponding SQLite reference page. + + + + + NullLineEdit + + + Set to NULL + + + + + Alt+Del + + + + + PlotDock + + + Plot + + + + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + + + + + Columns + + + + + X + + + + + Y + + + + + Axis Type + + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + + + + + Line type: + + + + + + None + + + + + Line + + + + + StepLeft + + + + + StepRight + + + + + StepCenter + + + + + Impulse + + + + + Point shape: + + + + + Cross + + + + + Plus + + + + + Circle + + + + + Disc + + + + + Square + + + + + Diamond + + + + + Star + + + + + Triangle + + + + + TriangleInverted + + + + + CrossSquare + + + + + PlusSquare + + + + + CrossCircle + + + + + PlusCircle + + + + + Peace + + + + + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> + + + + + Save current plot... + + + + + + Load all data and redraw plot + + + + + Copy + + + + + Print... + + + + + Show legend + + + + + Stacked bars + + + + + Date/Time + + + + + Date + + + + + Time + + + + + + Numeric + + + + + Label + + + + + Invalid + + + + + + + Row # + + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + + + + + Choose an axis color + + + + + Choose a filename to save under + + + + + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) + + + + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + + + + + PreferencesDialog + + + Preferences + + + + + &General + + + + + Default &location + + + + + Remember last location + + + + + Always use this location + + + + + Remember last location for session only + + + + + + + ... + + + + + Lan&guage + + + + + Toolbar style + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + Show remote options + + + + + + + + + + + + enabled + + + + + Automatic &updates + + + + + DB file extensions + + + + + Manage + + + + + &Database + + + + + Database &encoding + + + + + Open databases with foreign keys enabled. + + + + + &Foreign keys + + + + + Remove line breaks in schema &view + + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + + + + + Prefetch block si&ze + + + + + Advanced + + + + + SQ&L to execute after opening database + + + + + Default field type + + + + + Data &Browser + + + + + Font + + + + + &Font + + + + + Font si&ze + + + + + Content + + + + + Symbol limit in cell + + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + + + + + Row count threshold for completion + + + + + Field display + + + + + Displayed &text + + + + + Binary + + + + + NULL + + + + + Regular + + + + + Text color + + + + + Background color + + + + + Preview only (N/A) + + + + + Filters + + + + + Escape character + + + + + Delay time (&ms) + + + + + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. + + + + + &SQL + + + + + Settings name + + + + + Context + + + + + Colour + + + + + Bold + + + + + Italic + + + + + Underline + + + + + Keyword + + + + + Function + + + + + Table + + + + + Comment + + + + + Identifier + + + + + String + + + + + Current line + + + + + Background + + + + + Foreground + + + + + SQL editor &font + + + + + SQL &editor font size + + + + + SQL &results font size + + + + + Tab size + + + + + &Wrap lines + + + + + Never + + + + + At word boundaries + + + + + At character boundaries + + + + + At whitespace boundaries + + + + + &Quotes for identifiers + + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + + + + + "Double quotes" - Standard SQL (recommended) + + + + + `Grave accents` - Traditional MySQL quotes + + + + + [Square brackets] - Traditional MS SQL Server quotes + + + + + Code co&mpletion + + + + + Keywords in &UPPER CASE + + + + + When set, the SQL keywords are completed in UPPER CASE letters. + + + + + Error indicators + + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + + + + + Hori&zontal tiling + + + + + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + + + + + &Extensions + + + + + Select extensions to load for every database: + + + + + Add extension + + + + + Remove extension + + + + + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> + + + + + Disable Regular Expression extension + + + + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + + + + Remote + + + + + CA certificates + + + + + + Subject CN + + + + + Common Name + + + + + Subject O + + + + + Organization + + + + + + Valid from + + + + + + Valid to + + + + + + Serial number + + + + + Your certificates + + + + + File + + + + + Subject Common Name + + + + + Issuer CN + + + + + Issuer Common Name + + + + + Clone databases into + + + + + + Choose a directory + + + + + The language will change after you restart the application. + + + + + Select extension file + + + + + Extensions(*.so *.dll);;All files(*) + + + + + Import certificate file + + + + + No certificates found in this file. + + + + + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! + + + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + + + + + QObject + + + All files (*) + + + + + Error importing data + + + + + from record number %1 + + + + + . +%1 + + + + + Importing CSV file... + + + + + Cancel + + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + + + + + RemoteDatabase + + + Error when connecting to %1. +%2 + + + + + Error opening remote file at %1. +%2 + + + + + Error: Invalid client certificate specified. + + + + + Please enter the passphrase for this client certificate in order to authenticate. + + + + + Cancel + + + + + Uploading remote database to +%1 + + + + + Downloading remote database from +%1 + + + + + + Error: The network is not accessible. + + + + + Error: Cannot open the file for sending. + + + + + Error opening local databases list. +%1 + + + + + Error creating local databases list. +%1 + + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + + + + + RemoteDock + + + Remote + + + + + Identity + + + + + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + + + Go + + + + + Push currently opened database to server + + + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + + + + RemoteModel + + + Name + + + + + Commit + + + + + Last modified + + + + + Size + + + + + bytes + + + + + RemotePushDialog + + + Push database + + + + + Database na&me to push to + + + + + Commit message + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + + Database licence + + + + + Public + + + + + Branch + + + + + Force push + + + + + Database will be public. Everyone has read access to it. + + + + + Database will be private. Only you have access to it. + + + + + Use with care. This can cause remote commits to be deleted. + + + + + Unspecified + + + + + SqlExecutionArea + + + Form + + + + + Find previous match [Shift+F3] + + + + + Find previous match with mapping + + + + + Shift+F3 + + + + + The found pattern must be a whole word + + + + + Whole Words + + + + + Text pattern to find considering the checks in this frame + + + + + Find in editor + + + + + The found pattern must match in letter case + + + + + Case Sensitive + + + + + Find next match [Enter, F3] + + + + + Find next match with wrapping + + + + + F3 + + + + + Interpret search pattern as a regular expression + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Regular Expression + + + + + + Close Find Bar + + + + + + Results of the last executed statements + + + + + This field shows the results and status codes of the last executed statements. + + + + + SqlUiLexer + + + (X) The abs(X) function returns the absolute value of the numeric argument X. + + + + + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. + + + + + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. + + + + + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL + + + + + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". + + + + + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. + + + + + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. + + + + + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. + + + + + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. + + + + + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. + + + + + (X,Y) The like() function is used to implement the "Y LIKE X" expression. + + + + + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. + + + + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + + + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. + + + + + (X) ltrim(X) removes spaces from the left side of X. + + + + + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. + + + + + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. + + + + + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. + + + + + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. + + + + + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. + + + + + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. + + + + + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. + + + + + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. + + + + + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. + + + + + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. + + + + + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. + + + + + (X) rtrim(X) removes spaces from the right side of X. + + + + + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. + + + + + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. + + + + + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. + + + + + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. + + + + + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. + + + + + (X) trim(X) removes spaces from both ends of X. + + + + + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. + + + + + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. + + + + + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. + + + + + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. + + + + + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. + + + + + + + + (timestring,modifier,modifier,...) + + + + + (format,timestring,modifier,modifier,...) + + + + + (X) The avg() function returns the average value of all non-NULL X within a group. + + + + + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. + + + + + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. + + + + + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. + + + + + (X) The max() aggregate function returns the maximum value of all values in the group. + + + + + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. + + + + + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. + + + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + + + + + SqliteTableModel + + + reading rows + + + + + loading... + + + + + References %1(%2) +Hold %3Shift and click to jump there + + + + + Error changing data: +%1 + + + + + retrieving list of columns + + + + + Fetching data... + + + + + Cancel + + + + + VacuumDialog + + + Compact Database + + + + + Warning: Compacting the database will commit all of your changes. + + + + + Please select the databases to co&mpact: + + + + diff --git a/src/translations/sqlb_ko_KR.ts b/src/translations/sqlb_ko_KR.ts index 6c1476f21..1a7fd2893 100644 --- a/src/translations/sqlb_ko_KR.ts +++ b/src/translations/sqlb_ko_KR.ts @@ -830,7 +830,7 @@ Errors are indicated with a red squiggle underline. - Apply data to cell [Ctrl+Return] + Apply data to cell @@ -2713,8 +2713,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed 원격 - Execute SQL [F5, Ctrl+Return, Ctrl+R] - SQL 실행하기 [F5, Ctrl+Return, Ctrl+R] + Execute SQL + SQL 실행하기 &Load extension @@ -2722,8 +2722,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute current line [Shift+F5] - 현재 행 실행하기 [Shift+F5] + Execute current line + 현재 행 실행하기 @@ -3227,7 +3227,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] + Refresh the data in the selected table @@ -3252,7 +3252,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Print currently browsed table data [Ctrl+P] + Print currently browsed table data @@ -3313,7 +3313,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL @@ -3429,7 +3429,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Find text in SQL editor [Ctrl+F] + Find text in SQL editor @@ -3449,7 +3449,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Find or replace text in SQL editor [Ctrl+H] + Find or replace text in SQL editor @@ -3628,7 +3628,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Print text from current SQL editor tab [Ctrl+P] + Print text from current SQL editor tab @@ -3638,7 +3638,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Print the structure of the opened database [Ctrl+P] + Print the structure of the opened database @@ -3758,8 +3758,8 @@ You can drag SQL statements from an object row and drop them into other applicat SQL 실행하기(&E) - Execute SQL [F5, Ctrl+Return] - SQL 실행하기 [F5, Ctrl+엔터] + Execute SQL + SQL 실행하기 @@ -3788,8 +3788,8 @@ You can drag SQL statements from an object row and drop them into other applicat 현재 행 실행하기 - Execute current line [Ctrl+E] - 현재 행 실행하기 [Ctrl+E] + Execute current line + 현재 행 실행하기 diff --git a/src/translations/sqlb_pl.ts b/src/translations/sqlb_pl.ts index 08cdbd54b..6c0b30e1a 100644 --- a/src/translations/sqlb_pl.ts +++ b/src/translations/sqlb_pl.ts @@ -16,12 +16,12 @@ <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - + <html><head/><body><p>Preglądarka Bazy Danych dla SQLite jest darmowym otwartym oprogramowaniem przeznaczonym do wizualnej edycji i kreacji plików bazy danych SQLite.</p><p>Program podlega podwójnej licencji użytkowania: Publiczna licencja Mozilli Wersja 2 jak również Powszechna Licencja Publiczna GNU wersja 3 i poźniejsza. Możesz modyfikować i rozpowszechniać program pod warunkami zawartymi w tych licencjach.</p><p>Zobacz <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> i <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> dla szczegołów.</p><p>Odwiedź naszą stronę internetową aby zapoznać się z informacją na temat diałania tego programu: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">To oprogramowanie używa GPL/LGPL Qt Toolkit z: </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Zobacz </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> na temat licancji i użytkowania.</span></p><p><span style=" font-size:small;">Używany również jest zestaw ikon Silk stworzony przez Mark James pod licencjią Creative Commons Attribution 2.5 i 3.0.<br/>Zobacz </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> dla dalszej informacji.</span></p></body></html> (based on SQLite %1) - + @@ -49,89 +49,95 @@ Add New Record - + Nowy rekord Enter values for the new record considering constraints. Fields in bold are mandatory. - + Podaj wartości dla nowego rekordu zwracając uwagę na ograniczenia.Pola wytłusczone są obowiązkowe. In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. - + W kolumnie Wartość możesz podać wartość dla pola identyfikowanego w kolumnie Nazwa. Kolumna Rodzaj wskazuje rodzaj pola. Wartości domyślne są wyświetlane w tym samym stylu, co wartości NULL. Name - Nazwa + Nazwa Type - + Rodzaj Value - + Wartość Values to insert. Pre-filled default values are inserted automatically unless they are changed. - + Wartości do wstawienia. Pola wypełnione są automatycznie domyślnymi wartościami wtedy tylko gdy te wartości nie są ręcznie zmienione. When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. - + Tutaj pokazana jest kwerenda SQL dla dodania nowego rekordu zawierającego wartości wprowadzone w górnej ramce. Możesz ją ręcznie zmienić przed zapisem rekordu. <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> - + <html><head/><body><p><span style=" font-weight:600;">Zapisz</span> przekarze wyświetlone zapytanie SQL do bazy danych w celu zapisania nowego rekordu</p><p><span style=" font-weight:600;">Przywróć domyślne</span> przywróci wstępne wartości domyślne w kolumnie<span style=" font-weight:600;">Wartość</span></p><p><span style=" font-weight:600;">Anuluj</span> zamyka to okno bez robienia zmian.</p></body></html> Auto-increment - + Unique constraint - + Unikat + Check constraint: %1 - + Weryfikator: %1 + Foreign key: %1 - + Klucz obcy: %1 + Default value: %1 - + Wartość domyślna: %1 + Error adding record. Message from database engine: %1 - + Wystąpił błąd podczas dodawania rekordu. Baza danych podała następujący komunikat: + +%1 Are you sure you want to restore all the entered values to their defaults? - + Jesteś pewien że chcesz przywrócić domyślne wartości dla wszystich wpisów? @@ -257,13 +263,17 @@ Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. The encryption process might take some time and you should have a backup copy of your database! Unsaved changes are applied before modifying the encryption. - + Proszę podaj klucz do zaszyfrowania bazy danych. +Zwróć uwagę na to że wszelkie zmiany wprowadzone tutaj do opcjonalnych ustawień bedą wymagane przy każdym otwarciu pliku. +W celu deaktywacji szyfrowania pozostaw pola klucza puste. +Proces szyfrowania może zabrać dużo czasu w zależności od wielkości bazy danych. Zaleca się aby przed rozpoczęciem tego procesu zrobić kopię zapasową pliku. Wszelkie nie zapisane zmiany będą wprowadzone do bazy danych zanim szyfrowanie się rozpocznie. Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. - + Proszę podać hasło do zaszyfrowania bazy danych. +Jeśli zostały zmienione jakiekolwiek dodatkowe ustawienia dla pliku tej bazy danych będziesz musiał również podać tą informację. @@ -281,7 +291,7 @@ If any of the other settings were altered for this database file you need to pro Choose a display format for the column '%1' which is applied to each value prior to showing it. - Wybierz domyślny format wyświetlania dla kolumny '%1', który jest stosowany na każdej wartości zanim zostanie pokazana. + Wybierz domyślny format wyświetlania dla kolumny '%1', który jest zastosowany dla każdej wartości zanim ona zostanie pokazana. @@ -296,57 +306,57 @@ If any of the other settings were altered for this database file you need to pro Exponent notation - + Postać wykładnika Hex blob - + Blob szestnastkowy Hex number - + Numer szestnastkowy Octal number - + Numer ósemkowy Round number - Zaokrąglona liczba + Liczba zaokrąglona Apple NSDate to date - + Apple NSDate do daty Java epoch (milliseconds) to date - + Java epoch (milisekundy) do daty Julian day to date - + Data Juliańska do daty Unix epoch to date - + Unix epoch do daty Unix epoch to local time - + Unix epoch do czasu lokalnego Windows DATE to date - + Windows DATE do daty @@ -356,12 +366,12 @@ If any of the other settings were altered for this database file you need to pro Lower case - + Małe litery Upper case - + Duże litery @@ -379,7 +389,7 @@ If any of the other settings were altered for this database file you need to pro Please specify the database name under which you want to access the attached database - Określ numer bazy danych pod którym chcesz uzyskać dostęp do załączonej bazy danych + Proszę podaj nazwę bazy danych za pomocą której chcesz uzyskać dostęp do załączonej bazy @@ -389,7 +399,7 @@ If any of the other settings were altered for this database file you need to pro Do you really want to close this temporary database? All data will be lost. - + Czy na pewno chcesz zamknąć tę tymczasową bazę danych? Wszelkie zmiany bedą zapomniane. @@ -404,7 +414,7 @@ If any of the other settings were altered for this database file you need to pro Do you want to abort that other operation? - Czy na pewno chcesz przerwać inne działanie? + Czy na pewno chcesz przerwać tą inną operację? @@ -421,7 +431,7 @@ If any of the other settings were altered for this database file you need to pro No database file opened - Brak otwartej bazy danych + Plik z bazą danych nie jest obecnie otwarty @@ -445,7 +455,7 @@ Przerywam wykonywanie%3. and rolling back - i wracam + i przywracam @@ -465,40 +475,43 @@ Przerywam wykonywanie%3. renameColumn: cannot find column %1. - renameColumn: nie można odnaleźć kolumny %1. + renameColumn(zmiana nazwy kolumny): nie można odnaleźć kolumny %1. renameColumn: creating savepoint failed. DB says: %1 - + renameColumn(zmiana nazwy kolumny): błąd przy zapisie. Baza Danych zwraca: %1 renameColumn: creating new table failed. DB says: %1 - renameColumn: tworzenie nowej tabeli nie powiodło się. Baza danych: %1 + renameColumn(zmiana nazwy kolumny): tworzenie nowej tabeli nie powiodło się. Baza danych zwróciła: %1 renameColumn: copying data to new table failed. DB says: %1 - renameColumn: kopiowanie danych do nowej tabeli nie powiodło się. Baza danych: %1 + renameColumn(zmiana nazwy kolumny): kopiowanie danych do nowej tabeli nie powiodło się. Baza danych zwróciła: +%1 renameColumn: deleting old table failed. DB says: %1 - renameColumn: usuwanie starej tabeli nie powiodło się. Baza danych: %1 + renameColumn(zmiana nazwy kolumny): usuwanie starej tabeli nie powiodło się. Baza danych zwróciła: %1 Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: - + Wystąpił błąd przy odtworzeniu niektórych obiektów powiązanych z tą bazą danych. Błędy tego rodzaju występują za zwyczaj w przypadku zmiany nazw niektórych kolumn. Sprawdź dokładnie następującą kwerendę SQL. Po dokonaniu zmian możesz ją ręcznie uruchomić: + + renameColumn: releasing savepoint failed. DB says: %1 - + renameColumn(zmiana nazwy kolumny): Wystąpił błąd podczas odłączenia punktu zapisu. Baza danych podała następujący komunikat: %1 @@ -510,32 +523,32 @@ Przerywam wykonywanie%3. ... <string can not be logged, contains binary data> ... - + ... <string nie można zalogować zawiera dane w postaci binarnej> ... could not get list of db objects: %1, %2 - + nie mogę pobrać listy obiektów bazy danych: %1, %2 could not get list of databases: %1 - + nie mogę odczytać listy baz danych: %1 didn't receive any output from pragma %1 - + nie otrzymałem żadnego wyniku od pragmy %1 could not execute pragma command: %1, %2 - + nie mogłem wykonać polecenia pragmy: %1, %2 Error setting pragma %1 to %2: %3 - + Błąd przy ustawianiu pragmy %1 do %2: %3 @@ -545,7 +558,7 @@ Przerywam wykonywanie%3. Error loading extension: %1 - Błąd ładowania rozszerzenia: %1 + Wystąpił błąd przy ładownaniu rozszerzenia: %1 @@ -583,7 +596,7 @@ Przerywam wykonywanie%3. Browsables - + Obiekty do przeglądania @@ -608,12 +621,12 @@ Przerywam wykonywanie%3. Views (%1) - + Wyświetlenia (%1) Triggers (%1) - + Uruchomienia (%1) @@ -621,17 +634,17 @@ Przerywam wykonywanie%3. Edit database cell - + Edytuj komórkę bazy danych Mode: - + Tryb: This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. - + To jest lista dostępnych trybów dla edytora komórek. Wybierz tryb do wyświetlania lub edycji danych dla tej komórki. @@ -662,7 +675,7 @@ Przerywam wykonywanie%3. Automatically adjust the editor mode to the loaded data type - + Automatycznie dostosuj tryb edytora w zależności od załadowanych danych @@ -672,13 +685,13 @@ Przerywam wykonywanie%3. Auto-switch - + Automatyczny przełącznik Auto-format: pretty print on loading, compact on saving. - + Auto-formatowanie: upiększa tekst przy ładowaniu i kompaktuje przy zapisywaniu. @@ -759,8 +772,8 @@ Errors are indicated with a red squiggle underline. - Apply data to cell [Ctrl+Return] - Zapisz dane w komórce [Ctrl+Return] + Apply data to cell + Zapisz dane w komórce @@ -776,18 +789,18 @@ Errors are indicated with a red squiggle underline. Print... - + Drukuj... Open preview dialog for printing displayed image - + Otwórz podgląd wydruku dla aktualnie wyświetlonego obrazu Ctrl+P - Ctrl+P + Ctrl+P @@ -797,7 +810,7 @@ Errors are indicated with a red squiggle underline. Copy Hex and ASCII - + Kopiuj Hex i ASCII @@ -807,7 +820,7 @@ Errors are indicated with a red squiggle underline. Ctrl+Shift+C - Ctrl+Shift+C + Ctrl+Shift+C @@ -839,14 +852,14 @@ Errors are indicated with a red squiggle underline. Text files (*.txt) - + Pliki Tekstowe (*.txt) JSON files (*.json) - + Pliki JSON (*.json) @@ -854,26 +867,26 @@ Errors are indicated with a red squiggle underline. XML files (*.xml) - + Pliki XML (*.xml) Image files (%1) - + Piki graficzne (%1) Binary files (*.bin) - + Pliki Binarne (*.bin) All files (*) - Wszystkie pliki (*) + Wszystkie pliki (*) @@ -883,18 +896,18 @@ Errors are indicated with a red squiggle underline. %1 Image - + %1 Grafika SVG files (*.svg) - + Pliki SVG (*.svg) Hex dump files (*.txt) - + Plik szesnastkowy (*.txt) Text files (*.txt);;Image files (%1);;JSON files (*.json);;XML files (*.xml);;Binary files (*.bin);;All files (*) @@ -989,7 +1002,7 @@ Errors are indicated with a red squiggle underline. Edit Index Schema - + Edytuj Schemat Indeksu @@ -1004,7 +1017,7 @@ Errors are indicated with a red squiggle underline. &Unique - &Unikatowy + &Unikalny @@ -1039,12 +1052,12 @@ Errors are indicated with a red squiggle underline. Index column - + Kolumna indeksu Order - + Porządek @@ -1131,7 +1144,7 @@ Errors are indicated with a red squiggle underline. NN - + NN @@ -1141,7 +1154,7 @@ Errors are indicated with a red squiggle underline. PK - + PK @@ -1151,7 +1164,7 @@ Errors are indicated with a red squiggle underline. AI - + AI @@ -1161,7 +1174,7 @@ Errors are indicated with a red squiggle underline. U - + U @@ -1352,7 +1365,7 @@ All data currently stored in this field will be lost. Pretty print - + Upiększ wydruk @@ -1437,12 +1450,12 @@ All data currently stored in this field will be lost. Keep column names in INSERT INTO - + Pozostaw nazwy kolumn w INSERT INTO Multiple rows (VALUES) per INSERT statement - + Wiele rzędów (Wartości) dla polecenia INSERT @@ -1507,7 +1520,7 @@ All data currently stored in this field will be lost. Ctrl+P - Ctrl+P + Ctrl+P @@ -1517,7 +1530,7 @@ All data currently stored in this field will be lost. Print... - + Drukuj... @@ -1632,7 +1645,7 @@ Do you want to insert it anyway? File Extension Manager - + Menadżer Rozszerzeń Plików @@ -2155,8 +2168,8 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] - Odśwież dane w zaznaczonej tabeli [F5, Ctrl+R] + Refresh the data in the selected table + Odśwież dane w zaznaczonej tabeli @@ -2576,7 +2589,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print currently browsed table data [Ctrl+P] + Print currently browsed table data @@ -2920,7 +2933,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print text from current SQL editor tab [Ctrl+P] + Print text from current SQL editor tab @@ -2930,7 +2943,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print the structure of the opened database [Ctrl+P] + Print the structure of the opened database @@ -2964,8 +2977,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] - Wykonaj wszystkie/zaznaczone SQL [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL + Wykonaj wszystkie/zaznaczone SQL @@ -3000,8 +3013,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute current line [Shift+F5] - Wykonaj obecny wiersz [Shift+F5] + Execute current line + Wykonaj obecny wiersz @@ -3217,8 +3230,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find text in SQL editor [Ctrl+F] - Znajdź tekst w edytorze SQL [Ctrl+F] + Find text in SQL editor + Znajdź tekst w edytorze SQL @@ -3237,8 +3250,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find or replace text in SQL editor [Ctrl+H] - Znajdź lub zastąp tekst w edytorze SQL [Ctrl+H] + Find or replace text in SQL editor + Znajdź lub zastąp tekst w edytorze SQL diff --git a/src/translations/sqlb_pt_BR.ts b/src/translations/sqlb_pt_BR.ts index 25cddf43f..460e27906 100644 --- a/src/translations/sqlb_pt_BR.ts +++ b/src/translations/sqlb_pt_BR.ts @@ -776,8 +776,8 @@ Errors are indicated with a red squiggle underline. Erros são indicados com um ondulado vermelho. - Apply data to cell [Ctrl+Return] - Aplicar dados à célula [Ctrl+Enter] + Apply data to cell + Aplicar dados à célula This button saves the changes performed in the cell editor to the database cell. @@ -2450,8 +2450,8 @@ x~y Intervalo: valores entre x e y &Executar SQL - Execute SQL [F5, Ctrl+Return] - Executar SQL [F5, Ctrl+Return] + Execute SQL + Executar SQL Open SQL file @@ -2470,8 +2470,8 @@ x~y Intervalo: valores entre x e y Executar linha atual - Execute current line [Ctrl+E] - Executar linha atual [Ctrl+E] + Execute current line + Executar linha atual Ctrl+E @@ -3028,12 +3028,12 @@ Deixe o campo em branco para usar a codificação do banco de dados.Esque&ma do banco de dados - Execute SQL [F5, Ctrl+Return, Ctrl+R] - Executar SQL [F5, Ctrl+Return, Ctrl+R] + Execute SQL + Executar SQL - Execute current line [Shift+F5] - Executar linha atual [Shift+F5] + Execute current line + Executar linha atual Shift+F5 @@ -3172,8 +3172,8 @@ Você pode arrastar comandos SQL de uma linha e soltá-los em outras aplicaçõe - Refresh the data in the selected table [F5, Ctrl+R] - Atualizar os dados na tabela selecionada [F5, Ctrl+R] + Refresh the data in the selected table + Atualizar os dados na tabela selecionada This button clears all the filters set in the header input fields for the currently browsed table. @@ -3274,8 +3274,8 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Esse botão abre uma nova aba para o editor SQL - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] - Executar todo/selecionado SQL [F5, Ctrl+Enter, Ctrl+R] + Execute all/selected SQL + Executar todo/selecionado SQL This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. @@ -3378,8 +3378,8 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Encontrar texto no editor SQL - Find text in SQL editor [Ctrl+F] - Encontrar texto no editor SQL [Ctrl+F] + Find text in SQL editor + Encontrar texto no editor SQL This button opens the search bar of the editor @@ -3394,8 +3394,8 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Encontrar ou substituir texto no editor SQL - Find or replace text in SQL editor [Ctrl+H] - Encontrar ou substituir texto no editor SQL [Ctrl+H] + Find or replace text in SQL editor + Encontrar ou substituir texto no editor SQL This button opens the find/replace dialog for the current editor tab @@ -3530,16 +3530,16 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Imprimir - Print text from current SQL editor tab [Ctrl+P] - Imprimir texto do editor SQL [Ctrl+P] + Print text from current SQL editor tab + Imprimir texto do editor SQL Open a dialog for printing the text in the current SQL editor tab Abre um diálogo para imprimir o texto na aba atual do editor SQL - Print the structure of the opened database [Ctrl+P] - Imprime a estrutura do banco de dados aberto [Ctrl+P] + Print the structure of the opened database + Imprime a estrutura do banco de dados aberto Open a dialog for printing the structure of the opened database @@ -3714,8 +3714,8 @@ Faça um backup! Pressione Help para abrir a página de referência SQL correspondente. - Print currently browsed table data [Ctrl+P] - Imprimir dados da tabela atual [Ctrl+P] + Print currently browsed table data + Imprimir dados da tabela atual Print currently browsed table data. Print selection if more than one cell is selected. diff --git a/src/translations/sqlb_ru.ts b/src/translations/sqlb_ru.ts index 59f357864..ba2bd726d 100644 --- a/src/translations/sqlb_ru.ts +++ b/src/translations/sqlb_ru.ts @@ -713,8 +713,8 @@ Aborting execution%3. - Apply data to cell [Ctrl+Return] - Применить данные к ячейке [Ctrl+Enter] + Apply data to cell + Применить данные к ячейке @@ -2284,8 +2284,8 @@ x~y Диапазон: значения между x и y - Print currently browsed table data [Ctrl+P] - Печатать отображаемую таблицу [Ctrl+P] + Print currently browsed table data + Печатать отображаемую таблицу @@ -2405,8 +2405,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] - Выполнить все/выбранный SQL [F5, Ctrl+Enter, Ctrl+R] + Execute all/selected SQL + Выполнить все/выбранный SQL @@ -2546,8 +2546,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find text in SQL editor [Ctrl+F] - Найти текст в редакторе SQL [Ctrl+F] + Find text in SQL editor + Найти текст в редакторе SQL @@ -2566,8 +2566,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find or replace text in SQL editor [Ctrl+H] - Найти или заменить текст в редакторе SQL Ctrl+H] + Find or replace text in SQL editor + Найти или заменить текст в редакторе SQL @@ -2745,8 +2745,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print text from current SQL editor tab [Ctrl+P] - Печать текста изтекущей вкладки редактора SQL [Ctrl+P] + Print text from current SQL editor tab + Печать текста изтекущей вкладки редактора SQL @@ -2755,8 +2755,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print the structure of the opened database [Ctrl+P] - Печать структуры открытой БД [Ctrl+P] + Print the structure of the opened database + Печать структуры открытой БД @@ -3074,8 +3074,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute current line [Shift+F5] - Выполнить текущую строку [Shift+F5] + Execute current line + Выполнить текущую строку @@ -3568,8 +3568,8 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] - Обновить данные в выбранной таблице [F5, Ctrl+R] + Refresh the data in the selected table + Обновить данные в выбранной таблице @@ -3665,8 +3665,8 @@ You can drag SQL statements from an object row and drop them into other applicat В&ыполнить код SQL - Execute SQL [F5, Ctrl+Return] - Выполнить код SQL [F5, Ctrl+Return] + Execute SQL + Выполнить код SQL @@ -3686,8 +3686,8 @@ You can drag SQL statements from an object row and drop them into other applicat Выполнить текущую строку - Execute current line [Ctrl+E] - Выполнить текущую строку [Ctrl+E] + Execute current line + Выполнить текущую строку diff --git a/src/translations/sqlb_tr.ts b/src/translations/sqlb_tr.ts index fe26357a9..6d3d19b78 100644 --- a/src/translations/sqlb_tr.ts +++ b/src/translations/sqlb_tr.ts @@ -819,7 +819,7 @@ Errors are indicated with a red squiggle underline. - Apply data to cell [Ctrl+Return] + Apply data to cell @@ -2606,7 +2606,7 @@ x~y Range: values between x and y - Execute current line [Shift+F5] + Execute current line @@ -3085,7 +3085,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] + Refresh the data in the selected table @@ -3110,7 +3110,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Print currently browsed table data [Ctrl+P] + Print currently browsed table data @@ -3257,7 +3257,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL @@ -3373,7 +3373,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find text in SQL editor [Ctrl+F] + Find text in SQL editor @@ -3393,7 +3393,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find or replace text in SQL editor [Ctrl+H] + Find or replace text in SQL editor @@ -3572,7 +3572,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print text from current SQL editor tab [Ctrl+P] + Print text from current SQL editor tab @@ -3582,7 +3582,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print the structure of the opened database [Ctrl+P] + Print the structure of the opened database @@ -3651,8 +3651,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed &SQL kodunu yürüt - Execute SQL [F5, Ctrl+Return] - SQL kodunu yürüt [F5, Ctrl+Enter] + Execute SQL + SQL kodunu yürüt @@ -3681,8 +3681,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Geçerli satırı yürüt - Execute current line [Ctrl+E] - Geçerli satırı yürüt [Ctrl+E] + Execute current line + Geçerli satırı yürüt diff --git a/src/translations/sqlb_uk_UA.ts b/src/translations/sqlb_uk_UA.ts index b8d4a7fb9..c9c6ff7d0 100644 --- a/src/translations/sqlb_uk_UA.ts +++ b/src/translations/sqlb_uk_UA.ts @@ -871,7 +871,7 @@ Errors are indicated with a red squiggle underline. - Apply data to cell [Ctrl+Return] + Apply data to cell @@ -2766,8 +2766,8 @@ x~y Range: values between x and y Схе&ма БД - Execute SQL [F5, Ctrl+Return, Ctrl+R] - Виконати SQL [F5, Ctrl+Return, Ctrl+R] + Execute SQL + Виконати SQL &Load extension @@ -2775,8 +2775,8 @@ x~y Range: values between x and y - Execute current line [Shift+F5] - Виконати поточний рядок [Shift+F5] + Execute current line + Виконати поточний рядок @@ -3234,7 +3234,7 @@ x~y Range: values between x and y - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL @@ -3335,7 +3335,7 @@ x~y Range: values between x and y - Find text in SQL editor [Ctrl+F] + Find text in SQL editor @@ -3355,7 +3355,7 @@ x~y Range: values between x and y - Find or replace text in SQL editor [Ctrl+H] + Find or replace text in SQL editor @@ -3534,7 +3534,7 @@ x~y Range: values between x and y - Print text from current SQL editor tab [Ctrl+P] + Print text from current SQL editor tab @@ -3544,7 +3544,7 @@ x~y Range: values between x and y - Print the structure of the opened database [Ctrl+P] + Print the structure of the opened database @@ -3610,7 +3610,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] + Refresh the data in the selected table @@ -3635,7 +3635,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Print currently browsed table data [Ctrl+P] + Print currently browsed table data @@ -3803,8 +3803,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Ви&конати код SQL - Execute SQL [F5, Ctrl+Return] - Виконати код SQL [F5, Ctrl+Return] + Execute SQL + Виконати код SQL @@ -3834,8 +3834,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Виконати поточний рядок - Execute current line [Ctrl+E] - Виконати поточний рядок [Ctrl+E] + Execute current line + Виконати поточний рядок diff --git a/src/translations/sqlb_zh.ts b/src/translations/sqlb_zh.ts index e79f1d027..df8f7ef29 100644 --- a/src/translations/sqlb_zh.ts +++ b/src/translations/sqlb_zh.ts @@ -719,8 +719,8 @@ Aborting execution%3. - Apply data to cell [Ctrl+Return] - 将数据应用到单元格 [Ctrl+Return] + Apply data to cell + 将数据应用到单元格 @@ -2666,8 +2666,8 @@ x~y 范围: 值在 x 和 y 之间 - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] - 执行所有/选中的 SQL [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL + 执行所有/选中的 SQL @@ -3188,8 +3188,8 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] - 刷新选中表中的数据 [F5, Ctrl+R] + Refresh the data in the selected table + 刷新选中表中的数据 @@ -3213,8 +3213,8 @@ You can drag SQL statements from an object row and drop them into other applicat - Print currently browsed table data [Ctrl+P] - 打印当前浏览表中的数据 [Ctrl+P] + Print currently browsed table data + 打印当前浏览表中的数据 @@ -3398,8 +3398,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find text in SQL editor [Ctrl+F] - 在 SQL 编辑器中查找文本 [Ctrl+F] + Find text in SQL editor + 在 SQL 编辑器中查找文本 @@ -3418,8 +3418,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find or replace text in SQL editor [Ctrl+H] - 在 SQL 编辑器中查找或替换文本 [Ctrl+H] + Find or replace text in SQL editor + 在 SQL 编辑器中查找或替换文本 @@ -3597,8 +3597,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print text from current SQL editor tab [Ctrl+P] - 从当前的 SQL 编辑器标签页打印文本 [Ctrl+P] + Print text from current SQL editor tab + 从当前的 SQL 编辑器标签页打印文本 @@ -3607,8 +3607,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print the structure of the opened database [Ctrl+P] - 打印当前打开的数据库的结构 [Ctrl+P] + Print the structure of the opened database + 打印当前打开的数据库的结构 @@ -3688,8 +3688,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed 执行 SQL(&E) - Execute SQL [F5, Ctrl+Return, Ctrl+R] - 执行 SQL [F5, Ctrl+回车, Ctrl+R] + Execute SQL + 执行 SQL &Load extension @@ -3742,8 +3742,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute current line [Shift+F5] - 执行当前行 [Shift+F5] + Execute current line + 执行当前行 diff --git a/src/translations/sqlb_zh_TW.ts b/src/translations/sqlb_zh_TW.ts index 5acbe0b67..606740e3c 100644 --- a/src/translations/sqlb_zh_TW.ts +++ b/src/translations/sqlb_zh_TW.ts @@ -834,7 +834,7 @@ Errors are indicated with a red squiggle underline. - Apply data to cell [Ctrl+Return] + Apply data to cell @@ -2600,7 +2600,7 @@ x~y Range: values between x and y - Execute current line [Shift+F5] + Execute current line @@ -3011,7 +3011,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Refresh the data in the selected table [F5, Ctrl+R] + Refresh the data in the selected table @@ -3036,7 +3036,7 @@ You can drag SQL statements from an object row and drop them into other applicat - Print currently browsed table data [Ctrl+P] + Print currently browsed table data @@ -3188,7 +3188,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL @@ -3309,7 +3309,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find text in SQL editor [Ctrl+F] + Find text in SQL editor @@ -3329,7 +3329,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Find or replace text in SQL editor [Ctrl+H] + Find or replace text in SQL editor @@ -3508,7 +3508,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print text from current SQL editor tab [Ctrl+P] + Print text from current SQL editor tab @@ -3518,7 +3518,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed - Print the structure of the opened database [Ctrl+P] + Print the structure of the opened database @@ -3587,8 +3587,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed 執行 SQL(&E) - Execute SQL [F5, Ctrl+Return] - 執行 SQL [F5, Ctrl+ Enter] + Execute SQL + 執行 SQL &Wiki... @@ -3648,8 +3648,8 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed 執行目前行 - Execute current line [Ctrl+E] - 執行目前行 [Ctrl+E] + Execute current line + 執行目前行 diff --git a/src/translations/translations.qrc b/src/translations/translations.qrc index 8ad60b536..1270e5862 100644 --- a/src/translations/translations.qrc +++ b/src/translations/translations.qrc @@ -14,5 +14,6 @@ sqlb_ko_KR.qm sqlb_tr.qm sqlb_uk_UA.qm + sqlb_it.qm