<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
<PackOnBuild>true</PackOnBuild>
<PackageId>Crow</PackageId>
- <PackageVersion>0.8</PackageVersion>
+ <PackageVersion>0.8.0-beta</PackageVersion>
+<!-- <PackageVersionSuffix>-beta</PackageVersionSuffix>not working-->
<Authors>JP Bruyère</Authors>
<Title>C# Rapid Open Widget Toolkit</Title>
<PackageLicenseUrl>https://opensource.org/licenses/MIT</PackageLicenseUrl>
<PackageProjectUrl>https://github.com/jpbruyere/Crow/wiki</PackageProjectUrl>
<PackageTags>Crow Widget Interface GUI C# .Net Mono</PackageTags>
<PackageCopyright>Copyright 2013-2018</PackageCopyright>
+ <PackageReleaseNotes></PackageReleaseNotes>
<Owners>JP Bruyère</Owners>
</PropertyGroup>
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="System.Reflection.Emit.ILGeneration" Version="4.3.0" />
- <PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" />
-
<Compile Include="src\**\*.cs" Exclude="src\Mono.Cairo\NativeMethods-internal.cs" />
<EmbeddedResource Include="Templates\*.*">
<GraphicObject Width="5" Height="5"/>
</HorizontalStack>
</Border>
- <HorizontalStack Margin="5" Width="Stretched">
+ <HorizontalStack Margin="5" >
<Image Name="Image" Width="50" Height="30" Path="{./MsgIcon}" />
- <Label Margin="5" Font="{./Font}" Width="Stretched" Text="{./Message}"
+ <Label Margin="5" Font="{./Font}" Text="{./Message}"
TextAlignment="Center"
Multiline="true" />
</HorizontalStack>
//public Dictionary<string,FileLocation> design_iml_locations = new Dictionary<string, FileLocation>();
public Dictionary<string,FileLocation> design_style_locations = new Dictionary<string, FileLocation>();
- internal void design_add_style_location (string memberName, string path, int line, int col) {
+ internal void design_add_style_location (string memberName, string path, int line, int col) {
if (design_style_locations.ContainsKey(memberName)){
Console.WriteLine ("default value localtion already set for {0}{1}.{2}", this.GetType().Name, this.design_id, memberName);
return;
[XmlIgnore]public virtual Rectangle ClientRectangle {
get {
Rectangle cb = Slot.Size;
- cb.Inflate ( - Margin);
+ cb.Inflate ( - margin);
return cb;
}
}
if (width == value)
return;
if (value.IsFixed) {
- if (value < MinimumSize.Width || (value > MaximumSize.Width && MaximumSize.Width > 0))
+ if (value < minimumSize.Width || (value > maximumSize.Width && maximumSize.Width > 0))
return;
}
Measure old = width;
if (height == value)
return;
if (value.IsFixed) {
- if (value < MinimumSize.Height || (value > MaximumSize.Height && MaximumSize.Height > 0))
+ if (value < minimumSize.Height || (value > maximumSize.Height && maximumSize.Height > 0))
return;
}
Measure old = height;
NotifyValueChanged ("Background", background);
RegisterForRedraw ();
if (background is SolidColor) {
- if ((Background as SolidColor).Equals (Color.Clear))
+ if ((background as SolidColor).Equals (Color.Clear))
clearBackground = true;
}
}
Type thisType = this.GetType ();
- if (!string.IsNullOrEmpty (Style)) {
- if (IFace.DefaultValuesLoader.ContainsKey (Style)) {
- IFace.DefaultValuesLoader [Style] (this);
+ if (!string.IsNullOrEmpty (style)) {
+ if (IFace.DefaultValuesLoader.ContainsKey (style)) {
+ IFace.DefaultValuesLoader [style] (this);
onInitialized (this, null);
return;
}
//2: class name
//3: style may have been registered with their ressource ID minus .style extention
// those files being placed in a Styles folder
- string styleKey = Style;
- if (!string.IsNullOrEmpty (Style)) {
- if (IFace.Styling.ContainsKey (Style)) {
- styling.Add (IFace.Styling [Style]);
+ string styleKey = style;
+ if (!string.IsNullOrEmpty (style)) {
+ if (IFace.Styling.ContainsKey (style)) {
+ styling.Add (IFace.Styling [style]);
}
}
if (IFace.Styling.ContainsKey (thisType.FullName)) {
continue;
object defaultValue;
- string name = "";
- XmlAttributeAttribute xaa = (XmlAttributeAttribute)pi.GetCustomAttribute (typeof(XmlAttributeAttribute));
- if (xaa != null) {
- if (string.IsNullOrEmpty (xaa.AttributeName))
- name = pi.Name;
- else
- name = xaa.AttributeName;
- }else
- name = pi.Name;
-
+
int styleIndex = -1;
if (styling.Count > 0){
for (int i = 0; i < styling.Count; i++) {
- if (styling[i].ContainsKey (name)){
+ if (styling[i].ContainsKey (pi.Name)){
styleIndex = i;
break;
}
}
if (styleIndex >= 0){
if (pi.PropertyType.IsEnum)//maybe should be in parser..
- defaultValue = Enum.Parse(pi.PropertyType, (string)styling[styleIndex] [name], true);
+ defaultValue = Enum.Parse(pi.PropertyType, (string)styling[styleIndex] [pi.Name], true);
else
- defaultValue = styling[styleIndex] [name];
+ defaultValue = styling[styleIndex] [pi.Name];
#if DESIGN_MODE
if (defaultValue != null){
- FileLocation fl = styling[styleIndex].Locations[name];
+ FileLocation fl = styling[styleIndex].Locations[pi.Name];
il.Emit (OpCodes.Ldloc_0);
- il.Emit (OpCodes.Ldstr, name);
+ il.Emit (OpCodes.Ldstr, pi.Name);
il.Emit (OpCodes.Ldstr, fl.FilePath);
il.Emit (OpCodes.Ldc_I4, fl.Line);
il.Emit (OpCodes.Ldc_I4, fl.Column);
il.Emit (OpCodes.Ldloc_0);
il.Emit (OpCodes.Ldfld, typeof(GraphicObject).GetField("design_style_values"));
- il.Emit (OpCodes.Ldstr, name);
+ il.Emit (OpCodes.Ldstr, pi.Name);
il.Emit (OpCodes.Ldstr, defaultValue.ToString());
il.Emit (OpCodes.Call, CompilerServices.miDicStrStrAdd);
}
r.Width -= r.Right - cb.Right;
if (r.Bottom > cb.Bottom)
r.Height -= r.Bottom - cb.Bottom;
- if (CacheEnabled && !IsDirty)
+ if (cacheEnabled && !IsDirty)
Clipping.UnionRectangle (r);
if (Parent == null)
return;
/// <summary> return size of content + margins </summary>
protected virtual int measureRawSize (LayoutingType lt) {
return lt == LayoutingType.Width ?
- contentSize.Width + 2 * Margin: contentSize.Height + 2 * Margin;
+ contentSize.Width + 2 * margin: contentSize.Height + 2 * margin;
}
/// <summary> By default in groups, LayoutingType.ArrangeChildren is reset </summary>
public virtual void ChildrenLayoutingConstraints(ref LayoutingType layoutType){
switch (layoutType) {
case LayoutingType.X:
- if (Left == 0) {
+ if (left == 0) {
if (Parent.RegisteredLayoutings.HasFlag (LayoutingType.Width) ||
RegisteredLayoutings.HasFlag (LayoutingType.Width))
return false;
- switch (HorizontalAlignment) {
+ switch (horizontalAlignment) {
case HorizontalAlignment.Left:
Slot.X = 0;
break;
break;
}
} else
- Slot.X = Left;
+ Slot.X = left;
if (LastSlots.X == Slot.X)
break;
LastSlots.X = Slot.X;
break;
case LayoutingType.Y:
- if (Top == 0) {
+ if (top == 0) {
if (Parent.RegisteredLayoutings.HasFlag (LayoutingType.Height) ||
RegisteredLayoutings.HasFlag (LayoutingType.Height))
return false;
- switch (VerticalAlignment) {
+ switch (verticalAlignment) {
case VerticalAlignment.Top://this could be processed even if parent Height is not known
Slot.Y = 0;
break;
break;
}
} else
- Slot.Y = Top;
+ Slot.Y = top;
if (LastSlots.Y == Slot.Y)
break;
LastSlots.Y = Slot.Y;
break;
case LayoutingType.Width:
- if (Visible) {
+ if (isVisible) {
if (Width.IsFixed)
Slot.Width = Width;
else if (Width == Measure.Fit) {
return false;
//size constrain
- if (Slot.Width < MinimumSize.Width) {
- Slot.Width = MinimumSize.Width;
+ if (Slot.Width < minimumSize.Width) {
+ Slot.Width = minimumSize.Width;
//NotifyValueChanged ("WidthPolicy", Measure.Stretched);
- } else if (Slot.Width > MaximumSize.Width && MaximumSize.Width > 0) {
- Slot.Width = MaximumSize.Width;
+ } else if (Slot.Width > maximumSize.Width && maximumSize.Width > 0) {
+ Slot.Width = maximumSize.Width;
//NotifyValueChanged ("WidthPolicy", Measure.Stretched);
}
} else
LastSlots.Width = Slot.Width;
break;
case LayoutingType.Height:
- if (Visible) {
+ if (isVisible) {
if (Height.IsFixed)
Slot.Height = Height;
else if (Height == Measure.Fit) {
return false;
//size constrain
- if (Slot.Height < MinimumSize.Height) {
- Slot.Height = MinimumSize.Height;
+ if (Slot.Height < minimumSize.Height) {
+ Slot.Height = minimumSize.Height;
//NotifyValueChanged ("HeightPolicy", Measure.Stretched);
- } else if (Slot.Height > MaximumSize.Height && MaximumSize.Height > 0) {
- Slot.Height = MaximumSize.Height;
+ } else if (Slot.Height > maximumSize.Height && maximumSize.Height > 0) {
+ Slot.Height = maximumSize.Height;
//NotifyValueChanged ("HeightPolicy", Measure.Stretched);
}
} else
Rectangle rBack = new Rectangle (Slot.Size);
- Background.SetAsSource (gr, rBack);
+ background.SetAsSource (gr, rBack);
CairoHelpers.CairoRectangle (gr, rBack, cornerRadius);
gr.Fill ();
{
if (parent == null)
return false;
- if (!(Visible & isEnabled)||IsDragged)
+ if (!(isVisible & isEnabled)||IsDragged)
return false;
if (!parent.PointIsIn(ref m))
return false;
}
public virtual bool MouseIsIn(Point m)
{
- return (!(Visible & isEnabled)||IsDragged) ? false : PointIsIn (ref m);
+ return (!(isVisible & isEnabled)||IsDragged) ? false : PointIsIn (ref m);
}
public virtual void checkHoverWidget(MouseMoveEventArgs e)
{
}
public virtual void onMouseMove(object sender, MouseMoveEventArgs e)
{
- if (AllowDrag & HasFocus & e.Mouse.LeftButton == ButtonState.Pressed) {
+ if (allowDrag & hasFocus & e.Mouse.LeftButton == ButtonState.Pressed) {
if (IFace.DragAndDropOperation == null) {
IFace.DragAndDropOperation = new DragDropEventArgs (this);
onStartDrag (this, IFace.DragAndDropOperation);
Debug.WriteLine("MOUSE DOWN => " + this.ToString());
#endif
- if (this.Focusable && !Interface.FocusOnHover) {
+ if (focusable && !Interface.FocusOnHover) {
BubblingMouseButtonEventArg be = e as BubblingMouseButtonEventArg;
if (be.Focused == null) {
be.Focused = this;
IFace.FocusedWidget = this;
- if (e.Button == MouseButton.Right && this.ContextCommands != null)
+ if (e.Button == MouseButton.Right && contextCommands != null)
IFace.ShowContextMenu (this);
}
}
#endregion
protected virtual void onFocused(object sender, EventArgs e){
+ if (IFace.FocusedWidget != this)
+ IFace.FocusedWidget = this;
#if DEBUG_FOCUS
Debug.WriteLine("Focused => " + this.ToString());
#endif
childrenRWLock.EnterReadLock ();
- foreach (GraphicObject g in Children) {
- g.Paint (ref gr);
- }
+ for (int i = 0; i < Children.Count; i++)
+ Children[i].Paint (ref gr);
childrenRWLock.ExitReadLock ();
gr.Restore ();
cachedTextSize.Height = (int)Math.Ceiling ((fe.Ascent+fe.Descent) * Math.Max (1, lines.Count)) + Margin * 2;
try {
- foreach (string s in lines) {
- string l = s.Replace ("\t", new String (' ', Interface.TabSize));
+ for (int i = 0; i < lines.Count; i++) {
+ string l = lines[i].Replace ("\t", new String (' ', Interface.TabSize));
TextExtents tmp = gr.TextExtents (l);
} else {
using (Stream stream = iface.GetStreamFromPath (itemTemplatePath)) {
//itemtemplate files may have multiple root nodes
+ if (stream == null)
+ Debugger.Break ();
XmlReaderSettings itrSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
using (XmlReader itr = XmlReader.Create (stream, itrSettings)) {
while (itr.Read ()) {
gotoItemsContainerNotFound = il.DefineLabel ();
il.Emit (OpCodes.Ldarg_1);//load sender of expand event
+ //TODO:double check if items container could be known when expand del is created
+ //to avoid a find by name
il.Emit(OpCodes.Ldstr, "ItemsContainer");//load name to find
il.Emit (OpCodes.Callvirt, CompilerServices.miFindByName);
il.Emit (OpCodes.Stloc_0);//save items container as loc0
}
miGetDatas = piDatas.GetGetMethod ();
if (miGetDatas == null)
- throw new Exception ("Read only property for fetching data in ItemTemplate: " + fetchMethodName);
+ throw new Exception ("Write only property for fetching data in ItemTemplate: " + fetchMethodName);
}
il.Emit (OpCodes.Callvirt, miGetDatas);
public string FilePath;
public int Line;
public int Column;
+ public int Length;
- public FileLocation(string filePath, int line, int column){
+ public FileLocation(string filePath, int line, int column, int length = 0){
FilePath = filePath;
Line = line;
Column = column;
+ Length = length;
}
public override string ToString ()
{
continue;
styling [tc] [currentProperty] = token;
#if DESIGN_MODE
- styling [tc].Locations[currentProperty] = new FileLocation(resId, line,column);
+ styling [tc].Locations[currentProperty] = new FileLocation(resId, line, column - token.Length - 1, token.Length);
#endif
//System.Diagnostics.Debug.WriteLine ("Style: {3} : {0}.{1} = {2}", tc, currentProperty, token, resId);
}
public override GraphicObject Load (string path)
{
ProjectFile pi;
- try {
-
- if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi))
- return CreateITorFromIMLFragment (pi.Source).CreateInstance();
- } catch (Exception ex) {
-
- }
+
+ if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi))
+ return CreateITorFromIMLFragment (pi.Source).CreateInstance();
return null;
}
if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi)) {
return new FileStream (pi.AbsolutePath, FileMode.Open);
}
-
- Console.WriteLine ("File not found: {0}", path);
- return null;
+ throw new Exception ($"In Design File not found: {path}");
}
public override bool ProcessMouseMove (int x, int y)
{
}
public override void onMouseDown (object sender, MouseButtonEventArgs e)
{
- if (!this.Focusable)
+ if (!Focusable)
return;
base.onMouseDown (sender, e);
RegisterForRedraw ();
}
}
- [XmlAttributeAttribute]public GraphicObject SelectedItem {
+ public GraphicObject SelectedItem {
get { return selectedItem; }
set {
if (selectedItem == value)
}
switch (cl.Tokens [tokPtr].Type) {
+ case TokenType.BlockCommentStart:
case TokenType.OpenBlock:
currentNode = addChildNode (currentNode, cl, tokPtr);
break;
- case TokenType.CloseBlock:
+ case TokenType.CloseBlock:
+ case TokenType.BlockCommentEnd:
closeNodeAndGoUp (ref currentNode, cl);
break;
case TokenType.Preprocessor:
}
ptrLine++;
}
- ptrLine = 0;
+ /*ptrLine = 0;
while (ptrLine < buffer.LineCount) {
CodeLine cl = buffer [ptrLine];
if (cl.IsFoldable) {
cl.IsFolded = true;
}
ptrLine++;
- }
+ }*/
}
}
}
{
Debug.WriteLine("\t\tSourceEditor updateEditorFromProjFile");
- buffer.editMutex.EnterWriteLock ();
+ //buffer.editMutex.EnterWriteLock ();
loadSource ();
- buffer.editMutex.ExitWriteLock ();
+ //buffer.editMutex.ExitWriteLock ();
isDirty = false;
oldSource = projFile.Source;
mgFg = Color.White;
else
mgFg = Color.LightGrey;
- }else if (buffer.CurrentLine == lineIndex) {
+ }else if (buffer.CurrentLine == lineIndex && HasFocus) {
mgFg = Color.Black;
mgBg = Color.DarkGrey;
}
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);
//Dictionary<string,PropertyContainer[]> propContainersCache = new Dictionary<string, PropertyContainer[]>();
Dictionary<string,List<CategoryContainer>> categoryContainersCache = new Dictionary<string,List<CategoryContainer>> ();
- [XmlAttributeAttribute][DefaultValue(null)]
+ [DefaultValue(null)]
public virtual object Instance {
get { return instance; }
set {
public Fill LabForeground {
- get { return IsSetByIML ? Color.DarkBlue : HasStyling ? Color.Black : Color.DimGrey;}
+ get { return IsSetByIML ? Color.DarkBlue : HasStyling ? Color.Black : Color.Grey;}
}
/// <summary>
ProjectFile pf;
if (!mview.ProjectNode.Project.TryGetProjectFileFromPath ("#" + fl.FilePath, out pf))
return;
- Solution s = mview.ProjectNode.Project.solution;
- if (!s.OpenedItems.Contains (pf))
- s.OpenedItems.AddElement (pf);
- Debug.WriteLine (fl);
+
+ if (!pf.IsOpened)
+ pf.Open ();
+
pf.CurrentLine = fl.Line;
pf.CurrentColumn = fl.Column;
+
+ pf.IsSelected = true;
+
}
public override string ToString ()
if (IsDirty) {
MessageBox mb = MessageBox.ShowModal (CrowIDE.MainIFace,
MessageBox.Type.YesNoCancel, $"{DisplayName} has unsaved changes.\nSave it now?");
- mb.Yes += onClickSaveAndCloseNow;
- mb.No += onClickCloseNow;
+ mb.Yes += (object _sender, EventArgs _e) => { Save (); Close (); };
+ mb.No += (object _sender, EventArgs _e) => Close();
} else
Close ();
}
-
- void onClickCloseNow (object sender, EventArgs e)
- {
- Close ();
- }
- void onClickSaveAndCloseNow (object sender, EventArgs e)
- {
- Save ();
- Close ();
- }
}
}
public override Picture Icon {
get {
- Console.WriteLine("extension="+Extension);
-
switch (Extension)
{
case ".cs":
return new SvgPicture("#icons.cs-file.svg");
- case ".crow":
- Console.WriteLine("loading icons.xml-file");
+ case ".crow":
return new SvgPicture("#icons.xml-file.svg");
case ".xml":
return new SvgPicture("#icons.xml-file.svg");
<ItemTemplate Path="#Crow.Coding.ui.editors.SrcEdit.itemp" DataType=".cs"/>
<ItemTemplate Path="#Crow.Coding.ui.editors.SrcEdit.itemp" DataType=".style"/>
<ItemTemplate Path="#Crow.Coding.ui.editors.IMLEdit.itemp" DataType=".crow"/>
+<ItemTemplate Path="#Crow.Coding.ui.editors.IMLEdit.itemp" DataType=".itemp"/>
<ItemTemplate Path="#Crow.Coding.ui.editors.IMLEdit.itemp" DataType=".template"/>
<ItemTemplate DataType=".goml">
<TabItem Caption="{DisplayName}" QueryClose="OnQueryClose">
<?xml version="1.0" encoding="UTF-8" ?>
<TabItem QueryClose="OnQueryClose" IsSelected="{²IsSelected}" Template="#Crow.Coding.EditTabItem.template">
-
<VerticalStack>
<VerticalStack Height="60%">
<Label DataSource="{../editor.HoverWidget}" Width="Stretched" Margin="2" Text="{Name}"/>
VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"
ContextCommands="{/Commands}"
AllowDrop="true" AllowDrag="true" Focusable="true"
- UpdateEnabled="{../../../../../../IsSelected}"
+ UpdateEnabled="{IsSelected}"
ProjectNode="{}" SelectedItem="{²SelectedItem}"/>
</Scroller>
<ScrollBar Name="scrollbar1" Orientation="Vertical"
<?xml version="1.0" encoding="UTF-8" ?>
<VerticalStack>
<HorizontalStack >
- <SourceEditor Focusable="true" Name="editor" Font="monospace, 12" VerticalAlignment="Top" Margin="10"
- CurrentLine="{²CurrentLine}" CurrentColumn="{²CurrentColumn}"
+ <SourceEditor Focusable="true" Name="editor" Font="monospace, 12" VerticalAlignment="Top" Margin="2"
+ CurrentLine="{²CurrentLine}" CurrentColumn="{²CurrentColumn}" HasFocus="{IsSelected}"
Foreground="Jet" Background="White" Width="Stretched" Height="Stretched"
ProjectNode="{}" KeyDown="textView_KeyDown"/>
<ScrollBar Name="scrollbarY" Value="{²../editor.ScrollY}"
<?xml version="1.0" encoding="UTF-8" ?>
-<TabItem Caption="{DisplayName}" QueryClose="OnQueryClose" Template="#Crow.Coding.EditTabItem.template">
+<TabItem QueryClose="OnQueryClose" IsSelected="{²IsSelected}" Template="#Crow.Coding.EditTabItem.template">
<IMLContainer Path="#Crow.Coding.ui.editors.SourceEditor.crow"/>
</TabItem>
\ No newline at end of file