Обоснование актуальности разработки универсальной учебной машины

Описание универсальной учебной виртуальной машины УУМ-32. Безопасность исполнения кода и разграничение прав пользователя. Суть средств разработки программного обеспечения. Изображение логической структуры приложения. Анализ входных и выходных данных.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 24.11.2014
Размер файла 1,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

<Keyword name="RESB" hint="Директива ассемблера, служащая для резервирования определенного числа байт (тип byte).&#xA;&#xA;Синтаксис:&#xA; [label:] RESB n&#xA; * label - метка резервируемого блока памяти&#xA; * n - количество резервируемых элементов&#xA;&#xA;Пример:&#xA; buffer: RESB 10" />

<Keyword name="RESH" hint="Директива ассемблера, служащая для резервирования определенного числа полуслов (тип half).&#xA;&#xA;Синтаксис:&#xA; [label:] RESH n&#xA; * label - метка резервируемого блока памяти&#xA; * n - количество резервируемых элементов&#xA;&#xA;Пример:&#xA; buffer: RESH 10" />

<Keyword name="RESW" hint="Директива ассемблера, служащая для резервирования определенного числа машинных слов (тип word).&#xA;&#xA;Синтаксис:&#xA; [label:] RESW n&#xA; * label - метка резервируемого блока памяти&#xA; * n - количество резервируемых элементов&#xA;&#xA;Пример:&#xA; buffer: RESW 10" />

<Keyword name="START" hint="Директива ассемблера, задающая точку начала главной секции.&#xA;&#xA;Синтаксис:&#xA; label: START addr&#xA; * label - имя главной секции&#xA; * addr - стартовый адрес главной секции&#xA;&#xA;Пример:&#xA; helloWorld: START 0" />

<Keyword name="WORD" hint="Директива ассемблера, служащая для формирования константы или массива типа word (машинное слово).&#xA;&#xA;Синтаксис:&#xA; [label:] WORD N1[, N2, ...]&#xA; * label - метка константы или массива&#xA; * N1, N2, ... - список констант или константных выражений&#xA;&#xA;Пример:&#xA; array: WORD 555, -100, 0xFE, 0b1010, *-1, (x1+x2-x3)/2" />

</Keywords>

<Keywords type="Директивы макроассемблера">

<Keyword name="INCLUDE" hint="Директива макроассемблера, предназначенная для подключения макробиблиотек" />

<Keyword name="MACRO" hint="Директива макроассемблера, определяющая начало макроса" />

<Keyword name="MEND" hint="Директива макроассемблера, определяющая конец макроса" />

</Keywords>

</UUM32AssemblerKeywords>

Приложение 3

Пример файла, содержащего построенный макропроцессором ассемблерный код программы

; --< This file is created automatically by UUM-32 Macroassembler >--

; --< Do not change or remove this comment >--

HW: START 0 ;@@meta@@hw1.uum32masm|5

; MACRO CRLF

LD A, #13 ;@@meta@@hw.uum32mlb|2

WD #0 ;@@meta@@hw.uum32mlb|3

LD A, #10 ;@@meta@@hw.uum32mlb|4

WD #0 ;@@meta@@hw.uum32mlb|5

; MEND

; MACRO CRLF

LD A, #13 ;@@meta@@hw.uum32mlb|2

WD #0 ;@@meta@@hw.uum32mlb|3

LD A, #10 ;@@meta@@hw.uum32mlb|4

WD #0 ;@@meta@@hw.uum32mlb|5

; MEND

CLEAR X ;@@meta@@hw1.uum32masm|10

LD R0, #LEN ;@@meta@@hw1.uum32masm|11

LOOP: LDB A, TEXT[X] ;@@meta@@hw1.uum32masm|12

WD #0 ;@@meta@@hw1.uum32masm|13

INCR X, R0 ;@@meta@@hw1.uum32masm|14

JLT LOOP ;@@meta@@hw1.uum32masm|15

RET ;@@meta@@hw1.uum32masm|16

TEXT: BYTE 'Привет, мир!!!';@@meta@@hw1.uum32masm|18

LEN: EQU * - TEXT ;@@meta@@hw1.uum32masm|19

END ;@@meta@@hw1.uum32masm|20

Приложение 4

Пример объектного файла программы для УУМ-32

H|HW|00000023

T|00000000|15|2720|1404000E|1510000B|3C000000|6724|5700FFF2|63

T|00000015|0E|CFF0E8E2E5F22C20ECE8F0212121

E

Приложение 5

Пример файла листинга программы для УУМ-32

00000000 | HW: START 0 |

00000000 | CLEAR X | 2720

00000002 | LD R0, #LEN | 1404000e

00000006 | LOOP: LDB A, TEXT[X] | 1510000b

0000000a | WD #0 | 3c000000

0000000e | INCR X, R0 | 6724

00000010 | JLT LOOP | 5700fff2

00000014 | RET | 63

00000015 | TEXT: BYTE 'Привет, мир!!!' | cff0e8e2e5f22c20ece8f0212121

00000023 | LEN: EQU * - TEXT |

00000023 | END |

Приложение 6

Пример исходного кода программы для УУМ-32

Программа проверки вывода многозначного положительного целого

crlf: macro

ld a, #13

wd #0

ld a, #10

wd #0

mend

test: start 0

+ld a, #123456789

call muldig

crlf

crlf

+ld a, #987654321

call muldig

ret

; Подпрограмма вывода многозначаного положительного целого числа

; Число следует предавать в регистре A

muldig: clear r0

ld r3, #-1

push r3 ; -1 - “граница” цифр в стеке

mov r2, a ; {R2} := {A}

loop: ld r3, #10 ; {R3} := #10

divr r2, r3 ; {R2} /= {R3}

mulr r3, r2 ; {R3} *= {R2}

subr a, r3 ; В {A} лежит очередная младшая цифра

add a, #48 ; В {A} лежит код этой цифры

push a ; затолкнули код этой цифры в стек

compr r2, r0 ; проверка {R2} на 0

jeq stPrn ; Можно переходить к выводу цифр

mov a, r2 ; {A} := {R2}

jmp loop ; переход к началу цикла

stPrn: ld r3, #-1 ; -1 => все цифры вытолкнуты из стека

nxtDig: pop a ; вытолкнули из стека код символа цифры

compr a, r3 ; проверили на -1

jeq return ; если совпало, выход

wd #0 ; вывод цифры

jmp nxtDig ; переход к выводу очередной цифры

return: ret ; возврат из подпрограммы

end

Приложение 7

Фрагмент исходного кода приложения «Интегрированная среда разработки для УУМ-32». Код класса главного окна.

using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Drawing;

using System.IO;

using System.Windows.Forms;

using System.Text.RegularExpressions;

using System.Xml;

using System.Xml.Linq;

namespace UUM32IDE

