//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "..\WControls\WUtilities.h"
#include "Test.h"
#include "About.h"
//---------------------------------------------------------------------------
#include "NewTrackDialog.h"
#include "NewSegmentDialog.h"
#include "NameEntry.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------

__fastcall TMainForm::TMainForm(TComponent *Owner)	: TForm(Owner)
{ Projects					=	new	TStringList();
	ProjectClipBoard	=	new	TList();
	TrackClipBoard		=	new	TList();
	TimeLineClipBoard	=	new	TList();
	SegmentClipBoard	=	new	TList();
	FTabs							=	new	TWTabControl(this);
	FTabs->Parent			=	ProjectPanel;
	FTabs->Align			=	alTop;
	FTabs->Height			=	18;
	FTabs->Gradient		=	wgVert;
//	FTabs->Images	=	ImageList;
	FTabs->Color			=	clWhite;
	FTabs->OnChange		=	TabChanged;

}
//---------------------------------------------------------------------------

__fastcall TMainForm::~TMainForm()
{ delete	Projects;
	delete	ProjectClipBoard;
	delete	TrackClipBoard;
	delete	TimeLineClipBoard;
	delete	SegmentClipBoard;
};
//---------------------------------------------------------------------------

TProject*	__fastcall TMainForm::GetProject(int index)
{ if (index < Projects->Count)
	return ((TProject*)(Projects->Objects[index]));
};
//---------------------------------------------------------------------------

TTrack* __fastcall TMainForm::GetCurrentTrack()
{ TProject*	project =	CurrentProject;

	if (project) return	project->ActiveTrack;
	return	0;
};
//---------------------------------------------------------------------------

TTimeLine* __fastcall TMainForm::GetCurrentTimeLine()
{ TProject*	project =	CurrentProject;

	if (project) return	project->ActiveTimeLine;
	return	0;
};
//---------------------------------------------------------------------------

TSegment* __fastcall TMainForm::GetCurrentSegment()
{ TProject*	project =	CurrentProject;

	if (project) return	project->ActiveSegment;
	return	0;
};
//---------------------------------------------------------------------------

