Return to Appendix B.

HEREDITY.CPP
// 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);
}

Return to Appendix B.