BioCore  5.0.0
A Windows .NET microscopy library and application for viewing, editing, and annotating images.
Loading...
Searching...
No Matches
NodeView.cs
Go to the documentation of this file.
1namespace BioCore
2{
3 public partial class NodeView : Form
4 {
5 public class Node
6 {
7 public TreeNode node;
8 /* An enum. */
9 public enum DataType
10 {
11 image,
12 buf,
13 roi,
14 text
15 }
16 private DataType type;
18 {
19 get { return type; }
20 set { type = value; }
21 }
22 private object obj;
23 public object Object
24 {
25 get { return obj; }
26 set { obj = value; }
27 }
28 /* A constructor. */
29 public Node(object data, DataType typ)
30 {
31 type = typ;
32 obj = data;
33 node = new TreeNode();
34 node.Tag = this;
35 node.Text = obj.ToString();
36 node.ForeColor = Color.White;
37 }
38 public string Text
39 {
40 get { return node.Text; }
41 set { node.Text = value; }
42 }
43 }
44 /* A constructor. */
45 public NodeView(string[] args)
46 {
47 InitializeComponent();
48 //Let's make sure the directories we need for startup exist.
49 Console.WriteLine("Reading start up folders.");
50 string st = System.IO.Path.GetDirectoryName(Environment.ProcessPath);
51 System.IO.Directory.CreateDirectory(st + "/Scripts");
52 System.IO.Directory.CreateDirectory(st + "/Functions");
53 System.IO.Directory.CreateDirectory(st + "/Tools");
54 Init();
55 InitNodes();
56 App.nodeView = this;
57 Shown += async (sender, e) =>
58 {
59 foreach (string file in args)
60 await OpenImageAsync(file);
61 };
62 Show();
63 }
64
65 private static void Init()
66 {
67 if(!App.Initialized)
69 Filters.Init();
70 }
72 public void UpdateOverlay()
73 {
74 if (App.viewer != null)
76 }
80 public void InitNodes()
81 {
82 treeView.Nodes.Clear();
83 TreeNode images = new TreeNode();
84 images.Text = "BioImages";
85 images.ForeColor = Color.White;
86 foreach (BioImage item in Images.images)
87 {
88 //TreeNode node = new TreeNode();
89 Node tree = new Node(item, Node.DataType.image);
90
91 Node implanes = new Node(item, Node.DataType.text);
92 implanes.Text = "Planes";
93
94 foreach (Bitmap buf in item.Buffers)
95 {
96 Node plane = new Node(buf, Node.DataType.buf);
97 plane.Text = buf.ID + ", " + buf.Coordinate.ToString();
98
99 implanes.node.Nodes.Add(plane.node);
100 }
101 tree.node.Nodes.Add(implanes.node);
102
103 Node rois = new Node(item, Node.DataType.text);
104 rois.Text = "ROI";
105
106 foreach (ROI an in item.Annotations)
107 {
108 Node roi = new Node(an, Node.DataType.roi);
109 rois.node.Nodes.Add(roi.node);
110 }
111 tree.node.Nodes.Add(rois.node);
112 images.Nodes.Add(tree.node);
113 }
114 treeView.Nodes.Add(images);
115 }
116
122 public void UpdateNodes()
123 {
124 if (Images.images.Count != treeView.Nodes[0].Nodes.Count)
125 {
126 //If image count is not same as node count we refresh whole tree.
127 InitNodes();
128 return;
129 }
130 TreeNode images = treeView.Nodes[0];
131 foreach (TreeNode item in images.Nodes)
132 {
133 //TreeNode node = new TreeNode();
134 Node node = (Node)item.Tag;
135 BioImage im = (BioImage)node.Object;
136
137 TreeNode rois = node.node.Nodes[1];
138 if (im.Annotations.Count != rois.Nodes.Count)
139 {
140 //If ROI count is not same as node count we refresh annotations.
141 rois.Nodes.Clear();
142 foreach (ROI an in im.Annotations)
143 {
144 Node roi = new Node(an, Node.DataType.roi);
145 rois.Nodes.Add(roi.node);
146 }
147 }
148 else
149 for (int i = 0; i < im.Annotations.Count; i++)
150 {
151 TreeNode roi = rois.Nodes[i];
152 Node n = (Node)roi.Tag;
153 ROI an = (ROI)n.Object;
154 roi.Text = an.ToString();
155 }
156 }
157 }
158
160 public void Exit()
161 {
162 this.Close();
163 Application.Exit();
164 Application.ExitThread();
165 }
166
171 private void MainForm_Activated(object sender, EventArgs e)
172 {
173 UpdateNodes();
174 }
175
182 private async void openToolStripMenuItem_Click(object sender, EventArgs e)
183 {
184 if (openFilesDialog.ShowDialog() != DialogResult.OK)
185 return;
186 foreach (string file in openFilesDialog.FileNames)
187 await OpenImageAsync(file);
188 }
189
190 private async Task OpenImageAsync(string file)
191 {
192 try
193 {
194 BioImage image = await BioImage.OpenFile(file);
195 if (image == null)
196 throw new InvalidOperationException("The image loader returned no image.");
197 if (App.tabsView == null || App.tabsView.IsDisposed)
198 App.tabsView = new TabsView();
199 App.tabsView.AddTab(image);
200 UpdateNodes();
201 }
202 catch (Exception ex)
203 {
204 MessageBox.Show(this, $"Could not open '{file}'.\n{ex.Message}",
205 "Open Image", MessageBoxButtons.OK, MessageBoxIcon.Error);
206 }
207 }
212 private void refreshToolStripMenuItem_Click_1(object sender, EventArgs e)
213 {
214 InitNodes();
215 }
216
221 private void newToolStripMenuItem_Click(object sender, EventArgs e)
222 {
223 TabsView iv = new TabsView();
224 iv.Show();
225 }
226
231 private void treeView_AfterSelect(object sender, TreeViewEventArgs e)
232 {
233
234 }
235
240 private void scriptRunnerToolStripMenuItem_Click_1(object sender, EventArgs e)
241 {
242 App.runner.WindowState = FormWindowState.Normal;
243 App.runner.Show();
244 }
245
252 private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
253 {
254 if (treeView.SelectedNode == null)
255 return;
256 Node node = (Node)treeView.SelectedNode.Tag;
257 if (node == null)
258 return;
259 if (node.Type == Node.DataType.roi)
260 {
261 ROI an = (ROI)node.Object;
262 Node nod = (Node)treeView.SelectedNode.Parent.Tag;
263 BioImage im = (BioImage)nod.Object;
264 im.Annotations.Remove(an);
265 }
266 if (node.Type == Node.DataType.image)
267 {
268 BioImage im = (BioImage)node.Object;
269 Images.RemoveImage(im);
270 im.Dispose();
271 }
272 UpdateNodes();
274 }
275
282 private void setTextToolStripMenuItem_Click(object sender, EventArgs e)
283 {
284 Node node = (Node)treeView.SelectedNode.Tag;
285 if (node.Type == Node.DataType.roi)
286 {
287 ROI an = (ROI)node.Object;
288 Node nod = (Node)treeView.SelectedNode.Parent.Tag;
289 BioImage im = (BioImage)nod.Object;
290 TextInput input = new TextInput(an.Text);
291 if (input.ShowDialog() != DialogResult.OK)
292 return;
293 an.Text = input.TextValue;
294 an.family = input.font.FontFamily.ToString();
295 an.strokeColor = AForge.Color.FromArgb(input.color.A, input.color.R, input.color.G, input.color.B);
296 }
297 UpdateNodes();
299 }
300
307 private void setIDToolStripMenuItem_Click(object sender, EventArgs e)
308 {
309 Node node = (Node)treeView.SelectedNode.Tag;
310 if (node.Type == Node.DataType.roi)
311 {
312 ROI an = (ROI)node.Object;
313 Node nod = (Node)treeView.SelectedNode.Parent.Tag;
314 BioImage im = (BioImage)nod.Object;
315 TextInput input = new TextInput(an.id);
316 if (input.ShowDialog() != DialogResult.OK)
317 return;
318 an.id = input.TextValue;
319 }
320 UpdateNodes();
322 }
323
328 private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
329 {
330 About about = new About();
331 about.Show();
332 }
333
339 private void newTabsViewToolStripMenuItem_Click(object sender, EventArgs e)
340 {
341 TabsView v = new TabsView();
342 v.Show();
343 }
344
350 private void treeView_DoubleClick(object sender, EventArgs e)
351 {
352 if (treeView.SelectedNode?.Tag is not Node node)
353 return;
354
355 // Planes and ROIs belong to an image ancestor, not necessarily the active tab.
356 TreeNode imageNode = treeView.SelectedNode;
357 while (imageNode != null &&
358 (imageNode.Tag is not Node owner || owner.Type != Node.DataType.image))
359 imageNode = imageNode.Parent;
360 if (imageNode?.Tag is not Node imageEntry || imageEntry.Object is not BioImage image)
361 return;
362
363 try
364 {
365 if (App.tabsView == null || App.tabsView.IsDisposed)
366 App.tabsView = new TabsView();
367 TabsView tabs = App.tabsView;
368 ImageView viewer = null;
369 for (int i = 0; i < tabs.GetViewerCount(); i++)
370 {
371 ImageView candidate = tabs.GetViewer(i);
372 int index = candidate.Images.IndexOf(image);
373 if (index < 0)
374 continue;
375 tabs.SetTab(i);
376 App.viewer = candidate;
377 candidate.SelectedIndex = index;
378 viewer = candidate;
379 break;
380 }
381 if (viewer == null)
382 {
383 tabs.AddTab(image);
384 viewer = tabs.Viewer;
385 }
386 tabs.Show();
387 if (tabs.WindowState == FormWindowState.Minimized)
388 tabs.WindowState = FormWindowState.Normal;
389 tabs.Activate();
390
391 setIDToolStripMenuItem.Visible = node.Type == Node.DataType.roi;
392 setTextToolStripMenuItem.Visible = node.Type == Node.DataType.roi;
393 if (node.Object is Bitmap buf)
394 viewer.SetCoordinate(buf.Coordinate.Z, buf.Coordinate.C, buf.Coordinate.T);
395 else if (node.Object is ROI roi)
396 viewer.SetCoordinate(roi.coord.Z, roi.coord.C, roi.coord.T);
397 viewer.GoToImage();
398 }
399 catch (Exception ex)
400 {
401 MessageBox.Show(this, $"Could not display '{image.Filename}'.\n{ex.Message}",
402 "Open Image", MessageBoxButtons.OK, MessageBoxIcon.Error);
403 }
404 }
405 }
406}
System.Drawing.Color Color
System.Windows.Forms.Application Application
Definition ImageView.cs:14
static void Initialize(bool requireImageJ=false)
Initialize() is a function that initializes the BioImage Suite Web viewer.
Definition App.cs:48
static ImageView viewer
Definition App.cs:16
static bool Initialized
Definition App.cs:46
Node(object data, DataType typ)
Definition NodeView.cs:29
NodeView(string[] args)
Definition NodeView.cs:45
void Exit()
It closes the current form, exits the application, and exits the thread.
Definition NodeView.cs:160
void UpdateOverlay()
Definition NodeView.cs:72
void UpdateNodes()
Definition NodeView.cs:122
void InitNodes()
Definition NodeView.cs:80