{

/// <summary>Представляет главное окно приложения</summary>

public partial class MainForm : Form

{

#region Внутренние структуры и классы

/// <summary>Содержит расширения различных типов файлов, используемых в среде</summary>

private static class FileExtentions

{

/// <summary>Расширение файла, содержащего код программы на Ассемблере для УУМ-32</summary>

public const string DefaultAsmExt = "uum32asm";

/// <summary>Расширение файла, содержащего код программы на Ассемблере для УУМ-32 с макросами</summary>

public const string DefaultMacroAsmExt = "uum32masm";

/// <summary>Расширение файла, содержащего библиотеку макросов Ассемблера для УУМ-32</summary>

public const string DefaultMacroLibExt = "uum32mlb";

/// <summary>Расширение объектного файла для компоновщика УУМ-32</summary>

public const string DefaultObjExt = "uum32obj";

/// <summary>Расширение исполнимого файла для УУМ-32</summary>

public const string DefaultUUMExt = "uum32";

}

/// <summary>Содержит имена узлов XML-файла настроек среды</summary>

private static class XmlNodeNames

{

public const string Root = "UUM32IDESettings";

public const string ExternalApplicationPaths = "ExternalApplicationPaths";

public const string App = "App";

public const string Styles = "Styles";

public const string Font = "Font";

public const string TextElementStyles = "TextElementStyles";

public const string StandartElementsStyles = "StandartElementsStyles";

public const string StandartStyle = "StandartStyle";

public const string Keywords = "Keywords";

public const string KeywordsStyles = "KeywordsStyles";

public const string KeywordStyle = "KeywordStyle";

public const string Indents = "Indents";

public const string LinesNumeration = "LinesNumeration";

}

/// <summary>Содержит имена атрибутов XML-файла настроек среды</summary>

private static class XmlAttributeNames

{

public const string Relative = "relative";

public const string Name = "name";

public const string Exe = "exe";

public const string Arguments = "arguments";

public const string Size = "size";

public const string CharSet = "charSet";

public const string BackgroundColor = "bgColor";

public const string Enabled = "enabled";

public const string ID = "id";

public const string Color = "color";

public const string Style = "style";

public const string FileName = "fileName";

public const string RunAsmBeforeShellStart = "runAsmBeforeShellStart";

public const string Command = "command";

}

/// <summary>Задает константы, определяющие виды настроек дочернего окна</summary>

private enum ChildSettingsTypes

{

/// <summary>Настройки шрифта и отступов</summary>

FontAndIndents,

/// <summary>Настройки нумерации</summary>

NumeratorColors

}

/// <summary>Представляет структуру, хранящую информацию о внешнем приложении</summary>

private struct ExternalApplicationInfo

{

/// <summary>Путь к исполнимому файлу внешнего приложения</summary>

public string ExeFileName;

/// <summary>Шаблон аргументов командной строки, передаваемой приложению при запуске</summary>

public string ArgumentsMask;

/// <summary>Инициализирует поля структуры заданными значениями</summary>

/// <param name="exeFileName">Путь к исполнимому файлу внешнего приложения</param>

/// <param name="argsMask">Шаблон аргументов командной строки, передаваемой приложению при запуске</param>

public ExternalApplicationInfo(string exeFileName, string argsMask) {

this.ExeFileName = exeFileName;

this.ArgumentsMask = argsMask;

}

}

/// <summary>Представляет структуру для хранения настроек стилей поля ввода дочернего окна</summary>

private struct ChildStyleSettings

{

/// <summary>Основной шрифт дочерних форм</summary>

public Font BaseFont;

/// <summary>Следует ли использовать стили при форматировании текста</summary>

public bool FontStylesEnabled;

/// <summary>Список стилей оформления стандартных элементов текста программы</summary>

public List<FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/> StandartElementsFontStyles;

/// <summary>Список стилей оформления различных ключевых слов ассемблера</summary>

public List<FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/> KeywordsFontStyles;

/// <summary>Цвет фона поля ввода дочернего окна</summary>

public Color BackgroundColor;

/// <summary>Надо ли посылать ассемблеру команду для формирования файлов ключевых слов</summary>

public bool RunAsmBeforeShellStart;

/// <summary>Строка, содержащая аргумент командной строки ассемблера, служащий для формирования файлов ключевых слов</summary>

public string AsmCommandlineArgument;

/// <summary>Имя файла, содержащего список ключевых слов ассемблера</summary>

public string KeywordsFileName;

}

/// <summary>Представляет структуру для хранения списка ключевых слов и информации о стиле оформления этих ключевых слов</summary>

public class KeywordListWithStyle // TODO: разобраться, почему класс, а не структура

{

/// <summary>Представляет структуру, хранящую ключевое слово и его описание</summary>

public class KeywordWithHint {

public string Keyword;

public string Hint;

public KeywordWithHint(string keyword, string hint) {

this.Keyword = keyword;

this.Hint = hint;

}

}

/// <summary>Список ключевых слов c описаниями</summary>

public List<KeywordWithHint> KeywordList;

/// <summary>Стиль, который будет применяться к ключевым словам списка</summary>

public FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/ Style;

/// <summary>Содержится ли в списке заданное ключевое слово</summary>

/// <param name="keyword">Искомое ключевое слово</param>

/// <returns>Boolean</returns>

public bool ContainsKeyword(string keyword) {

foreach (KeywordWithHint kh in this.KeywordList) {

if (kh.Keyword.Equals(keyword)) return true;

}

return false;

}

public KeywordWithHint GetKwWithHint(string keyword) {

foreach (KeywordWithHint kh in this.KeywordList) {

if (kh.Keyword.Equals(keyword)) return kh;

}

return null;

}

}

#endregion

#region Закрытые поля и свойства

/// <summary>Настройки стилей поля ввода дочернего окна</summary>

private ChildStyleSettings childStyleSettings;

/// <summary>Имя файла настроек среды</summary>

private const string settingsFileName = "IDESettings.xml";

/// <summary>Заголовок диалогового окна открытия файла с исходным кодом программы</summary>

private const string openAsmFileDialogTitle = "Открыть файл";

/// <summary>Фильтр диалогового окна открытия файла с исходным кодом программы</summary>

private static string asmFileFilter =

string.Format("Все поддерживаемые файлы|*.{0}; *.{1}; *.{2}", FileExtentions.DefaultMacroAsmExt, FileExtentions.DefaultAsmExt, FileExtentions.DefaultMacroLibExt)

+ "|Исходный код программы на Ассемблере для УУМ-32|*." + FileExtentions.DefaultAsmExt

+ "|Исходный код программы на Макроассемблере для УУМ-32|*." + FileExtentions.DefaultMacroAsmExt

+ "|Библиотека макросов Ассемблера для УУМ-32|*." + FileExtentions.DefaultMacroLibExt;

/// <summary>Определяет, используется ли относительная привязка внешних приложений</summary>

private bool allPathsAreRelative; // используются ли относительные пути (пути, рассчитываемые относительно исполнимого файла среды)

/// <summary>Коллекция настроек внешних приложений среды</summary>

private Dictionary<string, ExternalApplicationInfo> externalApplicationInfoCollection;

/// <summary>Массив размеров отступов в дочерних формах</summary>

private int[] indents;

/// <summary>Путь к исполнимому файлу среды</summary>

private string selfExeFile;

/// <summary>Рабочая папка среды</summary>

private string selfWorkDir;

/// <summary>Номер очередной открытой формы</summary>

private int curMdiNumber;

/// <summary>Число открытых документов</summary>

private int openedDocuments;

/// <summary>Массив имен файлов, которые надо открыть после загрузки</summary>

private string[] fileNamesToOpen;

private List<KeywordListWithStyle> allKeywords;

private MDIForm.NumerationSetting childNumerationSettings;

/// <summary>Задает или возвращает структуру, содержащую информацию о настройках нумерации строк текста программы</summary>

private MDIForm.NumerationSetting ChildNumerationSettings {

get {

return this.childNumerationSettings;

}

set {

this.childNumerationSettings = value;

applyChildrenSetting(ChildSettingsTypes.NumeratorColors);

}

}

/// <summary>Очередь, предназначенная для промежуточного хранения данных, выводимых внешними приложениями в стандартный поток вывода</summary>

private Queue<string> extAppsStdOutput;

/// <summary>Очередь, предназначенная для промежуточного хранения данных, выводимых внешними приложениями в стандартный поток ошибок</summary>

private Queue<string> extAppsStdError;

#endregion

/// <summary>Инициализирует новый экземпляр главного окна программы</summary>

/// <param name="fileNames">Список аргументов командной строки</param>

public MainForm(string[] fileNames) {

InitializeComponent();

this.Enabled = false;

LoadForm loadForm = new LoadForm();

loadForm.Show();

this.extAppsStdOutput = new Queue<string>();

this.extAppsStdError = new Queue<string>();

this.Width = Screen.PrimaryScreen.WorkingArea.Width * 3 / 4;

this.Height = Screen.PrimaryScreen.WorkingArea.Height * 3 / 4;

this.c_leftPanel.Width = this.ClientRectangle.Width / 7;

this.c_bottomPanel.Height = this.ClientRectangle.Height / 4;

this.MergeToolStripButtonAndToolStripMenuItem(this.compileStripButton, this.startCompilationToolStripMenuItem, this.startCompilationToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.runStripButton, this.compileAndRunToolStripMenuItem, this.compileAndRunToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.debugStripButton, this.debugToolStripMenuItem, this.debugToolStripMenuItem_Click);

his.MergeToolStripButtonAndToolStripMenuItem(this.newToolStripButton, this.newToolStripMenuItem, this.newToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.openToolStripButton, this.openToolStripMenuItem, this.openToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.saveToolStripButton, this.saveToolStripMenuItem, this.saveToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.cutToolStripButton, this.cutToolStripMenuItem, this.cutToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.copyToolStripButton, this.copyToolStripMenuItem, this.copyToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.pasteToolStripButton, this.pasteToolStripMenuItem, this.pasteToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.undoToolStripButton, this.undoToolStripMenuItem, this.undoToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.redoToolStripButton, this.redoToolStripMenuItem, this.redoToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.commentLinesToolStripButton, this.commentLinesToolStripMenuItem, this.commentLinesToolStripMenuItem_Click);

this.MergeToolStripButtonAndToolStripMenuItem(this.uncommentLinesToolStripButton, this.uncommentLinesToolStripMenuItem, this.uncommentLinesToolStripMenuItem_Click);

this.newToolStripButton.Text = "Новый файл... (" + this.newToolStripMenuItem.ShortcutKeyDisplayString + ")"; // в данном случае нужна более понятная подсказка

this.selfExeFile = Application.ExecutablePath;

this.selfWorkDir = Path.GetDirectoryName(this.selfExeFile);

this.LoadSettingsFromXML();

this.curMdiNumber = 1;

this.openedDocuments = 0;

this.СheckMenuItems();

this.fileNamesToOpen = fileNames;

this.c_tmrExtAppsStdOutputDequeuer.Enabled = true; // включаем таймер для опорожнения очереди потока вывода внешних приложений

loadForm.Close();

this.Enabled = true;

}

/// <summary>Связывает заданную кнопку панели инструментов с заданным пунктом меню.</summary>

/// <param name="button">Кнопка панели инструментов, которую следует привязать к заданному пункту меню</param>

/// <param name="menuItem">Пункт меню, к которому следует привязать заданную кнопку</param>

/// <param name="clickEventHandler">Обработчик события нажатия заданной кнопки</param>

private void MergeToolStripButtonAndToolStripMenuItem(ToolStripButton button, ToolStripMenuItem menuItem, EventHandler clickEventHandler) {

button.Image = menuItem.Image;

this.LinkMenuItemAndButtonText(menuItem, button);

button.Click += clickEventHandler;

}

/// <summary>Синхронизирует надпись на кнопке панели инструментов с названием пункта меню</summary>

/// <param name="menuItem">Пункт меню</param>

/// <param name="button">Кнопка панели инструментов</param>

private void LinkMenuItemAndButtonText(ToolStripMenuItem menuItem, ToolStripButton button) {

button.Text = menuItem.Text;

if (menuItem.ShortcutKeyDisplayString != null) {

button.Text += " (" + menuItem.ShortcutKeyDisplayString + ')';

}

}

private void MainForm_Load(object sender, EventArgs e) {

this.viewProjectExplorerToolStripMenuItem.CheckState = CheckState.Unchecked; // окошко менеджера проектов пока бесполезно

foreach (string fn in this.fileNamesToOpen) {

this.OpenFile(fn);

}

}

/// <summary>Возвращает список списков ключевых и подсказок слов со стилями</summary>

/// <param name="fileName">Путь к XML-файлу, содержащему список ключевых слов ассемблера и подсказок к ним</param>

/// <returns></returns>

private List<KeywordListWithStyle> GetListOfKeywordLists(string fileName) {

List<KeywordListWithStyle> result = new List<KeywordListWithStyle>();

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load(fileName);

XmlElement xmlRoot = xmlDoc.DocumentElement;

XmlNodeList keywordListNodes = xmlRoot.SelectNodes("Keywords");

foreach (XmlNode keywordListNode in keywordListNodes) {

string keywordListName = keywordListNode.Attributes["type"].Value;

// добавим корневой элемент в дерево ключевых слов

this.keywordsExplorer1.TreeNodes.Add(keywordListName, keywordListName);

TreeNode currentTreeNode = this.keywordsExplorer1.TreeNodes[keywordListName];

List<string> curTNNodes = new List<string>();

KeywordListWithStyle keywordListWithStyle = new KeywordListWithStyle();

XmlNodeList keywords = keywordListNode.SelectNodes("Keyword");

keywordListWithStyle.KeywordList = new List<KeywordListWithStyle.KeywordWithHint>(keywords.Count);

foreach (XmlNode keyword in keywords) {

string name = keyword.Attributes["name"].Value;

string hint = keyword.Attributes["hint"].Value;

keywordListWithStyle.KeywordList.Add(new KeywordListWithStyle.KeywordWithHint(name, hint));

// добавим элементы в список для дерева ключевых слов

curTNNodes.Add(name);

// добавим элементы в словарь для отображения подсказок

this.keywordsExplorer1.AddKeywordToTable(name, hint);

}

// добавим дочерние элементы в дерево ключевых слов

curTNNodes.Sort();

foreach (string treeNode in curTNNodes) {

currentTreeNode.Nodes.Add(treeNode, treeNode);

}

keywordListWithStyle.Style = new FontStyleSettingsForm.TextElementStyle(keywordListName);

result.Add(keywordListWithStyle);

}

return result;

}

/// <summary>Загружает настройки среды из XML-файла</summary>

private void LoadSettingsFromXML()

{

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load(this.selfWorkDir + '\\' + settingsFileName);

XmlElement xmlRoot = xmlDoc.DocumentElement;

XmlNode externalApplicationsPathsNode = xmlRoot.SelectSingleNode(XmlNodeNames.ExternalApplicationPaths); {

XmlAttribute relativePathsAttr = externalApplicationsPathsNode.Attributes[XmlAttributeNames.Relative];

this.allPathsAreRelative = bool.Parse(relativePathsAttr.Value);

string[] extAppNames = Enum.GetNames(typeof(ExternalApplications));

this.externalApplicationInfoCollection = new Dictionary<string, ExternalApplicationInfo>(extAppNames.Length);

//XmlNodeList appInfoNodes = externalApplicationsPathsNode.SelectNodes(XmlNodeNames.App);

foreach (string extAppName in extAppNames) {

string xpath = string.Format("{0}[@{1}='{2}']", XmlNodeNames.App, XmlAttributeNames.ID, extAppName);

XmlNode appInfoNode = externalApplicationsPathsNode.SelectSingleNode(xpath);

if (appInfoNode != null) {

XmlAttributeCollection attrs = appInfoNode.Attributes;

this.externalApplicationInfoCollection.Add(extAppName, new ExternalApplicationInfo(attrs[XmlAttributeNames.Exe].Value, attrs[XmlAttributeNames.Arguments].Value));

}

else throw new Exception(string.Format("В файле настроек нет информации о внешнем приложении {0}", extAppName));

}

}

XmlNode linesNumerationNode = xmlRoot.SelectSingleNode(XmlNodeNames.LinesNumeration); {

XmlAttributeCollection linesNumerationAttributes = linesNumerationNode.Attributes;

this.childNumerationSettings.NumerationEnabled = bool.Parse(linesNumerationAttributes[XmlAttributeNames.Enabled].Value);

this.childNumerationSettings.ForeColor = Color.FromArgb(Convert.ToInt32(linesNumerationAttributes[XmlAttributeNames.Color].Value, 16));

this.childNumerationSettings.BackColor = Color.FromArgb(Convert.ToInt32(linesNumerationAttributes[XmlAttributeNames.BackgroundColor].Value, 16));

}

XmlNode stylesNode = xmlRoot.SelectSingleNode(XmlNodeNames.Styles); {

XmlNode fontNode = stylesNode.SelectSingleNode(XmlNodeNames.Font); {

XmlAttributeCollection fontAttributes = fontNode.Attributes;

string fontName = fontAttributes[XmlAttributeNames.Name].Value;

float fontSize = float.Parse(fontAttributes[XmlAttributeNames.Size].Value);

byte fontCharSet = byte.Parse(fontAttributes[XmlAttributeNames.CharSet].Value);

this.childStyleSettings.BaseFont = new Font(fontName, fontSize, FontStyle.Regular, GraphicsUnit.Point, fontCharSet);

this.childStyleSettings.BackgroundColor = Color.FromArgb(Convert.ToInt32(fontAttributes[XmlAttributeNames.BackgroundColor].Value, 16));

}

XmlNode textElementStylesNode = stylesNode.SelectSingleNode(XmlNodeNames.TextElementStyles); {

XmlAttribute stylesEnabled = textElementStylesNode.Attributes[XmlAttributeNames.Enabled];

this.childStyleSettings.FontStylesEnabled = bool.Parse(stylesEnabled.Value);

XmlNode standartElementsStylesNode = textElementStylesNode.SelectSingleNode(XmlNodeNames.StandartElementsStyles); {

string[] stdTextElNames = Enum.GetNames(typeof(FontStyleSettingsForm.StandartTextElements));

this.childStyleSettings.StandartElementsFontStyles = new List<FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/>(FontStyleSettingsForm.GetStandartTextElementsQty());

foreach (string stdTextElName in stdTextElNames) {

string xpath = string.Format("{0}[@{1}='{2}']", XmlNodeNames.StandartStyle, XmlAttributeNames.ID, stdTextElName);

XmlNode standartStyleNode = standartElementsStylesNode.SelectSingleNode(xpath);

if (standartStyleNode != null) {

XmlAttributeCollection attrs = standartStyleNode.Attributes;

this.childStyleSettings.StandartElementsFontStyles.Add(new FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/(

attrs[XmlAttributeNames.Name].Value,

new Font(this.childStyleSettings.BaseFont, (FontStyle)byte.Parse(attrs[XmlAttributeNames.Style].Value)),

Color.FromArgb(Convert.ToInt32(attrs[XmlAttributeNames.Color].Value, 16))));

}

else throw new Exception(string.Format("В файле настроек нет информации о стандартном стиле оформления для {0}", stdTextElName));

}

}

XmlNode keywordsNode = textElementStylesNode.SelectSingleNode(XmlNodeNames.Keywords); {

XmlAttributeCollection keywordsAttributes = keywordsNode.Attributes;

this.childStyleSettings.KeywordsFileName = keywordsAttributes[XmlAttributeNames.FileName].Value;

this.childStyleSettings.RunAsmBeforeShellStart = bool.Parse(keywordsAttributes[XmlAttributeNames.RunAsmBeforeShellStart].Value);

this.childStyleSettings.AsmCommandlineArgument = keywordsAttributes[XmlAttributeNames.Command].Value;

if (this.childStyleSettings.RunAsmBeforeShellStart) { // при необходимости вызовем ассемблер для обновления файла ключевых слов

if (this.RunExternalApplication(ExternalApplications.Compiler, this.childStyleSettings.AsmCommandlineArgument) != 0) {

throw new Exception("Возникла ошибка при получении файла ключевых слов");

}

}

this.allKeywords = GetListOfKeywordLists(GetAbsolutePathFromCurrent(this.childStyleSettings.KeywordsFileName)); // получим список списков ключевых слов со стилями по умолчанию

}

XmlNode keywordsStylesNode = textElementStylesNode.SelectSingleNode(XmlNodeNames.KeywordsStyles); {

this.childStyleSettings.KeywordsFontStyles = new List<FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/>();

XmlNodeList keywordStyleNodes = keywordsStylesNode.SelectNodes(XmlNodeNames.KeywordStyle);

foreach (XmlNode keywordStyleNode in keywordStyleNodes) {

XmlAttributeCollection keywordStyleAttributes = keywordStyleNode.Attributes;

this.childStyleSettings.KeywordsFontStyles.Add(new FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/(

keywordStyleAttributes[XmlAttributeNames.Name].Value,

new Font(this.childStyleSettings.BaseFont, (FontStyle)byte.Parse(keywordStyleAttributes[XmlAttributeNames.Style].Value)),

Color.FromArgb(Convert.ToInt32(keywordStyleAttributes[XmlAttributeNames.Color].Value, 16))));

}

// свяжем списки ключевых слов со стилями

foreach (KeywordListWithStyle keywordListWithStyle in this.allKeywords) {

FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/ necessaryStyle = null;

foreach (FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/ keywordFontStyle in this.childStyleSettings.KeywordsFontStyles) {

if (keywordListWithStyle.Style.TextElementName == keywordFontStyle.TextElementName) {

necessaryStyle = keywordFontStyle;

break;

}

}

if (necessaryStyle != null) {

keywordListWithStyle.Style = necessaryStyle;

}

else {

throw new Exception(string.Format("В файле настроек отстутствует информация о стиле оформления для ключевых слов группы \"{0}\"", keywordListWithStyle.Style.TextElementName));

}

}

}

}

XmlNode indentsNode = stylesNode.SelectSingleNode(XmlNodeNames.Indents); {

string[] strIndents = indentsNode.InnerText.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

if (strIndents.Length > 0) {

this.indents = new int[strIndents.Length];

int i = 0;

foreach (string strIndent in strIndents) {

this.indents[i++] = int.Parse(strIndent);

}

}

else {

this.indents = null;

}

}

}

}

/// <summary>Сохраняет настройки среды в XML-файл</summary>

private void SaveSettingsToXML() {

XmlWriterSettings xmlSettings = new XmlWriterSettings(); // TODO: создать этот экземпляр в конструкторе, чтобы не создавать миллион раз при каждом сохранении

xmlSettings.Indent = true;

xmlSettings.IndentChars = "\t";

xmlSettings.NewLineChars = "\n";

XmlWriter writer = XmlWriter.Create(this.selfWorkDir + '\\' + settingsFileName, xmlSettings);

writer.WriteStartElement(XmlNodeNames.Root);

{

writer.WriteStartElement(XmlNodeNames.ExternalApplicationPaths);

{

writer.WriteAttributeString(XmlAttributeNames.Relative, this.allPathsAreRelative.ToString());

foreach (string extAppKey in this.externalApplicationInfoCollection.Keys) {

writer.WriteStartElement(XmlNodeNames.App);

{

writer.WriteAttributeString(XmlAttributeNames.ID, extAppKey);

writer.WriteAttributeString(XmlAttributeNames.Exe, this.externalApplicationInfoCollection[extAppKey].ExeFileName);

writer.WriteAttributeString(XmlAttributeNames.Arguments, this.externalApplicationInfoCollection[extAppKey].ArgumentsMask);

}

writer.WriteEndElement();

}

}

writer.WriteEndElement();

writer.WriteStartElement(XmlNodeNames.LinesNumeration);

{

writer.WriteAttributeString(XmlAttributeNames.Enabled, this.childNumerationSettings.NumerationEnabled.ToString());

writer.WriteAttributeString(XmlAttributeNames.Color, this.childNumerationSettings.ForeColor.ToArgb().ToString("X"));

writer.WriteAttributeString(XmlAttributeNames.BackgroundColor, this.childNumerationSettings.BackColor.ToArgb().ToString("X"));

}

writer.WriteEndElement();

writer.WriteStartElement(XmlNodeNames.Styles);

{

writer.WriteStartElement(XmlNodeNames.Font);

{

writer.WriteAttributeString(XmlAttributeNames.Name, this.childStyleSettings.BaseFont.Name);

writer.WriteAttributeString(XmlAttributeNames.Size, this.childStyleSettings.BaseFont.Size.ToString());

writer.WriteAttributeString(XmlAttributeNames.CharSet, this.childStyleSettings.BaseFont.GdiCharSet.ToString());

writer.WriteAttributeString(XmlAttributeNames.BackgroundColor, this.childStyleSettings.BackgroundColor.ToArgb().ToString("X"));

}

writer.WriteEndElement();

writer.WriteStartElement(XmlNodeNames.TextElementStyles);

{

writer.WriteAttributeString(XmlAttributeNames.Enabled, this.childStyleSettings.FontStylesEnabled.ToString());

writer.WriteStartElement(XmlNodeNames.StandartElementsStyles);

{

int i = 0;

foreach (FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/ standartStyle in this.childStyleSettings.StandartElementsFontStyles) {

writer.WriteStartElement(XmlNodeNames.StandartStyle);

{

writer.WriteAttributeString(XmlAttributeNames.ID, Enum.GetName(typeof(FontStyleSettingsForm.StandartTextElements), (FontStyleSettingsForm.StandartTextElements)i++));

writer.WriteAttributeString(XmlAttributeNames.Name, standartStyle.TextElementName);

writer.WriteAttributeString(XmlAttributeNames.Color, standartStyle.Color.ToArgb().ToString("X"));

writer.WriteAttributeString(XmlAttributeNames.Style, ((byte)standartStyle.Font.Style).ToString());

}

writer.WriteEndElement();

}

}

writer.WriteEndElement();

writer.WriteStartElement(XmlNodeNames.Keywords);

{

writer.WriteAttributeString(XmlAttributeNames.FileName, this.childStyleSettings.KeywordsFileName);

writer.WriteAttributeString(XmlAttributeNames.RunAsmBeforeShellStart, this.childStyleSettings.RunAsmBeforeShellStart.ToString());

writer.WriteAttributeString(XmlAttributeNames.Command, this.childStyleSettings.AsmCommandlineArgument);

}

writer.WriteEndElement();

writer.WriteStartElement(XmlNodeNames.KeywordsStyles);

{

foreach (FontStyleSettingsForm.TextElementStyle/*RichFontStyle*/ keywordStyle in this.childStyleSettings.KeywordsFontStyles) {

writer.WriteStartElement(XmlNodeNames.KeywordStyle);

{

writer.WriteAttributeString(XmlAttributeNames.Name, keywordStyle.TextElementName);

writer.WriteAttributeString(XmlAttributeNames.Color, keywordStyle.Color.ToArgb().ToString("X"));

writer.WriteAttributeString(XmlAttributeNames.Style, ((byte)keywordStyle.Font.Style).ToString());

}

writer.WriteEndElement();

}

}

writer.WriteEndElement();

}

writer.WriteEndElement();

writer.WriteStartElement(XmlNodeNames.Indents);

{

string strIndents = string.Empty;

if (this.indents != null) {

foreach (int indent in this.indents) {

strIndents += indent.ToString() + ' ';

}

strIndents = strIndents.Substring(0, strIndents.Length - 1); // убрали пробел в конце

}

writer.WriteValue(strIndents);

}

writer.WriteEndElement();

}

writer.WriteEndElement();

}

writer.WriteEndElement();

writer.Flush();

writer.Close();

}

//------------------------------------------------------------------------

/// <summary>Создает новую дочернюю форму и открывает в ней заданный файл</summary>

/// <param name="fileName">Имя файла, который требуется открыть</param>

private MDIForm OpenFile(string fileName) {

foreach (MDIForm mdiChild in this.MdiChildren) {

if (mdiChild.AssociatedFileName.Equals(fileName, StringComparison.OrdinalIgnoreCase)) { // если запрашивамый файл уже открыт в среде

mdiChild.Focus();

return mdiChild;

}

}

MDIForm mdi = this.CreateNewChild(null, fileName); // когда открываем существующий файл, расширение передавать не надо

mdi.OpenFile();

return mdi;

}

/// <summary>Создает новое окно редактора текста программы с заданным привязанным файлом</summary>

/// <param name="fileName">Имя привязываемого файла</param>

/// <returns>Возвращает ссылку на созданную форму</returns>

private MDIForm CreateNewChild(string ext, string fileName = null) {

string text;

if (fileName != null) {

text = Path.GetFileName(fileName);

}

else {

text = string.Format("noname{0}.{1}", curMdiNumber++.ToString("00"), /*FileExtentions.DefaultAsmExt*/ext);

//"noname" + curMdiNumber++.ToString("00") + "." + defaultAsmExt;

}

MDIForm mdiChild = new MDIForm(text, fileName);

mdiChild.FileDragDrop += new DragEventHandler(this.MainForm_DragDrop); // TODO: осторожно!

mdiChild.FormClosing += (object sender, FormClosingEventArgs e) => {

MDIForm mdiSender = (MDIForm)sender;

if (mdiSender.IsChanged) {

DialogResult res = MessageBox.Show(string.Format("Файл {0} был изменен. Сохранить изменения?", mdiSender.Text.Substring(0, mdiSender.Text.Length - 1)), "Выход", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

switch (res) {

case System.Windows.Forms.DialogResult.Cancel:

e.Cancel = true;

break;

case System.Windows.Forms.DialogResult.Yes:

this.saveToolStripMenuItem_Click(this, new EventArgs());

break;

}

}

};

mdiChild.FormClosed +=

(object sender, FormClosedEventArgs e) => {

this.openedDocuments--;

this.СheckMenuItems(); //TODO: разобраться, почему не гасит значки, если форму закрыть иксом

this.c_txtOutput.Clear();

this.errorsDataGridView.Rows.Clear();

};

mdiChild.Activated +=

(object sender, EventArgs e) => {

string programName = ((MDIForm)sender).ProgramName;

this.saveToolStripMenuItem.Text = string.Format("Сохранить {0}", programName);

this.saveAsToolStripMenuItem.Text = string.Format("Сохранить {0} как...", programName);

this.closeToolStripMenuItem.Text = string.Format("Закрыть {0}", programName);

this.currentFileNameToolStripStatusLabel.Text = string.Format("Редактирование файла {0}", programName);

};

mdiChild.Deactivate +=

(object sender, EventArgs e) => {

this.saveToolStripMenuItem.Text = "Сохранить";

this.saveAsToolStripMenuItem.Text = "Сохранить как...";

this.closeToolStripMenuItem.Text = "Закрыть";

this.currentFileNameToolStripStatusLabel.Text = "Нет открытых файлов";

};

mdiChild.MdiParent = this;

mdiChild.StandartElementFontStyles = this.childStyleSettings.StandartElementsFontStyles;

mdiChild.AllKeywords = this.allKeywords;

mdiChild.Show();

this.openedDocuments++;

this.applyChildSettings(mdiChild);

this.СheckMenuItems();

return mdiChild;

}

private ProjectExplorer CreateNewProjectWindow(string fileName) {

ProjectExplorer prjExplorer = new ProjectExplorer(fileName);

prjExplorer.TopLevel = false;

this.c_leftPanel.Controls.Add(prjExplorer);

prjExplorer.Show();

prjExplorer.Location = new Point(0, 0);

return prjExplorer;

}

#region Обработчики событий выбора пунктов меню Файл

private void newToolStripMenuItem_Click(object sender, EventArgs e) {

NewFileTypeSelector fileTypeSelector = new NewFileTypeSelector("newfile");

if (fileTypeSelector.ShowDialog() == System.Windows.Forms.DialogResult.OK) {

switch (fileTypeSelector.FileType) {

case NewFileTypeSelector.FileTypes.AsmFile:

his.CreateNewChild(FileExtentions.DefaultAsmExt/*fileTypeSelector.FileName*/);

break;

case NewFileTypeSelector.FileTypes.MacroAsmFile:

this.CreateNewChild(FileExtentions.DefaultMacroAsmExt);

break;

case NewFileTypeSelector.FileTypes.MacroLib:

this.CreateNewChild(FileExtentions.DefaultMacroLibExt);

break;

default:

break;

}

}

}

private void newProjectToolStripMenuItem_Click(object sender, EventArgs e) {

MessageBox.Show("Поддержка проектов еще не реализована");

}

private void openToolStripMenuItem_Click(object sender, EventArgs e) {

openFileDialog.Title = openAsmFileDialogTitle;

openFileDialog.Filter = asmFileFilter;

openFileDialog.Multiselect = true;

if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {

foreach (string fName in openFileDialog.FileNames) {

this.OpenFile(fName);

}

}

}

private void saveToolStripMenuItem_Click(object sender, EventArgs e) // TODO: проверить сохранение в файл, уже открытый в оболочке

{

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild != null) {

if (activeChild.AssociatedFileName != null) {

activeChild.SaveFile();

}

else {

saveAsToolStripMenuItem_Click(sender, e);

}

}

}

private void saveToolStripMenuItem_TextChanged(object sender, EventArgs e) {

this.LinkMenuItemAndButtonText(this.saveToolStripMenuItem, this.saveToolStripButton);

}

private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) {

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild != null) {

if (activeChild.AssociatedFileName != null) {

saveFileDialog.FileName = activeChild.AssociatedFileName;

}

else {

saveFileDialog.FileName = activeChild.ProgramName;

}

saveFileDialog.Filter = asmFileFilter;

if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {

activeChild.AssociatedFileName = saveFileDialog.FileName;

saveToolStripMenuItem_Click(sender, e);

}

else {

return;

}

}

}

