BioCore  5.0.0
A Windows .NET microscopy library and application for viewing, editing, and annotating images.
Loading...
Searching...
No Matches
TabsView.cs
Go to the documentation of this file.
1using AForge;
2using BioCore;
3using BioLib;
4using System.Diagnostics;
5using System.ComponentModel;
6namespace BioCore
7{
8 public partial class TabsView : Form
9 {
10 public static bool init = false;
11 public Filter filters = null;
12 public static System.Drawing.Graphics graphics = null;
13 public List<ImageView> viewers = new List<ImageView>();
15 {
16 get
17 {
18 if (tabControl.TabPages.Count == 0)
19 return null;
20 if (tabControl.SelectedIndex == -1)
21 return null;
22 if (tabControl.SelectedTab.Controls.Count == 0)
23 return null;
24 return (ImageView)tabControl.SelectedTab.Controls[0];
25 }
26 }
27 /* A property that returns the image that is currently selected in the tabsView. */
28 public static BioImage SelectedImage
29 {
30 get
31 {
32 return App.tabsView.Image;
33 }
34 }
35 /* A property that returns the ImageViewer object from the tab control. */
37 {
38 get
39 {
40 return App.tabsView.ImageView;
41 }
42 }
43 /* Initializing the component. */
44 public TabsView(BioImage arg)
45 {
46 InitializeComponent();
47 LoadProperties();
48 ResizeView();
49 Init();
50 AddTab(arg);
51 }
52 /* Initializing the component and loading the properties. */
53 public TabsView()
54 {
55 InitializeComponent();
56 LoadProperties();
57 ResizeView();
58 Init();
59 }
60 /* A constructor for a class called TabsView. It is initializing the component and loading
61 properties. It is also initializing the class. */
62 public TabsView(string[] arg)
63 {
64 InitializeComponent();
65 LoadProperties();
66 Init();
67 if (arg.Length == 0)
68 return;
69 else
70 {
71 for (int i = 0; i < arg.Length; i++)
72 {
73 if (arg[i].EndsWith(".cs"))
74 {
75 App.runner.RunScriptFile(arg[0]);
76 return;
77 }
78 if (arg[i].EndsWith(".ijm"))
79 {
80 Fiji.RunMacroFiji(ImageView.SelectedImage, arg[i], "");
81 return;
82 }
83 else
84 {
85 AddTab(BioImage.OpenFile(arg[i]).Result);
86 }
87 }
88 }
89 }
96 public void AddTab(BioImage b)
97 {
98 if (b == null)
99 throw new ArgumentNullException(nameof(b), "The image loader returned no image to display.");
100 if (b.filename.Contains('/') || b.filename.Contains('\\'))
101 b.filename = Path.GetFileName(b.filename);
102 TabPage t = new TabPage(GetAvailableTabTitle(b.filename));
103 ImageView v = new ImageView(b);
104 v.Dock = DockStyle.Fill;
105 t.Controls.Add(v);
106 if (Width < b.SizeX || Height < b.SizeY)
107 {
108 Width = b.SizeX;
109 Height = b.SizeY + 190;
110 }
111 tabControl.TabPages.Add(t);
112 tabControl.Dock = DockStyle.Fill;
113 tabControl.SelectedIndex = tabControl.TabCount - 1;
114 viewers.Add(v);
115 ResizeView();
116 if (!Visible)
117 Show();
118 if (WindowState == FormWindowState.Minimized)
119 WindowState = FormWindowState.Normal;
120 Activate();
121 }
122
123 private string GetAvailableTabTitle(string filename)
124 {
125 var titles = new HashSet<string>(tabControl.TabPages.Cast<TabPage>().Select(page => page.Text), StringComparer.OrdinalIgnoreCase);
126 if (!titles.Contains(filename))
127 return filename;
128
129 // Keep the compound OME extension together when numbering copies.
130 string extension = filename.EndsWith(".ome.zarr", StringComparison.OrdinalIgnoreCase) ? filename.Substring(filename.Length - 9)
131 : filename.EndsWith(".ome.tiff", StringComparison.OrdinalIgnoreCase) ? filename.Substring(filename.Length - 9)
132 : filename.EndsWith(".ome.tif", StringComparison.OrdinalIgnoreCase) ? filename.Substring(filename.Length - 8)
133 : Path.GetExtension(filename);
134 string stem = filename.Substring(0, filename.Length - extension.Length);
135 for (int number = 2; ; number++)
136 {
137 string title = $"{stem}-{number}{extension}";
138 if (!titles.Contains(title))
139 return title;
140 }
141 }
142
146 public void RemoveTab(string tabName)
147 {
148 for (int i = 0; i < tabControl.TabPages.Count; i++)
149 {
150 var item = tabControl.TabPages[i];
151 string name = System.IO.Path.GetFileName(item.Name);
152 if (name == tabName)
153 {
154 ImageView iv = viewers[i];
155 for (int v = 0; v < iv.Images.Count; v++)
156 {
157 Images.RemoveImage(iv.Images[v]);
158 }
159 tabControl.TabPages.Remove(item);
160 viewers.RemoveAt(i);
162 return;
163 }
164 i++;
165 }
166 }
167
168 public void SetTab(string tabName)
169 {
170 tabControl.SelectTab(tabName);
171 }
172 public void SetTab(int i)
173 {
174 tabControl.SelectedIndex = i;
175 }
176
177 public void RenameTab(string tabName, string text)
178 {
179 for (int i = 0; i < tabControl.TabPages.Count; i++)
180 {
181 TabPage t = tabControl.TabPages[i];
182 if (t.Text == tabName)
183 {
184 t.Text = text;
185 return;
186 }
187 }
188 }
189
192 private void Init()
193 {
194 App.tabsView = this;
195 InitializeZarrMenu();
197 filters = new Filter();
198 InitializeCommandMenu();
199 foreach (Scripting.Script s in Scripting.Scripts.Values)
200 {
201 ToolStripMenuItem mi = new ToolStripMenuItem(s.name);
202 mi.Click += Mi_Click;
203 runToolStripMenuItem1.DropDownItems.Add(mi);
204 }
205 foreach (Fiji.Macro.Command c in Fiji.Macros)
206 {
207 ToolStripMenuItem mi = new ToolStripMenuItem(c.Name);
208 mi.Click += Mi_Click;
209 runToolStripMenuItem1.DropDownItems.Add(mi);
210 }
211 init = true;
212 }
213 private void Mi_Click(object? sender, EventArgs e)
214 {
215 ToolStripMenuItem m = (ToolStripMenuItem)sender;
216 if (m.Text.EndsWith(".ijm") || m.Text.EndsWith(".txt") && !m.Text.EndsWith(".cs"))
217 {
218 string ma = File.ReadAllText(m.Text);
220 }
221 else
222 Scripting.RunByName(m.Text);
223 }
224 public ImageView GetViewer(int i)
225 {
226 return viewers[i];
227 }
228 public ImageView? GetViewer(string name)
229 {
230 for (int v = 0; v < viewers.Count; v++)
231 {
232 for (int i = 0; i < viewers.Count; i++)
233 {
234 if (viewers[v].Images[i].Filename == name)
235 return viewers[v];
236 }
237 }
238 return null;
239 }
240 public int GetViewerCount()
241 {
242 return viewers.Count;
243 }
244 public void RemoveViewer(ImageView v)
245 {
246 viewers.Remove(v);
247 }
248 public void AddViewer(ImageView v)
249 {
250 viewers.Add(v);
251 }
252 private async void MenuItem_Click(object? sender, EventArgs e)
253 {
254 BioImage source = Image;
255 if (source == null) return;
256 ToolStripMenuItem m = (ToolStripMenuItem)sender;
257 string command = m.Tag as string ?? m.Text;
258 string escaped = command.Replace("\\", "\\\\").Replace("\"", "\\\"");
259 try
260 {
261 BioImage result = await Fiji.RunOnImage(source, "run(\"" + escaped + "\");", BioConsole.headless, BioConsole.onTab, BioConsole.useBioformats, BioConsole.newTab);
262 if (result == null)
263 {
264 MessageBox.Show(this, $"'{command}' did not return an image. It may have produced another type of result or failed in Fiji.",
265 "Fiji Command", MessageBoxButtons.OK, MessageBoxIcon.Information);
266 return;
267 }
268 if (ReferenceEquals(result, source))
269 {
270 ImageView? sourceViewer = viewers.FirstOrDefault(viewer => viewer.Images.Contains(source));
271 if (sourceViewer != null && !sourceViewer.IsDisposed)
272 {
273 TabPage? sourceTab = tabControl.TabPages.Cast<TabPage>()
274 .FirstOrDefault(page => page.Controls.Contains(sourceViewer));
275 if (sourceTab != null)
276 tabControl.SelectedTab = sourceTab;
277 App.viewer = sourceViewer;
278 sourceViewer.SelectedIndex = sourceViewer.Images.IndexOf(source);
279 sourceViewer.UpdateView();
280 }
281 }
282 else
283 AddTab(result);
284 }
285 catch (Exception ex)
286 {
287 Trace.WriteLine(ex.ToString());
288 MessageBox.Show(this, $"Could not run '{command}':\n\n{ex}", "Fiji Command", MessageBoxButtons.OK, MessageBoxIcon.Error);
289 return;
290 }
291 ToolStripMenuItem mi = new ToolStripMenuItem(m.Text);
292 mi.Tag = command;
293 mi.Click += MenuItem_Click;
294 bool con = false;
295 foreach (ToolStripMenuItem item in recentToolStripMenuItem.DropDownItems)
296 {
297 if ((item.Tag as string ?? item.Text) == command)
298 con = true;
299 }
300 if (!con)
301 recentToolStripMenuItem.DropDownItems.Add(mi);
302 }
307 public void ResizeView()
308 {
309 if (Image == null)
310 return;
311 System.Drawing.Size s;
312 if (SelectedImage.isPyramidal)
313 s = new System.Drawing.Size(ImageView.SelectedImage.Resolutions[ImageView.Level].SizeX + 42, ImageView.SelectedImage.Resolutions[ImageView.Level].SizeY + 206);
314 else
315 s = new System.Drawing.Size(ImageView.SelectedImage.SizeX + 20, ImageView.SelectedImage.SizeY + 180);
316 if (s.Width > Screen.PrimaryScreen.Bounds.Width || s.Height > Screen.PrimaryScreen.Bounds.Height)
317 {
318 this.WindowState = FormWindowState.Maximized;
320 }
321 else
322 {
323 Size = s;
325 }
326 }
327
328 /* Setting the image property of the viewer. */
329 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
330 public BioImage Image
331 {
332 get
333 {
334 if (Viewer == null)
335 return null;
336 if (ImageView.SelectedImage == null)
337 return null;
339 }
340 set
341 {
343 }
344 }
345
346 /* A property of the ImageView class. */
348 {
349 get
350 {
351 return Viewer;
352 }
353 }
354
355 /* A property that returns the number of tabs in the tab control. */
356 public int TabCount
357 {
358 get
359 {
360 return tabControl.TabPages.Count;
361 }
362 }
363
368 public void OpenInNewProcess(string file)
369 {
370 Process p = new Process();
371 p.StartInfo.FileName = Application.ExecutablePath;
372 p.StartInfo.Arguments = file;
373 p.Start();
374 }
375
384 private async void openToolStripMenuItem_Click(object sender, EventArgs e)
385 {
386 if (openFilesDialog.ShowDialog() != DialogResult.OK)
387 return;
388 foreach (string item in openFilesDialog.FileNames)
389 {
390 try
391 {
392 BioImage im = await BioImage.OpenFile(item);
393 if (im == null)
394 throw new InvalidOperationException("The image loader returned no image.");
395 AddTab(im);
396 if (!App.recent.Contains(im.ID))
397 App.recent.Add(im.ID);
398 }
399 catch (Exception ex)
400 {
401 MessageBox.Show(this, $"Could not open '{item}'.\n{ex.Message}",
402 "Open Image", MessageBoxButtons.OK, MessageBoxIcon.Error);
403 }
404 }
405 openRecentToolStripMenuItem.DropDownItems.Clear();
406 foreach (string item in App.recent)
407 {
408 openRecentToolStripMenuItem.DropDownItems.Add(item, null, ItemClicked);
409 }
410 }
411
413 private void SaveProperties()
414 {
415 string s = "";
416 for (int i = 0; i < App.recent.Count; i++)
417 {
418 s += "$" + App.recent[i];
419 }
420 Properties.Settings.Default["Recent"] = s;
421 Properties.Settings.Default.Save();
422 }
423
425 private void LoadProperties()
426 {
427 App.recent.Clear();
428 string s = (string)Properties.Settings.Default["Recent"];
429 string[] sts = s.Split('$');
430 foreach (string item in sts)
431 {
432 if (item != "")
433 App.recent.Add(item);
434 }
435 }
436
441 private void closeToolStripMenuItem_Click(object sender, EventArgs e)
442 {
443 if (this.Viewer != null)
444 {
445 Images.RemoveImage(SelectedImage);
446 }
447 }
448
455 private void saveToolStripMenuItem_Click(object sender, EventArgs e)
456 {
457 if (Image == null)
458 return;
459 saveTiffFileDialog.FileName = Path.GetFileNameWithoutExtension(Image.Filename);
460 if (saveTiffFileDialog.ShowDialog() != DialogResult.OK)
461 return;
462 string[] sts = new string[1];
463 sts[0] = ImageView.SelectedImage.ID;
464 BioImage.SaveSeries(sts, saveTiffFileDialog.FileName);
465 }
466
472 private void ImageViewer_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
473 {
474 if (e.KeyCode == Keys.S && e.Control)
475 {
476 saveToolStripMenuItem.PerformClick();
477 }
478 else
479 if (e.KeyCode == Keys.O && e.Control)
480 {
481 openToolStripMenuItem.PerformClick();
482 }
483 }
484
489 private void toolboxToolStripMenuItem_Click(object sender, EventArgs e)
490 {
491 App.tools.Show();
492 }
493
502 private void exportCSVToolStripMenuItem_Click(object sender, EventArgs e)
503 {
504 if (saveCSVFileDialog.ShowDialog() != DialogResult.OK)
505 return;
506 BioImage.ExportROIsCSV(saveCSVFileDialog.FileName, ImageView.SelectedImage.Annotations);
507 }
508
516 private void importCSVToolStripMenuItem_Click(object sender, EventArgs e)
517 {
518 if (openCSVFileDialog.ShowDialog() != DialogResult.OK)
519 return;
520 ImageView.SelectedImage.Annotations.AddRange(BioImage.ImportROIsCSV(openCSVFileDialog.FileName));
521 }
522
529 private void exportROIsOfFolderOfImagesToolStripMenuItem_Click(object sender, EventArgs e)
530 {
531 if (folderBrowserDialog.ShowDialog() != DialogResult.OK)
532 return;
533 saveOMEFileDialog.InitialDirectory = folderBrowserDialog.SelectedPath;
534 if (saveCSVFileDialog.ShowDialog() != DialogResult.OK)
535 return;
536 string f = Path.GetFileName(saveCSVFileDialog.FileName);
537
538 BioImage.ExportROIFolder(folderBrowserDialog.SelectedPath, f);
539 }
540
545 private void rOIManagerToolStripMenuItem_Click(object sender, EventArgs e)
546 {
547 App.manager.Show();
548 }
549
554 private void ImageViewer_Activated(object sender, EventArgs e)
555 {
556 App.tabsView = this;
557 //App.Image = SelectedImage;
558 }
559
567 private void channelsToolToolStripMenuItem_Click(object sender, EventArgs e)
568 {
569 if (ImageView.SelectedImage == null)
570 return;
571 if (App.channelsTool == null)
572 App.channelsTool = new ChannelsTool(App.Channels);
573 App.channelsTool.Show();
574 }
575
583 private void rGBToolStripMenuItem_Click(object sender, EventArgs e)
584 {
585 if (Viewer == null)
586 return;
587 Viewer.Mode = ImageView.ViewMode.RGBImage;
588 filteredToolStripMenuItem.Checked = false;
589 rawToolStripMenuItem.Checked = false;
590 emissionToolStripMenuItem.Checked = false;
592 }
593
600 private void filteredToolStripMenuItem_Click(object sender, EventArgs e)
601 {
602 if (Viewer == null)
603 return;
604 Viewer.Mode = ImageView.ViewMode.Filtered;
605 rGBToolStripMenuItem.Checked = false;
606 rawToolStripMenuItem.Checked = false;
607 emissionToolStripMenuItem.Checked = false;
609 }
610
617 private void rawToolStripMenuItem_Click(object sender, EventArgs e)
618 {
619 if (Viewer == null)
620 return;
621 Viewer.Mode = ImageView.ViewMode.Raw;
622 rGBToolStripMenuItem.Checked = false;
623 filteredToolStripMenuItem.Checked = false;
624 emissionToolStripMenuItem.Checked = false;
626 }
627
635 private void autoThresholdToolStripMenuItem_Click(object sender, EventArgs e)
636 {
637 if (Viewer == null)
638 return;
639 BioImage.AutoThreshold(ImageView.SelectedImage, true);
640 if (ImageView.SelectedImage.bitsPerPixel > 8)
641 ImageView.SelectedImage.StackThreshold(true);
642 else
643 ImageView.SelectedImage.StackThreshold(false);
644 }
649
651 {
652 if (v == ImageView.ViewMode.RGBImage)
653 rGBToolStripMenuItem.Checked = true;
654 if (v == ImageView.ViewMode.Filtered)
655 filteredToolStripMenuItem.Checked = true;
656 if (v == ImageView.ViewMode.Raw)
657 rawToolStripMenuItem.Checked = true;
658 }
659
664 private void scriptRunnerToolStripMenuItem_Click(object sender, EventArgs e)
665 {
666 App.runner.WindowState = FormWindowState.Normal;
667 App.runner.Show();
668 }
669
674 private void stackToolsToolStripMenuItem_Click(object sender, EventArgs e)
675 {
676 App.stackTools.Show();
677 }
678
683 private void scriptRecorderToolStripMenuItem_Click(object sender, EventArgs e)
684 {
685 Recorder.recorder.WindowState = FormWindowState.Normal;
686 Recorder.recorder.Show();
687 }
688
695 private void saveOMEToolStripMenuItem_Click(object sender, EventArgs e)
696 {
697 if (Image == null)
698 return;
699 saveOMEFileDialog.FileName = Path.GetFileNameWithoutExtension(ImageView.SelectedImage.Filename);
700 if (saveOMEFileDialog.ShowDialog() != DialogResult.OK)
701 return;
702 foreach (string file in saveOMEFileDialog.FileNames)
703 {
704 BioImage.SaveOME(file, Image.ID);
705 }
706 }
707
708 private void copyToClipboardToolStripMenuItem_Click(object sender, EventArgs e)
709 {
710
711 }
712
717 private void setToolToolStripMenuItem_Click(object sender, EventArgs e)
718 {
719 SetTool tool = new SetTool();
720 tool.Show();
721 }
722
727 private void timer_Tick(object sender, EventArgs e)
728 {
729 //Here we update the tabs based on images in the table.
730
731 }
732
738 private void filtersToolStripMenuItem_Click(object sender, EventArgs e)
739 {
740 filters = new Filter();
741 filters.Show();
742 }
743
749 private void bit8ToolStripMenuItem_Click(object sender, EventArgs e)
750 {
751 Image.To8Bit();
752 Viewer.InitGUI();
754 }
755
761 private void bit16ToolStripMenuItem_Click(object sender, EventArgs e)
762 {
763 Image.To16Bit();
764 Viewer.InitGUI();
766 }
767
772 private void to24BitToolStripMenuItem_Click(object sender, EventArgs e)
773 {
774 Image.To24Bit();
775 //We update the viewer gui since there are less planes now.
776 Viewer.InitGUI();
778 }
779
784 private void to48BitToolStripMenuItem_Click(object sender, EventArgs e)
785 {
786 Image.To48Bit();
787 //We update the viewer gui since there are less planes now.
788 Viewer.InitGUI();
790 }
791
796 private void to32BitToolStripMenuItem_Click(object sender, EventArgs e)
797 {
798 Image.To32Bit();
799 Viewer.InitGUI();
801 }
802
810 private void toWindowToolStripMenuItem_Click(object sender, EventArgs e)
811 {
812 if (tabControl.SelectedIndex == -1)
813 return;
814 BioImage im = ImageView.SelectedImage;
815 ImageWindow vi = new ImageWindow(im);
816 vi.Show();
817 }
818
825 private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
826 {
827 if (tabControl.SelectedIndex == -1)
828 return;
829 //We update the view status based on tab.
830 if (Viewer.Mode == ImageView.ViewMode.Raw)
831 rawToolStripMenuItem.Checked = true;
832 else
833 rawToolStripMenuItem.Checked = false;
834 if (Viewer.Mode == ImageView.ViewMode.Filtered)
835 filteredToolStripMenuItem.Checked = true;
836 else
837 filteredToolStripMenuItem.Checked = false;
838 if (Viewer.Mode == ImageView.ViewMode.RGBImage)
839 rGBToolStripMenuItem.Checked = true;
840 else
841 rGBToolStripMenuItem.Checked = false;
842 //We update the active Viewer.
843 App.viewer = Viewer;
844 ImageView.SelectedIndex = 0;
845 }
846
854 private void closeToolStripMenuItem_Click_1(object sender, EventArgs e)
855 {
856 if (tabControl.SelectedIndex == -1)
857 return;
858 ImageView v = (ImageView)tabControl.SelectedTab.Controls[0];
859 tabControl.TabPages.RemoveAt(tabControl.SelectedIndex);
860 v.Dispose();
861 foreach (BioImage item in v.Images)
862 {
863 Images.RemoveImage(item);
864 item.Dispose();
865 }
866 GC.Collect();
867 }
868
873 private void openOMEToolStripMenuItem_Click(object sender, EventArgs e)
874 {
875 if (openFilesDialog.ShowDialog() != DialogResult.OK)
876 return;
877 int img = Images.images.Count;
878 foreach (string item in openFilesDialog.FileNames)
879 {
880 BioImage im = BioImage.OpenOME(item, true);
881 AddTab(im);
882 if (!App.recent.Contains(im.ID))
883 App.recent.Add(im.ID);
884 }
885 foreach (string item in App.recent)
886 {
887 openRecentToolStripMenuItem.DropDownItems.Add(item, null, ItemClicked);
888 }
889 }
890
895 private void saveAllToolStripMenuItem_Click(object sender, EventArgs e)
896 {
897 List<string> sts = new List<string>();
898 foreach (BioImage item in Images.images)
899 {
900 BioImage.SaveFile(Image.ID, Image.ID);
901 }
902 }
903
908 private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
909 {
910 About about = new About();
911 about.Show();
912 }
913
918 private void scriptRunnerToolStripMenuItem_Click_1(object sender, EventArgs e)
919 {
920 App.runner.Show();
921 }
922
927 private void scriptRecorderToolStripMenuItem_Click_1(object sender, EventArgs e)
928 {
929 App.recorder.Show();
930 }
931
938 private void openOMEToolStripMenuItem_Click_1(object sender, EventArgs e)
939 {
940 if (openFilesDialog.ShowDialog() != DialogResult.OK)
941 return;
942 foreach (string sts in openFilesDialog.FileNames)
943 {
944 BioImage im = BioImage.OpenOME(sts, true);
945 if (im == null)
946 return;
947 AddTab(im);
948 }
949 }
950
955 private void newTabViewToolStripMenuItem_Click(object sender, EventArgs e)
956 {
957 Process.Start(Application.ExecutablePath);
958 }
959
964 private void nodeViewToolStripMenuItem_Click(object sender, EventArgs e)
965 {
966 App.nodeView.Show();
967 App.nodeView.ShowInTaskbar = true;
968 }
975 private void saveToolStripMenuItem1_Click(object sender, EventArgs e)
976 {
977 if (saveTiffFileDialog.ShowDialog() == DialogResult.OK)
978 BioImage.SaveFile(ImageView.SelectedImage.ID, saveTiffFileDialog.FileName);
979 }
980
986 private void saveOMEToolStripMenuItem1_Click(object sender, EventArgs e)
987 {
988 if (saveOMEFileDialog.ShowDialog() == DialogResult.OK)
989 BioImage.SaveFile(ImageView.SelectedImage.ID, saveOMEFileDialog.FileName);
990 }
995 private void openRecentToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
996 {
997 openRecentToolStripMenuItem.DropDownItems.Clear();
998 foreach (string item in App.recent)
999 {
1000 openRecentToolStripMenuItem.DropDownItems.Add(item, null, ItemClicked);
1001 }
1002 }
1009 private async void ItemClicked(object sender, EventArgs e)
1010 {
1011 ToolStripMenuItem ts = (ToolStripMenuItem)sender;
1012 if (IsZarrSource(ts.Text))
1013 {
1014 await OpenZarrSourceAsync(ts.Text);
1015 return;
1016 }
1017 if (!BioImage.isOME(ts.Text))
1018 {
1019 BioImage[] bs = BioImage.OpenSeries(ts.Text, false);
1020 for (int i = 0; i < bs.Length; i++)
1021 {
1022 if (i == 0)
1023 AddTab(bs[i]);
1024 else
1025 Viewer.AddImage(bs[i]);
1026 }
1027 }
1028 else
1029 {
1030 OpenInTab tb = new OpenInTab();
1031 bool separateTabs = tb.ShowDialog() == DialogResult.Yes;
1032 bool firstImage = true;
1033 await foreach (BioImage image in ImageSeriesLoader.OpenAsync(ts.Text))
1034 {
1035 if (separateTabs || firstImage)
1036 AddTab(image);
1037 else
1038 Viewer.AddImage(image);
1039 firstImage = false;
1040 }
1041 }
1043 SaveProperties();
1044 }
1051 private void TabsView_KeyDown(object sender, KeyEventArgs e)
1052 {
1053 if (Viewer == null)
1054 return;
1055 Viewer.ImageView_KeyDown(sender, e);
1058 }
1059
1064 private void duplicateToolStripMenuItem_Click(object sender, EventArgs e)
1065 {
1066 BioImage im = Image.Copy();
1067 AddTab(im);
1068 }
1069
1074 private void saveSeriesToolStripMenuItem_Click(object sender, EventArgs e)
1075 {
1076 App.seriesTool.Show();
1077 }
1078
1083 private void TabsView_FormClosing(object sender, FormClosingEventArgs e)
1084 {
1085 SaveProperties();
1086 App.nodeView.Close();
1087 Application.Exit();
1088 }
1089
1096 private void addImagesToTabToolStripMenuItem_Click(object sender, EventArgs e)
1097 {
1098 if (openFilesDialog.ShowDialog() != DialogResult.OK)
1099 return;
1100 for (int i = 0; i < openFilesDialog.FileNames.Length; i++)
1101 {
1102 if (i == 0 && tabControl.TabPages.Count == 0)
1103 {
1104 BioImage[] bms = BioImage.OpenOMESeries(openFilesDialog.FileNames[0], true, true);
1105 AddTab(bms[0]);
1106 for (int a = 1; a < bms.Length; a++)
1107 {
1108 App.viewer.AddImage(bms[a]);
1109 }
1111 return;
1112 }
1113 else
1114 {
1115 BioImage[] bms = BioImage.OpenOMESeries(openFilesDialog.FileNames[0], false, true);
1116 for (int a = 0; a < bms.Length; a++)
1117 {
1118 App.viewer.AddImage(bms[a]);
1119 }
1121 return;
1122 }
1123 }
1124
1125 }
1126
1133 private void addImagesOMEToolStripMenuItem_Click(object sender, EventArgs e)
1134 {
1135 if (openFilesDialog.ShowDialog() != DialogResult.OK)
1136 return;
1137 for (int i = 0; i < openFilesDialog.FileNames.Length; i++)
1138 {
1139 if (i == 0 && tabControl.TabPages.Count == 0)
1140 {
1141 AddTab(BioImage.OpenOME(openFilesDialog.FileNames[0], false));
1142 }
1143 else
1144 App.viewer.AddImage(BioImage.OpenOME(openFilesDialog.FileNames[i], false));
1145 }
1147 }
1148
1155 private async void openSeriesToolStripMenuItem_Click(object sender, EventArgs e)
1156 {
1157 if (openFilesDialog.ShowDialog() != DialogResult.OK)
1158 return;
1159 foreach (var file in openFilesDialog.FileNames)
1160 {
1161 await foreach (BioImage image in ImageSeriesLoader.OpenAsync(file))
1162 {
1163 AddTab(image);
1164 }
1165 }
1166 }
1167
1175 private void saveTabToolStripMenuItem_Click(object sender, EventArgs e)
1176 {
1177 if (saveOMEFileDialog.ShowDialog() != DialogResult.OK)
1178 return;
1179 bool convert = false;
1180 foreach (BioImage b in ImageView.Images)
1181 {
1182 if (b.isRGB)
1183 {
1184 convert = true;
1185 break;
1186 }
1187 }
1188 if (convert)
1189 {
1190 string mes;
1191 if (ImageView.SelectedImage.bitsPerPixel > 8)
1192 mes = "Saving Series as OME only supports 8 bit & 16 bit images. Convert 16 bit?";
1193 else
1194 mes = "Saving Series as OME only supports 8 bit & 16 bit images. Convert 8 bit?";
1195 if (MessageBox.Show(this, mes, "Convert to supported format?", MessageBoxButtons.OKCancel) == DialogResult.OK)
1196 {
1197 foreach (BioImage b in ImageView.Images)
1198 {
1199 if (b.bitsPerPixel > 8)
1200 b.To16Bit();
1201 else
1202 b.To8Bit();
1203 }
1204 }
1205 else
1206 return;
1207 }
1208
1209 BioImage[] sts = new BioImage[App.viewer.Images.Count];
1210 for (int i = 0; i < sts.Length; i++)
1211 {
1212 sts[i] = Images.GetImage(App.viewer.Images[i].ID);
1213 }
1214 BioImage.SaveOMESeries(sts, saveOMEFileDialog.FileName, Properties.Settings.Default.Planes);
1215 }
1216
1223 private void saveTabTiffToolStripMenuItem_Click(object sender, EventArgs e)
1224 {
1225 if (saveTiffFileDialog.ShowDialog() != DialogResult.OK)
1226 return;
1227 string[] sts = new string[App.viewer.Images.Count];
1228 for (int i = 0; i < sts.Length; i++)
1229 {
1230 sts[i] = App.viewer.Images[i].Filename;
1231 }
1232 BioImage.SaveSeries(sts, saveTiffFileDialog.FileName);
1233 }
1234
1241 private void openSeriesToolStripMenuItem_Click_1(object sender, EventArgs e)
1242 {
1243 if (openFilesDialog.ShowDialog() != DialogResult.OK)
1244 return;
1245 BioImage[] bms = null;
1246 foreach (string item in openFilesDialog.FileNames)
1247 {
1248 bms = BioImage.OpenSeries(item, false);
1249 for (int i = 0; i < bms.Length; i++)
1250 {
1251 if (i == 0)
1252 {
1253 AddTab(bms[i]);
1254 }
1255 else
1256 App.viewer.AddImage(bms[i]);
1257 }
1258 }
1260 }
1261
1266 private void TabsView_Load(object sender, EventArgs e)
1267 {
1268 if (App.viewer != null)
1270
1272 }
1273
1278 private void clearRecentToolStripMenuItem_Click(object sender, EventArgs e)
1279 {
1280 Properties.Settings.Default.Recent = "";
1281 Properties.Settings.Default.Save();
1282 openRecentToolStripMenuItem.DropDownItems.Clear();
1283 App.recent.Clear();
1284 }
1285
1293 private void rotateToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
1294 {
1295 if (ImageView.SelectedImage == null)
1296 return;
1297 string st = e.ClickedItem.Text;
1298 AForge.RotateFlipType rot = (AForge.RotateFlipType)Enum.Parse(typeof(AForge.RotateFlipType), st);
1299 ImageView.SelectedImage.RotateFlip(rot);
1302 }
1303
1310 private void rotateToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
1311 {
1312 if (rotateToolStripMenuItem.DropDownItems.Count > 0)
1313 return;
1314 string[] sts = Enum.GetNames(typeof(AForge.RotateFlipType));
1315 foreach (string item in sts)
1316 {
1317 rotateToolStripMenuItem.DropDownItems.Add(item);
1318 }
1319 }
1320
1328 private void emissionToolStripMenuItem_Click(object sender, EventArgs e)
1329 {
1330 if (Viewer == null)
1331 return;
1332 Viewer.Mode = ImageView.ViewMode.Emission;
1333 rGBToolStripMenuItem.Checked = false;
1334 rawToolStripMenuItem.Checked = false;
1335 filteredToolStripMenuItem.Checked = false;
1336 emissionToolStripMenuItem.Checked = true;
1338 }
1339
1344 private void consoleToolStripMenuItem_Click(object sender, EventArgs e)
1345 {
1346 App.console.Show();
1347 }
1348
1354 private void switchRedBlueToolStripMenuItem_Click(object sender, EventArgs e)
1355 {
1356 foreach (Bitmap bf in ImageView.SelectedImage.Buffers)
1357 {
1358 bf.SwitchRedBlue();
1359 }
1361 }
1366 private void createFunctionToolStripMenuItem_Click(object sender, EventArgs e)
1367 {
1368 FunctionForm f = new FunctionForm(new Function());
1369 f.Show();
1370 }
1376 private void DropDownItemClicked(object sender, EventArgs e)
1377 {
1378 ToolStripMenuItem ts = (ToolStripMenuItem)sender;
1379 Function.Functions[ts.Text].PerformFunction(true);
1380 }
1386 private void runToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
1387 {
1388 runToolStripMenuItem.DropDownItems.Clear();
1389 foreach (var item in Function.Functions)
1390 {
1391 runToolStripMenuItem.DropDownItems.Add(item.Value.Name, null, DropDownItemClicked);
1392 }
1393 }
1394
1399 private void reloadToolStripMenuItem_Click(object sender, EventArgs e)
1400 {
1401 ImageView.SelectedImage.Update();
1402 }
1403
1408 private void xMLToolStripMenuItem_Click(object sender, EventArgs e)
1409 {
1410 XMLView v = new XMLView(BioImage.OpenXML(ImageView.SelectedImage.file));
1411 v.Show();
1412 }
1413
1422 private void imagesToStackToolStripMenuItem_Click(object sender, EventArgs e)
1423 {
1424 OpenFileDialog fd = new OpenFileDialog();
1425 fd.Title = "Images to Stack";
1426 fd.Multiselect = true;
1427 if (fd.ShowDialog() != DialogResult.OK)
1428 return;
1429 BioImage b = BioImage.ImagesToStack(fd.FileNames, true);
1430 AddTab(b);
1431 }
1432
1439 private void importImageJROIToolStripMenuItem_Click(object sender, EventArgs e)
1440 {
1441 if (openImageJDialog.ShowDialog() != DialogResult.OK)
1442 return;
1443 foreach (string item in openImageJDialog.FileNames)
1444 {
1445 ImageView.SelectedImage.Annotations.Add(Fiji.RoiDecoder.open(item, ImageView.SelectedImage.PhysicalSizeX, ImageView.SelectedImage.PhysicalSizeY, ImageView.SelectedImage.StageSizeX, ImageView.SelectedImage.StageSizeY));
1446 }
1448 }
1449
1456 private void exportImageJROIToolStripMenuItem_Click(object sender, EventArgs e)
1457 {
1458 saveImageJDialog.Title = "Set Filename for exported ROI's.";
1459 saveImageJDialog.FileName = ImageView.SelectedImage.Filename;
1460 if (saveImageJDialog.ShowDialog() != DialogResult.OK)
1461 return;
1462 int i = 1;
1463 foreach (ROI roi in ImageView.SelectedImage.Annotations)
1464 {
1465 string s = Path.GetDirectoryName(saveImageJDialog.FileName) + "//" + Path.GetFileNameWithoutExtension(saveImageJDialog.FileName) + "-" + i + ".roi";
1466 Fiji.RoiEncoder.save(ImageView.SelectedImage, roi, s);
1467 i++;
1468 }
1470 }
1471
1472 private void autoFocusToolStripMenuItem_Click(object sender, EventArgs e)
1473 {
1474 if (SelectedImage == null) return;
1475 ZCT co = ImageView.GetCoordinate();
1476 int f = BioImage.FindFocus(SelectedImage, co.C, co.T);
1477 ZCT z = SelectedImage.Buffers[f].Coordinate;
1478 ImageView.SetCoordinate(z.Z, z.C, z.T);
1479 }
1480
1481 private void savePyramidalToolStripMenuItem_Click(object sender, EventArgs e)
1482 {
1483 saveOMEFileDialog.Title = "Save Pyramidal";
1484 if (saveOMEFileDialog.ShowDialog() != DialogResult.OK)
1485 return;
1486 BioImage.SaveOMEPyramidal(App.viewer.Images.ToArray(), saveOMEFileDialog.FileName, NetVips.Enums.ForeignTiffCompression.Lzw, 0);
1487 }
1488
1489 private void TabsView_KeyPress(object sender, KeyPressEventArgs e)
1490 {
1491 if (Viewer == null) return;
1493 }
1494
1495 private void TabsView_KeyUp(object sender, KeyEventArgs e)
1496 {
1497 if (Viewer == null) return;
1499 }
1500
1501 private void importQuPathROIToolStripMenuItem_Click(object sender, EventArgs e)
1502 {
1503 if (openQuPathDialog.ShowDialog() != DialogResult.OK)
1504 return;
1505 foreach (string item in openQuPathDialog.FileNames)
1506 {
1507 ROI[] rois = QuPath.ReadROI(item, ImageView.SelectedImage);
1508 foreach (ROI r in rois)
1509 {
1510 ImageView.SelectedImage.Annotations.Add(r);
1511 }
1512 }
1513 }
1514
1515 private void exportQuPathROIToolStripMenuItem_Click(object sender, EventArgs e)
1516 {
1517 if (saveQuPathDialog.ShowDialog() != DialogResult.OK)
1518 return;
1519 foreach (string item in saveQuPathDialog.FileNames)
1520 {
1521 QuPath.SaveROI(item, ImageView.SelectedImage);
1522 }
1523 }
1524
1525 private void extractRegionPyramidalToolStripMenuItem_Click(object sender, EventArgs e)
1526 {
1527 BioImage bm = SelectedImage.Copy(true);
1528 bm.ID = Images.GetImageName(bm.ID);
1529 Images.AddImage(bm);
1530 }
1531
1532 private void openQuPathProjectToolStripMenuItem_Click(object sender, EventArgs e)
1533 {
1534 if (openQuPathProjDialog.ShowDialog() != DialogResult.OK)
1535 return;
1536 QuPath.Project pr = QuPath.OpenProject(openQuPathProjDialog.FileName);
1537 foreach (QuPath.Image p in pr.Images)
1538 {
1539 string s = p.ServerBuilder.Uri.Replace("file:/", "");
1540 App.tabsView.AddTab(BioImage.OpenFile(s).Result);
1541 }
1542 }
1543
1544 private void saveQuPathProjectToolStripMenuItem_Click(object sender, EventArgs e)
1545 {
1546 if (saveNumPyDialog.ShowDialog() != DialogResult.OK)
1547 return;
1548 List<BioImage> bms = new List<BioImage>();
1549 foreach (var v in viewers)
1550 {
1551 foreach (var item in v.Images)
1552 {
1553 bms.Add(item);
1554 }
1555 }
1556 QuPath.Project.SaveProject(saveNumPyDialog.FileName, new List<BioImage[]> { bms.ToArray() });
1557 }
1558
1559 private void renameToolStripMenuItem_Click(object sender, EventArgs e)
1560 {
1561 TextInput ti = new TextInput("Rename Image");
1562 if (ti.ShowDialog() != DialogResult.OK)
1563 return;
1565 }
1566
1567 private void saveNumPyToolStripMenuItem_Click(object sender, EventArgs e)
1568 {
1569 if (saveNumPyDialog.ShowDialog() != DialogResult.OK)
1570 return;
1571 NumPy.SaveNumPy(ImageView.SelectedImage, saveNumPyDialog.FileName);
1572 }
1573
1574 private void oMEROToolStripMenuItem_Click(object sender, EventArgs e)
1575 {
1576 OMERO om = new OMERO();
1577 om.Show();
1578 }
1579 }
1580}
System.Drawing.Image Image
Definition ImageView.cs:15
System.Windows.Forms.Keys Keys
Definition ImageView.cs:16
System.Windows.Forms.Application Application
Definition ImageView.cs:14
BioLib.OMERO OMERO
Definition OMERO.cs:15
System.Drawing.Size Size
static Recorder recorder
Definition App.cs:13
static NodeView nodeView
Definition App.cs:11
static ChannelsTool channelsTool
Definition App.cs:9
static Scripting runner
Definition App.cs:12
static ImageView viewer
Definition App.cs:16
static TabsView tabsView
Definition App.cs:10
static List< Channel > Channels
Definition App.cs:38
static StackTools stackTools
Definition App.cs:15
static ROIManager manager
Definition App.cs:8
static Tools tools
Definition App.cs:14
static BioConsole console
Definition App.cs:18
static List< string > recent
Definition App.cs:20
static Series seriesTool
Definition App.cs:17
static bool newTab
Definition BioConsole.cs:23
static bool useBioformats
Definition BioConsole.cs:21
static bool headless
Definition BioConsole.cs:22
static bool onTab
Definition BioConsole.cs:20
static void Initialize()
static Dictionary< string, Function > Functions
ImageView control for image stacks, pyramidal and whole-slide-images.
void ImageView_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
void ImageView_KeyUp(object sender, KeyEventArgs e)
void AddImage(BioImage im)
Definition ImageView.cs:485
List< BioImage > Images
Definition ImageView.cs:359
static BioImage SelectedImage
Definition ImageView.cs:306
void SetCoordinate(int z, int c, int t)
Definition ImageView.cs:443
int Level
Current level when viewing whole-slide and pyramidal images.
Definition ImageView.cs:791
void ImageView_KeyDown(object sender, KeyEventArgs e)
ViewMode Mode
Setting the view mode of the application. *‍/.
Definition ImageView.cs:635
async void UpdateImages(bool updatePyramidal=true)
int SelectedIndex
A property that is used to set the selected index of the image. *‍/.
Definition ImageView.cs:406
void Exit()
It closes the current form, exits the application, and exits the thread.
Definition NodeView.cs:160
void UpdateNodes()
Definition NodeView.cs:122
static void Initialize()
Definition Plugin.cs:38
static Recorder recorder
Definition Recorder.cs:10
static Dictionary< string, Script > Scripts
Definition Scripting.cs:16
void RunScriptFile(string file)
Definition Scripting.cs:398
static void RunByName(string name)
Definition Scripting.cs:459
void SetTab(string tabName)
Definition TabsView.cs:168
static System.Drawing.Graphics graphics
Definition TabsView.cs:12
static bool init
Definition TabsView.cs:10
ImageView Viewer
Definition TabsView.cs:15
ImageView? GetViewer(string name)
Definition TabsView.cs:228
TabsView(string[] arg)
Definition TabsView.cs:62
int GetViewerCount()
Definition TabsView.cs:240
void RemoveTab(string tabName)
Definition TabsView.cs:146
void AddViewer(ImageView v)
Definition TabsView.cs:248
BioImage Image
Definition TabsView.cs:331
void RemoveViewer(ImageView v)
Definition TabsView.cs:244
void AddTab(BioImage b)
Definition TabsView.cs:96
void ResizeView()
Definition TabsView.cs:307
void SetTab(int i)
Definition TabsView.cs:172
void UpdateViewMode(ImageView.ViewMode v)
Definition TabsView.cs:650
static BioImage SelectedImage
Definition TabsView.cs:29
ImageView GetViewer(int i)
Definition TabsView.cs:224
List< ImageView > viewers
Definition TabsView.cs:13
void OpenInNewProcess(string file)
Definition TabsView.cs:368
ImageView ImageView
Definition TabsView.cs:348
void RenameTab(string tabName, string text)
Definition TabsView.cs:177
static ImageView SelectedViewer
Definition TabsView.cs:37
TabsView(BioImage arg)
Definition TabsView.cs:44