netscape-revival
lib/mac/VText/V_PowerPlant_Mods/LStyleSet.cp
// ===========================================================================
// LStyleSet.cp ©1994 Metrowerks Inc. All rights reserved.
// ===========================================================================
#ifdef PowerPlant_PCH
#include PowerPlant_PCH
#endif
#include "LStyleSet.h"
#include <AETextSuite.h>
#include <LTextModel.h>
#include <UAppleEventsMgr.h>
#include <UAEGizmos.h>
#include <UExtractFromAEDesc.h>
#include <LString.h>
#include <PP_Messages.h>
#include <UFontsStyles.h>
#include <PP_Resources.h>
#ifndef __FONTS__
#include <Fonts.h>
#endif
#ifndef __AEREGISTRY__
#include <AERegistry.h>
#endif
#ifndef __AEOBJECTS__
#include <AEObjects.h>
#endif
#ifndef __AEPACKOBJECT__
#include <AEPackObject.h>
#endif
#ifndef __AEREGISTRY__
#include <AERegistry.h>
#endif
#ifndef __GESTALT__
#include <Gestalt.h>
#endif
#include <LowMem.h>
#pragma warn_unusedarg off
// ===========================================================================
StyleRunPositionT::StyleRunPositionT(
Boolean inLineIsLeftToRight,
Boolean inFirstRun,
Boolean inLastRun)
{
if (inFirstRun && inLastRun) {
mPosition = onlyStyleRun;
} else if (!inFirstRun && !inLastRun) {
mPosition = middleStyleRun;
} else if (inLineIsLeftToRight) {
if (inFirstRun)
mPosition = leftStyleRun;
else
mPosition = rightStyleRun;
} else {
if (inFirstRun)
mPosition = rightStyleRun;
else
mPosition = leftStyleRun;
}
if (inFirstRun)
mPosition |= stylePosition_First;
if (inFirstRun)
mPosition |= stylePosition_Last;
}
// ===========================================================================
LStyleSet::LStyleSet()
{
mName[0] = 0;
SetModelKind(cStyleSet);
}
LStyleSet::LStyleSet(const LStyleSet *inOriginal)
{
mName[0] = 0;
SetModelKind(cStyleSet);
ThrowIfNULL_(inOriginal);
SetSuperModel(((LStyleSet *)inOriginal)->GetSuperModel());
}
LStyleSet::~LStyleSet()
{
}
Boolean LStyleSet::operator==(const LStyleSet &inRhs) const
{
if (this == &inRhs)
return true;
return false;
}
void LStyleSet::WriteFlavorRecord(
FlavorType inFlavor,
LStream &inStream) const
{
switch (inFlavor) {
default:
Throw_(paramErr);
break;
}
}
void LStyleSet::ReadFlavorRecord(
FlavorType inFlavor,
LStream &inStream)
{
switch (inFlavor) {
default:
Throw_(paramErr);
break;
}
}
// ----------------------------------------------------------------------
// Query:
FixedT LStyleSet::Insertion2Pixel(
const TextRangeT &inQueryRange,
const Ptr inText,
const TextRangeT &inRangePt,
StyleRunPositionT inPosition,
FixedT inSlop) const
{
return FixedT::sZero;
}
void LStyleSet::Pixel2Range(
const TextRangeT &inQueryRange,
const Ptr inText,
FixedT inPixelOffset,
StyleRunPositionT inPosition,
FixedT inSlop,
TextRangeT &outRange,
Boolean &outLeadingEdge
) const
{
}
Int32 LStyleSet::GetHeight(void) const
{
return 0;
}
Int32 LStyleSet::GetAscent(void) const
{
return 0;
}
Boolean LStyleSet::CaretInside(void) const
/*
Can the caret "go inside" this style set.
*/
{
return false;
}
Boolean LStyleSet::IsProportional(void) const
{
return false;
}
/*-
FixedT LStyleSet::MaxCharWidth(void) const
{
return FixedT::sZero;
}
*/
#if 0
Int32 LStyleSet::FindCharSize(
const Ptr inBuffer,
Uint16 inOffset) const
/*
Return the size of the character at the indicated offset.
inBuffer must be non relocatable.
inOffset (which has a default 0 value) can only refer to the
start of a char boundary. Otherwise, and exception will be thrown.
*/
{
Int32 rval = 0;
if (mCharSize) {
rval = mCharSize;
} else {
short type = CharacterByteType((Ptr)inBuffer, inOffset, GetScript());
switch (type) {
case smSingleByte:
rval = 1;
break;
case smFirstByte:
rval = 2;
break;
case smLastByte:
Throw_(paramErr); // With PowerPlant text, you need not and
// must not use non char offsets -- were you not
// using LTextEngine->This/Prev/NextCharSize?
break;
case smMiddleByte:
default:
Throw_(paramErr); // What?
break;
}
}
return rval;
}
Int32 LStyleSet::PrevCharSize(
const Ptr inBuffer,
Uint16 inOffset) const
{
Int32 rval = 0;
if (inOffset > 0) {
if (mCharSize) {
rval = mCharSize;
} else {
switch (CharacterByteType((Ptr)inBuffer, inOffset-1, GetScript())) {
case smSingleByte:
rval = 1;
break;
case smLastByte:
rval = 2;
break;
case smFirstByte:
Throw_(paramErr);
break;
case smMiddleByte:
Throw_(paramErr);
break;
default:
Throw_(paramErr);
break;
}
}
}
return rval;
}
Boolean LStyleSet::CharIsLeftToRight(const Ptr inCharPtr) const
{
return true;
}
Boolean LStyleSet::IsLeftToRight(void) const
{
return true;
}
#endif
Int32 LStyleSet::FindCharSize(
const TextRangeT &inStyleRange,
const Ptr inText,
const TextRangeT &inInsertionPt) const
{
Assert_(inStyleRange.Length());
Assert_(!inInsertionPt.Length());
Assert_(inStyleRange.Contains(inInsertionPt));
if (inInsertionPt.Insertion() == rangeCode_Before)
return inInsertionPt.Start() - inStyleRange.Start();
else
return inStyleRange.End() - inInsertionPt.Start();
}
TextDirectionE LStyleSet::CharDirection(
const TextRangeT &inStyleRange,
const Ptr inText,
const TextRangeT &inInsertionPt) const
{
return textDirection_Undefined;
}
TextDirectionE LStyleSet::StyleDirection(void) const
{
return textDirection_Undefined;
}
ScriptCode LStyleSet::GetScript(void) const
{
return smRoman;
}
LangCode LStyleSet::GetLanguage(void) const
{
return langEnglish;
}
Int32 LStyleSet::GetFontNumber(void) const
{
return LMGetApFontID();
}
Int32 LStyleSet::GetFontSize(void) const
{
return LMGetSysFontSize();
}
Int32 LStyleSet::GetFontFace(void) const
{
return normal;
}
// ----------------------------------------------------------------------
// Formatting:
void LStyleSet::LineBreakScan(
const TextRangeT &inLineRange, // line start to paragraph end
const TextRangeT &inScriptRange, // range of adjacent/equivalent styles in inLineRange
const TextRangeT &inStyleRange, // range corresponding to this styleset -- looking
// to see if the line break occurs in this range.
const Ptr inText, // pointer to all of text
FixedT inWidth, // width remaining on line
TextRangeT &outRange, // range of inStyleRange that occurs on line
FixedT &outWidthUnused, // width left over after scan inStyleRange
StyledLineBreakCode &outBreakCode // what happened
) const
{
}
Int32 LStyleSet::VisibleLength(
const Ptr inText,
Int32 inLength) const
{
return 0;
}
FixedT LStyleSet::TextWidth(
const Ptr inText,
Int32 inLength) const
{
return FixedT::sZero;
}
FixedT LStyleSet::Portion(
const Ptr inText,
Int32 inVisibleLength,
const StyleRunPositionT &inPosition) const
{
return FixedT::sZero;
}
void LStyleSet::Draw(
const TextRangeT &inRange,
const Ptr inText,
StyleRunPositionT inPosition,
FixedT inSlop) const
{
}
// ----------------------------------------------------------------------
// Implementation:
void LStyleSet::Focus(void) const
{
}
/*-
Boolean LStyleSet::FindCommandStatus(
CommandT inCommand,
Boolean &outEnabled,
Boolean &outUsesMark,
Char16 &outMark,
Str255 outName)
{
return false;
}
*/
// ----------------------------------------------------------------------
// AEOM:
const StringPtr LStyleSet::GetModelNamePtr(void) const
{
if (mName[0])
return (StringPtr)mName;
else
return NULL;
}
void LStyleSet::GetTextTraits(TextTraitsRecord *inTraits) const
{
ThrowIfNULL_(inTraits);
StAEDescriptor size,
styles,
color,
fontName;
GetAEProperty(pColor, UAppleEventsMgr::sAnyType, color.mDesc);
GetAEProperty(pFont, UAppleEventsMgr::sAnyType, fontName.mDesc);
GetAEProperty(pPointSize, UAppleEventsMgr::sAnyType, size.mDesc);
GetAEProperty(pTextStyles, UAppleEventsMgr::sAnyType, styles.mDesc);
UExtractFromAEDesc::TheInt16(size, inTraits->size);
LAESubDesc ons(styles.mDesc);
inTraits->style = UFontsStyles::StylesToInt(ons.KeyedItem(keyAEOnStyles));
inTraits->justification = teFlushDefault; // actually missing
inTraits->mode = srcOr; // actually missing
UExtractFromAEDesc::TheRGBColor(color, inTraits->color);
UExtractFromAEDesc::ThePString(fontName, inTraits->fontName);
inTraits->fontNumber = UFontsStyles::GetFontId(inTraits->fontName);
}
void LStyleSet::SetTextTraits(const TextTraitsRecord &inTraits)
{
StAEDescriptor size(inTraits.size),
styles,
color(cRGBColor, &inTraits.color, sizeof(inTraits.color)),
bogusReply;
UFontsStyles::IntToStyles(inTraits.style, &styles.mDesc);
SetAEProperty(pColor, color, bogusReply);
try {
if (inTraits.fontName[0] != 0) {
StAEDescriptor fontName((StringPtr)inTraits.fontName);
SetAEProperty(pFont, fontName, bogusReply);
} else {
Str255 font;
UFontsStyles::GetFontName(inTraits.fontNumber, font);
if (font[0] == 0)
Throw_(paramErr);
StAEDescriptor fontName(font);
SetAEProperty(pFont, fontName, bogusReply);
}
} catch (...) {
Str255 font;
UFontsStyles::GetFontName(LMGetApFontID(), font);
if (font[0] == 0)
Throw_(paramErr);
StAEDescriptor fontName(font);
SetAEProperty(pFont, fontName, bogusReply);
}
SetAEProperty(pPointSize, size, bogusReply);
SetAEProperty(pTextStyles, styles, bogusReply);
}
void LStyleSet::GetAEProperty(
DescType inProperty,
const AEDesc &inRequestedType,
AEDesc &outPropertyDesc) const
{
switch (inProperty) {
case pName:
{
LAEStream out;
out.WriteDesc(typeChar, mName + 1, mName[0]);
out.Close(&outPropertyDesc);
break;
}
default:
inheritAEOM::GetAEProperty(inProperty, inRequestedType, outPropertyDesc);
break;
}
}
void LStyleSet::SetAEProperty(
DescType inProperty,
const AEDesc &inValue,
AEDesc &outAEReply)
{
switch (inProperty) {
case pName:
{
Str255 str;
UExtractFromAEDesc::ThePString(inValue, str);
LString::CopyPStr(str, mName, sizeof(mName));
Changed();
break;
}
default:
inheritAEOM::SetAEProperty(inProperty, inValue, outAEReply);
break;
}
}
void LStyleSet::ModifyProperty(
DescType inProperty,
const LAESubDesc &inByValue
)
{
}
void LStyleSet::MakeSelfSpecifier(AEDesc &inSuperSpecifier, AEDesc &outSelfSpecifier) const
{
if (mName[0] == 0) {
inheritAEOM::MakeSelfSpecifier(inSuperSpecifier, outSelfSpecifier);
} else {
OSErr err;
StAEDescriptor desc(typeChar, (char *)(mName + 1), mName[0]);
err = CreateObjSpecifier(cStyleSet, &inSuperSpecifier,
formName, &desc.mDesc, false, &outSelfSpecifier);
ThrowIfOSErr_(err);
}
}
#include <LTextModel.h>
void LStyleSet::Changed(void)
{
LModelObject *superModel = GetSuperModel();
LTextModel *textModel;
LTextEngine *engine;
if (!superModel)
return;
textModel = (LTextModel *) superModel;
// Assert_(member(textModel, LTextModel));
engine = textModel->GetTextEngine();
if (engine) {
// Assert_(member(engine, LTextEngine));
engine->StyleSetChanged(this);
}
}
void LStyleSet::ChangedGeometry(void)
{
Changed();
}