void __fastcall TMainForm::SetCurrentProject(TProject* value)
{	if (FCurrentProject) FCurrentProject->Visible	=	false;
	FCurrentProject	=	value;
	if (FCurrentProject)
	{	FCurrentProject->Visible	=	true;
		FTabs->TabIndex	=	Projects->IndexOfObject(FCurrentProject);
	}
	UpdateMenus();
};
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormMouseWheelUp(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled)
{ TProject*	project;
	project	=	CurrentProject;
	if (project) project->ZoomIn();
	Handled				=	true;
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormMouseWheelDown(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled)
{ TProject*	project;
	project	=	CurrentProject;
	if (project) project->ZoomOut();
	Handled				=	true;
	return;
}
//---------------------------------------------------------------------------

void __fastcall	TMainForm::LoadFromStream(TStream* stream)
{	TProject*					project;
	int								count	=	Projects->Count;

	for (int i=0;i<count; i++)
	{	project	=	Project[i];
		delete project;
	};

	stream->Read(&count,sizeof(count));

	for (int i=0;i<count; i++)
	{	project		  						=	new	TProject(ProjectPanel);
		project->Parent 				=	ProjectPanel;
		project->LoadFromFile(LoadString(stream));
		project->Align					=	alClient;
		FTabs->Tabs->AddObject(project->ProjectName,project);
	};
};
//---------------------------------------------------------------------------

void __fastcall	TMainForm::SaveToStream(TStream* stream)
{	TProject*					project;
	int								count	=	Projects->Count;

	stream->Write(&count,sizeof(count));

	for (int i=0;i<count; i++)
	{	project	=	Project[i];
		project->Modified	=	false;
		SaveString(stream,project->FileName);
	}
};
//---------------------------------------------------------------------------

void __fastcall TMainForm::TabChanged(TObject* Sender)
{ CurrentProject	=	Project[FTabs->TabIndex];
};
//---------------------------------------------------------------------------

void __fastcall	TMainForm::UpdateMenus()
{ TProject* project				=		CurrentProject;
	bool	track							=	  CurrentTrack;
	bool	timeline					=	  CurrentTimeLine;
	bool	segment						=	  CurrentSegment;

	ProjectSave->Enabled		=		(project && project->Modified);
	ProjectSaveAs->Enabled	=		project;
	ProjectSaveAll->Enabled	=		project;
	ProjectClose->Enabled		=		project;

	TrackNew->Enabled				=		project;
	TrackOpen->Enabled			=		project;
	TrackDelete->Enabled 		=		track;
	TrackRename->Enabled		=		track;
	TrackType->Enabled			=		track;
	TrackSelect->Enabled		=		track;
	TrackCut->Enabled				=		track;
	TrackCopy->Enabled      =		track;
	TrackPaste->Enabled     =		(project && TrackClipBoard->Count);

	TimeLineNew->Enabled    =		track;
	TimeLineOpen->Enabled   =		track;
	TimeLineRename->Enabled	=		timeline;
	TimeLineDelete->Enabled =		timeline;
	TimeLineSelect->Enabled =		timeline;
	TimeLineCut->Enabled    =		timeline;
	TimeLineCopy->Enabled   =		timeline;
	TimeLinePaste->Enabled  =		(track  && TimeLineClipBoard->Count);

	SegmentNew->Enabled     =		timeline;
	SegmentOpen->Enabled    =		timeline;
	SegmentType->Enabled    =		segment;
	SegmentRename->Enabled	=		segment;
	SegmentDelete->Enabled	=		segment;
	SegmentSelect->Enabled	=		segment;
	SegmentCut->Enabled			=		segment;
	SegmentCopy->Enabled		=		segment;
	SegmentPaste->Enabled		=		(timeline && SegmentClipBoard->Count);
};
//---------------------------------------------------------------------------

void __fastcall TMainForm::CreateProject(const AnsiString Name,const AnsiString FileName)
{	TProject*			project		  								=	new	TProject(ProjectPanel);
	project->Parent														=	ProjectPanel;
	project->Align														=	alClient;
	project->FileName													=	FileName;
	project->MarkerMenu												=	MarkerPopupMenu;
	if (FileName.IsEmpty())
	{	project->ProjectName     								=	Name;
		if (NewTrackDialogForm->Video->Down)			project->AddTrack(ttVideo,NewTrackDialogForm->VideoTrackNameEdit->Text);
		if (NewTrackDialogForm->Mono->Down)				project->AddTrack(ttAudio,NewTrackDialogForm->AudioMonoTrackNameEdit->Text);
		if (NewTrackDialogForm->LeftAudio->Down)	project->AddTrack(ttAudio,NewTrackDialogForm->AudioLeftTrackNameEdit->Text);
		if (NewTrackDialogForm->RightAudio->Down)	project->AddTrack(ttAudio,NewTrackDialogForm->AudioRightTrackNameEdit->Text);
		if (NewTrackDialogForm->SubTitles->Down)	project->AddTrack(ttSubtitles,NewTrackDialogForm->SubsTrackNameEdit->Text);
		if (NewTrackDialogForm->SlideShow->Down)	project->AddTrack(ttSlides,NewTrackDialogForm->StillTrackNameEdit->Text);
		if (NewTrackDialogForm->Text->Down)				project->AddTrack(ttText,NewTrackDialogForm->TextTrackNameEdit->Text);
		if (NewTrackDialogForm->Midi->Down)				project->AddTrack(ttMidi,NewTrackDialogForm->MidiTrackNameEdit->Text);
	}
	else	project->LoadFromFile(FileName);
	FTabs->TabIndex	=	FTabs->Tabs->Add(project->ProjectName);
	FTabs->Invalidate();
	Projects->AddObject(project->ProjectName,project);
	if (CurrentProject) CurrentProject->Visible	=	false;
	CurrentProject	=	project;
};
//---------------------------------------------------------------------------

void __fastcall TMainForm::CreateTrack(const AnsiString FileName)
{	TProject*	project  							=	CurrentProject;
	if (project)
	{	if (FileName.IsEmpty())
		{	if (NewTrackDialogForm->Video->Down)					project->AddTrack(ttVideo,NewTrackDialogForm->VideoTrackNameEdit->Text);
			if (NewTrackDialogForm->Mono->Down)						project->AddTrack(ttAudio,NewTrackDialogForm->AudioMonoTrackNameEdit->Text);
			if (NewTrackDialogForm->LeftAudio->Down)			project->AddTrack(ttAudio,NewTrackDialogForm->AudioLeftTrackNameEdit->Text);
			if (NewTrackDialogForm->RightAudio->Down)			project->AddTrack(ttAudio,NewTrackDialogForm->AudioRightTrackNameEdit->Text);
			if (NewTrackDialogForm->SubTitles->Down)			project->AddTrack(ttSubtitles,NewTrackDialogForm->SubsTrackNameEdit->Text);
			if (NewTrackDialogForm->SlideShow->Down)			project->AddTrack(ttSlides,NewTrackDialogForm->StillTrackNameEdit->Text);
			if (NewTrackDialogForm->Text->Down)						project->AddTrack(ttText,NewTrackDialogForm->TextTrackNameEdit->Text);
			if (NewTrackDialogForm->Midi->Down)						project->AddTrack(ttMidi,NewTrackDialogForm->MidiTrackNameEdit->Text);
		}
		else	project->LoadFromFile(FileName);
	}
	UpdateMenus();
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::CreateTimeline(const AnsiString FileName)
{	TProject*		project	 									=	CurrentProject;
	TTrack*			track		 									=	(project)?project->ActiveTrack:0;
	TTimeLine*	timeline;
	if (!track) 	return;

	timeline	=	new TTimeLine(track);
	if (!FileName.IsEmpty())
		timeline->LoadFromFile(FileName);
	UpdateMenus();
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::CreateSegment(int type)
{ TProject*	project	=	CurrentProject;
	TTrack*		track;

	if (project) project->AddSegment(type);
	UpdateMenus();
};
//---------------------------------------------------------------------------

void __fastcall TMainForm::DeleteProject(TProject* project)
{ int	index;
	if (!project)	project	=	CurrentProject;
	if (project	== CurrentProject)	CurrentProject	=	0;
	index	=	Projects->IndexOfObject(project);
	if (index != -1)
	{	FTabs->Tabs->Delete(index);
		Projects->Delete(index);
		delete project;
	};
	UpdateMenus();
};
//---------------------------------------------------------------------------

void __fastcall TMainForm::HelpAbout1Execute(TObject *Sender)
{
	AboutBox->ShowModal();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ExitClick(TObject *Sender)
{
	Close();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ProjectNewClick(TObject *Sender)
{ if (NewTrackDialogForm->Execute() == 1)
	{	CreateProject(AnsiString("Project ")+AnsiString(Projects->Count+1),AnsiString());
	};
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ProjectOpenClick(TObject *Sender)
{
	OpenDialog->Filter			=	"Multimedia Projects (*.mmp)|*.mmp|All Files (*.*)|*.*";
	OpenDialog->DefaultExt	=	".mmp";
	if (OpenDialog->Execute())
		CreateProject(ExtractFileName(OpenDialog->FileName),OpenDialog->FileName);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ProjectSaveClick(TObject *Sender)
{	TProject*	project	=	CurrentProject;
	if (project) project->Save();
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ProjectSaveAsClick(TObject *Sender)
{	TProject*	project	=	CurrentProject;
	if (project) project->SaveToFile(AnsiString());
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ProjectSaveAllClick(TObject *Sender)
{ for (int i=0;i<Projects->Count;i++)
		Project[i]->Save();
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ProjectCloseClick(TObject *Sender)
{ DeleteProject(CurrentProject);
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::MarkerClicked(TObject *Sender)
{ if (!CurrentProject) return;
	CurrentProject->MarkerClicked(Sender);
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::HelpToolButtonClick(TObject *Sender)
{	Cursor	=	(HelpToolButton->Down)?crHelp:crDefault;
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackNewClick(TObject *Sender)
{ if (NewTrackDialogForm->Execute(CurrentProject) == 1)
	{	CreateTrack(AnsiString());
	};
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackOpenClick(TObject *Sender)
{	OpenDialog->Filter			=	"Multimedia Track (*.trk)|*.trk|All Files (*.*)|*.*";
	OpenDialog->DefaultExt	=	".trk";
	if (OpenDialog->Execute())
		CreateTrack(OpenDialog->FileName);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackTypeClick(TObject *Sender)
{	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackRenameClick(TObject *Sender)
{ TProject* project	=	CurrentProject;
	TTrack*		track;
	if (!project) return;

	track		=	CurrentTrack;
	NameEntryForm->Names							=	TTrack::TrackNames;
	if (track)  NameEntryForm->Name		=	track->TrackName;
	NameEntryForm->Label							=	"Track Name:";
	NameEntryForm->Caption						=	"Track Name Form";
	NameEntryForm->Button							=	"Rename";
	if (NameEntryForm->ShowModal() == mrOk)
	{	project->TrackRename(NameEntryForm->Name);
	};
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackDeleteClick(TObject *Sender)
{	TProject*	project	=	CurrentProject;
	if (project)	project->TrackDelete();
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackSelectClick(TObject *Sender)
{ TProject* project	=	CurrentProject;
	TTrack*		track;
	if (!project) return;

	track		=	CurrentTrack;
	NameEntryForm->Names							=	TTrack::TrackNames;
	if (track)  NameEntryForm->Name		=	track->TrackName;
	NameEntryForm->Label							=	"Track Name:";
	NameEntryForm->Caption						=	"Select Track Form";
	NameEntryForm->Button							=	"Select";
	if (NameEntryForm->Execute() == mrOk)
	{	project->TrackSelect(NameEntryForm->Name);
	};
	return;

}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackSelectAllClick(TObject *Sender)
{	TProject*	project	=	CurrentProject;
	if (project)	project->TrackSelect();
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackCutClick(TObject *Sender)
{ TProject*	project	=	CurrentProject;
	if (project)	project->TrackCut(TrackClipBoard);
	TrackPaste->Enabled     =		(project && TrackClipBoard->Count);
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackCopyClick(TObject *Sender)
{	TProject*	project	=	CurrentProject;
	if (project)	project->TrackCopy(TrackClipBoard);
	TrackPaste->Enabled     =		(project && TrackClipBoard->Count);
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrackPasteClick(TObject *Sender)
{	TProject*	project	=	CurrentProject;
	if (project)	project->TrackPaste(TrackClipBoard);
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TimelineNewClick(TObject *Sender)
{ CreateTimeline(AnsiString());
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TimeLineOpenClick(TObject *Sender)
{	OpenDialog->Filter			=	"Multimedia Time Line (*.tln)|*.tln|All Files (*.*)|*.*";
	OpenDialog->DefaultExt	=	".tln";
	if (OpenDialog->Execute())
		CreateTimeline(OpenDialog->FileName);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TimeLineRenameClick(TObject *Sender)
{	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TimeLineDeleteClick(TObject *Sender)
{ TTrack*				track	=	CurrentTrack;
	if (track)		track->TimeLineDelete();
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TimeLineSelectClick(TObject *Sender)
{	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TimeLineCutClick(TObject *Sender)
{ TTrack*				track	=	CurrentTrack;
	if (track)		track->TimeLineCut(TimeLineClipBoard);
	TimeLinePaste->Enabled  =		(track  && TimeLineClipBoard->Count);
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TimeLineCopyClick(TObject *Sender)
{ TTrack*				track	=	CurrentTrack;
	if (track)		track->TimeLineCopy(TimeLineClipBoard);
	TimeLinePaste->Enabled  =		(track  && TimeLineClipBoard->Count);
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TimeLinePasteClick(TObject *Sender)
{ TTrack*				track	=	CurrentTrack;
	if (track)		track->TimeLinePaste(TimeLineClipBoard);
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::SegmentNewClick(TObject *Sender)
{ int	result;
	if (!CurrentProject) return;
	result  =	NewSegmentDialogForm->Execute(CurrentProject);
	if (result >= 1)	CreateSegment(result-1);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::SegmentOpenClick(TObject *Sender)
{	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::SegmentTypeClick(TObject *Sender)
{	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::SegmentRenameClick(TObject *Sender)
{	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::SegmentDeleteClick(TObject *Sender)
{ TTimeLine* 			timeline =	CurrentTimeLine;
	if (timeline)		timeline->SegmentDelete();
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::SegmentSelectClick(TObject *Sender)
{	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::SegmentCutClick(TObject *Sender)
{ TTimeLine* 			timeline =	CurrentTimeLine;
	if (timeline)		timeline->SegmentCut(SegmentClipBoard);
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::SegmentCopyClick(TObject *Sender)
{ TTimeLine* 			timeline =	CurrentTimeLine;
	if (timeline)		timeline->SegmentCopy(SegmentClipBoard);
	return;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::SegmentPasteClick(TObject *Sender)
{ TTimeLine* 			timeline =	CurrentTimeLine;
	if (timeline)		timeline->SegmentPaste(SegmentClipBoard);
	SegmentPaste->Enabled		=		(timeline && SegmentClipBoard->Count);
	return;
}
//---------------------------------------------------------------------------

