diff --git a/External/Plugins/ProjectManager/Actions/ProjectActions.cs b/External/Plugins/ProjectManager/Actions/ProjectActions.cs index 1d8f771dc5..34594e96b3 100644 --- a/External/Plugins/ProjectManager/Actions/ProjectActions.cs +++ b/External/Plugins/ProjectManager/Actions/ProjectActions.cs @@ -18,6 +18,7 @@ using ProjectManager.Projects; using ProjectManager.Projects.AS3; using ProjectManager.Projects.Haxe; +using ProjectManager.Projects.Generic; namespace ProjectManager.Actions { @@ -96,6 +97,32 @@ public Project OpenProjectSilent(string path) } } + public Project OpenFolder() + { + using (VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog()) + { + if (dialog.ShowDialog(owner) == DialogResult.OK) + { + return OpenFolderSilent(dialog.SelectedPath); + } + } + return null; + } + + public Project OpenFolderSilent(string path) + { + String[] hxmlFiles = Directory.GetFiles(path, "*.hxml"); + if (hxmlFiles.Length > 0) + { + var project = new HaxeProject(path); + project.RawHXML = File.ReadAllLines(hxmlFiles[0]); + PatchProject(project); + PatchHxmlProject(project); + return project; + } + else return new GenericProject(path); + } + public string ImportProject() => ImportProject(null); internal string ImportProject(string importFrom) @@ -135,7 +162,6 @@ internal string ImportProject(string importFrom) PatchProject(imported); PatchFbProject(imported); imported.SaveAs(newPath); - return newPath; } ErrorManager.ShowInfo(TextHelper.GetString("Info.NotValidFlashBuilderProject")); diff --git a/External/Plugins/ProjectManager/Controls/FDMenus.cs b/External/Plugins/ProjectManager/Controls/FDMenus.cs index 2ee5f77cc6..c0bdcf8887 100644 --- a/External/Plugins/ProjectManager/Controls/FDMenus.cs +++ b/External/Plugins/ProjectManager/Controls/FDMenus.cs @@ -123,11 +123,12 @@ public bool DisabledForBuild public void SetProject(Project project) { + var enable = !project.IsFolderProject(); RecentProjects.AddOpenedProject(project.ProjectPath); - ConfigurationSelector.Enabled = true; - ProjectMenu.ProjectItemsEnabled = true; - TestMovie.Enabled = true; - BuildProject.Enabled = true; + ConfigurationSelector.Enabled = enable; + ProjectMenu.ProjectItemsEnabled = enable; + TestMovie.Enabled = enable; + BuildProject.Enabled = enable; ProjectChanged(project); } @@ -183,6 +184,7 @@ public class ProjectMenu : ToolStripMenuItem { public ToolStripMenuItem NewProject; public ToolStripMenuItem OpenProject; + public ToolStripMenuItem OpenFolder; public ToolStripMenuItem ImportProject; public ToolStripMenuItem CloseProject; public ToolStripMenuItem OpenResource; @@ -203,6 +205,9 @@ public ProjectMenu() PluginBase.MainForm.RegisterShortcutItem("ProjectMenu.NewProject", NewProject); //AllItems.Add(NewProject); + OpenFolder = new ToolStripMenuItem(TextHelper.GetString("Label.OpenFolder")); + PluginBase.MainForm.RegisterShortcutItem("ProjectMenu.OpenFolder", OpenFolder); + OpenProject = new ToolStripMenuItem(TextHelper.GetString("Label.OpenProject")); PluginBase.MainForm.RegisterShortcutItem("ProjectMenu.OpenProject", OpenProject); //AllItems.Add(OpenProject); @@ -250,6 +255,7 @@ public ProjectMenu() base.Text = TextHelper.GetString("Label.Project"); base.DropDownItems.Add(NewProject); base.DropDownItems.Add(OpenProject); + base.DropDownItems.Add(OpenFolder); base.DropDownItems.Add(ImportProject); base.DropDownItems.Add(CloseProject); base.DropDownItems.Add(new ToolStripSeparator()); diff --git a/External/Plugins/ProjectManager/Controls/RecentProjectsMenu.cs b/External/Plugins/ProjectManager/Controls/RecentProjectsMenu.cs index 41b6ac25a0..1bf27bc197 100644 --- a/External/Plugins/ProjectManager/Controls/RecentProjectsMenu.cs +++ b/External/Plugins/ProjectManager/Controls/RecentProjectsMenu.cs @@ -43,6 +43,7 @@ public RecentProjectsMenu() : base(TextHelper.GetString("Label.RecentProjects")) public void AddOpenedProject(string projectPath) { + if (!File.Exists(projectPath)) return; if (PluginMain.Settings.RecentProjects.Contains(projectPath)) { PluginMain.Settings.RecentProjects.Remove(projectPath); diff --git a/External/Plugins/ProjectManager/PluginMain.cs b/External/Plugins/ProjectManager/PluginMain.cs index 1790820109..837c3fed85 100644 --- a/External/Plugins/ProjectManager/PluginMain.cs +++ b/External/Plugins/ProjectManager/PluginMain.cs @@ -26,6 +26,7 @@ namespace ProjectManager public static class ProjectManagerCommands { public const string NewProject = "ProjectManager.NewProject"; + public const string OpenFolder = "ProjectManager.OpenFolder"; public const string OpenProject = "ProjectManager.OpenProject"; public const string SendProject = "ProjectManager.SendProject"; public const string BuildProject = "ProjectManager.BuildProject"; @@ -95,7 +96,7 @@ public class PluginMain : IPlugin const EventType eventMask = EventType.UIStarted | EventType.UIClosing | EventType.FileOpening | EventType.FileOpen | EventType.FileSave | EventType.FileSwitch | EventType.ProcessStart | EventType.ProcessEnd - | EventType.ProcessArgs | EventType.Command | EventType.Keys | EventType.ApplySettings; + | EventType.ProcessArgs | EventType.Command | EventType.Keys | EventType.ApplySettings | EventType.FolderOpen; #region Load/Save Settings @@ -202,6 +203,7 @@ public void Initialize() menus.ProjectMenu.NewProject.Click += delegate { NewProject(); }; menus.ProjectMenu.OpenProject.Click += delegate { OpenProject(); }; + menus.ProjectMenu.OpenFolder.Click += delegate { OpenFolder(); }; menus.ProjectMenu.ImportProject.Click += ImportProject; menus.ProjectMenu.CloseProject.Click += delegate { CloseProject(false); }; menus.ProjectMenu.OpenResource.Click += delegate { OpenResource(); }; @@ -228,6 +230,7 @@ public void Initialize() pluginUI = new PluginUI(this, menus, fileActions, projectActions); pluginUI.NewProject += delegate { NewProject(); }; + pluginUI.OpenFolder += delegate { OpenFolder(); }; pluginUI.OpenProject += delegate { OpenProject(); }; pluginUI.ImportProject += ImportProject; pluginUI.Rename += fileActions.Rename; @@ -403,6 +406,14 @@ public void HandleEvent(Object sender, NotifyEvent e, HandlingPriority priority) } break; + case EventType.FolderOpen: + if (Directory.Exists(te.Value)) + { + te.Handled = true; + OpenFolderSilent(te.Value); + } + break; + case EventType.FileOpening: // if this is a project file, we can handle it ourselves if (FileInspector.IsProject(te.Value) || ProjectCreator.IsKnownProject(Path.GetExtension(te.Value).ToLower())) @@ -458,6 +469,15 @@ public void HandleEvent(Object sender, NotifyEvent e, HandlingPriority priority) NewProject(); e.Handled = true; } + else if (de.Action == ProjectManagerCommands.OpenFolder) + { + if (de.Data != null && Directory.Exists((string)de.Data)) + { + OpenFolderSilent((string)de.Data); + } + else OpenFolder(); + e.Handled = true; + } else if (de.Action == ProjectManagerCommands.OpenProject) { if (de.Data != null && File.Exists((string)de.Data)) @@ -773,6 +793,11 @@ void OpenProjectProperties() Project project = activeProject; using (PropertiesDialog dialog = project.CreatePropertiesDialog()) { + if (dialog == null) + { + NewProject(); + return; + } project.UpdateVars(false); dialog.SetProject(project); dialog.OpenGlobalClasspaths += delegate { OpenGlobalClasspaths(); }; @@ -1001,6 +1026,11 @@ private bool DisabledForBuild public void UpdateUIStatus(ProjectManagerUIStatus status) { + if (activeProject != null && activeProject.IsFolderProject()) + { + status = ProjectManagerUIStatus.Disabled; + } + ToolStripMenuItem contextMenuItem = pluginUI.Menu.BuildProject; ToolStripMenuItem menuItem = menus.ProjectMenu.BuildProject; ToolStripButton menuButton = menus.BuildProject; @@ -1061,6 +1091,18 @@ private void OpenProject() if (project != null) SetProject(project); } + private void OpenFolder() + { + Project project = projectActions.OpenFolder(); + if (project != null) SetProject(project); + } + + private void OpenFolderSilent(string path) + { + Project project = projectActions.OpenFolderSilent(path); + if (project != null) SetProject(project); + } + private void ImportProject(object sender, EventArgs eventArgs) { string importFrom = null; diff --git a/External/Plugins/ProjectManager/PluginUI.cs b/External/Plugins/ProjectManager/PluginUI.cs index 1accf50e07..d267f799fa 100644 --- a/External/Plugins/ProjectManager/PluginUI.cs +++ b/External/Plugins/ProjectManager/PluginUI.cs @@ -25,6 +25,7 @@ public class PluginUI : DockPanelControl Boolean isEditingLabel; public event EventHandler NewProject; + public event EventHandler OpenFolder; public event EventHandler OpenProject; public event EventHandler ImportProject; public event RenameEventHandler Rename; @@ -71,7 +72,7 @@ public PluginUI(PluginMain plugin, FDMenus menus, FileActions fileActions, Proje help = new LinkLabel(); string[] helpParts = String.Format(TextHelper.GetString("Info.NoProjectsOpenLink"), "\n").Split('|'); - string[] helpActions = { "create", "open", "import|FlashBuilder", "import|hxml" }; + string[] helpActions = { "folder", "create", "open", "import|FlashBuilder", "import|hxml" }; var helpActionsLength = helpActions.Length; int[] linkStart = new int[helpActionsLength]; int[] linkLength = new int[helpActionsLength]; @@ -181,6 +182,7 @@ private void link_LinkClicked(Object sender, LinkLabelLinkClickedEventArgs e) string action = e.Link.LinkData as string; if (action == "create" && NewProject != null) NewProject(sender, e); else if (action == "open" && OpenProject != null) OpenProject(sender, e); + else if (action == "folder" && OpenFolder != null) OpenFolder(sender, e); else if (action != null && action.StartsWith("import|")) ImportProject?.Invoke(sender, e); } diff --git a/External/Plugins/ProjectManager/Projects/Haxe/HaxeProject.cs b/External/Plugins/ProjectManager/Projects/Haxe/HaxeProject.cs index 70e7851ce9..21352ffbf2 100644 --- a/External/Plugins/ProjectManager/Projects/Haxe/HaxeProject.cs +++ b/External/Plugins/ProjectManager/Projects/Haxe/HaxeProject.cs @@ -24,7 +24,7 @@ public class HaxeProject : Project public override string Language { get { return "haxe"; } } public override string LanguageDisplayName { get { return "Haxe"; } } public override bool IsCompilable { get { return true; } } - public override bool ReadOnly { get { return false; } } + public override bool ReadOnly { get { return IsFolderProject(); } } public override bool HasLibraries { get { return OutputType == OutputType.Application && IsFlashOutput; } } public override bool RequireLibrary { get { return IsFlashOutput; } } public override string DefaultSearchFilter { get { return "*.hx;*.hxp"; } } diff --git a/External/Plugins/ProjectManager/Projects/Project.cs b/External/Plugins/ProjectManager/Projects/Project.cs index 663e75ece7..aab7e1b469 100644 --- a/External/Plugins/ProjectManager/Projects/Project.cs +++ b/External/Plugins/ProjectManager/Projects/Project.cs @@ -59,6 +59,10 @@ public abstract class Project : IProject public Project(string path, CompilerOptions compilerOptions) { + if (IsDirectory(path)) + { + path = Path.Combine(path, "Project.folder"); + } this.path = path; this.compilerOptions = compilerOptions; @@ -78,8 +82,8 @@ public Project(string path, CompilerOptions compilerOptions) public abstract string Language { get; } public abstract string LanguageDisplayName { get; } + public virtual bool ReadOnly { get { return IsFolderProject(); } } public virtual bool IsCompilable { get { return false; } } - public virtual bool ReadOnly { get { return false; } } public virtual bool UsesInjection { get { return false; } } public virtual bool HasLibraries { get { return false; } } public virtual bool RequireLibrary { get { return false; } } @@ -92,11 +96,17 @@ public Project(string path, CompilerOptions compilerOptions) protected bool AllowedSaving(string fileName) { + if (IsFolderProject()) return false; if (ReadOnly && fileName == ProjectPath) return false; if (BeforeSave != null) return BeforeSave(this, fileName); else return true; } + public bool IsFolderProject() + { + return path.EndsWith("Project.folder"); + } + public virtual void PropertiesChanged() { OnClasspathChanged(); @@ -104,6 +114,7 @@ public virtual void PropertiesChanged() public virtual PropertiesDialog CreatePropertiesDialog() { + if (IsFolderProject()) return null; return new PropertiesDialog(); } @@ -371,13 +382,16 @@ public static String RemoveDiacritics(String s) return stringBuilder.ToString(); } - #endregion - - + /// + /// + /// + /// public bool IsDirectory(string path) { return System.IO.Directory.Exists(path); } + + #endregion } public enum OutputType diff --git a/External/Plugins/ProjectManager/Projects/ProjectLoader.cs b/External/Plugins/ProjectManager/Projects/ProjectLoader.cs index 3c11463d92..b71b3bc82f 100644 --- a/External/Plugins/ProjectManager/Projects/ProjectLoader.cs +++ b/External/Plugins/ProjectManager/Projects/ProjectLoader.cs @@ -10,11 +10,9 @@ class ProjectLoader public static Project Load(string file) { string ext = Path.GetExtension(file).ToLower(); - if (ProjectCreator.IsKnownProject(ext) || FileInspector.IsProject(file, ext)) { - Type projectType = - ProjectCreator.GetProjectType(ProjectCreator.KeyForProjectPath(file)); + Type projectType = ProjectCreator.GetProjectType(ProjectCreator.KeyForProjectPath(file)); if (projectType != null) { object[] para = new object[1]; diff --git a/FlashDevelop/MainForm.cs b/FlashDevelop/MainForm.cs index 8e25ec162e..70c7679748 100644 --- a/FlashDevelop/MainForm.cs +++ b/FlashDevelop/MainForm.cs @@ -1527,12 +1527,12 @@ public void OnScintillaControlDropFiles(ScintillaControl sci, String data) this.BeginInvoke((MethodInvoker)delegate { this.OnScintillaControlDropFiles(null, data); }); return; } - String[] files = Regex.Split(data.Substring(1, data.Length - 2), "\" \""); - foreach (String file in files) + String[] entries = Regex.Split(data.Substring(1, data.Length - 2), "\" \""); + foreach (String entry in entries) { - if (File.Exists(file)) + if (File.Exists(entry)) { - DockContent doc = this.OpenEditableDocument(file); + DockContent doc = this.OpenEditableDocument(entry); if (doc == null || Control.ModifierKeys == Keys.Control) return; DockContent drop = DocumentManager.FindDocument(sci) as DockContent; if (drop != null && drop.Pane != null) @@ -1541,6 +1541,11 @@ public void OnScintillaControlDropFiles(ScintillaControl sci, String data) doc.Activate(); } } + else if (Directory.Exists(entry)) + { + TextEvent de = new TextEvent(EventType.FolderOpen, entry); + EventManager.DispatchEvent(this, de); + } } } diff --git a/PluginCore/PluginCore/Enumerators.cs b/PluginCore/PluginCore/Enumerators.cs index 9ec4e208d5..4ee40f89a8 100644 --- a/PluginCore/PluginCore/Enumerators.cs +++ b/PluginCore/PluginCore/Enumerators.cs @@ -44,7 +44,8 @@ public enum EventType : long Keys = 8589934592, // KeyEvent (keys) Completion = 17179869184, // NotifyEvent AppChanges = 34359738368, // NotifyEvent - ApplyTheme = 68719476736 // NotifyEvent + ApplyTheme = 68719476736, // NotifyEvent + FolderOpen = 137438953472 // TextEvent (path) } public enum UpdateInterval diff --git a/PluginCore/PluginCore/Resources/de_DE.resx b/PluginCore/PluginCore/Resources/de_DE.resx index 6d46ea0803..ab6f35a33d 100644 --- a/PluginCore/PluginCore/Resources/de_DE.resx +++ b/PluginCore/PluginCore/Resources/de_DE.resx @@ -1768,7 +1768,7 @@ Ansonsten kann Adobe Flash Professional auch zum Überprüfen der Syntax verwend Dieses Projekt hat keine Ausgabedatei und und keine Pre- oder Post-Build-Befehle definiert. - |Erstelle neues Projekt|{0}oder{0}|Öffne existierende Projekt|{0}oder{0}|Importiere Flash Builder Projekt|{0}or{0}|Import a Haxe hxml project| + |Open a folder|{0}or{0}|Erstelle neues Projekt|{0}oder{0}|Öffne existierende Projekt|{0}oder{0}|Importiere Flash Builder Projekt|{0}or{0}|Import a Haxe hxml project| Keine Vorlagen wurden im Vorlagenverzeichnis gefunden. Sie können keine Projekte erstellen. Sie können dieses Problem beheben, indem Sie FlashDevelop neu installieren. @@ -6231,4 +6231,8 @@ AND - All conditions are met. Vererbungsnavigation Added after 5.2.1 + + Open &Folder... + Added after 5.3.1 + \ No newline at end of file diff --git a/PluginCore/PluginCore/Resources/en_US.resx b/PluginCore/PluginCore/Resources/en_US.resx index 7846088260..f442885629 100644 --- a/PluginCore/PluginCore/Resources/en_US.resx +++ b/PluginCore/PluginCore/Resources/en_US.resx @@ -1751,7 +1751,8 @@ Alternatively, Adobe Flash Professional can also be used for syntax checking - p This project has no output and not build command configured. - |Create a new project|{0}or{0}|Open an existing project|{0}or{0}|Import a Flash Builder project|{0}or{0}|Import a Haxe hxml project| + |Open a folder|{0}or{0}|Create a new project|{0}or{0}|Open an existing project|{0}or{0}|Import a Flash Builder project|{0}or{0}|Import a Haxe hxml project| + Modified after 5.3.1 No templates were found in the templates directory. You will not be able to create new projects. You might try reinstalling FlashDevelop. @@ -6246,4 +6247,8 @@ AND - All conditions are met. Inheritance Navigation Added after 5.2.1 + + Open &Folder... + Added after 5.3.1 + \ No newline at end of file diff --git a/PluginCore/PluginCore/Resources/eu_ES.resx b/PluginCore/PluginCore/Resources/eu_ES.resx index 2539726050..ced5c4ce2d 100644 --- a/PluginCore/PluginCore/Resources/eu_ES.resx +++ b/PluginCore/PluginCore/Resources/eu_ES.resx @@ -1750,7 +1750,7 @@ Alternatiba gisa, Adobe Flash Professional ere sintaxi egiaztapenerako erabil da Proiektu honek ez du irteerarik eta ezta eraikitzeko konfigurazio komandorik ere. - |Proiektu berria sortu|{0}edo{0}|Existitzen den proiektu bat ireki|{0}edo{0}|Flex Builder proiektu bat inportatu|{0}or{0}|Import a Haxe hxml project| + |Open a folder|{0}or{0}|Proiektu berria sortu|{0}edo{0}|Existitzen den proiektu bat ireki|{0}edo{0}|Flex Builder proiektu bat inportatu|{0}or{0}|Import a Haxe hxml project| Ez da txantiloirik aurkitu txantiloien directorioan. Ezin izanen duzu proiektu berririk sortu. FlashDevelop berriro instalatzen saia zaiztezke. @@ -6228,4 +6228,8 @@ AND - All conditions are met. Inheritance Navigation Added after 5.2.1 + + Open &Folder... + Added after 5.3.1 + \ No newline at end of file diff --git a/PluginCore/PluginCore/Resources/ja_JP.resx b/PluginCore/PluginCore/Resources/ja_JP.resx index 2cb3c6af04..323d0e8b40 100644 --- a/PluginCore/PluginCore/Resources/ja_JP.resx +++ b/PluginCore/PluginCore/Resources/ja_JP.resx @@ -1753,7 +1753,7 @@ このプロジェクトはなにも書き出さず、設定されたコマンドも実行しません。 - |新規プロジェクトを作成|{0}または{0}|既存のプロジェクトを開く|{0}または{0}|Flash Builder プロジェクトをインポート|{0}or{0}|Import a Haxe hxml project| + |Open a folder|{0}or{0}|新規プロジェクトを作成|{0}または{0}|既存のプロジェクトを開く|{0}または{0}|Flash Builder プロジェクトをインポート|{0}or{0}|Import a Haxe hxml project| テンプレートディレクトリの中にテンプレートが見つかりません。新規プロジェクトが作成できない可能性があります。FlashDevelop を再インストールしてください。 @@ -6289,4 +6289,8 @@ AND - All conditions are met. Sets the maximum number of processes for diagnostics (linting) that run at the same time. Defaults to 1. Added after 5.2.1 + + Open &Folder... + Added after 5.3.1 + \ No newline at end of file diff --git a/PluginCore/PluginCore/Resources/ko_KR.resx b/PluginCore/PluginCore/Resources/ko_KR.resx index 510e71f866..ac7e41b7bf 100644 --- a/PluginCore/PluginCore/Resources/ko_KR.resx +++ b/PluginCore/PluginCore/Resources/ko_KR.resx @@ -1751,7 +1751,7 @@ 이 프로젝트는 출력이없고 구성에 빌드 명령도 없습니다. - |새 프로젝트 만들기|{0}또는{0}|기존 프로젝트 열기|{0}또는{0}|Flash Builder 프로젝트 불러오기|{0}or{0}|Import a Haxe hxml project| + |Open a folder|{0}or{0}|새 프로젝트 만들기|{0}또는{0}|기존 프로젝트 열기|{0}또는{0}|Flash Builder 프로젝트 불러오기|{0}or{0}|Import a Haxe hxml project| 탬플릿 이렉토리에서 탬플릿을 찾을 수 없습니다. 새로운 프로젝트를 만들 수 없습니다. FlashDevelop를 다시 설치하는것을 권장합니다. @@ -6250,4 +6250,8 @@ AND - 모든 조건을 만족할때. Sets the maximum number of processes for diagnostics (linting) that run at the same time. Defaults to 1. Added after 5.2.1 + + Open &Folder... + Added after 5.3.1 + \ No newline at end of file diff --git a/PluginCore/PluginCore/Resources/zh_CN.resx b/PluginCore/PluginCore/Resources/zh_CN.resx index c378fdd152..1a84388d01 100644 --- a/PluginCore/PluginCore/Resources/zh_CN.resx +++ b/PluginCore/PluginCore/Resources/zh_CN.resx @@ -1751,7 +1751,7 @@ 项目没有输出,也没有配置编译命令. - |创建新项目|{0}或{0}|打开一个现有的项目|{0}或{0}|导入一个 Flash Builder 项目|{0}or{0}|Import a Haxe hxml project| + |Open a folder|{0}or{0}|创建新项目|{0}或{0}|打开一个现有的项目|{0}或{0}|导入一个 Flash Builder 项目|{0}or{0}|Import a Haxe hxml project| 无法在模板目录中找到模板.你将无法创建新项目.你可以尝试重新安装 FlashDevelop 软件. @@ -6241,4 +6241,8 @@ AND - All conditions are met. Sets the maximum number of processes for diagnostics (linting) that run at the same time. Defaults to 1. Added after 5.2.1 + + Open &Folder... + Added after 5.3.1 + \ No newline at end of file