Commit 8680575c authored by Denis Khachko's avatar Denis Khachko

Merge branch 'master' of gitorious.org:kumir2/kumir2

parents 39ac5926 5740c3ac
Build manual for openSUSE 13.1
---------------------------------
1. Required additional packages to install before build:
- cmake
- gcc-c++
- libqt4-devel
- libqca2-devel
- libQtWebKit-devel
- boost-devel
- zlib-devel
- llvm-devel
- llvm-clang
2. Build and install commands
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ../
sudo make install # installs to /usr/local, requires root password
\ No newline at end of file
Build manual for Ubuntu 14.04 LTS
---------------------------------
1. Required additional packages to install before build:
- cmake
- g++
- libqt4-dev
- libqca2-dev
- zlib1g-dev
- libboost-dev
- llvm-dev
- clang
2. Build and install commands
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ../
sudo make install # installs to /usr/local, requires root password
\ No newline at end of file
......@@ -85,13 +85,17 @@ if(NOT APPLE)
file(COPY ${CMAKE_SOURCE_DIR}/kumir2-classic.desktop DESTINATION ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications)
file(COPY ${CMAKE_SOURCE_DIR}/kumir2-highgrade.desktop DESTINATION ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications)
file(COPY ${CMAKE_SOURCE_DIR}/kumir2-teacher.desktop DESTINATION ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications)
file(COPY ${CMAKE_SOURCE_DIR}/kumir2-python.desktop DESTINATION ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications)
if(EXISTS ${CMAKE_SOURCE_DIR}/kumir2-python.desktop)
file(COPY ${CMAKE_SOURCE_DIR}/kumir2-python.desktop DESTINATION ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications)
endif()
file(COPY ${CMAKE_SOURCE_DIR}/kumir2-open.desktop DESTINATION ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications)
file(COPY ${CMAKE_SOURCE_DIR}/kumir2-run.desktop DESTINATION ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications)
install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications/kumir2-professional.desktop DESTINATION share/applications)
install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications/kumir2-classic.desktop DESTINATION share/applications)
install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications/kumir2-highgrade.desktop DESTINATION share/applications)
install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications/kumir2-python.desktop DESTINATION share/applications)
if(EXISTS ${CMAKE_SOURCE_DIR}/kumir2-python.desktop)
install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications/kumir2-python.desktop DESTINATION share/applications)
endif()
install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications/kumir2-teacher.desktop DESTINATION share/applications)
install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications/kumir2-open.desktop DESTINATION share/applications)
install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/share/applications/kumir2-run.desktop DESTINATION share/applications)
......
......@@ -1135,12 +1135,18 @@ class Settings:
assert isinstance(entry, SettingsEntry)
result += entry.get_entry_cpp_implementation("entries")
result += """
%s = new Widgets::DeclarativeSettingsPage(
bool guiAvailable = true;
#ifdef Q_WS_X11
guiAvailable = 0 != getenv("DISPLAY");
#endif
if (guiAvailable) {
%s = new Widgets::DeclarativeSettingsPage(
Shared::actorCanonicalName(localizedModuleName(QLocale::Russian)),
mySettings(),
entries
);
connect(%s, SIGNAL(settingsChanged(QStringList)), this, SLOT(handleSettingsChangedCppImplementation(QStringList)));
connect(%s, SIGNAL(settingsChanged(QStringList)), this, SLOT(handleSettingsChangedCppImplementation(QStringList)));
}
""" % (variable_name, variable_name)
return result
......
......@@ -13,11 +13,11 @@ TS_MODULES = {
"Editor": "src/plugins/editor",
"KumirAnalizer": "src/plugins/kumiranalizer",
"KumirCompilerTool": "src/plugins/kumircompilertool",
"KumirCompiler": "src/plugins/kumircompiler",
# "KumirCompiler": "src/plugins/kumircompiler",
"KumirCodeRun": "src/plugins/kumircoderun",
"KumirCodeGenerator": "src/plugins/kumircodegenerator",
# "KumirNativeGenerator": "src/plugins/kumirnativegenerator",
"PascalAnalizer": "src/plugins/pascalanalizer",
# "PascalAnalizer": "src/plugins/pascalanalizer",
# "st_funct": "src/plugins/st_funct"
}
......
share/kumir2/icons/iconset/22x22/run-stop.png

