#include <vcl.h>
#pragma hdrstop
#include <windows.hpp>
#include <stdlib.h>
#include <stdio.h>
#include "editentryfrm.h"
#include <swdisprtf.h>
#include "rxricheditx.h"
const float RulerAdj = 4.0/3.0;
const int GutterWid = 6;
//----------------------------------------------------------------------------
#pragma resource "*.dfm"
TEditEntryForm *EditEntryForm;
//----------------------------------------------------------------------------
__fastcall TEditEntryForm::TEditEntryForm(TComponent *Owner) : TForm(Owner) {
ResultBuf = 0;
RichEdit1 = new TRxRichEditX(this);
RichEdit1->Parent = pnlRichEdit;
RichEdit1->Align = alClient;
RichEdit1->ScrollBars = ssVertical;
}
__fastcall TEditEntryForm::~TEditEntryForm() {
if (ResultBuf)
delete [] ResultBuf;
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::SelectionChange(TObject */*Sender*/) {
char sizebuf[6];
try {
FUpdating = True;
FirstInd->Left = int(RichEdit1->Paragraph->FirstIndent*RulerAdj)-
4+GutterWid;
LeftInd->Left = int((RichEdit1->Paragraph->LeftIndent+
RichEdit1->Paragraph->FirstIndent)*RulerAdj)-
4+GutterWid;
RightInd->Left = Ruler->ClientWidth-6-int(
(RichEdit1->Paragraph->RightIndent+GutterWid)*RulerAdj);
BoldButton->Down = RichEdit1->SelAttributes->Style.Contains(fsBold);
ItalicButton->Down = RichEdit1->SelAttributes->Style.Contains(fsItalic);
UnderlineButton->Down = RichEdit1->SelAttributes->Style.Contains(fsUnderline);
BulletsButton->Down = bool(RichEdit1->Paragraph->Numbering);
FontSize->Text = itoa(RichEdit1->SelAttributes->Size, sizebuf, 10);
switch((int)RichEdit1->Paragraph->Alignment)
{ case 0: LeftAlign->Down = True; break;
case 1: RightAlign->Down = True; break;
case 2: CenterAlign->Down = True; break;
}
}
catch (...) {
FUpdating = False;
}
FUpdating = False;
}
//----------------------------------------------------------------------------
TRxTextAttributes *__fastcall TEditEntryForm::CurrText(void)
{
return RichEdit1->SelAttributes;
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::CheckFileSave(void)
{
if ( RichEdit1->Modified ) {
switch(MessageBox(Handle, "Save Changes?","Modify Comment",MB_YESNOCANCEL | MB_ICONQUESTION)) {
case ID_YES : ExtractRTF(); break;
case ID_CANCEL : Abort(); break;
default:
if (ResultBuf)
delete [] ResultBuf;
ResultBuf = 0;
break;
};
}
}
void __fastcall TEditEntryForm::SetupRuler(void)
{ int iCtr = 1;
char sTmp[201];
while (iCtr < 200) {
sTmp[iCtr] = 9;
iCtr++;
sTmp[iCtr] = '|';
iCtr++;
}
Ruler->Caption = (AnsiString)sTmp;
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::SetEditRect(void)
{ TRect Rct = Rect(GutterWid, 0, RichEdit1->ClientWidth-GutterWid,
ClientHeight);
SendMessage(RichEdit1->Handle, EM_SETRECT, 0, long(&Rct));
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::FormCreate(TObject* /*Sender*/)
{ Application->OnHint = &ShowHint;
SetupRuler();
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::ShowHint(TObject* /*Sender*/)
{ StatusBar->SimpleText = Application->Hint;
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::EditUndoClick(TObject* /*Sender*/)
{ if ( RichEdit1->HandleAllocated() )
SendMessage(RichEdit1->Handle, EM_UNDO, 0, 0);
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::EditCutClick(TObject* /*Sender*/)
{ RichEdit1->CutToClipboard();
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::EditCopyClick(TObject* /*Sender*/)
{ RichEdit1->CopyToClipboard();
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::EditPasteClick(TObject* /*Sender*/)
{ RichEdit1->PasteFromClipboard();
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::RulerResize(TObject* /*Sender*/)
{ RulerLine->Width = (int)Ruler->ClientWidth - (RulerLine->Left*2);
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::FormResize(TObject* Sender)
{ SetEditRect();
SelectionChange(Sender);
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::FormPaint(TObject* /*Sender*/)
{ SetEditRect();
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::BoldButtonClick(TObject* /*Sender*/)
{ if ( !FUpdating )
{ if ( BoldButton->Down )
CurrText()->Style = CurrText()->Style << fsBold;
else
CurrText()->Style = CurrText()->Style >> fsBold;
}
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::ItalicButtonClick(TObject* /*Sender*/)
{ if ( !FUpdating )
{
if ( ItalicButton->Down )
CurrText()->Style = CurrText()->Style << fsItalic;
else
CurrText()->Style = CurrText()->Style >> fsItalic;
}
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::UnderlineButtonClick(TObject* /*Sender*/)
{
if ( !FUpdating ) {
if ( UnderlineButton->Down )
CurrText()->Style = CurrText()->Style << fsUnderline;
else CurrText()->Style = CurrText()->Style >> fsUnderline;
}
}
void __fastcall TEditEntryForm::FontSizeChange(TObject* /*Sender*/)
{
int fontsize = atoi(FontSize->Text.c_str());
if ((!FUpdating) && (fontsize)) {
if (fontsize < 1) {
ShowMessage("Please Enter a Number betweek 1 and 1638");
FontSize->Text = 1;
}
else if (fontsize > 1638) {
ShowMessage("Please Enter a Number betweek 1 and 1638");
FontSize->Text = 1638;
}
CurrText()->Size = atoi(FontSize->Text.c_str());
}
}
void __fastcall TEditEntryForm::AlignClick(TObject* Sender)
{
if ( !FUpdating ) {
TControl *oAliBtn = (TControl*)(Sender);
RichEdit1->Paragraph->Alignment = (TAlignment)oAliBtn->Tag;
}
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::BulletsButtonClick(TObject* /*Sender*/)
{ if ( !FUpdating )
RichEdit1->Paragraph->Numbering = (TNumberingStyle)BulletsButton->Down;
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::FormCloseQuery(TObject* /*Sender*/,
bool & CanClose)
{ try {
CheckFileSave();
}
catch (...) {
CanClose = False;
}
}
//----------------------------------------------------------------------------
//***************************
//***Ruler Indent Dragging***
//***************************
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::RulerItemMouseDown(TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{ TLabel * oTmpLabel = (TLabel *)Sender;
FDragOfs = oTmpLabel->Width / 2;
oTmpLabel->Left = oTmpLabel->Left+X-FDragOfs;
FDragging = True;
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::RulerItemMouseMove(TObject *Sender, TShiftState Shift, int X, int /*Y*/) {
if (FDragging) {
TLabel *oTmpLabel = (TLabel *)Sender;
oTmpLabel->Left = oTmpLabel->Left+X-FDragOfs;
oTmpLabel->Left -= oTmpLabel->Left % 10;
}
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::FirstIndMouseUp(TObject *Sender, TMouseButton
Button, TShiftState Shift, int X, int Y)
{ FDragging = False;
RichEdit1->Paragraph->FirstIndent = int((FirstInd->Left+FDragOfs-GutterWid) / RulerAdj);
LeftIndMouseUp(Sender, Button, Shift, X, Y);
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::LeftIndMouseUp(TObject *Sender, TMouseButton
/*Button*/, TShiftState /*Shift*/, int /*X*/, int /*Y*/)
{ FDragging = False;
RichEdit1->Paragraph->LeftIndent = int((LeftInd->Left+FDragOfs-GutterWid)/
RulerAdj)-RichEdit1->Paragraph->FirstIndent;
SelectionChange(Sender);
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::RightIndMouseUp(TObject *Sender, TMouseButton
/*Button*/, TShiftState /*Shift*/, int /*X*/, int /*Y*/)
{ FDragging = False;
RichEdit1->Paragraph->RightIndent =
int((Ruler->ClientWidth-RightInd->Left+FDragOfs-2) /
RulerAdj)-2*GutterWid;
SelectionChange(Sender);
}
//----------------------------------------------------------------------------
void __fastcall TEditEntryForm::FormActivate(TObject *Sender)
{
System::AnsiString newtext, tmptext;
if (Module) {
TMemoryStream *RTFStream = new TMemoryStream();
newtext = RTFDisplay->RTFHeader;
Module->Error(); // clear error;
newtext = newtext + "\\pard \\nowidctlpar \\cf0 ";
(const char *)*Module; // force key to snap to entry before pulling out the text of the key
tmptext = Module->getRawEntry();
newtext = newtext + RTFDisplay->RTFVersePre + " " + tmptext + RTFDisplay->RTFVersePost;
newtext = newtext + RTFDisplay->RTFTrailer;
RTFStream->Clear();
RTFStream->WriteBuffer(newtext.c_str(), newtext.Length());
RTFStream->Position = 0;
RichEdit1->Lines->LoadFromStream(RTFStream);
delete RTFStream;
}
SelectionChange(this);
RichEdit1->SetFocus();
if (ResultBuf)
delete [] ResultBuf;
ResultBuf = 0;
}
//---------------------------------------------------------------------
void TEditEntryForm::ExtractRTF()
{
System::AnsiString newtext, tmptext;
TMemoryStream *RTFStream = new TMemoryStream();
char *tmpbuf, *datastart;
RTFStream->Clear();
RichEdit1->Lines->SaveToStream(RTFStream);
RTFStream->Position = 0;
if (ResultBuf)
delete [] ResultBuf;
tmpbuf = new char [ RTFStream->Size + 1];
RTFStream->ReadBuffer(tmpbuf, RTFStream->Size);
tmpbuf[RTFStream->Size] = 0;
char *tbl = strstr(tmpbuf, "colortbl");
if (!tbl)
tbl = strstr(tmpbuf, "fonttbl");
if (tbl) {
strtok(tbl, "}");
// strtok(NULL, "}");
datastart = strtok(NULL, "");
ResultBuf = new char [ strlen(datastart) + 2 ];
ResultBuf[0] = '{';
strcpy(ResultBuf+1, datastart);
delete [] tmpbuf;
delete RTFStream;
//-------- Change all fonts to \f1
for (int i = 0; i < strlen(ResultBuf)-4; i++) {
if (ResultBuf[i] == '\\') {
if (ResultBuf[i+1] == '\\') { // skip a real '\' character
i += 1;
continue;
}
if (ResultBuf[i+1] == 'f') {
if (isdigit(ResultBuf[i+2])) {
ResultBuf[i+2] = '1';
if (isdigit(ResultBuf[i+3])) {
memmove(&ResultBuf[i+3], &ResultBuf[i+4], strlen(&ResultBuf[i+3]));
}
}
}
if (ResultBuf[i+1] == 'c') {
if (ResultBuf[i+2] == 'f') {
if (isdigit(ResultBuf[i+3])) {
ResultBuf[i+3] = '7';
if (isdigit(ResultBuf[i+4])) {
memmove(&ResultBuf[i+4], &ResultBuf[i+5], strlen(&ResultBuf[i+4]));
}
}
}
}
}
}
}
}
__fastcall TCharsetObject::TCharsetObject(int FCharset)
: TObject()
{
Charset = FCharset;
}
//---------------------------------------------------------------------------