private void closeToolStripMenuItem_Click(object sender, EventArgs e) { // TODO: изменять Enabled'ы меню

Form activeChild = this.ActiveMdiChild;

if (activeChild != null) {

activeChild.Close();

this.СheckMenuItems();

}

}

private void exitToolStripMenuItem_Click(object sender, EventArgs e) {

this.Close();

}

#endregion

#region Обработчики событий выбора пунктов меню Окно

/// <summary>Располагает дочерние окна каскадом</summary>

private void cascadeToolStripMenuItem_Click(object sender, EventArgs e)

{

this.LayoutMdi(MdiLayout.Cascade);

}

/// <summary>Располагает дочерние окна по горизонтали</summary>

private void horizontalTitleToolStripMenuItem_Click(object sender, EventArgs e)

{

this.LayoutMdi(MdiLayout.TileHorizontal);

}

/// <summary>Располагает дочерние окна по вертикали</summary>

private void verticalTitleToolStripMenuItem_Click(object sender, EventArgs e)

{

this.LayoutMdi(MdiLayout.TileVertical);

}

#endregion

#region Обработчики событий выбора пунктов меню Правка

private void copyToolStripMenuItem_Click(object sender, EventArgs e)

{

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild != null) activeChild.CopyText();

}

private void cutToolStripMenuItem_Click(object sender, EventArgs e)