208 Bytes | W: | H:

share/kumir2/icons/iconset/22x22/run-stop.png

224 Bytes | W: | H:

share/kumir2/icons/iconset/22x22/run-stop.png
share/kumir2/icons/iconset/22x22/run-stop.png
share/kumir2/icons/iconset/22x22/run-stop.png
share/kumir2/icons/iconset/22x22/run-stop.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -311,6 +311,8 @@
"Too many ':=' operators";"Много “:=” в одной строке";"";"";"";"";
"Too many 'not'";"Много “не”";"";"";"";"";
"Too many errors";"Слишком много ошибок";"";"";"";"";
"Too many qoutes";"";"";"";"";"";
"Too many qoutes in constant";"Много кавычек в одной константе";"";"";"";"";
"Type not declared before";"Не указан тип";"";"";"";"";
"Unmatched array dimensions";"Несоответствие размерностей таблиц";"";"";"";"";
"Unpaired '('";"Нет парной “)”";"";"";"";"";
......
This diff is collapsed.
......@@ -34,10 +34,7 @@ GrasshopperModule::GrasshopperModule(ExtensionSystem::KPlugin * parent)
: GrasshopperModuleBase(parent)
{
kuznec=new KumKuznec(myResourcesDir());
connect(m_actionGrasshopperNewEnvironment,SIGNAL(triggered()) ,kuznec , SLOT(ClearPicture()));
connect(m_actionGrasshopperLoadEnvironment,SIGNAL(triggered()) ,kuznec , SLOT(LoadFromFileActivated()));
connect(m_actionGrasshopperSave,SIGNAL(triggered()) ,kuznec , SLOT(SaveToFileActivated()));
kuznec=nullptr;
// Module constructor, called once on plugin load
// TODO implement me
......@@ -46,6 +43,9 @@ GrasshopperModule::GrasshopperModule(ExtensionSystem::KPlugin * parent)
void GrasshopperModule::createGui()
{
kuznec=new KumKuznec(myResourcesDir());
connect(m_actionGrasshopperNewEnvironment,SIGNAL(triggered()) ,kuznec , SLOT(ClearPicture()));
connect(m_actionGrasshopperLoadEnvironment,SIGNAL(triggered()) ,kuznec , SLOT(LoadFromFileActivated()));
connect(m_actionGrasshopperSave,SIGNAL(triggered()) ,kuznec , SLOT(SaveToFileActivated()));
}
QString GrasshopperModule::initialize(const QStringList &configurationParameters, const ExtensionSystem::CommandLine &)
......
......@@ -2276,7 +2276,7 @@ void KumKuznec::MouseMove(int x, int y,bool LeftButtonFlag)
if(moving)return;
if(!LeftMousePressFlag)return;
//qDebug()<<"MMove "<<x;
if((abs(x-OldX)<5)&&(abs(y - OldY)<5)){qDebug()<<"return 1";return;};
if((fabs(x-OldX)<5)&&(fabs(y - OldY)<5)){qDebug()<<"return 1";return;};
//QApplication::setOverrideCursor(Qt::PointingHandCursor);
qreal centY=center().y();
......
......@@ -104,7 +104,10 @@ if(APPLE)
endif(APPLE)
add_subdirectory(kumir2-bc)
add_subdirectory(kumir2-xrun)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/kumir2-xrun")
add_subdirectory(kumir2-xrun)
endif()
# kumir2-llvmc is optional in case if LLVM libraries present
if(Llvm_FOUND)
......
......@@ -22,7 +22,7 @@ else()
endif()
set(CONFIGURATION_TEMPLATE
"CourseManager,Editor,Browser,Actor*,KumirAnalizer,*CodeGenerator,KumirCodeRun,!CoreGUI\(notabs,icon=classic,nostartpage,nosessions\)"
"CourseManager,Editor,Actor*,KumirAnalizer,*CodeGenerator,KumirCodeRun,!CoreGUI\(notabs,icon=classic,nostartpage,nosessions\)"
)
set(SPLASHSCREEN
"coregui/splashscreens/classic.png"
......
......@@ -22,7 +22,7 @@ else()
endif()
set(CONFIGURATION_TEMPLATE
"CourseManager,Editor,Browser,Actor*,KumirAnalizer\(preload=Files,preload=Strings\),*CodeGenerator,KumirCodeRun,!CoreGUI\(notabs,icon=highgrade,nostartpage,nosessions\)"
"CourseManager,Editor,Actor*,KumirAnalizer\(preload=Files,preload=Strings\),*CodeGenerator,KumirCodeRun,!CoreGUI\(notabs,icon=highgrade,nostartpage,nosessions\)"
)
set(SPLASHSCREEN
"coregui/splashscreens/highgrade.png"
......
......@@ -62,6 +62,12 @@ void Component::addJavaScriptObjects()
}
}
void Component::setContent(const QString &data)
{
setHtml(data);
pageAction(QWebPage::Back)->setEnabled(false);
}
void Component::go(const QUrl &url)
{
setUrl(url);
......
......@@ -38,6 +38,7 @@ public:
public slots:
void go(const QUrl & url);
void setContent(const QString & data);
void evaluateCommand(const QString & method, const QVariantList & arguments);
protected:
void showEvent(QShowEvent *e);
......
......@@ -306,7 +306,26 @@ MainWindow::MainWindow(Plugin * p) :
ui->menubar->setContextMenuWidget(menubarContextMenu_);
topLevelMenus_ << ui->menuFile << ui->menuEdit << ui->menuInsert
<< ui->menuRun << ui->menuRun << ui->menuHelp;
ui->menubar->addAction(menubarContextMenu_->showAction());
bool useGlobalMenu = false;
#ifdef Q_OS_MAC
useGlobalMenu = true;
#endif
#ifdef Q_OS_LINUX
const char * session = ::getenv("SESSION");
if (session && QString::fromLatin1(session).toLower() == "ubuntu") {
useGlobalMenu = true;
}
#endif
if (useGlobalMenu) {
QMenu * fakeMenu = ui->menubar->addMenu(menubarContextMenu_->showAction()->text());
menubarContextMenu_->showAction()->setText(tr("Configure menu items..."));
fakeMenu->addAction(menubarContextMenu_->showAction());
}
else {
ui->menubar->addAction(menubarContextMenu_->showAction());
}
}
void MainWindow::addMenuBeforeHelp(QMenu *menu)
......@@ -327,10 +346,12 @@ void MainWindow::setupMenuBarContextMenu()
menubarContextMenu_->setSettingsObject(m_plugin->mySettings(), "MenuBarItems");
Q_FOREACH(QMenu* menu, topLevelMenus_) {
QAction * menuAction = menu->menuAction();
const QString objectName = menu->objectName();
menuAction->setObjectName(objectName);
menubarContextMenu_->addProxy(menuAction);
if (menu) {
QAction * menuAction = menu->menuAction();
const QString objectName = menu->objectName();
menuAction->setObjectName(objectName);
menubarContextMenu_->addProxy(menuAction);
}
}
menubarContextMenu_->finalize();
......
......@@ -438,6 +438,7 @@ QString Plugin::initialize(const QStringList & parameters, const ExtensionSystem
// qDebug() << "LINE DEBUG: " << QFileInfo(QString(__FILE__)).fileName() << ":" << __LINE__;
actors += loadedPlugins("st_funct");
// qDebug() << "LINE DEBUG: " << QFileInfo(QString(__FILE__)).fileName() << ":" << __LINE__;
QList<QUrl> actorHelpFiles;
foreach (ExtensionSystem::KPlugin* o, actors) {
ActorInterface * actor = qobject_cast<ActorInterface*>(o);
const QString actorName = Shared::actorCanonicalName(actor->localizedModuleName(QLocale::Russian));
......@@ -446,7 +447,7 @@ QString Plugin::initialize(const QStringList & parameters, const ExtensionSystem
QWidget * w = 0;
const QString actorHelpFile = helpPath + o->pluginSpec().name + ".xml";
if (!actor->localizedModuleName(QLocale::Russian).startsWith("_") && QFile(actorHelpFile).exists()) {
helpViewer_->addDocument(QUrl::fromLocalFile(actorHelpFile));
actorHelpFiles.append(QUrl::fromLocalFile(actorHelpFile));
}
if (actor->mainWidget()) {
QWidget * actorWidget = actor->mainWidget();
......@@ -552,6 +553,7 @@ QString Plugin::initialize(const QStringList & parameters, const ExtensionSystem
}
}
helpViewer_->addDocuments(tr("Actor's References"), actorHelpFiles);
// qDebug() << "LINE DEBUG: " << QFileInfo(QString(__FILE__)).fileName() << ":" << __LINE__;
if (!parameters.contains("nostartpage", Qt::CaseInsensitive)) {
......
......@@ -7,13 +7,13 @@ endif(NOT DEFINED USE_QT)
if(${USE_QT} GREATER 4)
# Find Qt5
find_package(Qt5 5.3.0 COMPONENTS Core Widgets Xml WebKitWidgets REQUIRED)
include_directories(${Qt5Core_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Xml_INCLUDE_DIRS} ${Qt5WebKitWidgets_INCLUDE_DIRS} BEFORE)
set(QT_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Xml_LIBRARIES} ${Qt5WebKitWidgets_LIBRARIES})
find_package(Qt5 5.3.0 COMPONENTS Core Widgets Xml REQUIRED)
include_directories(${Qt5Core_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Xml_INCLUDE_DIRS} BEFORE)
set(QT_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Xml_LIBRARIES} )
else()
# Find Qt4
set(QT_USE_QTMAIN 1)
find_package(Qt4 4.7.0 COMPONENTS QtCore QtGui QtXml QtSvg QtWebkit REQUIRED)
find_package(Qt4 4.7.0 COMPONENTS QtCore QtGui QtXml REQUIRED)
include(${QT_USE_FILE})
endif()
include(../../kumir2_plugin.cmake)
......
......@@ -2,6 +2,9 @@
#include "ui_mainwindow.h"
//#include "interface.h"
#include "interfaces/browserinterface.h"
#include "interfaces/browser_instanceinterface.h"
MainWindowTask::MainWindowTask(QWidget *parent) :
QMainWindow(parent),
......@@ -65,11 +68,59 @@ isTeacher=false;
onTask=false;
cursFile="";
setWindowIcon(QIcon(resourcesRoot.absoluteFilePath("10.png")));
#ifdef QT_DEBUG
ui->webView->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
#endif
setupWebView();
//ui->textBrowser->setVisible(false);
};
void MainWindowTask::setupWebView()
{
using namespace ExtensionSystem;
using namespace Shared;
BrowserInterface * browserPlugin
= PluginManager::instance()->findPlugin<BrowserInterface>();
QWidget * webViewComponent = 0;
simpleBrowserWidget_ = 0;
browserPluginInstance_ = 0;
if (browserPlugin) {
browserPluginInstance_ = browserPlugin->createBrowser();
webViewComponent = browserPluginInstance_->widget();
}
else {
simpleBrowserWidget_ = new QTextBrowser();
webViewComponent = simpleBrowserWidget_;
}
webViewComponent->setParent(ui->webView);
webViewComponent->setMinimumWidth(200);
QVBoxLayout * l = new QVBoxLayout;
l->setContentsMargins(0, 0, 0, 0);
ui->webView->setLayout(l);
l->addWidget(webViewComponent);
}
void MainWindowTask::setTaskViewHtml(const QString &data)
{
if (simpleBrowserWidget_) {
simpleBrowserWidget_->setHtml(data);
}
else if (browserPluginInstance_) {
browserPluginInstance_->setContent(data);
}
}
void MainWindowTask::setTaskViewUrl(const QUrl &url)
{
if (simpleBrowserWidget_) {
simpleBrowserWidget_->setSource(url);
}
else if (browserPluginInstance_) {
browserPluginInstance_->go(url);
}
}
QList<QAction*> MainWindowTask::getActions()
{
QList<QAction*> toRet;
......@@ -259,7 +310,7 @@ for(int i=0;i<prgElListT.count();i++)
if(cText.right(4)==".htm" ||cText.right(5)==".html" )
{
loadHtml(cText);
}else ui->webView->setHtml(cText);
}else setTaskViewHtml(cText);
// if(isTeacher)ui->actionEdit->setEnabled(true);
setWindowTitle(course->name()+trUtf8(" - Практикум"));
updateLastFiles(fileName);
......@@ -324,7 +375,7 @@ void MainWindowTask::loadCourse()
if(cText.right(4)==".htm" ||cText.right(5)==".html" )
{
loadHtml(cText);
}else ui->webView->setHtml(cText);
}else setTaskViewHtml(cText);
// if(isTeacher)ui->actionEdit->setEnabled(true);
setWindowTitle(course->name()+trUtf8(" - Практикум"));
updateLastFiles(fileName);
......@@ -435,7 +486,7 @@ void MainWindowTask::showText(const QModelIndex & index )
if(taskText.right(4)==".htm" ||taskText.right(5)==".html" )
{
loadHtml(taskText);
}else ui->webView->setHtml(taskText);
}else setTaskViewHtml(taskText);
qDebug()<<"TaskText:"<<course->getTaskText(index);
curTaskIdx=index;
......@@ -457,20 +508,23 @@ void MainWindowTask::showText(const QModelIndex & index )
};
void MainWindowTask::loadHtml(QString fileName)
{
qDebug()<<"LoadHtml"<<fileName;
if(fileName.isEmpty())return;
QFile inp(curDir+'/'+fileName);
if (!inp.open(QIODevice::ReadOnly))
{
QMessageBox::information( 0, "", trUtf8("Ошибка чтения: ") + fileName, 0,0,0);
return;
};
QString htmlData=QString::fromUtf8(inp.readAll());
//ui->textBrowser->setHtml(htmlData);
{
const QString absolutePath = QDir(curDir).absoluteFilePath(fileName);
const QUrl url = QUrl::fromLocalFile(absolutePath);
setTaskViewUrl(url);
// qDebug()<<"LoadHtml"<<fileName;
// if(fileName.isEmpty())return;
// QFile inp(curDir+'/'+fileName);
// if (!inp.open(QIODevice::ReadOnly))
// {
// QMessageBox::information( 0, "", trUtf8("Ошибка чтения: ") + fileName, 0,0,0);
// return;
// };
// QString htmlData=QString::fromUtf8(inp.readAll());
// //ui->textBrowser->setHtml(htmlData);
ui->webView->setHtml(htmlData,QUrl("file://"+curDir+'/'+fileName));
inp.close();
// ui->webView->setHtml(htmlData,QUrl("file://"+curDir+'/'+fileName));
// inp.close();
};
void MainWindowTask::startTask()
......
......@@ -21,11 +21,16 @@
#include "../coursemanager_plugin.h"
#include "editdialog.h"
#include "newkursdialog.h"
#include <QTextBrowser>
#ifdef interface
#undef interface // used name 'interface' conflicts with Windows SDK
#endif
namespace Shared { namespace Browser {
class InstanceInterface;
} }
class KumZadanie
{
public:
......@@ -135,6 +140,9 @@ protected:
void closeEvent(QCloseEvent *event);
void showEvent(QShowEvent * event);
private:
void setupWebView();
void setTaskViewHtml(const QString & data);
void setTaskViewUrl(const QUrl & url);
void markProgChange();
void createMoveMenu();
void setUpDown(QModelIndex index);
......@@ -163,6 +171,9 @@ private:
QFileInfo baseKursFile; //4 mode
Ui::MainWindowTask *ui;
bool isReadOnly;
Shared::Browser::InstanceInterface * browserPluginInstance_;
QTextBrowser * simpleBrowserWidget_;
};
......
......@@ -67,12 +67,7 @@
<bool>true</bool>
</property>
</widget>
<widget class="QWebView" name="webView">
<property name="url">
<url>
<string>about:blank</string>
</url>
</property>
<widget class="QWidget" name="webView">
</widget>
</widget>
</item>
......
......@@ -492,6 +492,7 @@ void EditorInstance::updateFromAnalizer()
if (i<props.size()) {
doc_->setHighlightAt(i, props[i].toList());
}
doc_->at(i).multipleStatementsInLine = analizerInstance_->multipleStatementsInLine(i);
doc_->marginAt(i).errors.clear();
int newIndent = doc_->indentAt(i);
int diffIndent = newIndent - oldIndent;
......
......@@ -976,7 +976,13 @@ void EditorPlane::paintEvent(QPaintEvent *e)
p.drawLine(highlightRightRect.bottomLeft(),
highlightRightRect.bottomRight());
if (highlightedTextColumnStartNumber_ != highlightedTextColumnEndNumber_) {
bool drawInLineRect = false;
if (highlightedTextLineNumber_ < editor_->document()->linesCount()) {
const TextLine & textLine = editor_->document()->at(highlightedTextLineNumber_);
drawInLineRect = textLine.multipleStatementsInLine;
}
if (drawInLineRect && highlightedTextColumnStartNumber_ != highlightedTextColumnEndNumber_) {
// Draw a rect around statement
QPen pen;
pen.setColor(highlightedTextLineColor_);
......@@ -1559,6 +1565,25 @@ void EditorPlane::doAutocomplete()
}
}
static unsigned int findNumberOfOverlappingTrailingCharacters(
const QString & source, const QString & pattern
)
{
/* Find count of X'es:
* ........XXXXPPPPPPPP -- pattern string
* SSSSSSSSXXXX........ -- source string
*/
unsigned int result = 0u;
for (int i=1; i<source.size()+1; i++) {
const QString tail = source.mid(source.size()-i);
if (pattern.startsWith(tail)) {
result = (unsigned int) i;
break;
}
}
return result;
}
void EditorPlane::finishAutoCompletion(const QString &suggestion)
{
#ifdef QT_DEBUG
......@@ -1580,12 +1605,13 @@ void EditorPlane::finishAutoCompletion(const QString &suggestion)
int leftPart = 0;
QString text;
if (!suggestion.startsWith(' ')) {
for (int i=before.length()-1; i>=0; i--) {
if (Delimeters.contains(before[i]))
break;
else
leftPart += 1;
}
leftPart = findNumberOfOverlappingTrailingCharacters(before, suggestion);
// for (int i=before.length()-1; i>=0; i--) {
// if (Delimeters.contains(before[i]))
// break;
// else
// leftPart += 1;
// }
text = suggestion;
}
else if (before.length()>0) {
......
......@@ -25,6 +25,7 @@ struct TextLine
inserted = false;
protecteed = false;
hidden = false;
multipleStatementsInLine = false;
}
int indentStart;
int indentEnd;
......@@ -45,6 +46,7 @@ struct TextLine
bool changed;
bool inserted;
bool multipleStatementsInLine;
};
class TextDocument
......
......@@ -78,6 +78,25 @@ void Analizer::setSourceDirName(const QString &dirName)
d->analizer->setSourceDirName(dirName);
}
bool Analizer::multipleStatementsInLine(int lineNo) const
{
const QList<TextStatementPtr> & sts = d->statements;
</