/*
* RichTextEditor.cpp
* Copyright (c) 2009 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
*/
// SOL++2000
// 2000.02.18
// 2008/09/16 Modified to use restoreFileFolder/saveFileFolder for the directory
// of FileDialog.
#include <sol\ApplicationView.h>
#include <sol\FileDialog.h>
#include <sol\ScrolledRichText.h>
#include <sol\Font.h>
#include <sol\FontDialog.h>
#include <sol\ClientDC.h>
#include <sol\FileStream.h>
#include <sol/MessageFont.h>
#include "resource.h"
namespace SOL {
class RichTextEditor :public ApplicationView {
ScrolledRichText text;
MessageFont font;
FileDialog filedlg;
FontDialog fontdlg;
void clear(Action& action) { text.clear();}
void openRTF(Action& action);
void openText(Action& action);
void saveAsRTF(Action& action);
void saveAsText(Action& action);
void dropped(Action& action);
void bold(Action& action);
void italic(Action& action);
void underline(Action& action);
void incSize(Action& action);
void decSize(Action& action);
void changeFont(Action& action);
void setCaption(TCHAR* filename);
public:
RichTextEditor(Application& applet, const TCHAR* name, Args& args);
};
RichTextEditor::RichTextEditor(Application& applet, const TCHAR* name, Args& args)
:ApplicationView(applet, name, args)
{
Args ar;
ar.set(XmNexStyle, (ulong)WS_EX_ACCEPTFILES);
text.create(this, NULL, ar);
add(text);
text.setEventMask(ENM_DROPFILES);
text.addCallback(XmNdropFilesCallback, this,
(Callback)&RichTextEditor::dropped, NULL);
addCallback(XmNmenuCallback, ID_NEW, this,
(Callback)&RichTextEditor::clear, NULL);
addCallback(XmNmenuCallback, ID_OPENRTF, this,
(Callback)&RichTextEditor::openRTF, NULL);
addCallback(XmNmenuCallback, ID_OPENTEXT, this,
(Callback)&RichTextEditor::openText, NULL);
addCallback(XmNmenuCallback, ID_SAVEASRTF, this,
(Callback)&RichTextEditor::saveAsRTF, NULL);
addCallback(XmNmenuCallback, ID_SAVEASTEXT, this,
(Callback)&RichTextEditor::saveAsText, NULL);
addCallback(XmNmenuCallback, ID_EXIT, this,
(Callback)&RichTextEditor::exit, NULL);
addCallback(XmNmenuCallback, ID_BOLD, this,
(Callback)&RichTextEditor::bold, NULL);
addCallback(XmNmenuCallback, ID_ITALIC, this,
(Callback)&RichTextEditor::italic, NULL);
addCallback(XmNmenuCallback, ID_UNDERLINE, this,
(Callback)&RichTextEditor::underline, NULL);
addCallback(XmNmenuCallback, ID_INCSIZE, this,
(Callback)&RichTextEditor::incSize, NULL);
addCallback(XmNmenuCallback, ID_DECSIZE, this,
(Callback)&RichTextEditor::decSize, NULL);
addCallback(XmNmenuCallback, ID_CHANGEFONT, this,
(Callback)&RichTextEditor::changeFont, NULL);
ar.reset();
filedlg.create(this, NULL, ar);
ar.reset();
fontdlg.create(this, NULL, ar);
ClientDC dc(this);
font.create(9);
text.setFont(font);
}
void RichTextEditor::setCaption(TCHAR* filename)
{
if(filename) {
TCHAR text[MAX_PATH];
_stprintf_s(text, SizeOf(text), _T("%s - RichTextEditor"), filename);
setText(text);
}
}
void RichTextEditor::openRTF(Action& action)
{
TCHAR dir[_MAX_PATH];
if (restoreFileFolder(dir, sizeof(dir))) {
Args ar;
ar.set(XmNdirectory, dir);
filedlg.setValues(ar);
}
filedlg.setCaption(_T("Open as RTF"));
if(filedlg.open()) {
TCHAR* filename = filedlg.getFileName();
text.streamIn(filename, SF_RTF);
setCaption(filename);
saveFileFolder(filename);
}
}
void RichTextEditor::openText(Action& action)
{
TCHAR dir[_MAX_PATH];
if (restoreFileFolder(dir, sizeof(dir))) {
Args ar;
ar.set(XmNdirectory, dir);
filedlg.setValues(ar);
}
filedlg.setCaption(_T("Open as Text"));
if(filedlg.open()) {
TCHAR* filename = filedlg.getFileName();
text.streamIn(filename, SF_TEXT);
setCaption(filename);
saveFileFolder(filename);
}
}
void RichTextEditor::saveAsRTF(Action& action)
{
TCHAR dir[_MAX_PATH];
if (restoreFileFolder(dir, sizeof(dir))) {
Args ar;
ar.set(XmNdirectory, dir);
filedlg.setValues(ar);
}
filedlg.setCaption(_T("Sava as RTF"));
if(filedlg.save()) {
TCHAR* filename = filedlg.getFileName();
text.streamOut(filename, SF_RTF);
setCaption(filename);
saveFileFolder(filename);
}
}
void RichTextEditor::saveAsText(Action& action)
{
TCHAR dir[_MAX_PATH];
if (restoreFileFolder(dir, sizeof(dir))) {
Args ar;
ar.set(XmNdirectory, dir);
filedlg.setValues(ar);
}
filedlg.setCaption(_T("Sava as Text"));
if(filedlg.save()) {
TCHAR* filename = filedlg.getFileName();
text.streamOut(filename, SF_TEXT);
setCaption(filename);
saveFileFolder(filename);
}
}
void RichTextEditor::dropped(Action& action)
{
Event& event = action.getEvent();
ENDROPFILES* endrop = (ENDROPFILES*)event.getLParam();
HDROP hdrop = (HDROP)endrop->hDrop;
TCHAR filename[_MAX_PATH];
::DragQueryFile(hdrop, 0, filename, sizeof(filename));
text.streamIn(filename, SF_TEXT|SFF_SELECTION);
}
void RichTextEditor::bold(Action& action)
{
CHARFORMAT cf;
cf.cbSize = sizeof(cf);
text.getCharFormat(TRUE, &cf);
cf.dwMask |= CFM_BOLD;
cf.dwEffects ^= CFE_BOLD;
text.setCharFormat(SCF_SELECTION, &cf);
}
void RichTextEditor::italic(Action& action)
{
CHARFORMAT cf;
cf.cbSize = sizeof(cf);
text.getCharFormat(TRUE, &cf);
cf.dwMask |= CFM_ITALIC;
cf.dwEffects ^= CFE_ITALIC;
text.setCharFormat(SCF_SELECTION, &cf);
}
void RichTextEditor::underline(Action& action)
{
CHARFORMAT cf;
cf.cbSize = sizeof(cf);
text.getCharFormat(TRUE, &cf);
cf.dwMask |= CFM_UNDERLINE;
cf.dwEffects ^= CFE_UNDERLINE;
text.setCharFormat(SCF_SELECTION, &cf);
}
void RichTextEditor::incSize(Action& action)
{
CHARFORMAT cf;
cf.cbSize = sizeof(cf);
text.getCharFormat(TRUE, &cf);
cf.dwMask = CFM_SIZE;
cf.yHeight += 20*2;
text.setCharFormat(SCF_SELECTION, &cf);
}
void RichTextEditor::decSize(Action& action)
{
CHARFORMAT cf;
cf.cbSize = sizeof(cf);
text.getCharFormat(TRUE, &cf);
cf.dwMask = CFM_SIZE;
cf.yHeight += 20*(-2);
text.setCharFormat(SCF_SELECTION, &cf);
}
void RichTextEditor::changeFont(Action& action)
{
CHARFORMAT cf;
cf.cbSize = sizeof(cf);
text.getCharFormat(TRUE, &cf);
LOGFONT lf;
ClientDC dc(this);
int logPixelInY = dc.getDeviceCaps(LOGPIXELSY);
memset(&lf, 0, sizeof(lf));
lf.lfHeight = MulDiv(cf.yHeight, logPixelInY, -1440);
if (cf.dwEffects & CFE_BOLD) {
lf.lfWeight = FW_BOLD;
}
else {
lf.lfWeight = FW_NORMAL;
}
lf.lfItalic = (BOOL)(cf.dwEffects & CFE_ITALIC);
lf.lfUnderline = (BOOL)(cf.dwEffects & CFE_UNDERLINE);
lf.lfQuality = DEFAULT_QUALITY;
lf.lfPitchAndFamily = cf.bPitchAndFamily;
strcpy_s(lf.lfFaceName, SizeOf(lf.lfFaceName), cf.szFaceName);
//2009/11/04
CHOOSEFONT* chooseFont = (CHOOSEFONT*)fontdlg.getCallData();
chooseFont->lpLogFont = &lf;
chooseFont->Flags = CF_BOTH | CF_SCALABLEONLY | CF_EFFECTS
| CF_NOVECTORFONTS | CF_INITTOLOGFONTSTRUCT;
chooseFont->rgbColors = cf.crTextColor;
chooseFont->nFontType = 0;
if (fontdlg.choose()) {
cf.dwMask = CFM_BOLD | CFM_FACE | CFM_ITALIC | CFM_COLOR |
CFM_CHARSET| CFM_STRIKEOUT |
CFM_OFFSET | CFM_SIZE | CFM_UNDERLINE;
cf.yHeight = 2 * chooseFont->iPointSize;
cf.crTextColor = chooseFont->rgbColors;
cf.dwEffects = 0;
ClientDC dc(this);
cf.bCharSet = dc.getTextCharsetInfo(NULL);
if (lf.lfWeight >= FW_BOLD) {
cf.dwEffects |= CFE_BOLD;
}
if (lf.lfItalic) {
cf.dwEffects |= CFE_ITALIC;
}
if (lf.lfUnderline) {
cf.dwEffects |= CFE_UNDERLINE;
}
cf.bPitchAndFamily = lf.lfPitchAndFamily;
strcpy_s(cf.szFaceName, SizeOf(cf.szFaceName), lf.lfFaceName);
//Printf("%s\r\n", cf.szFaceName);
text.setCharFormat(SCF_SELECTION, &cf);
}
}
}
//////////////////////////////////////////////////////
// Program Main
void Main(int argc, TCHAR** argv)
{
const String appClass = "RichTextEditor";
try {
Application applet(appClass, argc, argv);
Args args;
RichTextEditor richTextEditor(applet, appClass, args);
richTextEditor.realize();
applet.run();
} catch (...) {
}
}
|