Milán Major

netscape-revival

1 branch
Code

lib/mac/VText/Core/User_Interface/VTextView.cp

//	===========================================================================
//	VTextView.cp
//	===========================================================================

#ifdef PowerPlant_PCH
#include PowerPlant_PCH
#endif

#include	"VTextView.h"
#include	<PP_Messages.h>
#include	<PP_Resources.h>
#include	<LTextSelection.h>
#include	<LTextElemAEOM.h>
#include	<LStyleSet.h>
#include	<UAEGizmos.h>
#include	<UFontsStyles.h>
#include	<UAppleEventsMgr.h>
#include	<AERegistry.h>
#include	<AEVTextSuite.h>
#include	<LAEAction.h>
#include	<UModalDialogs.h>
#include	<VTextHandler.h>
#include	<VText_Commands.h>
#include	<VTSMProxy.h>
#include	<LStream.h>

#pragma	warn_unusedarg off

VTextView::VTextView()
{
	mTSMProxy = NULL;
}

VTextView::VTextView(LStream *inStream)
:	LTextView(inStream)
{
	mTSMProxy = NULL;
}

VTextView::~VTextView()
{
	SetTSMProxy(NULL);
}

void	VTextView::FinishCreateSelf(void)
{
	inherited::FinishCreateSelf();
	
	SetTSMProxy(WTSMManager::MakeInlineTSMProxy(*this));
}

#include	<VTextEngine.h>
#include	<VOTextModel.h>
#include	<VStyleSet.h>
#include	<LRulerSet.h>
#include	<UMemoryMgr.h>

void	VTextView::BuildTextObjects(LModelObject *inSuperModel)
{
	ThrowIfNULL_(inSuperModel);
	
	MakeTextObjects();

	LinkTextObjects(inSuperModel);
	
	SetTSMProxy(WTSMManager::MakeInlineTSMProxy(*this));
}

void	VTextView::MakeTextObjects(void)
{
	if (!mEventHandler)
		SetEventHandler(new VTextHandler);

	if (!mTextSelection)
		SetSelection(new LTextSelection);

	if (!mTextModel)
		SetTextModel(new VOTextModel);

	if (!mTextEngine) {
		SetTextEngine(new VTextEngine());
		
		mTextEngine->SetAttributes(textEngineAttr_MultiStyle | textEngineAttr_Editable | textEngineAttr_Selectable);
		Rect	r = {10, 10, 10, 10};
		mTextEngine->SetTextMargins(r);
		
		mTextEngine->SetDefaultStyleSet(new VStyleSet());
		mTextEngine->SetDefaultRulerSet(new LRulerSet());
	}
}

void	VTextView::LinkTextObjects(LModelObject *inSuperModel)
{
	LTextEditHandler	*handler = dynamic_cast<LTextEditHandler *>(mEventHandler);
	Assert_(handler == mEventHandler);
	if (handler) {
		handler->SetCommander(this);
		handler->SetSelection(mSelection);
		handler->SetTextEngine(mTextEngine);
		handler->SetTextModel(mTextModel);
		handler->SetHandlerView(this);
	}

	LTextSelection	*selection = dynamic_cast<LTextSelection *>(mSelection);
	Assert_(selection == mSelection);
	if (selection) {
		selection->SetSuperModel(mTextModel);
		selection->SetTextEngine(mTextEngine);
		selection->SetTextModel(mTextModel);
	}

	VOTextModel	*model = dynamic_cast<VOTextModel *>(mTextModel);
	Assert_(model == mTextModel);
	if (model)	{
		model->SetSuperModel(inSuperModel);
		model->SetSelection(mSelection);
		model->SetTextEngine(mTextEngine);
		
		ThrowIfNULL_(mTextEngine);
		if (mTextEngine) {
			LStyleSet	*style = mTextEngine->GetDefaultStyleSet();
			ThrowIfNULL_(style);
			style->SetSuperModel(model);
			model->AddStyle(style);

			LRulerSet	*ruler = mTextEngine->GetDefaultRulerSet();
			ThrowIfNULL_(ruler);
			ruler->SetSuperModel(model);
			model->AddRuler(ruler);
		}
	}
	
	Assert_(mTextEngine);
	if (mTextEngine) {
		mTextEngine->SetHandlerView(this);
		mTextEngine->AddListener(this);
	}

	//?	required to get image set to frame as needed on new window
	FixImage();
}

void	VTextView::ScrollImageBy(
	Int32		inLeftDelta,
	Int32		inTopDelta,
	Boolean		inRefresh)
{
	LSelectHandlerView::ScrollImageBy(inLeftDelta, inTopDelta, inRefresh);
}

