pascalabcnet/VisualPascalABCNETLinux/Projects/ProjectTasks.cs
Александр Земляк b23f9c96d0
Деактивация кнопок, связанных с Intellisense, для языков без Intellisense + разделение ILanguageInformation на два интерфейса (#3378)
* Refactor language information classes

* Implement SimpleLanguageInformation abstract class

* Move some properties to SimpleLanguageInformation

* Implement format and debug buttons disabling if Intellisense is not supported for current language

* Add Intellisense available check in FormsExtensions to deactivate menu items if needed

* Change function interfaces in VisibilityService

* Replace CodeCompletionController.CurrentParser null checks with IntellisenseAvailable method call

* Refactor IParser and BaseParser to deduplicate code

* Fix BuildTreeInSpecialMode in SPythonParser

* Add SimpleParser class for new languages without Intellisense

* Delete duplicate SetDebugButtonsEnabled function

* Add Intellisense available check in RunService when attaching debugger

* Delete inner check in SetDebugButtonsEnabled to improve architecture

* Change CurrentParser property in CodeCompletion to be CurrentLanguage

* Divide ILanguageInformation into two interfaces (creating new ILanguageIntellisenseSupport)

* Fix LanguageIntellisenseSupport initialization in BaseLanguage

* Fix RunService fictive_attach logic

* Disable Intellisense parsing for languages without Intellisense support

* Add DefaultLanguageInformation abstract class

* Add default implementation for SetSemanticConstants in BaseLanguage

* Simplify IParser interface

* Update developer guide documentation
2026-01-27 22:25:28 +03:00

220 lines
9.3 KiB
C#

// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
//using ICSharpCode.FormsDesigner;
using PascalABCCompiler;
using PascalABCCompiler.Parsers;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace VisualPascalABC
{
public class ProjectTask
{
public static void AddReferencesToProject(ProjectExplorerForm ProjectExplorerWindow)
{
ReferenceForm.Instance.Clear();
ReferenceForm.Instance.LoadAssemblies();
if (ReferenceForm.Instance.ShowDialog() == DialogResult.OK)
{
if (ReferenceForm.Instance.AssemblyType == AssemblyType.GAC)
{
string[] assemblies = ReferenceForm.Instance.GetSelectedGACAssemblies();
foreach (string s in assemblies)
{
PascalABCCompiler.IReferenceInfo ri = ProjectFactory.Instance.AddReference(s);
ProjectExplorerWindow.AddReferenceNode(ri);
try
{
//ToolboxProvider.AddComponentsFromAssembly(PascalABCCompiler.NetHelper.NetHelper.LoadAssembly(Compiler.get_assembly_path(ri.FullAssemblyName, false)));
}
catch
{
}
}
}
else if (ReferenceForm.Instance.AssemblyType == AssemblyType.COM)
{
string[] assemblies = ReferenceForm.Instance.GetSelectedCOMObjects();
foreach (string s in assemblies)
{
PascalABCCompiler.IReferenceInfo ri = ProjectFactory.Instance.AddReference(s);
ProjectExplorerWindow.AddReferenceNode(ri);
}
}
else
{
string[] assemblies = ReferenceForm.Instance.GetSelectedFileAssemblies();
List<string> assm_lst = new List<string>();
foreach (string dll in assemblies)
{
if (string.Compare(dll, Path.Combine(ProjectFactory.Instance.ProjectDirectory, Path.GetFileName(dll)), true) != 0)
File.Copy(dll, Path.Combine(ProjectFactory.Instance.ProjectDirectory, Path.GetFileName(dll)), true);
string xml = Path.ChangeExtension(dll, ".xml");
if (File.Exists(xml))
{
if (string.Compare(xml, Path.Combine(ProjectFactory.Instance.ProjectDirectory, Path.GetFileName(xml)), true) != 0)
File.Copy(xml, Path.Combine(ProjectFactory.Instance.ProjectDirectory, Path.GetFileName(xml)), true);
}
//assm_lst.Add(Path.GetFileNameWithoutExtension(s));
//ProjectExplorerWindow.AddReferenceNode(Path.GetFileNameWithoutExtension(s));
try
{
PascalABCCompiler.NetHelper.NetHelper.LoadAssembly(dll);
}
catch
{
continue;
}
PascalABCCompiler.IReferenceInfo ri = ProjectFactory.Instance.AddReference(Path.GetFileNameWithoutExtension(dll));
ProjectExplorerWindow.AddReferenceNode(ri);
try
{
//ToolboxProvider.AddComponentsFromAssembly(PascalABCCompiler.NetHelper.NetHelper.LoadAssembly(Compiler.get_assembly_path(Path.Combine(ProjectFactory.Instance.ProjectDirectory, ri.FullAssemblyName), false)));
}
catch
{
}
}
//ProjectFactory.Instance.AddReferences(assm_lst.ToArray());
}
}
}
public static void NewFile(ProjectExplorerForm ProjectExplorerWindow)
{
NewFileForm frm = new NewFileForm();
Form1StringResources.SetTextForAllControls(frm);
frm.FileName = ProjectFactory.Instance.GetUnitFileName();
frm.SetUnitFilter();
if (frm.ShowDialog() == DialogResult.OK)
{
PascalABCCompiler.IFileInfo fi = ProjectFactory.Instance.AddSourceFile(frm.FileName);
ProjectExplorerWindow.AddSourceFile(fi,false);
string full_file_name = Path.Combine(Path.GetDirectoryName(ProjectFactory.Instance.CurrentProject.Path),frm.FileName);
StreamWriter sw = File.CreateText(full_file_name);
var languageIntellisenseSupport = Languages.Facade.LanguageProvider.Instance.SelectLanguageByExtension(frm.FileName).LanguageIntellisenseSupport;
if (frm.GetFileFilter() == FileType.Unit)
{
sw.Write(languageIntellisenseSupport.GetUnitTemplate(Path.GetFileNameWithoutExtension(frm.FileName)));
}
else
{
sw.WriteLine("namespace "+ProjectFactory.Instance.CurrentProject.Name+";");
sw.WriteLine();
sw.Write("end.");
ProjectFactory.Instance.AddNamespaceFileReference(full_file_name);
}
sw.Close();
WorkbenchServiceFactory.FileService.OpenFile(full_file_name, null);
}
}
public static void NewForm(ProjectExplorerForm ProjectExplorerWindow, bool prompt) //roman//
{
NewFileForm frm = new NewFileForm();
frm.SetWinFormsFilter();
Form1StringResources.SetTextForAllControls(frm);
frm.FileName = ProjectFactory.Instance.GetUnitFileName();
if (prompt && frm.ShowDialog() != DialogResult.OK) //roman//
return;
PascalABCCompiler.IFileInfo fi = ProjectFactory.Instance.AddSourceFile(frm.FileName);
string full_file_name = Path.Combine(Path.GetDirectoryName(ProjectFactory.Instance.CurrentProject.Path), frm.FileName);
StreamWriter sw = File.CreateText(full_file_name);
sw.Close();
WorkbenchServiceFactory.FileService.OpenFile(full_file_name, null);
VisualPABCSingleton.MainForm.CurrentCodeFileDocument.AddDesigner(null);
ProjectExplorerWindow.AddSourceFile(fi, true);
VisualPABCSingleton.MainForm.SaveFileAs(VisualPABCSingleton.MainForm.CurrentCodeFileDocument, full_file_name);
}
public static void ProjectProperties()
{
ProjectProperties pf = new ProjectProperties();
Form1StringResources.SetTextForAllControls(pf);
pf.LoadOptions(ProjectFactory.Instance.CurrentProject);
//pf.SetProperties();
if (pf.ShowDialog() == DialogResult.OK)
{
pf.SetOptions(ProjectFactory.Instance.CurrentProject);
ProjectFactory.Instance.Dirty = true;
}
}
public static void AddFile(ProjectExplorerForm ProjectExplorerWindow, string file_name)
{
PascalABCCompiler.IFileInfo fi = ProjectFactory.Instance.AddSourceFile(file_name);
ProjectExplorerWindow.AddSourceFile(fi,false);
}
private static OpenFileDialog open_dlg = null;
private static void openFileDialog_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
foreach (string FileName in open_dlg.FileNames)
{
if (Path.GetDirectoryName(FileName) != ProjectFactory.Instance.CurrentProject.ProjectDirectory)
{
File.Copy(FileName, Path.Combine(ProjectFactory.Instance.CurrentProject.ProjectDirectory, Path.GetFileName(FileName)), true);
AddFile(VisualPABCSingleton.MainForm.ProjectExplorerWindow, Path.GetFileName(FileName));
}
else
AddFile(VisualPABCSingleton.MainForm.ProjectExplorerWindow, Path.GetFileName(FileName));
}
}
public static void AddFile(ProjectExplorerForm ProjectExplorerWindow)
{
if (open_dlg == null)
{
open_dlg = new OpenFileDialog();
open_dlg.Multiselect = true;
open_dlg.FileOk += new System.ComponentModel.CancelEventHandler(openFileDialog_FileOk);
}
open_dlg.FileName = "";
open_dlg.InitialDirectory = ProjectFactory.Instance.ProjectDirectory;
open_dlg.Filter = VisualPABCSingleton.MainForm.VisualEnvironmentCompiler.GetFilterForDialogs();
open_dlg.ShowDialog();
}
public static void RemoveReference(PascalABCCompiler.IReferenceInfo ri)
{
ProjectFactory.Instance.RemoveReference(ri);
//ToolboxProvider.RemoveComponentsFromAssembly(GetReflectionAssembly(ri));
}
private static System.Reflection.Assembly GetReflectionAssembly(IReferenceInfo ri)
{
var path = Compiler.get_assembly_path(Path.Combine(ProjectFactory.Instance.ProjectDirectory, ri.FullAssemblyName), false);
if (path == null)
path = Compiler.get_assembly_path(ri.FullAssemblyName, false);
if (path != null)
return PascalABCCompiler.NetHelper.NetHelper.LoadAssembly(path);
return null;
}
public static void ExcludeFile(PascalABCCompiler.IFileInfo fi)
{
ProjectFactory.Instance.ExcludeFile(fi);
ProjectFactory.Instance.RemoveNamespaceFileReference(fi.Path);
}
private static TypeLibConverter type_conv = new TypeLibConverter();
public static string GenerateStubForCOM(string com_obj)
{
return TypeLibrary.GetManagedWrapperForCOM(com_obj);
}
}
}