{

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild != null) activeChild.CutText();

}

private void pasteToolStripMenuItem_Click(object sender, EventArgs e)

{

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild != null) activeChild.PasteText();

}

private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)

{

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild != null) activeChild.SelectAllText();

}

private void undoToolStripMenuItem_Click(object sender, EventArgs e)

{

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild != null) activeChild.UndoAction();

}

private void redoToolStripMenuItem_Click(object sender, EventArgs e)

{

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild != null) activeChild.RedoAction();

}

private void commentLinesToolStripMenuItem_Click(object sender, EventArgs e)

{

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild != null) activeChild.CommentSelectedLines();

}

private void uncommentLinesToolStripMenuItem_Click(object sender, EventArgs e)

{

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild != null) activeChild.UncommentSelectedLines();

}

#endregion

#region Обработчики событий выбора пунктов меню Вид

private void viewProjectExplorerToolStripMenuItem_CheckStateChanged(object sender, EventArgs e) {

if (this.viewProjectExplorerToolStripMenuItem.Checked) {

ShowPanel(this.c_leftPanel);

}

else {

HidePanel(this.c_leftPanel);

}

}

private void viewOutputToolStripMenuItem_CheckStateChanged(object sender, EventArgs e) {

if (this.viewOutputToolStripMenuItem.Checked) {

ShowPanel(this.c_bottomPanel);

}

else {

HidePanel(this.c_bottomPanel);

}

}