void	VTextView::SetTextEngine(LTextEngine *inTextEngine)
{
	inherited::SetTextEngine(inTextEngine);
	
	SetTSMProxy(WTSMManager::MakeInlineTSMProxy(*this));
}

void	VTextView::SetTSMProxy(VInlineTSMProxy *inProxy)
{
	delete mTSMProxy;
	mTSMProxy = NULL;
	mTSMProxy = inProxy;
	
	VTextHandler	*textHandler = dynamic_cast<VTextHandler *>(mEventHandler);
	if (textHandler)
		textHandler->SetTSMProxy(mTSMProxy);
}

VInlineTSMProxy *	VTextView::GetTSMProxy(void)
{
	return mTSMProxy;
}

void	VTextView::DrawSelfSelection(void)
{
	if (mTSMProxy)
		mTSMProxy->DrawHilite();
	
	inherited::DrawSelfSelection();
}


void VTextView::BeTarget(void)
{
	inherited::BeTarget();
	
	if (mTSMProxy != NULL)
		mTSMProxy->Activate();
}

void VTextView::DontBeTarget(void)
{
	if (mTSMProxy != NULL)
		mTSMProxy->Deactivate();

	inherited::DontBeTarget();
}


/*-
Boolean	VTextView::ObeyCommand(
	CommandT	inCommand,
	void*		ioParam)
{
	Boolean		handled = false;
	ResIDT		menuNo;
	Int16		itemNo;
	
	if (IsSyntheticCommand(inCommand, menuNo, itemNo)) {
		switch (menuNo) {
			case MENU_Font:
			case MENU_Size:
			case MENU_Style:
			{
				StAEDescriptor	doerEvent;
				LAEStream		stream(kAEVTextSuite, kAEModify);
				stream.WriteKey(keyDirectObject);
				stream.WriteSpecifier(mSelection);
				switch (menuNo) {

					case MENU_Font:
					{
						Str255	fontName;
						Int16	fontNo = UFontMenu::GetFontNumber(itemNo);
						GetFontName(fontNo, fontName);
						if (fontName[0] == 0)
							Throw_(paramErr);
						stream.WriteKey(keyAEModifyProperty);
						stream.WriteEnumDesc(pFont);
						stream.WriteKey(keyAEModifyToValue);
						stream.WriteDesc(typeChar, fontName + 1, fontName[0]);
						break;
					}

					case MENU_Size:
					{
						Int16	size = USizeMenu::GetFontSize(itemNo);
						stream.WriteKey(keyAEModifyProperty);
						stream.WriteEnumDesc(pPointSize);
						stream.WriteKey(keyAEModifyToValue);
						stream.WriteDesc(typeShortInteger, &size, sizeof(size));
						break;
					}
					
					case MENU_Style:
					{
						Assert_(false);	//	wont happen
						break;
					}
				}
				stream.Close(&doerEvent.mDesc);
				LAEAction	*action = new LAEAction();
				action->SetRedoAE(doerEvent);
				action->SetSelection(mSelection, typeNull, typeNull);
				mSelection->UndoAddOldData(action);
				action->SetRecalcAccumulator(mTextEngine);
				action->SetRecordOnlyFinalState(true);
				PostAction(action);
				handled = true;
				break;
			}
			
			default:
				handled = inherited::ObeyCommand(inCommand, ioParam);
				break;
		}
	} else {
		switch (inCommand) {

			case cmd_Plain:
			case cmd_Bold:
			case cmd_Italic:
			case cmd_Underline:
			case cmd_Outline:
			case cmd_Shadow:
			case cmd_Condense:
			case cmd_Extend:
			case cmd_FontLarger:
			case cmd_FontSmaller:
			{
				StAEDescriptor	doerEvent;
				LAEStream		stream(kAEVTextSuite, kAEModify);
				stream.WriteKey(keyDirectObject);
				stream.WriteSpecifier(mSelection);
				switch (inCommand) {

					case cmd_Plain:
						stream.WriteKey(keyAEModifyProperty);
						stream.WriteEnumDesc(pTextStyles);
						stream.WriteKey(keyAEModifyToValue);
						UFontsStyles::WriteStyles(stream, normal);
						break;

					case cmd_Bold:
					case cmd_Italic:
					case cmd_Underline:
					case cmd_Outline:
					case cmd_Shadow:
					case cmd_Condense:
					case cmd_Extend:
						stream.WriteKey(keyAEModifyProperty);
						stream.WriteEnumDesc(pTextStyles);
						stream.WriteKey(keyAEModifyByValue);
						UFontsStyles::WriteStyles(stream, 0x1L << (inCommand - cmd_Bold));
						break;
						
					case cmd_FontLarger:
					case cmd_FontSmaller:
					{
						Int16	value = (inCommand == cmd_FontSmaller)
											?	-1
											:	1;
						stream.WriteKey(keyAEModifyProperty);
						stream.WriteEnumDesc(pPointSize);
						stream.WriteKey(keyAEModifyByValue);
						stream.WriteDesc(typeShortInteger, &value, sizeof(value));
						break;
					}

				}
				stream.Close(&doerEvent.mDesc);
				LAEAction	*action = new LAEAction();
				action->SetRedoAE(doerEvent);
				action->SetSelection(mSelection, typeNull, typeNull);
				mSelection->UndoAddOldData(action);
				action->SetRecalcAccumulator(mTextEngine);
				action->SetRecordOnlyFinalState(true);
				PostAction(action);
				handled = true;
				break;
			}
			
			case cmd_FontOther:
			{
				LStyleSet		*style = NULL;
				if (mTextSelection)
					style = mTextSelection->GetCurrentStyle();
				ThrowIfNULL_(style);
				StAEDescriptor	value;
				style->GetAEProperty(pPointSize, UAppleEventsMgr::sAnyType, value);
				LAESubDesc		valueSD(value);
				Int32			presentSize = valueSD.ToInt32(),
								newSize = presentSize;
				
				if (
					UModalDialogs::AskForOneNumber(this, Wind_FontSizeDialog, pane_FontSize, newSize) &&
					(newSize != presentSize)
				) {
					StAEDescriptor	doerEvent;
					LAEStream		stream(kAEVTextSuite, kAEModify);
					stream.WriteKey(keyDirectObject);
					stream.WriteSpecifier(mSelection);
					stream.WriteKey(keyAEModifyProperty);
					stream.WriteEnumDesc(pPointSize);
					stream.WriteKey(keyAEModifyToValue);
					stream.WriteDesc(typeLongInteger, &newSize, sizeof(newSize));
					stream.Close(&doerEvent.mDesc);
					LAEAction	*action = new LAEAction();
					action->SetRedoAE(doerEvent);
					action->SetSelection(mSelection);
					mSelection->UndoAddOldData(action);
					action->SetRecalcAccumulator(mTextEngine);
					action->SetRecordOnlyFinalState(true);
					PostAction(action);
				}
				handled = true;
				break;
			}
	
			default:
				handled = inherited::ObeyCommand(inCommand, ioParam);
				break;
		}
	}
		
	return handled;
}

void	VTextView::FindCommandStatus(
	CommandT	inCommand,
	Boolean		&outEnabled,
	Boolean		&outUsesMark,
	Char16		&outMark,
	Str255		outName)
{
	ResIDT		menuNo;
	Int16		itemNo;
	Boolean		puntToStyle = false;
	
	if (IsSyntheticCommand(inCommand, menuNo, itemNo)) {
		switch (menuNo) {
			case MENU_Font:
				UFontMenu::EnableMenu();
				UFontMenu::EnableEveryItem();
				if (menuNo == 0) {
					UFontMenu::DisableEveryItem();
					break;
				}
				//	fall through
				
			case MENU_Size:
			case MENU_Style:
				puntToStyle = true;
				break;
		}
	}
	
	if (!puntToStyle) {
		switch (inCommand) {
			
			case cmd_FontMenuItem:
			case cmd_SizeMenuItem:
			case cmd_StyleMenuItem:
				outEnabled = true;
				break;

			case cmd_Plain:
			case cmd_Bold:
			case cmd_Italic:
			case cmd_Underline:
			case cmd_Outline:
			case cmd_Shadow:
			case cmd_Condense:
			case cmd_Extend:
			case cmd_FontLarger:
			case cmd_FontSmaller:
			case cmd_FontOther:
				puntToStyle = true;
				break;
		}
	}
	
	LStyleSet		*style = NULL;
	if (mTextSelection)
		style = mTextSelection->GetCurrentStyle();

	if (puntToStyle && style) {
		Boolean	found = style->FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName);
//?		Assert_(found);
	} else {
		switch (inCommand) {
			
			case cmd_FontMenuItem:
			case cmd_SizeMenuItem:
			case cmd_StyleMenuItem:
				outEnabled = true;
				break;

			default:
				inherited::FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName);
				break;
		}
	}
	
}
*/