// Matt Streeter
// 2/27/00
// HEREDITY.CPP
// Implementation of class THeredityWindow; base class for TGenerationWindow
// and TFamilyTreeWindow.
// Copyright Matt Streeter, 2000. All rights reserved
#include "heredity.h"
#include "nvis.h"
#include "tree.h"
#include "eswin.rh"
#include "ids.h"
// Default choice on "Zoom" menu when window is created.
#define DEFAULT_ZOOM_FACTOR ZOOM_100_PERCENT
DEFINE_RESPONSE_TABLE1(THeredityWindow, TWindow)
EV_COMMAND(CM_VIEW_FAMILY_TREE,CmViewFamilyTree),
EV_COMMAND(CM_EDIT_NETWORK,CmEditNetwork),
EV_COMMAND_ENABLE(CM_VIEW_FAMILY_TREE,CeViewFamilyTree),
EV_COMMAND_ENABLE(CM_EDIT_NETWORK,CeEditNetwork),
EV_COMMAND(CM_ZOOM_25_PERCENT,CmZoom25Percent),
EV_COMMAND(CM_ZOOM_50_PERCENT,CmZoom50Percent),
EV_COMMAND(CM_ZOOM_100_PERCENT,CmZoom100Percent),
EV_COMMAND(CM_ZOOM_200_PERCENT,CmZoom200Percent),
EV_COMMAND(CM_ZOOM_400_PERCENT,CmZoom400Percent),
EV_COMMAND(CM_ZOOM_800_PERCENT,CmZoom800Percent),
EV_COMMAND(CM_ZOOM_CUSTOM,CmZoomCustom),
EV_COMMAND_ENABLE(CM_ZOOM_25_PERCENT,CeZoom25Percent),
EV_COMMAND_ENABLE(CM_ZOOM_50_PERCENT,CeZoom50Percent),
EV_COMMAND_ENABLE(CM_ZOOM_100_PERCENT,CeZoom100Percent),
EV_COMMAND_ENABLE(CM_ZOOM_200_PERCENT,CeZoom200Percent),
EV_COMMAND_ENABLE(CM_ZOOM_400_PERCENT,CeZoom400Percent),
EV_COMMAND_ENABLE(CM_ZOOM_800_PERCENT,CeZoom800Percent),
EV_COMMAND_ENABLE(CM_ZOOM_CUSTOM,CeZoomCustom),
END_RESPONSE_TABLE;
TColor THeredityWindow::mParentHighlightColor(0,255,0);
TColor THeredityWindow::mSelectedHighlightColor(255,255,0);
TColor THeredityWindow::mBoxColor(255,255,255);
THeredityWindow::THeredityWindow(TWindow *pParent,char *pTitle,
TGeneration *pGenerationList,Network *pNetwork,double dMaxWeight,
Parameter *pParam):
TESWindow(pParent,pTitle),
mMatrix(pNetwork,BASE_PIXELS_PER_WEIGHT,dMaxWeight)
{
mpGenerationList=pGenerationList;
mpNetwork=pNetwork;
mdMaxWeight=dMaxWeight;
mpNetworkRects=0;
miNetworkRects=0;
miSelectedNetwork=-1;
mpParent=pParent;
mpParam=pParam;
SetZoomFactor(DEFAULT_ZOOM_FACTOR);
Scroller=0;
AssignMenu("ZOOM_MENU");
}
int THeredityWindow::FindNetworkRect(TPoint& point)
{
int n;
for(n=0;n<miNetworkRects;n++)
{
if(point.x>=mpNetworkRects[n].x-X_SCROLL_OFFSET
&& point.y>=mpNetworkRects[n].y-Y_SCROLL_OFFSET
&& point.x<mpNetworkRects[n].x+mMatrix.GetWidth()-X_SCROLL_OFFSET
&& point.y<mpNetworkRects[n].y+mMatrix.GetHeight()-Y_SCROLL_OFFSET)
return(n);
}
return(-1);
}
void THeredityWindow::DrawHighlight(int iNetwork,TColor& Color)
{
TClientDC dc(*this);
TBrush Brush(Color);
dc.FrameRect(mpNetworkRects[iNetwork].x-X_SCROLL_OFFSET-1,
mpNetworkRects[iNetwork].y-Y_SCROLL_OFFSET-1,
mpNetworkRects[iNetwork].x-X_SCROLL_OFFSET+mMatrix.GetWidth(),
mpNetworkRects[iNetwork].y-Y_SCROLL_OFFSET+mMatrix.GetHeight(),Brush);
}
int THeredityWindow::FindNetworkRect(int iGeneration,int iIndex)
{
int n;
for(n=0;n<miNetworkRects;n++)
{
if(mpNetworkRects[n].pChromosome->miGeneration==iGeneration &&
mpNetworkRects[n].pChromosome->miIndex==iIndex)
return(n);
}
return(-1);
}
void THeredityWindow::CmViewFamilyTree()
{
char pTitle[200];
if(miSelectedNetwork==-1)
return;
GetFamilyTreeTitle(pTitle,mpNetworkRects[miSelectedNetwork].pChromosome);
(new TFamilyTreeWindow(mpParent,pTitle,mpGenerationList,
mpNetworkRects[miSelectedNetwork].pChromosome,mpNetwork,
mdMaxWeight,mpParam))->Create();
}
void THeredityWindow::CmEditNetwork()
{
if(miSelectedNetwork==-1)
return;
(new TNVisWindow(mpParent,mpNetwork,
mpNetworkRects[miSelectedNetwork].pChromosome,mpParam))->Create();
}
void THeredityWindow::CeViewFamilyTree(TCommandEnabler& ce)
{
ce.Enable(miSelectedNetwork!=-1);
}
void THeredityWindow::CeEditNetwork(TCommandEnabler& ce)
{
ce.Enable(miSelectedNetwork!=-1);
}
int THeredityWindow::SetZoomFactor(ZoomFactor Zoom)
{
switch(Zoom)
{
case ZOOM_25_PERCENT:
mMatrix.SetPixelsPerSquare(BASE_PIXELS_PER_WEIGHT/4);
break;
case ZOOM_50_PERCENT:
mMatrix.SetPixelsPerSquare(BASE_PIXELS_PER_WEIGHT/2);
break;
case ZOOM_100_PERCENT:
mMatrix.SetPixelsPerSquare(BASE_PIXELS_PER_WEIGHT);
break;
case ZOOM_200_PERCENT:
mMatrix.SetPixelsPerSquare(BASE_PIXELS_PER_WEIGHT*2);
break;
case ZOOM_400_PERCENT:
mMatrix.SetPixelsPerSquare(BASE_PIXELS_PER_WEIGHT*4);
break;
case ZOOM_800_PERCENT:
mMatrix.SetPixelsPerSquare(BASE_PIXELS_PER_WEIGHT*8);
break;
default:
return(-1);
};
mZoom=Zoom;
return(0);
}
void THeredityWindow::CmZoom25Percent()
{
if(mZoom!=ZOOM_25_PERCENT)
{
SetZoomFactor(ZOOM_25_PERCENT);
RedrawWindow(0,0,RDW_INVALIDATE|RDW_ERASE);
}
}
void THeredityWindow::CmZoom50Percent()
{
if(mZoom!=ZOOM_50_PERCENT)
{
SetZoomFactor(ZOOM_50_PERCENT);
RedrawWindow(0,0,RDW_INVALIDATE|RDW_ERASE);
}
}
void THeredityWindow::CmZoom100Percent()
{
if(mZoom!=ZOOM_100_PERCENT)
{
SetZoomFactor(ZOOM_100_PERCENT);
RedrawWindow(0,0,RDW_INVALIDATE|RDW_ERASE);
}
}
void THeredityWindow::CmZoom200Percent()
{
if(mZoom!=ZOOM_200_PERCENT)
{
SetZoomFactor(ZOOM_200_PERCENT);
RedrawWindow(0,0,RDW_INVALIDATE|RDW_ERASE);
}
}
void THeredityWindow::CmZoom400Percent()
{
if(mZoom!=ZOOM_400_PERCENT)
{
SetZoomFactor(ZOOM_400_PERCENT);
RedrawWindow(0,0,RDW_INVALIDATE|RDW_ERASE);
}
}
void THeredityWindow::CmZoom800Percent()
{
if(mZoom!=ZOOM_800_PERCENT)
{
SetZoomFactor(ZOOM_800_PERCENT);
RedrawWindow(0,0,RDW_INVALIDATE|RDW_ERASE);
}
}
void THeredityWindow::CmZoomCustom()
{
if(mZoom!=ZOOM_CUSTOM)
{
SetZoomFactor(ZOOM_CUSTOM);
RedrawWindow(0,0,RDW_INVALIDATE|RDW_ERASE);
}
}
void THeredityWindow::CeZoom25Percent(TCommandEnabler& ce)
{
ce.SetCheck(mZoom==ZOOM_25_PERCENT);
}
void THeredityWindow::CeZoom50Percent(TCommandEnabler& ce)
{
ce.SetCheck(mZoom==ZOOM_50_PERCENT);
}
void THeredityWindow::CeZoom100Percent(TCommandEnabler& ce)
{
ce.SetCheck(mZoom==ZOOM_100_PERCENT);
}
void THeredityWindow::CeZoom200Percent(TCommandEnabler& ce)
{
ce.SetCheck(mZoom==ZOOM_200_PERCENT);
}
void THeredityWindow::CeZoom400Percent(TCommandEnabler& ce)
{
ce.SetCheck(mZoom==ZOOM_400_PERCENT);
}
void THeredityWindow::CeZoom800Percent(TCommandEnabler& ce)
{
ce.SetCheck(mZoom==ZOOM_800_PERCENT);
}
void THeredityWindow::CeZoomCustom(TCommandEnabler& ce)
{
ce.SetCheck(mZoom==ZOOM_CUSTOM);
}