//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#include <vcl\Clipbrd.hpp>
#if __BORLANDC__ > 0x0530
#include <vcl\Jpeg.hpp>
#endif
#pragma hdrstop
#include "CtrlImg.hpp"
#include "RVTable.hpp"
#include "RVMisc.hpp"
#include "Unit1.h"
#include "PreviewFrm.h"
#include "RVUndoStr.h"
#include "CPFrm.h"
#include "PropFrm.h"
#include "ListFrm.h"
#include "OptionsFrm.h"
//---------------------------------------------------------------------------
#pragma link "RVEdit"
#pragma link "RichView"
#pragma link "RVScroll"
#pragma link "PtblRV"
#pragma link "RVStyle"
#pragma link "CtrlImg"
#pragma link "RVTable"
#pragma link "RVMisc"
#pragma link "RVUni"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// This function is used in mitEditCheckpointClick() and mitEditPropsClick()
// to convert tag to string
AnsiString GetTagStr(int Tag)
{
if (Form1->RichViewEdit1->Options.Contains(rvoTagsArePChars))
if (!Tag)
return "";
else
return (char*)Tag;
else
return IntToStr(Tag);
}
// This function is used in mitEditCheckpointClick() and mitEditPropsClick()
// to create tags from string TagStr (user input in edit box)
int MakeTag(const AnsiString TagStr)
{
if (TagStr!="" &&
Form1->RichViewEdit1->Options.Contains(rvoTagsArePChars))
{
char* r = StrNew(TagStr.c_str());
return (int)r;
}
else
return StrToIntDef(TagStr,0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Randomize;
HTMLSaveOptions << rvsoImageSizes << rvsoUseCheckpointsNames;
HTMLTitle = "Demo File";
// We need to register classes in order to load them from rvf files
TComponentClass Classes[3] = { __classid(TButton), __classid(TEdit), __classid(TOleContainer) };
RegisterClasses(Classes,2);
RVStyle1->TextStyles->Items[11]->FontName = GetUnicodeFontName();
// This demo program is saved in C++Builder 1, where Charset property is not available.
// So assigning non-default charset here:
#if __BORLANDC__ > 0x520
RVStyle1->TextStyles->Items[6]->Charset = SYMBOL_CHARSET;
RVStyle1->ListStyles->Items[0]->Levels->Items[0]->Font->Charset = SYMBOL_CHARSET;
#endif
// Items can have associated "tags" - integers or strings.
// Comment next line to use integer tags
RichViewEdit1->Options << rvoTagsArePChars;
RichViewEdit1->LoadRVF(ExtractFilePath(Application->ExeName)+"Readme.rvf");
FillStyleCombo(RVStyle1->ParaStyles, cmbPara);
FillStyleCombo(RVStyle1->TextStyles, cmbText);
RichViewEdit1->Format();
cmbPara->ItemIndex = RichViewEdit1->CurParaStyleNo;
cmbText->ItemIndex = RichViewEdit1->CurTextStyleNo;
UpdateUndoMenu();
}
//---------------------------------------------------------------------------
// Returning available Unicode-enabled font
AnsiString TForm1::GetUnicodeFontName()
{
if (Screen->Fonts->IndexOf("Arial Unicode MS")>=0)
return "Arial Unicode MS";
if (Screen->Fonts->IndexOf("Lucida Sans Unicode")>=0)
return "Lucida Sans Unicode";
return "Arial";
}
//---------------------------------------------------------------------------
// Filling combobox with standard styles
void TForm1::FillStyleCombo(TCustomRVInfos* Styles, TComboBox* cmb)
{
/* The simplest way to fill the combo box with style names is:
cmb.Items.Assign(Styles);
But this code will fill the combo box with all styles -
both standard styles (i.e. real styles) and non-standard styles will be
added in it.
So we'll fill in the combo box manually.
For simplification, we'll add only the first standard styles */
cmb->Items->BeginUpdate();
cmb->Items->Clear();
for (int i = 0; i< Styles->Count; i++)
{
if (!((TCustomRVInfo*)(Styles->Items[i]))->Standard)
break;
cmb->Items->Add(((TCustomRVInfo*)(Styles->Items[i]))->StyleName);
}
cmb->Items->EndUpdate();
}
//---------------------------------------------------------------------------
void TForm1::UpdateUndoMenu()
{
TRVUndoType UndoType = RichViewEdit1->UndoAction();
mitUndo->Enabled = UndoType!=rvutNone;
if (UndoType==rvutCustom)
mitUndo->Caption = "Undo "+RichViewEdit1->UndoName();
else
mitUndo->Caption = "Undo "+RVUndoTypeNamesEn[UndoType];
UndoType = RichViewEdit1->RedoAction();
mitRedo->Enabled = UndoType!=rvutNone;
if (UndoType==rvutCustom)
mitRedo->Caption = "Redo "+RichViewEdit1->RedoName();
else
mitRedo->Caption = "Redo "+RVUndoTypeNamesEn[UndoType];
}
//---------------------------------------------------------------------------
void TForm1::DisplayUnicodeWarning()
{
bool wasclear = RichViewEdit1->ItemCount==0;
// This method is called before loading Unicode
// (when inserting Unicode, editor automatically switches to Unicode style,
// according to RVStyle1->DefUnicodeStyle, if necessary)
if (!RVStyle1->TextStyles->Items[RichViewEdit1->CurTextStyleNo]->Unicode)
Application->MessageBox("Loading/Inserting Unicode data using non-Unicode text style.\n"
"Text will be converted.\n"
"Choose 'Unicode' style in combo to use Unicode text style",
"Warning", MB_OK | MB_ICONEXCLAMATION);
if (wasclear)
RichViewEdit1->Clear();
}
//======================================================================
// Font and paragraph combos
//======================================================================
void __fastcall TForm1::RichViewEdit1CurParaStyleChanged(TObject *Sender)
{
if (RichViewEdit1->CurParaStyleNo < cmbPara->Items->Count)
cmbPara->ItemIndex = RichViewEdit1->CurParaStyleNo;
else
cmbPara->ItemIndex = -1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RichViewEdit1CurTextStyleChanged(TObject *Sender)
{
if (RichViewEdit1->CurTextStyleNo < cmbText->Items->Count)
cmbText->ItemIndex = RichViewEdit1->CurTextStyleNo;
else
cmbText->ItemIndex = -1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cmbParaClick(TObject *Sender)
{
RichViewEdit1->ApplyParaStyle(cmbPara->ItemIndex);
RichViewEdit1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cmbTextClick(TObject *Sender)
{
RichViewEdit1->ApplyTextStyle(cmbText->ItemIndex);
RichViewEdit1->SetFocus();
}
//======================================================================
// Main menu: "File"
//======================================================================
// File|Load...
void __fastcall TForm1::mitLoadClick(TObject *Sender)
{
OpenDialog1->Title = "Loading & Import";
OpenDialog1->Filter = "RichView Format Files(*.rvf)|*.rvf|"
"RTF Files (*.rtf)|*.rtf|"
"Text Files - autodetect (*.txt)|*.txt|"
"ANSI Text Files (*.txt)|*.txt|"
"Unicode Text Files (*.txt)|*.txt";
if (OpenDialog1->Execute())
{
Screen->Cursor = crHourGlass;
int CurTextStyleNo = RichViewEdit1->CurTextStyleNo;
int CurParaStyleNo = RichViewEdit1->CurParaStyleNo;
bool r;
CloseOleContainer();
RichViewEdit1->Clear();
RichViewEdit1->CurTextStyleNo = CurTextStyleNo;
RichViewEdit1->CurParaStyleNo = CurParaStyleNo;
RVStyle1->DefUnicodeStyle = -1;
switch (OpenDialog1->FilterIndex)
{
case 1: // RVF
r = RichViewEdit1->LoadRVF(OpenDialog1->FileName);
break;
case 2: // RTF
r = RichViewEdit1->LoadRTF(OpenDialog1->FileName);
break;
case 3: // Text
if (RV_TestFileUnicode(OpenDialog1->FileName)==rvutYes)
{
DisplayUnicodeWarning();
r = RichViewEdit1->LoadTextW(OpenDialog1->FileName,CurTextStyleNo,CurParaStyleNo,false);
}
else
r = RichViewEdit1->LoadText(OpenDialog1->FileName,CurTextStyleNo,CurParaStyleNo,false);
break;
case 4: // ANSI text
r = RichViewEdit1->LoadText(OpenDialog1->FileName,CurTextStyleNo,CurParaStyleNo,false);
break;
case 5: // Unicode text
DisplayUnicodeWarning();
r = RichViewEdit1->LoadTextW(OpenDialog1->FileName,CurTextStyleNo,CurParaStyleNo,false);
break;
default:
r = False;
}
Screen->Cursor = crDefault;
if (!r)
{
AnsiString ErrorMessage = "Error during loading";
if (OpenDialog1->FilterIndex==1)
ErrorMessage += GetRVFErrors();
Application->MessageBox(ErrorMessage.c_str(), "Error", 0);
}
FillStyleCombo(RVStyle1->ParaStyles, cmbPara);
FillStyleCombo(RVStyle1->TextStyles, cmbText);
RichViewEdit1->Format();
cmbPara->ItemIndex = RichViewEdit1->CurParaStyleNo;
cmbText->ItemIndex = RichViewEdit1->CurTextStyleNo;
UpdateUndoMenu();
}
}
//---------------------------------------------------------------------------
// Event: picture needed while reading from RVF
void __fastcall TForm1::RichViewEdit1RVFPictureNeeded(TCustomRichView *Sender,
AnsiString Name, int Tag, TGraphic *&gr)
{
gr = new Graphics::TBitmap;
gr->LoadFromFile(ExtractFilePath(Application->ExeName)+"default.bmp");
}
//---------------------------------------------------------------------------
// Event: control needed while reading from RVF
void __fastcall TForm1::RichViewEdit1RVFControlNeeded(TCustomRichView *Sender,
AnsiString Name, int Tag, TControl *&ctrl)
{
ctrl = new TButton ((TComponent*)NULL);
((TButton*)(ctrl))->Caption = "from file";
}
//---------------------------------------------------------------------------
// Event: imagelist needed while reading from RVF
void __fastcall TForm1::RichViewEdit1RVFImageListNeeded(TCustomRichView *Sender,
int ImageListTag, TCustomImageList *&il)
{
il = this->il;
}
//---------------------------------------------------------------------------
AnsiString TForm1::GetRVFErrors()
{
AnsiString Result = "";
if (RichViewEdit1->RVFWarnings.Contains(rvfwUnknownPicFmt))
Result += "unknown picture format;";
if (RichViewEdit1->RVFWarnings.Contains(rvfwUnknownCtrls))
Result += "unknown control class;";
if (RichViewEdit1->RVFWarnings.Contains(rvfwConvUnknownStyles))
Result += "text, paragraph or list style is not present;";
if (RichViewEdit1->RVFWarnings.Contains(rvfwConvLargeImageIdx))
Result += "invalid image-list index;";
if (Result.Length()>0)
Result = "\n("+Result+")";
return Result;
}
//---------------------------------------------------------------------------
// File|Save...
void __fastcall TForm1::mitSaveClick(TObject *Sender)
{
SaveDialog1->Title = "Save & Export";
SaveDialog1->Filter = "RichView Format files(*.rvf)|*.rvf|"
"RTF Files (*.rtf)|*.rtf|"
"Text (*.txt)|*.txt|"
"Unicode Text (*.txt)|*.txt|"
"HTML - with CSS (*.htm;*.html)|*.htm;*.html"
"HTML - Simplified (*.htm;*.html)|*.htm;*.html|";
SaveDialog1->DefaultExt = "rvf";
if (SaveDialog1->Execute())
{
Screen->Cursor = crHourGlass;
bool r;
switch (SaveDialog1->FilterIndex)
{
case 1: // RVF
r = RichViewEdit1->SaveRVF(SaveDialog1->FileName, false);
break;
case 2: // RTF
r = RichViewEdit1->SaveRTF(SaveDialog1->FileName, false);
break;
case 3: // ANSI Text (byte per character)
r = RichViewEdit1->SaveText(SaveDialog1->FileName, 80);
break;
case 4: // Unicode Text (2 bytes per character)
r = RichViewEdit1->SaveTextW(SaveDialog1->FileName, 80);
break;
case 5: // HTML with CSS
r = RichViewEdit1->SaveHTMLEx(SaveDialog1->FileName, HTMLTitle,"img",
"","","", HTMLSaveOptions);
break;
case 6: // HTML
r = RichViewEdit1->SaveHTML(SaveDialog1->FileName, HTMLTitle,"img",
HTMLSaveOptions);
break;
default:
r = false;
}
Screen->Cursor = crDefault;
if (!r)
Application->MessageBox("Error during saving", "Error", 0);
}
}
//---------------------------------------------------------------------------
// File | Options
void __fastcall TForm1::OptionsforSavingLoading1Click(TObject *Sender)
{
TRVFOptions RVFOptions;
frmOptions->SetOptions(RichViewEdit1->RVFOptions, HTMLSaveOptions, HTMLTitle);
if (frmOptions->ShowModal()==mrOk)
{
frmOptions->GetOptions(RVFOptions, HTMLSaveOptions, HTMLTitle);
RichViewEdit1->RVFOptions = RVFOptions;
}
}
//---------------------------------------------------------------------------
// Event: saving controls in HTML
// Note: code below works normally in Internet Explorer
// Netscape 3 and 4 does not support <INPUT> tags outside <FORM></FORM> tags
// (Netscape 6 does)
void __fastcall TForm1::RichViewEdit1SaveComponentToFile(
TCustomRichView *Sender, AnsiString Path, TPersistent *SaveMe,
TRVSaveFormat SaveFormat, AnsiString &OutStr)
{
switch (SaveFormat)
{
case rvsfText:
OutStr = AnsiString("(")+SaveMe->ClassName()+")";
break;
case rvsfHTML:
if (SaveMe->InheritsFrom(__classid(TButton)))
{
OutStr = "<INPUT type=\"button\" value=\""+((TButton*)SaveMe)->Caption+"\" "
"onClick=\"alert('Just a demo')\">";
return;
}
if (SaveMe->InheritsFrom(__classid(TEdit)))
{