Microsoft-3D-Movie-Maker/kauai/TOOLS/CHED.CPP

256 lines
5.4 KiB
C++

/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/***************************************************************************
Chunky editor.
***************************************************************************/
#include "ched.h"
ASSERTNAME
BEGIN_CMD_MAP(APP, APPB)
ON_CID_GEN(cidNew, &APP::FCmdOpen, pvNil)
ON_CID_GEN(cidOpen, &APP::FCmdOpen, pvNil)
ON_CID_GEN(cidNewText, &APP::FCmdOpen, pvNil)
ON_CID_GEN(cidOpenText, &APP::FCmdOpen, pvNil)
END_CMD_MAP_NIL()
APP vapp;
RTCLASS(APP)
/***************************************************************************
Main for a frame app.
***************************************************************************/
void FrameMain(void)
{
vapp.Run(fappNil, fgobNil, kginDefault);
}
/***************************************************************************
Initialize the APP - do the command line parsing thing.
***************************************************************************/
bool APP::_FInit(ulong grfapp, ulong grfgob, long ginDef)
{
if (!APP_PAR::_FInit(grfapp, grfgob, ginDef))
return fFalse;
#ifdef WIN
//parse the command line and load any resource files and help files
FNI fni;
STN stn;
bool fQuote, fScript, fSkip;
PDMD pdmd;
PDDG pddg;
PDOCB pdocb;
long lw;
PSZ psz = vwig.pszCmdLine;
fSkip = fTrue;
fScript = fFalse;
for (;;)
{
while (*psz == kchSpace)
psz++;
if (!*psz)
break;
stn.SetNil();
fQuote = fFalse;
while (*psz && (fQuote || *psz != kchSpace))
{
if (*psz == ChLit('"'))
fQuote = !fQuote;
else
stn.FAppendCh(*psz);
psz++;
}
if (stn.Cch() == 0)
continue;
if (fSkip)
{
// application path
fSkip = fFalse;
continue;
}
if (stn.Cch() == 2 && (stn.Psz()[0] == ChLit('/') ||
stn.Psz()[0] == ChLit('-')))
{
// command line switch
switch (stn.Psz()[1])
{
case ChLit('s'):
fScript = fTrue;
break;
}
continue;
}
if (fScript)
{
// this arg should be a cno
fScript = fFalse;
if (!stn.FGetLw(&lw))
continue;
if (pvNil == (pdmd = DMD::PdmdTop()))
continue;
if (pvNil == (pddg = pdmd->Pdocb()->PddgActive()) ||
!pddg->FIs(kclsDCD))
{
continue;
}
((PDCD)pddg)->FTestScript(kctgScript, lw);
continue;
}
if (!fni.FBuildFromPath(&stn) || fni.Ftg() == kftgDir)
continue;
if (pvNil != (pdocb = DOCB::PdocbFromFni(&fni)))
{
pdocb->ActivateDmd();
continue;
}
if (pvNil == (pdocb = (PDOCB)DOC::PdocNew(&fni)))
continue;
pdocb->PdmdNew();
ReleasePpo(&pdocb);
}
#endif //WIN
return fTrue;
}
/***************************************************************************
Get the name for the frame tester app.
***************************************************************************/
void APP::GetStnAppName(PSTN pstn)
{
AssertThis(0);
AssertPo(pstn, 0);
#ifdef UNICODE
STN stnDate;
STN stnTime;
stnDate.SetSzs(__DATE__);
stnTime.SetSzs(__TIME__);
pstn->FFormatSz(Debug(PszLit("Debug ")) PszLit("Ched (Unicode; %s; %s)"),
&stnDate, &stnTime);
#else //!UNICODE
*pstn = Debug("Debug ") "Ched (Ansi; " __DATE__ "; " __TIME__ ")";
#endif //!UNICODE
}
/***************************************************************************
Update the given window. *prc is the bounding rectangle of the update
region.
***************************************************************************/
void APP::UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp)
{
AssertThis(0);
PGOB pgob;
if (pvNil == (pgob = GOB::PgobFromHwnd(hwnd)))
return;
//for script windows, do offscreen updating
if (pgob->FIs(kclsTSCG))
grfapp |= fappOffscreen;
APP_PAR::UpdateHwnd(hwnd, prc, grfapp);
}
/***************************************************************************
Do a fast update of the gob and its descendents into the given gpt.
***************************************************************************/
void APP::_FastUpdate(PGOB pgob, PREGN pregnClip, ulong grfapp, PGPT pgpt)
{
AssertThis(0);
AssertPo(pgob, 0);
AssertPo(pregnClip, 0);
AssertNilOrPo(pgpt, 0);
if (pgob->FIs(kclsTSCG))
grfapp |= fappOffscreen;
APP_PAR::_FastUpdate(pgob, pregnClip, grfapp, pgpt);
}
/***************************************************************************
Open an existing or new chunky file for editing.
Handles cidNew and cidOpen.
***************************************************************************/
bool APP::FCmdOpen(PCMD pcmd)
{
FNI fni;
FNI *pfni;
PDOCB pdocb;
pfni = pvNil;
switch (pcmd->cid)
{
default:
Bug("why are we here?");
return fTrue;
case cidOpen:
//do the standard dialog
if (!FGetFniOpenMacro(&fni, pvNil, 0,
PszLit("Chunky Files\0*.chk;*.cfl\0All Files\0*.*\0"),
vwig.hwndApp))
{
return fTrue;
}
pfni = &fni;
if (pvNil != (pdocb = DOCB::PdocbFromFni(&fni)))
{
pdocb->ActivateDmd();
return fTrue;
}
//fall through
case cidNew:
pdocb = (PDOCB)DOC::PdocNew(pfni);
break;
case cidOpenText:
//do the standard dialog
if (!FGetFniOpenMacro(&fni, pvNil, 0,
PszLit("Text Files\0*.txt;*.cht\0All Files\0*.*\0"), vwig.hwndApp))
{
return fTrue;
}
pfni = &fni;
if (pvNil != (pdocb = DOCB::PdocbFromFni(&fni)))
{
pdocb->ActivateDmd();
return fTrue;
}
//fall through
case cidNewText:
pdocb = (PDOCB)CHTXD::PchtxdNew(pfni, pvNil, oskNil);
break;
}
if (pvNil == pdocb)
return fTrue;
pdocb->PdmdNew();
ReleasePpo(&pdocb);
return fTrue;
}