From 74d1288c9990bb251b7097b225891bafdc6758af Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Wed, 13 May 2020 10:09:01 +0200 Subject: [PATCH] removed splitted CrowIDE --- Crow/Cursors/arrow | Bin 0 -> 69120 bytes Crow/Cursors/bottom_left_corner | Bin 0 -> 69120 bytes Crow/Cursors/bottom_right_corner | Bin 0 -> 69120 bytes Crow/Cursors/cross | Bin 0 -> 69120 bytes Crow/Cursors/hand | Bin 0 -> 69120 bytes Crow/Cursors/help | Bin 0 -> 69120 bytes Crow/Cursors/ibeam | Bin 0 -> 69120 bytes Crow/Cursors/move | Bin 0 -> 69120 bytes Crow/Cursors/sb_h_double_arrow | Bin 0 -> 69120 bytes Crow/Cursors/sb_v_double_arrow | Bin 0 -> 69120 bytes Crow/Cursors/top_left_corner | Bin 0 -> 69120 bytes Crow/Cursors/top_right_corner | Bin 0 -> 69120 bytes Crow/src/XCursor.cs | 151 + Samples/CrowIDE/CrowIDE.csproj | 47 - Samples/CrowIDE/CrowIDE.userprefs | 19 - .../ContextMenu.template | 42 - .../MenuItem.template | 29 - .../DefaultTemplateOverrides/TabItem.template | 19 - Samples/CrowIDE/IDE.style | 64 - Samples/CrowIDE/icons/basic_floppydisk.svg | 15 - Samples/CrowIDE/icons/binding.svg | 7 - Samples/CrowIDE/icons/blank-file.svg | 7 - Samples/CrowIDE/icons/center-align.svg | 9 - Samples/CrowIDE/icons/cogwheel.svg | 7 - Samples/CrowIDE/icons/compile.svg | 9 - Samples/CrowIDE/icons/copy-file.svg | 6 - Samples/CrowIDE/icons/cs-file.svg | 11 - Samples/CrowIDE/icons/curly-brackets.svg | 7 - Samples/CrowIDE/icons/drawsvg.svg | 1 - Samples/CrowIDE/icons/edit.svg | 6 - Samples/CrowIDE/icons/eraser.svg | 6 - Samples/CrowIDE/icons/expand-arrows-1.svg | 9 - Samples/CrowIDE/icons/file-code.svg | 9 - Samples/CrowIDE/icons/file.svg | 6 - Samples/CrowIDE/icons/font-file.svg | 7 - Samples/CrowIDE/icons/light-bulb.svg | 7 - Samples/CrowIDE/icons/magic-wand.svg | 13 - Samples/CrowIDE/icons/magnet.svg | 8 - Samples/CrowIDE/icons/move-arrows.svg | 6 - Samples/CrowIDE/icons/open-folder-1.svg | 6 - Samples/CrowIDE/icons/open.svg | 7 - Samples/CrowIDE/icons/paint-brush.svg | 8 - Samples/CrowIDE/icons/palette.svg | 6 - Samples/CrowIDE/icons/paragraph.svg | 6 - Samples/CrowIDE/icons/paste-on-document.svg | 6 - Samples/CrowIDE/icons/pin.svg | 6 - Samples/CrowIDE/icons/previous.svg | 6 - Samples/CrowIDE/icons/question.svg | 7 - Samples/CrowIDE/icons/redo.svg | 6 - Samples/CrowIDE/icons/reply.svg | 6 - Samples/CrowIDE/icons/save.svg | 7 - Samples/CrowIDE/icons/scissors.svg | 6 - Samples/CrowIDE/icons/search.svg | 6 - Samples/CrowIDE/icons/share-arrow.svg | 6 - Samples/CrowIDE/icons/sign-out.svg | 7 - Samples/CrowIDE/icons/text-file.svg | 9 - Samples/CrowIDE/icons/text-label.svg | 7 - Samples/CrowIDE/icons/toolbox/Crow.Border.svg | 6 - Samples/CrowIDE/icons/toolbox/Crow.Button.svg | 6 - .../CrowIDE/icons/toolbox/Crow.CheckBox.svg | 6 - .../icons/toolbox/Crow.ColorPicker.svg | 6 - .../CrowIDE/icons/toolbox/Crow.ComboBox.svg | 7 - .../CrowIDE/icons/toolbox/Crow.Container.svg | 6 - .../icons/toolbox/Crow.DirectoryView.svg | 6 - Samples/CrowIDE/icons/toolbox/Crow.Docker.svg | 6 - .../CrowIDE/icons/toolbox/Crow.Expandable.svg | 6 - .../CrowIDE/icons/toolbox/Crow.FileDialog.svg | 8 - Samples/CrowIDE/icons/toolbox/Crow.Grid.svg | 6 - Samples/CrowIDE/icons/toolbox/Crow.Group.svg | 9 - .../CrowIDE/icons/toolbox/Crow.GroupBox.svg | 10 - .../icons/toolbox/Crow.HorizontalStack.svg | 6 - .../icons/toolbox/Crow.IMLContainer.svg | 8 - Samples/CrowIDE/icons/toolbox/Crow.Image.svg | 8 - Samples/CrowIDE/icons/toolbox/Crow.Label.svg | 7 - .../CrowIDE/icons/toolbox/Crow.ListBox.svg | 11 - Samples/CrowIDE/icons/toolbox/Crow.Menu.svg | 11 - .../CrowIDE/icons/toolbox/Crow.MenuItem.svg | 7 - .../CrowIDE/icons/toolbox/Crow.MessageBox.svg | 8 - .../icons/toolbox/Crow.ProgressBar.svg | 7 - .../icons/toolbox/Crow.RadioButton.svg | 7 - .../CrowIDE/icons/toolbox/Crow.ScrollBar.svg | 7 - .../CrowIDE/icons/toolbox/Crow.Scroller.svg | 6 - Samples/CrowIDE/icons/toolbox/Crow.Shape.svg | 6 - Samples/CrowIDE/icons/toolbox/Crow.Slider.svg | 6 - .../CrowIDE/icons/toolbox/Crow.Spinner.svg | 7 - .../CrowIDE/icons/toolbox/Crow.Splitter.svg | 8 - .../CrowIDE/icons/toolbox/Crow.TabItem.svg | 6 - .../CrowIDE/icons/toolbox/Crow.TabView.svg | 6 - .../icons/toolbox/Crow.TemplatedContainer.svg | 6 - .../icons/toolbox/Crow.TemplatedGroup.svg | 6 - .../CrowIDE/icons/toolbox/Crow.TextBox.svg | 7 - .../CrowIDE/icons/toolbox/Crow.TreeView.svg | 6 - .../icons/toolbox/Crow.VerticalStack.svg | 6 - Samples/CrowIDE/icons/toolbox/Crow.Window.svg | 6 - .../CrowIDE/icons/toolbox/Crow.Wrapper.svg | 8 - Samples/CrowIDE/icons/toolbox/bar-chart.svg | 10 - Samples/CrowIDE/icons/toolbox/bar-menu.svg | 8 - Samples/CrowIDE/icons/toolbox/bullets.svg | 11 - Samples/CrowIDE/icons/toolbox/calendar.svg | 8 - .../CrowIDE/icons/toolbox/check-square-1.svg | 7 - Samples/CrowIDE/icons/toolbox/database.svg | 9 - Samples/CrowIDE/icons/toolbox/ellipsis.svg | 8 - .../icons/toolbox/exclamation-circle-1.svg | 8 - .../icons/toolbox/exclamation-circle.svg | 6 - Samples/CrowIDE/icons/toolbox/file-code.svg | 9 - Samples/CrowIDE/icons/toolbox/grab.svg | 6 - .../CrowIDE/icons/toolbox/hard-drive-1.svg | 7 - Samples/CrowIDE/icons/toolbox/hash.svg | 6 - Samples/CrowIDE/icons/toolbox/info.svg | 7 - Samples/CrowIDE/icons/toolbox/layout.svg | 6 - Samples/CrowIDE/icons/toolbox/line-list.svg | 13 - Samples/CrowIDE/icons/toolbox/list.svg | 11 - Samples/CrowIDE/icons/toolbox/modal-list.svg | 12 - Samples/CrowIDE/icons/toolbox/options.svg | 10 - Samples/CrowIDE/icons/toolbox/package.svg | 6 - Samples/CrowIDE/icons/toolbox/padding.svg | 47 - .../CrowIDE/icons/toolbox/picture-file.svg | 8 - Samples/CrowIDE/icons/toolbox/pointer.svg | 6 - .../CrowIDE/icons/toolbox/puzzle-piece.svg | 6 - .../CrowIDE/icons/toolbox/refresh-file.svg | 8 - Samples/CrowIDE/icons/toolbox/sliders.svg | 11 - .../CrowIDE/icons/toolbox/split-browser-1.svg | 6 - Samples/CrowIDE/icons/toolbox/table.svg | 6 - Samples/CrowIDE/icons/toolbox/tasks.svg | 11 - Samples/CrowIDE/icons/toolbox/warning.svg | 6 - Samples/CrowIDE/icons/tools.svg | 8 - Samples/CrowIDE/icons/trash.svg | 7 - Samples/CrowIDE/icons/undo.svg | 6 - Samples/CrowIDE/icons/xml-file.svg | 8 - Samples/CrowIDE/icons/zoom-in.svg | 7 - Samples/CrowIDE/icons/zoom-out.svg | 7 - Samples/CrowIDE/images/save.svg | 3421 ----------------- Samples/CrowIDE/src/CrowIDE.cs | 289 -- Samples/CrowIDE/src/DesignInterface.cs | 190 - .../src/Editors/CodeBuffer/CodeBuffer.cs | 530 --- .../Editors/CodeBuffer/CodeBufferEventArgs.cs | 20 - .../src/Editors/CodeBuffer/CodeLine.cs | 82 - .../CrowIDE/src/Editors/CodeBuffer/Node.cs | 36 - .../src/Editors/CodeBuffer/TextBuffer.cs | 527 --- .../Editors/CodeBuffer/TextBufferEventArgs.cs | 20 - .../src/Editors/CodeBuffer/TextEditor.cs | 699 ---- .../src/Editors/CodeBuffer/TextFormatting.cs | 19 - .../CrowIDE/src/Editors/CodeBuffer/Token.cs | 71 - Samples/CrowIDE/src/Editors/EditPane.cs | 57 - Samples/CrowIDE/src/Editors/Editor.cs | 105 - .../CrowIDE/src/Editors/ImlSchematicEditor.cs | 132 - .../CrowIDE/src/Editors/ImlVisualEditor.cs | 908 ----- .../src/Editors/Parsers/BufferParser.cs | 380 -- .../src/Editors/Parsers/CSharpParser.cs | 386 -- .../src/Editors/Parsers/StyleParser.cs | 179 - .../CrowIDE/src/Editors/Parsers/XMLParser.cs | 307 -- .../CrowIDE/src/Editors/Parsers2/Tokenizer.cs | 67 - Samples/CrowIDE/src/Editors/SourceEditor.cs | 1209 ------ Samples/CrowIDE/src/Editors/SvgEditor.cs | 140 - Samples/CrowIDE/src/Extensions.cs | 45 - .../src/GraphicObjectDesignContainer.cs | 85 - Samples/CrowIDE/src/INetProject.cs | 35 - .../src/MemberView/CategoryContainer.cs | 65 - Samples/CrowIDE/src/MemberView/MembersView.cs | 139 - .../src/MemberView/PropertyContainer.cs | 222 -- Samples/CrowIDE/src/Project.cs | 519 --- .../CrowIDE/src/ProjectTree/CSProjectFile.cs | 72 - .../CrowIDE/src/ProjectTree/ImlProjectItem.cs | 89 - .../CrowIDE/src/ProjectTree/ProjectFile.cs | 323 -- .../CrowIDE/src/ProjectTree/ProjectItem.cs | 116 - .../CrowIDE/src/ProjectTree/ProjectNodes.cs | 159 - .../src/ProjectTree/ProjectReference.cs | 51 - .../src/ProjectTree/StyleProjectItem.cs | 50 - Samples/CrowIDE/src/Solution.cs | 541 --- Samples/CrowIDE/src/SolutionControler.cs | 37 - Samples/CrowIDE/src/VerticalLine.cs | 58 - Samples/CrowIDE/ui/CategoryExp.template | 21 - Samples/CrowIDE/ui/CrowIDE.crow | 58 - .../CrowIDE/ui/DockWindows/GTreeExpITemp.crow | 29 - .../ui/DockWindows/WinSchemaItem.template | 13 - .../ui/DockWindows/toolboxBut.template | 7 - Samples/CrowIDE/ui/DockWindows/winDesign.crow | 10 - Samples/CrowIDE/ui/DockWindows/winEditor.crow | 6 - Samples/CrowIDE/ui/DockWindows/winErrors.crow | 15 - .../CrowIDE/ui/DockWindows/winGTExplorer.crow | 28 - .../CrowIDE/ui/DockWindows/winProperties.crow | 7 - Samples/CrowIDE/ui/DockWindows/winSchema.crow | 18 - .../CrowIDE/ui/DockWindows/winSolution.crow | 6 - .../CrowIDE/ui/DockWindows/winStyleView.crow | 16 - .../CrowIDE/ui/DockWindows/winToolbox.crow | 18 - Samples/CrowIDE/ui/IcoBut.template | 7 - .../CrowIDE/ui/ItemTemplates/Enum.template | 47 - .../CrowIDE/ui/ItemTemplates/Fill.template | 19 - Samples/CrowIDE/ui/LQIsExplorer.crow | 65 - Samples/CrowIDE/ui/MemberView.crow | 5 - Samples/CrowIDE/ui/MembersItem.template | 19 - Samples/CrowIDE/ui/MembersView.template | 19 - Samples/CrowIDE/ui/NewFile.crow | 5 - Samples/CrowIDE/ui/Options.crow | 24 - Samples/CrowIDE/ui/ProjectProperties.crow | 66 - Samples/CrowIDE/ui/ProjectTree.template | 65 - Samples/CrowIDE/ui/TreeExpandable.template | 17 - Samples/CrowIDE/ui/editors/EditPane.template | 2 - .../CrowIDE/ui/editors/EditPaneItems.template | 18 - .../CrowIDE/ui/editors/EditTabItem.template | 19 - Samples/CrowIDE/ui/editors/IMLEdit.itemp | 54 - Samples/CrowIDE/ui/editors/SourceEditor.crow | 32 - Samples/CrowIDE/ui/editors/SrcEdit.itemp | 4 - Samples/CrowIDE/ui/editors/SvgEdit.itemp | 30 - Samples/CrowIDE/ui/editors/TextEditor.crow | 29 - Samples/CrowIDE/ui/test.crow | 4 - 206 files changed, 151 insertions(+), 14267 deletions(-) create mode 100644 Crow/Cursors/arrow create mode 100644 Crow/Cursors/bottom_left_corner create mode 100644 Crow/Cursors/bottom_right_corner create mode 100644 Crow/Cursors/cross create mode 100644 Crow/Cursors/hand create mode 100644 Crow/Cursors/help create mode 100644 Crow/Cursors/ibeam create mode 100644 Crow/Cursors/move create mode 100644 Crow/Cursors/sb_h_double_arrow create mode 100644 Crow/Cursors/sb_v_double_arrow create mode 100644 Crow/Cursors/top_left_corner create mode 100644 Crow/Cursors/top_right_corner create mode 100644 Crow/src/XCursor.cs delete mode 100644 Samples/CrowIDE/CrowIDE.csproj delete mode 100644 Samples/CrowIDE/CrowIDE.userprefs delete mode 100644 Samples/CrowIDE/DefaultTemplateOverrides/ContextMenu.template delete mode 100644 Samples/CrowIDE/DefaultTemplateOverrides/MenuItem.template delete mode 100644 Samples/CrowIDE/DefaultTemplateOverrides/TabItem.template delete mode 100644 Samples/CrowIDE/IDE.style delete mode 100644 Samples/CrowIDE/icons/basic_floppydisk.svg delete mode 100644 Samples/CrowIDE/icons/binding.svg delete mode 100644 Samples/CrowIDE/icons/blank-file.svg delete mode 100644 Samples/CrowIDE/icons/center-align.svg delete mode 100644 Samples/CrowIDE/icons/cogwheel.svg delete mode 100644 Samples/CrowIDE/icons/compile.svg delete mode 100644 Samples/CrowIDE/icons/copy-file.svg delete mode 100644 Samples/CrowIDE/icons/cs-file.svg delete mode 100644 Samples/CrowIDE/icons/curly-brackets.svg delete mode 100644 Samples/CrowIDE/icons/drawsvg.svg delete mode 100644 Samples/CrowIDE/icons/edit.svg delete mode 100644 Samples/CrowIDE/icons/eraser.svg delete mode 100644 Samples/CrowIDE/icons/expand-arrows-1.svg delete mode 100644 Samples/CrowIDE/icons/file-code.svg delete mode 100644 Samples/CrowIDE/icons/file.svg delete mode 100644 Samples/CrowIDE/icons/font-file.svg delete mode 100644 Samples/CrowIDE/icons/light-bulb.svg delete mode 100644 Samples/CrowIDE/icons/magic-wand.svg delete mode 100644 Samples/CrowIDE/icons/magnet.svg delete mode 100644 Samples/CrowIDE/icons/move-arrows.svg delete mode 100644 Samples/CrowIDE/icons/open-folder-1.svg delete mode 100644 Samples/CrowIDE/icons/open.svg delete mode 100644 Samples/CrowIDE/icons/paint-brush.svg delete mode 100644 Samples/CrowIDE/icons/palette.svg delete mode 100644 Samples/CrowIDE/icons/paragraph.svg delete mode 100644 Samples/CrowIDE/icons/paste-on-document.svg delete mode 100644 Samples/CrowIDE/icons/pin.svg delete mode 100644 Samples/CrowIDE/icons/previous.svg delete mode 100644 Samples/CrowIDE/icons/question.svg delete mode 100644 Samples/CrowIDE/icons/redo.svg delete mode 100644 Samples/CrowIDE/icons/reply.svg delete mode 100644 Samples/CrowIDE/icons/save.svg delete mode 100644 Samples/CrowIDE/icons/scissors.svg delete mode 100644 Samples/CrowIDE/icons/search.svg delete mode 100644 Samples/CrowIDE/icons/share-arrow.svg delete mode 100644 Samples/CrowIDE/icons/sign-out.svg delete mode 100644 Samples/CrowIDE/icons/text-file.svg delete mode 100644 Samples/CrowIDE/icons/text-label.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Border.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Button.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.CheckBox.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.ColorPicker.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.ComboBox.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Container.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.DirectoryView.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Docker.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Expandable.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.FileDialog.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Grid.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Group.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.GroupBox.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.HorizontalStack.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.IMLContainer.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Image.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Label.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.ListBox.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Menu.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.MenuItem.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.MessageBox.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.ProgressBar.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.RadioButton.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.ScrollBar.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Scroller.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Shape.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Slider.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Spinner.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Splitter.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.TabItem.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.TabView.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.TemplatedContainer.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.TemplatedGroup.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.TextBox.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.TreeView.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.VerticalStack.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Window.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/Crow.Wrapper.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/bar-chart.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/bar-menu.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/bullets.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/calendar.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/check-square-1.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/database.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/ellipsis.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/exclamation-circle-1.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/exclamation-circle.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/file-code.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/grab.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/hard-drive-1.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/hash.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/info.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/layout.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/line-list.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/list.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/modal-list.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/options.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/package.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/padding.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/picture-file.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/pointer.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/puzzle-piece.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/refresh-file.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/sliders.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/split-browser-1.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/table.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/tasks.svg delete mode 100644 Samples/CrowIDE/icons/toolbox/warning.svg delete mode 100644 Samples/CrowIDE/icons/tools.svg delete mode 100644 Samples/CrowIDE/icons/trash.svg delete mode 100644 Samples/CrowIDE/icons/undo.svg delete mode 100644 Samples/CrowIDE/icons/xml-file.svg delete mode 100644 Samples/CrowIDE/icons/zoom-in.svg delete mode 100644 Samples/CrowIDE/icons/zoom-out.svg delete mode 100644 Samples/CrowIDE/images/save.svg delete mode 100644 Samples/CrowIDE/src/CrowIDE.cs delete mode 100644 Samples/CrowIDE/src/DesignInterface.cs delete mode 100644 Samples/CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs delete mode 100644 Samples/CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs delete mode 100644 Samples/CrowIDE/src/Editors/CodeBuffer/CodeLine.cs delete mode 100644 Samples/CrowIDE/src/Editors/CodeBuffer/Node.cs delete mode 100644 Samples/CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs delete mode 100644 Samples/CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs delete mode 100644 Samples/CrowIDE/src/Editors/CodeBuffer/TextEditor.cs delete mode 100644 Samples/CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs delete mode 100644 Samples/CrowIDE/src/Editors/CodeBuffer/Token.cs delete mode 100644 Samples/CrowIDE/src/Editors/EditPane.cs delete mode 100644 Samples/CrowIDE/src/Editors/Editor.cs delete mode 100644 Samples/CrowIDE/src/Editors/ImlSchematicEditor.cs delete mode 100644 Samples/CrowIDE/src/Editors/ImlVisualEditor.cs delete mode 100644 Samples/CrowIDE/src/Editors/Parsers/BufferParser.cs delete mode 100644 Samples/CrowIDE/src/Editors/Parsers/CSharpParser.cs delete mode 100644 Samples/CrowIDE/src/Editors/Parsers/StyleParser.cs delete mode 100644 Samples/CrowIDE/src/Editors/Parsers/XMLParser.cs delete mode 100644 Samples/CrowIDE/src/Editors/Parsers2/Tokenizer.cs delete mode 100644 Samples/CrowIDE/src/Editors/SourceEditor.cs delete mode 100644 Samples/CrowIDE/src/Editors/SvgEditor.cs delete mode 100644 Samples/CrowIDE/src/Extensions.cs delete mode 100644 Samples/CrowIDE/src/GraphicObjectDesignContainer.cs delete mode 100644 Samples/CrowIDE/src/INetProject.cs delete mode 100644 Samples/CrowIDE/src/MemberView/CategoryContainer.cs delete mode 100644 Samples/CrowIDE/src/MemberView/MembersView.cs delete mode 100644 Samples/CrowIDE/src/MemberView/PropertyContainer.cs delete mode 100644 Samples/CrowIDE/src/Project.cs delete mode 100644 Samples/CrowIDE/src/ProjectTree/CSProjectFile.cs delete mode 100644 Samples/CrowIDE/src/ProjectTree/ImlProjectItem.cs delete mode 100644 Samples/CrowIDE/src/ProjectTree/ProjectFile.cs delete mode 100644 Samples/CrowIDE/src/ProjectTree/ProjectItem.cs delete mode 100644 Samples/CrowIDE/src/ProjectTree/ProjectNodes.cs delete mode 100644 Samples/CrowIDE/src/ProjectTree/ProjectReference.cs delete mode 100644 Samples/CrowIDE/src/ProjectTree/StyleProjectItem.cs delete mode 100644 Samples/CrowIDE/src/Solution.cs delete mode 100644 Samples/CrowIDE/src/SolutionControler.cs delete mode 100644 Samples/CrowIDE/src/VerticalLine.cs delete mode 100644 Samples/CrowIDE/ui/CategoryExp.template delete mode 100644 Samples/CrowIDE/ui/CrowIDE.crow delete mode 100644 Samples/CrowIDE/ui/DockWindows/GTreeExpITemp.crow delete mode 100644 Samples/CrowIDE/ui/DockWindows/WinSchemaItem.template delete mode 100644 Samples/CrowIDE/ui/DockWindows/toolboxBut.template delete mode 100644 Samples/CrowIDE/ui/DockWindows/winDesign.crow delete mode 100644 Samples/CrowIDE/ui/DockWindows/winEditor.crow delete mode 100644 Samples/CrowIDE/ui/DockWindows/winErrors.crow delete mode 100644 Samples/CrowIDE/ui/DockWindows/winGTExplorer.crow delete mode 100644 Samples/CrowIDE/ui/DockWindows/winProperties.crow delete mode 100644 Samples/CrowIDE/ui/DockWindows/winSchema.crow delete mode 100644 Samples/CrowIDE/ui/DockWindows/winSolution.crow delete mode 100644 Samples/CrowIDE/ui/DockWindows/winStyleView.crow delete mode 100644 Samples/CrowIDE/ui/DockWindows/winToolbox.crow delete mode 100644 Samples/CrowIDE/ui/IcoBut.template delete mode 100644 Samples/CrowIDE/ui/ItemTemplates/Enum.template delete mode 100644 Samples/CrowIDE/ui/ItemTemplates/Fill.template delete mode 100644 Samples/CrowIDE/ui/LQIsExplorer.crow delete mode 100644 Samples/CrowIDE/ui/MemberView.crow delete mode 100644 Samples/CrowIDE/ui/MembersItem.template delete mode 100644 Samples/CrowIDE/ui/MembersView.template delete mode 100644 Samples/CrowIDE/ui/NewFile.crow delete mode 100644 Samples/CrowIDE/ui/Options.crow delete mode 100644 Samples/CrowIDE/ui/ProjectProperties.crow delete mode 100644 Samples/CrowIDE/ui/ProjectTree.template delete mode 100644 Samples/CrowIDE/ui/TreeExpandable.template delete mode 100644 Samples/CrowIDE/ui/editors/EditPane.template delete mode 100644 Samples/CrowIDE/ui/editors/EditPaneItems.template delete mode 100644 Samples/CrowIDE/ui/editors/EditTabItem.template delete mode 100644 Samples/CrowIDE/ui/editors/IMLEdit.itemp delete mode 100644 Samples/CrowIDE/ui/editors/SourceEditor.crow delete mode 100644 Samples/CrowIDE/ui/editors/SrcEdit.itemp delete mode 100644 Samples/CrowIDE/ui/editors/SvgEdit.itemp delete mode 100644 Samples/CrowIDE/ui/editors/TextEditor.crow delete mode 100644 Samples/CrowIDE/ui/test.crow diff --git a/Crow/Cursors/arrow b/Crow/Cursors/arrow new file mode 100644 index 0000000000000000000000000000000000000000..61f968efb0951f51adcd2215e54cec28fa914cb3 GIT binary patch literal 69120 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 thmma?2{$-C3CPJm0x@?mhQ+e!uVO<(~V! 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 literal 0 HcmV?d00001 diff --git a/Crow/Cursors/hand b/Crow/Cursors/hand new file mode 100644 index 0000000000000000000000000000000000000000..23939b7473de012201004de8c885a60e880c3035 GIT binary patch literal 69120 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 TNFcBEEZDGMuOOnRXcRP-m}u14VkNOR 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 Skd$wE=hghmy69F%3H(1W{7`WK literal 0 HcmV?d00001 diff --git a/Crow/Cursors/ibeam b/Crow/Cursors/ibeam new file mode 100644 index 0000000000000000000000000000000000000000..ccbdcb5c87d5348437b00cf3c0fb51a67d0e45c9 GIT binary patch literal 69120 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 BVzU4M literal 0 HcmV?d00001 diff --git a/Crow/Cursors/move b/Crow/Cursors/move new file mode 100644 index 0000000000000000000000000000000000000000..ab98f6a3263d293392e7ff5c47a27d4f25b1ba86 GIT binary patch literal 69120 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 literal 0 HcmV?d00001 diff --git a/Crow/Cursors/sb_h_double_arrow b/Crow/Cursors/sb_h_double_arrow new file mode 100644 index 0000000000000000000000000000000000000000..1768b6a0b633b7ba231c1f7a3478b2d7c8dd4155 GIT binary patch literal 69120 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 vRf&5@Xdsugfpw_$aFe~v literal 0 HcmV?d00001 diff --git a/Crow/Cursors/top_left_corner b/Crow/Cursors/top_left_corner new file mode 100644 index 0000000000000000000000000000000000000000..3493adc65014db24ddd2be45b844128f780e1666 GIT binary patch literal 69120 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îGmT-Svh3Fd%{d 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 DD+w8E literal 0 HcmV?d00001 diff --git a/Crow/src/XCursor.cs b/Crow/src/XCursor.cs new file mode 100644 index 00000000..1cca510e --- /dev/null +++ b/Crow/src/XCursor.cs @@ -0,0 +1,151 @@ +// +// XCursor.cs +// +// Author: +// Jean-Philippe Bruyère +// +// Copyright (c) 2013-2017 Jean-Philippe Bruyère +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using System.IO; +using System.Diagnostics; +using System.Collections.Generic; + +namespace Crow +{ + public class XCursorFile + { + const uint XC_TYPE_IMG = 0xfffd0002; + + class toc + { + public uint type; + public uint subtype; + public uint pos; + + public toc(BinaryReader sr) + { + type = sr.ReadUInt32(); + subtype = sr.ReadUInt32(); + pos = sr.ReadUInt32(); + } + } + + public List Cursors = new List(); + + + static XCursorFile loadFromStream(Stream s) + { + List tocList = new List (); + XCursorFile tmp = new XCursorFile (); + + using (BinaryReader sr = new BinaryReader (s)) { + byte[] data; + //magic: CARD32 ’Xcur’ (0x58, 0x63, 0x75, 0x72) + if (new string (sr.ReadChars (4)) != "Xcur") { + Debug.WriteLine ("XCursor Load error: Wrong magic"); + return null; + } + //header: CARD32 bytes in this header + uint headerLength = sr.ReadUInt32 (); + //version: CARD32 file version number + uint version = sr.ReadUInt32 (); + //ntoc: CARD32 number of toc entries + uint nbToc = sr.ReadUInt32 (); + //toc: LISTofTOC table of contents + for (uint i = 0; i < nbToc; i++) { + tocList.Add (new toc (sr)); + } + + foreach (toc t in tocList) { + if (t.type != XC_TYPE_IMG) + continue; + + sr.BaseStream.Seek (t.pos, SeekOrigin.Begin); + tmp.Cursors.Add(imageLoad (sr)); + } + } + return tmp; + } + + public static XCursorFile Load(Interface iface, string path) + { + return loadFromStream (iface.GetStreamFromPath (path)); + } + + static XCursor imageLoad(BinaryReader sr) + { + XCursor tmp = new XCursor(); + // header: 36 Image headers are 36 bytes + uint header = sr.ReadUInt32(); + // type: 0xfffd0002 Image type is 0xfffd0002 + uint type = sr.ReadUInt32(); + // subtype: CARD32 Image subtype is the nominal size + uint subtype = sr.ReadUInt32(); + // version: 1 + uint version = sr.ReadUInt32(); + // width: CARD32 Must be less than or equal to 0x7fff + tmp.Width = sr.ReadUInt32(); + // height: CARD32 Must be less than or equal to 0x7fff + tmp.Height = sr.ReadUInt32(); + // xhot: CARD32 Must be less than or equal to width + tmp.Xhot = sr.ReadUInt32(); + // yhot: CARD32 Must be less than or equal to height + tmp.Yhot = sr.ReadUInt32(); + // delay: CARD32 Delay between animation frames in milliseconds + tmp.Delay = sr.ReadUInt32(); + // pixels: LISTofCARD32 Packed ARGB format pixels + tmp.data = sr.ReadBytes((int)(tmp.Width * tmp.Height * 4)); + return tmp; + } + } + public class XCursor + { + public static XCursor Default; + public static XCursor Cross; + public static XCursor Arrow; + public static XCursor Text; + public static XCursor SW; + public static XCursor SE; + public static XCursor NW; + public static XCursor NE; + public static XCursor N; + public static XCursor S; + public static XCursor V; + public static XCursor H; + + public uint Width; + public uint Height; + public uint Xhot; + public uint Yhot; + public uint Delay; + public byte[] data; + + public XCursor () + { + } +// public static implicit operator MouseCursor(XCursor xc) +// { +// return new MouseCursor((int)xc.Xhot, (int)xc.Yhot, (int)xc.Width, (int)xc.Height,xc.data); +// } + } +} + diff --git a/Samples/CrowIDE/CrowIDE.csproj b/Samples/CrowIDE/CrowIDE.csproj deleted file mode 100644 index 6670a8ed..00000000 --- a/Samples/CrowIDE/CrowIDE.csproj +++ /dev/null @@ -1,47 +0,0 @@ - - - - net472 - net472 - Exe - Crow.Coding.CrowIDE - $(SolutionDir)build\$(Configuration)\ - $(SolutionDir)build\obj\$(Configuration) - false - false - 0.8.0 - - - - full - true - TRACE;DEBUG - - - - - - - - - - - - - - CrowIDE.icons.%(Filename)%(Extension) - - - - - Crow.Coding.%(Filename).template - - - Crow.%(Filename).template - - - - - - - diff --git a/Samples/CrowIDE/CrowIDE.userprefs b/Samples/CrowIDE/CrowIDE.userprefs deleted file mode 100644 index 0f4ab212..00000000 --- a/Samples/CrowIDE/CrowIDE.userprefs +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Samples/CrowIDE/DefaultTemplateOverrides/ContextMenu.template b/Samples/CrowIDE/DefaultTemplateOverrides/ContextMenu.template deleted file mode 100644 index 38e6b7bf..00000000 --- a/Samples/CrowIDE/DefaultTemplateOverrides/ContextMenu.template +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - diff --git a/Samples/CrowIDE/DefaultTemplateOverrides/MenuItem.template b/Samples/CrowIDE/DefaultTemplateOverrides/MenuItem.template deleted file mode 100644 index 2ed8496a..00000000 --- a/Samples/CrowIDE/DefaultTemplateOverrides/MenuItem.template +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/DefaultTemplateOverrides/TabItem.template b/Samples/CrowIDE/DefaultTemplateOverrides/TabItem.template deleted file mode 100644 index c07119b8..00000000 --- a/Samples/CrowIDE/DefaultTemplateOverrides/TabItem.template +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/IDE.style b/Samples/CrowIDE/IDE.style deleted file mode 100644 index 5b5054ab..00000000 --- a/Samples/CrowIDE/IDE.style +++ /dev/null @@ -1,64 +0,0 @@ -Label { - Foreground="Black"; -} -icon { - Width="14"; - Height="14"; -} -MemberViewLabel { - Margin="1"; - Height="Fit"; - Width="50%"; - Background="White"; -} -MemberViewHStack { - Focusable="true"; - Height="Fit"; - Spacing="1"; - MouseEnter="{Background=SteelBlue}"; - MouseLeave="{Background=Transparent}"; -} - -IcoBut { - Template = "#Crow.Coding.IcoBut.template"; - MinimumSize = "10,10"; - Width = "8"; - Height = "14"; - Background = "Black"; -} - -WinSchema { - Template="#Crow.Coding.ui.DockWindows.WinSchemaItem.template"; - Focusable = "true"; - MinimumSize="150,50"; - Width = "Fit"; - Height = "Fit"; -} -TabItem { - AllowDrag="false"; - Background="Grey"; - SelectedBackground="0.9,0.9,0.91,1.0"; - Foreground="Black"; -} -TreeItemBorder { - CornerRadius="2"; - Margin="0"; - //Focusable="true"; - Height="Fit"; - Width="Stretched"; - Foreground="Transparent"; - MouseEnter="{Foreground=DimGrey}"; - MouseLeave="{Foreground=Transparent}"; -} -TreeIcon { - Margin="0"; - Width="14"; - Height="14"; -} -Splitter { - Thickness="1"; - Background="RoyalBlue"; -} -DockWindow { - Background="0.98,0.98,0.99,0.9"; -} diff --git a/Samples/CrowIDE/icons/basic_floppydisk.svg b/Samples/CrowIDE/icons/basic_floppydisk.svg deleted file mode 100644 index 55d901d4..00000000 --- a/Samples/CrowIDE/icons/basic_floppydisk.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/binding.svg b/Samples/CrowIDE/icons/binding.svg deleted file mode 100644 index 04f669ec..00000000 --- a/Samples/CrowIDE/icons/binding.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/blank-file.svg b/Samples/CrowIDE/icons/blank-file.svg deleted file mode 100644 index 5880a3ab..00000000 --- a/Samples/CrowIDE/icons/blank-file.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/center-align.svg b/Samples/CrowIDE/icons/center-align.svg deleted file mode 100644 index 92e3fac8..00000000 --- a/Samples/CrowIDE/icons/center-align.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Samples/CrowIDE/icons/cogwheel.svg b/Samples/CrowIDE/icons/cogwheel.svg deleted file mode 100644 index c104c470..00000000 --- a/Samples/CrowIDE/icons/cogwheel.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/compile.svg b/Samples/CrowIDE/icons/compile.svg deleted file mode 100644 index c1a14e77..00000000 --- a/Samples/CrowIDE/icons/compile.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Samples/CrowIDE/icons/copy-file.svg b/Samples/CrowIDE/icons/copy-file.svg deleted file mode 100644 index 63c2dd37..00000000 --- a/Samples/CrowIDE/icons/copy-file.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/cs-file.svg b/Samples/CrowIDE/icons/cs-file.svg deleted file mode 100644 index 5ddb69a3..00000000 --- a/Samples/CrowIDE/icons/cs-file.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Layer 1 - - - c - # - - \ No newline at end of file diff --git a/Samples/CrowIDE/icons/curly-brackets.svg b/Samples/CrowIDE/icons/curly-brackets.svg deleted file mode 100644 index 89ef798c..00000000 --- a/Samples/CrowIDE/icons/curly-brackets.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/drawsvg.svg b/Samples/CrowIDE/icons/drawsvg.svg deleted file mode 100644 index 36ef290e..00000000 --- a/Samples/CrowIDE/icons/drawsvg.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Samples/CrowIDE/icons/edit.svg b/Samples/CrowIDE/icons/edit.svg deleted file mode 100644 index 73569d8d..00000000 --- a/Samples/CrowIDE/icons/edit.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/eraser.svg b/Samples/CrowIDE/icons/eraser.svg deleted file mode 100644 index 5dd73bac..00000000 --- a/Samples/CrowIDE/icons/eraser.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/expand-arrows-1.svg b/Samples/CrowIDE/icons/expand-arrows-1.svg deleted file mode 100644 index 5a77b1d1..00000000 --- a/Samples/CrowIDE/icons/expand-arrows-1.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Samples/CrowIDE/icons/file-code.svg b/Samples/CrowIDE/icons/file-code.svg deleted file mode 100644 index 2dc00db0..00000000 --- a/Samples/CrowIDE/icons/file-code.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Samples/CrowIDE/icons/file.svg b/Samples/CrowIDE/icons/file.svg deleted file mode 100644 index 9d06b00b..00000000 --- a/Samples/CrowIDE/icons/file.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/font-file.svg b/Samples/CrowIDE/icons/font-file.svg deleted file mode 100644 index 20beac14..00000000 --- a/Samples/CrowIDE/icons/font-file.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/light-bulb.svg b/Samples/CrowIDE/icons/light-bulb.svg deleted file mode 100644 index 4193a750..00000000 --- a/Samples/CrowIDE/icons/light-bulb.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/magic-wand.svg b/Samples/CrowIDE/icons/magic-wand.svg deleted file mode 100644 index 8b406918..00000000 --- a/Samples/CrowIDE/icons/magic-wand.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/magnet.svg b/Samples/CrowIDE/icons/magnet.svg deleted file mode 100644 index 10335f69..00000000 --- a/Samples/CrowIDE/icons/magnet.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/move-arrows.svg b/Samples/CrowIDE/icons/move-arrows.svg deleted file mode 100644 index ecbb2f91..00000000 --- a/Samples/CrowIDE/icons/move-arrows.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/open-folder-1.svg b/Samples/CrowIDE/icons/open-folder-1.svg deleted file mode 100644 index 90294692..00000000 --- a/Samples/CrowIDE/icons/open-folder-1.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/open.svg b/Samples/CrowIDE/icons/open.svg deleted file mode 100644 index bd8d7d9b..00000000 --- a/Samples/CrowIDE/icons/open.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/paint-brush.svg b/Samples/CrowIDE/icons/paint-brush.svg deleted file mode 100644 index 2bdd5bed..00000000 --- a/Samples/CrowIDE/icons/paint-brush.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/palette.svg b/Samples/CrowIDE/icons/palette.svg deleted file mode 100644 index 8e425f70..00000000 --- a/Samples/CrowIDE/icons/palette.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/paragraph.svg b/Samples/CrowIDE/icons/paragraph.svg deleted file mode 100644 index 826aa63f..00000000 --- a/Samples/CrowIDE/icons/paragraph.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/paste-on-document.svg b/Samples/CrowIDE/icons/paste-on-document.svg deleted file mode 100644 index b0a705ee..00000000 --- a/Samples/CrowIDE/icons/paste-on-document.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/pin.svg b/Samples/CrowIDE/icons/pin.svg deleted file mode 100644 index b36340b8..00000000 --- a/Samples/CrowIDE/icons/pin.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/previous.svg b/Samples/CrowIDE/icons/previous.svg deleted file mode 100644 index 566c8a3e..00000000 --- a/Samples/CrowIDE/icons/previous.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/question.svg b/Samples/CrowIDE/icons/question.svg deleted file mode 100644 index fb8e3d3f..00000000 --- a/Samples/CrowIDE/icons/question.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/redo.svg b/Samples/CrowIDE/icons/redo.svg deleted file mode 100644 index 59fcc904..00000000 --- a/Samples/CrowIDE/icons/redo.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/reply.svg b/Samples/CrowIDE/icons/reply.svg deleted file mode 100644 index d008cb34..00000000 --- a/Samples/CrowIDE/icons/reply.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/save.svg b/Samples/CrowIDE/icons/save.svg deleted file mode 100644 index 6aa6714e..00000000 --- a/Samples/CrowIDE/icons/save.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/scissors.svg b/Samples/CrowIDE/icons/scissors.svg deleted file mode 100644 index 4b5a2255..00000000 --- a/Samples/CrowIDE/icons/scissors.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/search.svg b/Samples/CrowIDE/icons/search.svg deleted file mode 100644 index 4a931b35..00000000 --- a/Samples/CrowIDE/icons/search.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/share-arrow.svg b/Samples/CrowIDE/icons/share-arrow.svg deleted file mode 100644 index e0eb2462..00000000 --- a/Samples/CrowIDE/icons/share-arrow.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/sign-out.svg b/Samples/CrowIDE/icons/sign-out.svg deleted file mode 100644 index c5951fc0..00000000 --- a/Samples/CrowIDE/icons/sign-out.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/text-file.svg b/Samples/CrowIDE/icons/text-file.svg deleted file mode 100644 index eafca90c..00000000 --- a/Samples/CrowIDE/icons/text-file.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Samples/CrowIDE/icons/text-label.svg b/Samples/CrowIDE/icons/text-label.svg deleted file mode 100644 index 8fa91967..00000000 --- a/Samples/CrowIDE/icons/text-label.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Border.svg b/Samples/CrowIDE/icons/toolbox/Crow.Border.svg deleted file mode 100644 index 09eb7ac7..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Border.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Button.svg b/Samples/CrowIDE/icons/toolbox/Crow.Button.svg deleted file mode 100644 index 01f5c6c3..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Button.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.CheckBox.svg b/Samples/CrowIDE/icons/toolbox/Crow.CheckBox.svg deleted file mode 100644 index 2f0b0834..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.CheckBox.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.ColorPicker.svg b/Samples/CrowIDE/icons/toolbox/Crow.ColorPicker.svg deleted file mode 100644 index 517a26a9..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.ColorPicker.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.ComboBox.svg b/Samples/CrowIDE/icons/toolbox/Crow.ComboBox.svg deleted file mode 100644 index 1cb88fa2..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.ComboBox.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Container.svg b/Samples/CrowIDE/icons/toolbox/Crow.Container.svg deleted file mode 100644 index d7d1dc8a..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Container.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.DirectoryView.svg b/Samples/CrowIDE/icons/toolbox/Crow.DirectoryView.svg deleted file mode 100644 index 90294692..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.DirectoryView.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Docker.svg b/Samples/CrowIDE/icons/toolbox/Crow.Docker.svg deleted file mode 100644 index e38a283e..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Docker.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Expandable.svg b/Samples/CrowIDE/icons/toolbox/Crow.Expandable.svg deleted file mode 100644 index 1c56d56d..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Expandable.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.FileDialog.svg b/Samples/CrowIDE/icons/toolbox/Crow.FileDialog.svg deleted file mode 100644 index 25142ea0..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.FileDialog.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Grid.svg b/Samples/CrowIDE/icons/toolbox/Crow.Grid.svg deleted file mode 100644 index 6151f971..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Grid.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Group.svg b/Samples/CrowIDE/icons/toolbox/Crow.Group.svg deleted file mode 100644 index eae67f63..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Group.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.GroupBox.svg b/Samples/CrowIDE/icons/toolbox/Crow.GroupBox.svg deleted file mode 100644 index e4697799..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.GroupBox.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.HorizontalStack.svg b/Samples/CrowIDE/icons/toolbox/Crow.HorizontalStack.svg deleted file mode 100644 index f8e70257..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.HorizontalStack.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.IMLContainer.svg b/Samples/CrowIDE/icons/toolbox/Crow.IMLContainer.svg deleted file mode 100644 index b5687bac..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.IMLContainer.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Image.svg b/Samples/CrowIDE/icons/toolbox/Crow.Image.svg deleted file mode 100644 index 11356c0e..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Image.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Label.svg b/Samples/CrowIDE/icons/toolbox/Crow.Label.svg deleted file mode 100644 index 65bb85b7..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Label.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.ListBox.svg b/Samples/CrowIDE/icons/toolbox/Crow.ListBox.svg deleted file mode 100644 index 40d16734..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.ListBox.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Menu.svg b/Samples/CrowIDE/icons/toolbox/Crow.Menu.svg deleted file mode 100644 index b6b21119..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Menu.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.MenuItem.svg b/Samples/CrowIDE/icons/toolbox/Crow.MenuItem.svg deleted file mode 100644 index c8bd8470..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.MenuItem.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.MessageBox.svg b/Samples/CrowIDE/icons/toolbox/Crow.MessageBox.svg deleted file mode 100644 index 16ebd72c..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.MessageBox.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.ProgressBar.svg b/Samples/CrowIDE/icons/toolbox/Crow.ProgressBar.svg deleted file mode 100644 index 884f1854..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.ProgressBar.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.RadioButton.svg b/Samples/CrowIDE/icons/toolbox/Crow.RadioButton.svg deleted file mode 100644 index 6c33e84b..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.RadioButton.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.ScrollBar.svg b/Samples/CrowIDE/icons/toolbox/Crow.ScrollBar.svg deleted file mode 100644 index 91a1f847..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.ScrollBar.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Scroller.svg b/Samples/CrowIDE/icons/toolbox/Crow.Scroller.svg deleted file mode 100644 index bbc97197..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Scroller.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Shape.svg b/Samples/CrowIDE/icons/toolbox/Crow.Shape.svg deleted file mode 100644 index de5dd372..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Shape.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Slider.svg b/Samples/CrowIDE/icons/toolbox/Crow.Slider.svg deleted file mode 100644 index fe41c2ba..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Slider.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Spinner.svg b/Samples/CrowIDE/icons/toolbox/Crow.Spinner.svg deleted file mode 100644 index 5fa848ac..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Spinner.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Splitter.svg b/Samples/CrowIDE/icons/toolbox/Crow.Splitter.svg deleted file mode 100644 index 9fcd9dd7..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Splitter.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.TabItem.svg b/Samples/CrowIDE/icons/toolbox/Crow.TabItem.svg deleted file mode 100644 index a9aaed33..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.TabItem.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.TabView.svg b/Samples/CrowIDE/icons/toolbox/Crow.TabView.svg deleted file mode 100644 index 942358b4..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.TabView.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.TemplatedContainer.svg b/Samples/CrowIDE/icons/toolbox/Crow.TemplatedContainer.svg deleted file mode 100644 index 34a0aa26..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.TemplatedContainer.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.TemplatedGroup.svg b/Samples/CrowIDE/icons/toolbox/Crow.TemplatedGroup.svg deleted file mode 100644 index 14ea6f37..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.TemplatedGroup.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.TextBox.svg b/Samples/CrowIDE/icons/toolbox/Crow.TextBox.svg deleted file mode 100644 index c1fc2bb2..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.TextBox.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.TreeView.svg b/Samples/CrowIDE/icons/toolbox/Crow.TreeView.svg deleted file mode 100644 index b863291b..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.TreeView.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.VerticalStack.svg b/Samples/CrowIDE/icons/toolbox/Crow.VerticalStack.svg deleted file mode 100644 index c3c3ec9c..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.VerticalStack.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Window.svg b/Samples/CrowIDE/icons/toolbox/Crow.Window.svg deleted file mode 100644 index 74b0a24b..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Window.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/Crow.Wrapper.svg b/Samples/CrowIDE/icons/toolbox/Crow.Wrapper.svg deleted file mode 100644 index 9e69e415..00000000 --- a/Samples/CrowIDE/icons/toolbox/Crow.Wrapper.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/bar-chart.svg b/Samples/CrowIDE/icons/toolbox/bar-chart.svg deleted file mode 100644 index ff86c961..00000000 --- a/Samples/CrowIDE/icons/toolbox/bar-chart.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/bar-menu.svg b/Samples/CrowIDE/icons/toolbox/bar-menu.svg deleted file mode 100644 index 87ec0610..00000000 --- a/Samples/CrowIDE/icons/toolbox/bar-menu.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/bullets.svg b/Samples/CrowIDE/icons/toolbox/bullets.svg deleted file mode 100644 index 81fb1f06..00000000 --- a/Samples/CrowIDE/icons/toolbox/bullets.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/calendar.svg b/Samples/CrowIDE/icons/toolbox/calendar.svg deleted file mode 100644 index 9ceaa1ea..00000000 --- a/Samples/CrowIDE/icons/toolbox/calendar.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/check-square-1.svg b/Samples/CrowIDE/icons/toolbox/check-square-1.svg deleted file mode 100644 index e198007c..00000000 --- a/Samples/CrowIDE/icons/toolbox/check-square-1.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/database.svg b/Samples/CrowIDE/icons/toolbox/database.svg deleted file mode 100644 index 65a8f065..00000000 --- a/Samples/CrowIDE/icons/toolbox/database.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/ellipsis.svg b/Samples/CrowIDE/icons/toolbox/ellipsis.svg deleted file mode 100644 index cff94ccf..00000000 --- a/Samples/CrowIDE/icons/toolbox/ellipsis.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/exclamation-circle-1.svg b/Samples/CrowIDE/icons/toolbox/exclamation-circle-1.svg deleted file mode 100644 index cc1b2689..00000000 --- a/Samples/CrowIDE/icons/toolbox/exclamation-circle-1.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/exclamation-circle.svg b/Samples/CrowIDE/icons/toolbox/exclamation-circle.svg deleted file mode 100644 index b140e7c8..00000000 --- a/Samples/CrowIDE/icons/toolbox/exclamation-circle.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/file-code.svg b/Samples/CrowIDE/icons/toolbox/file-code.svg deleted file mode 100644 index a2fd2d19..00000000 --- a/Samples/CrowIDE/icons/toolbox/file-code.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/grab.svg b/Samples/CrowIDE/icons/toolbox/grab.svg deleted file mode 100644 index 25bc5719..00000000 --- a/Samples/CrowIDE/icons/toolbox/grab.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/hard-drive-1.svg b/Samples/CrowIDE/icons/toolbox/hard-drive-1.svg deleted file mode 100644 index a71a5248..00000000 --- a/Samples/CrowIDE/icons/toolbox/hard-drive-1.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/hash.svg b/Samples/CrowIDE/icons/toolbox/hash.svg deleted file mode 100644 index 82196fbc..00000000 --- a/Samples/CrowIDE/icons/toolbox/hash.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/info.svg b/Samples/CrowIDE/icons/toolbox/info.svg deleted file mode 100644 index a8c90f4c..00000000 --- a/Samples/CrowIDE/icons/toolbox/info.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/layout.svg b/Samples/CrowIDE/icons/toolbox/layout.svg deleted file mode 100644 index 3d59d765..00000000 --- a/Samples/CrowIDE/icons/toolbox/layout.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/line-list.svg b/Samples/CrowIDE/icons/toolbox/line-list.svg deleted file mode 100644 index ec15f7b8..00000000 --- a/Samples/CrowIDE/icons/toolbox/line-list.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/list.svg b/Samples/CrowIDE/icons/toolbox/list.svg deleted file mode 100644 index 9aad88fa..00000000 --- a/Samples/CrowIDE/icons/toolbox/list.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/modal-list.svg b/Samples/CrowIDE/icons/toolbox/modal-list.svg deleted file mode 100644 index f1d8f70b..00000000 --- a/Samples/CrowIDE/icons/toolbox/modal-list.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/options.svg b/Samples/CrowIDE/icons/toolbox/options.svg deleted file mode 100644 index a56f6bed..00000000 --- a/Samples/CrowIDE/icons/toolbox/options.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/package.svg b/Samples/CrowIDE/icons/toolbox/package.svg deleted file mode 100644 index 07f8b37e..00000000 --- a/Samples/CrowIDE/icons/toolbox/package.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/padding.svg b/Samples/CrowIDE/icons/toolbox/padding.svg deleted file mode 100644 index d93b2464..00000000 --- a/Samples/CrowIDE/icons/toolbox/padding.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/picture-file.svg b/Samples/CrowIDE/icons/toolbox/picture-file.svg deleted file mode 100644 index c45a6ad2..00000000 --- a/Samples/CrowIDE/icons/toolbox/picture-file.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/pointer.svg b/Samples/CrowIDE/icons/toolbox/pointer.svg deleted file mode 100644 index 605c0e28..00000000 --- a/Samples/CrowIDE/icons/toolbox/pointer.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/puzzle-piece.svg b/Samples/CrowIDE/icons/toolbox/puzzle-piece.svg deleted file mode 100644 index b09c47e4..00000000 --- a/Samples/CrowIDE/icons/toolbox/puzzle-piece.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/refresh-file.svg b/Samples/CrowIDE/icons/toolbox/refresh-file.svg deleted file mode 100644 index 248e4203..00000000 --- a/Samples/CrowIDE/icons/toolbox/refresh-file.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/sliders.svg b/Samples/CrowIDE/icons/toolbox/sliders.svg deleted file mode 100644 index 81f72d18..00000000 --- a/Samples/CrowIDE/icons/toolbox/sliders.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/split-browser-1.svg b/Samples/CrowIDE/icons/toolbox/split-browser-1.svg deleted file mode 100644 index 4dfd93a3..00000000 --- a/Samples/CrowIDE/icons/toolbox/split-browser-1.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/table.svg b/Samples/CrowIDE/icons/toolbox/table.svg deleted file mode 100644 index 0b421224..00000000 --- a/Samples/CrowIDE/icons/toolbox/table.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/tasks.svg b/Samples/CrowIDE/icons/toolbox/tasks.svg deleted file mode 100644 index 8793c884..00000000 --- a/Samples/CrowIDE/icons/toolbox/tasks.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/Samples/CrowIDE/icons/toolbox/warning.svg b/Samples/CrowIDE/icons/toolbox/warning.svg deleted file mode 100644 index f5a25735..00000000 --- a/Samples/CrowIDE/icons/toolbox/warning.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/tools.svg b/Samples/CrowIDE/icons/tools.svg deleted file mode 100644 index 5326f199..00000000 --- a/Samples/CrowIDE/icons/tools.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Samples/CrowIDE/icons/trash.svg b/Samples/CrowIDE/icons/trash.svg deleted file mode 100644 index e73a5e33..00000000 --- a/Samples/CrowIDE/icons/trash.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/undo.svg b/Samples/CrowIDE/icons/undo.svg deleted file mode 100644 index f78f1349..00000000 --- a/Samples/CrowIDE/icons/undo.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Samples/CrowIDE/icons/xml-file.svg b/Samples/CrowIDE/icons/xml-file.svg deleted file mode 100644 index 04204353..00000000 --- a/Samples/CrowIDE/icons/xml-file.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - -</> - \ No newline at end of file diff --git a/Samples/CrowIDE/icons/zoom-in.svg b/Samples/CrowIDE/icons/zoom-in.svg deleted file mode 100644 index 60c41d14..00000000 --- a/Samples/CrowIDE/icons/zoom-in.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/icons/zoom-out.svg b/Samples/CrowIDE/icons/zoom-out.svg deleted file mode 100644 index bd4eec3a..00000000 --- a/Samples/CrowIDE/icons/zoom-out.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/CrowIDE/images/save.svg b/Samples/CrowIDE/images/save.svg deleted file mode 100644 index 7bdc5518..00000000 --- a/Samples/CrowIDE/images/save.svg +++ /dev/null @@ -1,3421 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Samples/CrowIDE/src/CrowIDE.cs b/Samples/CrowIDE/src/CrowIDE.cs deleted file mode 100644 index 1b6ed151..00000000 --- a/Samples/CrowIDE/src/CrowIDE.cs +++ /dev/null @@ -1,289 +0,0 @@ -// -// HelloCube.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2016 jp -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -using System; -using System.IO; -using Crow; - -namespace Crow.Coding -{ - class CrowIDE : CrowVkWin - { - static void Main (string [] args) - { - using (CrowIDE app = new CrowIDE ()) { - app.initIde (); - app.reloadWinConfigs (); - app.Run (); - app.saveWinConfigs (); - } - } - - protected override void onLoad () - { - - } - public Command CMDNew, CMDOpen, CMDSave, CMDSaveAs, cmdCloseSolution, CMDQuit, - CMDUndo, CMDRedo, CMDCut, CMDCopy, CMDPaste, CMDHelp, - CMDAbout, CMDOptions, - CMDViewGTExp, CMDViewProps, CMDViewProj, CMDViewProjProps, CMDViewErrors, CMDViewSolution, CMDViewEditor, CMDViewProperties, - CMDViewToolbox, CMDViewSchema, CMDViewStyling,CMDViewDesign, - CMDCompile; - - void initCommands () { - CMDNew = new Command(new Action(() => newFile())) { Caption = "New", Icon = new SvgPicture("#CrowIDE.icons.blank-file.svg"), CanExecute = true}; - CMDOpen = new Command(new Action(() => openFileDialog())) { Caption = "Open...", Icon = new SvgPicture("#CrowIDE.icons.open.svg") }; - CMDSave = new Command(new Action(() => saveFileDialog())) { Caption = "Save", Icon = new SvgPicture("#CrowIDE.icons.save.svg"), CanExecute = false}; - CMDSaveAs = new Command(new Action(() => saveFileDialog())) { Caption = "Save As...", Icon = new SvgPicture("#CrowIDE.icons.save.svg"), CanExecute = false}; - //CMDQuit = new Command(new Action(() => running = false)) { Caption = "Quit", Icon = new SvgPicture("#CrowIDE.icons.sign-out.svg") }; - CMDUndo = new Command(new Action(() => undo())) { Caption = "Undo", Icon = new SvgPicture("#CrowIDE.icons.undo.svg"), CanExecute = false}; - CMDRedo = new Command(new Action(() => redo())) { Caption = "Redo", Icon = new SvgPicture("#CrowIDE.icons.redo.svg"), CanExecute = false}; - //CMDCut = new Command(new Action(() => Quit (null, null))) { Caption = "Cut", Icon = new SvgPicture("#CrowIDE.icons.scissors.svg"), CanExecute = false}; - //CMDCopy = new Command(new Action(() => Quit (null, null))) { Caption = "Copy", Icon = new SvgPicture("#CrowIDE.icons.copy-file.svg"), CanExecute = false}; - //CMDPaste = new Command(new Action(() => Quit (null, null))) { Caption = "Paste", Icon = new SvgPicture("#CrowIDE.icons.paste-on-document.svg"), CanExecute = false}; - CMDHelp = new Command(new Action(() => System.Diagnostics.Debug.WriteLine("help"))) { Caption = "Help", Icon = new SvgPicture("#CrowIDE.icons.question.svg") }; - CMDOptions = new Command(new Action(() => loadWindow("#CrowIDE.ui.Options.crow"))) { Caption = "Editor Options", Icon = new SvgPicture("#CrowIDE.icons.tools.svg") }; - - cmdCloseSolution = new Command(new Action(() => closeSolution())) - { Caption = "Close Solution", Icon = new SvgPicture("#CrowIDE.icons.paste-on-document.svg"), CanExecute = false}; - - CMDViewErrors = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winErrors.crow",this))) - { Caption = "Errors pane"}; - CMDViewSolution = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winSolution.crow",this))) - { Caption = "Solution Tree", CanExecute = false}; - CMDViewEditor = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winEditor.crow",this))) - { Caption = "Editor Pane"}; - CMDViewProperties = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winProperties.crow",this))) - { Caption = "Properties"}; - CMDViewDesign = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winDesign.crow",this))) - { Caption = "Quick Design", CanExecute = true}; - CMDViewToolbox = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winToolbox.crow",this))) - { Caption = "Toolbox", CanExecute = false}; - CMDViewSchema = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winSchema.crow",this))) - { Caption = "IML Shematic View", CanExecute = true}; - CMDViewStyling = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winStyleView.crow",this))) - { Caption = "Styling Explorer", CanExecute = true}; - - CMDViewGTExp = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winGTExplorer.crow",this))) - { Caption = "Graphic Tree Explorer", CanExecute = true}; - CMDCompile = new Command(new Action(() => compileSolution())) - { Caption = "Compile", CanExecute = false}; - CMDViewProjProps = new Command(new Action(loadProjProps)) - { Caption = "Project Properties", CanExecute = false}; - } - - void openFileDialog () { - crow.AddWidget (instFileDlg.CreateInstance()).DataSource = this; - } - void openOptionsDialog(){} - void newFile() { - currentSolution.OpenedItems.AddElement(new ProjectFile()); - } - void saveFileDialog() {} - void undo() {} - void redo() {} - void closeSolution (){ - if (currentSolution != null) - currentSolution.CloseSolution (); - CurrentSolution = null; - } - - public void saveWinConfigs() { - Configuration.Global.Set ("WinConfigs", mainDock.ExportConfig ()); - Configuration.Global.Save (); - } - public void reloadWinConfigs() { - string conf = Configuration.Global.Get("WinConfigs"); - if (string.IsNullOrEmpty (conf)) - return; - mainDock.ImportConfig (conf, this); - } - - - static void App_KeyboardKeyDown (object sender, KeyEventArgs e) - { - Console.WriteLine((byte)e.Key); - //#if DEBUG_LOG - /*switch (e.Key) { - case Key.F2: - DebugLog.save (app); - break; - }*/ - //#endif - } - - - - IML.Instantiator instFileDlg; - Solution currentSolution; - Project currentProject; - DockStack mainDock; - - public static Interface MainIFace; - public static CrowIDE MainWin; - - void initIde() { - - initCommands (); - - Widget go = crow.Load (@"#CrowIDE.ui.CrowIDE.crow"); - go.DataSource = this; - - mainDock = go.FindByName ("mainDock") as DockStack; - ReopenLastSolution = false; - if (ReopenLastSolution && !string.IsNullOrEmpty (LastOpenSolution)) { - CurrentSolution = Solution.LoadSolution (LastOpenSolution); - //lock(MainIFace.UpdateMutex) - CurrentSolution.ReopenItemsSavedInUserConfig (); - } - - instFileDlg = IML.Instantiator.CreateFromImlFragment - (MainIFace, ""); - - /*DockWindow dw = loadWindow ("#CrowIDE.ui.DockWindows.winEditor.crow", this) as DockWindow; - dw.DockingPosition = Alignment.Center; - dw.Dock (mainDock); - dw = loadWindow ("#CrowIDE.ui.DockWindows.winSolution.crow", this) as DockWindow; - dw.DockingPosition = Alignment.Right; - dw.Dock (mainDock); - dw = loadWindow ("#CrowIDE.ui.DockWindows.winToolbox.crow", this) as DockWindow; - dw.DockingPosition = Alignment.Left; - dw.Dock (mainDock);*/ - - //Console.WriteLine (); - } - - void loadProjProps () { - loadWindow ("#CrowIDE.ui.ProjectProperties.crow"); - } - void compileSolution () { - //ProjectItem pi = CurrentSolution.SelectedItem; - Project p = CurrentSolution?.Projects[1]; - if (p == null) - return; - p.Compile (); - } - - public string CurrentDirectory { - get { return Crow.Configuration.Global.Get("CurrentDirectory");} - set { - Crow.Configuration.Global.Set ("CurrentDirectory", value); - } - } - public Solution CurrentSolution { - get { return currentSolution; } - set { - if (currentSolution == value) - return; - - currentSolution = value; - - CMDCompile.CanExecute = (currentSolution != null); - cmdCloseSolution.CanExecute = (currentSolution != null); - CMDViewSolution.CanExecute = (currentSolution != null); - - lock (MainIFace) { - NotifyValueChanged ("CurrentSolution", currentSolution); - } - } - } - public Project CurrentProject { - get { return currentProject; } - set { - if (currentProject == value) - return; - currentProject = value; - - CMDViewProjProps.CanExecute = (currentProject != null); - - lock (MainIFace) { - NotifyValueChanged ("CurrentProject", currentProject); - } - } - } - - public string LastOpenSolution { - get { return Crow.Configuration.Global.Get("LastOpenSolution");} - set { - if (LastOpenSolution == value) - return; - Crow.Configuration.Global.Set ("LastOpenSolution", value); - NotifyValueChanged ("LastOpenSolution", value); - } - } - public bool ReopenLastSolution { - get { return Crow.Configuration.Global.Get("ReopenLastSolution");} - set { - if (ReopenLastSolution == value) - return; - Crow.Configuration.Global.Set ("ReopenLastSolution", value); - NotifyValueChanged ("ReopenLastSolution", value); - } - } - - public void onFileOpen (object sender, EventArgs e) - { - FileDialog fd = sender as FileDialog; - - string filePath = fd.SelectedFileFullPath; - - try { - string ext = Path.GetExtension (filePath); - if (string.Equals (ext, ".sln", StringComparison.InvariantCultureIgnoreCase)) { - CurrentSolution = Solution.LoadSolution (filePath); - LastOpenSolution = filePath; -// }else if (string.Equals (ext, ".csproj", StringComparison.InvariantCultureIgnoreCase)) { -// currentProject = new Project (filePath); - } - } catch (Exception ex) { - crow.LoadIMLFragment (""); - } - } - - Window loadWindow(string path, object dataSource = null){ - try { - Widget g = MainIFace.FindByName (path); - if (g != null) - return g as Window; - g = MainIFace.Load (path); - g.Name = path; - g.DataSource = dataSource; - return g as Window; - } catch (Exception ex) { - Console.WriteLine (ex.ToString ()); - } - return null; - } - void closeWindow (string path){ - Widget g = MainIFace.FindByName (path); - if (g != null) - MainIFace.DeleteWidget (g); - } - - protected void onCommandSave(object sender, MouseButtonEventArgs e){ - System.Diagnostics.Debug.WriteLine("save"); - } - - void actionOpenFile(){ - System.Diagnostics.Debug.WriteLine ("OpenFile action"); - } - } -} \ No newline at end of file diff --git a/Samples/CrowIDE/src/DesignInterface.cs b/Samples/CrowIDE/src/DesignInterface.cs deleted file mode 100644 index 82c604c8..00000000 --- a/Samples/CrowIDE/src/DesignInterface.cs +++ /dev/null @@ -1,190 +0,0 @@ -// -// DesignInterface.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.Threading; -using System.Collections.Generic; -using System.IO; - - -namespace Crow.Coding -{ - public class DesignInterface : Interface, IValueChange - { - #region IValueChange implementation - /// - /// Raise to notify that the value of a property has changed, the binding system - /// rely mainly on this event. the member name may not be present in the class, this is - /// used in **propertyless** bindings, this allow to raise custom named events without needing - /// to create an new one in the class or a new property. - /// - public event EventHandler ValueChanged; - /// - /// Helper function to raise the value changed event - /// - public virtual void NotifyValueChanged(string MemberName, object _value) - { - //Debug.WriteLine ("Value changed: {0}->{1} = {2}", this, MemberName, _value); - ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value)); - } - #endregion - - public DesignInterface (vkvg.Device dev) : base(dev) - { - } - - public ProjectFile ProjFile; - - - - public override Widget CreateInstance (string path) - { - ProjectFile pi; - - if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi)) - return CreateITorFromIMLFragment (pi.Source).CreateInstance(); - - return null; - } - public override Stream GetStreamFromPath (string path) - { - ProjectFile pi; - if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi)) { - return new FileStream (pi.AbsolutePath, FileMode.Open); - } - throw new Exception ($"In Design File not found: {path}"); - } - - - public override bool ProcessMouseMove (int x, int y) - { - int deltaX = x - Mouse.X; - int deltaY = y - Mouse.Y; - Mouse.X = x; - Mouse.Y = y; - MouseMoveEventArgs e = new MouseMoveEventArgs (x, y, deltaX, deltaY); - e.Mouse = Mouse; - - if (ActiveWidget != null) { - //TODO, ensure object is still in the graphic tree - //send move evt even if mouse move outside bounds - ActiveWidget.onMouseMove (this, e); - if (!ActiveWidget.IsDragged)//if active is dragged, process mouse move as it was not visible. - return true; - } - - if (HoverWidget != null) { - - //check topmost graphicobject first - Widget tmp = HoverWidget; - Widget topc = null; - while (tmp is Widget) { - topc = tmp; - tmp = tmp.LogicalParent as Widget; - } - int idxhw = GraphicTree.IndexOf (topc); - if (idxhw != 0) { - int i = 0; - while (i < idxhw) { - if (GraphicTree [i].localLogicalParentIsNull) { - if (GraphicTree [i].MouseIsIn (e.Position)) { - while (HoverWidget != null) { - HoverWidget.onMouseLeave (HoverWidget, e); - HoverWidget = HoverWidget.LogicalParent as Widget; - } - - GraphicTree [i].checkHoverWidget (e); - return true; - } - } - i++; - } - } - - if (HoverWidget.MouseIsIn (e.Position)) { - if (!(HoverWidget is TemplatedControl)) - HoverWidget.checkHoverWidget (e); - return true; - } else { - HoverWidget.onMouseLeave (HoverWidget, e); - //seek upward from last focused graph obj's - while (HoverWidget.LogicalParent as Widget != null) { - HoverWidget = HoverWidget.LogicalParent as Widget; - if (HoverWidget.MouseIsIn (e.Position)) { - HoverWidget.checkHoverWidget (e); - return true; - } else - HoverWidget.onMouseLeave (HoverWidget, e); - } - } - } - - //top level graphic obj's parsing - lock (GraphicTree) { - for (int i = 0; i < GraphicTree.Count; i++) { - Widget g = GraphicTree [i]; - if (g.MouseIsIn (e.Position)) { - if (!(HoverWidget is TemplatedControl)) - g.checkHoverWidget (e); - if (g is Window) - PutOnTop (g); - return true; - } - } - } - HoverWidget = null; - return false; - } - - protected override void processLayouting () - { - #if MEASURE_TIME - layoutingMeasure.StartCycle(); - #endif - - if (Monitor.TryEnter (LayoutMutex)) { - DiscardQueue = new Queue (); - LayoutingQueueItem lqi; - while (LayoutingQueue.Count > 0) { - lqi = LayoutingQueue.Dequeue (); - //Console.WriteLine (lqi.ToString ()); - #if DEBUG_LAYOUTING - currentLQI = lqi; - curLQIsTries.Add(currentLQI); - #endif - lqi.ProcessLayouting (); - } - LayoutingQueue = DiscardQueue; - Monitor.Exit (LayoutMutex); - DiscardQueue = null; - } - - #if MEASURE_TIME - layoutingMeasure.StopCycle(); - #endif - } - } -} - diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs deleted file mode 100644 index 7d5efec9..00000000 --- a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs +++ /dev/null @@ -1,530 +0,0 @@ -// -// CodeTextBuffer.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2017 jp -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using System.Diagnostics; -using System.Threading; - -namespace Crow.Coding -{ - /// - /// Code buffer, lines are arranged in a List, new line chars are removed during string.split on '\n...', - /// - public class CodeBuffer - { - public ReaderWriterLockSlim editMutex = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); - - //those events are handled in SourceEditor to help keeping sync between textbuffer,parser and editor. - //modified lines are marked for reparse - #region Events - public event EventHandler LineUpadateEvent; - public event EventHandler LineRemoveEvent; - public event EventHandler LineAdditionEvent; - public event EventHandler FoldingEvent; - public event EventHandler BufferCleared; - public event EventHandler SelectionChanged; - public event EventHandler PositionChanged; - #endregion - - string lineBreak = Interface.LineBreak; - List lines = new List(); - public int longestLineIdx = 0; - public int longestLineCharCount = 0; - /// - /// real position in char arrays, tab = 1 char - /// - int _currentLine = 0; - int _currentCol = 0; - - public int LineCount { get { return lines.Count;}} - public int IndexOf (CodeLine cl) { - return lines.IndexOf (cl); - } - - public CodeLine this[int i] - { - get { return i < LineCount ? lines[i] : null; } - set { - if (lines [i] == value) - return; - editMutex.EnterWriteLock (); - lines [i] = value; - editMutex.ExitWriteLock (); - LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i)); - } - } - - public void RemoveAt(int i){ - editMutex.EnterWriteLock (); - lines.RemoveAt (i); - editMutex.ExitWriteLock (); - LineRemoveEvent.Raise (this, new CodeBufferEventArgs (i)); - } - public void Insert(int i, string item){ - editMutex.EnterWriteLock (); - lines.Insert (i, item); - editMutex.ExitWriteLock (); - LineAdditionEvent.Raise (this, new CodeBufferEventArgs (i)); - } - public void Add(CodeLine item){ - editMutex.EnterWriteLock (); - lines.Add (item); - editMutex.ExitWriteLock (); - LineAdditionEvent.Raise (this, new CodeBufferEventArgs (lines.Count - 1)); - } - public void AddRange (string[] items){ - int start = lines.Count; - editMutex.EnterWriteLock (); - for (int i = 0; i < items.Length; i++) - lines.Add (items [i]); - editMutex.ExitWriteLock (); - LineAdditionEvent.Raise (this, new CodeBufferEventArgs (start, items.Length)); - } - public void AddRange (CodeLine[] items){ - int start = lines.Count; - editMutex.EnterWriteLock (); - lines.AddRange (items); - editMutex.ExitWriteLock (); - LineAdditionEvent.Raise (this, new CodeBufferEventArgs (start, items.Length)); - } - public void Clear () { - editMutex.EnterWriteLock (); - longestLineCharCount = 0; - lines.Clear (); - editMutex.ExitWriteLock (); - BufferCleared.Raise (this, null); - } - public void UpdateLine(int i, string newContent){ - editMutex.EnterWriteLock (); - this [i].Content = newContent; - editMutex.ExitWriteLock (); - LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i)); - } - public void AppenedLine(int i, string newContent){ - editMutex.EnterWriteLock (); - this [i].Content += newContent; - editMutex.ExitWriteLock (); - LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i)); - } - public void RemoveLeadingTab (int l) { - if (this [l] [0] == '\t') { - UpdateLine (l, this [l].Content.Substring (1)); - return; - } - int i = 0; - while (i < Interface.TabSize) { - if (this [l] [i] != ' ') - break; - i++; - } - if (i > 0) - UpdateLine (l, this [l].Content.Substring (i)); - } - public void ToogleFolding (int line) { - if (!this [line].IsFoldable) - return; - editMutex.EnterWriteLock (); - this [line].IsFolded = !this [line].IsFolded; - editMutex.ExitWriteLock (); - FoldingEvent.Raise (this, new CodeBufferEventArgs (line)); - } - public void Load(string rawSource, string lineBrkRegex = @"\r\n|\r|\n|\\\n") { - this.Clear(); - - if (string.IsNullOrEmpty (rawSource)) - return; - - AddRange (Regex.Split (rawSource, lineBrkRegex)); - - lineBreak = detectLineBreakKind (rawSource); - } - - /// - /// Finds the longest visual line as printed on screen with tabulation replaced with n spaces - /// - public void FindLongestVisualLine(){ - longestLineCharCount = 0; - editMutex.EnterReadLock (); - for (int i = 0; i < this.LineCount; i++) { - if (lines[i].PrintableLength > longestLineCharCount) { - longestLineCharCount = lines[i].PrintableLength; - longestLineIdx = i; - } - } - editMutex.ExitReadLock (); - //Debug.WriteLine ("Longest line: {0}->{1}", longestLineIdx, longestLineCharCount); - } - /// line break could be '\r' or '\n' or '\r\n' - static string detectLineBreakKind(string buffer){ - string strLB = ""; - - if (string.IsNullOrEmpty(buffer)) - return Interface.LineBreak; - int i = 0; - while ( i < buffer.Length) { - if (buffer [i] == '\r') { - strLB += '\r'; - i++; - } - if (i < buffer.Length) { - if (buffer [i] == '\r') - return "\r"; - if (buffer[i] == '\n') - strLB += '\n'; - } - if (!string.IsNullOrEmpty (strLB)) - return strLB; - i++; - } - return Interface.LineBreak; - } - /// - /// return all lines with linebreaks - /// - public string FullText{ - get { - if (lines.Count == 0) - return ""; - string tmp = ""; - editMutex.EnterReadLock (); - for (int i = 0; i < lines.Count -1; i++) - tmp += lines [i].Content + this.lineBreak; - tmp += lines [lines.Count - 1].Content; - editMutex.ExitReadLock (); - return tmp; - } - } - - /// - /// unfolded and not in folds line count - /// - public int UnfoldedLines { - get { - int i = 0, vl = 0; - editMutex.EnterReadLock (); - while (i < LineCount) { - if (this [i].IsFolded) { - i = GetEndNodeIndex (i); - if (i < 0) { - Console.WriteLine ("error folding"); - break; - } - } - i++; - vl++; - } - editMutex.ExitReadLock (); - //Debug.WriteLine ("unfolded lines: " + vl); - return vl; - } - } - - /// - /// convert visual position to buffer position - /// - Point getBuffPos (Point visualPos) { - int i = 0; - int buffCol = 0; - while (i < visualPos.X) { - if (this [visualPos.Y] [buffCol] == '\t') - i += Interface.TabSize; - else - i++; - buffCol++; - } - return new Point (buffCol, visualPos.Y); - } - - public int GetEndNodeIndex (int line) { - return IndexOf (this [line].SyntacticNode.EndLine); - } - - int ConverteTabulatedPosOfCurLine (int column) { - int tmp = 0; - int i = 0; - while (i < lines [_currentLine].Content.Length){ - if (lines [_currentLine].Content [i] == '\t') - tmp += 4; - else - tmp++; - if (tmp > column) - break; - i++; - } - return i; - } - - public int CurrentTabulatedColumn { - get { - return lines [_currentLine].Content.Substring (0, _currentCol). - Replace ("\t", new String (' ', Interface.TabSize)).Length; - } - } - /// - /// Gets visual position computed from actual buffer position - /// -// public Point TabulatedPosition { -// get { return new Point (TabulatedColumn, _currentLine); } -// } - /// - /// set buffer current position from visual position - /// -// public void SetBufferPos(Point tabulatedPosition) { -// CurrentPosition = getBuffPos(tabulatedPosition); -// } - - #region Editing and moving cursor - Point selStartPos = -1; //selection start (row,column) - Point selEndPos = -1; //selection end (row,column) - - public bool SelectionInProgress { get { return selStartPos >= 0; }} - public void SetSelStartPos () { - selStartPos = selEndPos = CurrentPosition; - SelectionChanged.Raise (this, null); - } - public void SetSelEndPos () { - selEndPos = CurrentPosition; - SelectionChanged.Raise (this, null); - } - public void SetSelectionOnFullLines () { - if (!SelectionInProgress) - return; - Point s = new Point (0, SelectionStart.Y); - Point e = new Point (this [SelectionEnd.Y].Length, SelectionEnd.Y); - selStartPos = s; - selEndPos = e; - SelectionChanged.Raise (this, null); - } - /// - /// Set selection in buffer to -1, empty selection - /// - public void ResetSelection () { - selStartPos = selEndPos = -1; - SelectionChanged.Raise (this, null); - } - - public string SelectedText { - get { - if (SelectionIsEmpty) - return ""; - Point selStart = SelectionStart; - Point selEnd = SelectionEnd; - if (selStart.Y == selEnd.Y) - return this [selStart.Y].Content.Substring (selStart.X, selEnd.X - selStart.X); - string tmp = ""; - tmp = this [selStart.Y].Content.Substring (selStart.X); - for (int l = selStart.Y + 1; l < selEnd.Y; l++) { - tmp += Interface.LineBreak + this [l].Content; - } - tmp += Interface.LineBreak + this [selEnd.Y].Content.Substring (0, selEnd.X); - return tmp; - } - } - /// - /// ordered selection start and end positions in char units - /// - public Point SelectionStart { - get { return selEndPos < 0 || selStartPos.Y < selEndPos.Y ? selStartPos : - selStartPos.Y > selEndPos.Y ? selEndPos : - selStartPos.X < selEndPos.X ? selStartPos : selEndPos; } - } - public Point SelectionEnd { - get { return selEndPos < 0 || selStartPos.Y > selEndPos.Y ? selStartPos : - selStartPos.Y < selEndPos.Y ? selEndPos : - selStartPos.X > selEndPos.X ? selStartPos : selEndPos; } - } - public bool SelectionIsEmpty - { get { return selEndPos == selStartPos; } } - int requestedColumn = -1; - /// - /// Current column in buffer coordinate, tabulation = 1 char - /// - public int CurrentColumn{ - get { return _currentCol; } - set { - if (value == _currentCol) - return; - - editMutex.EnterReadLock (); - - if (value < 0) - _currentCol = 0; - else if (value > lines [_currentLine].Length) - _currentCol = lines [_currentLine].Length; - else - _currentCol = value; - - requestedColumn = CurrentTabulatedColumn; - - editMutex.ExitReadLock (); - - PositionChanged.Raise (this, null); - } - } - /// - /// Current row in buffer coordinate, tabulation = 1 char - /// - public int CurrentLine{ - get { return _currentLine; } - set { - if (value == _currentLine) - return; - - editMutex.EnterReadLock (); - - if (LineCount == 0) - _currentLine = 0; - else if (value >= lines.Count) - _currentLine = lines.Count-1; - else if (value < 0) - _currentLine = 0; - else - _currentLine = value; -// if (_currentCol < 0) -// requestedColumn = tabu _currentCol; - int tabulatedRequestedCol = ConverteTabulatedPosOfCurLine(requestedColumn); - if (requestedColumn > lines [_currentLine].PrintableLength) - _currentCol = lines [_currentLine].Length; - else - //_currentCol = requestedColumn; - _currentCol = tabulatedRequestedCol; - //Debug.WriteLine ("buff cur line: " + _currentLine); - - editMutex.ExitReadLock(); - - PositionChanged.Raise (this, null); - } - } - public CodeLine CurrentCodeLine { - get { return this [_currentLine]; } - } - /// - /// Current position in buffer coordinate, tabulation = 1 char - /// - public Point CurrentPosition { - get { return new Point(CurrentColumn, CurrentLine); } -// set { -// _currentCol = value.X; -// _currentLine = value.Y; -// } - } - /// - /// get char at current position in buffer - /// - protected Char CurrentChar { get { return lines [CurrentLine] [CurrentColumn]; } } - - public void GotoWordStart(){ - if (this[CurrentLine].Length == 0) - return; - CurrentColumn--; - //skip white spaces - while (!char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn > 0) - CurrentColumn--; - while (char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn > 0) - CurrentColumn--; - if (!char.IsLetterOrDigit (this.CurrentChar)) - CurrentColumn++; - } - public void GotoWordEnd(){ - //skip white spaces - if (CurrentColumn >= this [CurrentLine].Length - 1) - return; - while (!char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn < this [CurrentLine].Length-1) - CurrentColumn++; - while (char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn < this [CurrentLine].Length-1) - CurrentColumn++; - if (char.IsLetterOrDigit (this.CurrentChar)) - CurrentColumn++; - } - public void DeleteChar() - { - editMutex.EnterWriteLock (); - if (SelectionIsEmpty) { - if (CurrentColumn == 0) { - if (CurrentLine == 0) { - editMutex.ExitWriteLock (); - return; - } - CurrentLine--; - CurrentColumn = this [CurrentLine].Length; - AppenedLine (CurrentLine, this [CurrentLine + 1].Content); - RemoveAt (CurrentLine + 1); - editMutex.ExitWriteLock (); - return; - } - CurrentColumn--; - UpdateLine (CurrentLine, this [CurrentLine].Content.Remove (CurrentColumn, 1)); - } else { - int linesToRemove = SelectionEnd.Y - SelectionStart.Y + 1; - int l = SelectionStart.Y; - - if (linesToRemove > 0) { - UpdateLine (l, this [l].Content.Remove (SelectionStart.X, this [l].Length - SelectionStart.X) + - this [SelectionEnd.Y].Content.Substring (SelectionEnd.X, this [SelectionEnd.Y].Length - SelectionEnd.X)); - l++; - for (int c = 0; c < linesToRemove - 1; c++) - RemoveAt (l); - CurrentLine = SelectionStart.Y; - CurrentColumn = SelectionStart.X; - } else - UpdateLine (l, this [l].Content.Remove (SelectionStart.X, SelectionEnd.X - SelectionStart.X)); - CurrentColumn = SelectionStart.X; - ResetSelection (); - } - editMutex.ExitWriteLock (); - } - /// - /// Insert new string at caret position, should be sure no line break is inside. - /// - /// String. - public void Insert(string str) - { - if (!SelectionIsEmpty) - this.DeleteChar (); - string[] strLines = Regex.Split (str, "\r\n|\r|\n|" + @"\\n").ToArray(); - UpdateLine (CurrentLine, this [CurrentLine].Content.Insert (CurrentColumn, strLines[0])); - CurrentColumn += strLines[0].Length; - for (int i = 1; i < strLines.Length; i++) { - InsertLineBreak (); - UpdateLine (CurrentLine, this [CurrentLine].Content.Insert (CurrentColumn, strLines[i])); - CurrentColumn += strLines[i].Length; - } - } - /// - /// Insert a line break. - /// - public void InsertLineBreak() - { - if (CurrentColumn > 0) { - Insert (CurrentLine + 1, this [CurrentLine].Content.Substring (CurrentColumn)); - UpdateLine (CurrentLine, this [CurrentLine].Content.Substring (0, CurrentColumn)); - } else - Insert(CurrentLine, ""); - - CurrentColumn = 0; - CurrentLine++; - } - #endregion - } -} - diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs deleted file mode 100644 index 07dd25b6..00000000 --- a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Crow.Coding -{ - public class CodeBufferEventArgs : EventArgs { - public int LineStart; - public int LineCount; - - public CodeBufferEventArgs(int lineNumber) { - LineStart = lineNumber; - LineCount = 1; - } - public CodeBufferEventArgs(int lineStart, int lineCount) { - LineStart = lineStart; - LineCount = lineCount; - } - } - -} - diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeLine.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/CodeLine.cs deleted file mode 100644 index 23f43fba..00000000 --- a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeLine.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Text; -using System.Collections.Generic; -using System.Linq; - -namespace Crow.Coding -{ - public class CodeLine - { - public string Content; - public List Tokens; - public int EndingState = 0; - public Node SyntacticNode; - public ParserException exception; - - public CodeLine (string _content){ - Content = _content; - Tokens = null; - exception = null; - } - - public char this[int i] - { - get { return Content[i]; } - set { - if (Content [i] == value) - return; - StringBuilder sb = new StringBuilder(Content); - sb[i] = value; - Content = sb.ToString(); - Tokens = null; - //LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i)); - } - } - public bool IsFoldable { get { return SyntacticNode == null ? false : - SyntacticNode.EndLine != SyntacticNode.StartLine && SyntacticNode.EndLine != null; } } - public int FoldingLevel { get { return IsFoldable ? SyntacticNode.Level : 0; } } - public bool IsFolded = false; - public bool IsParsed { - get { return Tokens != null; } - } - public string PrintableContent { - get { - return string.IsNullOrEmpty (Content) ? "" : Content.Replace ("\t", new String (' ', Interface.TabSize)); - } - } - public int PrintableLength { - get { - return PrintableContent.Length; - } - } - public int Length { - get { - return string.IsNullOrEmpty (Content) ? 0 : Content.Length; - } - } - public int FirstNonBlankTokIndex { - get { return Tokens == null ? -1 : Tokens.FindIndex (tk=>tk.Type != BufferParser.TokenType.WhiteSpace); } - } - - public void SetLineInError (ParserException ex) { - Tokens = null; - exception = ex; - } - -// public static implicit operator string(CodeLine sl) { -// return sl == null ? "" : sl.Content; -// } - public static implicit operator CodeLine(string s) { - return new CodeLine(s); - } - public static bool operator ==(string s1, CodeLine s2) - { - return string.Equals (s1, s2.Content); - } - public static bool operator !=(string s1, CodeLine s2) - { - return !string.Equals (s1, s2.Content); - } - } -} - diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/Node.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/Node.cs deleted file mode 100644 index 9db55428..00000000 --- a/Samples/CrowIDE/src/Editors/CodeBuffer/Node.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Crow.Coding -{ - public class Node - { - public Node Parent; - public string Name; - public string Type; - public CodeLine StartLine; - public CodeLine EndLine; - public Dictionary Attributes = new Dictionary (); - - public List Children = new List(); - - public Node () - { - } - - public void AddChild (Node child) { - child.Parent = this; - Children.Add (child); - } - - public int Level { - get { return Parent == null ? 1 : Parent.Level + 1; } - } - - public override string ToString () - { - return string.Format ("Name:{0}, Type:{1}\n\tparent:{2}", Name, Type, Parent); - } - } -} - diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs deleted file mode 100644 index e8c87182..00000000 --- a/Samples/CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs +++ /dev/null @@ -1,527 +0,0 @@ -// -// CodeTextBuffer.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2017 jp -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using System.Diagnostics; -using System.Threading; -using System.Text; - -namespace Crow.Text -{ - /// - /// Code buffer, lines are arranged in a List, new line chars are removed during string.split on '\n...', - /// - public class TextBuffer - { - public ReaderWriterLockSlim editMutex = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); - static Regex slb = new Regex ("\\n");//single char line break used internaly - Regex reghexLineBrk = new Regex(@"\r\n|\r|\n|\\\n");//original text line break regex - - #region Events - public event EventHandler LineUpadateEvent; - public event EventHandler LineRemoveEvent; - public event EventHandler LineAdditionEvent; - public event EventHandler BufferCleared; - public event EventHandler SelectionChanged; - public event EventHandler PositionChanged; - #endregion - - StringBuilder buffer = new StringBuilder(); - string lineBreak = Interface.LineBreak;//detected linebreak kind in original source - List lineLength = new List();//line length table - /// - /// real position in char arrays, tab = 1 char - /// - int _currentLine = 0; - int _currentCol = 0; - - /// - /// Gets the total line count. - /// - public int LineCount { get { return lineLength.Count;}} - - /// - /// get a substring in the buffer - /// - /// a new string - /// absolute index in the buffer - /// length of the substring - public string GetSubString (int idx, int length){ - return buffer.ToString (idx, length); - } - /// - /// Gets length of a line. - /// - /// length of line - /// line nuber - public int GetLineLength (int lineIdx) { - return lineLength [lineIdx]; - } - /// - /// get a single charactere in the buffer - /// - /// a single char - /// absolute index in the buffer - public char GetCharAt (int idx){ - return buffer [idx]; - } - /// - /// return full text with original line breaks - /// - /// a string containing the full text - public string FullText { - get { return buffer.Replace("\n", lineBreak).ToString (); } - set { - Load (value); - } - } - /// - /// Gets the buffer pointer of a line - /// - /// absolute index of the line in the buffer - /// line number - public int GetBufferIndexOfLine (int i) { - int ptr = 0; - editMutex.EnterReadLock (); - for (int j = 0; j < i; j++) { - ptr += lineLength [j]; - } - editMutex.ExitReadLock (); - return ptr; - } - /// - /// Gets the buffer pointer for the current position - /// - /// absolute index in the buffer of current position - public int BufferIndexOfCurrentPosition { - get {return GetBufferIndexOfLine (_currentLine) + _currentCol;} - } - public int this[int i] - { - get { - int ptr = 0; - editMutex.EnterReadLock (); - for (int j = 0; j < i; j++) { - ptr += lineLength [j]; - } - editMutex.ExitReadLock (); - return ptr; - } - } - /// - /// remove line number i - /// - /// index of the line - public void RemoveLine(int i){ - editMutex.EnterWriteLock (); - buffer.Remove (GetBufferIndexOfLine (i), lineLength [i]); - lineLength.RemoveAt (i); - editMutex.ExitWriteLock (); - LineRemoveEvent.Raise (this, new TextBufferEventArgs (i)); - } - /// - /// insert string without linebreaks at position i in buff - /// - /// absolute index in the buffer - /// linebreak free string - public void InsertAt(int i, string str){ - editMutex.EnterWriteLock (); - buffer.Insert (this [i], str); - lineLength.Insert (i, str.Length); - editMutex.ExitWriteLock (); - LineAdditionEvent.Raise (this, new TextBufferEventArgs (i)); - } - public void AddLine(string str){ - editMutex.EnterWriteLock (); - if (lineLength.LastOrDefault() == 0) { - buffer.Append (str); - lineLength [lineLength.Count - 1] = str.Length; - lineLength.Add (0); - } - editMutex.ExitWriteLock (); - LineAdditionEvent.Raise (this, new TextBufferEventArgs (lineLength.Count - 1)); - } - public void AddRange (string[] items){ - int start = lineLength.Count; - editMutex.EnterWriteLock (); - for (int i = 0; i < items.Length; i++) - AddLine (items [i]); - editMutex.ExitWriteLock (); - LineAdditionEvent.Raise (this, new TextBufferEventArgs (start, items.Length)); - } - public void Clear () { - editMutex.EnterWriteLock (); - lineLength.Clear (); - buffer.Clear (); - editMutex.ExitWriteLock (); - BufferCleared.Raise (this, null); - } - public void UpdateLine(int i, string newContent){ - editMutex.EnterWriteLock (); - int ptrL = this [i]; - buffer.Remove (ptrL, lineLength [i]); - buffer.Insert (ptrL, newContent); - lineLength [i] = newContent.Length; - editMutex.ExitWriteLock (); - LineUpadateEvent.Raise (this, new TextBufferEventArgs (i)); - } - public void AppenedLine(int i, string newContent){ - editMutex.EnterWriteLock (); - int ptr = this [i] + lineLength [i]; - if (i < LineCount - 1) - ptr--; - buffer.Insert(ptr, newContent); - lineLength [i] += newContent.Length; - editMutex.ExitWriteLock (); - LineUpadateEvent.Raise (this, new TextBufferEventArgs (i)); - } - /// - /// Insert new string at caret position, should be sure no line break is inside. - /// - /// String. - public void InsertAt(string str) - { - if (!SelectionIsEmpty) - this.Delete (); - - editMutex.EnterWriteLock (); - - string tmp = reghexLineBrk.Replace (str, "\n");//use single char line break in buffer - int buffPtr = this [CurrentLine] + CurrentColumn; - buffer.Insert (buffPtr, tmp); - - int lPtr = CurrentLine, strPtr = 0; - int remainingLength = lineLength [lPtr] - CurrentColumn; - lineLength [lPtr] = CurrentColumn; - foreach (Match match in slb.Matches(tmp)) - { - lineLength [lPtr] += match.Index + 1 - strPtr; - lPtr++; - lineLength.Insert (lPtr, 0); - strPtr = match.Index + 1; - //CurrentLine++; - } - remainingLength += tmp.Length - strPtr; - lineLength [lPtr] += remainingLength; - - CurrentLine = lPtr; - if (strPtr == 0) - CurrentColumn += tmp.Length; - else - CurrentColumn = tmp.Length - strPtr; - - editMutex.ExitWriteLock (); - if (strPtr>0) - LineAdditionEvent.Raise (this, null); - else - LineUpadateEvent.Raise (this, null); - } - /// - /// Insert a line break. - /// - public void InsertLineBreak() - { - editMutex.EnterWriteLock (); - buffer.Insert (this [CurrentLine] + CurrentColumn, '\n'); - int lgdiff = lineLength [CurrentLine] - CurrentColumn; - lineLength.Insert (CurrentLine + 1, lineLength [CurrentLine] - CurrentColumn); - lineLength [CurrentLine] = CurrentColumn + 1; - editMutex.ExitWriteLock (); - LineAdditionEvent.Raise (this, null); - CurrentColumn = 0; - CurrentLine++; - } - public void Delete() - { - editMutex.EnterWriteLock (); - if (SelectionIsEmpty) { - if (CurrentColumn == 0) { - if (CurrentLine == 0) { - editMutex.ExitWriteLock (); - return; - } - - buffer.Remove (this [CurrentLine] - 1, 1); - - int col = lineLength [CurrentLine - 1] - 1; - lineLength [CurrentLine - 1] += lineLength [CurrentLine] - 1; - lineLength.RemoveAt (CurrentLine); - - CurrentLine--; - CurrentColumn = col; - - editMutex.ExitWriteLock (); - LineRemoveEvent.Raise (this, null); - return; - } - CurrentColumn--; - buffer.Remove (this [CurrentLine] + CurrentColumn, 1); - lineLength [CurrentLine]--; - } else { - int linesToRemove = SelectionEnd.Y - SelectionStart.Y; - int ptr = this [SelectionStart.Y] + SelectionStart.X; - int length = lineLength [SelectionStart.Y] - SelectionStart.X; - int l = 1; - while (l <= linesToRemove ) { - length += lineLength [SelectionStart.Y + l]; - l++; - } - length -= lineLength [SelectionEnd.Y] - SelectionEnd.X; - buffer.Remove (ptr, length); - lineLength [SelectionStart.Y] = SelectionStart.X + lineLength [SelectionEnd.Y] - SelectionEnd.X; - lineLength.RemoveRange (SelectionStart.Y + 1, linesToRemove); - - CurrentLine = SelectionStart.Y; - CurrentColumn = SelectionStart.X; - ResetSelection (); - - if (linesToRemove > 0) - LineRemoveEvent.Raise (this, null); - else - LineUpadateEvent.Raise (this, null); - } - editMutex.ExitWriteLock (); - } - public void Load(string rawSource) { - this.Clear(); - - if (string.IsNullOrEmpty (rawSource)) - return; - - lineBreak = reghexLineBrk.Match (rawSource).Value;//store original line break - string tmp = reghexLineBrk.Replace (rawSource, "\n");//use single char line break in buffer - int ptr = 0; - foreach (Match match in slb.Matches(tmp)) - { - int l = match.Index + 1; - int lg = l - ptr; - lineLength.Add (lg); - ptr = l; - } - lineLength.Add (0); - - buffer = new StringBuilder (tmp); - } - -// public int CurrentTabulatedColumn { -// get { -//// return lines [_currentLine].Content.Substring (0, _currentCol). -//// Replace ("\t", new String (' ', Interface.TabSize)).Length; -// } -// } - - #region moving cursor an selection - Point selStartPos = -1; //selection start (row,column) - Point selEndPos = -1; //selection end (row,column) - - public bool SelectionInProgress { get { return selStartPos >= 0; }} - public void SetSelStartPos () { - selStartPos = selEndPos = CurrentPosition; - SelectionChanged.Raise (this, null); - } - public void SetSelEndPos () { - selEndPos = CurrentPosition; - SelectionChanged.Raise (this, null); - } - /// - /// Set selection in buffer to -1, empty selection - /// - public void ResetSelection () { - selStartPos = selEndPos = -1; - SelectionChanged.Raise (this, null); - } - /// - /// ordered selection start and end positions in char units - /// - public Point SelectionStart { - get { return selEndPos < 0 || selStartPos.Y < selEndPos.Y ? selStartPos : - selStartPos.Y > selEndPos.Y ? selEndPos : - selStartPos.X < selEndPos.X ? selStartPos : selEndPos; } - } - public Point SelectionEnd { - get { return selEndPos < 0 || selStartPos.Y > selEndPos.Y ? selStartPos : - selStartPos.Y < selEndPos.Y ? selEndPos : - selStartPos.X > selEndPos.X ? selStartPos : selEndPos; } - } - public bool SelectionIsEmpty - { get { return selEndPos == selStartPos; } } - /// - /// Current column in buffer coordinate, tabulation = 1 char - /// - public int CurrentColumn{ - get { return _currentCol; } - set { - if (value == _currentCol) - return; - - editMutex.EnterWriteLock (); - - if (value < 0) - _currentCol = 0; - else if (value >= lineLength [_currentLine]) { - if (_currentLine < LineCount -1 && value > lineLength [_currentLine] - 1) - _currentCol = lineLength [_currentLine] - 1; - else - _currentCol = lineLength [_currentLine]; - }else - _currentCol = value; - - editMutex.ExitWriteLock (); - - PositionChanged.Raise (this, null); - } - } - /// - /// Current row in buffer coordinate, tabulation = 1 char - /// - public int CurrentLine{ - get { return _currentLine; } - set { - if (value == _currentLine) - return; - - editMutex.EnterWriteLock (); - - if (value >= lineLength.Count) - _currentLine = lineLength.Count-1; - else if (value < 0) - _currentLine = 0; - else - _currentLine = value; - - int c = _currentCol; - _currentCol = 0; - CurrentColumn = c; - - editMutex.ExitWriteLock(); - - PositionChanged.Raise (this, null); - } - } - /// - /// Current position in buffer coordinate, tabulation = 1 char - /// - public Point CurrentPosition { - get { return new Point(CurrentColumn, CurrentLine); } - } - /// - /// get char at current position in buffer - /// - protected Char CurrentChar { get { return buffer[this [CurrentLine]]; } } - public string SelectedText { - get { - if (SelectionIsEmpty) - return ""; - Point selStart = SelectionStart; - Point selEnd = SelectionEnd; - - int ptr = this [selStart.Y] + selStart.X; - int length = lineLength[selStart.Y] - selStart.X; - for (int i = selStart.Y+1; i <= selEnd.Y; i++) - length += lineLength [i]; - length -= lineLength[selEnd.Y] - selEnd.X; - - return buffer.ToString (ptr, length); - } - } - - public void GotoWordStart(){ - if (_currentCol == 0) - MoveLeft (); - if (_currentCol == 0) - return; - int ptrStart = BufferIndexOfCurrentPosition; - int ptr = ptrStart; - char c; - //skip white spaces - do { - ptr--; - c = this.GetCharAt (ptr); - } while (!char.IsLetterOrDigit (c) && c != '\n' && ptr > 1); - - do { - ptr--; - c = this.GetCharAt (ptr); - } while (char.IsLetterOrDigit (c) && c != '\n' && ptr > 1); - - if (ptr == 0) - CurrentColumn = 0; - else - CurrentColumn -= ptrStart - ptr - 1; - } - public void GotoWordEnd(){ - int limx = GetLineLength (_currentLine); - if (_currentLine < lineLength.Count - 1) - limx--; - - if (_currentCol == limx) { - MoveRight (); - limx = GetLineLength (_currentLine); - if (_currentLine < lineLength.Count - 1) - limx--; - } - - int ptrLine = GetBufferIndexOfLine(_currentLine); - int ptrCol = _currentCol; - - char c; - //skip white spaces - do { - c = GetCharAt (ptrLine+ptrCol); - ptrCol++; - } while (!char.IsLetterOrDigit (c) && ptrCol < limx); - - do { - c = GetCharAt (ptrLine + ptrCol); - ptrCol++; - } while (char.IsLetterOrDigit (c) && ptrCol < limx); - CurrentColumn = ptrCol - 1; - } - /// - /// Moves cursor one char to the left, move up if cursor reaches start of line - /// - public void MoveLeft(){ - if (CurrentColumn == 0) { - CurrentLine--; - CurrentColumn = int.MaxValue; - } else - CurrentColumn--; - } - /// - /// Moves cursor one char to the right, move down if cursor reaches end of line - /// - public void MoveRight(){ - if (_currentLine < LineCount -1){ - if (CurrentColumn >= lineLength [CurrentLine] - 1) { - CurrentColumn = 0; - CurrentLine++; - return; - } - } - CurrentColumn++; - } - - #endregion - } -} - diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs deleted file mode 100644 index 3b67bb1c..00000000 --- a/Samples/CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Crow.Text -{ - public class TextBufferEventArgs : EventArgs { - public int LineStart; - public int LineCount; - - public TextBufferEventArgs(int lineNumber) { - LineStart = lineNumber; - LineCount = 1; - } - public TextBufferEventArgs(int lineStart, int lineCount) { - LineStart = lineStart; - LineCount = lineCount; - } - } - -} - diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/TextEditor.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/TextEditor.cs deleted file mode 100644 index 8b16b9a8..00000000 --- a/Samples/CrowIDE/src/Editors/CodeBuffer/TextEditor.cs +++ /dev/null @@ -1,699 +0,0 @@ -// -// ScrollingTextBox.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -using System; -using System.ComponentModel; -using vkvg; - -namespace Crow.Text -{ - /// - /// Scrolling text box optimized for monospace fonts, for coding - /// - public class TextEditor : Crow.Coding.Editor - { - #region CTOR - public TextEditor (): base() - { - buffer = new TextBuffer (); - buffer.LineUpadateEvent += Buffer_LineUpadateEvent; - buffer.LineAdditionEvent += Buffer_LineAdditionEvent;; - buffer.LineRemoveEvent += Buffer_LineRemoveEvent; - buffer.BufferCleared += Buffer_BufferCleared; - buffer.SelectionChanged += Buffer_SelectionChanged; - buffer.PositionChanged += Buffer_PositionChanged; - //buffer.Add (""); - } - #endregion - - string oldSource = ""; - volatile bool isDirty = false; - - #region private and protected fields - int visibleLines = 1; - int visibleColumns = 1; - - TextBuffer buffer; - - Color selBackground; - Color selForeground; - int selStartCol; - int selEndCol; - - protected Rectangle rText; - protected FontExtents fe; - protected TextExtents te; - - Point mouseLocalPos; - bool doubleClicked = false; - #endregion - - /// - /// Updates visible line in widget, adapt max scroll y and updatePrintedLines - /// - void updateVisibleLines(){ - visibleLines = (int)Math.Floor ((double)ClientRectangle.Height / (fe.Ascent+fe.Descent)); - NotifyValueChanged ("VisibleLines", visibleLines); - updateMaxScrollY (); - RegisterForGraphicUpdate (); -// System.Diagnostics.Debug.WriteLine ("update visible lines: " + visibleLines); -// System.Diagnostics.Debug.WriteLine ("update MaxScrollY: " + MaxScrollY); - } - void updateVisibleColumns(){ - visibleColumns = (int)Math.Floor ((double)(ClientRectangle.Width)/ fe.MaxXAdvance); - NotifyValueChanged ("VisibleColumns", visibleColumns); - RegisterForGraphicUpdate (); -// System.Diagnostics.Debug.WriteLine ("update visible columns: {0} leftMargin:{1}",visibleColumns, leftMargin); -// System.Diagnostics.Debug.WriteLine ("update MaxScrollX: " + MaxScrollX); - } - void updateMaxScrollX (int longestTabulatedLineLength) { - MaxScrollX = Math.Max (0, longestTabulatedLineLength - visibleColumns); - if (longestTabulatedLineLength > 0) - NotifyValueChanged ("ChildWidthRatio", Slot.Width * visibleColumns / longestTabulatedLineLength); - } - void updateMaxScrollY () { - int lc = buffer.LineCount; - MaxScrollY = Math.Max (0, lc - visibleLines); - if (lc > 0) - NotifyValueChanged ("ChildHeightRatio", Slot.Height * visibleLines / lc); - - } - - - - #region Editor overrides - protected override void updateEditorFromProjFile () - { - buffer.editMutex.EnterWriteLock (); - loadSource (); - buffer.editMutex.ExitWriteLock (); - - isDirty = false; - oldSource = projFile.Source; - projFile.RegisteredEditors [this] = true; - } - protected override void updateProjFileFromEditor () - { - buffer.editMutex.EnterWriteLock (); - string newsrc = buffer.FullText; - buffer.editMutex.ExitWriteLock (); - projFile.UpdateSource (this, newsrc); - } - protected override bool EditorIsDirty { - get { return isDirty; } - set { isDirty = value; } - } - protected override bool IsReady { - get { return projFile != null && buffer != null; } - } - #endregion - - #region Buffer events handlers - void Buffer_BufferCleared (object sender, EventArgs e) - { - editorMutex.EnterWriteLock (); - - MaxScrollX = MaxScrollY = 0; - RegisterForGraphicUpdate (); - notifyPositionChanged (); - isDirty = true; - - editorMutex.ExitWriteLock (); - } - void Buffer_LineAdditionEvent (object sender, TextBufferEventArgs e) - { - updateMaxScrollY (); - RegisterForGraphicUpdate (); - isDirty = true; - } - void Buffer_LineRemoveEvent (object sender, TextBufferEventArgs e) - { - updateMaxScrollY (); - RegisterForGraphicUpdate (); - notifyPositionChanged (); - isDirty = true; - } - void Buffer_LineUpadateEvent (object sender, TextBufferEventArgs e) - { - RegisterForGraphicUpdate (); - notifyPositionChanged (); - isDirty = true; - } - void Buffer_PositionChanged (object sender, EventArgs e) - { - int cc = getTabulatedColumn (buffer.CurrentPosition); - - if (cc > visibleColumns + ScrollX) { - ScrollX = cc - visibleColumns; - } else if (cc < ScrollX) - ScrollX = cc; - - if (buffer.CurrentLine >= visibleLines + ScrollY - 1) - ScrollY = buffer.CurrentLine - visibleLines + 1; - else if (buffer.CurrentLine < ScrollY) - ScrollY = buffer.CurrentLine; - - RegisterForGraphicUpdate (); - notifyPositionChanged (); - } - - void Buffer_SelectionChanged (object sender, EventArgs e) - { - RegisterForGraphicUpdate (); - } - #endregion - - void notifyPositionChanged (){ - try { - NotifyValueChanged ("CurrentLine", buffer.CurrentLine+1); - NotifyValueChanged ("CurrentColumn", buffer.CurrentColumn+1); - } catch (Exception ex) { - Console.WriteLine (ex.ToString ()); - } - } - - #region Public Crow Properties - public int CurrentLine{ - get { return buffer == null ? 0 : buffer.CurrentLine+1; } - set { - try { - int l = value - 1; - if (l == buffer.CurrentLine) - return; - buffer.CurrentLine = l; - } catch (Exception ex) { - Console.WriteLine ("Error cur column: " + ex.ToString ()); - } - } - } - public int CurrentColumn{ - get { return buffer == null ? 0 : buffer.CurrentColumn+1; } - set { - try { - if (value - 1 == buffer.CurrentColumn) - return; - buffer.CurrentColumn = value - 1; - } catch (Exception ex) { - Console.WriteLine ("Error cur column: " + ex.ToString ()); - } - } - } - [DefaultValue("Blue")] - public virtual Color SelectionBackground { - get { return selBackground; } - set { - if (value == selBackground) - return; - selBackground = value; - NotifyValueChanged ("SelectionBackground", selBackground); - RegisterForRedraw (); - } - } - [DefaultValue("White")] - public virtual Color SelectionForeground { - get { return selForeground; } - set { - if (value == selForeground) - return; - selForeground = value; - NotifyValueChanged ("SelectionForeground", selForeground); - RegisterForRedraw (); - } - } - public override int ScrollY { - get { - return base.ScrollY; - } - set { - if (value == base.ScrollY) - return; - editorMutex.EnterWriteLock (); - base.ScrollY = value; - editorMutex.ExitWriteLock (); - RegisterForGraphicUpdate (); - } - } - #endregion - - - void loadSource () { - buffer.Load (projFile.Source); - projFile.RegisteredEditors [this] = true; - updateMaxScrollY (); - RegisterForGraphicUpdate (); - } - - int getTabulatedColumn (int col, int line) { - return buffer.GetSubString (buffer [line], - buffer.GetLineLength (line)).Substring(0,col).Replace ("\t", new String (' ', Interface.TabSize)).Length; - } - int getTabulatedColumn (Point pos) { - return getTabulatedColumn (pos.X,pos.Y); - } - - #region Drawing - void drawLines(Context gr, Rectangle cb) { - int longestTabulatedLine = 0; - for (int i = 0; i < visibleLines; i++) { - int lineIndex = i + ScrollY; - if (lineIndex >= buffer.LineCount)//TODO:need optimize - break; - - double y = cb.Y + (fe.Ascent+fe.Descent) * i, x = cb.X; - - int lineLength = buffer.GetLineLength (lineIndex); - if (lineIndex < buffer.LineCount - 1)//dont print line break - lineLength--; - string lstr = buffer.GetSubString (buffer [lineIndex], - lineLength).Replace ("\t", new String (' ', Interface.TabSize)); - - int lstrLength = lstr.Length; - if (lstrLength > longestTabulatedLine) - longestTabulatedLine = lstrLength; - - if (ScrollX < lstrLength) - lstr = lstr.Substring (ScrollX); - else - lstr = ""; - - gr.MoveTo (x, y + fe.Ascent); - gr.ShowText (lstr); - gr.Fill (); - - if (!buffer.SelectionIsEmpty && lineIndex >= buffer.SelectionStart.Y && lineIndex <= buffer.SelectionEnd.Y) { - double rLineX = x, - rLineY = y, - rLineW = lstr.Length * fe.MaxXAdvance; - - if (lineIndex == buffer.SelectionStart.Y) { - rLineX += (selStartCol - ScrollX) * fe.MaxXAdvance; - rLineW -= (selStartCol - ScrollX) * fe.MaxXAdvance; - } - if (lineIndex == buffer.SelectionEnd.Y) - rLineW -= (lstr.Length - selEndCol + ScrollX) * fe.MaxXAdvance; - - gr.Save (); - gr.Operator = Operator.Source; - gr.Rectangle (rLineX, rLineY, rLineW, (fe.Ascent+fe.Descent)); - gr.SetSourceColor (SelectionBackground); - gr.FillPreserve (); - gr.Clip (); - gr.Operator = Operator.Over; - gr.SetSourceColor (SelectionForeground); - gr.MoveTo (x, y + fe.Ascent); - gr.ShowText (lstr); - gr.Fill (); - gr.Restore (); - } - - - } - - updateMaxScrollX(longestTabulatedLine); - } - #endregion - - #region GraphicObject overrides - public override Font Font { - get { return base.Font; } - set { - base.Font = value; - - using (Surface img = new Surface (IFace.dev, 1, 1)) { - using (Context gr = new Context (img)) { - gr.FontFace = Font.Name; - gr.FontSize = (uint)Font.Size; - - fe = gr.FontExtents; - } - } - MaxScrollY = 0; - RegisterForGraphicUpdate (); - } - } - protected override int measureRawSize(LayoutingType lt) - { - if (lt == LayoutingType.Height) - return (int)Math.Ceiling((fe.Ascent+fe.Descent) * buffer.LineCount) + Margin * 2; - - return 0;// (int)(fe.MaxXAdvance * buffer.GetLineLength(buffer.longestLineIdx)) + Margin * 2; - } - public override void OnLayoutChanges (LayoutingType layoutType) - { - base.OnLayoutChanges (layoutType); - - if (layoutType == LayoutingType.Height) - updateVisibleLines (); - else if (layoutType == LayoutingType.Width) - updateVisibleColumns (); - } - - protected override void onDraw (Context gr) - { - base.onDraw (gr); - - gr.FontFace = Font.Name; - gr.FontSize = (uint)Font.Size; - //gr.FontOptions = Interface.FontRenderingOptions; - //gr.Antialias = Interface.Antialias; - - Rectangle cb = ClientRectangle; - - Foreground.SetAsSource (gr); - - buffer.editMutex.EnterReadLock (); - editorMutex.EnterReadLock (); - - #region draw text cursor - if (buffer.SelectionInProgress){ - selStartCol = getTabulatedColumn (buffer.SelectionStart); - selEndCol = getTabulatedColumn (buffer.SelectionEnd); - }else if (HasFocus && CurrentLine >= 0){ - gr.LineWidth = 1.0; - double cursorX = cb.X + (getTabulatedColumn(buffer.CurrentPosition) - ScrollX) * fe.MaxXAdvance ; - double cursorY = cb.Y + (buffer.CurrentLine - ScrollY) * (fe.Ascent+fe.Descent); - gr.MoveTo (0.5 + cursorX, cursorY); - gr.LineTo (0.5 + cursorX, cursorY + fe.Ascent+fe.Descent); - gr.Stroke(); - } - #endregion - - drawLines (gr, cb); - - editorMutex.ExitReadLock (); - - buffer.editMutex.ExitReadLock (); - - } - #endregion - - int getBufferColFromVisualCol (int line, int column) { - int i = 0; - int buffCol = 0; - int buffPtr = buffer [line]; - while (i < column && buffCol < buffer.GetLineLength(line)) { - if (buffer.GetCharAt(buffPtr + buffCol) == '\t') - i += Interface.TabSize; - else - i++; - buffCol++; - } - return buffCol; - } - - - #region Mouse handling - - int hoverLine = -1; - public int HoverLine { - get { return hoverLine; } - set { - if (hoverLine == value) - return; - hoverLine = value; - NotifyValueChanged ("HoverLine", hoverLine); - } - } - void updateHoverLine () { -// int hvl = (int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent+fe.Descent))); -// hvl = Math.Min (PrintedLines.Count, hvl); -// HoverLine = buffer.IndexOf (PrintedLines[hvl]); - } - void updateCurrentPosFromMouseLocalPos(){ - - buffer.CurrentLine = ScrollY + (int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent+fe.Descent))); - int curVisualCol = ScrollX + (int)Math.Round ((mouseLocalPos.X) / fe.MaxXAdvance); - buffer.CurrentColumn = getBufferColFromVisualCol (buffer.CurrentLine, curVisualCol); - } - - public override void onMouseEnter (object sender, MouseMoveEventArgs e) - { - base.onMouseEnter (sender, e); - IFace.MouseCursor = MouseCursor.IBeam; - } - public override void onMouseLeave (object sender, MouseMoveEventArgs e) - { - base.onMouseLeave (sender, e); - IFace.MouseCursor = MouseCursor.Arrow; - } - public override void onMouseMove (object sender, MouseMoveEventArgs e) - { - base.onMouseMove (sender, e); - - mouseLocalPos = e.Position - ScreenCoordinates(Slot).TopLeft - ClientRectangle.TopLeft; - - updateHoverLine (); - - if (e.Mouse.LeftButton == ButtonState.Released || !buffer.SelectionInProgress) - return; - - //mouse is down - updateCurrentPosFromMouseLocalPos(); - buffer.SetSelEndPos (); - } - public override void onMouseDown (object sender, MouseButtonEventArgs e) - { - if (!Focusable) - return; - - base.onMouseDown (sender, e); - - if (doubleClicked) { - doubleClicked = false; - return; - } - - updateCurrentPosFromMouseLocalPos (); - buffer.SetSelStartPos (); - } - public override void onMouseUp (object sender, MouseButtonEventArgs e) - { - base.onMouseUp (sender, e); - - if (buffer.SelectionIsEmpty) - buffer.ResetSelection (); - } - - public override void onMouseDoubleClick (object sender, MouseButtonEventArgs e) - { - //doubleClicked = true; - base.onMouseDoubleClick (sender, e); - - buffer.GotoWordStart (); - buffer.SetSelStartPos (); - buffer.GotoWordEnd (); - buffer.SetSelEndPos (); - } - - public override void onMouseWheel (object sender, MouseWheelEventArgs e) - { - base.onMouseWheel (sender, e); - } - #endregion - - #region Keyboard handling - public override void onKeyDown (object sender, KeyEventArgs e) - { - //base.onKeyDown (sender, e); - - Key key = e.Key; - - if (IFace.Ctrl) { - switch (key) { - case Key.S: - projFile.Save (); - break; - case Key.W: - editorMutex.EnterWriteLock (); - if (IFace.Shift) - projFile.Redo (null); - else - projFile.Undo (null); - editorMutex.ExitWriteLock (); - break; - default: - Console.WriteLine (""); - break; - } - } - - switch (key) - { - case Key.Backspace: - buffer.Delete (); - break; - case Key.Delete: - if (buffer.SelectionIsEmpty) - buffer.MoveRight (); -// else if (e.Shift) -// IFace.Clipboard = buffer.SelectedText; - buffer.Delete (); - break; - case Key.Enter: - case Key.KeypadEnter: - if (!buffer.SelectionIsEmpty) - buffer.Delete (); - buffer.InsertLineBreak (); - break; - case Key.Escape: - buffer.ResetSelection (); - break; - case Key.Home: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - if (IFace.Ctrl) - buffer.CurrentLine = 0; - buffer.CurrentColumn = 0; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - if (IFace.Ctrl) - buffer.CurrentLine = 0; - buffer.CurrentColumn = 0; - break; - case Key.End: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - if (IFace.Ctrl) - buffer.CurrentLine = int.MaxValue; - buffer.CurrentColumn = int.MaxValue; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - if (IFace.Ctrl) - buffer.CurrentLine = int.MaxValue; - buffer.CurrentColumn = int.MaxValue; - break; - case Key.Insert: - if (IFace.Shift) - buffer.InsertAt (IFace.Clipboard); - else if (IFace.Ctrl && !buffer.SelectionIsEmpty) - IFace.Clipboard = buffer.SelectedText; - break; - case Key.Left: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - if (IFace.Ctrl) - buffer.GotoWordStart (); - else - buffer.MoveLeft (); - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - if (IFace.Ctrl) - buffer.GotoWordStart (); - else - buffer.MoveLeft(); - break; - case Key.Right: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - if (IFace.Ctrl) - buffer.GotoWordEnd (); - else - buffer.MoveRight (); - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - if (IFace.Ctrl) - buffer.GotoWordEnd (); - else - buffer.MoveRight (); - break; - case Key.Up: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - CurrentLine--; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - CurrentLine--; - break; - case Key.Down: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - CurrentLine++; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - CurrentLine++; - break; - case Key.Menu: - break; - case Key.NumLock: - break; - case Key.PageDown: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - CurrentLine += visibleLines; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - CurrentLine += visibleLines; - break; - case Key.PageUp: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - CurrentLine -= visibleLines; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - CurrentLine -= visibleLines; - break; - case Key.Tab: - buffer.InsertAt ("\t"); - break; - default: - break; - } - RegisterForGraphicUpdate(); - } - public override void onKeyPress (object sender, KeyPressEventArgs e) - { - base.onKeyPress (sender, e); - - buffer.InsertAt (e.KeyChar.ToString()); - buffer.ResetSelection (); - } - #endregion - } -} \ No newline at end of file diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs deleted file mode 100644 index f7b2e518..00000000 --- a/Samples/CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace Crow.Coding -{ - public struct TextFormatting { - public Color Foreground; - public Color Background; - public bool Bold; - public bool Italic; - - public TextFormatting(Color fg, Color bg, bool bold = false, bool italic = false){ - Foreground = fg; - Background = bg; - Bold = bold; - Italic = italic; - } - } -} - diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/Token.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/Token.cs deleted file mode 100644 index 8b4df5e5..00000000 --- a/Samples/CrowIDE/src/Editors/CodeBuffer/Token.cs +++ /dev/null @@ -1,71 +0,0 @@ -// -// Token.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2017 jp -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -using System; - -namespace Crow.Coding -{ - public struct Token - { - public BufferParser.TokenType Type; - public string Content; - public Point Start; - public Point End; - - public string PrintableContent { - get { return string.IsNullOrEmpty(Content) ? "" : Content.Replace("\t", new String(' ', Interface.TabSize)); } - } - -// public Token (TokenType tokType, string content = ""){ -// Type = tokType; -// Content = content; -// } - - public bool IsNull { get { return IsEmpty && Type == BufferParser.TokenType.Unknown; }} - public bool IsEmpty { get { return string.IsNullOrEmpty(Content); }} - - public static bool operator == (Token t, System.Enum tt){ - return Convert.ToInt32(t.Type) == Convert.ToInt32(tt); - } - public static bool operator != (Token t, System.Enum tt){ - return Convert.ToInt32(t.Type) != Convert.ToInt32(tt); - } - public static bool operator == (System.Enum tt, Token t){ - return Convert.ToInt32(t.Type) == Convert.ToInt32(tt); - } - public static bool operator != (System.Enum tt, Token t){ - return Convert.ToInt32(t.Type) != Convert.ToInt32(tt); - } - - public static Token operator +(Token t, char c){ - t.Content += c; - return t; - } - public static Token operator +(Token t, string s){ - t.Content += s; - return t; - } - public override string ToString () - { - return string.Format ("[Tok{2}->{3}:{0}: {1}]", Type,Content,Start,End); - } - } -} - diff --git a/Samples/CrowIDE/src/Editors/EditPane.cs b/Samples/CrowIDE/src/Editors/EditPane.cs deleted file mode 100644 index a75522f0..00000000 --- a/Samples/CrowIDE/src/Editors/EditPane.cs +++ /dev/null @@ -1,57 +0,0 @@ -// -// EditPane.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using Crow; -using System.Linq; - -namespace Crow.Coding -{ - public class EditPane : TemplatedGroup - { - public EditPane () {} - - object selectedItemElement = null; - - public override int SelectedIndex { - get { - return base.SelectedIndex; - } - set { - base.SelectedIndex = value; - } - } - public object SelectedItemElement { - get { return selectedItemElement; } - set { - if (selectedItemElement == value) - return; - selectedItemElement = value; - NotifyValueChanged ("SelectedItemElement", selectedItemElement); - } - } - } -} - diff --git a/Samples/CrowIDE/src/Editors/Editor.cs b/Samples/CrowIDE/src/Editors/Editor.cs deleted file mode 100644 index 102debb5..00000000 --- a/Samples/CrowIDE/src/Editors/Editor.cs +++ /dev/null @@ -1,105 +0,0 @@ -// -// Editor.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.Threading; -using System.Xml.Serialization; - -namespace Crow.Coding -{ - public abstract class Editor : ScrollingObject - { - #region CTOR - protected Editor ():base(){ - Thread t = new Thread (backgroundThreadFunc); - t.IsBackground = true; - t.Start (); - } - #endregion - - protected ReaderWriterLockSlim editorMutex = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); - protected ProjectFile projFile = null; - Exception error = null; - - public virtual ProjectFile ProjectNode - { - get { return projFile; } - set - { - if (projFile == value) - return; - - if (projFile != null) - projFile.UnregisterEditor (this); - - projFile = value; - - if (projFile != null) - projFile.RegisterEditor (this); - - NotifyValueChanged ("ProjectNode", projFile); - } - } - [XmlIgnore]public Exception Error { - get { return error; } - set { - if (error == value) - return; - error = value; - NotifyValueChanged ("Error", error); - NotifyValueChanged ("HasError", HasError); - } - } - [XmlIgnore]public bool HasError { - get { return error != null; } - } - - protected abstract void updateEditorFromProjFile (); - protected abstract void updateProjFileFromEditor (); - protected abstract bool EditorIsDirty { get; set; } - protected virtual bool IsReady { get { return true; }} - protected virtual void updateCheckPostProcess () {} - - protected void backgroundThreadFunc () { - while (true) { - 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); - } - } - Thread.Sleep (100); - } - } - } -} - diff --git a/Samples/CrowIDE/src/Editors/ImlSchematicEditor.cs b/Samples/CrowIDE/src/Editors/ImlSchematicEditor.cs deleted file mode 100644 index 64541c90..00000000 --- a/Samples/CrowIDE/src/Editors/ImlSchematicEditor.cs +++ /dev/null @@ -1,132 +0,0 @@ -// -// ImlVisualEditor.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2016 jp -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -using System; -using Crow; -using System.Threading; -using System.Xml.Serialization; -using System.ComponentModel; -using System.IO; -using System.Collections.Generic; -using Crow.IML; -using System.Text; -using System.Xml; - -namespace Crow.Coding -{ - public class ImlSchematicEditor : TemplatedGroup - { - #region CTOR - public ImlSchematicEditor () - { - } - #endregion - - ProjectFile projNode; - Widget selectedItem; - ImlProjectItem imlProjFile; - Exception imlError = null; - - bool drawGrid, snapToGrid; - int gridSpacing; - - [DefaultValue(true)] - public bool DrawGrid { - get { return drawGrid; } - set { - if (drawGrid == value) - return; - drawGrid = value; - NotifyValueChanged ("DrawGrid", drawGrid); - RegisterForRedraw (); - } - } - [DefaultValue(true)] - public bool SnapToGrid { - get { return snapToGrid; } - set { - if (snapToGrid == value) - return; - snapToGrid = value; - NotifyValueChanged ("SnapToGrid", snapToGrid); - } - } - [DefaultValue(10)] - public int GridSpacing { - get { return gridSpacing; } - set { - if (gridSpacing == value) - return; - gridSpacing = value; - NotifyValueChanged ("GridSpacing", gridSpacing); - RegisterForRedraw (); - } - } - public Widget SelectedItem { - get { return selectedItem; } - set { - if (selectedItem == value) - return; - selectedItem = value; - NotifyValueChanged ("SelectedItem", selectedItem); - RegisterForRedraw (); - } - } -// public override ProjectFile ProjectNode { -// get { -// return projNode; -// } -// set { -// if (projNode == value) -// return; -// projNode = value; -// NotifyValueChanged ("ProjectNode", projNode); -// -// if (projNode is ImlProjectItem) -// imlProjFile = projNode as ImlProjectItem; -// else -// imlProjFile = null; -// } -// } - - -// protected override bool EditorIsDirty { -// get { -// throw new NotImplementedException (); -// } -// set { -// throw new NotImplementedException (); -// } -// } -// protected override void updateProjFileFromEditor () -// { -// -// } -// protected override void updateEditorFromProjFile () { -// -// } -// protected override void updateCheckPostProcess () -// { -// -// } - - - } -} diff --git a/Samples/CrowIDE/src/Editors/ImlVisualEditor.cs b/Samples/CrowIDE/src/Editors/ImlVisualEditor.cs deleted file mode 100644 index 75d8206b..00000000 --- a/Samples/CrowIDE/src/Editors/ImlVisualEditor.cs +++ /dev/null @@ -1,908 +0,0 @@ -// -// ImlVisualEditor.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2016 jp -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -using System; -using Crow; -using System.Threading; -using System.Xml.Serialization; -using System.ComponentModel; -using System.IO; -using System.Collections.Generic; -using Crow.IML; -using System.Text; -using System.Xml; -using System.Diagnostics; -using vkvg; - -namespace Crow.Coding -{ - public class ImlVisualEditor : Editor - { - #region CTOR - public ImlVisualEditor () : base() - { - //imlVE = new DesignInterface (Interface.de); - initCommands (); - } - #endregion - - protected override void onInitialized (object sender, EventArgs e) - { - initIcons (); - base.onInitialized (sender, e); - } - DesignInterface imlVE; - Widget selectedItem; - ImlProjectItem imlProjFile; - - bool editorIsDirty = false;//needed when tree is empty - bool drawGrid, snapToGrid; - int gridSpacing, zoom = 100; - Measure designWidth, designHeight; - bool updateEnabled; - - Picture icoMove, icoStyle; - Rectangle rIcons = default(Rectangle); - Size iconSize = new Size(11,11); - - public List Commands; - Crow.Command cmdDelete; - - void initCommands () { - cmdDelete = new Crow.Command (new Action (() => deleteObject (SelectedItem))) - { Caption = "Delete", Icon = new SvgPicture ("#CrowIDE.icons.save.svg"), CanExecute = true }; - Commands = new List (new Crow.Command[] { cmdDelete }); - } - - void initIcons () { - icoMove = new SvgPicture ("#CrowIDE.icons.move-arrows.svg"); - - // icoStyle = new SvgPicture (); - // icoStyle.Load (IFace, "#CrowIDE.icons.palette.svg"); - } - - [DefaultValue(true)] - public bool DrawGrid { - get { return drawGrid; } - set { - if (drawGrid == value) - return; - drawGrid = value; - NotifyValueChanged ("DrawGrid", drawGrid); - RegisterForRedraw (); - } - } - [DefaultValue(true)] - public bool SnapToGrid { - get { return snapToGrid; } - set { - if (snapToGrid == value) - return; - snapToGrid = value; - NotifyValueChanged ("SnapToGrid", snapToGrid); - } - } - [DefaultValue(10)] - public int GridSpacing { - get { return gridSpacing; } - set { - if (gridSpacing == value) - return; - gridSpacing = value; - NotifyValueChanged ("GridSpacing", gridSpacing); - RegisterForRedraw (); - } - } - [DefaultValue(100)] - public int Zoom { - get { return zoom; } - set { - if (zoom == value) - return; - - zoom = value; - NotifyValueChanged ("Zoom", zoom); - Width = (int)(designWidth * zoom / 100.0); - Height = (int)(designHeight * zoom / 100.0); - } - } - [DefaultValue("512")] - public Measure DesignWidth { - get { return designWidth; } - set { - if (designWidth == value) - return; - designWidth = value; - NotifyValueChanged ("DesignWidth", designWidth); - Width = (int)(designWidth * zoom / 100.0); - } - } - [DefaultValue("400")] - public Measure DesignHeight { - get { return designHeight; } - set { - if (designHeight == value) - return; - designHeight = value; - NotifyValueChanged ("DesignHeight", designHeight); - Height = (int)(designHeight * zoom / 100.0); - } - } - - public Widget SelectedItem { - get { return selectedItem; } - set { - if (selectedItem == value) - return; - selectedItem = value; - - if (selectedItem == null) - cmdDelete.CanExecute = false; - else - cmdDelete.CanExecute = true; - - NotifyValueChanged ("SelectedItem", selectedItem); - RegisterForGraphicUpdate (); - } - } - /// PoinprojFilever the widget - public virtual Widget HoverWidget - { - get { return imlVE.HoverWidget; } - set { - if (HoverWidget == value) - return; - - imlVE.HoverWidget = value; - - NotifyValueChanged ("HoverWidget", HoverWidget); - } - } - /// - /// use to disable update if tab is not the visible one - /// - public bool UpdateEnabled { - get { return updateEnabled; } - set { - if (value == updateEnabled) - return; - updateEnabled = value; - NotifyValueChanged ("UpdateEnabled", updateEnabled); - } - } - - public List GraphicTree { - get { return imlVE.GraphicTree; } - } - - [XmlIgnore]public List LQIs { - get { return imlVE.LQIs; } - } - - #region editor overrides - public override ProjectFile ProjectNode { - get { - return base.ProjectNode; - } - set { - base.ProjectNode = value; - imlProjFile = projFile as ImlProjectItem; - imlVE.ProjFile = imlProjFile; - } - } - - protected override bool EditorIsDirty { - get { return imlProjFile == null ? false : - imlProjFile.Instance == null ? editorIsDirty : - imlProjFile.Instance.design_HasChanged | editorIsDirty; } - set { - editorIsDirty = value; - if (GraphicTree.Count == 0) - return; - if (GraphicTree [0] != null) - GraphicTree [0].design_HasChanged = value; - } - } - protected override bool IsReady { - get { return updateEnabled && imlVE != null && imlProjFile != null; } - } - - protected override void updateProjFileFromEditor () - { - Debug.WriteLine("\t\tImlEditor updateProjFileFromEditor"); - try { - if (imlProjFile.Instance == null) - projFile.UpdateSource(this, @""); - else - projFile.UpdateSource(this, imlProjFile.Instance.GetIML()); - } catch (Exception ex) { - Error = ex.InnerException; - if (Monitor.IsEntered(imlVE.UpdateMutex)) - Monitor.Exit (imlVE.UpdateMutex); - } - } - protected override void updateEditorFromProjFile () { - Debug.WriteLine("\t\tImlEditor updateEditorFromProjFile"); - try { - string selItemDesignID = null; - if (SelectedItem!=null) - selItemDesignID = SelectedItem.design_id; - imlVE.ClearInterface(); - Instantiator.NextInstantiatorID = 0; - imlVE.Styling = projFile.Project.solution.Styling; - imlVE.DefaultValuesLoader.Clear(); - //imlVE.DefaultTemplates = projFile.Project.solution.DefaultTemplates; - imlVE.Instantiators = new Dictionary(); - - //prevent error on empty file - bool emptyFile = true; - string src = projFile.Source; - using (Stream s = new MemoryStream (Encoding.UTF8.GetBytes (src))) { - using (XmlReader itr = XmlReader.Create (s)) { - while(itr.Read()){ - if (itr.NodeType == XmlNodeType.Element){ - emptyFile = false; - break; - } - } - } - } - Widget go = null; - Error = null; - - if (emptyFile){ - imlProjFile.Instance = null; - }else{ - imlVE.LoadIMLFragment(src); - imlProjFile.Instance = imlVE.GraphicTree[0]; - if (selItemDesignID!=null) - imlProjFile.Instance.FindByDesignID(selItemDesignID,out go); - - } - SelectedItem = go; - } catch (Exception ex) { - Error = ex; - } - } - protected override void updateCheckPostProcess () - { - if (Error != null) { - RegisterForRedraw (); - return; - } - imlVE.Update (); - bool isDirty = false; - - lock (imlVE.RenderMutex) - isDirty = imlVE.IsDirty; - - if (isDirty) { - lock (IFace.UpdateMutex) - RegisterForRedraw (); - } - } - #endregion - - #region GraphicObject overrides - public override void OnLayoutChanges (LayoutingType layoutType) - { - 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; - } - } - - public override void onMouseMove (object sender, MouseMoveEventArgs e) - { - base.onMouseMove (sender, e); - - Widget oldHW = HoverWidget; - Rectangle scr = this.ScreenCoordinates (this.getSlot ()); - ProcessMouseMove (e.X - scr.X, e.Y - scr.Y); - - Widget newHW = HoverWidget; - if (newHW == null) - return; - - if (draggedObj != null) { - if (draggedObj.Parent == null) { - if (tryAddObjectTo (newHW, draggedObj)) { - RegisterForRedraw (); - return; - } - } else if (newHW != draggedObj) { - //lock (imlVE.UpdateMutex) { - ILayoutable possibleParent = getPossibleParent (newHW, draggedObj); - if (possibleParent == null) { - Group g = newHW.Parent as Group; - if (g != null && g != draggedObj) { - removeObject (draggedObj); - g.InsertChild (g.Children.IndexOf (newHW), draggedObj); - RegisterForRedraw (); - return; - } - } else if (possibleParent != draggedObj.Parent) { - removeObject (draggedObj); - if (tryAddObjectTo (possibleParent, draggedObj)) { - RegisterForRedraw (); - return; - } - } - //} - } - } - - if (oldHW == newHW) - return; - //RegisterForRedraw (); - - } - public override void onMouseEnter (object sender, MouseMoveEventArgs e) - { - base.onMouseEnter (sender, e); - if (IFace.DragAndDropOperation != null && draggedObj == null) - return; - IFace.FocusedWidget = this; - } - public override void onMouseLeave (object sender, MouseMoveEventArgs e) - { - base.onMouseLeave (sender, e); -// IFace.FocusedWidget = null; - } - public override void onMouseDown (object sender, MouseButtonEventArgs e) - { - if (e.Mouse.RightButton == ButtonState.Pressed) { - base.onMouseDown (sender, e); - return; - } - SelectedItem = HoverWidget; - -// if (SelectedItem != null && projFile != null) { -// projFile.CurrentLine = SelectedItem.design_line; -// projFile.CurrentColumn = SelectedItem.design_column; -// } - - } - - protected override void onDraw (Context gr) - { - base.onDraw (gr); - - Rectangle cb = new Rectangle (0, 0, designWidth, designHeight); - - gr.Save (); - - double z = zoom / 100.0; - - gr.Scale (z, z); - - if (drawGrid) { - double gridLineWidth = 0.2 / z; - double glhw = gridLineWidth / 2.0; - int nbLines = cb.Width / gridSpacing; - double d = cb.Left + gridSpacing; - for (int i = 0; i < nbLines; i++) { - gr.MoveTo (d - glhw, cb.Y); - gr.LineTo (d - glhw, cb.Bottom); - d += gridSpacing; - } - nbLines = cb.Height / gridSpacing; - d = cb.Top + gridSpacing; - for (int i = 0; i < nbLines; i++) { - gr.MoveTo (cb.X, d - glhw); - gr.LineTo (cb.Right, d - glhw); - d += gridSpacing; - } - gr.LineWidth = gridLineWidth; - Foreground.SetAsSource (gr, cb); - gr.Stroke (); - } - - lock (imlVE.RenderMutex) { - gr.SetSourceSurface (imlVE.surf, cb.Left, cb.Top); - gr.Paint (); - imlVE.IsDirty = false; - } - /*if (Error == null) { - gr.SetSourceColor (Color.Black); - gr.Rectangle (cb, 1.0 / z); - } else { - gr.SetSourceColor (Color.LavenderBlush); - gr.Rectangle (cb, 2.0 / z); - string[] lerrs = Error.ToString ().Split ('\n'); - Point p = cb.Center; - p.Y -= lerrs.Length * 20; - foreach (string le in lerrs) { - drawCenteredTextLine(gr, p, le); - p.Y += 20; - - } - } - gr.Stroke ();*/ - - Rectangle hr; - - /* - if (SelectedItem?.Parent != null) { - - gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight); - gr.SetFontSize (Font.Size); - gr.FontOptions = Interface.FontRenderingOptions; - gr.Antialias = Interface.Antialias; - - Widget g = SelectedItem; - hr = g.ScreenCoordinates (g.getSlot ()); - -// Rectangle rIcons = new Rectangle (iconSize); -// rIcons.Width *= 4; -// rIcons.Top = hr.Bottom; -// rIcons.Left = hr.Right - rIcons.Width + iconSize.Width; - Rectangle rIcoMove = new Rectangle (hr.BottomRight, iconSize); -// Rectangle rIcoStyle = rIcoMove; -// rIcoStyle.Left += iconSize.Width + 4; - - using (Surface mask = new ImageSurface (Format.Argb32, cb.Width, cb.Height)) { - using (Context ctx = new Context (mask)) { - ctx.Save(); - ctx.SetSourceRGBA(1.0,1.0,1.0,0.4); - ctx.Paint (); - ctx.Rectangle (hr); - ctx.Operator = Operator.Clear; - ctx.Fill (); - } - - gr.SetSourceSurface (mask, 0, 0); - gr.Paint (); - - using (Surface ol = new ImageSurface (Format.Argb32, cb.Width, cb.Height)) { - using (Context ctx = new Context (ol)) { - ctx.SetSourceColor (Color.Black); - drawDesignOverlay (ctx, g, cb, hr, 0.4 / z, 6.5); - } - - gr.SetSourceSurface (ol, 0, 0); - gr.Paint (); - } - - drawIcon (gr, icoMove, rIcoMove); - //drawIcon (gr, icoStyle, rIcoStyle); - - } - }*/ - if (HoverWidget != null) { - hr = HoverWidget.ScreenCoordinates (HoverWidget.getSlot ()); - gr.SetSourceColor (Color.SkyBlue); - //gr.SetDash (new double[]{ 5.0, 3.0 }, 0.0); - gr.Rectangle (hr, 0.4 / z); - } - gr.Restore (); - } - - void drawIcon (Context gr, Picture pic, Rectangle r) {/* -// gr.SetSourceColor (Color.Black); -// CairoHelpers.CairoRectangle (gr, r.Inflated (1), 2, 1.0); - gr.SetSourceColor (Color.White); - CairoHelpers.CairoRectangle (gr, r.Inflated (1), 2); - gr.Fill (); - gr.Operator = Operator.Clear; - pic.Paint (gr, r); - gr.Operator = Operator.Over;*/ - } - void drawDesignOverlay (Context gr, Widget g, Rectangle cb, Rectangle hr, double coteStroke, double space = 6.5){ - /* - double z = zoom / 100.0; - double coteW = 3, coteL = 5; - bool fill = true; - Crow.Cairo.PointD p1 = new Crow.Cairo.PointD (hr.X + 0.5, hr.Y - space); - Crow.Cairo.PointD p2 = new Crow.Cairo.PointD (hr.Right - 0.5, hr.Y - space); - - if (p1.Y < cb.Top) { - if (hr.Bottom > cb.Bottom - space) - p1.Y = p2.Y = hr.Bottom - space; - else - p1.Y = p2.Y = hr.Bottom + space; - } - - if (g.Width.IsFit) - gr.DrawCoteInverse (p1, p2, coteStroke, fill, coteW, coteL); - else if (g.Width.IsRelativeToParent) { - gr.DrawCote (p1, p2, coteStroke, fill, coteW, coteL); - if (g.Width.Value < 100) - drawCenteredTextLine (gr, p1.Add(p2.Substract(p1).Divide (2)), g.Width.ToString()); - }else if (g.Width.IsFixed) { - gr.DrawCoteFixed (p1, p2, coteStroke * 2.0, coteW); - drawCenteredTextLine (gr, p1.Add(p2.Substract(p1).Divide (2)), g.Width.Value.ToString()); - } - - p1 = new Crow.Cairo.PointD (hr.X - space, hr.Top + 0.5); - p2 = new Crow.Cairo.PointD (hr.X - space, hr.Bottom - 0.5); - - if (p1.X < cb.Left) { - if (hr.Right > cb.Right - space) - p1.X = p2.X = hr.Right - space; - else - p1.X = p2.X = hr.Right + space; - } - if (g.Height.IsFit) - gr.DrawCoteInverse (p1, p2, coteStroke, fill, coteW, coteL); - else if (g.Height.IsRelativeToParent){ - gr.DrawCote (p1, p2, coteStroke, fill, coteW, coteL); - if (g.Height.Value < 100) - drawCenteredTextLine (gr, p1.Add(p2.Substract(p1).Divide (2)), g.Height.ToString()); - }else if (g.Width.IsFixed) { - gr.DrawCoteFixed (p1, p2, coteStroke * 2.0, coteW); - drawCenteredTextLine (gr, p1.Add(p2.Substract(p1).Divide (2)), g.Height.Value.ToString()); - } - - // hr.Inflate (2); - //gr.SetDash (new double[]{ 1.0, 4.0 }, 0.0); - //gr.SetSourceColor (Color.Grey); -// gr.Rectangle (hr,coteStroke); -// gr.Stroke (); - gr.Operator = Operator.Over; - */ - } - - void drawCenteredTextLine (Context gr, Point center, string txt){ - drawCenteredTextLine (gr, new PointD(center.X,center.Y), txt); - } - void drawCenteredTextLine (Context gr, PointD center, string txt){ - if (string.IsNullOrEmpty(txt)) - return; - FontExtents fe = gr.FontExtents; - TextExtents te = gr.TextExtents (txt); - - Rectangle rText = new Rectangle( - (int)(center.X - te.Width / 2), (int)(center.Y - (fe.Ascent + fe.Descent) / 2), - (int)te.Width, (int)(fe.Ascent + fe.Descent)); - - gr.Operator = Operator.Clear; - Rectangle r = rText; - r.Inflate (2); - gr.Rectangle (r); - gr.Fill (); - gr.Operator = Operator.Over; - - gr.MoveTo (rText.X, rText.Y + fe.Ascent); - gr.ShowText (txt); - gr.Fill (); - - } - protected override void onDragEnter (object sender, DragDropEventArgs e) - { - base.onDragEnter (sender, e); - GraphicObjectDesignContainer godc = e.DragSource.DataSource as GraphicObjectDesignContainer; - if (godc == null) - return; - createDraggedObj (godc.CrowType); - } - protected override void onDragLeave (object sender, DragDropEventArgs e) - { - base.onDragLeave (sender, e); - GraphicObjectDesignContainer godc = e.DragSource.DataSource as GraphicObjectDesignContainer; - if (godc == null) - return; - ClearDraggedObj (); - } - - protected override void onStartDrag (object sender, DragDropEventArgs e) - { - base.onStartDrag (sender, e); - if (SelectedItem == null) - return; - - Widget dumy = new Widget (IFace); - dumy.EndDrag += dumyOnEndDrag; - dumy.Drop += dumyOnDrop; - dumy.IsDragged = true; - IFace.ActiveWidget = dumy; - e.DragSource.IsDragged = false; - IFace.DragAndDropOperation.DragSource = dumy; - draggedObj = SelectedItem; - int dragIconSize = 48; - lock (IFace.UpdateMutex) { - IFace.DragImageHeight = dragIconSize; - IFace.DragImageWidth = dragIconSize; - IFace.DragImage = draggedObj.CreateIcon(dragIconSize); - } - removeObject (draggedObj); - SelectedItem = null; - HoverWidget = null; - } - void dumyOnEndDrag (object sender, DragDropEventArgs e) - { - IFace.ClearDragImage (); - } - void dumyOnDrop (object sender, DragDropEventArgs e) - { - ClearDraggedObj (false); - IFace.ClearDragImage (); - } - #endregion - - - #region draggedObj handling - - public Widget draggedObj = null; - - void createDraggedObj (Type crowType) { - lock (imlVE.UpdateMutex) { - draggedObj = imlVE.CreateITorFromIMLFragment ("<" + crowType.Name + "/>").CreateInstance (); - } - } - - public void ClearDraggedObj (bool removeFromTree = true) { - if (removeFromTree) - deleteObject (draggedObj); - draggedObj = null; - } - #endregion - - void removeObject (Widget go) { - if (go == null) - return; - if (go.Parent == null) - return; -// lock (imlVE.UpdateMutex) { - Interface i = go.Parent as Interface; - if (i != null) { - i.RemoveWidget (go); - imlProjFile.Instance = null; - } else { - Container c = go.Parent as Container; - if (c != null) - c.SetChild (null); - else { - TemplatedContainer tc = go.Parent as TemplatedContainer; - if (tc != null) - tc.Content = null; - else { - Group g = go.Parent as Group; - if (g != null) - g.RemoveChild (go); - } - } - } - EditorIsDirty = true; - //} - } - void deleteObject (Widget go) { - if (go == null) - return; - //lock (imlVE.UpdateMutex) { - removeObject (go); - go.Dispose (); - //} - } - - ILayoutable getPossibleParent (ILayoutable parent, Widget go) { - if (go == null) - return null; -// lock (imlVE.UpdateMutex) { - - Interface i = null; - if (parent == null) - i = imlVE; - else - i = parent as Interface; - if (i != null) - return i.GraphicTree.Count > 0 ? null : i; - - Container c = parent as Container; - if (c != null) - return c.Child == null || c.Child == go ? c : null; - - TemplatedContainer tc = parent as TemplatedContainer; - if (tc != null) - return tc.Content == null || tc.Content == go? tc : null; - - return parent as Group; -// } - } - bool tryAddObjectTo (ILayoutable parent, Widget go) { - if (go == null) - return false; -// lock (imlVE.UpdateMutex) { - Interface i = null; - if (parent == null) - i = imlVE; - else - i = parent as Interface; - if (i != null) { - if (i.GraphicTree.Count > 0) - return false; - i.AddWidget (go); - imlProjFile.Instance = go; - EditorIsDirty = true; - return true; - } - Container c = parent as Container; - if (c != null) { - if (c.Child != null) - return false; - //return tryAddObjectTo (c.Parent, go); - c.SetChild (go); - EditorIsDirty = true; - return true; - } - TemplatedContainer tc = parent as TemplatedContainer; - if (tc != null) { - if (tc.Content != null) - return false; - //return tryAddObjectTo (c.Parent, go); - tc.Content = (go); - EditorIsDirty = true; - return true; - } - Group g = parent as Group; - if (g != null) { - g.AddChild (go); - EditorIsDirty = true; - return true; - } - return false;//tryAddObjectTo (parent.Parent, go); -// } - } - - - - void WidgetCheckOver (Widget go, MouseMoveEventArgs e){ - Type tGo = go.GetType(); - if (typeof(TemplatedGroup).IsAssignableFrom (tGo)) { - - } else if (typeof(TemplatedContainer).IsAssignableFrom (tGo)) { - TemplatedContainer c = go as TemplatedContainer; - if (c.Content?.MouseIsIn (e.Position) == true) { - WidgetCheckOver (c.Content, e); - return; - } - } else if (typeof(TemplatedControl).IsAssignableFrom (tGo)) { - } else if (typeof(Group).IsAssignableFrom (tGo)) { - Group c = go as Group; - for (int i = c.Children.Count -1; i >= 0; i--) { - if (c.Children[i].MouseIsIn (e.Position)) { - WidgetCheckOver (c.Children[i], e); - return; - } - } - } else if (typeof(Crow.Container).IsAssignableFrom (tGo)) { - Crow.Container c = go as Crow.Container; - if (c.Child?.MouseIsIn (e.Position)==true) { - WidgetCheckOver (c.Child, e); - return; - } - } - HoverWidget = go; - WidgetMouseEnter (go, e); - } - void WidgetMouseLeave (Widget go, MouseMoveEventArgs e){ - - } - void WidgetMouseEnter (Widget go, MouseMoveEventArgs e){ - - } - void WidgetMouseMove (Widget go, MouseMoveEventArgs e){} - - public bool ProcessMouseMove(int x, int y) - { - int deltaX = x - imlVE.Mouse.X; - int deltaY = y - imlVE.Mouse.Y; - imlVE.Mouse.X = x; - imlVE.Mouse.Y = y; - MouseMoveEventArgs e = new MouseMoveEventArgs (x, y, deltaX, deltaY); - e.Mouse = imlVE.Mouse; - - if (imlVE.ActiveWidget != null) { - //TODO, ensure object is still in the graphic tree - //send move evt even if mouse move outside bounds - WidgetMouseMove (imlVE.ActiveWidget, e); - return true; - } - - if (HoverWidget != null) { - //TODO, ensure object is still in the graphic tree - //check topmost graphicobject first - Widget tmp = HoverWidget; - Widget topc = null; - while (tmp is Widget) { - topc = tmp; - tmp = tmp.LogicalParent as Widget; - } - int idxhw = imlVE.GraphicTree.IndexOf (topc); - if (idxhw != 0) { - int i = 0; - while (i < idxhw) { - if (imlVE.GraphicTree [i].LogicalParent == imlVE.GraphicTree [i].Parent) { - if (imlVE.GraphicTree [i].MouseIsIn (e.Position)) { - while (imlVE.HoverWidget != null) { - WidgetMouseLeave (imlVE.HoverWidget, e); - imlVE.HoverWidget = imlVE.HoverWidget.LogicalParent as Widget; - } - - WidgetCheckOver (GraphicTree [i], e); - return true; - } - } - i++; - } - } - - - if (imlVE.HoverWidget.MouseIsIn (e.Position)) { - WidgetCheckOver (imlVE.HoverWidget, (e)); - return true; - } else { - WidgetMouseLeave (imlVE.HoverWidget, e); - //seek upward from last focused graph obj's - while (imlVE.HoverWidget.LogicalParent as Widget != null) { - imlVE.HoverWidget = imlVE.HoverWidget.LogicalParent as Widget; - if (imlVE.HoverWidget.MouseIsIn (e.Position)) { - WidgetCheckOver (imlVE.HoverWidget, e); - return true; - } else - WidgetMouseLeave (imlVE.HoverWidget, e); - } - } - } - - //top level graphic obj's parsing - lock (imlVE.GraphicTree) { - for (int i = 0; i < imlVE.GraphicTree.Count; i++) { - Widget g = imlVE.GraphicTree [i]; - if (g.MouseIsIn (e.Position)) { - WidgetCheckOver (g, e); - return true; - } - } - } - imlVE.HoverWidget = null; - return false; - - } - - void GTView_SelectedItemChanged (object sender, SelectionChangeEventArgs e) - { - SelectedItem = e.NewValue as Widget; - } - - - public override void onKeyDown (object sender, KeyEventArgs e) - { - - switch (e.Key) { - case Key.Delete: - if (selectedItem == null) - return; - deleteObject (selectedItem); - break; - case Key.Escape: - SelectedItem = null; - break; - } - } - } -} diff --git a/Samples/CrowIDE/src/Editors/Parsers/BufferParser.cs b/Samples/CrowIDE/src/Editors/Parsers/BufferParser.cs deleted file mode 100644 index c193c7db..00000000 --- a/Samples/CrowIDE/src/Editors/Parsers/BufferParser.cs +++ /dev/null @@ -1,380 +0,0 @@ -using System; -using System.IO; -using Crow; -using System.Collections.Generic; -using System.Diagnostics; -using System.Text; - -namespace Crow.Coding -{ - /// - /// base class for tokenizing sources - /// - public abstract class BufferParser - { - /// - /// Default tokens, this enum may be overriden in derived parser with the new keyword, - /// see XMLParser for example. - /// - public enum TokenType { - Unknown = 0, - WhiteSpace = 1, - NewLine = 2, - LineComment = 3, - BlockCommentStart = 4, - BlockComment = 5, - BlockCommentEnd = 6, - Preprocessor = 7, - Identifier = 8, - Keyword = 9, - OpenBlock = 10, - CloseBlock = 11, - StatementEnding = 12, - OperatorOrPunctuation = 13, - IntegerLitteral = 14, - RealLitteral = 15, - StringLitteralOpening = 16, - StringLitteralClosing = 17, - StringLitteral = 18, - CharLitteralOpening = 19, - CharLitteralClosing = 20, - CharLitteral = 21, - BoolLitteral = 22, - NullLitteral = 23, - Type = 24, - } - - #region CTOR - public BufferParser (CodeBuffer _buffer) - { - buffer = _buffer; - - buffer.LineUpadateEvent += Buffer_LineUpadateEvent; - //buffer.LineAdditionEvent += Buffer_LineAdditionEvent;; - buffer.LineRemoveEvent += Buffer_LineRemoveEvent; - buffer.BufferCleared += Buffer_BufferCleared; - } - - #endregion - - #region Buffer events handlers - void Buffer_BufferCleared (object sender, EventArgs e) - { - - } - void Buffer_LineAdditionEvent (object sender, CodeBufferEventArgs e) - { - - } - void Buffer_LineRemoveEvent (object sender, CodeBufferEventArgs e) - { - reparseSource (); - } - void Buffer_LineUpadateEvent (object sender, CodeBufferEventArgs e) - { - for (int i = 0; i < e.LineCount; i++) - TryParseBufferLine (e.LineStart + i); - reparseSource (); - } - #endregion - - internal int currentLine = 0; - internal int currentColumn = 0; - - int syntTreeDepth = 0; - public int SyntacticTreeDepth { - get { return syntTreeDepth;} - set { - syntTreeDepth = value; - if (syntTreeDepth > SyntacticTreeMaxDepth) - SyntacticTreeMaxDepth = syntTreeDepth; - } - } - public int SyntacticTreeMaxDepth = 0; - - protected CodeBuffer buffer; - protected Token currentTok; - protected bool eol = true; - protected Point CurrentPosition { - get { return new Point (currentLine, currentColumn); } - set { - currentLine = value.Y; - currentColumn = value.X; - } - } - - public Node RootNode; - - public abstract void ParseCurrentLine(); - public abstract void SyntaxAnalysis (); - public void reparseSource () { - for (int i = 0; i < buffer.LineCount; i++) { - if (!buffer[i].IsParsed) - TryParseBufferLine (i); - } - try { - SyntaxAnalysis (); - } catch (Exception ex) { - Debug.WriteLine ("Syntax Error: " + ex.ToString ()); - if (ex is ParserException) - SetLineInError (ex as ParserException); - } - } - public void TryParseBufferLine(int lPtr) { - buffer [lPtr].exception = null; - currentLine = lPtr; - currentColumn = 0; - eol = false; - - try { - ParseCurrentLine (); - } catch (Exception ex) { - Debug.WriteLine (ex.ToString ()); - if (ex is ParserException) - SetLineInError (ex as ParserException); - } - - } - - public virtual void SetLineInError(ParserException ex) { - currentTok = default(Token); - if (ex.Line >= buffer.LineCount) - ex.Line = buffer.LineCount - 1; - if (buffer [ex.Line].IsFolded) - buffer.ToogleFolding (ex.Line); - buffer [ex.Line].SetLineInError (ex); - } - public virtual string LineBrkRegex { - get { return @"\r\n|\r|\n|\\\\n"; } - } - void updateFolding () { - // Stack foldings = new Stack(); - // bool inStartTag = false; - // - // for (int i = 0; i < parser.Tokens.Count; i++) { - // TokenList tl = parser.Tokens [i]; - // tl.foldingTo = null; - // int fstTK = tl.FirstNonBlankTokenIndex; - // if (fstTK > 0 && fstTK < tl.Count - 1) { - // if (tl [fstTK + 1] != XMLParser.TokenType.ElementName) - // continue; - // if (tl [fstTK] == XMLParser.TokenType.ElementStart) { - // //search closing tag - // int tkPtr = fstTK+2; - // while (tkPtr < tl.Count) { - // if (tl [tkPtr] == XMLParser.TokenType.ElementClosing) - // - // tkPtr++; - // } - // if (tl.EndingState == (int)XMLParser.States.Content) - // foldings.Push (tl); - // else if (tl.EndingState == (int)XMLParser.States.StartTag) - // inStartTag = true; - // continue; - // } - // if (tl [fstTK] == XMLParser.TokenType.ElementEnd) { - // TokenList tls = foldings.Pop (); - // int fstTKs = tls.FirstNonBlankTokenIndex; - // if (tls [fstTK + 1].Content == tl [fstTK + 1].Content) { - // tl.foldingTo = tls; - // continue; - // } - // parser.CurrentPosition = tls [fstTK + 1].Start; - // parser.SetLineInError(new ParserException(parser, "closing tag not corresponding")); - // } - // - // } - // } - } - - #region low level parsing - protected void addCharToCurTok(char c, Point position){ - currentTok.Start = position; - currentTok += c; - } - /// - /// Read one char from current position in buffer and store it into the current token - /// - /// if true, set the Start position of the current token to the current position - protected void readToCurrTok(bool startOfTok = false){ - if (startOfTok) - currentTok.Start = CurrentPosition; - currentTok += Read(); - } - /// - /// read n char from the buffer and store it into the current token - /// - protected void readToCurrTok(int length) { - for (int i = 0; i < length; i++) - currentTok += Read (); - } - /// - /// Save current token into current TokensLine and raz current token - /// - protected void saveAndResetCurrentTok() { - currentTok.End = CurrentPosition; - buffer[currentLine].Tokens.Add (currentTok); - currentTok = default(Token); - } - /// - /// read one char and add current token to current TokensLine, current token is reset - /// - /// Type of the token - /// set start of token to current position - protected void readAndResetCurrentTok(System.Enum type, bool startToc = false) { - readToCurrTok (); - saveAndResetCurrentTok (type); - } - /// - /// Save current tok - /// - /// set the type of the tok - protected void saveAndResetCurrentTok(System.Enum type) { - currentTok.Type = (TokenType)type; - saveAndResetCurrentTok (); - } - protected void setPreviousTokOfTypeTo (TokenType inType, TokenType newType) { - for (int i = currentLine; i >= 0; i--) { - int j = buffer [i].Tokens.Count - 1; - while (j >= 0) { - if (buffer [i].Tokens [j].Type == inType) { - Token t = buffer [i].Tokens [j]; - t.Type = newType; - buffer [i].Tokens [j] = t; - return; - } - j--; - } - } - } - /// - /// Peek next char, emit '\n' if current column > buffer's line length - /// Throw error if eof is true - /// - protected virtual char Peek() { - if (eol) - throw new ParserException (currentLine, currentColumn, "Unexpected End of line"); - return currentColumn < buffer [currentLine].Length ? - buffer [currentLine] [currentColumn] : '\n'; - } - /// - /// Peek n char from buffer or less if remaining char in buffer's line is less than requested - /// if end of line is reached, no '\n' will be emitted, instead, empty string is returned. '\n' should be checked only - /// with single char Peek(). - /// Throw error is eof is true - /// - /// Length. - protected virtual string Peek(int length) { - if (eol) - return "";//throw new ParserException (currentLine, currentColumn, "Unexpected End of Line"); - int lg = Math.Min(length, Math.Max (buffer [currentLine].Length - currentColumn, buffer [currentLine].Length - currentColumn - length)); - if (lg == 0) - return ""; - return buffer [currentLine].Content.Substring (currentColumn, lg); - } - /// - /// read one char from buffer at current position, if '\n' is read, current line is incremented - /// and column is reset to 0 - /// - protected virtual char Read() { - char c = Peek (); - if (c == '\n') - eol = true; - currentColumn++; - return c; - } - protected virtual string Read(int charCount){ - string tmp = ""; - for (int i = 0; i < charCount; i++) { - if (eol) - break; - tmp += Read (); - } - return tmp; - } - /// - /// read until end of line is reached - /// - /// string read - protected virtual string ReadLine () { - StringBuilder tmp = new StringBuilder(); - char c = Read (); - while (!eol) { - tmp.Append (c); - c = Read (); - } - return tmp.ToString(); - } - /// - /// read until end expression is reached or end of line. - /// - /// string read minus the ending expression that has to be read after - /// Expression to search for - protected virtual string ReadLineUntil (string endExp){ - string tmp = ""; - - while (!eol) { - if (buffer [currentLine].Length - currentColumn - endExp.Length < 0) { - tmp += ReadLine(); - break; - } - if (string.Equals (Peek (endExp.Length), endExp)) - return tmp; - tmp += Read(); - } - return tmp; - } - /// - /// skip white spaces, but not line break. Save spaces in a WhiteSpace token. - /// - protected void SkipWhiteSpaces () { - if (currentTok.Type != TokenType.Unknown) - throw new ParserException (currentLine, currentColumn, "current token should be reset to unknown (0) before skiping white spaces"); - while (!eol) { - if (!char.IsWhiteSpace (Peek ())||Peek()=='\n') - break; - readToCurrTok (currentTok.Type == TokenType.Unknown); - currentTok.Type = TokenType.WhiteSpace; - } - if (currentTok.Type != TokenType.Unknown) - saveAndResetCurrentTok (); - } - #endregion - - protected Node addChildNode (Node curNode, CodeLine cl, int tokPtr, string type = "") { - Node n = new Node () { Name = cl.Tokens [tokPtr].Content, StartLine = cl, Type = type }; - curNode.AddChild (n); - if (cl.SyntacticNode == null) - cl.SyntacticNode = n; - SyntacticTreeDepth++; - return n; - } - protected void closeNodeAndGoUp (ref Node n, CodeLine cl, string type = ""){ - while (n != null) { - if (n.Type == type) { - n.EndLine = cl; - n = n.Parent; - SyntacticTreeDepth--; - break; - } - n = n.Parent; - SyntacticTreeDepth--; - } - } - protected void closeNodeAndGoUp (ref Node n, CodeLine cl){ - SyntacticTreeDepth--; - n.EndLine = cl; - n = n.Parent; - } - - protected void initSyntaxAnalysis () { - RootNode = new Node () { Name = "RootNode", Type="Root" }; - SyntacticTreeDepth = SyntacticTreeMaxDepth = 0; - } - - - protected void throwParserException(string msg){ - throw new ParserException (currentLine, currentColumn, msg); - } - } -} \ No newline at end of file diff --git a/Samples/CrowIDE/src/Editors/Parsers/CSharpParser.cs b/Samples/CrowIDE/src/Editors/Parsers/CSharpParser.cs deleted file mode 100644 index 23655aa6..00000000 --- a/Samples/CrowIDE/src/Editors/Parsers/CSharpParser.cs +++ /dev/null @@ -1,386 +0,0 @@ -using System; -using Crow; -using System.Collections.Generic; -using System.Diagnostics; -using System.Text.RegularExpressions; -using System.Linq; - -namespace Crow.Coding -{ - public class CSharpParser : BufferParser - { - #region keywords - string[] keywords = new string[] { - "abstract", - "as", - "ascending", - "async", - "await", - "base", - "bool", - "break", - "byte", - "case", - "catch", - "char", - "checked", - "class", - "const", - "continue", - "decimal", - "default", - "delegate", - "descending", - "do", - "double", - "dynamic", - "else", - "enum", - "equals", - "event", - "explicit", - "extern", - "false", - "finally", - "fixed", - "float", - "for", - "foreach", - "from", - "get", - "goto", - "group", - "if", - "implicit", - "in", - "int", - "interface", - "internal", - "is", - "join", - "let", - "lock", - "long", - "nameof", - "namespace", - "new", - "null", - "object", - "operator", - "orderby", - "out", - "override", - "params", - "partial", - "private", - "protected", - "public", - "readonly", - "ref", - "return", - "sbyte", - "sealed", - "select", - "set", - "short", - "sizeof", - "stackalloc", - "static", - "string", - "struct", - "switch", - "this", - "throw", - "true", - "try", - "typeof", - "uint", - "ulong", - "unchecked", - "unsafe", - "ushort", - "using", - "value", - "var", - "virtual", - "void", - "volatile", - "when", - "where", - "while", - "yield " - }; - #endregion - - public enum States - { - init, - BlockComment, - InNameSpace, - InClass, - InMember, - Unknown, - } - - public CSharpParser (CodeBuffer _buffer) : base(_buffer) - { - } - - #region Regular Expression for validity checks - static Regex rxValidChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}"); - static Regex rxNameStartChar = new Regex(@"_|\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}"); - static Regex rxNameChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}"); - static Regex rxNewLineChar = new Regex(@"\u000D|\u000A|\u0085|\u2028|\u2029"); - static Regex rxWhiteSpaceChar = new Regex(@"\p{Zs}|\u0009|\u000B|\u000C"); - static Regex rxDecimal = new Regex(@"[0-9]+"); - static Regex rxHexadecimal = new Regex(@"[0-9a-fA-F]+"); - - public static bool CharIsValidCharStartName (char c) { - return rxNameStartChar.IsMatch(new string(new char[]{c})); - } - public static bool CharIsValidCharName (char c) { - return rxNameChar.IsMatch(new string(new char[]{c})); - } - - public bool nextCharIsValidCharStartName - { - get { return CharIsValidCharStartName(Peek()); } - } - public bool nextCharIsValidCharName - { - get { return CharIsValidCharName(Peek()); } - } - #endregion - - States curState = States.init; - States savedState = States.init; - - public override void ParseCurrentLine () - { - //Debug.WriteLine (string.Format("parsing line:{0}", currentLine)); - CodeLine cl = buffer [currentLine]; - cl.Tokens = new List (); - - - //retrieve current parser state from previous line - if (currentLine > 0) - curState = (States)buffer[currentLine - 1].EndingState; - else - curState = States.init; - - States previousEndingState = (States)cl.EndingState; - - while (! eol) { - if (currentTok.IsNull) - SkipWhiteSpaces (); - - if (curState == States.BlockComment) { - currentTok.Start = CurrentPosition; - currentTok.Type = (BufferParser.TokenType)TokenType.BlockComment; - currentTok += ReadLineUntil ("*/"); - if (Peek (2) == "*/") { - readToCurrTok (2); - curState = savedState; - } - saveAndResetCurrentTok (); - continue; - } - - switch (Peek()) { - case '\n': - eol = true; - if (!currentTok.IsNull) - saveAndResetCurrentTok (); - break; - case '#': - readToCurrTok (true); - currentTok += ReadLine (); - saveAndResetCurrentTok (TokenType.Preprocessor); - break; - case '/': - readToCurrTok (true); - switch (Peek ()) { - case '*': - readToCurrTok (); - currentTok += ReadLine (); - //currentTok.Type = (Parser.TokenType)TokenType.BlockComment; - savedState = curState; - curState = States.BlockComment; - saveAndResetCurrentTok (TokenType.BlockComment); - break; - case '/': - //readToCurrTok (); - currentTok += ReadLine (); - saveAndResetCurrentTok (TokenType.LineComment); - //currentTok.Type = (Parser.TokenType)TokenType.LineComment; - break; - default: - currentTok += ReadLine (); - saveAndResetCurrentTok (TokenType.Unknown); - break; - } - break; - case '{': - if (currentTok.IsNull) - readAndResetCurrentTok (TokenType.OpenBlock, true); - else - readToCurrTok (); - break; - case '}': - if (currentTok.IsNull) - readAndResetCurrentTok (TokenType.CloseBlock, true); - else - readToCurrTok (); - break; - case '\\'://unicode escape sequence - if (!(currentTok.Type == TokenType.Identifier || - currentTok.IsEmpty || currentTok.Type == TokenType.StringLitteral || currentTok.Type == TokenType.CharLitteral)) { - saveAndResetCurrentTok (); - } - Point pos = CurrentPosition; - Read (); - char escChar = Read (); - - if (escChar == 'u') { - char c = char.ConvertFromUtf32 (int.Parse (Read (4), System.Globalization.NumberStyles.HexNumber))[0]; - if (currentTok.IsEmpty) { - if (!CharIsValidCharStartName (c)) - throwParserException ("expecting identifier start"); - currentTok.Start = pos; - currentTok.Type = TokenType.Identifier; - } else if (currentTok.Type == TokenType.Identifier) { - if (!CharIsValidCharName (c)) - throwParserException ("expecting identifier valid char"); - } - currentTok += c; - break; - } - currentTok += new String (new char[] { '\\', escChar }); - break; - case '\'': - if (currentTok.IsNull) { - readAndResetCurrentTok (TokenType.CharLitteralOpening, true); - currentTok.Type = TokenType.CharLitteral; - } else if (currentTok.Type == TokenType.CharLitteral) { - saveAndResetCurrentTok (); - readAndResetCurrentTok (TokenType.CharLitteralClosing, true); - } else if (currentTok.Type == TokenType.StringLitteral){ - readToCurrTok (); - } else - throwParserException ("unexpected character: (\')"); - break; - case '"': - if (currentTok.IsNull) { - readAndResetCurrentTok (TokenType.StringLitteralOpening, true); - currentTok.Type = TokenType.StringLitteral; - } else if (currentTok.Type == TokenType.StringLitteral) { - saveAndResetCurrentTok (); - readAndResetCurrentTok (TokenType.StringLitteralClosing, true); - } else - throwParserException ("unexpected character: (\")"); - break; - default: - if (currentTok.Type == TokenType.StringLitteral || currentTok.Type == TokenType.CharLitteral) { - readToCurrTok (currentTok.IsEmpty); - } else if (currentTok.IsNull) { - if (nextCharIsValidCharStartName) { - readToCurrTok (true); - while (nextCharIsValidCharName) - readToCurrTok (); - - if (keywords.Contains (currentTok.Content)) - saveAndResetCurrentTok (TokenType.Keyword); - else - saveAndResetCurrentTok (TokenType.Identifier); - continue; - } else - readAndResetCurrentTok(TokenType.Unknown, true); - } else - readAndResetCurrentTok(TokenType.Unknown, true); - break; - } - } - - if (cl.EndingState != (int)curState && currentLine < buffer.LineCount - 1) - buffer [currentLine + 1].Tokens = null; - - cl.EndingState = (int)curState; - } - - public override void SyntaxAnalysis () - { - initSyntaxAnalysis (); - Node currentNode = RootNode; - - int ptrLine = 0; - while (ptrLine < buffer.LineCount) { - CodeLine cl = buffer [ptrLine]; - if (cl.Tokens == null){ - ptrLine++; - continue; - } - cl.SyntacticNode = null; - - int tokPtr = 0; - bool onlyWhiteSpace = true; - while (tokPtr < cl.Tokens.Count) { - if (cl.Tokens [tokPtr].Type == TokenType.WhiteSpace) { - tokPtr++; - continue; - } - - if (cl.Tokens [tokPtr].Type == TokenType.LineComment && onlyWhiteSpace) { - int startLine = ptrLine; - ptrLine++; - while (ptrLine < buffer.LineCount) { - int idx = buffer [ptrLine].FirstNonBlankTokIndex; - if (idx < 0) - break; - if (buffer [ptrLine].Tokens [idx].Type != TokenType.LineComment) - break; - ptrLine++; - } - ptrLine--; - if (ptrLine - startLine > 0) { - currentNode = addChildNode (currentNode, cl, tokPtr, "comment"); - closeNodeAndGoUp (ref currentNode, buffer [ptrLine], "comment"); - } - break; - } - - switch (cl.Tokens [tokPtr].Type) { - case TokenType.BlockCommentStart: - case TokenType.OpenBlock: - currentNode = addChildNode (currentNode, cl, tokPtr); - break; - case TokenType.CloseBlock: - case TokenType.BlockCommentEnd: - closeNodeAndGoUp (ref currentNode, cl); - break; - case TokenType.Preprocessor: - if (cl.Tokens [tokPtr].Content.StartsWith ("#region", StringComparison.Ordinal)) { - currentNode = addChildNode (currentNode, cl, tokPtr, "region"); - } else if (cl.Tokens [tokPtr].Content.StartsWith ("#endregion", StringComparison.Ordinal)) { - - closeNodeAndGoUp (ref currentNode, cl,"region"); - } - break; - } - onlyWhiteSpace = false; - tokPtr++; - } - ptrLine++; - } - /*ptrLine = 0; - while (ptrLine < buffer.LineCount) { - CodeLine cl = buffer [ptrLine]; - if (cl.IsFoldable) { - if (cl.SyntacticNode.Type == "comment" || cl.SyntacticNode.Type == "region") - cl.IsFolded = true; - } - ptrLine++; - }*/ - } - } -} - diff --git a/Samples/CrowIDE/src/Editors/Parsers/StyleParser.cs b/Samples/CrowIDE/src/Editors/Parsers/StyleParser.cs deleted file mode 100644 index 9a1e74cd..00000000 --- a/Samples/CrowIDE/src/Editors/Parsers/StyleParser.cs +++ /dev/null @@ -1,179 +0,0 @@ -using System; -using Crow; -using System.Collections.Generic; -using System.Diagnostics; -using System.Text.RegularExpressions; -using System.Linq; - -namespace Crow.Coding -{ - public class StyleParser : BufferParser - { - enum States { init, classNames, members, value, endOfStatement } - - public StyleParser (CodeBuffer _buffer) : base(_buffer) - { - } - - #region Character ValidityCheck - static Regex rxValidChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}"); - static Regex rxNameStartChar = new Regex(@"_|\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}"); - static Regex rxNameChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}"); - static Regex rxDecimal = new Regex(@"[0-9]+"); - static Regex rxHexadecimal = new Regex(@"[0-9a-fA-F]+"); - - public bool nextCharIsValidCharStartName - { - get { return rxNameStartChar.IsMatch(new string(new char[]{Peek()})); } - } - public bool nextCharIsValidCharName - { - get { return rxNameChar.IsMatch(new string(new char[]{Peek()})); } - } - #endregion - - States curState = States.classNames; - - public override void ParseCurrentLine () - { - //Debug.WriteLine (string.Format("parsing line:{0}", currentLine)); - CodeLine cl = buffer [currentLine]; - cl.Tokens = new List (); - - //retrieve current parser state from previous line - if (currentLine > 0) - curState = (States)buffer[currentLine - 1].EndingState; - else - curState = States.init; - - States previousEndingState = (States)cl.EndingState; - - while (! eol) { - SkipWhiteSpaces (); - - if (eol) - break; - - if (Peek () == '\n') { - if (currentTok != TokenType.Unknown) - throw new ParserException (currentLine, currentColumn, "Unexpected end of line"); - Read (); - eol = true; - continue; - } - - switch (Peek()) { - case '/': - readToCurrTok (true); - switch (Peek ()) { - case '/': - currentTok += ReadLine (); - saveAndResetCurrentTok (TokenType.LineComment); - break; - default: - currentTok += ReadLine (); - saveAndResetCurrentTok (TokenType.Unknown); - break; - } - break; - case ',': - if (curState != States.init && curState != States.classNames ) - throw new ParserException (currentLine, currentColumn, "Unexpected char ','"); - readAndResetCurrentTok (TokenType.OperatorOrPunctuation, true); - curState = States.classNames; - break; - case '{': - if (!(curState == States.init || curState == States.classNames)) - throw new ParserException (currentLine, currentColumn, "Unexpected char '{'"); - readAndResetCurrentTok (TokenType.OpenBlock, true); - curState = States.members; - break; - case '}': - if (curState != States.members) - throw new ParserException (currentLine, currentColumn, "Unexpected char '}'"); - readAndResetCurrentTok (TokenType.CloseBlock, true); - curState = States.classNames; - break; - case '=': - if (curState == States.classNames) - throw new ParserException (currentLine, currentColumn, "Unexpected char '='"); - setPreviousTokOfTypeTo (TokenType.Type, TokenType.Identifier); - readAndResetCurrentTok (TokenType.OperatorOrPunctuation, true); - curState = States.value; - break; - case '"': - if (curState != States.value) - throw new ParserException (currentLine, currentColumn, "Unexpected char '\"'"); - readAndResetCurrentTok (TokenType.StringLitteralOpening, true); - - while (!eol) { - currentTok += ReadLineUntil ("\""); - if (currentTok.Content [currentTok.Content.Length - 1] == '\\') - readToCurrTok (); - else - break; - } - if (eol) - throw new ParserException (currentLine, currentColumn, "Unexpected end of line"); - saveAndResetCurrentTok (TokenType.StringLitteral); - - readAndResetCurrentTok (TokenType.StringLitteralClosing, true); - curState = States.endOfStatement; - break; - case ';': - if (curState != States.endOfStatement) - throw new ParserException (currentLine, currentColumn, "Unexpected end of statement"); - readAndResetCurrentTok (TokenType.StatementEnding, true); - curState = States.members; - break; - default: - if (currentTok.Type != TokenType.Unknown) - throw new ParserException (currentLine, currentColumn, "error curtok not null"); - if (curState == States.value) - throw new ParserException (currentLine, currentColumn, "expecting value enclosed in '\"'"); - if (curState == States.endOfStatement) - throw new ParserException (currentLine, currentColumn, "expecting end of statement"); - - if (nextCharIsValidCharStartName) { - readToCurrTok (true); - while (nextCharIsValidCharName) - readToCurrTok (); - } - saveAndResetCurrentTok (TokenType.Type); - break; - } - } - - if (cl.EndingState != (int)curState && currentLine < buffer.LineCount - 1) - buffer [currentLine + 1].Tokens = null; - - cl.EndingState = (int)curState; - } - public override void SyntaxAnalysis () - { - initSyntaxAnalysis (); - Node currentNode = RootNode; - - for (int i = 0; i < buffer.LineCount; i++) { - CodeLine cl = buffer[i]; - if (cl.Tokens == null) - continue; - cl.SyntacticNode = null; - - int tokPtr = 0; - while (tokPtr < cl.Tokens.Count) { - switch (cl.Tokens [tokPtr].Type) { - case TokenType.OpenBlock: - currentNode = addChildNode (currentNode, cl, tokPtr, "style"); - break; - case TokenType.CloseBlock: - closeNodeAndGoUp (ref currentNode, cl, "style"); - break; - } - tokPtr++; - } - } - } - } -} - diff --git a/Samples/CrowIDE/src/Editors/Parsers/XMLParser.cs b/Samples/CrowIDE/src/Editors/Parsers/XMLParser.cs deleted file mode 100644 index 8e95408e..00000000 --- a/Samples/CrowIDE/src/Editors/Parsers/XMLParser.cs +++ /dev/null @@ -1,307 +0,0 @@ -using System; -using Crow; -using System.Collections.Generic; -using System.Text.RegularExpressions; -using System.Diagnostics; -using System.Linq; - -namespace Crow.Coding -{ - public class XMLParser : BufferParser - { - public new enum TokenType { - Unknown = BufferParser.TokenType.Unknown, - WhiteSpace = BufferParser.TokenType.WhiteSpace, - NewLine = BufferParser.TokenType.NewLine, - LineComment = BufferParser.TokenType.LineComment, - BlockCommentStart = BufferParser.TokenType.BlockCommentStart, - BlockComment = BufferParser.TokenType.BlockComment, - BlockCommentEnd = BufferParser.TokenType.BlockCommentEnd, - ElementName = BufferParser.TokenType.Type, - AttributeName = BufferParser.TokenType.Identifier, - ElementClosing = BufferParser.TokenType.StatementEnding, - Affectation = BufferParser.TokenType.OperatorOrPunctuation, - AttributeValueOpening = BufferParser.TokenType.StringLitteralOpening, - AttributeValueClosing = BufferParser.TokenType.StringLitteralClosing, - AttributeValue = BufferParser.TokenType.StringLitteral, - XMLDecl = BufferParser.TokenType.Preprocessor, - Doctype = BufferParser.TokenType.Keyword, - ElementStart = 50, - ElementEnd = 51, - } - - public enum States - { - init, //first statement of prolog, xmldecl should only apear in this state - prolog, //misc before doctypedecl - InternalSubset, //doctype declaration subset - ExternalSubsetInit, - ExternalSubset, - BlockComment, - DTDEnd,//doctype finished - XML,//normal xml - StartTag,//inside start tag - Content,//after start tag with no closing slash - EndTag - } - - #region CTOR - public XMLParser (CodeBuffer _buffer) : base(_buffer) {} - #endregion - - enum Keywords - { - DOCTYPE, - ELEMENT, - ATTLIST, - ENTITY, - NOTATION - } - - States curState = States.init; - - #region Regular Expression for validity checks - //private static Regex rxValidChar = new Regex("[\u0020-\uD7FF]"); - private static Regex rxValidChar = new Regex(@"\u0009|\u000A|\u000D|[\u0020-\uD7FF]|[\uE000-\uFFFD]"); //| [\u10000-\u10FFFF] unable to set those plans - private static Regex rxNameStartChar = new Regex(@":|[A-Z]|_|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]"); // | [\u10000-\uEFFFF] - private static Regex rxNameChar = new Regex(@":|[A-Z]|_|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|-|\.|[0-9]|\u00B7|[\u0300-\u036F]|[\u203F-\u2040]");//[\u10000-\uEFFFF]| - private static Regex rxDecimal = new Regex(@"[0-9]+"); - private static Regex rxHexadecimal = new Regex(@"[0-9a-fA-F]+"); - private static Regex rxAttributeValue = new Regex(@"[^<]"); - private static Regex rxEntityValue = new Regex(@"[^<]"); - private static Regex rxPubidChar = new Regex(@"\u0020|\u000D|\u000A|[a-zA-Z0-9]|[-\(\)\+\,\./:=\?;!\*#@\$_%]"); - #endregion - - #region Character ValidityCheck - public bool nextCharIsValidCharStartName - { - get { return rxNameStartChar.IsMatch(new string(new char[]{Peek()})); } - } - public bool nextCharIsValidCharName - { - get { return rxNameChar.IsMatch(new string(new char[]{Peek()})); } - } - #endregion - - public override void SetLineInError (ParserException ex) - { - base.SetLineInError (ex); - //buffer[ex.Line].Tokens.EndingState = (int)States.init; - } - - public override void ParseCurrentLine () - { - //Debug.WriteLine (string.Format("parsing line:{0}", currentLine)); - CodeLine cl = buffer [currentLine]; - cl.Tokens = new List (); - - //retrieve current parser state from previous line - if (currentLine > 0) - curState = (States)buffer[currentLine - 1].EndingState; - else - curState = States.init; - - States previousEndingState = (States)cl.EndingState; - - - while (! eol) { - SkipWhiteSpaces (); - - if (eol) - break; - - if (Peek () == '\n') { - if (currentTok != TokenType.Unknown) - throw new ParserException (currentLine, currentColumn, "Unexpected end of line"); - Read (); - eol = true; - continue; - } - - if (curState == States.BlockComment) { - if (currentTok != TokenType.Unknown) - Debugger.Break (); - - currentTok.Start = CurrentPosition; - currentTok.Type = (BufferParser.TokenType)TokenType.BlockComment; - currentTok += ReadLineUntil ("-->"); - if (Peek (3) == "-->") { - readToCurrTok (3); - curState = States.XML; - } - saveAndResetCurrentTok (); - continue; - } - - switch (Peek()) { - case '<': - readToCurrTok (true); - switch (Peek()) { - case '?': - if (curState != States.init) - throw new ParserException (currentLine, currentColumn, "xml decl may appear only on first line"); - readToCurrTok (); - currentTok += ReadLineUntil ("?>"); - if (Peek (2) != "?>") - throw new ParserException (currentLine, currentColumn, "expecting '?>'"); - readToCurrTok (2); - saveAndResetCurrentTok (TokenType.XMLDecl); - curState = States.prolog; - break; - case '!': - readToCurrTok (); - switch (Peek()) { - case '-': - readToCurrTok (); - if (Peek () != '-') - throw new ParserException (currentLine, currentColumn, "Expecting comment start tag"); - readToCurrTok (); - currentTok += ReadLineUntil ("--"); - if (Peek (3) == "-->") { - readToCurrTok (3); - }else - curState = States.BlockComment; - saveAndResetCurrentTok (TokenType.BlockComment); - break; - case 'D': - case 'd': - string tmp = Read (7); - currentTok += tmp; - if (!string.Equals (tmp, "DOCTYPE", StringComparison.OrdinalIgnoreCase)) - throw new ParserException (currentLine, currentColumn, "Expecting 'doctype'"); - saveAndResetCurrentTok (TokenType.Doctype); - break; - default: - throw new ParserException (currentLine, currentColumn, "error"); - } - break; - default: - if (!(curState == States.Content || curState == States.XML || curState == States.init || curState == States.prolog)) - throw new ParserException (currentLine, currentColumn, "Unexpected char: '<'"); - if (Peek () == '/') { - curState = States.EndTag; - readToCurrTok (); - saveAndResetCurrentTok (TokenType.ElementEnd); - } else { - curState = States.StartTag; - saveAndResetCurrentTok (TokenType.ElementStart); - } - - if (!nextCharIsValidCharStartName) - throw new ParserException (currentLine, currentColumn, "Expected element name"); - - readToCurrTok (true); - while (nextCharIsValidCharName) - readToCurrTok (); - - saveAndResetCurrentTok (TokenType.ElementName); - break; - } - break; - case '/': - if (curState != States.StartTag) - throw new ParserException (currentLine, currentColumn, "Unexpected char: '/'"); - readToCurrTok (true); - if (Peek () != '>') - throw new ParserException (currentLine, currentColumn, "Expecting '>'"); - readAndResetCurrentTok (TokenType.ElementEnd); - - curState = States.XML; - break; - case '>': - readAndResetCurrentTok (TokenType.ElementClosing, true); - switch (curState) { - case States.EndTag: - curState = States.XML; - break; - case States.StartTag: - curState = States.Content; - break; - default: - throw new ParserException (currentLine, currentColumn, "Unexpected char: '>'"); - } - break; - default: - switch (curState) { - case States.StartTag: - if (!nextCharIsValidCharStartName) - throw new ParserException (currentLine, currentColumn, "Expected attribute name"); - readToCurrTok (true); - while (nextCharIsValidCharName) - readToCurrTok (); - saveAndResetCurrentTok (TokenType.AttributeName); - - SkipWhiteSpaces (); - - if (Peek () != '=') - throw new ParserException (currentLine, currentColumn, "Expecting: '='"); - readAndResetCurrentTok (TokenType.Affectation, true); - - SkipWhiteSpaces (); - - char openAttVal = Peek (); - if (openAttVal != '"' && openAttVal != '\'') - throw new ParserException (currentLine, currentColumn, "Expecting attribute value enclosed either in '\"' or in \"'\""); - readAndResetCurrentTok (TokenType.AttributeValueOpening, true); - - currentTok.Start = CurrentPosition; - currentTok.Content = ReadLineUntil (new string (new char[]{ openAttVal })); - saveAndResetCurrentTok (TokenType.AttributeValue); - - if (Peek () != openAttVal) - throw new ParserException (currentLine, currentColumn, string.Format ("Expecting {0}", openAttVal)); - readAndResetCurrentTok (TokenType.AttributeValueClosing, true); - break; - default: - throw new ParserException (currentLine, currentColumn, "unexpected char: " + Peek ()); - } - break; - } - } - - if (cl.EndingState != (int)curState && currentLine < buffer.LineCount - 1) - buffer [currentLine + 1].Tokens = null; - - cl.EndingState = (int)curState; - } - - public override void SyntaxAnalysis () - { - initSyntaxAnalysis (); - Node currentNode = RootNode; - - for (int i = 0; i < buffer.LineCount; i++) { - CodeLine cl = buffer[i]; - if (cl.Tokens == null) - continue; - cl.SyntacticNode = null; - - int tokPtr = 0; - while (tokPtr < cl.Tokens.Count) { - switch ((XMLParser.TokenType)cl.Tokens [tokPtr].Type) { - case TokenType.ElementStart: - tokPtr++; - currentNode = addChildNode (currentNode, cl, tokPtr, "Element"); - break; - case TokenType.ElementEnd: - tokPtr++; - if (tokPtr < cl.Tokens.Count) { - if ((XMLParser.TokenType)cl.Tokens [tokPtr].Type == TokenType.ElementName && - cl.Tokens [tokPtr].Content != currentNode.Name) - throw new ParserException (currentLine, currentColumn, "Closing tag mismatch"); - } - closeNodeAndGoUp (ref currentNode, cl, "Element"); - break; - case TokenType.ElementClosing: - //currentNode = currentNode.Parent; - break; - default: - break; - } - tokPtr++; - } - } - } - } -} - diff --git a/Samples/CrowIDE/src/Editors/Parsers2/Tokenizer.cs b/Samples/CrowIDE/src/Editors/Parsers2/Tokenizer.cs deleted file mode 100644 index bcda1ec6..00000000 --- a/Samples/CrowIDE/src/Editors/Parsers2/Tokenizer.cs +++ /dev/null @@ -1,67 +0,0 @@ -// -// Tokenizer.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using Crow.Text; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace Crow.Coding2 -{ - public static class TokenType { - public const int Undefine = 0; - public const int WhiteSpace = 0; - } - public class Token { - public int ptr; - public int length; - } - - public class Tokenizer - { - #region Regular Expression for validity checks - public Regex rxValidChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}"); - public Regex rxNameStartChar = new Regex(@"_|\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}"); - public Regex rxNameChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}"); - public Regex rxNewLineChar = new Regex(@"\u000D|\u000A|\u0085|\u2028|\u2029"); - public Regex rxWhiteSpaceChar = new Regex(@"\p{Zs}|\u0009|\u000B|\u000C"); - public Regex rxDecimal = new Regex(@"[0-9]+"); - public Regex rxHexadecimal = new Regex(@"[0-9a-fA-F]+"); - #endregion - - public List Tokens; - - public Tokenizer (TextBuffer buffer) - { - } - - - public void Tokenize () { - - } - - } -} - diff --git a/Samples/CrowIDE/src/Editors/SourceEditor.cs b/Samples/CrowIDE/src/Editors/SourceEditor.cs deleted file mode 100644 index ca55ee09..00000000 --- a/Samples/CrowIDE/src/Editors/SourceEditor.cs +++ /dev/null @@ -1,1209 +0,0 @@ -// -// ScrollingTextBox.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -using System; -using System.ComponentModel; -using System.Collections.Generic; -using System.Diagnostics; -using vkvg; - -namespace Crow.Coding -{ - /// - /// Scrolling text box optimized for monospace fonts, for coding - /// - public class SourceEditor : Editor - { - #region CTOR - public SourceEditor (): base() - { - formatting.Add ((int)XMLParser.TokenType.AttributeName, new TextFormatting (Color.DarkSlateGrey, Color.Transparent)); - formatting.Add ((int)XMLParser.TokenType.ElementName, new TextFormatting (Color.DarkBlue, Color.Transparent)); - formatting.Add ((int)XMLParser.TokenType.ElementStart, new TextFormatting (Color.Black, Color.Transparent)); - formatting.Add ((int)XMLParser.TokenType.ElementEnd, new TextFormatting (Color.Black, Color.Transparent)); - formatting.Add ((int)XMLParser.TokenType.ElementClosing, new TextFormatting (Color.Black, Color.Transparent)); - - formatting.Add ((int)XMLParser.TokenType.AttributeValueOpening, new TextFormatting (Color.Crimson, Color.Transparent)); - formatting.Add ((int)XMLParser.TokenType.AttributeValueClosing, new TextFormatting (Color.Crimson, Color.Transparent)); - formatting.Add ((int)XMLParser.TokenType.AttributeValue, new TextFormatting (Color.FireBrick, Color.Transparent, false, true)); - formatting.Add ((int)XMLParser.TokenType.XMLDecl, new TextFormatting (Color.ForestGreen, Color.Transparent)); - - formatting.Add ((int)BufferParser.TokenType.BlockComment, new TextFormatting (Color.Grey, Color.Transparent, false, true)); - formatting.Add ((int)BufferParser.TokenType.LineComment, new TextFormatting (Color.Grey, Color.Transparent, false, true)); - formatting.Add ((int)BufferParser.TokenType.OperatorOrPunctuation, new TextFormatting (Color.Black, Color.Transparent)); - formatting.Add ((int)BufferParser.TokenType.Keyword, new TextFormatting (Color.Teal, Color.Transparent)); - //formatting.Add ((int)BufferParser.TokenType.Keyword, new TextFormatting (Color.DarkCyan, Color.Transparent)); - - parsing.Add (".crow", "Crow.Coding.XMLParser"); - parsing.Add (".svg", "Crow.Coding.XMLParser"); - parsing.Add (".template", "Crow.Coding.XMLParser"); - parsing.Add (".cs", "Crow.Coding.CSharpParser"); - parsing.Add (".style", "Crow.Coding.StyleParser"); - - buffer = new CodeBuffer (); - buffer.LineUpadateEvent += Buffer_LineUpadateEvent; - buffer.LineAdditionEvent += Buffer_LineAdditionEvent;; - buffer.LineRemoveEvent += Buffer_LineRemoveEvent; - buffer.BufferCleared += Buffer_BufferCleared; - buffer.SelectionChanged += Buffer_SelectionChanged; - buffer.PositionChanged += Buffer_PositionChanged; - buffer.FoldingEvent += Buffer_FoldingEvent; - buffer.Add (new CodeLine("")); - } - #endregion - - string oldSource = ""; - //save requested position on error, and try it on next move - int requestedLine = 0, requestedCol = 0; - volatile bool isDirty = false; - - const int leftMarginGap = 10;//gap between items in margin and text - const int foldSize = 9;//folding rectangles size - const int foldHSpace = 4;//folding level tabulation x - int foldMargin { get { return parser == null ? 0 : parser.SyntacticTreeMaxDepth * foldHSpace; }}//folding margin size - - #region private and protected fields - bool foldingEnabled = true; - int leftMargin = 0; //margin used to display line numbers, folding errors,etc... - int visibleLines = 1; - int visibleColumns = 1; - int firstPrintedLine = -1; - int printedCurrentLine = 0;//Index of the currentline in the PrintedLines array - - CodeBuffer buffer; - BufferParser parser; - List PrintedLines;//list of lines visible in the Editor depending on scrolling and folding - - Dictionary formatting = new Dictionary(); - Dictionary parsing = new Dictionary(); - - Color selBackground; - Color selForeground; - int selStartCol; - int selEndCol; - - protected Rectangle rText; - protected FontExtents fe; - protected TextExtents te; - - Point mouseLocalPos; - bool doubleClicked = false; - #endregion - - void measureLeftMargin () { - leftMargin = 0; - if (PrintLineNumbers) - leftMargin += (int)Math.Ceiling((double)buffer.LineCount.ToString().Length * fe.MaxXAdvance) +6; - if (foldingEnabled) - leftMargin += foldMargin; - if (leftMargin > 0) - leftMargin += leftMarginGap; - updateVisibleColumns (); - } - void findLongestLineAndUpdateMaxScrollX() { - buffer.FindLongestVisualLine (); - updateMaxScrollX (); -// Debug.WriteLine ("SourceEditor: Find Longest line and update maxscrollx: {0} visible cols:{1}", MaxScrollX, visibleColumns); - } - /// - /// Updates visible line in widget, adapt max scroll y and updatePrintedLines - /// - void updateVisibleLines(){ - visibleLines = (int)Math.Floor ((double)ClientRectangle.Height / (fe.Ascent+fe.Descent)); - NotifyValueChanged ("VisibleLines", visibleLines); - updateMaxScrollY (); - updatePrintedLines (); - RegisterForGraphicUpdate (); -// System.Diagnostics.Debug.WriteLine ("update visible lines: " + visibleLines); -// System.Diagnostics.Debug.WriteLine ("update MaxScrollY: " + MaxScrollY); - } - void updateVisibleColumns(){ - visibleColumns = (int)Math.Floor ((double)(ClientRectangle.Width - leftMargin)/ fe.MaxXAdvance); - NotifyValueChanged ("VisibleColumns", visibleColumns); - updateMaxScrollX (); -// System.Diagnostics.Debug.WriteLine ("update visible columns: {0} leftMargin:{1}",visibleColumns, leftMargin); -// System.Diagnostics.Debug.WriteLine ("update MaxScrollX: " + MaxScrollX); - } - void updateMaxScrollX () { - MaxScrollX = Math.Max (0, buffer.longestLineCharCount - visibleColumns); - if (buffer.longestLineCharCount > 0) - NotifyValueChanged ("ChildWidthRatio", Slot.Width * visibleColumns / buffer.longestLineCharCount); - } - void updateMaxScrollY () { - if (parser == null || !foldingEnabled) { - MaxScrollY = Math.Max (0, buffer.LineCount - visibleLines); - if (buffer.UnfoldedLines > 0) - NotifyValueChanged ("ChildHeightRatio", Slot.Height * visibleLines / buffer.UnfoldedLines); - } else { - MaxScrollY = Math.Max (0, buffer.UnfoldedLines - visibleLines); - if (buffer.UnfoldedLines > 0) - NotifyValueChanged ("ChildHeightRatio", Slot.Height * visibleLines / buffer.UnfoldedLines); - } - } - void updatePrintedLines () { - buffer.editMutex.EnterReadLock (); - editorMutex.EnterWriteLock (); - - PrintedLines = new List (); - int curL = 0; - int i = 0; - - while (curL < buffer.LineCount && i < ScrollY) { - if (buffer [curL].IsFolded) - curL = buffer.GetEndNodeIndex (curL); - curL++; - i++; - } - - firstPrintedLine = curL; - i = 0; - while (i < visibleLines && curL < buffer.LineCount) { - PrintedLines.Add (buffer [curL]); - - if (buffer [curL].IsFolded) - curL = buffer.GetEndNodeIndex (curL); - - curL++; - i++; - } - - buffer.editMutex.ExitReadLock (); - editorMutex.ExitWriteLock (); - } - void updateOnScreenCurLineFromBuffCurLine(){ - printedCurrentLine = PrintedLines.IndexOf (buffer.CurrentCodeLine); - } - void toogleFolding (int line) { - if (parser == null || !foldingEnabled) - return; - buffer.ToogleFolding (line); - } - - #region Editor overrides - protected override void updateEditorFromProjFile () - { - Debug.WriteLine("\t\tSourceEditor updateEditorFromProjFile"); - - //buffer.editMutex.EnterWriteLock (); - loadSource (); - //buffer.editMutex.ExitWriteLock (); - - isDirty = false; - oldSource = projFile.Source; - CurrentLine = requestedLine; - CurrentColumn = requestedCol; - projFile.RegisteredEditors [this] = true; - } - protected override void updateProjFileFromEditor () - { - Debug.WriteLine("\t\tSourceEditor updateProjFileFromEditor"); - - buffer.editMutex.EnterWriteLock (); - string newsrc = buffer.FullText; - buffer.editMutex.ExitWriteLock (); - projFile.UpdateSource (this, newsrc); - } - protected override bool EditorIsDirty { - get { return isDirty; } - set { isDirty = value; } - } - protected override bool IsReady { - get { return projFile != null && buffer != null; } - } - #endregion - - #region Buffer events handlers - void Buffer_BufferCleared (object sender, EventArgs e) - { - editorMutex.EnterWriteLock (); - - buffer.longestLineCharCount = 0; - buffer.longestLineIdx = 0; - measureLeftMargin (); - MaxScrollX = MaxScrollY = 0; - PrintedLines = null; - RegisterForGraphicUpdate (); - notifyPositionChanged (); - isDirty = true; - - editorMutex.ExitWriteLock (); - } - void Buffer_LineAdditionEvent (object sender, CodeBufferEventArgs e) - { - for (int i = 0; i < e.LineCount; i++) { - int lptr = e.LineStart + i; - int charCount = buffer[lptr].PrintableLength; - if (charCount > buffer.longestLineCharCount) { - buffer.longestLineIdx = lptr; - buffer.longestLineCharCount = charCount; - }else if (lptr <= buffer.longestLineIdx) - buffer.longestLineIdx++; - if (parser == null) - continue; - parser.TryParseBufferLine (e.LineStart + i); - } - - if (parser != null) - parser.reparseSource (); - - measureLeftMargin (); - - updatePrintedLines (); - updateMaxScrollY (); - RegisterForGraphicUpdate (); - notifyPositionChanged (); - isDirty = true; - } - void Buffer_LineRemoveEvent (object sender, CodeBufferEventArgs e) - { - bool trigFindLongestLine = false; - for (int i = 0; i < e.LineCount; i++) { - int lptr = e.LineStart + i; - if (lptr <= buffer.longestLineIdx) - trigFindLongestLine = true; - } - if (trigFindLongestLine) - findLongestLineAndUpdateMaxScrollX (); - - measureLeftMargin (); - updatePrintedLines (); - updateMaxScrollY (); - RegisterForGraphicUpdate (); - notifyPositionChanged (); - isDirty = true; - } - void Buffer_LineUpadateEvent (object sender, CodeBufferEventArgs e) - { - bool trigFindLongestLine = false; - for (int i = 0; i < e.LineCount; i++) { - - int lptr = e.LineStart + i; - if (lptr == buffer.longestLineIdx) - trigFindLongestLine = true; - else if (buffer[lptr].PrintableLength > buffer.longestLineCharCount) { - buffer.longestLineCharCount = buffer[lptr].PrintableLength; - buffer.longestLineIdx = lptr; - } - } - if (trigFindLongestLine) - findLongestLineAndUpdateMaxScrollX (); - - RegisterForGraphicUpdate (); - notifyPositionChanged (); - isDirty = true; - } - void Buffer_PositionChanged (object sender, EventArgs e) - { - //Console.WriteLine ("Position changes: ({0},{1})", buffer.CurrentLine, buffer.CurrentColumn); - int cc = buffer.CurrentTabulatedColumn; - - if (cc > visibleColumns + ScrollX) { - ScrollX = cc - visibleColumns; - } else if (cc < ScrollX) - ScrollX = cc; - - RegisterForGraphicUpdate (); - updateOnScreenCurLineFromBuffCurLine (); - notifyPositionChanged (); - } - - void Buffer_SelectionChanged (object sender, EventArgs e) - { - RegisterForGraphicUpdate (); - } - void Buffer_FoldingEvent (object sender, CodeBufferEventArgs e) - { - updatePrintedLines (); - updateOnScreenCurLineFromBuffCurLine (); - updateMaxScrollY (); - RegisterForGraphicUpdate (); - } - #endregion - - void notifyPositionChanged (){ - try { - NotifyValueChanged ("CurrentLine", buffer.CurrentLine+1); - NotifyValueChanged ("CurrentColumn", buffer.CurrentColumn+1); - NotifyValueChanged ("CurrentLineHasError", CurrentLineHasError); - NotifyValueChanged ("CurrentLineError", CurrentLineError); - } catch (Exception ex) { - Console.WriteLine (ex.ToString ()); - } - } - - #region Public Crow Properties - public int CurrentLine{ - get { return buffer == null ? 0 : buffer.CurrentLine+1; } - set { - try { - int l = value - 1; - if (l == buffer.CurrentLine) - return; - buffer.CurrentLine = l; - l = buffer.CurrentLine; //reaffect from buffer where bound check is made - if ((bool)buffer [l]?.IsFolded) - buffer.ToogleFolding (l); - } catch (Exception ex) { - requestedLine = value - 1; - Console.WriteLine ("Error cur column: " + ex); - } - } - } - public int CurrentColumn{ - get { return buffer == null ? 0 : buffer.CurrentColumn+1; } - set { - try { - if (value - 1 == buffer.CurrentColumn) - return; - buffer.CurrentColumn = value - 1; - } catch (Exception ex) { - requestedCol = value - 1; - Console.WriteLine ("Error cur column: " + ex.ToString ()); - } - } - } - public bool PrintLineNumbers - { - get { return Configuration.Global.Get ("PrintLineNumbers"); } - set { - if (PrintLineNumbers == value) - return; - Configuration.Global.Set ("PrintLineNumbers", value); - NotifyValueChanged ("PrintLineNumbers", PrintLineNumbers); - measureLeftMargin (); - RegisterForGraphicUpdate (); - } - } - [DefaultValue("SteelBlue")] - public virtual Color SelectionBackground { - get { return selBackground; } - set { - if (value == selBackground) - return; - selBackground = value; - NotifyValueChanged ("SelectionBackground", selBackground); - RegisterForRedraw (); - } - } - [DefaultValue("White")] - public virtual Color SelectionForeground { - get { return selForeground; } - set { - if (value == selForeground) - return; - selForeground = value; - NotifyValueChanged ("SelectionForeground", selForeground); - RegisterForRedraw (); - } - } - public override int ScrollY { - get { - return base.ScrollY; - } - set { - if (value == base.ScrollY) - return; - base.ScrollY = value; - updatePrintedLines (); - updateOnScreenCurLineFromBuffCurLine (); - RegisterForGraphicUpdate (); - } - } - public ParserException CurrentLineError { - get { return buffer?.CurrentCodeLine?.exception; } - } - public bool CurrentLineHasError { - get { return buffer == null ? false : buffer.CurrentCodeLine == null ? false : - buffer.CurrentCodeLine.exception != null; } - } - public override ProjectFile ProjectNode { - get { - return base.ProjectNode; - } - set { - base.ProjectNode = value; - if (projFile != null) - parser = getParserFromExt (System.IO.Path.GetExtension (projFile.Extension)); - } - } - #endregion - - BufferParser getParserFromExt (string extension) { - if (string.IsNullOrEmpty(extension)) - return null; - if (!parsing.ContainsKey(extension)) - return null; - Type parserType = Type.GetType (parsing [extension]); - if (parserType == null) - return null; - return (BufferParser)Activator.CreateInstance (parserType, buffer ); - } - void loadSource () { - - try { - - if (parser == null) - buffer.Load (projFile.Source); - else//parser may have special linebrk rules - buffer.Load (projFile.Source, parser.LineBrkRegex); - - } catch (Exception ex) { - Debug.WriteLine (ex.ToString ()); - } - - projFile.RegisteredEditors [this] = true; - - updateMaxScrollY (); - MaxScrollX = Math.Max (0, buffer.longestLineCharCount - visibleColumns); - updatePrintedLines (); - - RegisterForGraphicUpdate (); - } - - /// - /// Current editor line, when set, update buffer.CurrentLine - /// - int PrintedCurrentLine { - get { return printedCurrentLine;} - set { - if (value < 0) { - ScrollY += value; - printedCurrentLine = 0; - } else if (PrintedLines.Count < visibleLines && value >= PrintedLines.Count) { - printedCurrentLine = PrintedLines.Count - 1; - }else if (value >= visibleLines) { - ScrollY += value - visibleLines + 1; - printedCurrentLine = visibleLines - 1; - }else - printedCurrentLine = value; - //Debug.WriteLine ("printed current line:" + printedCurrentLine.ToString ()); - //update position in buffer - buffer.CurrentLine = buffer.IndexOf (PrintedLines[printedCurrentLine]); - } - } - int getTabulatedColumn (int col, int line) { - return buffer [line].Content.Substring (0, col).Replace ("\t", new String (' ', Interface.TabSize)).Length; - } - int getTabulatedColumn (Point pos) { - return getTabulatedColumn (pos.X,pos.Y); - } - /// - /// Moves cursor one char to the left, move up if cursor reaches start of line - /// - /// true if move succeed - public bool MoveLeft(){ - if (buffer.CurrentColumn == 0) { - if (printedCurrentLine == 0) - return false; - PrintedCurrentLine--; - buffer.CurrentColumn = int.MaxValue; - } else - buffer.CurrentColumn--; - return true; - } - /// - /// Moves cursor one char to the right, move down if cursor reaches end of line - /// - /// true if move succeed - public bool MoveRight(){ - if (buffer.CurrentColumn >= buffer.CurrentCodeLine.Length) { - if (PrintedCurrentLine == buffer.UnfoldedLines - 1) - return false; - buffer.CurrentColumn = 0; - PrintedCurrentLine++; - } else - buffer.CurrentColumn++; - return true; - } - - #region Drawing - void drawLine(Context gr, Rectangle cb, int i) { - CodeLine cl = PrintedLines[i]; - int lineIndex = buffer.IndexOf(cl); - - double y = cb.Y + (fe.Ascent+fe.Descent) * i, x = cb.X; - - //Draw line numbering - Color mgFg = Color.Grey; - Color mgBg = Color.White; - if (PrintLineNumbers){ - Rectangle mgR = new Rectangle ((int)x, (int)y, leftMargin - leftMarginGap, (int)Math.Ceiling((fe.Ascent+fe.Descent))); - if (cl.exception != null) { - mgBg = Color.Red; - if (buffer.CurrentLine == lineIndex) - mgFg = Color.White; - else - mgFg = Color.LightGrey; - }else if (buffer.CurrentLine == lineIndex && HasFocus) { - mgFg = Color.Black; - mgBg = Color.DarkGrey; - } - string strLN = (lineIndex+1).ToString (); - gr.SetSourceColor (mgBg); - gr.Rectangle (mgR); - gr.Fill(); - gr.SetSourceColor (mgFg); - - gr.MoveTo (cb.X + (int)(gr.TextExtents (buffer.LineCount.ToString()).Width - gr.TextExtents (strLN).Width), y + fe.Ascent); - gr.ShowText (strLN); - gr.Fill (); - } - - - - //draw folding - if (foldingEnabled){ - - Rectangle rFld = new Rectangle (cb.X + leftMargin - leftMarginGap - foldMargin, - (int)(y + (fe.Ascent + fe.Descent) / 2.0 - foldSize / 2.0), foldSize, foldSize); - - gr.SetSourceColor (Color.Black); - gr.LineWidth = 1.0; - - int level = 0; - bool closingNode = false; - - if (currentNode != null) { - if (cl == currentNode.EndLine) { - currentNode = currentNode.Parent; - closingNode = true; - } - if (currentNode != null) - level = currentNode.Level - 1; - } - - for (int l = 0; l < level; l++) { - gr.MoveTo (rFld.Center.X + 0.5, y); - gr.LineTo (rFld.Center.X + 0.5, y + fe.Ascent + fe.Descent); - rFld.Left += foldHSpace; - } - if (closingNode) { - gr.MoveTo (rFld.Center.X + 0.5, y); - gr.LineTo (rFld.Center.X + 0.5, y + fe.Ascent / 2 + 0.5); - gr.LineTo (rFld.Center.X + 0.5 + foldSize / 2, y + fe.Ascent / 2 + 0.5); - closingNode = false; - } - //gr.SetDash (new double[]{ 1.5 },0.0); - gr.SetSourceColor (Color.Grey); - gr.Stroke (); - //gr.SetDash (new double[]{}, 0.0); - - if (cl.IsFoldable) { - gr.Rectangle (rFld); - gr.SetSourceColor (Color.White); - gr.Fill(); - gr.SetSourceColor (Color.Black); - gr.Rectangle (rFld, 1.0); - if (cl.IsFolded) { - gr.MoveTo (rFld.Center.X + 0.5, rFld.Y + 2); - gr.LineTo (rFld.Center.X + 0.5, rFld.Bottom - 2); - }else - currentNode = cl.SyntacticNode; - - gr.MoveTo (rFld.Left + 2, rFld.Center.Y + 0.5); - gr.LineTo (rFld.Right - 2, rFld.Center.Y + 0.5); - gr.Stroke (); - } - } - - gr.SetSourceColor (Foreground); - x += leftMargin; - - if (cl.Tokens == null) - drawRawCodeLine (gr, x, y, i, lineIndex); - else - drawParsedCodeLine (gr, x, y, i, lineIndex); - } - Node currentNode = null; -// void drawParsed(Context gr){ -// if (PrintedLines == null) -// return; -// -// gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight); -// gr.SetFontSize (Font.Size); -// gr.FontOptions = Interface.FontRenderingOptions; -// gr.Antialias = Interface.Antialias; -// -// Rectangle cb = ClientRectangle; -// gr.Save (); -// CairoHelpers.CairoRectangle (gr, cb, CornerRadius); -// gr.Clip (); -// -// bool selectionInProgress = false; -// -// Foreground.SetAsSource (gr); -// -// #region draw text cursor -// if (SelBegin != SelRelease) -// selectionInProgress = true; -// else if (HasFocus){ -// gr.LineWidth = 1.0; -// double cursorX = + leftMargin + cb.X + (CurrentColumn - ScrollX) * fe.MaxXAdvance; -// gr.MoveTo (0.5 + cursorX, cb.Y + printedCurrentLine * (fe.Ascent+fe.Descent)); -// gr.LineTo (0.5 + cursorX, cb.Y + (printedCurrentLine + 1) * (fe.Ascent+fe.Descent)); -// gr.Stroke(); -// } -// #endregion -// -// for (int i = 0; i < PrintedLines.Count; i++) -// drawTokenLine (gr, i, selectionInProgress, cb); -// -// gr.Restore (); -// } - void drawRawCodeLine(Context gr, double x, double y, int i, int lineIndex) { - string lstr = buffer[lineIndex].PrintableContent; - if (ScrollX < lstr.Length) - lstr = lstr.Substring (ScrollX); - else - lstr = ""; - - gr.MoveTo (x, y + fe.Ascent); - gr.ShowText (lstr); - gr.Fill (); - - if (!buffer.SelectionIsEmpty && lineIndex >= buffer.SelectionStart.Y && lineIndex <= buffer.SelectionEnd.Y) { - double rLineX = x, - rLineY = y, - rLineW = lstr.Length * fe.MaxXAdvance; - - //System.Diagnostics.Debug.WriteLine ("sel start: " + buffer.SelectionStart + " sel end: " + buffer.SelectionEnd); - if (lineIndex == buffer.SelectionStart.Y) { - rLineX += (selStartCol - ScrollX) * fe.MaxXAdvance; - rLineW -= selStartCol * fe.MaxXAdvance; - } - if (lineIndex == buffer.SelectionEnd.Y) - rLineW -= (lstr.Length - selEndCol) * fe.MaxXAdvance; - - gr.Save (); - gr.Operator = Operator.Source; - gr.Rectangle (rLineX, rLineY, rLineW, (fe.Ascent+fe.Descent)); - gr.SetSourceColor (SelectionBackground); - gr.FillPreserve (); - gr.Clip (); - gr.Operator = Operator.Over; - gr.SetSourceColor (SelectionForeground); - gr.MoveTo (x, y + fe.Ascent); - gr.ShowText (lstr); - gr.Fill (); - gr.Restore (); - } - } - void drawParsedCodeLine (Context gr, double x, double y, int i, int lineIndex) { - int lPtr = 0; - CodeLine cl = PrintedLines[i]; - - for (int t = 0; t < cl.Tokens.Count; t++) { - string lstr = cl.Tokens [t].PrintableContent; - if (lPtr < ScrollX) { - if (lPtr - ScrollX + lstr.Length <= 0) { - lPtr += lstr.Length; - continue; - } - lstr = lstr.Substring (ScrollX - lPtr); - lPtr += ScrollX - lPtr; - } - Color bg = this.Background; - Color fg = this.Foreground; - Color selbg = this.SelectionBackground; - Color selfg = this.SelectionForeground; - FontSlant fts = FontSlant.Normal; - FontWeight ftw = FontWeight.Normal; - - if (formatting.ContainsKey ((int)cl.Tokens [t].Type)) { - TextFormatting tf = formatting [(int)cl.Tokens [t].Type]; - bg = tf.Background; - fg = tf.Foreground; - if (tf.Bold) - ftw = FontWeight.Bold; - if (tf.Italic) - fts = FontSlant.Italic; - } - - gr.FontFace = Font.Name; - gr.SetSourceColor (fg); - - gr.MoveTo (x, y + fe.Ascent); - gr.ShowText (lstr); - gr.Fill (); - - if (buffer.SelectionInProgress && lineIndex >= buffer.SelectionStart.Y && lineIndex <= buffer.SelectionEnd.Y && - !(lineIndex == buffer.SelectionStart.Y && lPtr + lstr.Length <= selStartCol) && - !(lineIndex == buffer.SelectionEnd.Y && selEndCol <= lPtr)) { - - double rLineX = x, - rLineY = y, - rLineW = lstr.Length * fe.MaxXAdvance; - double startAdjust = 0.0; - - if ((lineIndex == buffer.SelectionStart.Y) && (selStartCol < lPtr + lstr.Length) && (selStartCol > lPtr)) - startAdjust = (selStartCol - lPtr) * fe.MaxXAdvance; - rLineX += startAdjust; - if ((lineIndex == buffer.SelectionEnd.Y) && (selEndCol < lPtr + lstr.Length)) - rLineW = (selEndCol - lPtr) * fe.MaxXAdvance; - rLineW -= startAdjust; - - gr.Save (); - gr.Operator = Operator.Source; - gr.Rectangle (rLineX, rLineY, rLineW, (fe.Ascent+fe.Descent)); - gr.SetSourceColor (selbg); - gr.FillPreserve (); - gr.Clip (); - gr.Operator = Operator.Over; - gr.SetSourceColor (selfg); - gr.MoveTo (x, y + fe.Ascent); - gr.ShowText (lstr); - gr.Fill (); - gr.Restore (); - } - x += (int)lstr.Length * fe.MaxXAdvance; - lPtr += lstr.Length; - } - } - - #endregion - - #region GraphicObject overrides - public override Font Font { - get { return base.Font; } - set { - base.Font = value; - /* - using (ImageSurface img = new ImageSurface (Format.Argb32, 1, 1)) { - using (Context gr = new Context (img)) { - gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight); - gr.SetFontSize (Font.Size); - - fe = gr.FontExtents; - } - }*/ - MaxScrollY = 0; - RegisterForGraphicUpdate (); - } - } - protected override int measureRawSize(LayoutingType lt) - { - if (lt == LayoutingType.Height) - return (int)Math.Ceiling((fe.Ascent+fe.Descent) * buffer.LineCount) + Margin * 2; - - return (int)(fe.MaxXAdvance * buffer.longestLineCharCount) + Margin * 2 + leftMargin; - } - public override void OnLayoutChanges (LayoutingType layoutType) - { - base.OnLayoutChanges (layoutType); - - if (layoutType == LayoutingType.Height) - updateVisibleLines (); - else if (layoutType == LayoutingType.Width) - updateVisibleColumns (); - } - - protected override void onDraw (Context gr) - { - base.onDraw (gr); - - gr.FontFace = Font.Name; - gr.FontSize = (uint)Font.Size; - - Rectangle cb = ClientRectangle; - - Foreground.SetAsSource (gr); - - buffer.editMutex.EnterReadLock (); - editorMutex.EnterReadLock (); - - #region draw text cursor - if (buffer.SelectionInProgress){ - selStartCol = getTabulatedColumn (buffer.SelectionStart); - selEndCol = getTabulatedColumn (buffer.SelectionEnd); - }else if (HasFocus && printedCurrentLine >= 0){ - gr.LineWidth = 1.0; - double cursorX = cb.X + (getTabulatedColumn(buffer.CurrentPosition) - ScrollX) * fe.MaxXAdvance + leftMargin; - gr.MoveTo (0.5 + cursorX, cb.Y + (printedCurrentLine) * (fe.Ascent+fe.Descent)); - gr.LineTo (0.5 + cursorX, cb.Y + (printedCurrentLine + 1) * (fe.Ascent+fe.Descent)); - gr.Stroke(); - } - #endregion - - if (PrintedLines?.Count > 0) { - int unfoldedLines = buffer.UnfoldedLines; - currentNode = null; - CodeLine cl = PrintedLines[0]; - int idx0 = buffer.IndexOf(cl); - int li = idx0-1; - while (li >= 0) { - if (buffer [li].IsFoldable && !buffer [li].IsFolded) { - if (buffer.IndexOf(buffer [li].SyntacticNode.EndLine) > idx0){ - currentNode = buffer [li].SyntacticNode; - break; - } - } - li--; - } - - for (int i = 0; i < visibleLines; i++) { - if (i + ScrollY >= unfoldedLines)//TODO:need optimize - break; - drawLine (gr, cb, i); - } - } - - editorMutex.ExitReadLock (); - - buffer.editMutex.ExitReadLock (); - - } - #endregion - - #region Mouse handling - - int hoverLine = -1; - public int HoverLine { - get { return hoverLine; } - set { - if (hoverLine == value) - return; - hoverLine = value; - NotifyValueChanged ("HoverLine", hoverLine); - NotifyValueChanged ("HoverError", buffer [hoverLine].exception); - } - } - void updateHoverLine () { - if (PrintedLines.Count > 0) { - int hvl = (int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent + fe.Descent))); - hvl = Math.Min (PrintedLines.Count - 1, hvl); - HoverLine = buffer.IndexOf (PrintedLines [hvl]); - } else - HoverLine = 0; - } - void updateCurrentPosFromMouseLocalPos(){ - PrintedCurrentLine = (int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent+fe.Descent))); - int curVisualCol = ScrollX + (int)Math.Round ((mouseLocalPos.X - leftMargin) / fe.MaxXAdvance); - - int i = 0; - int buffCol = 0; - while (i < curVisualCol && buffCol < buffer.CurrentCodeLine.Length) { - if (buffer.CurrentCodeLine[buffCol] == '\t') - i += Interface.TabSize; - else - i++; - buffCol++; - } - buffer.CurrentColumn = buffCol; - } - public override void onMouseEnter (object sender, MouseMoveEventArgs e) - { - base.onMouseEnter (sender, e); - if (e.X - ScreenCoordinates(Slot).X < leftMargin + ClientRectangle.X) - IFace.MouseCursor = MouseCursor.Arrow; - else - IFace.MouseCursor = MouseCursor.IBeam; - } - public override void onMouseLeave (object sender, MouseMoveEventArgs e) - { - base.onMouseLeave (sender, e); - IFace.MouseCursor = MouseCursor.Arrow; - } - public override void onMouseMove (object sender, MouseMoveEventArgs e) - { - base.onMouseMove (sender, e); - - mouseLocalPos = e.Position - ScreenCoordinates(Slot).TopLeft - ClientRectangle.TopLeft; - - updateHoverLine (); - - if (!e.Mouse.IsButtonDown (MouseButton.Left)) { - if (mouseLocalPos.X < leftMargin) - IFace.MouseCursor = MouseCursor.Arrow; - else - IFace.MouseCursor = MouseCursor.IBeam; - return; - } - - if (!HasFocus || !buffer.SelectionInProgress) - return; - - //mouse is down - updateCurrentPosFromMouseLocalPos(); - buffer.SetSelEndPos (); - } - public override void onMouseDown (object sender, MouseButtonEventArgs e) - { - if (!this.Focusable) - return; - - if (mouseLocalPos.X >= leftMargin) - base.onMouseDown (sender, e); - - if (doubleClicked) { - doubleClicked = false; - return; - } - - if (mouseLocalPos.X < leftMargin) { - toogleFolding (buffer.IndexOf (PrintedLines [(int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent+fe.Descent)))])); - return; - } - - updateCurrentPosFromMouseLocalPos (); - buffer.SetSelStartPos (); - } - public override void onMouseUp (object sender, MouseButtonEventArgs e) - { - base.onMouseUp (sender, e); - - if (buffer.SelectionIsEmpty) - buffer.ResetSelection (); - } - - public override void onMouseDoubleClick (object sender, MouseButtonEventArgs e) - { - doubleClicked = true; - base.onMouseDoubleClick (sender, e); - - buffer.GotoWordStart (); - buffer.SetSelStartPos (); - buffer.GotoWordEnd (); - buffer.SetSelEndPos (); - } - public void MakeSelection (int lineStart, int colStart, int lineEnd, int colEnd) { - buffer.CurrentLine = lineStart; - buffer.CurrentColumn = colStart; - buffer.SetSelStartPos (); - buffer.CurrentLine = lineEnd; - buffer.CurrentColumn = colEnd; - buffer.SetSelEndPos (); - } - public override void onMouseWheel (object sender, MouseWheelEventArgs e) - { - base.onMouseWheel (sender, e); - } - #endregion - - #region Keyboard handling - public override void onKeyDown (object sender, KeyEventArgs e) - { - //base.onKeyDown (sender, e); - - Key key = e.Key; - - if (IFace.Ctrl) { - switch (key) { - case Key.S: - projFile.Save (); - break; - case Key.W: - editorMutex.EnterWriteLock (); - if (IFace.Shift) - projFile.Redo (null); - else - projFile.Undo (null); - editorMutex.ExitWriteLock (); - break; - default: - Console.WriteLine (""); - break; - } - } - - switch (key) - { - case Key.Backspace: - buffer.DeleteChar (); - break; - case Key.Delete: - if (buffer.SelectionIsEmpty) - MoveRight (); - else if (IFace.Shift) - IFace.Clipboard = buffer.SelectedText; - buffer.DeleteChar (); - break; - case Key.Enter: - case Key.KeypadEnter: - if (!buffer.SelectionIsEmpty) - buffer.DeleteChar (); - buffer.InsertLineBreak (); - break; - case Key.Escape: - buffer.ResetSelection (); - break; - case Key.Home: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - if (IFace.Ctrl) - buffer.CurrentLine = 0; - buffer.CurrentColumn = 0; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - if (IFace.Ctrl) - buffer.CurrentLine = 0; - buffer.CurrentColumn = 0; - break; - case Key.End: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - if (IFace.Ctrl) - buffer.CurrentLine = int.MaxValue; - buffer.CurrentColumn = int.MaxValue; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - if (IFace.Ctrl) - buffer.CurrentLine = int.MaxValue; - buffer.CurrentColumn = int.MaxValue; - break; - case Key.Insert: - if (IFace.Shift) - buffer.Insert (IFace.Clipboard); - else if (IFace.Ctrl && !buffer.SelectionIsEmpty) - IFace.Clipboard = buffer.SelectedText; - break; - case Key.Left: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - if (IFace.Ctrl) - buffer.GotoWordStart (); - else - MoveLeft (); - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - if (IFace.Ctrl) - buffer.GotoWordStart (); - else - MoveLeft(); - break; - case Key.Right: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - if (IFace.Ctrl) - buffer.GotoWordEnd (); - else - MoveRight (); - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - if (IFace.Ctrl) - buffer.GotoWordEnd (); - else - MoveRight (); - break; - case Key.Up: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - PrintedCurrentLine--; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - PrintedCurrentLine--; - break; - case Key.Down: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - PrintedCurrentLine++; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - PrintedCurrentLine++; - break; - case Key.Menu: - break; - case Key.NumLock: - break; - case Key.PageDown: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - PrintedCurrentLine += visibleLines; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - PrintedCurrentLine += visibleLines; - break; - case Key.PageUp: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty) - buffer.SetSelStartPos (); - PrintedCurrentLine -= visibleLines; - buffer.SetSelEndPos (); - break; - } - buffer.ResetSelection (); - PrintedCurrentLine -= visibleLines; - break; - case Key.Tab: - if (IFace.Shift) { - if (buffer.SelectionIsEmpty || - (buffer.SelectionStart.Y == buffer.SelectionEnd.Y)) { - //TODO - break; - } - for (int i = buffer.SelectionStart.Y; i <= buffer.SelectionEnd.Y; i++) - buffer.RemoveLeadingTab (i); - buffer.SetSelectionOnFullLines (); - } else { - if (buffer.SelectionIsEmpty || - (buffer.SelectionStart.Y == buffer.SelectionEnd.Y)) { - buffer.Insert ("\t"); - break; - } - for (int i = buffer.SelectionStart.Y; i <= buffer.SelectionEnd.Y; i++) { - buffer.UpdateLine (i, "\t" + buffer [i].Content); - } - } - - break; - case Key.F8: - toogleFolding (buffer.CurrentLine); - break; - default: - break; - } - RegisterForGraphicUpdate(); - } - public override void onKeyPress (object sender, KeyPressEventArgs e) - { - base.onKeyPress (sender, e); - - buffer.Insert (e.KeyChar.ToString()); - buffer.ResetSelection (); - } - #endregion - } -} \ No newline at end of file diff --git a/Samples/CrowIDE/src/Editors/SvgEditor.cs b/Samples/CrowIDE/src/Editors/SvgEditor.cs deleted file mode 100644 index d81b1154..00000000 --- a/Samples/CrowIDE/src/Editors/SvgEditor.cs +++ /dev/null @@ -1,140 +0,0 @@ -// -// SvgEditor.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.ComponentModel; -using vkvg; - -namespace Crow.Coding -{ - public class SvgEditor : Editor - { - SvgPicture _pic = new SvgPicture(); - - int zoom; - - [DefaultValue(100)] - public int Zoom { - get { return zoom; } - set { - if (zoom == value) - return; - zoom = value; - NotifyValueChanged ("Zoom", zoom); - updateMaxScrolls (); - RegisterForGraphicUpdate (); - } - } - - void updateMaxScrolls() { - MaxScrollX = Math.Max(0, _pic.Dimensions.Width * zoom / 100 - Slot.Width); - MaxScrollY = Math.Max(0, _pic.Dimensions.Height * zoom / 100 - Slot.Height); - - if (Slot.Width + MaxScrollX > 0) - NotifyValueChanged ("ChildWidthRatio", Slot.Width * Slot.Width / (Slot.Width + MaxScrollX)); - else - NotifyValueChanged ("ChildWidthRatio", 0); - - if (Slot.Height + MaxScrollY > 0) - NotifyValueChanged ("ChildHeightRatio", Slot.Height * Slot.Height / (Slot.Height + MaxScrollY)); - else - NotifyValueChanged ("ChildHeightRatio", 0); - } - #region editor overrides - protected override void updateEditorFromProjFile () - { - Error = null; - try { - editorMutex.EnterWriteLock(); - _pic.LoadSvgFragment (projFile.Source); - _pic.Scaled = true; - _pic.KeepProportions = true; - } catch (Exception ex) { - Error = ex; - } - editorMutex.ExitWriteLock (); - updateMaxScrolls (); - RegisterForGraphicUpdate (); - } - protected override void updateProjFileFromEditor () - { - throw new NotImplementedException (); - } - protected override bool EditorIsDirty { - get { return false; } - set { - throw new NotImplementedException (); - } - } - protected override bool IsReady { - get { return projFile != null; } - } - #endregion - - #region GraphicObject overrides - protected override int measureRawSize (LayoutingType lt) - { - if (_pic == null) - return 2 * Margin; - //_pic = "#Crow.Images.Icons.IconAlerte.svg"; - //TODO:take scalling in account - if (lt == LayoutingType.Width) - return _pic.Dimensions.Width + 2 * Margin; - else - return _pic.Dimensions.Height + 2 * Margin; - } - protected override void onDraw (Context gr) - { - base.onDraw (gr); - - Rectangle r = ClientRectangle; - Foreground.SetAsSource (gr, r); - gr.Rectangle (r, 0.1); - gr.Stroke (); - - r.Width = _pic.Dimensions.Width * zoom / 100; - r.Height = _pic.Dimensions.Height * zoom / 100; - - gr.Save (); - - editorMutex.EnterReadLock (); - - gr.Translate (-ScrollX, -ScrollY); - if (_pic != null) - _pic.Paint (gr, r); - editorMutex.ExitReadLock (); - - gr.Restore (); - } - public override void OnLayoutChanges (LayoutingType layoutType) - { - base.OnLayoutChanges (layoutType); - if ((layoutType | LayoutingType.Sizing) > 0) - updateMaxScrolls (); - } - #endregion - } -} - diff --git a/Samples/CrowIDE/src/Extensions.cs b/Samples/CrowIDE/src/Extensions.cs deleted file mode 100644 index 86c5834f..00000000 --- a/Samples/CrowIDE/src/Extensions.cs +++ /dev/null @@ -1,45 +0,0 @@ -// -// Extensions.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2016 jp -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -using System; -using System.Collections.Generic; - -namespace Crow -{ - public static partial class Extensions - { - public static string GetIcon(this Widget go){ - return "#CrowIDE.icons.toolbox." + go.GetType().FullName + ".svg"; - } - public static List GetChildren(this Widget go){ - Type goType = go.GetType(); - if (typeof (Group).IsAssignableFrom (goType)) - return (go as Group).Children; - if (typeof(Container).IsAssignableFrom (goType)) - return new List( new Widget[] { (go as Container).Child }); - if (typeof(TemplatedContainer).IsAssignableFrom (goType)) - return new List( new Widget[] { (go as TemplatedContainer).Content }); - if (typeof(TemplatedGroup).IsAssignableFrom (goType)) - return (go as TemplatedGroup).Items; - - return new List(); - } - } -} diff --git a/Samples/CrowIDE/src/GraphicObjectDesignContainer.cs b/Samples/CrowIDE/src/GraphicObjectDesignContainer.cs deleted file mode 100644 index 166181d8..00000000 --- a/Samples/CrowIDE/src/GraphicObjectDesignContainer.cs +++ /dev/null @@ -1,85 +0,0 @@ -// -// GraphicObjectDesignContainer.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; - -namespace Crow.Coding -{ - public class GraphicObjectDesignContainer - { - #region CTOR - public GraphicObjectDesignContainer (Type crowType) - { - CrowType = crowType; - } - #endregion - - int dragIconSize = 32; - public Type CrowType; - - public string IconPath { - get { return "#CrowIDE.icons.toolbox." + CrowType.FullName + ".svg"; } - } - public string DisplayName { - get { return CrowType.Name; } - } - void onStartDrag (object sender, EventArgs e) - { - /* - Widget go = sender as Widget; - - lock (go.IFace.UpdateMutex) { - go.IFace.DragImageHeight = dragIconSize; - go.IFace.DragImageWidth = dragIconSize; - SvgPicture pic = new SvgPicture (IconPath); - //pic.Load (go.IFace, IconPath); - ImageSurface img = new ImageSurface (Format.Argb32, dragIconSize, dragIconSize); - using (Context ctx = new Context (img)) { - Rectangle r = new Rectangle (0, 0, dragIconSize, dragIconSize); - pic.Paint (ctx, r); - ctx.Operator = Operator.In; - ctx.SetSourceRGBA (1.0, 1.0, 1.0, 1.0); - ctx.Rectangle (r); - ctx.Fill (); - - } - go.IFace.DragImage = img; - }*/ - } - void onEndDrag (object sender, DragDropEventArgs e) - { - (sender as Widget).IFace.ClearDragImage (); - - } - void onDrop (object sender, DragDropEventArgs e) - { - ImlVisualEditor imlVE = e.DropTarget as ImlVisualEditor; - if (imlVE != null) - imlVE.ClearDraggedObj (false); - (sender as Widget).IFace.ClearDragImage (); - } - } -} - diff --git a/Samples/CrowIDE/src/INetProject.cs b/Samples/CrowIDE/src/INetProject.cs deleted file mode 100644 index 53d81a1f..00000000 --- a/Samples/CrowIDE/src/INetProject.cs +++ /dev/null @@ -1,35 +0,0 @@ -// -// INetProject.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; - -namespace Crow.Coding -{ - public interface INetProject - { - - } -} - diff --git a/Samples/CrowIDE/src/MemberView/CategoryContainer.cs b/Samples/CrowIDE/src/MemberView/CategoryContainer.cs deleted file mode 100644 index fbf3fe2c..00000000 --- a/Samples/CrowIDE/src/MemberView/CategoryContainer.cs +++ /dev/null @@ -1,65 +0,0 @@ -// -// CategoryContainer.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; - -namespace Crow.Coding -{ - public class CategoryContainer : IValueChange - { - #region IValueChange implementation - public event EventHandler ValueChanged; - public virtual void NotifyValueChanged(string MemberName, object _value) - { - ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value)); - } - #endregion - - bool _isExpanded = true; - - public PropertyContainer[] Properties; - public string Name; - - public bool IsExpanded - { - get { return _isExpanded; } - set - { - if (value == _isExpanded) - return; - - _isExpanded = value; - - NotifyValueChanged ("IsExpanded", _isExpanded); - } - } - - public CategoryContainer (string categoryName, PropertyContainer[] properties){ - Name = categoryName; - Properties = properties; - } - } -} - diff --git a/Samples/CrowIDE/src/MemberView/MembersView.cs b/Samples/CrowIDE/src/MemberView/MembersView.cs deleted file mode 100644 index b8dad3d0..00000000 --- a/Samples/CrowIDE/src/MemberView/MembersView.cs +++ /dev/null @@ -1,139 +0,0 @@ -// -// MembersView.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2016 jp -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -using System; -using Crow; -using System.Xml.Serialization; -using System.ComponentModel; -using System.Reflection; -using System.Collections.Generic; -using System.Linq; - -namespace Crow.Coding -{ - public class MembersView : ListBox - { - object instance; - ImlProjectItem projFile; - - public MembersView () : base() {} - - //cache property containers per type - //Dictionary propContainersCache = new Dictionary(); - Dictionary> categoryContainersCache = new Dictionary> (); - - [DefaultValue(null)] - public virtual object Instance { - get { return instance; } - set { - if (instance == value) - return; - object lastInst = instance; - - instance = value; - NotifyValueChanged ("Instance", instance); - - if (Instance is Widget) { - NotifyValueChanged ("SelectedItemName", Instance.GetType().Name + (Instance as Widget).design_id - + ":" + (Instance as Widget).design_imlPath ); - }else - NotifyValueChanged ("SelectedItemName", ""); - - if (instance == null) { - Data = null; - return; - } - - Type it = instance.GetType (); - if (!categoryContainersCache.ContainsKey (it.FullName)) { - MemberInfo[] members = it.GetMembers (BindingFlags.Public | BindingFlags.Instance); - List props = new List (); - foreach (MemberInfo m in members) { - if (m.MemberType == MemberTypes.Property) { - PropertyInfo pi = m as PropertyInfo; - if (!pi.CanWrite) - continue; - if (pi.GetCustomAttribute (typeof(XmlIgnoreAttribute)) != null) - continue; - props.Add (new PropertyContainer (this, pi)); - } - } - //propContainersCache.Add (it.FullName, props.OrderBy (p => p.Name).ToArray ()); - List categories = new List (); - - foreach (IGrouping ig in props.OrderBy (p => p.Name).GroupBy(pc=>pc.DesignCategory)) { - categories.Add(new CategoryContainer(ig.Key, ig.ToArray())); - } - categoryContainersCache.Add (it.FullName, categories); - } - - - Data = categoryContainersCache[it.FullName]; - - if (lastInst != instance) { - foreach (CategoryContainer cc in categoryContainersCache [it.FullName]) { - foreach (PropertyContainer pc in cc.Properties) { - pc.NotifyValueChanged ("Value", pc.Value); - pc.NotifyValueChanged ("LabForeground", pc.LabForeground); - } - } - } - } - } - public ImlProjectItem ProjectNode { - get { return projFile; } - set { - if (projFile == value) - return; - -// if (projFile != null) -// projFile.UnregisterEditor (this); - - projFile = value; - -// if (projFile != null) -// projFile.RegisterEditor (this); - - NotifyValueChanged ("ProjectNode", projFile); - } - } - -// public void updateSource () { -// if (projFile == null) -// return; -// projFile.UpdateSource (this, (Instance as GraphicObject).GetIML ()); -// } - -// public override void Paint (ref Context ctx) -// { -// base.Paint (ref ctx); -// -// if (SelectedIndex < 0) -// return; -// -// Rectangle r = Parent.ContextCoordinates(Items [SelectedIndex].Slot); -// ctx.SetSourceRGB (0, 0, 1); -// ctx.Rectangle (r); -// ctx.LineWidth = 2; -// ctx.Stroke (); -// } - - } -} diff --git a/Samples/CrowIDE/src/MemberView/PropertyContainer.cs b/Samples/CrowIDE/src/MemberView/PropertyContainer.cs deleted file mode 100644 index 4d043ab4..00000000 --- a/Samples/CrowIDE/src/MemberView/PropertyContainer.cs +++ /dev/null @@ -1,222 +0,0 @@ -// -// PropertyContainer.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.Reflection; -using System.Linq; -using System.Collections.Generic; -using System.Diagnostics; -using System.ComponentModel; - -namespace Crow.Coding -{ - public class PropertyContainer : IValueChange - { - #region IValueChange implementation - public event EventHandler ValueChanged; - public virtual void NotifyValueChanged(string MemberName, object _value) - { - ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value)); - } - #endregion - - PropertyInfo pi; - MembersView mview; - Command cmdReset, cmdGoToStyle; - - public List Commands; - - #region CTOR - public PropertyContainer(MembersView mv, PropertyInfo prop){ - mview = mv; - pi = prop; - - cmdReset = new Crow.Command (new Action (() => Reset ())) { Caption = "Reset to default" }; - cmdGoToStyle = new Crow.Command (new Action (() => GotoStyle ())) { Caption = "Goto style" }; - - Commands = new List (new Crow.Command[] { cmdReset, cmdGoToStyle }); - } - #endregion - - public string DesignCategory { - get { - DesignCategory dca = (DesignCategory)pi.GetCustomAttribute (typeof(DesignCategory)); - return dca == null ? "Divers" : dca.Name; - } - } - public string Name { get { return pi.Name; }} - public object Value { - get { - return mview.ProjectNode?.SelectedItem == null ? null : pi.GetValue(mview.ProjectNode.SelectedItem); - } - set { - try { - if (value == Value) - return; - Widget g = Instance; - string valstr = null, oldval = null; - - if (value != null) - valstr = value.ToString(); - - if (HasStyling) - oldval = g.design_style_values[Name]; - else if (HasDefaultValue) - oldval = DefaultValue?.ToString(); - else if (IsSetByIML) - oldval = g.design_iml_values [Name]; - - if (valstr == oldval){ - if (IsSetByIML){ - g.design_iml_values.Remove(Name); - Debug.WriteLine("iml attrib removed {0}.{1}", g.Name, Name); - }else - return; - }else{ - if (IsSetByIML){ - g.design_iml_values [Name] = valstr; - Debug.WriteLine("iml update {0}.{1} = {2}", g.Name, Name, valstr); - }else{ - g.design_iml_values.Add(Name,valstr); - Debug.WriteLine("iml add {0}.{1} = {2}", g.Name, Name, valstr); - } - } - - if (!pi.PropertyType.IsAssignableFrom(value.GetType()) && pi.PropertyType != typeof(string)){ - if (pi.PropertyType.IsEnum) { - if (value is string) { - pi.SetValue (g, Enum.Parse (pi.PropertyType, (string)value)); - }else - pi.SetValue (g, value); - } else { - MethodInfo me = pi.PropertyType.GetMethod - ("Parse", BindingFlags.Static | BindingFlags.Public, - System.Type.DefaultBinder, new Type [] {typeof (string)},null); - pi.SetValue (g, me.Invoke (null, new object[] { value }), null); - } - }else - pi.SetValue(g, value); - - Debug.WriteLine("\t\tPropContainer set design_dirty to instance"); - - mview.ProjectNode.Instance.design_HasChanged = true; - NotifyValueChanged ("Value", value); - NotifyValueChanged ("LabForeground", LabForeground); - } catch (Exception ex) { - Debug.WriteLine ("Error setting property:"+ ex.ToString()); - } - // - } - } - /// - /// for style attribute which is a string, return Style as type - /// - public string Type { get { return pi.PropertyType.IsEnum ? - "System.Enum" - : pi.Name == "Style" ? "Style" : pi.PropertyType.FullName; }} - - public object[] Choices { - get { - return pi.PropertyType.IsEnum ? - Enum.GetValues (pi.PropertyType).Cast().ToArray() : - mview.ProjectNode.Project.solution.AvailaibleStyles; - } - } - /// - /// Current graphicobject instance - /// - public Widget Instance { - get { return mview.ProjectNode.SelectedItem as Widget; } - } - public object DefaultValue { - get { return ((DefaultValueAttribute)(pi.GetCustomAttribute (typeof (DefaultValueAttribute)))).Value; } - } - public bool HasDefaultValue { - get { return pi.GetCustomAttribute (typeof(DefaultValueAttribute))!=null; } - } - /// - /// return true if current value comes from IML attributes - /// - public bool IsSetByIML { - get { return Instance.design_iml_values.ContainsKey (Name); } - } - /// - /// return true if member default value comes from style - /// - public bool HasStyling { - get { return Instance.design_style_locations.ContainsKey(Name); } - } - /// - /// Return true if current value comes from styling - /// - public bool IsSetByStyling { - get { return IsSetByIML ? false : HasStyling; } - } - - - public Fill LabForeground { - get { return IsSetByIML ? Color.DarkBlue : HasStyling ? Color.Black : Color.Grey;} - } - - /// - /// reset to default value - /// - public void Reset () { - Widget inst = mview.ProjectNode.SelectedItem as Widget; - if (!inst.design_iml_values.ContainsKey (Name)) - return; - inst.design_iml_values.Remove (Name); - - NotifyValueChanged ("LabForeground", LabForeground); - mview.ProjectNode.UpdateSource(this, mview.ProjectNode.Instance.GetIML()); - //mview.ProjectNode.Instance.design_HasChanged = true; - //should reinstantiate to get default - } - public void GotoStyle(){ - Widget g = Instance; - if (!g.design_style_locations.ContainsKey (Name)) - return; - FileLocation fl = g.design_style_locations [Name]; - ProjectFile pf; - if (!mview.ProjectNode.Project.TryGetProjectFileFromPath ("#" + fl.FilePath, out pf)) - return; - - if (!pf.IsOpened) - pf.Open (); - - pf.CurrentLine = fl.Line; - pf.CurrentColumn = fl.Column; - - pf.IsSelected = true; - - } - - public override string ToString () - { - return string.Format ("{0} = {1}", Name, Value); - } - } -} - diff --git a/Samples/CrowIDE/src/Project.cs b/Samples/CrowIDE/src/Project.cs deleted file mode 100644 index a3ffa636..00000000 --- a/Samples/CrowIDE/src/Project.cs +++ /dev/null @@ -1,519 +0,0 @@ -// -// Project.cs -// -// Author: -// jp <> -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.Xml; -using System.IO; -using System.Collections.Generic; -using System.Linq; -using Microsoft.CSharp; -using System.CodeDom.Compiler; -using Crow; -using System.Text.RegularExpressions; - -namespace Crow.Coding { - public class Project : IValueChange { - #region IValueChange implementation - public event EventHandler ValueChanged; - public virtual void NotifyValueChanged (string MemberName, object _value) { - ValueChanged.Raise (this, new ValueChangeEventArgs (MemberName, _value)); - } - #endregion - - bool isLoaded = false; - bool isExpanded; - XmlDocument xmlDoc; - XmlNode nodeProject; - XmlNode nodeProps; - XmlNodeList nodesItems; - SolutionProject solutionProject; - Crow.Command cmdSave, cmdOpen, cmdCompile, cmdSetAsStartProj, cmdNewFile; - - #region CTOR - public Project (Solution sol, SolutionProject sp) { - solutionProject = sp; - - solution = sol; - - cmdSave = new Crow.Command (new Action (() => Save ())) { Caption = "Save", Icon = new SvgPicture ("#CrowIDE.icons.save.svg"), CanExecute = true }; - cmdOpen = new Crow.Command (new Action (() => Load ())) { Caption = "Open", Icon = new SvgPicture ("#CrowIDE.icons.open.svg"), CanExecute = false }; - cmdCompile = new Crow.Command (new Action (() => Compile ())) { - Caption = "Compile", - Icon = "#CrowIDE.icons.compile.svg" - }; - cmdSetAsStartProj = new Crow.Command (new Action (() => setAsStartupProject ())) { - Caption = "Set as Startup Project" - }; - cmdNewFile = new Crow.Command (new Action (() => AddNewFile ())) { - Caption = "Add New File", - Icon = new SvgPicture ("#CrowIDE.icons.blank-file.svg"), - CanExecute = true - }; - - Commands = new List (new Crow.Command[] { cmdOpen, cmdSave, cmdSetAsStartProj, cmdCompile, cmdNewFile }); - - Load (); - } - #endregion - - public Solution solution; - public List Commands; - public CompilerResults CompilationResults; - public List dependantProjects = new List (); - public Project ParentProject = null; - List rootItems; - List flattenNodes; - - public string Name { - get { return solutionProject.ProjectName; } - } - public bool IsLoaded { - get { return isLoaded; } - set { - if (isLoaded == value) - return; - isLoaded = value; - NotifyValueChanged ("IsLoaded", isLoaded); - } - } - public bool IsExpanded { - get { return isExpanded; } - set { - if (value == isExpanded) - return; - isExpanded = value; - NotifyValueChanged ("IsExpanded", isExpanded); - } - } - public bool IsStartupProject { - get { return solution.StartupProject == this; } - } - public string Path { - get { return System.IO.Path.Combine (solution.SolutionFolder, solutionProject.RelativePath.Replace ('\\', '/')); } - } - public string RootDir { - get { return System.IO.Path.GetDirectoryName (Path); } - } - - - - public List RootItems { - get { return rootItems; } - } - - void buildTreeNodes () { - ProjectNode root = new ProjectNode (this, ItemType.VirtualGroup, RootNamespace); - List items = new List (); - foreach (XmlNode i in nodesItems) { - foreach (XmlNode f in i.ChildNodes) { - items.Add (new ProjectItem (this, f)); - } - } - - flattenNodes = new List (); - - ProjectNode refs = new ProjectNode (this, ItemType.ReferenceGroup, "References"); - root.AddChild (refs); - - foreach (ProjectItem pn in items) { - switch (pn.Type) { - case ItemType.Reference: - refs.AddChild (pn); - flattenNodes.Add (pn); - break; - case ItemType.ProjectReference: - ProjectReference pr = new ProjectReference (pn); - refs.AddChild (pr); - flattenNodes.Add (pr); - break; - case ItemType.Compile: - case ItemType.None: - case ItemType.EmbeddedResource: - ProjectNode curNode = root; - string[] folds = pn.Path.Split ('/'); - for (int i = 0; i < folds.Length - 1; i++) { - ProjectNode nextNode = curNode.ChildNodes.FirstOrDefault (n => n.DisplayName == folds[i] && n.Type == ItemType.VirtualGroup); - if (nextNode == null) { - nextNode = new ProjectNode (this, ItemType.VirtualGroup, folds[i]); - curNode.AddChild (nextNode); - } - curNode = nextNode; - } - ProjectNode f = null; - switch (pn.Extension) { - /*case ".cs": - f = new CSProjectFile (pn); - break;*/ - case ".crow": - case ".template": - case ".goml": - case ".itemp": - case ".imtl": - f = new ImlProjectItem (pn); - break; - case ".style": - f = new StyleProjectItem (pn); - break; - default: - f = new ProjectFile (pn); - break; - } - curNode.AddChild (f); - flattenNodes.Add (f); - break; - } - } - root.SortChilds (); - - rootItems = root.ChildNodes; - } - - #region Project properties - public string ToolsVersion { - get { return nodeProject?.Attributes["ToolsVersion"]?.Value; } - } - public string DefaultTargets { - get { return nodeProject?.Attributes["DefaultTargets"]?.Value; } - } - public string ProjectGuid { - get { return solutionProject.ProjectGuid; } - } - public string AssemblyName { - get { return nodeProps["AssemblyName"]?.InnerText; } - } - public string OutputType { - get { return nodeProps["OutputType"]?.InnerText; } - } - public string RootNamespace { - get { return nodeProps["RootNamespace"]?.InnerText; } - } - public bool AllowUnsafeBlocks { - get { - return nodeProps["AllowUnsafeBlocks"] == null ? false : - bool.Parse (nodeProps["AllowUnsafeBlocks"]?.InnerText); - } - } - public bool NoStdLib { - get { - return nodeProps["NoStdLib"] == null ? false : - bool.Parse (nodeProps["NoStdLib"]?.InnerText); - } - } - public bool TreatWarningsAsErrors { - get { - return nodeProps["TreatWarningsAsErrors"] == null ? false : - bool.Parse (nodeProps["TreatWarningsAsErrors"]?.InnerText); - } - } - public bool SignAssembly { - get { return bool.Parse (nodeProps["SignAssembly"]?.InnerText); } - } - public string TargetFrameworkVersion { - get { return nodeProps["TargetFrameworkVersion"]?.InnerText; } - } - public string Description { - get { return nodeProps["Description"]?.InnerText; } - } - public string OutputPath { - get { return nodeProps["OutputPath"]?.InnerText; } - } - public string IntermediateOutputPath { - get { return nodeProps["IntermediateOutputPath"]?.InnerText; } - } - public string StartupObject { - get { return nodeProps["StartupObject"]?.InnerText; } - } - public bool DebugSymbols { - get { return nodeProps["DebugSymbols"] == null ? false : bool.Parse (nodeProps["DebugSymbols"]?.InnerText); } - } - public int WarningLevel { - get { return nodeProps["WarningLevel"] == null ? 0 : int.Parse (nodeProps["WarningLevel"]?.InnerText); } - } - - #endregion - - - public void AddNewFile () { - Window.Show (CrowIDE.MainIFace, "#CrowIDE.ui.NewFile.crow", true).DataSource = this; - } - - public void Load () { - - xmlDoc = new XmlDocument (); - using (Stream ins = new FileStream (this.Path, FileMode.Open)) { - xmlDoc.Load (new XmlTextReader (ins) { Namespaces = false }); - } - - nodeProject = xmlDoc.SelectSingleNode ("Project"); - XmlNodeList nodesProps = xmlDoc.SelectNodes ("/Project/PropertyGroup"); - - foreach (XmlNode n in nodesProps) { - if (n.Attributes["Condition"] == null) - nodeProps = n; - } - nodesItems = xmlDoc.SelectNodes ("/Project/ItemGroup"); - - if (ProjectGuid != solutionProject.ProjectGuid) - throw new Exception ("Project GUID not matching with solution"); - - buildTreeNodes (); - - IsLoaded = true; - } - - public void Save () { - - } - - void setAsStartupProject () { - solution.StartupProject = this; - } - static Regex regexDirTokens = new Regex (@"\$\(([^\)]*)\)|([^\$]*)"); - - string getDirectoryWithTokens (string dir) { - Match m = regexDirTokens.Match (dir); - string tmp = ""; - while (m.Success) { - if (m.Value == @"$(SolutionDir)") - tmp = System.IO.Path.Combine (tmp, solution.SolutionFolder); - else if (m.Value == @"$(Configuration)") - tmp = System.IO.Path.Combine (tmp, "Debug"); - else - tmp = System.IO.Path.Combine (tmp, m.Value); - - if (tmp.EndsWith (@"\") || tmp.EndsWith (@"/")) - tmp = tmp.Remove (tmp.Length - 1); - - m = m.NextMatch (); - } - return tmp; - } - public string Compile () { - if (ParentProject != null) - ParentProject.Compile (); - - CSharpCodeProvider cp = new CSharpCodeProvider (); - CompilerParameters parameters = new CompilerParameters (); - - foreach (ProjectReference pr in flattenNodes.OfType ()) { - Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID); - if (p == null) - throw new Exception ("referenced project not found"); - parameters.ReferencedAssemblies.Add (p.Compile ()); - } - - string outputDir = getDirectoryWithTokens (this.OutputPath); - string objDir = getDirectoryWithTokens (this.IntermediateOutputPath); - - Directory.CreateDirectory (outputDir); - Directory.CreateDirectory (objDir); - - parameters.OutputAssembly = System.IO.Path.Combine (outputDir, this.AssemblyName); - - // True - exe file generation, false - dll file generation - if (this.OutputType == "Library") { - parameters.GenerateExecutable = false; - parameters.CompilerOptions += " /target:library"; - parameters.OutputAssembly += ".dll"; - } else { - parameters.GenerateExecutable = true; - parameters.CompilerOptions += " /target:exe"; - parameters.OutputAssembly += ".exe"; - parameters.MainClass = this.StartupObject; - } - - parameters.GenerateInMemory = false; - parameters.IncludeDebugInformation = this.DebugSymbols; - parameters.TreatWarningsAsErrors = this.TreatWarningsAsErrors; - parameters.WarningLevel = this.WarningLevel; - parameters.CompilerOptions += " /noconfig"; - if (this.AllowUnsafeBlocks) - parameters.CompilerOptions += " /unsafe"; - parameters.CompilerOptions += " /delaysign+"; - parameters.CompilerOptions += " /debug:full /debug+"; - parameters.CompilerOptions += " /optimize-"; - parameters.CompilerOptions += " /define:\"DEBUG;TRACE\""; - parameters.CompilerOptions += " /nostdlib"; - - - - foreach (ProjectItem pi in flattenNodes.Where (p => p.Type == ItemType.Reference)) { - - if (string.IsNullOrEmpty (pi.HintPath)) { - parameters.CompilerOptions += " /reference:/usr/lib/mono/4.5/" + pi.Path + ".dll"; - continue; - } - parameters.ReferencedAssemblies.Add (pi.Path); - string fullHintPath = System.IO.Path.GetFullPath (System.IO.Path.Combine (RootDir, pi.HintPath.Replace ('\\', '/'))); - if (File.Exists (fullHintPath)) { - string outPath = System.IO.Path.Combine (outputDir, System.IO.Path.GetFileName (fullHintPath)); - if (!File.Exists (outPath)) - File.Copy (fullHintPath, outPath); - } - } - parameters.CompilerOptions += " /reference:/usr/lib/mono/4.5/System.Core.dll"; - parameters.CompilerOptions += " /reference:/usr/lib/mono/4.5/mscorlib.dll"; - //parameters.ReferencedAssemblies.Add ("System.Core"); - //parameters.ReferencedAssemblies.Add ("mscorlib.dll"); - - - IEnumerable pfs = flattenNodes.OfType (); - - foreach (ProjectFile pi in pfs.Where (p => p.Type == ItemType.EmbeddedResource)) { - - string absPath = pi.AbsolutePath; - string logicName = pi.LogicalName; - if (string.IsNullOrEmpty (logicName)) - parameters.CompilerOptions += string.Format (" /resource:{0},{1}", absPath, this.Name + "." + pi.Path.Replace ('/', '.')); - else - parameters.CompilerOptions += string.Format (" /resource:{0},{1}", absPath, logicName); - } - foreach (ProjectFile pi in pfs.Where (p => p.Type == ItemType.None)) { - if (pi.CopyToOutputDirectory == CopyToOutputState.Never) - continue; - string source = pi.AbsolutePath; - string target = System.IO.Path.Combine (outputDir, pi.Path); - Directory.CreateDirectory (System.IO.Path.GetDirectoryName (target)); - - if (File.Exists (target)) { - if (pi.CopyToOutputDirectory == CopyToOutputState.PreserveNewest) { - if (DateTime.Compare ( - System.IO.File.GetLastWriteTime (source), - System.IO.File.GetLastWriteTime (target)) < 0) - continue; - } - File.Delete (target); - } - System.Diagnostics.Debug.WriteLine ("copy " + source + " to " + target); - File.Copy (source, target); - } - string[] files = pfs.Where (p => p.Type == ItemType.Compile).Select (p => p.AbsolutePath).ToArray (); - - System.Diagnostics.Debug.WriteLine ("---- start compilation of :" + parameters.OutputAssembly); - System.Diagnostics.Debug.WriteLine (parameters.CompilerOptions); - - CompilationResults = cp.CompileAssemblyFromFile (parameters, files); - - solution.UpdateErrorList (); - - return parameters.OutputAssembly; - } - - public bool TryGetProjectFileFromAbsolutePath (string absolutePath, out ProjectFile pi) { - pi = flattenNodes.OfType ().FirstOrDefault - (pp => pp.AbsolutePath == absolutePath); - return pi != null; - } - public bool TryGetProjectFileFromPath (string path, out ProjectFile pi) { - if (path.StartsWith ("#", StringComparison.Ordinal)) - pi = flattenNodes.OfType ().FirstOrDefault - (pp => pp.Type == ItemType.EmbeddedResource && pp.ResourceID == path.Substring (1)); - else - pi = flattenNodes.OfType ().FirstOrDefault (pp => pp.Path == path); - - if (pi != null) - return true; - - foreach (ProjectReference pr in flattenNodes.OfType ()) { - Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID); - if (p == null) - throw new Exception ("referenced project not found"); - if (p.TryGetProjectFileFromPath (path, out pi)) - return true; - } - //TODO: search referenced assemblies - return false; - } - - public void GetDefaultTemplates () { - IEnumerable tmpFiles = - flattenNodes.OfType ().Where (pp => pp.Extension == ".template"); - - foreach (ProjectFile pi in tmpFiles.Where ( - pp => pp.Type == ItemType.None && pp.CopyToOutputDirectory != CopyToOutputState.Never)) { - - string clsName = System.IO.Path.GetFileNameWithoutExtension (pi.Path); - if (solution.DefaultTemplates.ContainsKey (clsName)) - continue; - solution.DefaultTemplates[clsName] = pi.AbsolutePath; - } - foreach (ProjectFile pi in tmpFiles.Where (pp => pp.Type == ItemType.EmbeddedResource)) { - string resId = pi.ResourceID; - string clsName = resId.Substring (0, resId.Length - 9); - if (solution.DefaultTemplates.ContainsKey (clsName)) - continue; - solution.DefaultTemplates[clsName] = pi.Path; - } - - foreach (Project p in ReferencedProjects) - p.GetDefaultTemplates (); - } - // void searchTemplatesIn(Assembly assembly){ - // if (assembly == null) - // return; - // foreach (string resId in assembly - // .GetManifestResourceNames () - // .Where (r => r.EndsWith (".template", StringComparison.OrdinalIgnoreCase))) { - // string clsName = resId.Substring (0, resId.Length - 9); - // if (DefaultTemplates.ContainsKey (clsName)) - // continue; - // DefaultTemplates[clsName] = "#" + resId; - // } - // } - - public List ReferencedProjects { - get { - List tmp = new List (); - foreach (ProjectReference pr in flattenNodes.OfType ()) { - Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID); - if (p != null) - tmp.Add (p); - } - return tmp; - } - } - - public void GetStyling () { - try { - foreach (ProjectFile pi in flattenNodes.OfType ().Where (pp => pp.Type == ItemType.EmbeddedResource && pp.Extension == ".style")) { - using (Stream s = new MemoryStream (System.Text.Encoding.UTF8.GetBytes (pi.Source))) { - new StyleReader (solution.Styling, s, pi.ResourceID); - } - } - } catch (Exception ex) { - Console.WriteLine (ex.ToString ()); - } - foreach (ProjectReference pr in flattenNodes.OfType ()) { - Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID); - if (p == null) - throw new Exception ("referenced project not found"); - p.GetStyling (); - } - - //TODO:get styling from referenced assemblies - } - } -} - diff --git a/Samples/CrowIDE/src/ProjectTree/CSProjectFile.cs b/Samples/CrowIDE/src/ProjectTree/CSProjectFile.cs deleted file mode 100644 index 586e2261..00000000 --- a/Samples/CrowIDE/src/ProjectTree/CSProjectFile.cs +++ /dev/null @@ -1,72 +0,0 @@ -// -// ProjectNodes.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; - -namespace Crow.Coding -{ - public class CSProjectFile : ProjectFile - { - CSharpSyntaxTree tree; - - - #region CTOR - public CSProjectFile (ProjectItem pi) : base (pi){ - } - #endregion - - public override void UpdateSource(object sender, string newSrc) - { - base.UpdateSource(sender, newSrc); - - tree = (CSharpSyntaxTree)CSharpSyntaxTree.ParseText (Source, CSharpParseOptions.Default); - } - - public override void Open () { - base.Open (); - - tree = (CSharpSyntaxTree)CSharpSyntaxTree.ParseText (Source, CSharpParseOptions.Default); - - CompilationUnitSyntax root = (CompilationUnitSyntax)tree.GetRoot (); - MemberDeclarationSyntax firstMember = root.Members [0]; - - Console.WriteLine ( firstMember.GetType().FullName); - - SyntaxToken tok = root.GetFirstToken(); - - while (tok.Value != null) { - Console.Write (tok.Text); - tok = tok.GetNextToken (true,true); - } - Console.Out.Flush (); - } - - - } -} - diff --git a/Samples/CrowIDE/src/ProjectTree/ImlProjectItem.cs b/Samples/CrowIDE/src/ProjectTree/ImlProjectItem.cs deleted file mode 100644 index 8487f838..00000000 --- a/Samples/CrowIDE/src/ProjectTree/ImlProjectItem.cs +++ /dev/null @@ -1,89 +0,0 @@ -// -// ProjectNodes.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml; -using System.IO; -using Crow; -using System.Threading; - -namespace Crow.Coding -{ - public class ImlProjectItem : ProjectFile - { - #region CTOR - public ImlProjectItem (ProjectItem pi) : base (pi){ - } - #endregion - - Widget instance; - Measure designWidth, designHeight; - - /// - /// instance created with an instantiator from the source by a DesignInterface, - /// for now, the one in ImlVisualEditor - /// - public Widget Instance { - get { return instance; } - set { - if (instance == value) - return; - instance = value; - NotifyValueChanged ("Instance", instance); - } - } - - public Measure DesignWidth { - get { return designWidth; } - set { - if (designWidth == value) - return; - designWidth = value; - NotifyValueChanged ("DesignWidth", designWidth); - } - } - public Measure DesignHeight { - get { return designHeight; } - set { - if (designHeight == value) - return; - designHeight = value; - NotifyValueChanged ("DesignHeight", designHeight); - } - } - - - public List GraphicTree { - get { return new List (new Widget[] {instance}); } - } - - void GTView_SelectedItemChanged (object sender, SelectionChangeEventArgs e){ - SelectedItem = e.NewValue; - } - } -} - diff --git a/Samples/CrowIDE/src/ProjectTree/ProjectFile.cs b/Samples/CrowIDE/src/ProjectTree/ProjectFile.cs deleted file mode 100644 index 294a28f5..00000000 --- a/Samples/CrowIDE/src/ProjectTree/ProjectFile.cs +++ /dev/null @@ -1,323 +0,0 @@ -// -// ProjectNodes.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Xml; - -namespace Crow.Coding { - public class ProjectFile : ProjectItem { - bool isOpened = false; - DateTime accessTime; - string source; - string origSource; - object selectedItem; - int curLine, curColumn; - - internal ReaderWriterLockSlim srcEditMtx = new ReaderWriterLockSlim(); - - public Dictionary RegisteredEditors = new Dictionary(); - List undoStack = new List(); - List redoStack = new List(); - - public Crow.Command cmdSave, cmdSaveAs, cmdOpen, cmdClose, cmdUndo, cmdRedo; - - void initCommands (){ - cmdSave = new Crow.Command (new Action (() => Save ())) - { Caption = "Save", Icon = new SvgPicture ("#CrowIDE.icons.save.svg"), CanExecute = false }; - cmdSaveAs = new Crow.Command (new Action (() => SaveAs ())) - { Caption = "Save As ..", Icon = new SvgPicture ("#CrowIDE.icons.save.svg"), CanExecute = false }; - cmdOpen = new Crow.Command (new Action (() => Open ())) - { Caption = "Open", Icon = new SvgPicture ("#CrowIDE.icons.open.svg"), CanExecute = true }; - cmdClose = new Crow.Command (new Action (() => OnQueryClose (this,null))) - { Caption = "Close", Icon = new SvgPicture ("#CrowIDE.icons.open.svg"), CanExecute = false }; - cmdUndo = new Crow.Command (new Action (() => Undo (null))) - { Caption = "Undo", Icon = new SvgPicture ("#CrowIDE.icons.undo.svg"), CanExecute = false }; - cmdRedo = new Crow.Command (new Action (() => Redo (null))) - { Caption = "Redo", Icon = new SvgPicture ("#CrowIDE.icons.redo.svg"), CanExecute = false }; - - Commands.Insert (0, cmdOpen); - Commands.Insert (1, cmdSave); - Commands.Insert (2, cmdSaveAs); - Commands.Insert (3, cmdUndo); - Commands.Insert (4, cmdRedo); - Commands.Add (cmdClose); - } - public ProjectFile () { - initCommands(); - } - public ProjectFile (ProjectItem pi) - : base (pi.Project, pi.node) { - initCommands (); - } - - public string ResourceID { - get { - return Type != ItemType.EmbeddedResource ? null : - node.SelectSingleNode ("LogicalName") == null ? - Project.Name + "." + Path.Replace ('/', '.') : - LogicalName; - } - } - public string LogicalName { - get { - 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); - } - } - public void RegisterEditor (object editor) { - lock(RegisteredEditors){ - RegisteredEditors.Add (editor, false); - } - } - public virtual void UpdateSource (object sender, string newSrc){ - System.Diagnostics.Debug.WriteLine ("update source by {0}", sender); - Source = newSrc; - signalOtherRegisteredEditors (sender); - } - public void SignalEditorOfType (){ - lock (RegisteredEditors) { - object[] keys = RegisteredEditors.Keys.ToArray (); - foreach (object ed in keys) { - T editor = (T)ed; - if (editor == null) - continue; - RegisteredEditors [editor] = false; - break; - } - } - } - protected void signalOtherRegisteredEditors (object sender) { - lock (RegisteredEditors) { - object[] keys = RegisteredEditors.Keys.ToArray (); - foreach (object editor in keys) { - if (editor != sender) - RegisteredEditors [editor] = false; - } - } - } - public string Source { - get { - if (!IsOpened) { - using (StreamReader sr = new StreamReader (AbsolutePath)) - source = sr.ReadToEnd (); - - } else { - if (DateTime.Compare ( - accessTime, - System.IO.File.GetLastWriteTime (AbsolutePath)) < 0) - Console.WriteLine ("File has been modified outside CrowIDE"); - } - return source; - } - set { - if (source == value) - return; - - srcEditMtx.EnterWriteLock (); - - undoStack.Add (source); - cmdUndo.CanExecute = true; - redoStack.Clear (); - cmdRedo.CanExecute = false; - source = value; - - NotifyValueChanged ("Source", source); - NotifyValueChanged ("IsDirty", IsDirty); - - cmdSave.CanExecute = cmdSaveAs.CanExecute = IsDirty; - - srcEditMtx.ExitWriteLock (); - } - } - public bool IsDirty { - get { return source != origSource; } - } - public int CurrentColumn{ - get { return curColumn; } - set { - if (curColumn == value) - return; - curColumn = value; - NotifyValueChanged ("CurrentColumn", curColumn); - } - } - public int CurrentLine{ - get { return curLine; } - set { - if (curLine == value) - return; - curLine = value; - NotifyValueChanged ("CurrentLine", curLine); - } - } - - public object SelectedItem { - get { return selectedItem; } - set { - if (selectedItem == value) - return; - selectedItem= value; - Project.solution.SelectedItemElement = value; - NotifyValueChanged ("SelectedItem", selectedItem); - } - } - - public CopyToOutputState CopyToOutputDirectory { - get { - XmlNode xn = node.SelectSingleNode ("CopyToOutputDirectory"); - return xn == null ? CopyToOutputState.Never : - (CopyToOutputState)Enum.Parse (typeof(CopyToOutputState), xn.InnerText, true); - } - } - - public virtual void Open () { - accessTime = System.IO.File.GetLastWriteTime (AbsolutePath); - using (StreamReader sr = new StreamReader (AbsolutePath)) { - source = sr.ReadToEnd (); - } - origSource = source; - IsOpened = true; - NotifyValueChanged ("IsDirty", false); - } - public virtual void Save () { - if (!IsDirty) - return; - using (StreamWriter sw = new StreamWriter (AbsolutePath)) { - sw.Write (source); - } - origSource = source; - NotifyValueChanged ("IsDirty", false); - } - public virtual void SaveAs () { - if (!IsDirty) - return; - using (StreamWriter sw = new StreamWriter (AbsolutePath)) { - sw.Write (source); - } - origSource = source; - NotifyValueChanged ("IsDirty", false); - } - public void Close () { - origSource = source = null; - IsOpened = false; - } - public void Undo(object sender){ - undo(); - signalOtherRegisteredEditors (sender); - } - public void Redo(object sender){ - redo(); - signalOtherRegisteredEditors (sender); - } - - void undo () { - if (undoStack.Count == 0) - return; - - srcEditMtx.EnterWriteLock (); - string step = undoStack [undoStack.Count -1]; - redoStack.Add (source); - cmdRedo.CanExecute = true; - undoStack.RemoveAt(undoStack.Count -1); - - source = step; - - NotifyValueChanged ("Source", source); - NotifyValueChanged ("IsDirty", IsDirty); - cmdSave.CanExecute = IsDirty; - - if (undoStack.Count == 0) - cmdUndo.CanExecute = false; - srcEditMtx.ExitWriteLock (); - } - - void redo () { - if (redoStack.Count == 0) - return; - srcEditMtx.EnterWriteLock (); - string step = redoStack [redoStack.Count -1]; - undoStack.Add (source); - cmdUndo.CanExecute = true; - redoStack.RemoveAt(redoStack.Count -1); - source = step; - NotifyValueChanged ("Source", source); - NotifyValueChanged ("IsDirty", IsDirty); - cmdSave.CanExecute = IsDirty; - - if (redoStack.Count == 0) - cmdRedo.CanExecute = false; - srcEditMtx.ExitWriteLock (); - - } - - 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, - MessageBox.Type.YesNoCancel, $"{DisplayName} has unsaved changes.\nSave it now?"); - mb.Yes += (object _sender, EventArgs _e) => { Save (); Close (); }; - mb.No += (object _sender, EventArgs _e) => Close(); - } else - Close (); - } - } -} - diff --git a/Samples/CrowIDE/src/ProjectTree/ProjectItem.cs b/Samples/CrowIDE/src/ProjectTree/ProjectItem.cs deleted file mode 100644 index afa3e3ed..00000000 --- a/Samples/CrowIDE/src/ProjectTree/ProjectItem.cs +++ /dev/null @@ -1,116 +0,0 @@ -// -// ProjectNodes.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml; -using System.IO; -using Crow; -using System.Threading; - -namespace Crow.Coding -{ - public class ProjectItem : ProjectNode { - #region CTOR - public ProjectItem() {} - public ProjectItem (Project project, XmlNode _node) : base (project){ - node = _node; - } - #endregion - - public XmlNode node; - - public override Picture Icon { - get { - switch (Extension) - { - case ".cs": - return new SvgPicture("#CrowIDE.icons.cs-file.svg"); - case ".crow": - return new SvgPicture("#CrowIDE.icons.xml-file.svg"); - case ".xml": - return new SvgPicture("#CrowIDE.icons.xml-file.svg"); - default: - return base.Icon; - } - } - } - - public string Extension { - get { return System.IO.Path.GetExtension (Path); } - } - public string Path { - get { - return node.Attributes["Include"]?.Value.Replace('\\','/'); - } - } - public string AbsolutePath { - get { - return System.IO.Path.Combine (Project.RootDir, Path); - } - } - public override ItemType Type { - get { - return (ItemType)Enum.Parse (typeof(ItemType), node.Name, true); - } - } - public override string DisplayName { - get { - return Type == ItemType.Reference ? - Path : - Path.Split ('/').LastOrDefault(); - } - } - 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/Samples/CrowIDE/src/ProjectTree/ProjectNodes.cs b/Samples/CrowIDE/src/ProjectTree/ProjectNodes.cs deleted file mode 100644 index bafb9cbd..00000000 --- a/Samples/CrowIDE/src/ProjectTree/ProjectNodes.cs +++ /dev/null @@ -1,159 +0,0 @@ -// -// ProjectNodes.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml; -using System.IO; -using Crow; -using System.Threading; - -namespace Crow.Coding -{ - public enum ItemType { - ReferenceGroup, - Reference, - ProjectReference, - VirtualGroup, - Folder, - None, - Compile, - EmbeddedResource, - } - public enum CopyToOutputState { - Never, - Always, - PreserveNewest - } - public class ProjectNode : IValueChange - { - #region IValueChange implementation - public event EventHandler ValueChanged; - public virtual void NotifyValueChanged(string MemberName, object _value) - { - ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value)); - } - #endregion - - #region CTOR - public ProjectNode (Project project, ItemType _type, string _name) : this(project){ - type = _type; - name = _name; - initCommands (); - } - public ProjectNode (Project project){ - Project = project; - initCommands (); - } - public ProjectNode (){ - initCommands (); - } - #endregion - - void initCommands () { - Commands = new List (); - } - - ProjectNode parent; - bool isExpanded; - protected bool isSelected; - ItemType type; - string name; - List childNodes = new List(); - - public Project Project; - public List Commands;//list of command available for that node - - public virtual 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("#CrowIDE.icons.blank-file.svg"); - } - } - } - public ProjectNode Parent { - get { return parent; } - set { parent = value; } - } - public virtual ItemType Type { - get { return type; } - } - public virtual string DisplayName { - get { return name; } - } - public List ChildNodes { - get { return childNodes; } - } - public void AddChild (ProjectNode pn) { - childNodes.Add(pn); - pn.Parent = this; - } - public void RemoveChild (ProjectNode pn){ - pn.Parent = null; - childNodes.Remove (pn); - } - public void SortChilds () { - foreach (ProjectNode pn in childNodes) - pn.SortChilds (); - childNodes = childNodes.OrderBy(c=>c.Type).ThenBy(cn=>cn.DisplayName).ToList(); - } - - public bool IsExpanded - { - get { return isExpanded; } - set - { - if (value == isExpanded) - return; - isExpanded = value; - 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/Samples/CrowIDE/src/ProjectTree/ProjectReference.cs b/Samples/CrowIDE/src/ProjectTree/ProjectReference.cs deleted file mode 100644 index 84870746..00000000 --- a/Samples/CrowIDE/src/ProjectTree/ProjectReference.cs +++ /dev/null @@ -1,51 +0,0 @@ -// -// ProjectNodes.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml; -using System.IO; -using Crow; -using System.Threading; - -namespace Crow.Coding -{ - public class ProjectReference : ProjectItem { - public ProjectReference (ProjectItem pi) : base (pi.Project, pi.node){ - } - public string ProjectGUID { - get { - return node.SelectSingleNode ("Project")?.InnerText; - } - } - public override string DisplayName { - get { - return node.SelectSingleNode ("Name").InnerText; - } - } - } -} - diff --git a/Samples/CrowIDE/src/ProjectTree/StyleProjectItem.cs b/Samples/CrowIDE/src/ProjectTree/StyleProjectItem.cs deleted file mode 100644 index 1de77cd7..00000000 --- a/Samples/CrowIDE/src/ProjectTree/StyleProjectItem.cs +++ /dev/null @@ -1,50 +0,0 @@ -// -// ProjectNodes.cs -// -// Author: -// Jean-Philippe Bruyère -// -// Copyright (c) 2013-2017 Jean-Philippe Bruyère -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml; -using System.IO; -using Crow; -using System.Threading; - -namespace Crow.Coding -{ - public class StyleProjectItem : ProjectFile - { - #region CTOR - public StyleProjectItem (ProjectItem pi) : base (pi){ - } - #endregion - - public override void UpdateSource (object sender, string newSrc) - { - base.UpdateSource (sender, newSrc); - Project.solution.ReloadStyling (); - } - } -} - diff --git a/Samples/CrowIDE/src/Solution.cs b/Samples/CrowIDE/src/Solution.cs deleted file mode 100644 index c6b1fbc1..00000000 --- a/Samples/CrowIDE/src/Solution.cs +++ /dev/null @@ -1,541 +0,0 @@ -// -// Solution.cs -// -//code taken in project https://sourceforge.net/projects/syncproj/ -// no licence info was included, I took the liberty to modify it. -// Author: -// tarmopikaro -// 2018 Jean-Philippe Bruyère -//MIT-licenced - -using Microsoft.Win32; -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml.Serialization; -using Crow; - -namespace Crow.Coding{ - public class SolutionProject { - public string ProjectHostGuid; - public string ProjectName; - public string RelativePath; - public string ProjectGuid; - } - public class StyleItemContainer { - public object Value; - public string Name; - public StyleItemContainer(string name, object _value){ - Name = name; - Value = _value; - } - } - public class StyleContainer : IValueChange { - #region IValueChange implementation - public event EventHandler ValueChanged; - public virtual void NotifyValueChanged(string MemberName, object _value) - { - ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value)); - } - #endregion - - Style style; - bool isExpanded; - - public string Name; - public List Items; - public bool IsExpanded - { - get { return isExpanded; } - set - { - if (value == isExpanded) - return; - isExpanded = value; - NotifyValueChanged ("IsExpanded", isExpanded); - } - } - public StyleContainer(string name, Style _style){ - Name = name; - style = _style; - - Items = new List (); - foreach (string k in style.Keys) { - Items.Add(new StyleItemContainer(k, style[k])); - } - } - } - - - /// -/// .sln loaded into class. -/// - public class Solution: IValueChange - { - #region IValueChange implementation - public event EventHandler ValueChanged; - public virtual void NotifyValueChanged(string MemberName, object _value) - { - ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value)); - } - #endregion - - ProjectItem selectedItem = null; - object selectedItemElement = null; - ObservableList openedItems = new ObservableList(); - ObservableList toolboxItems; - - public Dictionary Styling; - public Dictionary DefaultTemplates; - - public List