private void GetNextTag(out GUTag oldCurrentTag, out GUTag newCurrentTag) { oldCurrentTag = SelectedTag; List <GUTag> parents = TagDB.QueryTagParent(oldCurrentTag); //当前节点删除了,找到一个合适的节点作为删除后的新的当前节点 newCurrentTag = NavigateTagBox(Key.Left); if (parents.Count == 1) { int i = parents[0].GetChildPos(oldCurrentTag); newCurrentTag = null; if (parents[0].Children.Count > 1) { if (i >= parents[0].Children.Count - 1)//当前节点是所在父节点的最后一个节点 { newCurrentTag = TagDB.GetTag(parents[0].Children[i - 1]); } else //i < count - 1 == 》 i<=count-2 { newCurrentTag = TagDB.GetTag(parents[0].Children[i + 1]); } } if (newCurrentTag == null) { newCurrentTag = parents[0]; } } if (newCurrentTag == null) { newCurrentTag = TagDB.GetTag(StaticCfg.Ins.DefaultTagID); } }
public void ITagDB_Test_Reopen()//关闭后重新打开 { GUTag p1 = db.NewTag("p1"); GUTag c1 = db.NewTag("c1"); db.SetParent(p1, c1); List <string> alias = db.QueryTagAlias(p1); foreach (string a in alias) { Logger.D(a); } Assert.AreEqual(1, alias.Count); Assert.AreEqual("p1", alias[0]); Logger.D("end test reopen"); IDisposableFactory.DisposeAll(); db = null; db = TagDBFactory.CreateTagDB("sql"); List <GUTag> p1new = db.QueryTags("p1"); alias = db.QueryTagAlias(p1new[0]); Assert.AreEqual(1, alias.Count); Assert.AreEqual("p1", alias[0]); }
} // GConfig.InnerBoxYPadding_MAX; //私有成员变量************************************************************ //公有成员方法************************************************************ public TagBoxSizeInf(GUTag tag, int dis, string fname) { Tag = tag; Distance = dis; PreCalcBoxSize(); CalcBoxSize(fname); }
public void Add(GUTag tag, GTagBoxTree obj) { if (null == Get(tag)) { all.Add(tag, obj); } }
public Size Calc(GUTag gutag, double fsize, string fname) { Size tmp; string tag = gutag.Title; if (cache[tag] == null) { //cache内容过多,直接将所有数据全部老化。 if (cache.Keys.Count > 2000) { cache.Clear(); } FormattedText formattedText = new FormattedText( tag, System.Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, new Typeface(fname), StaticCfg.Ins.FontSize, Brushes.Black ); tmp = new Size(formattedText.WidthIncludingTrailingWhitespace, formattedText.Height); cache.Add(tag, tmp); } tmp = (Size)cache[tag]; tmp.Width = tmp.Width * fsize / StaticCfg.Ins.FontSize + StaticCfg.Ins.XContentPadding; tmp.Height = tmp.Height * fsize / StaticCfg.Ins.FontSize + StaticCfg.Ins.YContentPadding; return(tmp); }
public void DelSqlDBTest() { Guid id = Guid.NewGuid(), pid = Guid.NewGuid(), cid = Guid.NewGuid(); GUTag tag = new GUTag(); tag.Id = id; tag.PId = pid; tag.AddAlias("TITLE"); tag.AddAlias("Alias"); tag.AddChild(cid); db.AddUptSqlDB(tag); GUTag tag2 = db.QuerySqlDB(id); Assert.IsNotNull(tag2); Assert.AreEqual(tag2.Id, tag.Id); Assert.AreEqual(tag2.PId, tag.PId); Assert.AreEqual(tag2.Title, tag.Title); CheckListEqual(tag2.Children, tag.Children); CheckListEqual(tag2.Alias, tag.Alias); db.DelSqlDB(tag); Assert.IsNull(db.QuerySqlDB(id)); }
private void test_Click(object sender, RoutedEventArgs e) { if (MessageBox.Show("开始20次show根节点", "测试", MessageBoxButton.OKCancel) == MessageBoxResult.OK) { DateTime t1 = DateTime.Now; for (int i = 0; i < 20; i++) { GUTag tag = GUTag.Parse(StaticCfg.Ins.DefaultTagID.ToString(), tagDB); ShowTagGraph(tag, tag); } DateTime t2 = DateTime.Now; MessageBox.Show("总共耗时:" + (t2 - t1).TotalSeconds + TreeLayoutEnv.StatInf); } else { string dir = @"E:\testall\testgitee"; string git = @"https://gitee.com/kummerwu/testlibgit2sharp.git"; GitHelper h = new GitHelper(); h.Connect(git, dir); //h.Clone(); //File.WriteAllText(Path.Combine(dir, "test.txt"),DateTime.Now.ToLongDateString()+DateTime.Now.ToLongTimeString()); h.Pull(); } }
public void ITagDB_Test_AliasAddAndQuery2() { GUTag p1 = db.NewTag("p1"); GUTag p2 = db.NewTag("p2"); GUTag c1 = db.NewTag("c1"); GUTag c2 = db.NewTag("c2"); db.SetParent(p1, c1); db.SetParent(p2, c2); db.MergeAlias(p1, p2); List <string> alias = db.QueryTagAlias(p1); Assert.AreEqual(2, alias.Count); Assert.AreEqual(true, alias.Contains("p1")); Assert.AreEqual(true, alias.Contains("p2")); alias = db.QueryTagAlias(p2); Assert.AreEqual(0, alias.Count); //Assert.AreEqual(true, alias.Contains("p1")); //Assert.AreEqual(true, alias.Contains("p2")); List <GUTag> child = db.QueryTagChildren(p1); Assert.AreEqual(2, child.Count); Assert.AreEqual(true, child.Contains(c1)); Assert.AreEqual(true, child.Contains(c2)); child = db.QueryTagChildren(p2); Assert.AreEqual(0, child.Count); //Assert.AreEqual(true, child.Contains("c1")); //Assert.AreEqual(true, child.Contains("c2")); }
public void ITagDB_Test_SetRelation4() //添加不存在的节点 { GUTag P1 = db.NewTag("P1"); GUTag P2 = db.NewTag("P2"); GUTag P3 = db.NewTag("P3"); GUTag C1 = db.NewTag("C1"); GUTag C2 = db.NewTag("C2"); db.SetParent(P1, C1); db.SetParent(P2, C1); db.SetParent(P3, C2); List <GUTag> parents = db.QueryTagParent(C1); AssertListEqual(new List <string>() { "P1", "P2" }, parents); db.ResetParent(P3, C1); parents = db.QueryTagParent(C1); AssertListEqual(new List <string>() { "P3" }, parents); }
private string GetTagInf(GUTag tag, ITagDB db) { StringBuilder sb = new StringBuilder(); sb.Append("当前选中标签:" + tag); List <GUTag> parents = db.QueryTagParent(tag); if (parents.Count > 0) { sb.Append(" Parent::= "); foreach (GUTag s in parents) { sb.Append(" " + s.Title); } } List <GUTag> children = TagDB.QueryTagChildren(tag); if (children.Count > 0) { sb.Append(" Children::= "); foreach (GUTag s in children) { sb.Append(" " + s.Title); } } return(sb.ToString().Trim()); }
public void miPasteFile_Click(object sender, RoutedEventArgs e) { UpdateCurrentTagByContextMenu(); string[] token = Clipboard.GetText().Split(new char[] { ClipboardConst.CommandSplitToken }, StringSplitOptions.RemoveEmptyEntries); if (token.Length == 2) { string arg = token[1]; string[] args = arg.Split(new char[] { ClipboardConst.ArgsSplitToken }, StringSplitOptions.RemoveEmptyEntries); switch (token[0]) { case ClipboardConst.KUMMERWU_TAG_COPY: { GUTag argTag = TagDB.GetTag(Guid.Parse(arg)); if (argTag != null) { TagDB.SetParent(SelectedTag, argTag); RedrawGraph(); } } break; case ClipboardConst.KUMMERWU_TAG_CUT: { GUTag argTag = TagDB.GetTag(Guid.Parse(arg)); if (argTag != null) { TagDB.ResetParent(SelectedTag, argTag); RedrawGraph(); } } break; case ClipboardConst.KUMMERWU_URI_CUT: MoveUris(args); break; case ClipboardConst.KUMMERWU_URI_COPY: UriDB.AddUris(args, new List <string>() { SelectedTag.Title }); //foreach (string uri in args) //{ // UriDB.AddUri(uri, new List<string>() { currentTag }); //} break; default: PasteFiles(); break; } } else { PasteFiles(); } }
private static int GetTagTreeWidth(GUTag tag, ITagDB db, int level, int maxlevel) { int ret = -1; List <GUTag> children = db.QueryTagChildren(tag); if (level > maxlevel) { ret = 1; } else if (level == maxlevel) { ret = children.Count + 1; //所有子节点+自己 } //只有两种情况下不需要换行: //1. 父节点 -- 子, 孙,重孙 //2. 父节点 -- 子,子,子,子 else if (children.Count <= 1) //情况1: { //只有一列子孙节点,所有都是独生子 ret = 1; GUTag tmp = tag; for (int i = level; i < maxlevel; i++) { children = db.QueryTagChildren(tmp); if (children.Count > 1) { ret = -1; break; } else if (children.Count == 0) { ret++; break; } else if (children.Count == 1) { tmp = children[0]; ret++; } } return(ret); } else { //情况2:只有一层子节点,所有子节点都是叶子(显示为子,子,子,子) ret = children.Count; foreach (GUTag ctag in children) { if (db.QueryChildrenCount(ctag) > 0) //有子节点非叶子,并且自己子节点数量>1,表示不能在一行内显示 { ret = -1; } } } Logger.D("GetTagTreeWidth : {0} {1}", tag.ToString(), ret); return(ret); }
public void Add(GUTag tag, GTagBoxTree obj) { //if (null == Get(tag)) //{ // all.Add(tag, obj); //} all.Add(obj); }
public override void Layout(ITagDB db, GUTag tag, Size size, TreeLayoutEnv env) { oriSize = size; env.Reset(); tags = new List <TagBox>(); this.db = db; root = GTagBoxTree.ExpandNode(tag, 0, db, 0, 0, 1, oriSize, env, myLayoutMode); tags = env.GetAllTagBox(); lines = env.GetAllLines().Cast <UIElement>(); }
private void ShowRootPath() { //如果配置不需要显示,则直接返回 if (!NeedShowRootPath()) { return; } if (RootTag == null) { return; } connectCanvas.Children.Clear(); //需要显示从全局根到当前视图根节点之间的路径 //查找出所有从当前视图根节点到全局根节点之间的中间节点 List <GUTag> connect = new List <GUTag>(); GUTag from = RootTag; GUTag tmp = from; connect.Add(from); while (connect.Count < 20 && tmp != null) { List <GUTag> ps = TagDB.QueryTagParent(tmp); if (ps.Count > 0) { tmp = ps[0]; connect.Add(tmp); } else { break; } } connect.Reverse(); //显示所有中间节点 double X = 0; foreach (GUTag u in connect) { GTagBox gt = new GTagBox(5, u, X, 0, 1); TagBox tx = UIElementFactory.CreateTagBox(gt, null); tx.HideCircle(); X += gt.OutterBox.Width; if (tx.ContextMenu == null) { tx.ContextMenu = TagAreaMenu; tx.MouseLeftButtonDown += Tag_MouseLeftButtonDown; tx.MouseDoubleClick += Tag_MouseDoubleClick; } connectCanvas.Children.Add(tx); } }
private void SaveRootTag(GUTag rootTag) { if (MyCanvasType == LayoutCanvas.MAIN_CANVAS) { DynamicCfg.Ins.MainCanvasRoot = (rootTag.ToString()); } else { DynamicCfg.Ins.SubCanvasRoot = (rootTag.ToString()); } }
public void SelectedTagChanged_Callback(GUTag tag) { SearchBox.Text = tag.Title; //现在自己的这个richtextbox非常不好用,将其暂时废除,除非有一个好用的再说 string uri = CfgPath.GetFileByTag(tag.Title, "note.rtf"); //uri可能不存在 richTxt.Load(uri); ShowUrlListByText(); //修改text后,会自动触发 TextBox_TextChanged //进一步触发 ShowUrlListByText }
public TagBox ChangeSelectd(GUTag tag) { DbgShowTagBox(); TagBox target = FindTagBox(tag); if (target != null) { SetCurrentTag(tag); } return(target); }
public void ITagDB_Test_AddBase()//简单添加 { GUTag p = db.NewTag("p"); GUTag c1 = db.NewTag("c1"); db.SetParent(p, c1); List <GUTag> c = db.QueryTagChildren(p); Assert.AreEqual(1, c.Count); Assert.AreEqual("c1", c[0].Title); }
public void ChangeRoot(GUTag root, GUTag sub, GUTag subsel) { if (root != null) { MainCanvas.ChangeRoot(root, sub); } if (sub != null) { MainCanvas.ClearSelected(); SubCanvas.ChangeRoot(sub, subsel); } }
private void TagEdit_TitleChanged(Canvas Parent, GUTag tag, string NewString) { if (canvas == Parent && tag != null && NewString != null) { tag = TagDB.ChangeTitle(tag, NewString); if (tag != null) { RedrawGraph(); SetCurrentTag(tag, true); } } }
public void emty() { Guid id = Guid.NewGuid(), pid = Guid.NewGuid(), cid = Guid.NewGuid(); GUTag tag = new GUTag(); tag.Id = id; tag.PId = pid; tag.AddAlias("TITLE"); tag.AddAlias("Alias"); tag.AddChild(cid); db.AddUptSqlDB(tag); }
private bool Match(TagBox t, AutoCompleteTipsItem aItem) { GUTag tag = aItem.Data as GUTag; if (tag != null) { return(tag == t.GUTag); } else { return(t.Text == aItem.Content); } }
private void ComplateEdit() { if (!IsVisible) { return; } //合法性检查 string err = CfgPath.CheckTagFormat(Edit.Text); if (err != null) { MessageBox.Show(err, "标签不合法,请重新输入", MessageBoxButton.OK, MessageBoxImage.Error); return; } //第一步,先将编辑器隐藏起来,否则后面有TextChangedCallback导致业务流程处理后, //会有很多意想不到的流程发生,导致多次递归调用本函数(HideEdit)。 //比如:HideEdit=>lostfocus=>HideEdit GUTag tag = NoEdit.GUTag; string oldTitle = NoEdit.Text; string newTitle = Edit.Text; Canvas parentBak = Parent; //将这两个置空,表示该编辑器不可见了(IsVisible = false)。 Parent = null; NoEdit = null; try { //隐藏编辑框 parentBak.Children.Remove(Edit); System.Diagnostics.Debug.WriteLine("HideFloat1"); //如果文本内容发生修改,通知观察者 if (oldTitle != newTitle && oldTitle != null && newTitle != null) { TextChangedCallback?.Invoke(parentBak, tag, newTitle); System.Diagnostics.Debug.WriteLine("HideFloat2"); } } finally { parentBak?.Focus(); //因为编辑框失去焦点时会有相应的处理,所以这儿设置焦点的处理必须放在所有处理完成之后 //否则可能形成递归调用 } }
//当根节点或选中节点变化时,需要保存下来,以便程序重启后能恢复重启前的状态 public void ChangeRoot(GUTag aRoot, GUTag aSelect) { if (aRoot != null) { SaveRootTag(aRoot); } else { aRoot = LoadRootTag(); } RootTag = aRoot; SetCurrentTag(aSelect == null ? aRoot : aSelect); RedrawGraph(); ShowRootPath(); }
public void SearchByTxt(AutoCompleteTipsItem aItem) { //先在main中查找,如果有,切换焦点后返回 if (MainCanvas.ChangeSelectedByTxt(aItem) != null) { return; } //再在sub中查找,如果有,切换焦点后返回 if (SubCanvas.ChangeSelectedByTxt(aItem) != null) { MainCanvas.ClearSelected(); return; } //如果item精确对应到一个GUTag,直接使用该GUTag GUTag tag = aItem.Data as GUTag; if (tag == null) { List <GUTag> tags = TagDB.QueryTags(aItem.Content); if (tags.Count > 0) { tag = tags[0]; } } //如果不在视图中,但数据库中存在,TODO:如何有效的切换??是一个需要考虑的问题 if (tag != null) { GUTag mainRoot = TagDB.GetTag(StaticCfg.Ins.DefaultTagID); GUTag subRoot = mainRoot; GUTag subSel = subRoot; List <GUTag> parents = QueryParentHistory(tag); int cnt = parents.Count; if (cnt > 0) { subSel = parents[0]; subRoot = parents[Math.Min(3, cnt - 1)]; mainRoot = parents[Math.Min(6, cnt - 1)]; } ChangeRoot(mainRoot, subRoot, subSel); } //不存在精确匹配的tag else { } }
public void ITagDB_Test_AddDel()//添加后删除 { GUTag p = db.NewTag("p"); GUTag c1 = db.NewTag("c1"); db.SetParent(p, c1); List <string> a = db.QueryTagAlias(p); Assert.AreEqual(1, a.Count); Assert.AreEqual("p", a[0]); db.RemoveTag(p); a = db.QueryTagAlias(p); Assert.AreEqual(0, a.Count); }
private void UpdateSelectedStatus(GUTag tag, TagBox.Status stat) { foreach (UIElement u in allTagBox) { TagBox tb = u as TagBox; if (tb != null) { tb.Stat = TagBox.Status.None; if (tb.GUTag == tag) { tb.Stat = stat; } } } }
private TagBox FindTagBox(GUTag tag) { foreach (UIElement u in allTagBox)//此处不能在Canvas.Children中查找,因为为了性能做了特殊优化,一些不可见的tagbox仍然存在于Canvas.Children中。 { TagBox t = u as TagBox; if (t != null) { if (t.GUTag == tag) { Logger.D("FindTagBox:{0} - POS:{1}-{2}", tag, t.Margin.Left, t.Margin.Top); return(t); } } } return(null); }
public void ITagDB_Test_AliasAddAndQuery() { GUTag p1 = db.NewTag("p1"); GUTag p2 = db.NewTag("p2"); db.MergeAlias(p1, p2); List <string> alias = db.QueryTagAlias(p1); Assert.AreEqual(2, alias.Count); Assert.AreEqual(true, alias.Contains("p1")); Assert.AreEqual(true, alias.Contains("p2")); alias = db.QueryTagAlias(p2); Assert.AreEqual(0, alias.Count); //Assert.AreEqual(true, alias.Contains("p1")); //Assert.AreEqual(true, alias.Contains("p2")); }