TreeViewMain.cpp
上传用户:szb0815
上传日期:2007-06-13
资源大小:338k
文件大小:47k
源码类别:

生物技术

开发平台:

C++ Builder

  1. /*
  2. Software and source code Copyright (C) 1998-2000 Stanford University
  3. Written by Michael Eisen (eisen@genome.stanford.edu)
  4. This software is copyright under the following conditions:
  5. Permission to use, copy, and modify this software and its documentation
  6. is hereby granted to all academic and not-for-profit institutions
  7. without fee, provided that the above copyright notice and this permission
  8. notice appear in all copies of the software and related documentation.
  9. Permission to distribute the software or modified or extended versions
  10. thereof on a not-for-profit basis is explicitly granted, under the above
  11. conditions. However, the right to use this software in conjunction with
  12. for profit activities, and the right to distribute the software or modified or
  13. extended versions thereof for profit are *NOT* granted except by prior
  14. arrangement and written consent of the copyright holders.
  15. Use of this source code constitutes an agreement not to criticize, in any
  16. way, the code-writing style of the author, including any statements regarding
  17. the extent of documentation and comments present.
  18. The software is provided "AS-IS" and without warranty of ank kind, express,
  19. implied or otherwise, including without limitation, any warranty of
  20. merchantability or fitness for a particular purpose.
  21. In no event shall Stanford University or the authors be liable for any special,
  22. incudental, indirect or consequential damages of any kind, or any damages
  23. whatsoever resulting from loss of use, data or profits, whether or not
  24. advised of the possibility of damage, and on any theory of liability,
  25. arising out of or in connection with the use or performance of this software.
  26. This code was written using Borland C++ Builder 4 (Inprise Inc., www.inprise.com)
  27. and may be subject to certain additional restrictions as a result.
  28. */
  29. //---------------------------------------------------------------------------
  30. #include <vcl.h>
  31. #include <dir.h>
  32. #pragma hdrstop
  33. #include "TreeViewMain.h"
  34. #include "LoadingForm.h"
  35. #include "Options.h"
  36. #include "URLLabel.h"
  37. #include "Find.h"
  38. #include "treeviewhelp.h"
  39. #include "treeviewabout.h"
  40. #include "Splash.h"
  41. #include "SavePSAll.h"
  42. #include "SaveNodeForm.h"
  43. #include "URLMemo.h"
  44. //---------------------------------------------------------------------------
  45. #pragma package(smart_init)
  46. #pragma resource "*.dfm"
  47. TTreeViewMainForm *TreeViewMainForm;
  48. //---------------------------------------------------------------------------
  49. __fastcall TTreeViewMainForm::TTreeViewMainForm(TComponent* Owner)
  50.     : TForm(Owner)
  51. {
  52.     //TSplashForm *Splash = new TSplashForm(this);
  53.     //Splash->ShowModal();
  54.     Version = "1.47";
  55.     try
  56.     {
  57.         NMHTTP1->Get("http://rana.stanford.edu/software/treeviewversion.html");
  58.     }
  59.     catch (Exception &E)
  60.     {
  61.     }
  62.     if (AnsiString(NMHTTP1->Body) != "")
  63.     {
  64.         if (Version != (AnsiString(NMHTTP1->Body)).SubString(0,Version.Length()) )
  65.         {
  66.             TreeViewMainForm->Caption = "Tree View - Version " + AnsiString(NMHTTP1->Body) +
  67.                 " now available at http://rana.stanford.edu/software";
  68.         }
  69.         else
  70.         {
  71.             TreeViewMainForm->Caption = "Tree View";
  72.         }
  73.     }
  74.     else
  75.     {
  76.         TreeViewMainForm->Caption = "Tree View - Check for updates http://rana.stanford.edu/software";
  77.     }
  78. //  TGeneCluster is the class for all expression data and tree data
  79.     Cluster = new TGeneCluster();
  80. //  Default pixel size for each datapoint in small image
  81.     ImageScaleX        = 3;
  82.     ImageScaleY        = 3;
  83.     ZoomImageScaleX    = 12;
  84.     ZoomImageScaleY    = 12;
  85.     CorrSelectCutoff   = 0.8;
  86.     ImageContrast      = 3;
  87.     MaskVal            = 0;
  88. //  TreeImage->Canvas->Pen->Mode = pmCopy;
  89. /*  The left side is two images
  90.     TreeImage is the image of the tree
  91.     SmallGeneImage is the image of the entire expression data
  92. */
  93. // Default sizes
  94.     OverviewScrollBox->Width = 500;
  95.     OverviewPanel->Width     = OverviewScrollBox->ClientWidth;
  96.     OverviewPanel->Height    = OverviewScrollBox->ClientHeight;
  97.     SmallGeneImage->Width    = 100;
  98.     SmallGeneImage->Left     = OverviewScrollBox->ClientWidth - SmallGeneImage->Width -1;
  99.     TreeImage->Width         = SmallGeneImage->Left - 1;
  100.     //ZoomPanel->Width         = ZoomScrollBox->ClientWidth;
  101.     //ZoomPanel->Height        = ZoomScrollBox->ClientHeight;
  102.     NegativeColor = RGB(0,255,0);
  103.     ZeroColor = RGB(0,0,0);
  104.     PositiveColor = RGB(255,0,0);
  105.     MissingColor = RGB(100,100,100);
  106.     GeneLabels = new TStringList();
  107.     LastIndex = -1;
  108.     URLStrings = new TStringList();
  109.     try
  110.     {
  111.         URLStrings->LoadFromFile("URLStrings.txt");
  112.     }
  113.     catch (Exception &E)
  114.     {
  115.     }
  116.     ArrayTreeSplitter->Visible = false;
  117.     ArrayTreePanel->Height = 0;
  118.     TRegistry *Registry = new TRegistry();
  119.     Registry->RootKey = HKEY_CURRENT_USER;
  120.     Registry->OpenKey("Software\Stanford\TreeView\ImageSettings",true);
  121.     try
  122.     {
  123.         ImageScaleX = Registry->ReadInteger("ImageScaleX");
  124.     }
  125.     catch (Exception &E)
  126.     {
  127.         ImageScaleX = 3;
  128.     }
  129.     try
  130.     {
  131.         ImageScaleY = Registry->ReadInteger("ImageScaleY");
  132.     }
  133.     catch (Exception &E)
  134.     {
  135.         ImageScaleY = 3;
  136.     }
  137.     Registry->CloseKey();
  138.     Registry->OpenKey("Software\Stanford\TreeView\Directory",true);
  139.     try
  140.     {
  141.         OpenDialog1->InitialDir = Registry->ReadString("LastOpenDirectory");
  142.     }
  143.     catch (Exception &E)
  144.     {
  145.     }
  146.     Registry->CloseKey();
  147.     delete Registry;
  148. }
  149. //---------------------------------------------------------------------------
  150. void __fastcall TTreeViewMainForm::FormClose(TObject *Sender,
  151.       TCloseAction &Action)
  152. {
  153.     TRegistry *Registry = new TRegistry();
  154.     Registry->RootKey = HKEY_CURRENT_USER;
  155.     Registry->OpenKey("Software\Stanford\TreeView\ImageSettings",true);
  156.     Registry->WriteInteger("ImageScaleX",ImageScaleX);
  157.     Registry->WriteInteger("ImageScaleY",ImageScaleY);
  158.     Registry->CloseKey();
  159.     Registry->OpenKey("Software\Stanford\TreeView\Directory",true);
  160.     char Drive[3];
  161.     char Dir[260];
  162.     fnsplit(OpenDialog1->FileName.c_str(),Drive,Dir,NULL,NULL);
  163.     AnsiString SaveDir = AnsiString(Drive) + AnsiString(Dir);
  164.     Registry->WriteString("LastOpenDirectory",SaveDir);
  165.     Registry->CloseKey();
  166.     delete Registry;
  167.     delete Cluster;
  168. }
  169. //---------------------------------------------------------------------------
  170. void __fastcall TTreeViewMainForm::TreeImageMouseDown(TObject *Sender,
  171.       TMouseButton Button, TShiftState Shift, int X, int Y)
  172. {
  173.     ResetNode();
  174.     // Set Cluster->BestNode to closest node
  175.     Cluster->Dist(X,Y);
  176.     // Highlight selected node
  177.     MakeZoom();
  178. }
  179. //---------------------------------------------------------------------------
  180. void __fastcall TTreeViewMainForm::ResetNode()
  181. {
  182.     if (Cluster->BestNode != NULL)
  183.     {
  184.         TreeImage->Canvas->Pen->Color = clBlack;
  185.         Cluster->BestNode->Draw(TreeImage, ImageScaleY);
  186.     }
  187. }
  188. void __fastcall TTreeViewMainForm::MakeZoom()
  189. {
  190.     TreeImage->Canvas->Pen->Color = clFuchsia;
  191.     if (Cluster->BestNode != NULL)
  192.     {
  193.         Cluster->BestNode->Draw(TreeImage, ImageScaleY);
  194.         NodeBarcodeImage->Height = ZoomImageScaleY + 2;
  195.         Cluster->BestNode->MakeBarcode(NodeBarcodeImage,ZoomImageScaleX,
  196.             ZoomImageScaleY,ImageContrast,
  197.             PositiveColor,ZeroColor,NegativeColor,MissingColor);
  198.     }
  199.     else
  200.     {
  201.         NodeBarcodeImage->Height = 0;
  202.     }
  203.     ZoomBoxShape->Left    = SmallGeneImage->Left;
  204.     ZoomBoxShape->Width   = SmallGeneImage->Width;
  205.     ZoomBoxShape->Top     = (ImageScaleY * Cluster->MinCoor) - 2;
  206.     ZoomBoxShape->Height  = (ImageScaleY * (Cluster->MaxCoor - Cluster->MinCoor + 1)) + 4;
  207.     TRect CopyRect, DrawRect;
  208.     // CopyRect is rectangle in unscaled SmallImage
  209.     CopyRect.Left   = 0;
  210.     CopyRect.Right  = Cluster->Columns;
  211.     CopyRect.Top    = Cluster->MinCoor;
  212.     CopyRect.Bottom = Cluster->MaxCoor + 1;
  213.     CentralPanel->Width  = Cluster->Columns * ZoomImageScaleX;
  214.     CentralPanel->Height = (Cluster->MaxCoor - Cluster->MinCoor + 1) * ZoomImageScaleY
  215.         + ArrayLabelImage->Height + ArrayTreeImage->Height + NodeBarcodeImage->Height + 10;
  216.     if (CentralScrollBox->ClientWidth > CentralPanel->Width)
  217.     {
  218.         CentralScrollBox->ClientWidth = CentralPanel->Width;
  219.     }
  220.     ZoomImage->Height = ZoomPanel->Height;
  221.     ZoomImage->Width  = ZoomPanel->Width;
  222.     ZoomImage->Top = 0;
  223.     ZoomImage->Left = 0;
  224.     ZoomImage->Picture->Bitmap->Height = ZoomImage->Height;
  225.     ZoomImage->Picture->Bitmap->Width  = ZoomImage->Width;
  226.     OuterLabelPanel->Top = ZoomPanel->ClientOrigin.y - LabelScrollBox->ClientOrigin.y;
  227.     OuterLabelPanel->Height = ZoomPanel->Height;
  228.     LabelPanel->Height = ZoomPanel->Height;
  229.     LabelPanel->Top = 0;
  230.     DrawRect.Top    = 0;
  231.     DrawRect.Left   = 0;
  232.     DrawRect.Right  = Cluster->Columns * ZoomImageScaleX;
  233.     DrawRect.Bottom = (Cluster->MaxCoor - Cluster->MinCoor + 1) * ZoomImageScaleY;
  234.     ZoomImage->Canvas->Brush->Style = bsSolid;
  235.     ZoomImage->Canvas->Brush->Color = clWhite;
  236.     ZoomImage->Canvas->FillRect(ZoomImage->ClientRect);
  237.     ZoomImage->Canvas->CopyMode = cmSrcCopy;
  238.     ZoomImage->Canvas->CopyRect(DrawRect,SmallGeneImage->Canvas,CopyRect);
  239.     // Label Names
  240.     int i;
  241.     ZoomImage->Canvas->Brush->Style = bsClear;  //clear the canvas brush
  242.     ZoomImage->Canvas->Font = ZoomFontDialog->Font;
  243.     ZoomImage->Canvas->Font->Height = - ZoomImageScaleY;
  244.     for (i=0;i<GeneLabels->Count;i++)
  245.     {
  246.         delete GeneLabels->Objects[i];
  247.     }
  248.     GeneLabels->Clear();
  249.     int index;
  250.     TURLLabel *URLLabel;
  251.     int urlindex;
  252.     int MaxLength = 0;
  253.     for (i=Cluster->MinCoor;i<=Cluster->MaxCoor;i++)
  254.     {
  255.         index = GeneLabels->Add(i);
  256.         GeneLabels->Objects[index] = new TURLLabel(this);
  257.         URLLabel = (TURLLabel *) GeneLabels->Objects[index];
  258.         URLLabel->Parent = LabelPanel;
  259.         URLLabel->Visible = true;
  260.         URLLabel->Enabled = true;
  261.         URLLabel->Font = ZoomImage->Canvas->Font;
  262.         URLLabel->Font->Height = ZoomImage->Canvas->Font->Height;
  263.         URLLabel->Top =
  264.             ((i - Cluster->MinCoor) * ZoomImageScaleY);
  265.         URLLabel->Left = 5;
  266.         URLLabel->Width = ClientWidth - LabelPanel->Left;
  267.         URLLabel->Handle = Handle;
  268.         URLLabel->Caption =
  269.             //AnsiString(((TGeneTreeNode *)Cluster->Genes->Objects[i])->Weight) + " "  +
  270.             ((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->Name;
  271.         MaxLength = max(MaxLength,URLLabel->Caption.Length());
  272.         urlindex = URLStrings->IndexOfName(Cluster->UniqueID);
  273.         if ( urlindex > -1)
  274.         {
  275.             AnsiString URL = URLStrings->Values[Cluster->UniqueID];
  276.             AnsiString OldPattern = "UNIQID";
  277.             AnsiString NewPattern = ((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->ID;
  278.             TReplaceFlags flags;
  279.             flags << rfReplaceAll;
  280.             URLLabel->URL = StringReplace(URL,OldPattern,NewPattern, flags);
  281.         }
  282.     }
  283.     LabelPanel->Width = abs(MaxLength *  ZoomImage->Canvas->Font->Height) + 20;
  284.     OuterLabelPanel->Width = LabelPanel->Width;
  285.     if (Cluster->BestNode != NULL)
  286.     {
  287.        TreeViewMainForm->Caption =
  288.         AnsiString("Tree View --- CurrentNode ") + AnsiString(Cluster->BestNode->Data->ID)
  289.         + " --- Correlation " + AnsiString(Cluster->BestNode->Corr);
  290.     }
  291.     else
  292.     {
  293.         TreeViewMainForm->Caption = AnsiString("TreeView");
  294.     }
  295. }
  296. void __fastcall TTreeViewMainForm::MakeArrayLabels()
  297. {
  298.     int i,j;
  299.     ArrayLabelImage->Canvas->Brush->Style = bsSolid;
  300.     ArrayLabelImage->Canvas->Brush->Color = clWhite;
  301.     ArrayLabelImage->Canvas->FillRect(ArrayLabelImage->ClientRect);
  302.     ArrayLabelImage->Canvas->Font =  ZoomFontDialog->Font;
  303.     ArrayLabelImage->Canvas->Font->Height = - ZoomImageScaleX;
  304.     ArrayLabelImage->Canvas->Font->Color = clBlack;
  305.     ArrayLabelImage->Canvas->Pen->Color = clBlack;
  306.     LOGFONT lf;
  307.     GetObject(ArrayLabelImage->Canvas->Font->Handle,
  308.     sizeof (LOGFONT),           //size of LOGFONT
  309.     &lf);
  310.     lf.lfEscapement =  900;     //set to 450 to make 45 degree angle
  311.     lf.lfOrientation = 900;
  312.     lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
  313.     ArrayLabelImage->Canvas->Font->Handle = CreateFontIndirect (&lf);
  314.     for (j=0;j<Cluster->Columns;j++)
  315.     {
  316.         ArrayLabelImage->Canvas->TextOut((j*ZoomImageScaleX), ArrayLabelImage->Height, Cluster->Arrays->Strings[j]);
  317.     }
  318. }
  319. void __fastcall TTreeViewMainForm::MakeArrayTree()
  320. {
  321.     if (Cluster->TopArrayNode != NULL)
  322.     {
  323.         ArrayTreeSplitter->Visible = true;
  324.         if (ArrayTreePanel->Height == 0)
  325.         {
  326.             ArrayTreePanel->Height = 100;
  327.             ArrayTreeImage->Height = 0;
  328.         }
  329.         ArrayTreeImage->Canvas->Brush->Style = bsSolid;
  330.         ArrayTreeImage->Canvas->Brush->Color = clWhite;
  331.         ArrayTreeImage->Canvas->FillRect(ArrayTreeImage->ClientRect);
  332.         Cluster->TopArrayNode->Draw(ArrayTreeImage, ZoomImageScaleX);
  333.     }
  334.     else
  335.     {
  336.         ArrayTreeSplitter->Visible = false;
  337.         ArrayTreePanel->Height = 0;
  338.         ArrayTreeImage->Height = 0;
  339.     }
  340. }
  341. //---------------------------------------------------------------------------
  342. void __fastcall TTreeViewMainForm::Splitter2Moved(TObject *Sender)
  343. {
  344.     Redo();
  345. }
  346. void __fastcall TTreeViewMainForm::Redo()
  347. {
  348.     //OverviewPanel->Width    = OverviewScrollBox->ClientWidth;
  349.     OverviewPanel->Height   = SmallGeneImage->Height;
  350.     CentralPanel->Width = Cluster->Columns * ZoomImageScaleX;
  351.     if (Cluster->TopNode != NULL)
  352.     {
  353.         //SmallGeneImage->Left    = max(100,OverviewScrollBox->ClientWidth - SmallGeneImage->Width - 1);
  354.         SmallGeneImage->Left    = max(50,SmallGeneImage->Left);
  355.         OverviewPanel->Width    = max(SmallGeneImage->Left + SmallGeneImage->Width,
  356.             OverviewScrollBox->ClientWidth);
  357.         TreeImage->Width        = SmallGeneImage->Left;
  358.         TreeImage->Height       = SmallGeneImage->Height;
  359.         TreeImage->Picture->Bitmap->Width  = TreeImage->Width;
  360.         TreeImage->Picture->Bitmap->Height = SmallGeneImage->Height;
  361.     }
  362.     else
  363.     {
  364.         TreeImage->Width = 0;
  365.         OverviewScrollBox->ClientWidth = SmallGeneImage->Width;
  366.         OverviewPanel->Width = max(SmallGeneImage->Width,OverviewScrollBox->ClientWidth);
  367.         SmallGeneImage->Left = 0;
  368.     }
  369.     TreeImage->Canvas->FillRect(TreeImage->ClientRect);
  370. //    SmallGeneImage->Left    = TreeImage->Width;
  371.     if (Cluster->Loaded)
  372.     {
  373.         if (Cluster->TopArrayNode != NULL)
  374.         {
  375.             Cluster->TopArrayNode->SetCoor();
  376.         }
  377.         TreeImage->Canvas->Pen->Color = clBlack;
  378.         if (Cluster->TopNode != NULL)
  379.         {
  380.             Cluster->TopNode->SetCoor();
  381.             Cluster->TopNode->Draw(TreeImage, ImageScaleY);
  382.         }
  383.         MakeArrayTree();
  384.         MakeArrayLabels();
  385.         ZoomBoxShape->Left    = SmallGeneImage->Left;
  386.         ZoomBoxShape->Width   = SmallGeneImage->Width;
  387.         ZoomBoxShape->Top     = (ImageScaleY * Cluster->MinCoor) - 2;
  388.         ZoomBoxShape->Height  = (ImageScaleY * (Cluster->MaxCoor - Cluster->MinCoor + 1)) + 4;
  389.         // Highlight selected node
  390.         if (Cluster->BestNode != NULL)
  391.         {
  392.             TreeImage->Canvas->Pen->Color = clFuchsia;
  393.             Cluster->BestNode->Draw(TreeImage, ImageScaleY);
  394.         }
  395.     }
  396. }
  397. void __fastcall TTreeViewMainForm::Reset()
  398. {
  399.     OverviewPanel->Height = ImageScaleY * Cluster->Genes->Count;
  400.     Cluster->MakeThumbnail(SmallGeneImage,ImageScaleX,ImageScaleY,ImageContrast,MaskVal,
  401.         PositiveColor,ZeroColor,NegativeColor,MissingColor);
  402.     Redo();
  403. }
  404. //---------------------------------------------------------------------------
  405. void __fastcall TTreeViewMainForm::Splitter1Moved(TObject *Sender)
  406. {
  407. //    OverviewPanel->Width = OverviewScrollBox->ClientWidth;
  408. //    SmallGeneImage->Left  = max(50,OverviewScrollBox->ClientWidth - SmallGeneImage->Width -1);
  409.     Redo();
  410. }
  411. //---------------------------------------------------------------------------
  412. void __fastcall TTreeViewMainForm::Load1Click(TObject *Sender)
  413. {
  414.      int i;
  415.     if (OpenDialog1->Execute())
  416.     {
  417.         for (i=0;i<ControlCount;i++)
  418.         {
  419.             if (Controls[i]->Width == 0)
  420.             {
  421.                Controls[i]->Width = 25;
  422.             }
  423.             if (Controls[i]->Width == 0)
  424.             {
  425.                Controls[i]->Height = 25;
  426.             }
  427.         }
  428.         char Drive[3];
  429.         char Dir[260];
  430.         fnsplit(OpenDialog1->FileName.c_str(),Drive,Dir,NULL,NULL);
  431.         OpenDialog1->InitialDir = AnsiString(Drive) + AnsiString(Dir);
  432.         //Loading->Show();
  433.         //TCursor SaveCursor = Screen->Cursor;
  434.         Application->Minimize();
  435.         Application->ProcessMessages();
  436.         //Screen->Cursor = crHourGlass;
  437.         if (Cluster != NULL)
  438.         {
  439.             delete Cluster;
  440.             Cluster = new TGeneCluster();
  441.         }
  442.         else
  443.         {
  444.             Cluster = new TGeneCluster();
  445.         }
  446.         try
  447.         {
  448.             ImageContrast = 2 * Cluster->Load(OpenDialog1->FileName);
  449.             OptionsForm->ImageContrastEdit->Text = ImageContrast;
  450.             OverviewPanel->Height = ImageScaleY * Cluster->Genes->Count;
  451.             Cluster->MakeThumbnail(SmallGeneImage,ImageScaleX,ImageScaleY,ImageContrast,MaskVal,
  452.                 PositiveColor,ZeroColor,NegativeColor,MissingColor);
  453.             Redo();
  454.             //Screen->Cursor = SaveCursor;
  455.             //Loading->Close();
  456.         }
  457.         catch (Exception &E)
  458.         {
  459.         }
  460.         Application->Restore();
  461.     }
  462. }
  463. //---------------------------------------------------------------------------
  464. void __fastcall TTreeViewMainForm::Options1Click(TObject *Sender)
  465. {
  466.     OptionsForm->ShowModal();
  467.     SmallGeneImage->Width  = Cluster->Columns * ImageScaleX;
  468.     SmallGeneImage->Height = Cluster->Rows    * ImageScaleY;
  469.     Redo();
  470. }
  471. //---------------------------------------------------------------------------
  472. void __fastcall TTreeViewMainForm::SmallGeneImageMouseDown(TObject *Sender,
  473.       TMouseButton Button, TShiftState Shift, int X, int Y)
  474. {
  475.     Dragging = true;
  476.     DragRect.Top = Y;
  477.     DragRect.Bottom = Y;
  478.     ZoomBoxShape->Top = DragRect.Top - 2;
  479.     ZoomBoxShape->Height = DragRect.Bottom - DragRect.Top + 4;
  480. }
  481. //---------------------------------------------------------------------------
  482. void __fastcall TTreeViewMainForm::SmallGeneImageMouseMove(TObject *Sender,
  483.       TShiftState Shift, int X, int Y)
  484. {
  485.     if (Dragging)
  486.     {
  487.         DragRect.Bottom = Y;
  488.         ZoomBoxShape->Height = DragRect.Bottom - DragRect.Top + 4;
  489.     }
  490. }
  491. //---------------------------------------------------------------------------
  492. void __fastcall TTreeViewMainForm::SmallGeneImageMouseUp(TObject *Sender,
  493.       TMouseButton Button, TShiftState Shift, int X, int Y)
  494. {
  495.     if (Dragging)
  496.     {
  497.         DragRect.Bottom = Y;
  498.         if (DragRect.Bottom < DragRect.Top)
  499.         {
  500.            int Hold = DragRect.Top;
  501.            DragRect.Top = DragRect.Bottom;
  502.            DragRect.Bottom = Hold;
  503.         }
  504.         if (DragRect.Right < DragRect.Left)
  505.         {
  506.            int Hold = DragRect.Left;
  507.            DragRect.Left = DragRect.Right;
  508.            DragRect.Right = Hold;
  509.         }
  510.         DragRect.Top = max((int)DragRect.Top,0);
  511.         ZoomBoxShape->Height = DragRect.Bottom - DragRect.Top + 4;
  512.         Dragging = false;
  513.     }
  514.     if (Cluster->BestNode != NULL)
  515.     {
  516.         TreeImage->Canvas->Pen->Color = clBlack;
  517.         Cluster->BestNode->Draw(TreeImage, ImageScaleY);
  518.     }
  519.     Cluster->Include(DragRect.Top/ImageScaleY, min(Cluster->Rows-1,(int)(DragRect.Bottom/ImageScaleY)));
  520.     MakeZoom();
  521. }
  522. //---------------------------------------------------------------------------
  523. void __fastcall TTreeViewMainForm::FormKeyDown(TObject *Sender, WORD &Key,
  524.       TShiftState Shift)
  525. {
  526.     if ( (Key > 36) && (Key <41) )
  527.     {
  528.         ResetNode();
  529.         switch (Key)
  530.         {
  531.             case 37:
  532.                 if (Cluster->BestNode->IsNode)
  533.                 {
  534.                     Cluster->BestNode = Cluster->BestNode->Child1;
  535.                     MakeZoom();
  536.                 }
  537.                 break;
  538.             case 38:
  539.                 if (Cluster->BestNode != Cluster->TopNode)
  540.                 {
  541.                     Cluster->BestNode = Cluster->BestNode->Parent;
  542.                     MakeZoom();
  543.                 }
  544.                 break;
  545.             case 39:
  546.                 if (Cluster->BestNode->IsNode)
  547.                 {
  548.                     Cluster->BestNode = Cluster->BestNode->Child2;
  549.                     MakeZoom();
  550.                 }
  551.                 break;
  552.             case 40:
  553.                 while (Cluster->BestNode->Corr > CorrSelectCutoff)
  554.                 {
  555.                     Cluster->BestNode = Cluster->BestNode->Parent;
  556.                 }
  557.                 MakeZoom();
  558.                 break;
  559.             default:
  560.             break;
  561.         }
  562.     }
  563.     if (Key == VkKeyScan('n'))
  564.     {
  565.        //NoteForm->Show();
  566.     }
  567. }
  568. //---------------------------------------------------------------------------
  569. void __fastcall TTreeViewMainForm::SaveTreeImage1Click(
  570.       TObject *Sender)
  571. {
  572.     if (SaveDialog1->Execute())
  573.     {
  574.         TreeImage->Picture->Bitmap->PixelFormat = 6;
  575.         TreeImage->Picture->Bitmap->SaveToFile(SaveDialog1->FileName);
  576.     }
  577. }
  578. //---------------------------------------------------------------------------
  579. void __fastcall TTreeViewMainForm::SaveThumbnailImage1Click(
  580.       TObject *Sender)
  581. {
  582.     if (SaveDialog1->Execute())
  583.     {
  584.         SmallGeneImage->Picture->Bitmap->PixelFormat = 6;
  585.         SmallGeneImage->Picture->Bitmap->SaveToFile(SaveDialog1->FileName);
  586.     }
  587. }
  588. //---------------------------------------------------------------------------
  589. void __fastcall TTreeViewMainForm::SaveZoomedImage1Click(TObject *Sender)
  590. {
  591.     if (Cluster->BestNode != NULL)
  592.     {
  593.        char FileRoot[100];
  594.        fnsplit(OpenDialog1->FileName.c_str(),NULL,NULL,FileRoot,NULL);
  595.        SaveDialog1->FileName = AnsiString(FileRoot) + "_" + Cluster->BestNode->Data->ID
  596.             + ".bmp";
  597.     }
  598.     if (SaveDialog1->Execute())
  599.     {
  600.         Graphics::TBitmap *WholeZoomImage = new Graphics::TBitmap();
  601.         WholeZoomImage->PixelFormat = 6;
  602.         WholeZoomImage->Width = ZoomImage->Width + LabelPanel->Width;
  603.         WholeZoomImage->Height = ArrayTreeImage->Height +
  604.             ArrayLabelImage->Height +
  605.             NodeBarcodeImage->Height +
  606.             ZoomImage->Height;
  607.         WholeZoomImage->Height += 20;
  608.         WholeZoomImage->Canvas->CopyMode = cmSrcCopy;
  609.         TRect DestRect;
  610.         DestRect.Top    = 0;
  611.         DestRect.Left   = 0;
  612.         DestRect.Right  = ArrayTreeImage->ClientWidth;
  613.         DestRect.Bottom = ArrayTreeImage->ClientHeight;
  614.         WholeZoomImage->Canvas->CopyRect(DestRect,ArrayTreeImage->Canvas,ArrayTreeImage->ClientRect);
  615.         DestRect.Top    = DestRect.Bottom + 3;
  616.         DestRect.Left   = 0;
  617.         DestRect.Right  = ArrayLabelImage->ClientWidth;
  618.         DestRect.Bottom = DestRect.Top + ArrayLabelImage->ClientHeight;
  619.         WholeZoomImage->Canvas->CopyRect(DestRect,ArrayLabelImage->Canvas,ArrayLabelImage->ClientRect);
  620.         DestRect.Top    = DestRect.Bottom + 3;
  621.         DestRect.Left   = 0;
  622.         DestRect.Right  = NodeBarcodeImage->ClientWidth;
  623.         DestRect.Bottom = DestRect.Top + NodeBarcodeImage->ClientHeight;
  624.         WholeZoomImage->Canvas->CopyRect(DestRect,NodeBarcodeImage->Canvas,NodeBarcodeImage->ClientRect);
  625.         DestRect.Top    = DestRect.Bottom + 3;
  626.         DestRect.Left   = 0;
  627.         DestRect.Right  = ZoomImage->ClientWidth;
  628.         DestRect.Bottom = DestRect.Top + ZoomImage->ClientHeight;
  629.         WholeZoomImage->Canvas->CopyRect(DestRect,ZoomImage->Canvas,ZoomImage->ClientRect);
  630.         DestRect.Left   = DestRect.Right;
  631.         DestRect.Right  = DestRect.Left + LabelPanel->ClientWidth;
  632.         //WholeZoomImage->Canvas->CopyRect(DestRect,LabelPanel->Canvas,LabelPabel->ClientRect);
  633.         int i,X,Y;
  634.         for (i=Cluster->MinCoor;i<=Cluster->MaxCoor;i++)
  635.         {
  636.             WholeZoomImage->Canvas->Font = ZoomFontDialog->Font;
  637.             WholeZoomImage->Canvas->Font->Height = - ZoomImageScaleY;
  638.             Y = DestRect.Top + ((i - Cluster->MinCoor) * ZoomImageScaleY);
  639.             X = DestRect.Left + 5;
  640.             WholeZoomImage->Canvas->TextOut(X,Y,((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->Name);
  641.         }
  642.         WholeZoomImage->SaveToFile(SaveDialog1->FileName);
  643.         delete WholeZoomImage;
  644.     }
  645. }
  646. //---------------------------------------------------------------------------
  647. void __fastcall TTreeViewMainForm::ZoomScrollBoxClick(TObject *Sender)
  648. {
  649.     //GeneInfoForm->Show();
  650.     //GeneInfoForm->Repaint();
  651. }
  652. //---------------------------------------------------------------------------
  653. void __fastcall TTreeViewMainForm::Find(AnsiString FindString)
  654. {
  655.     int index = -1;
  656.     int i;
  657.     if ( (FindString.SubString(1,4) == "NODE") && (Cluster->TopNode != NULL) )
  658.     {
  659.         TGeneTreeNode *MatchedNode = Cluster->TopNode->FindNode(FindString);
  660.         if (MatchedNode != NULL)
  661.         {
  662.             ResetNode();
  663.             Cluster->BestNode = MatchedNode;
  664.             Cluster->BestNode->Limits(&Cluster->MinCoor,&Cluster->MaxCoor);
  665.             MakeZoom();
  666.             //TreeViewMainForm->Caption = "Gene Tree View " + Cluster->BestNode->Data->ID + " " + AnsiString(Cluster->BestNode->Corr);
  667.         }
  668.     }
  669.     else
  670.     {
  671.         for (i=LastIndex+1;i<Cluster->GeneNames->Count;i++)
  672.         {
  673.             if ((Cluster->GeneNames->Strings[i].UpperCase()).Pos(FindString.UpperCase()) > 0)
  674.             {
  675.                index = i;
  676.                i = Cluster->GeneNames->Count;
  677.             }
  678.         }
  679.         if (index > -1)
  680.         {
  681.            if (Cluster->BestNode != NULL)
  682.            {
  683.               TreeImage->Canvas->Pen->Color = clBlack;
  684.               Cluster->BestNode->Draw(TreeImage, ImageScaleY);
  685.            }
  686.            Cluster->MinCoor = index;
  687.            Cluster->MaxCoor = index;
  688.            Cluster->Include(index, index);
  689.            MakeZoom();
  690.         }
  691.         LastIndex = index;
  692.     }
  693.     SetOverviewScrollPos();
  694. }
  695. void __fastcall TTreeViewMainForm::Gene1Click(TObject *Sender)
  696. {
  697.     FindForm->Show();
  698. }
  699. //---------------------------------------------------------------------------
  700. void __fastcall TTreeViewMainForm::Help1Click(TObject *Sender)
  701. {
  702.     HelpForm->Show();
  703. }
  704. //---------------------------------------------------------------------------
  705. void __fastcall TTreeViewMainForm::About1Click(TObject *Sender)
  706. {
  707.     AboutForm->Show();
  708. }
  709. //---------------------------------------------------------------------------
  710. void __fastcall TTreeViewMainForm::ArrayTreeSplitterMoved(TObject *Sender)
  711. {
  712.     MakeArrayTree();
  713.     LabelPanel->Top = ArrayLabelImage->Height + ArrayLabelSplitter->Height +
  714.         ArrayTreeImage->Height + ArrayTreeSplitter->Height;
  715. }
  716. //---------------------------------------------------------------------------
  717. void __fastcall TTreeViewMainForm::ArrayLabelSplitterMoved(TObject *Sender)
  718. {
  719.     MakeArrayLabels();
  720.     OuterLabelPanel->Top = ArrayLabelImage->Height + ArrayLabelSplitter->Height +
  721.         ArrayTreeImage->Height + ArrayTreeSplitter->Height;
  722. }
  723. //---------------------------------------------------------------------------
  724. void __fastcall TTreeViewMainForm::ArrayTreePanelResize(TObject *Sender)
  725. {
  726.     ArrayTreeImage->Picture->Bitmap->Width = ArrayTreePanel->Width;
  727.     ArrayTreeImage->Picture->Bitmap->Height = ArrayTreePanel->Height;
  728. }
  729. //---------------------------------------------------------------------------
  730. void __fastcall TTreeViewMainForm::ArrayLabelPanelResize(TObject *Sender)
  731. {
  732.     ArrayLabelImage->Picture->Bitmap->Width = ArrayLabelPanel->Width;
  733.     ArrayLabelImage->Picture->Bitmap->Height = ArrayLabelPanel->Height;
  734. }
  735. //---------------------------------------------------------------------------
  736. void __fastcall TTreeViewMainForm::ScrollBar1Change(TObject *Sender)
  737. {
  738.     //CentralPanel->Top = -ScrollBar1->Position;
  739.     ZoomImage->Top = -ScrollBar1->Position;
  740.     LabelPanel->Top = -ScrollBar1->Position;
  741. }
  742. //---------------------------------------------------------------------------
  743. void __fastcall TTreeViewMainForm::CentralPanelResize(TObject *Sender)
  744. {
  745.     if (CentralPanel->Height > CentralScrollBox->ClientHeight)
  746.     {
  747.         ScrollBar1->Visible = true;
  748.         ScrollBar1->Min =  0;
  749.         ScrollBar1->Max =  CentralPanel->Height -CentralScrollBox->ClientHeight;
  750.     }
  751.     else
  752.     {
  753.         ScrollBar1->Visible = false;
  754.     }
  755. }
  756. //---------------------------------------------------------------------------
  757. void __fastcall TTreeViewMainForm::Splitter3Moved(TObject *Sender)
  758. {
  759.     SmallGeneImage->Left = Splitter3->Left + Splitter3->Width;
  760.     Redo();
  761. }
  762. //---------------------------------------------------------------------------
  763. void __fastcall TTreeViewMainForm::SaveList1Click(TObject *Sender)
  764. {
  765.     if (Cluster->BestNode != NULL)
  766.     {
  767.        char FileRoot[100];
  768.        fnsplit(OpenDialog1->FileName.c_str(),NULL,NULL,FileRoot,NULL);
  769.        SaveListDialog->FileName = AnsiString(FileRoot) + "_" + Cluster->BestNode->Data->ID
  770.             + ".txt";
  771.     }
  772.     if (SaveListDialog->Execute())
  773.     {
  774.         int i;
  775.         TStringList *IDList = new TStringList();
  776.         for (i=Cluster->MinCoor;i<=Cluster->MaxCoor;i++)
  777.         {
  778.             AnsiString ID =
  779.                 ((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->ID;
  780.             IDList->Add(ID);
  781.         }
  782.         IDList->SaveToFile(SaveListDialog->FileName);
  783.         delete IDList;
  784.     }
  785. }
  786. //---------------------------------------------------------------------------
  787. void __fastcall TTreeViewMainForm::SaveData1Click(TObject *Sender)
  788. {
  789.     if (Cluster->BestNode != NULL)
  790.     {
  791.        char FileRoot[100];
  792.        fnsplit(OpenDialog1->FileName.c_str(),NULL,NULL,FileRoot,NULL);
  793.        SaveDataDialog->FileName = AnsiString(FileRoot) + "_" + Cluster->BestNode->Data->ID
  794.             + ".txt";
  795.     }
  796.     if (SaveDataDialog->Execute())
  797.     {
  798.         int i,j;
  799.         TStringList *DataList = new TStringList();
  800.         AnsiString Line;
  801.         Line = Cluster->UniqueID + "tNAME";
  802.         if (Cluster->UniqueID == "ID")
  803.         {
  804.             Line = "UIDtNAME";
  805.         }
  806.         
  807.         for (j=0;j<Cluster->Columns;j++)
  808.         {
  809.             Line += "t" +
  810.             Cluster->Arrays->Strings[j];
  811.         }
  812.         DataList->Add(Line);
  813.         for (i=Cluster->MinCoor;i<=Cluster->MaxCoor;i++)
  814.         {
  815.             Line =
  816.                 ((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->ID +
  817.                 "t" +
  818.                 ((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->Name;
  819.                 for (j=0;j<Cluster->Columns;j++)
  820.                 {
  821.                     Line += "t";
  822.                     if (((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->Mask[j])
  823.                     {
  824.                         Line += AnsiString(((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->Data[j]);
  825.                     }
  826.                 }
  827.             DataList->Add(Line);
  828.         }
  829.         DataList->SaveToFile(SaveDataDialog->FileName);
  830.         delete DataList;
  831.     }
  832. }
  833. void __fastcall TTreeViewMainForm::MakeSimplePS()
  834. {
  835. if (SavePSDialog->Execute())
  836. {
  837. TStringList *File = new TStringList();
  838. //
  839. // PostScript Header
  840. //
  841. File->Add("%!PS-Adobe-3.0");
  842. File->Add("%%Creator: GeneClust1.0");
  843. File->Add("%%CreationDate: Fri Jul 31 12:35:39 1998");
  844. File->Add("%%Pages: (atend)");
  845. File->Add("%%EndComments");
  846. File->Add("%%BeginSetup");
  847. File->Add("/ln { newpath moveto lineto stroke closepath } bind def");
  848. File->Add("/tx { newpath moveto show closepath } bind def");
  849. File->Add("/sl { setlinewidth } def");
  850. File->Add("/sc { setlinecap } def");
  851. File->Add("/sr { setrgbcolor } def");
  852. File->Add("/sf { exch findfont exch scalefont setfont } def");
  853. File->Add("/tr { translate } def");
  854. File->Add("/sp { 1 sc 1 sl 0.0 0.0 0.0 sr 18.00000 13.00000 tr 0.96000 0.98205 scale tr } def");
  855. AnsiString Temp = "/fillbox {newpath moveto " +
  856.     AnsiString(ZoomImageScaleX) + " 0 rlineto 0 " +
  857.     AnsiString(ZoomImageScaleY) + " rlineto -" +
  858.     AnsiString(ZoomImageScaleX) + " 0 rlineto closepath fill} def";
  859. File->Add(Temp);
  860. File->Add("%%EndSetup");
  861. File->Add("%%Page: tree 1");
  862. File->Add("%%PageResources: (atend)");
  863. File->Add("%%BeginPageSetup");
  864. File->Add("/pgsave save def");
  865. File->Add("%%EndPageSetup");
  866. File->Add("0 setlinewidth");
  867. File->Add("/Courier findfont");
  868. Temp =  AnsiString(ZoomImageScaleY) + " scalefont";
  869. File->Add(Temp);
  870. File->Add("setfont");
  871. int i,j,x,y;
  872. double Red, Green, Blue, Val;
  873. AnsiString Name;
  874. for (i=Cluster->MinCoor;i<=Cluster->MaxCoor;i++)
  875. {
  876.     Name =
  877.         ((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->Name;
  878.         TReplaceFlags Flags;
  879.         Flags << rfReplaceAll;
  880.         Name = StringReplace(Name,"(","",Flags);
  881.         Name = StringReplace(Name,")","",Flags);
  882.         for (j=0;j<Cluster->Columns;j++)
  883.         {
  884.             x = j * ZoomImageScaleX;
  885.             y = (i - Cluster->MinCoor) * ZoomImageScaleY;
  886.             if (((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->Mask[j])
  887.             {
  888.                 Red = 0.0;
  889.                 Green = 0.0;
  890.                 Blue = 0.0;
  891.                 Val = ((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->Data[j];
  892.                 if (Val > 0)
  893.                 {
  894.                     Red = max(min(1.0,Val / ImageContrast),0.0);
  895.                 }
  896.                 else
  897.                 {
  898.                     Green =  max(min(1.0,-Val / ImageContrast),0.0);
  899.                 }
  900.             }
  901.             else
  902.             {
  903.                 Red = 0.5;
  904.                 Green = 0.5;
  905.                 Blue = 0.5;
  906.             }
  907.                 TFloatFormat Format = ffFixed;
  908.                 AnsiString GreenString = FloatToStrF(Green,Format,6,4);
  909.                 AnsiString RedString = FloatToStrF(Red,Format,6,4);
  910.                 AnsiString BlueString =  FloatToStrF(Blue,Format,6,4);
  911.                 Temp = RedString + " " + GreenString + " " + BlueString
  912.                     + " setrgbcolor";
  913.                 File->Add(Temp);
  914.                 Temp = AnsiString(x) + " " + AnsiString(y) + " fillbox";
  915.                 File->Add(Temp);
  916.         }
  917.         x = ZoomImageScaleX * Cluster->Columns + 10;
  918.         y = (i - Cluster->MinCoor) * ZoomImageScaleY;
  919.         File->Add("0.0 setgray");
  920.         Temp = AnsiString(x) + " " + AnsiString(y) + " moveto";
  921.         File->Add(Temp);
  922.         Temp = "(" + Name + ") show";
  923.         File->Add(Temp);
  924. }
  925. //Temp = "%%BoundingBox: 0 0 " + AnsiString(Cluster->Columns * ZoomImageScaleX + 1000) + AnsiString(" ")
  926. //    + AnsiString(ZoomImageScaleY * (Cluster->MaxCoor - Cluster->MinCoor + 1));
  927. //File->Insert(3,Temp);
  928. File->SaveToFile(SavePSDialog->FileName);
  929. delete File;
  930. }
  931. }
  932. void __fastcall TTreeViewMainForm::SavePSAll(AnsiString PSFileName)
  933. {
  934. int ScaleX, ScaleY;
  935. TGeneTreeNode *Node;
  936. int MinC, MaxC;
  937. if (SavePSAllForm->UseSelectedCheckBox->Checked == true)
  938. {
  939.     Node = Cluster->BestNode;
  940.     MinC = Cluster->MinCoor;
  941.     MaxC = Cluster->MaxCoor;
  942. }
  943. else
  944. {
  945.     Node = Cluster->TopNode;
  946.     MinC = 0;
  947.     MaxC = Cluster->Rows-1;
  948. }
  949. try
  950. {
  951.     ScaleX = SavePSAllForm->XBlockSizeEdit->Text.ToInt();
  952.     ScaleY = SavePSAllForm->YBlockSizeEdit->Text.ToInt();
  953. }
  954. catch (EConvertError &E)
  955. {
  956.     ScaleX = 8;
  957.     ScaleY = 8;
  958. }
  959. int GeneTreeSize   = 200;
  960. int ArrayTreeSize  = 200;
  961. int GeneNameSize   = 0;
  962. int ArrayNameSize  = 0;
  963. double Factor;
  964.     unsigned char *Color;
  965.     Color = new unsigned char[3];
  966.     DWORD DPositiveColor = ColorToRGB(PositiveColor);
  967.     unsigned char *Positive;
  968.     //Positive = new unsigned char[3];
  969.     Positive = (unsigned char *)&DPositiveColor;
  970.     DWORD DZeroColor = ColorToRGB(ZeroColor);
  971.     unsigned char *Zero;
  972.     //Zero = new unsigned char[3];
  973.     Zero = (unsigned char *)&DZeroColor;
  974.     DWORD DNegativeColor = ColorToRGB(NegativeColor);
  975.     unsigned char *Negative;
  976.     //Negative = new unsigned char[3];
  977.     Negative = (unsigned char *)&DNegativeColor;
  978.     DWORD DMissingColor = ColorToRGB(MissingColor);
  979.     unsigned char *Missing;
  980.     //Missing = new unsigned char[3];
  981.     Missing = (unsigned char *)&DMissingColor;
  982. TStringList *File = new TStringList();
  983. //
  984. // PostScript Header
  985. //
  986. File->Add("%!PS-Adobe-3.0");
  987. File->Add("%%Creator: GeneClust1.0");
  988. File->Add("%%CreationDate: Fri Jul 31 12:35:39 1998");
  989. File->Add("%%Pages: (atend)");
  990. File->Add("%%EndComments");
  991. File->Add("%%BeginSetup");
  992. File->Add("/ln { newpath moveto lineto stroke closepath } bind def");
  993. File->Add("/tx { newpath moveto show closepath } bind def");
  994. File->Add("/sl { setlinewidth } def");
  995. File->Add("/sc { setlinecap } def");
  996. File->Add("/sr { setrgbcolor } def");
  997. File->Add("/sf { exch findfont exch scalefont setfont } def");
  998. File->Add("/tr { translate } def");
  999. File->Add("/sp { 1 sc 1 sl 0.0 0.0 0.0 sr 18.00000 13.00000 tr 0.96000 0.98205 scale tr } def");
  1000. AnsiString Temp = "/fillbox {newpath moveto " +
  1001.     AnsiString(ScaleX) + " 0 rlineto 0 " +
  1002.     AnsiString(ScaleY) + " rlineto -" +
  1003.     AnsiString(ScaleX) + " 0 rlineto closepath fill} def";
  1004. File->Add(Temp);
  1005. File->Add("%%EndSetup");
  1006. File->Add("%%Page: tree 1");
  1007. File->Add("%%PageResources: (atend)");
  1008. File->Add("%%BeginPageSetup");
  1009. File->Add("/pgsave save def");
  1010. File->Add("%%EndPageSetup");
  1011. File->Add("0 setlinewidth");
  1012. File->Add("/Courier findfont");
  1013. Temp =  AnsiString(ScaleY) + " scalefont";
  1014. File->Add(Temp);
  1015. File->Add("setfont");
  1016. // Generate Color Diagram
  1017. int i,j,k,x,y;
  1018. int GeneTreeBuffer = 200;
  1019. double Red, Green, Blue, Val;
  1020. AnsiString Name;
  1021.     float H,S,B;
  1022.     H = 0;
  1023.     S = 1.0;
  1024.     B = 1.0;
  1025.     for (j=0;j<Cluster->Columns;j++)
  1026.     {
  1027.             x = GeneTreeBuffer + j * ScaleX;
  1028.             y = (MaxC-MinC + 2) * ScaleY;
  1029.             if (j < 93)
  1030.             {
  1031.                 H = 0;
  1032.             }
  1033.             else if (j < 154)
  1034.             {
  1035.                 H = 0.2;
  1036.             }
  1037.             else if (j < 167)
  1038.             {
  1039.                 H = 0.4;
  1040.             }
  1041.             else if (j < 227)
  1042.             {
  1043.                 H = 0.6;
  1044.             }
  1045.             else
  1046.             {
  1047.                 H = 0.8;
  1048.             }
  1049.             if (Cluster->Arrays->Strings[j] != "Blank")
  1050.             {
  1051.             TFloatFormat Format     = ffFixed;
  1052.             AnsiString HString  = FloatToStrF(H,Format,6,4);
  1053.             AnsiString SString    = FloatToStrF(S,Format,6,4);
  1054.             AnsiString BString   = FloatToStrF(B,Format,6,4);
  1055.             Temp = HString + " " + SString + " " + BString + " sethsbcolor";
  1056.             File->Add(Temp);
  1057.             Temp = AnsiString(x) + " " + AnsiString(y) + " fillbox";
  1058.             File->Add(Temp);
  1059.             }
  1060.             else
  1061.             {
  1062.             //H += .025;
  1063.             }
  1064.     }
  1065. for (i=0;i<=MaxC-MinC;i++)
  1066. {
  1067.     if (SavePSAllForm->SavePictureCheckBox->Checked == true)
  1068.     {
  1069.         for (j=0;j<Cluster->Columns;j++)
  1070.         {
  1071.             x = GeneTreeBuffer + j * ScaleX;
  1072.             y = (MaxC-MinC - i ) * ScaleY;
  1073.             for (k=0;k<3;k++)
  1074.             {
  1075.                 Color[k] =  Missing[k];
  1076.             }
  1077.             Val = 0;
  1078.             if (((TGeneTreeNode *)Cluster->Genes->Objects[i+MinC])->Data->Mask[j])
  1079.             {
  1080.                 Val = ((TGeneTreeNode *)Cluster->Genes->Objects[i+MinC])->Data->Data[j];
  1081.                 if (Val > 0)
  1082.                 {
  1083.                     Factor =  min(1.0, Val / ImageContrast);
  1084.                     for (k=0;k<3;k++)
  1085.                     {
  1086.                         Color[k] =  Factor * Positive[k] + (1.0 - Factor) * Zero[k];
  1087.                     }
  1088.                 }
  1089.                 else
  1090.                 {
  1091.                     Factor =  min(1.0, -Val / ImageContrast);
  1092.                     for (k=0;k<3;k++)
  1093.                     {
  1094.                         Color[k] =  Factor * Negative[k] + (1.0 - Factor) * Zero[k];
  1095.                     }
  1096.                 }
  1097.             }
  1098.             Red   = (double) Color[0] / 256.0;
  1099.             Green = (double) Color[1] / 256.0;
  1100.             Blue  = (double) Color[2] / 256.0;
  1101.             TFloatFormat Format     = ffFixed;
  1102.             AnsiString GreenString  = FloatToStrF(Green,Format,6,4);
  1103.             AnsiString RedString    = FloatToStrF(Red,Format,6,4);
  1104.             AnsiString BlueString   = FloatToStrF(Blue,Format,6,4);
  1105.             Temp = RedString + " " + GreenString + " " + BlueString + " setrgbcolor";
  1106.             File->Add(Temp);
  1107.             /*
  1108.             Temp = AnsiString(x) + " " + AnsiString(y) + " fillbox";
  1109.             File->Add(Temp);   */
  1110.             int Size = Val * 100;
  1111.             Temp = "newpath " + AnsiString(x) + " " + AnsiString(y) + " moveto " +
  1112.             AnsiString(ScaleX) + " 0 rlineto " +
  1113.             "0 " + AnsiString(Size) + " rlineto " +
  1114.             "-" + AnsiString(ScaleX) + " 0 rlineto closepath fill";
  1115.             File->Add(Temp);
  1116.         }
  1117.     }
  1118.     if (SavePSAllForm->SaveGeneLabelsCheckBox->Checked == true)
  1119.     {
  1120.         Name = ((TGeneTreeNode *)Cluster->Genes->Objects[i+MinC])->Data->Name;
  1121.         TReplaceFlags Flags;
  1122.         Flags << rfReplaceAll;
  1123.         Name = StringReplace(Name,"(","",Flags);
  1124.         Name = StringReplace(Name,")","",Flags);
  1125.         GeneNameSize = max(ScaleY*Name.Length(),GeneNameSize);
  1126.         x = GeneTreeSize + ScaleX * Cluster->Columns + 10;
  1127.         y = (MaxC-MinC - i )  * ScaleY;
  1128.         File->Add("0.0 setgray");
  1129.         Temp = AnsiString(x) + " " + AnsiString(y) + " moveto";
  1130.         File->Add(Temp);
  1131.         Temp = "(" + Name + ") show";
  1132.         File->Add(Temp);
  1133.     }
  1134. }
  1135. File->Add("0.0 setgray");
  1136. if (SavePSAllForm->SaveArrayLabelsCheckBox->Checked == true)
  1137. {
  1138. for (j=0;j<Cluster->Columns;j++)
  1139. {
  1140.         x = GeneTreeSize + ScaleX * (j + 1);
  1141.         y = ((MaxC-MinC)+4)*ScaleY;
  1142.         File->Add("newpath");
  1143.         File->Add("gsave");
  1144.         Temp = AnsiString(x) + " " + AnsiString(y) + " moveto";
  1145.         File->Add(Temp);
  1146.         File->Add("90 rotate");
  1147.         Name = Cluster->Arrays->Strings[j];
  1148.         TReplaceFlags Flags;
  1149.         Flags << rfReplaceAll;
  1150.         Name = StringReplace(Name,"(","",Flags);
  1151.         Name = StringReplace(Name,")","",Flags);
  1152.         Temp = "(" + Name + ") show";
  1153.         File->Add(Temp);
  1154.         File->Add("grestore");
  1155.         File->Add("closepath");
  1156.         ArrayNameSize = max(ScaleY*Name.Length(),ArrayNameSize);
  1157. }
  1158. }
  1159. File->Add("0 setlinewidth");
  1160. File->Add("0.0 setgray");
  1161. if (SavePSAllForm->SaveGeneTreeCheckBox->Checked == true)
  1162. {
  1163.     Node->DrawPS(File,0.95 * GeneTreeSize,ScaleY,MaxC);
  1164. }
  1165. File->Add("0 setlinewidth");
  1166. File->Add("0.0 setgray");
  1167. if (SavePSAllForm->SaveArrayTreeCheckBox->Checked == true)
  1168. {
  1169.     Cluster->TopArrayNode->DrawPS(File, ScaleX, ArrayTreeSize, GeneTreeSize, ((MaxC)-(MinC)+2)*ScaleY + ArrayNameSize);
  1170. }
  1171. //Temp = "%%BoundingBox: 0 0 " + AnsiString(Cluster->Columns * ScaleX + GeneTreeSize + GeneNameSize) +
  1172.      AnsiString(" ") + AnsiString(ScaleY * ((MaxC)-(MinC)+2) + ArrayNameSize + ArrayTreeSize);
  1173. //File->Insert(3,Temp);
  1174. File->SaveToFile(PSFileName);
  1175. delete File;
  1176. }
  1177. void __fastcall TTreeViewMainForm::SavePSClick(TObject *Sender)
  1178. {
  1179.     MakeSimplePS();
  1180. }
  1181. //---------------------------------------------------------------------------
  1182. void __fastcall TTreeViewMainForm::S1Click(TObject *Sender)
  1183. {
  1184.     Cluster->TopNode->WriteList(OptionsForm->CorrSelectCutoffEdit->Text.ToDouble());
  1185. }
  1186. //---------------------------------------------------------------------------
  1187. void __fastcall TTreeViewMainForm::SaveAllPS1Click(TObject *Sender)
  1188. {
  1189.     SavePSAllForm->ShowModal();
  1190. }
  1191. //---------------------------------------------------------------------------
  1192. void __fastcall TTreeViewMainForm::SetOverviewScrollPos()
  1193. {
  1194.      int index;
  1195.      if (Cluster->BestNode != NULL)
  1196.      {
  1197.          index = (Cluster->BestNode->MinCoor + Cluster->BestNode->MaxCoor)/2;
  1198.      }
  1199.      else
  1200.      {
  1201.          index = (Cluster->MinCoor + Cluster->MaxCoor)/2;
  1202.      }
  1203.      OverviewScrollBox->VertScrollBar->Position = index * ImageScaleY
  1204.             - OverviewScrollBox->Height / 2;
  1205. }
  1206. void __fastcall TTreeViewMainForm::SaveNodeData1Click(TObject *Sender)
  1207. {
  1208.      if (Cluster->TopNode != NULL)
  1209.      {
  1210.         SaveNodeDataForm->ShowModal();
  1211.      }
  1212. }
  1213. void __fastcall TTreeViewMainForm::SaveNodeData(AnsiString FileName)
  1214. {
  1215.         TStringList *NodeDataList = new TStringList();
  1216.         int j;
  1217.         AnsiString Line;
  1218.         Line = "NODEtNAMEt";
  1219.         for (j=0;j<Cluster->Columns;j++)
  1220.         {
  1221.             Line += "t" +
  1222.             Cluster->Arrays->Strings[j];
  1223.         }
  1224.         double MinCorrVal = SaveNodeDataForm->MinCorr;
  1225.         double MaxCorrVal = SaveNodeDataForm->MaxCorr;
  1226.         int MinElements = SaveNodeDataForm->MinElements;
  1227.         bool SaveChildren = SaveNodeDataForm->SaveChildrenCheckBox->Checked;
  1228.         bool SaveList     = SaveNodeDataForm->SaveListCheckBox->Checked;
  1229.         NodeDataList->Add(Line);
  1230.         if ((Cluster->BestNode != NULL) && (SaveNodeDataForm->UseSelectedNodeCheckBox->Checked) )
  1231.         {
  1232.            Cluster->BestNode->SaveData(NodeDataList,MinCorrVal,MaxCorrVal,MinElements,SaveChildren,SaveList);
  1233.         }
  1234.         else
  1235.         {
  1236.            Cluster->TopNode->SaveData(NodeDataList,MinCorrVal,MaxCorrVal,MinElements,SaveChildren,SaveList);
  1237.         }
  1238.         NodeDataList->SaveToFile(FileName);
  1239.         delete NodeDataList;
  1240. }
  1241. //---------------------------------------------------------------------------
  1242. void __fastcall TTreeViewMainForm::EditURLStringsClick(TObject *Sender)
  1243. {
  1244.         URLMemoForm->Show();
  1245. }
  1246. //---------------------------------------------------------------------------
  1247. void __fastcall TTreeViewMainForm::SaveNotes1Click(TObject *Sender)
  1248. {
  1249.      if (NoteSaveDialog->Execute())
  1250.      {
  1251.         TStringList *OutFile = new TStringList();
  1252.         for (int i=0;i<Cluster->Rows;i++)
  1253.         {
  1254.             AnsiString OutString = ((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->ID;
  1255.             OutString += "t" +  ((TGeneTreeNode *)Cluster->Genes->Objects[i])->Data->Note;
  1256.             OutFile->Add(OutString);
  1257.         }
  1258.         OutFile->SaveToFile(NoteSaveDialog->FileName);
  1259.      }
  1260. }
  1261. //---------------------------------------------------------------------------
  1262. void __fastcall TTreeViewMainForm::ScrollBar1KeyDown(TObject *Sender,
  1263.       WORD &Key, TShiftState Shift)
  1264. {
  1265.       FormKeyDown(Sender,Key,Shift);
  1266. }
  1267. //---------------------------------------------------------------------------
  1268. void __fastcall TTreeViewMainForm::AddNotetoDB1Click(TObject *Sender)
  1269. {
  1270.      //NoteForm->Show();        
  1271. }
  1272. //---------------------------------------------------------------------------