private void viewMainToolStripToolStripMenuItem_CheckStateChanged(object sender, EventArgs e) {

if (this.viewMainToolStripToolStripMenuItem.Checked) {

this.mainToolStrip.Show();

}

else {

this.mainToolStrip.Hide();

}

}

private void viewStatusBarToolStripMenuItem_CheckStateChanged(object sender, EventArgs e) {

if (this.viewStatusBarToolStripMenuItem.Checked) {

this.statusStrip.Show();

}

else {

this.statusStrip.Hide();

}

}

private void viewKeywordExplorerToolStripMenuItem_CheckStateChanged(object sender, EventArgs e) {

if (this.viewKeywordExplorerToolStripMenuItem.Checked) {

ShowPanel(this.c_rightPanel);

}

else {

HidePanel(this.c_rightPanel);

}

}

#endregion

//-----------------------------------------------------------------------------------------------

private void columnWidthsToolStripMenuItem_Click(object sender, EventArgs e) {

ColumnWidthSettingsForm widthEditor = new ColumnWidthSettingsForm(this.indents);

if (widthEditor.ShowDialog() == System.Windows.Forms.DialogResult.OK) {

this.indents = widthEditor.ColumnWidths;

//this.saveSettings();

//this.SaveSettingsToXML();

this.applyChildrenSettings();

}

widthEditor.Dispose();

}

