From 37a2cda694ea3e15bff6a96a43e4f015a2471122 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Thu, 6 Dec 2018 17:36:21 +0100 Subject: [PATCH] wip --- Crow.csproj | 9 +- CrowIDE/CrowIDE.csproj | 3 + CrowIDE/src/DesignInterface.cs | 12 +- CrowIDE/src/Editors/Editor.cs | 19 +- CrowIDE/src/Editors/ImlVisualEditor.cs | 15 +- CrowIDE/src/Editors/SourceEditor.cs | 2 +- CrowIDE/src/Editors/SvgEditor.cs | 3 + CrowIDE/src/ProjectTree/ProjectFile.cs | 57 +- CrowIDE/src/ProjectTree/ProjectItem.cs | 24 + CrowIDE/src/ProjectTree/ProjectNodes.cs | 25 + CrowIDE/src/Solution.cs | 45 +- CrowIDE/ui/CrowIDE.crow | 4 +- CrowIDE/ui/DockWindows/winEditor.crow | 3 +- CrowIDE/ui/IDE.style | 2 + CrowIDE/ui/MembersItem.template | 2 +- CrowIDE/ui/ProjectTree.template | 65 +- CrowIDE/ui/TreeExpandable.template | 2 +- CrowIDE/ui/editors/EditTabItem.template | 19 + CrowIDE/ui/editors/IMLEdit.itemp | 7 +- CrowIDE/ui/editors/SrcEdit.itemp | 2 +- CrowIDE/ui/editors/SvgEdit.itemp | 2 +- Default.style | 4 +- Templates/DockWindow.template | 2 +- Templates/Expandable.template | 4 +- Templates/TreeView.template | 2 +- Tests/BasicTests.cs | 101 +- Tests/GraphicObjects/LaggingGraphicObject.cs | 33 +- Tests/Interfaces/Container/0.crow | 3 +- Tests/Interfaces/Divers/testVisibility.crow | 8 + Tests/Tests.csproj | 3 + Tests/test.style | 2 +- Tests/ui/MenuItem.style | 4 +- Tests/ui/MenuItem.template | 4 - src/Cairo/CairoHelpers.cs | 2 +- src/Colors.cs | 10 - src/CompilerServices/CompilerServices.cs | 2 +- src/ExtensionsMethods.cs | 3 +- src/GraphicObjects/DockStack.cs | 11 +- src/GraphicObjects/DockWindow.cs | 13 +- src/GraphicObjects/GraphicObject.cs | 58 +- src/GraphicObjects/TabItem.cs | 41 +- src/GraphicObjects/TemplatedGroup.cs | 2 +- src/GraphicObjects/TreeView.cs | 8 +- src/Interface.cs | 37 +- src/Mono.Cairo/Color.cs | 75 -- src/Mono.Cairo/Context.cs | 31 +- src/Mono.Cairo/Gradient.cs | 2 +- src/Mono.Cairo/NativeMethods-internal.cs | 1026 ++++++++++++++++++ src/Mono.Cairo/NativeMethods.cs | 4 +- src/Mono.Cairo/Rectangle.cs | 99 -- src/Mono.Cairo/SolidPattern.cs | 2 +- src/debug/DebugLogViewer.cs | 2 +- 52 files changed, 1479 insertions(+), 441 deletions(-) create mode 100644 CrowIDE/ui/editors/EditTabItem.template create mode 100755 Tests/Interfaces/Divers/testVisibility.crow delete mode 100644 src/Mono.Cairo/Color.cs create mode 100644 src/Mono.Cairo/NativeMethods-internal.cs delete mode 100644 src/Mono.Cairo/Rectangle.cs diff --git a/Crow.csproj b/Crow.csproj index f181f154..e06c7c71 100644 --- a/Crow.csproj +++ b/Crow.csproj @@ -32,7 +32,7 @@ true false $(SolutionDir)build\Debug - DEBUG_DRAGNDROP0;DEBUG_LOG;XLIB_BACKEND0;DESIGN_MODE;DEBUG_UPDATE0;DEBUG_FOCUS0;DEBUG_DISPOSE0;TRACE0;DEBUG;MEASURE_TIME;DEBUG_LOAD0;DEBUG_BINDING0;DEBUG_CLIP_RECTANGLE0 + DEBUG_DRAGNDROP0;DEBUG_LOG0;XLIB_BACKEND0;DESIGN_MODE;DEBUG_UPDATE0;DEBUG_FOCUS;DEBUG_DISPOSE0;TRACE0;DEBUG;MEASURE_TIME;DEBUG_LOAD0;DEBUG_BINDING0;DEBUG_CLIP_RECTANGLE0 @@ -156,7 +156,6 @@ - @@ -187,7 +186,6 @@ - @@ -197,7 +195,6 @@ - @@ -214,7 +211,6 @@ - @@ -236,6 +232,8 @@ + + @@ -414,5 +412,6 @@ + diff --git a/CrowIDE/CrowIDE.csproj b/CrowIDE/CrowIDE.csproj index 8cb90b0c..7f23c32a 100644 --- a/CrowIDE/CrowIDE.csproj +++ b/CrowIDE/CrowIDE.csproj @@ -283,6 +283,9 @@ + + Crow.Coding.EditTabItem.template + diff --git a/CrowIDE/src/DesignInterface.cs b/CrowIDE/src/DesignInterface.cs index 9d0bfe9c..7d9b8ad8 100644 --- a/CrowIDE/src/DesignInterface.cs +++ b/CrowIDE/src/DesignInterface.cs @@ -67,6 +67,8 @@ namespace Crow.Coding } public override void ProcessResize (Rectangle bounds) { + if (bounds == clientRectangle) + return; lock (UpdateMutex) { clientRectangle = bounds; surf.Dispose (); @@ -82,8 +84,14 @@ namespace Crow.Coding public override GraphicObject Load (string path) { ProjectFile pi; - if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi)) - return CreateITorFromIMLFragment (pi.Source).CreateInstance(); + try { + + if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi)) + return CreateITorFromIMLFragment (pi.Source).CreateInstance(); + } catch (Exception ex) { + + } + return null; } public override System.IO.Stream GetStreamFromPath (string path) diff --git a/CrowIDE/src/Editors/Editor.cs b/CrowIDE/src/Editors/Editor.cs index 8ede10e3..102debb5 100644 --- a/CrowIDE/src/Editors/Editor.cs +++ b/CrowIDE/src/Editors/Editor.cs @@ -84,15 +84,18 @@ namespace Crow.Coding protected void backgroundThreadFunc () { while (true) { - if (IsReady) { - if (!projFile.RegisteredEditors [this]) { - projFile.RegisteredEditors [this] = true; - updateEditorFromProjFile (); - } else if (EditorIsDirty) { - EditorIsDirty = false; - updateProjFileFromEditor (); + if (IsReady) { + if (Monitor.TryEnter (IFace.UpdateMutex)) { + if (!projFile.RegisteredEditors [this]) { + projFile.RegisteredEditors [this] = true; + updateEditorFromProjFile (); + } else if (EditorIsDirty) { + EditorIsDirty = false; + updateProjFileFromEditor (); + } + updateCheckPostProcess (); + Monitor.Exit (IFace.UpdateMutex); } - updateCheckPostProcess (); } Thread.Sleep (100); } diff --git a/CrowIDE/src/Editors/ImlVisualEditor.cs b/CrowIDE/src/Editors/ImlVisualEditor.cs index e20ba131..00d1ec96 100644 --- a/CrowIDE/src/Editors/ImlVisualEditor.cs +++ b/CrowIDE/src/Editors/ImlVisualEditor.cs @@ -279,9 +279,6 @@ namespace Crow.Coding SelectedItem = go; } catch (Exception ex) { Error = ex; - Debug.WriteLine ("Error Loading ui in Design iface\n" + ex.ToString ()); - if (Monitor.IsEntered(imlVE.UpdateMutex)) - Monitor.Exit (imlVE.UpdateMutex); } } protected override void updateCheckPostProcess () @@ -309,7 +306,11 @@ namespace Crow.Coding base.OnLayoutChanges (layoutType); switch (layoutType) { case LayoutingType.Width: + DesignWidth = Slot.Width * 100 / zoom; + imlVE.ProcessResize (new Size(designWidth,designHeight)); + break; case LayoutingType.Height: + DesignHeight = Slot.Height * 100 / zoom; imlVE.ProcessResize (new Size(designWidth,designHeight)); break; } @@ -324,6 +325,8 @@ namespace Crow.Coding ProcessMouseMove (e.X - scr.X, e.Y - scr.Y); GraphicObject newHW = HoverWidget; + if (newHW == null) + return; if (draggedObj != null) { if (draggedObj.Parent == null) { @@ -389,7 +392,7 @@ namespace Crow.Coding { base.onDraw (gr); - Rectangle cb = new Rectangle (0, 0, designWidth, designHeight);// ClientRectangle; + Rectangle cb = new Rectangle (0, 0, designWidth, designHeight); gr.Save (); @@ -424,7 +427,7 @@ namespace Crow.Coding gr.Paint (); imlVE.IsDirty = false; } - if (Error == null) { + /*if (Error == null) { gr.SetSourceColor (Color.Black); gr.Rectangle (cb, 1.0 / z); } else { @@ -439,7 +442,7 @@ namespace Crow.Coding } } - gr.Stroke (); + gr.Stroke ();*/ Rectangle hr; diff --git a/CrowIDE/src/Editors/SourceEditor.cs b/CrowIDE/src/Editors/SourceEditor.cs index 1b3b07dd..4e8bcccd 100644 --- a/CrowIDE/src/Editors/SourceEditor.cs +++ b/CrowIDE/src/Editors/SourceEditor.cs @@ -324,7 +324,7 @@ namespace Crow.Coding } void Buffer_PositionChanged (object sender, EventArgs e) { - Console.WriteLine ("Position changes: ({0},{1})", buffer.CurrentLine, buffer.CurrentColumn); + //Console.WriteLine ("Position changes: ({0},{1})", buffer.CurrentLine, buffer.CurrentColumn); int cc = buffer.CurrentTabulatedColumn; if (cc > visibleColumns + ScrollX) { diff --git a/CrowIDE/src/Editors/SvgEditor.cs b/CrowIDE/src/Editors/SvgEditor.cs index 219eea67..163b5ac1 100644 --- a/CrowIDE/src/Editors/SvgEditor.cs +++ b/CrowIDE/src/Editors/SvgEditor.cs @@ -88,6 +88,9 @@ namespace Crow.Coding throw new NotImplementedException (); } } + protected override bool IsReady { + get { return projFile != null; } + } #endregion #region GraphicObject overrides diff --git a/CrowIDE/src/ProjectTree/ProjectFile.cs b/CrowIDE/src/ProjectTree/ProjectFile.cs index c26cb7cf..2fab8ec4 100644 --- a/CrowIDE/src/ProjectTree/ProjectFile.cs +++ b/CrowIDE/src/ProjectTree/ProjectFile.cs @@ -34,7 +34,7 @@ using System.Threading; namespace Crow.Coding { public class ProjectFile : ProjectItem { - protected bool isOpened = false; + bool isOpened = false; DateTime accessTime; string source; string origSource; @@ -47,7 +47,7 @@ namespace Crow.Coding List undoStack = new List(); List redoStack = new List(); - public Crow.Command cmdSave, cmdSaveAs, cmdOpen, cmdUndo, cmdRedo; + public Crow.Command cmdSave, cmdSaveAs, cmdOpen, cmdClose, cmdUndo, cmdRedo; void initCommands (){ cmdSave = new Crow.Command (new Action (() => Save ())) @@ -55,14 +55,20 @@ namespace Crow.Coding cmdSaveAs = new Crow.Command (new Action (() => SaveAs ())) { Caption = "Save As ..", Icon = new SvgPicture ("#Crow.Coding.icons.save.svg"), CanExecute = false }; cmdOpen = new Crow.Command (new Action (() => Open ())) - { Caption = "Open", Icon = new SvgPicture ("#Crow.Coding.icons.open.svg"), CanExecute = false }; + { Caption = "Open", Icon = new SvgPicture ("#Crow.Coding.icons.open.svg"), CanExecute = true }; + cmdClose = new Crow.Command (new Action (() => Close ())) + { Caption = "Close", Icon = new SvgPicture ("#Crow.Coding.icons.open.svg"), CanExecute = false }; cmdUndo = new Crow.Command (new Action (() => Undo (null))) { Caption = "Undo", Icon = new SvgPicture ("#Crow.Coding.icons.undo.svg"), CanExecute = false }; cmdRedo = new Crow.Command (new Action (() => Redo (null))) { Caption = "Redo", Icon = new SvgPicture ("#Crow.Coding.icons.redo.svg"), CanExecute = false }; Commands.Insert (0, cmdOpen); - Commands.Insert (1, cmdSave); + Commands.Insert (1, cmdSave); + Commands.Insert (2, cmdSaveAs); + Commands.Insert (3, cmdUndo); + Commands.Insert (4, cmdRedo); + Commands.Add (cmdClose); } public ProjectFile () { initCommands(); @@ -85,7 +91,25 @@ namespace Crow.Coding return node.SelectSingleNode ("LogicalName")?.InnerText; } } + public bool IsOpened { + get { return isOpened; } + set { + if (isOpened == value) + return; + isOpened = value; + + cmdOpen.CanExecute = !isOpened; + cmdClose.CanExecute = isOpened; + cmdSave.CanExecute = isOpened && IsDirty; + if (isOpened) + Project.solution.OpenItem (this); + else + Project.solution.CloseItem (this); + + NotifyValueChanged ("IsOpened", isOpened); + } + } public void UnregisterEditor (object editor){ lock(RegisteredEditors){ RegisteredEditors.Remove (editor); @@ -124,9 +148,11 @@ namespace Crow.Coding } public string Source { get { - if (!isOpened) - Open (); - else { + if (!IsOpened) { + using (StreamReader sr = new StreamReader (AbsolutePath)) + source = sr.ReadToEnd (); + + } else { if (DateTime.Compare ( accessTime, System.IO.File.GetLastWriteTime (AbsolutePath)) < 0) @@ -195,13 +221,13 @@ namespace Crow.Coding } } - public void Open () { + public void Open () { accessTime = System.IO.File.GetLastWriteTime (AbsolutePath); using (StreamReader sr = new StreamReader (AbsolutePath)) { source = sr.ReadToEnd (); } - isOpened = true; origSource = source; + IsOpened = true; NotifyValueChanged ("IsDirty", false); } public virtual void Save () { @@ -223,9 +249,8 @@ namespace Crow.Coding NotifyValueChanged ("IsDirty", false); } public void Close () { - origSource = null; - isOpened = false; - Project.solution.CloseItem (this); + origSource = source = null; + IsOpened = false; } public void Undo(object sender){ undo(); @@ -276,7 +301,15 @@ namespace Crow.Coding } + public void onDoubleClick (object sender, MouseButtonEventArgs e){ + if (IsOpened) + return; + Open (); + } + public void onClick (object sender, MouseButtonEventArgs e){ + IsSelected = true; + } public void OnQueryClose (object sender, EventArgs e){ if (IsDirty) { MessageBox mb = MessageBox.ShowModal (CrowIDE.MainIFace, diff --git a/CrowIDE/src/ProjectTree/ProjectItem.cs b/CrowIDE/src/ProjectTree/ProjectItem.cs index 7a30a8e1..71a0b0f3 100644 --- a/CrowIDE/src/ProjectTree/ProjectItem.cs +++ b/CrowIDE/src/ProjectTree/ProjectItem.cs @@ -71,6 +71,30 @@ namespace Crow.Coding public string HintPath { get { return node.SelectSingleNode ("HintPath")?.InnerText; } } + + public override bool IsSelected { + get { + return isSelected; + } + set { + if (value == isSelected) + return; + + isSelected = value; + + NotifyValueChanged ("IsSelected", isSelected); + + if (isSelected) { + Project.solution.SelectedItem = this; + Project.IsExpanded = true; + ProjectNode pn = Parent; + while (pn != null) { + pn.IsExpanded = true; + pn = pn.Parent; + } + } + } + } } } diff --git a/CrowIDE/src/ProjectTree/ProjectNodes.cs b/CrowIDE/src/ProjectTree/ProjectNodes.cs index b9c855f1..b3b5e6c4 100644 --- a/CrowIDE/src/ProjectTree/ProjectNodes.cs +++ b/CrowIDE/src/ProjectTree/ProjectNodes.cs @@ -79,6 +79,7 @@ namespace Crow.Coding ProjectNode parent; bool isExpanded; + protected bool isSelected = false; ItemType type; string name; List childNodes = new List(); @@ -86,6 +87,18 @@ namespace Crow.Coding public Project Project; public List Commands;//list of command available for that node + public Crow.Picture Icon { + get { + switch (Type) { + case ItemType.Reference: + return new SvgPicture ("#Crow.Icons.assembly.svg"); + case ItemType.ProjectReference: + return new SvgPicture("#Crow.Icons.projectRef.svg"); + default: + return new SvgPicture("#Crow.Coding.icons.file.svg"); + } + } + } public ProjectNode Parent { get { return parent; } set { parent = value; } @@ -124,7 +137,19 @@ namespace Crow.Coding NotifyValueChanged ("IsExpanded", isExpanded); } } + public virtual bool IsSelected + { + get { return isSelected; } + set + { + if (value == isSelected) + return; + + isSelected = value; + NotifyValueChanged ("IsSelected", isSelected); + } + } public override string ToString () { return DisplayName; diff --git a/CrowIDE/src/Solution.cs b/CrowIDE/src/Solution.cs index 68922865..2295c330 100644 --- a/CrowIDE/src/Solution.cs +++ b/CrowIDE/src/Solution.cs @@ -159,7 +159,14 @@ namespace Crow.Coding{ set { if (selectedItem == value) return; + if (SelectedItem != null) + SelectedItem.IsSelected = false; selectedItem = value; + if (SelectedItem != null) + SelectedItem.IsSelected = true; + + UserConfig.Set ("SelectedProjItems", SelectedItem?.AbsolutePath); + NotifyValueChanged ("SelectedItem", selectedItem); } } @@ -230,40 +237,30 @@ namespace Crow.Coding{ foreach (Project p in Projects) { ProjectFile pi; if (p.TryGetProjectFileFromAbsolutePath (f, out pi)) { - OpenedItems.AddElement (pi); - pi.Project.IsExpanded = true; - ProjectNode pn = pi.Parent; - while (pn != null) { - pn.IsExpanded = true; - pn = pn.Parent; - } + pi.Open (); if (pi.AbsolutePath == sel) selItem = pi; break; } } } - SelectedItem = selItem;//BUG: loading in another thread focused last loaded pf + if (selItem == null) + return; + selItem.IsSelected = true; } - void onSelectedItemChanged (object sender, SelectionChangeEventArgs e){ - ProjectItem pi = e.NewValue as ProjectItem; - if (pi != null) { - if (!openedItems.Contains (pi)) { - openedItems.AddElement (pi); - saveOpenedItemsInUserConfig (); - } - } - this.SelectedItem = pi; + /*void onSelectedItemChanged (object sender, SelectionChangeEventArgs e){ + SelectedItem = e.NewValue as ProjectItem; UserConfig.Set ("SelectedProjItems", SelectedItem?.AbsolutePath); + }*/ + + public void OpenItem (ProjectItem pi) { + if (!openedItems.Contains (pi)) { + openedItems.AddElement (pi); + saveOpenedItemsInUserConfig (); + } } - public void OnCloseTab (object sender, MouseButtonEventArgs e){ - Console.WriteLine ("OnCloseTab"); - openedItems.RemoveElement ((sender as GraphicObject).DataSource as ProjectItem); - saveOpenedItemsInUserConfig (); - } - public void CloseItem (ProjectItem pi) { - Console.WriteLine ("CloseItem: " + pi.ToString()); + public void CloseItem (ProjectItem pi) { openedItems.RemoveElement (pi); saveOpenedItemsInUserConfig (); } diff --git a/CrowIDE/ui/CrowIDE.crow b/CrowIDE/ui/CrowIDE.crow index 1246e8c4..94df6d67 100644 --- a/CrowIDE/ui/CrowIDE.crow +++ b/CrowIDE/ui/CrowIDE.crow @@ -1,5 +1,5 @@  - + @@ -55,4 +55,4 @@ --> - + diff --git a/CrowIDE/ui/DockWindows/winEditor.crow b/CrowIDE/ui/DockWindows/winEditor.crow index eb757b61..c2029d5f 100644 --- a/CrowIDE/ui/DockWindows/winEditor.crow +++ b/CrowIDE/ui/DockWindows/winEditor.crow @@ -1,5 +1,6 @@  - diff --git a/CrowIDE/ui/IDE.style b/CrowIDE/ui/IDE.style index 11929644..9f01cc2d 100644 --- a/CrowIDE/ui/IDE.style +++ b/CrowIDE/ui/IDE.style @@ -33,6 +33,8 @@ WinSchema { } TabItem { AllowDrag="false"; + Background="Onyx"; + SelectedBackground="vgradient|0:DimGrey|0.4:Onyx"; } TreeItemBorder { CornerRadius="2"; diff --git a/CrowIDE/ui/MembersItem.template b/CrowIDE/ui/MembersItem.template index ef264018..f1427e31 100755 --- a/CrowIDE/ui/MembersItem.template +++ b/CrowIDE/ui/MembersItem.template @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/CrowIDE/ui/ProjectTree.template b/CrowIDE/ui/ProjectTree.template index 6b6422f9..1b4b0543 100644 --- a/CrowIDE/ui/ProjectTree.template +++ b/CrowIDE/ui/ProjectTree.template @@ -1,12 +1,21 @@  -