//-----------------------------------------------------------------------------------------------

#region Методы обновления настроек дочерних форм

/// <summary>Обновляет настройки полей ввода всех дочерних форм</summary>

private void applyChildrenSettings() {

//this.saveSettings(/*this.selfWorkDir + '\\' + settingsFileName*/);

this.SaveSettingsToXML();

foreach (MDIForm mdiChild in this.MdiChildren) {

this.applyChildSettings(mdiChild);

}

}

/// <summary>Обновляет настройки полей ввода конкретной дочерней формы</summary>

/// <param name="mdiChild">Ссылка на дочернюю форму, настройки которой следует обновить</param>

private void applyChildSettings(MDIForm mdiChild)

{

int fontSize = (int)this.childStyleSettings.BaseFont.Size/*InPoints*/;

mdiChild.TextFont = this.childStyleSettings.BaseFont;

if (this.indents != null) {

int[] indentsInPoints = new int[/*3*/this.indents.Length];

indentsInPoints[0] = this.indents[0] * fontSize;

for (int i = 1; i < this.indents.Length; i++) {

indentsInPoints[i] = this.indents[i] * fontSize + indentsInPoints[i - 1];

}

mdiChild.Indents = indentsInPoints;

}

else {

mdiChild.Indents = new int[0];

}

mdiChild.StandartElementFontStyles = this.childStyleSettings.StandartElementsFontStyles;

mdiChild.AllKeywords = this.allKeywords;

this.applyChildSetting(ChildSettingsTypes.NumeratorColors, mdiChild);

}

private void applyChildrenSetting(ChildSettingsTypes settingType) {

this.SaveSettingsToXML();

foreach (MDIForm mdiChild in this.MdiChildren) {

this.applyChildSetting(settingType, mdiChild);

}

}

private void applyChildSetting(ChildSettingsTypes settingType, MDIForm mdiChild) {

switch (settingType) {

case ChildSettingsTypes.NumeratorColors:

mdiChild.Numerator = this.ChildNumerationSettings;

break;

}

}

#endregion

#region Методы, предназначенные для запуска внешних приложений

/// <summary>Запускает внешнее приложение с заданными аргументами командной строки и при необходимости перенаправляет его поток вывода внутрь оболочки</summary>

/// <param name="app">Тип внешенго приложения</param>

/// <param name="arguments">Строка, содержащая аргументы командной строки</param>

/// <param name="redirectStdOutErr">Параметр, определяющий, следует ли перенаправлять стандартный вывод приложения внутрь оболочки</param>

/// <returns>Возвращает код завершения программы</returns>

private int RunExternalApplication(ExternalApplications app, string arguments, bool redirectStdOutErr = false) {

string extAppKey = Enum.GetName(typeof(ExternalApplications), app);

string processExe = this.GetAbsolutePathFromCurrent(this.externalApplicationInfoCollection[extAppKey].ExeFileName);

ProcessManager pMan = new ProcessManager(this.Location, extAppKey, processExe, arguments, redirectStdOutErr);

if (redirectStdOutErr) {

pMan.OutputDataReceived +=

(sender, e) => this.extAppsStdOutput.Enqueue(e.Data); // не выводим сразу в c_txtOutput, т.к. это происходит медленно => некоторые данные не успевают выводиться

// TODO: OUT_1 это первый вариант отслеживания вывода приложения в совокупности со строкой с комментарием OUT_2. Плюсы: отображает информацию по мере поступления. Минусы: отображает не всю информацию (если ее слишком много)

// TODO: возможно, отказаться от всей этой байды с событиями и просто по завершении работы приложения брать весь его вывод в одну строку и возвращать ее (см. второй вариант). Есть мысль перенаправлять вывод только от ассемблера, а там точно не будет так уж много строк. Надо подумать.

pMan.ErrorDataReceived +=

(sender, e) => this.extAppsStdError.Enqueue(e.Data);

}

DialogResult res = pMan.ShowDialog();

this.Focus();

if (redirectStdOutErr) {

this.extAppsStdOutput.Enqueue(new string('-', 25) + "\r\n"); // OUT_2 просто ставим разделитель

}

int exitCode = pMan.ProcessExitCode;

pMan.Dispose();

return exitCode;

}

/// <summary>Возвращает новый System.Diagnostics.Process, связанный с заданной программой</summary>

/// <param name="fileName">Имя исполнимого файла программы</param>

/// <param name="args">Аргументы командной строки программы</param>

/// <returns>Ссылку на процесс</returns>

private System.Diagnostics.Process GetProcess(string fileName, string args) {

System.Diagnostics.Process process = new System.Diagnostics.Process();

if (this.allPathsAreRelative) fileName = Path.GetFullPath(this.selfWorkDir + fileName); // GetFullPath() нужен, чтобы внутри пути не было кучи переходов вверх по дереву (записей "\.."). Программа работает и без GetFullPath(), но путь получается слишком длинным, да и непроизводительно бежать сначала вверх по папкам, а потом вниз - легче идти по конкретному пути

process.StartInfo.FileName = fileName;

process.StartInfo.WorkingDirectory = Path.GetDirectoryName(fileName);

process.StartInfo.Arguments = args;

return process;

}

#endregion

/// <summary>Делает различные пункты меню доступными и недоступными в зависимости от текущего состояния среды</summary>

private void СheckMenuItems() {

this.saveToolStripMenuItem.Enabled =

this.saveAsToolStripMenuItem.Enabled =

this.closeToolStripMenuItem.Enabled =

this.compileAndRunToolStripMenuItem.Enabled =

this.debugToolStripMenuItem.Enabled =

this.startCompilationToolStripMenuItem.Enabled =

this.copyToolStripMenuItem.Enabled =

this.cutToolStripMenuItem.Enabled =

this.pasteToolStripMenuItem.Enabled =

this.selectAllToolStripMenuItem.Enabled =

this.commentLinesToolStripMenuItem.Enabled =

this.uncommentLinesToolStripMenuItem.Enabled =

this.openedDocuments > 0;

this.newToolStripButton.Enabled = this.newToolStripMenuItem.Enabled;

this.openToolStripButton.Enabled = this.openToolStripMenuItem.Enabled;

this.saveToolStripButton.Enabled = this.saveToolStripMenuItem.Enabled;

this.compileStripButton.Enabled = this.startCompilationToolStripMenuItem.Enabled;

this.debugStripButton.Enabled = this.debugToolStripMenuItem.Enabled;

this.runStripButton.Enabled = this.compileAndRunToolStripMenuItem.Enabled;

this.cutToolStripButton.Enabled = this.cutToolStripMenuItem.Enabled;

this.copyToolStripButton.Enabled = this.copyToolStripMenuItem.Enabled;

this.pasteToolStripButton.Enabled = this.pasteToolStripMenuItem.Enabled;

this.undoToolStripButton.Enabled = this.undoToolStripMenuItem.Enabled;

this.redoToolStripButton.Enabled = this.redoToolStripMenuItem.Enabled;

this.commentLinesToolStripButton.Enabled = this.commentLinesToolStripMenuItem.Enabled;

this.uncommentLinesToolStripButton.Enabled = this.uncommentLinesToolStripMenuItem.Enabled;

}

/// <summary>Отображает заданную панель элементов управления</summary>

/// <param name="panel">Панель, которую следует отобразить</param>

private void ShowPanel(Panel panel) {

panel.Show();

foreach (Control control in panel.Controls) {

control.Show();

}

}

/// <summary>Скрывает заданную панель элементов управления</summary>

/// <param name="panel">Панель, которую следует скрыть</param>

private void HidePanel(Panel panel) {

foreach (Control control in panel.Controls) {

control.Show(); //TODO: может, все-таки, Hide()?

}

panel.Hide();

}

/// <summary>На основании текущей настройки типа путей среды возвращает относительный или абсолютный путь, полученный из заданного абсолютного</summary>

/// <param name="path">Абсолютный путь</param>

private string GetCurrentPathFromAbsolute(string path) {

return

(this.allPathsAreRelative)?

PathFinder.GetRelativePath(this.selfExeFile, path) :

path;

}

/// <summary>Возвращает абсолютный путь, полученный из заданного пути текущего типа (относительного либо абсолютного)</summary>

/// <param name="path">Относительный либо абсолютный путь</param>

private string GetAbsolutePathFromCurrent(string path) {

return PathFinder.GetAbsolutePath(this.selfExeFile, path);

}

private int StartCompilation() {

MDIForm activeChild = (MDIForm)this.ActiveMdiChild;

if (activeChild == null) {

throw new Exception("Невозможно вызвать компилятор, так как ни одно окно не активно");


Подобные документы

  • Цели универсальной системы хранения данных о производственном изделии. Описание предметной области программы и технические требования к ней. Стадии и этапы разработки, методика испытаний. Работа с главным меню и справочниками, руководство оператора.

    дипломная работа [4,6 M], добавлен 27.08.2012

  • Java Runtime Environment - минимальная реализация виртуальной машины, необходимая для исполнения приложений, без компилятора и других средств разработки. Компиляция исходного кода через командную строку. Основные моменты создания игрового 2d-приложения.

    курсовая работа [2,1 M], добавлен 26.04.2014

  • Определение этапов разработки программного обеспечения. Разработка модели представления данных и структуры интерфейса. Проектирование входных и выходных форм. Этапы программирование приложения. Проверка функциональности на контрольном примере.

    курсовая работа [1,2 M], добавлен 25.05.2009

  • Описание входных и выходных данных. Общая характеристика и требования к проектируемой программе, ее структуре и функциональным компонентам. Выбор и обоснование средств разработки, разработка интерфейса пользователя. Требования к программному обеспечению.

    курсовая работа [1,4 M], добавлен 12.05.2016

  • Проектирование программного модуля: сбор исходных материалов; описание входных и выходных данных; выбор программного обеспечения. Описание типов данных и реализация интерфейса программы. Тестирование программного модуля и разработка справочной системы.

    курсовая работа [81,7 K], добавлен 18.08.2014

  • Анализ технических средств и современных технологий разработки программного обеспечения. Разработка программы для упрощения поиска студентов. Создание учетных записей администратора и обычного пользователя. Изучение правил построения программного кода.

    курсовая работа [1,9 M], добавлен 30.09.2016

  • Разработка программы для изображения в графическом режиме на экране структуры модели вычислительной машины и демонстрация функционирования при выполнении программы вычисления. Описание процесса разработки, обоснование структур данных и их форматов.

    курсовая работа [170,3 K], добавлен 07.06.2019

  • Обоснование выбора метода проектирования и инструментальных средств для разработки программного средства и базы данных. Требования к эргономике и технической эстетике. Разработка алгоритмов приложения. Руководство пользователя. Безопасность труда.

    дипломная работа [2,9 M], добавлен 17.10.2014

  • Требования к пользовательскому интерфейсу программного продукта. Выбор инструментальных средств разработки программы. Описание функциональной схемы, модульной структуры, структурной схемы. Технология разработки справочной системы программного продукта.

    дипломная работа [2,7 M], добавлен 12.05.2016

  • Общая характеристика и описание математической модели. Выбор и обоснование среды программирования, анализ входных и выходных данных. Структурное проектирование приложений и интерфейса пользователя. Реализация и оценка защитного программирования.

    курсовая работа [564,9 K], добавлен 26.09.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.